www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Koeffizienten von DGL berechnen


Autor: Maik Ritter (kiamur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich möchte mal zum Üben einen Tiefpass Filter in meinem Microcontroller 
implementieren.

Dazu habe ich die Differentialgleichung aufgestellt und mit der Explizit 
Euler Methode digitalisiert. Das habe ich dann in Matlab/Simulink 
getestet und es läuft auch.

Jetzt ist mein Problem das ganze in den Microcontroller zu bekommen. In 
meiner digitalisierten DGL habe ich die beiden Koeffizienten a und b, 
die folgendermaßen aussehen:

a=1-ts/RC, b=ts/RC

Wie komme ich auf den Wert für ts? Dass das die Samplingfrequenz ist 
habe ich schon herausbekommen. Aber wie ermittele ich die für meinen 
Microcontroller?
Es handelt sich dabei um einen PIC18f458 mit 4MHz Kristall. Die Frequenz 
für die A/D Wandlung ist Fosc/8. Aber eigentlich glaube ich nicht, dass 
das der Wert für mein ts ist. Ich denke viel mehr, dass mit ts die Zeit 
zwischen 2 A/D Wandlungen gemeint ist, oder?
Muss ich dann die Zeiten der Befehle addieren, die die Berechnung der 
DGL im Microcontroller in Anspruch nehmen? Oder wie geht man da generell 
vor?

Kann mir jemand von euch Literatur zu dem Thema empfehlen? Damit meine 
ich keine Theorieschinken zur digitalen Signalverarbeitung, denn davon 
habe ich schon ein paar. Ich suche etwas, wo die Implementierung der 
Theorie in echten Controllern beschrieben wird. Gerne auch in englisch.

Vielen Dank schon mal
Maik

Autor: Oschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Samplingfrequenz muss ev. vorgegeben werden. Denn in einem 
physikalischen Systemn ist sie nicht beliebig frei waehlbr. Sie muss 
naemlich einiges oberhalb von Grenzfrequenzen und Resonanzen sein.

O.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Ich denke viel mehr, dass mit ts die Zeit
zwischen 2 A/D Wandlungen gemeint ist, oder?"
RICHTIG.

"Muss ich dann die Zeiten der Befehle addieren.."
FALSCH.

Aber die Berechnung von Tiefpassen, Hochpassen etc... in digitalen IC's 
geschieht nicht über Differentialgleichungen, sondern über 
Differenzengleichungen. Die macht man mittels Z-Transformation.

Autor: Maik Ritter (kiamur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo und danke für die Antworten.

Okay, das ist ja schon mal was.

"Ich denke viel mehr, dass mit ts die Zeit
zwischen 2 A/D Wandlungen gemeint ist, oder?"
RICHTIG.
-Diese Bestätigung habe ich gebraucht. DANKE!!

"Muss ich dann die Zeiten der Befehle addieren.."
FALSCH.
-Wie komme ich denn dann auf die Samplingzeit? Gut, sie muss mindestens 
die doppelte Frequenz haben, von dem, was ich sampeln möchte, aber ich 
muss ja zusehen, dass ich alles an Berechnungen "erledige", die nötig 
sind, oder? (ich bin halt noch ganz am Anfang . . . )

"Aber die Berechnung von Tiefpassen, Hochpassen etc... in digitalen IC's
geschieht nicht über Differentialgleichungen, sondern über
Differenzengleichungen. Die macht man mittels Z-Transformation."
Sorry, bei den mathematischen Ausdrücken bin ich mir auch nie so sicher. 
Ich habe echt gedacht, dass das, was ich da für den Tiefpass erstellt 
habe eine digitalisierte DGL erster Ordnung ist:

u_c(k)=a*u_c(k-1)+b*u_e(k-1)

mit a und b, wie oben angegeben.

Mit den ganzen Transformationen stehe ich auf Kriegsfuß, weil ich die 
noch nie so richtig durchschaut habe. . . (trotz meiner Theorieschinken)

Gruß
Maik

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Ich habe echt gedacht, dass das, was ich da für den Tiefpass erstellt
habe eine digitalisierte DGL erster Ordnung ist: 
u_c(k)=a*u_c(k-1)+b*u_e(k-1)
mit a und b, wie oben angegeben...."

Das ist keine DGL mehr!! Aber schon eine Differenzengleichung, da kannst 
du dir die Transformationen sparen...  ;-)
Das siehst du daran, das deine werte (hier c, u_c, u_e) NICHT von der 
Zeit (direkt) abhängig sind (es heißt ja nicht c(t)  ), sonder c(k), 
wobei k den aktuellen Abtastzeitpunkt t=k*ts beschreibt.

den Begriff "digitalisierte DGL" habe ich noch nie gehört, wills deshalb 
weder als richtig noch als falsch einstufen, ist nur ein Begriff und 
jetzt denk ich nicht so wichtig hier...

Die Samplingzeit musst du mittels deiner Taktfrequenz des AD-Wandlers 
ermitteln können, welcher Zusammenhang zwischen dieser Taktfrequenz und 
der Samplingfrequenz besteht, kann/muss dir das Datenblatt sagen. Ich 
kenne die PIC's nicht, und kann dir das demzufolge nicht beantworten...

Richtig, die Berechnungen sollten erledigt sein, bevor der nächste 
Samplingwert "eintrudelt", also innerhalb ts erfolgen..
Da dieses Ergebnis zwingenderweise mit dem (nächsten) Takt auszugeben 
ist, erfolgt dadurch eine Verzögerung um exakt einen Takt. Dies ist bei 
Filteranwendungen normal, und muss besonders bei der Realisierung von 
digitalen Reglern beachtet werden (Totzeit)...

noch Fragen...?

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>den Begriff "digitalisierte DGL" habe ich noch nie gehört

er meint bestimmt "diskretisiert"

Autor: Maik Ritter (kiamur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Matthias!

 "Digitalisierte" DGL habe ich es deswegen genannt, weil ich zunächst 
die DGL des Tiefpasses in Abhängigkeit von t erstellt habe:

u_c'(t)=-u_c(t)/RC+u_e(t)/RC

Danach habe ich diese Gleichung mit Hilfe der "explizit Euler" Methode, 
die wir so in der FH gelernt haben, "digitalisiert":

u_c'(t)=(u_c(k)-u_c(k-1))/ts
u_c(t)=u_c(k-1), u_e(t)=u_e(k-1)

Das Ganze dann in die DGL oben eingesetzt, nach u_c(k) aufgelöst und die 
"digitalisierte DGL" erhalten.
Ob man das nun so nennen darf, oder nicht, weiß ich nicht. Nur so zur 
Info, wie ich darauf gekommen bin.

Du scheinst ja etwas Erfahrung zu haben mit der digitalen 
Signalverarbeitung. Kannst du mir vielleicht ein Buch empfehlen, dass, 
wie gesagt, auch mal die Umsetzung der Theorie in den DSP/Controller 
beschreibt, und auf was man da alles achten muss? Ich komme da nämlich 
mit meinen Recherchen nicht so richtig weiter.

Gruß
Maik

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein. Sorry mein Studium (E-Technik FH) ging bisher ohne Bücher. Ausser 
einem guten Mathebuch. Da ich das auch als Hobby mache (wenn µC, dann 
allerdings Atmel AVR) habe ich ziemlich viel Erfahrung bzgl Elektronik. 
Mit DSPs selbst habe ich allerdings noch nie zutun gehabt...
Ich rechne solche Differenzengleichungen meist per Hand von der 
Differtialgleichung/Übertragungsfkt (im s-Bereich) direkt in den 
Z-Bereich und dann nach Ausgang(k) umstellen...
Aber frag ruhig...

Autor: Maik Ritter (kiamur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Ich rechne solche Differenzengleichungen meist per Hand von der
Differtialgleichung/Übertragungsfkt (im s-Bereich) direkt in den
Z-Bereich und dann nach Ausgang(k) umstellen..."

Irgendwie sind das für mich immer noch bömische Dörfer . . . gerade was 
diese ganzen Transformationen betrifft. Ich weiß zwar, das die sehr 
nützlich sind, um die Gleichungen nicht mehr mit Integral- oder 
Differentialrechnung lösen zu müssen, sondern mit algebraischen 
Methoden, aber wann man was und wie am Besten macht, dafür fehlt es mir 
an Durchblick.

Wenn du jetzt hier z.B. die z-Transformation erwähnst, dann frage ich 
mich, wo jetzt dieses Euler Verfahren einzuordnen ist, dass ich 
verwendet habe?
Naja, das würde wohl jetzt zu weit führen . . .

Wie gehst du denn dann an die AVR Programmierung ran, wenn du was auf 
dem Papier ausgerechnet hast, und das dann in den Controller bekommen 
willst. So unterschiedlich werden doch die Methoden zwischen PIC und AVR 
nicht sein.

Ich versuche das jetzt erst mal in den PIC zu bekommen, bin aber für 
jeden Praxistip dankbar.

Gruß
Maik

Autor: Matthias (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Na wenn du die konrekete umzusetzende Differenzengleichung hast, dann 
musst du "nur" sehen, wie du diese realisieren kannst. Wichtig ist dort 
zB das Vermeiden von gebrochenen Werten, also musst du alle Werte mit 
einem Faktor versehen, den du zuletzt wieder herausrechnest. 
Mathematisch ist das so gemeint:
Aus
y(n) = 0.1234*x(n) - 0.4321*y(n-1)
wird zB

256*y(n) = 32*x(n) - 111*y(n-1)
somit umgehst du die Brüche.

Und ganz wichtig ist immer dass die EIngangswerte in gleichen Zeiten 
gesampelt werden..
Gucke dir dazu mal den Anhang an, ist zwar für AVR, aber sollte 
helfen...

Autor: Maik Ritter (kiamur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey, danke!

Das sind genau die Art von Tips, die ich suche.

Und Danke auch für das Dokument. Da werde ich mich mal durcharbeiten. 
Wie gesagt, vom Grundsatz her müsste das für die PICs ja genauso gehen.

Gruß
Maik

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.