Hallo, ich bin gerade dabei in die digitale Filterung einzusteiegn. Dazu habe ich mir die FIR-Filter Koeffizienten für folgende Parameter ermittelt. Tiefpass - Butterworth Abtastfrequenz = 200Hz Grenzfrequenz = 5Hz Filter Ordnung = 2 Taps = 10 Den Algorithmus dazu hab ich dann in Matlab geschrieben, hab die Datei angehängt. Als Eingangsgröße hab ich mir eine simplen Sinus mit einer Frequenz von 50 Hz erstellt und die einzelnen Werte in ein Array gepackt. Mit Abtasrrate 1µs hab ich 80001 Werte. Ich stelle genau 4 Perioden dar. Wenn ich mir nun das Sinussignal mit einer Abtastfrequenz von 200 Hz abtaste, und die Werte durch den FIR-Filter jage bekommen stimmen die Werte am Ausgang des Filters nicht mit der erwarteten Dämpfung.. Im Bild ist das obere Diagramm der Sinus, die grüne Linie ist der Abtastzeitpunkt. Die rote Linie ist das Ausgangssignal des FIR-Filter. Das untere Diagramm ist reine Ausgangssignal des FIR-Filters Laut der Übertragungsfunktion sollte ja bei 50Hz eine Dämpfung von 20dB eintreten. Bei der Amplitude von 1V wären das 0.1V.. Nach dem "Einschwingen" > 10 Perioden kommen aber const. 0,0785 raus was -22 dB entspricht warum? Kann mir jemand erklären wo mein Denkfehler ist?
Daniel schrieb: > Nach dem "Einschwingen" > 10 Perioden kommen aber const. 0,0785 raus was > -22 dB entspricht warum? Kann mir jemand erklären wo mein Denkfehler > ist? Wie hast du im Ausgangssignal die Amplitude ermittelt? Das ist ja ein Sinus-Signal, die Abtastzeitpunkte liegen aber nicht genau im Maximum der Sinus-Kurve sondern etwas versetzt. Du musst also irgendwie das maximum rekonstruieren; evtl. hast du das übersehen.
Wie kommst du auf diese Filterkoeffizienten? Ein Butterworth-Filter ist ein 'all-pole' Filter und damit ein IIR Filter. Daher ist schon deine Bezeichnung FIR falsch. In Matlab oder GNU Octave bekommst du Zähler- und Nennerkoeffizienten mit
1 | [b,a] = butter(ordnung, grenzfrequenz) |
Die Grenzfrequenz ist die normierte Frequenz, also in deinem Fall 5 Hz/200 Hz. Des Weiteren vermischst du die Filterordnung und die Anzahl Taps. Denn das ist ein und das selbe. Du kannst nicht ein Filter 2. Ordnung mit 10 Taps haben. Wie soll das gehen? ich denke ein richtiges Filter bekommst du so:
1 | ordnung = 10; |
2 | fs=200; |
3 | fc=5; |
4 | [b,a]=butter(ordnung, fc/fs); |
5 | freqz(b,a); |
:
Bearbeitet durch User
Hi, ich versteh noch nicht so ganz was du meinst. Die Amplitude im Ausgangssignal des FIR-Filters sind doch die Werte die das Filter ausspuckt, die blauen Balken im unteren Diagramm, oder was meinst du? Die Abtastzeitpunkte liegen im Maximum des Sinus. Ich sehe das ja an den abgetasteten Werte im Array. Vielleicht reden wir auch gerade aneinander vorbei.
@Tobias Hab mir die Koeffizienten vom Win-FIlter berechnen lassen, beim FIR das Model ausgewählt werden (Butterworth, Chebi usw...) und es lässt sich sogar die Ordnung angeben
Ja, aber ein Butterworth ist kein Fir, darum funktioniert das so nicht. Allgemein hat ein digitales Filter die Übertragungsfunktion:
und daraus wird im Zeitbereich
Beim Butterworth hast du alle b=0 ausser b0=1. Und meist ist a0=1 und die restlichen a hängen von deiner gewünschten Filtercharakteristik ab. Also a und b mit Matlab oder Octave berechnen und in die Differenzengleichung einsetzen, dann funktioniert auch dein IIR-Filter ;-)
WinFilter? Interessant. Ich lern gerne was neues. Aber meines wissens ist Butterworth eben wirklich IIR. Gib da bitte mal die Pole und Nullstellen oder die z-Übertragungsfunktion raus.
Hm, dann sollte das Prog aber die entsprechende Eingabefelder ausgrauen. Das war nur ein beliebiger Filter den ich im Win-Filter ausgewählt habe. Kann man sich die Koeffizienten in Matlab für ein einfaches FIR-Filter bestimmen lassen?
Hier: Z domain Zeros z = -1.000000 + j 0.000000 z = -1.000000 + j 0.000000 Z domain Poles z = 0.889316 + j -0.099599 z = 0.889316 + j 0.099599
Hmm ich denke mit dem FIR versucht er die Impulsantwort vom Butterworth IIR zu approximieren, was natürlich bei niedriger Ordnung eine schlechte Approximation gibt. Schraub mal Anz. Taps hoch, dann müsste es besser werden. Aber wie gesagt: das Resultat ist eigentlich kein Butterworth-Filter weil dazu ein IIR nötig wäre. Einfaches FIR kannst du in Matlab bauen mit dem Befehl fir1. Da weiss ich aber die Syntax nicht grad auswendig, mach mal help fir1, dann siehst du schon wies geht ;-) Edit: sehe grade du hast die Pole noch aufgeschrieben. Wenns Pole hat, ist es aber ein IIR weil ein Pol eine Rückkopplung vom Ausgang auf den Eingang bedeutet. Das Resultat kommt mir doch ein wenig suspekt vor. Was sagt Matlab?
:
Bearbeitet durch User
Wenn ich mir den generierten C-Code angucke ist es definitiv ein FIR. Ich werd morgen die restlichen Sachen beantworten, jetzt ist es ein wenig zu spät ;)
Daniel schrieb: > Die Abtastzeitpunkte liegen im Maximum des Sinus. Ich sehe das ja an den > abgetasteten Werte im Array. In deinem Diagramm gibt es immer abwechselnd zwei positive und zwei negative Abtastwerte. Wenn die genau im Maimum/Minimum des Sinus-Signals liegen würden, dann würde es immer genau einen positiven und einen negativen Wert geben, dazwischen jeweils einen Abtastwert genau im Nullduchgang. Das Ausgangs-Signal des Filters hat gegenüber dem Eingangssignal eine frequenzabhängige Phasenverschiebung. Wenn die Abtast-Zeitpunkte jeweils genau beim Maximum und Minimum des Eingangssignals liegen, dann können die gar nicht gleichzeitig die Maxima/Minima des Ausgangssignals treffen, außer die Phasenverschiebung beträgt genau 90°, also bei der Grenzfrequenz des Filters.
@Johannes stimmt das wirds wohl sein. Bei 50Hz gibt es laut dem Phasengang eine Phasenverschiebung von -41° @Tobias >>Edit: >>sehe grade du hast die Pole noch aufgeschrieben. Wenns Pole hat, ist es >>aber ein IIR weil ein Pol eine Rückkopplung vom Ausgang auf den Eingang >>bedeutet. Das Resultat kommt mir doch ein wenig suspekt vor. Was sagt >>Matlab? was soll ich genau in Matlab prüfen? In der Literatur heisst es auch, das die Nullstellen mit den Polstellen zusammen fallen bei den rekursiven FIR-Filter. Das Butterworth hat aber einen Pol auf dem Einheitskreis und zwei Nullstellen.
@Daniel also, ich weiss nicht was dein Winfilter da rechnet. Aber, wie erwähnt, Butterworht ist IIR und nicht FIR, und darum müssen die Pole und Nullstellen so wie im Anhang sein. In dem Bild siehst du auch die Zähler- und Nennerkoeffizienten b und a. Und damit musst du in deinem Programm die Differenzengleichung wie folgt implementieren. Praktischerweise ist a_0 = 1 und die Differenzengleichung heisst y = b_0 * u + b_1 * u_old + b_2 u_old_old - a_1 y_old - a_2 * y_old_old Und das wird ganz exakt dein gewünschtes Butterworth Filter geben. Wenn der Butterworth einen Pol auf dem Einheitskreis hätte, dann würde der dir ziemlich bald um die Ohren fliegen ;-) Gruss!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.