Forum: Digitale Signalverarbeitung / DSP / Machine Learning FIR-Filter Verständnisproblem -Ausgangssignal


von Daniel (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Johannes E. (cpt_nemo)


Lesenswert?

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.

von Tobias P. (hubertus)


Lesenswert?

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
von Daniel (Gast)


Lesenswert?

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.

von Daniel (Gast)


Angehängte Dateien:

Lesenswert?

@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

von Tobias P. (hubertus)


Lesenswert?

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 
;-)

von Tobias P. (hubertus)


Lesenswert?

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.

von Daniel (Gast)


Lesenswert?

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?

von Daniel (Gast)


Lesenswert?

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

von Tobias P. (hubertus)


Lesenswert?

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
von Daniel (Gast)


Lesenswert?

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 ;)

von Johannes E. (cpt_nemo)


Lesenswert?

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.

von Daniel (Gast)


Lesenswert?

@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.

von Tobias P. (hubertus)


Angehängte Dateien:

Lesenswert?

@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
Noch kein Account? Hier anmelden.