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:
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?
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?
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!