IIR Filter für FFT über Zeitachse

#4589856
Lesenswert?

Hallo

Mir raucht langsam der Kopf...
Ich habe eine FFT, deren Frames (1024 Frequenzbins) ich gerne über die 
Zeitachse etwas glätten möchte. Weil ein moving average Filter hier 
ausscheidet habe ich mich für ein IIR Filter entschieden. Ziel war es, 
das nach ~17 Frames (desswegen Alpha=0.875) der Wert des entsprechenden 
Frequenzbin auf 90% angestiegen ist, im Falle der Sprungantwort.

In der Theorie ist mir das Filter klar (alter Wert mit Faktor zum 
aktuellen Wert addiert), nur habe ich wohl etwas für die Umsetzung in 
Simulink nicht beachtet: Beim Ergebnis ist der Anstieg sehr steil, und 
die Abfallzeit viel zu gross. So dass aus dem eigentlichen Sinus 
modulierten Signal im Spektrum nur noch ein Rechteck erkennbar ist.

Im Anhang habe ich mal die aktuelle Umsetzung in Simulink, das falsche 
Ergebnis und das Richtige Ergebnis (mit filter([0.125],[1 -0.875], fft, 
2) damit das iir Filter auf die 2. Achse der Matrize angewendet wird).

Kann mir jemand erklähren, wo mein Denkfehler liegt?

Gruss
Patrick
Angehängte Dateien:
#4593707
Lesenswert?

Könnte am solver liegen. Hast du einen Variable Step solver laufen? 
Welche Samplingfrequenz haben deine Daten in Matlab, wo filter() 
funktioniert? Die Koeffizienten des Filters sind ja zeitabhängig und 
mögen variable Zeitschritte gar nicht. Also solver auf fixed step 
stellen und die gleiche Schrittweite wie in Matlab benutzen :)

Schöne Grüße,
Jan

edit: mit zeitabhängig meine ich nicht, dass sie sich über die Zeit 
verändern, aber die Abtastrate fs bzw T=1/fs geht in die Berechnung der 
Koeffizienten ein normalerweise.
#4594657
Lesenswert?

Ich habe mir jetzt sehr lange schon den Kopf darüber zerbrochen, wo der 
Unterschied ist.
Dan ist mir aufgefallen, dass ich bei der "Referenz" die Daten zuerst in 
dB umrechne und dann die filter()-Funktion benutze. Beim anderen Fall 
wird das IIR Filter im linearen Bereich angewendet und das Resultat in 
dB umgerechnet, damit die Darstellung stimmt.

Ich hab mal deinem Vorschlag nach die Einstellungen des Solvers in 
Simulink geprüft: Fixed-Step, step-size = auto, ode3
#4596217
Lesenswert?

Die gefilterten Werte-Indexe sind 0, 1024, 2048... ein MA-Filter müsste 
doch alle Werte zwischenspeichern. Soll über 4 Frames gemittelt werden 
(also effektiv je 4 Werte), dann müsste ich 4096 Werte speichern, und 
das in 4 Buffern, damit ich auf alle benötigten Werte gleichzeitig 
zugreifen kann.

Oder ist ein MA Filter immer über ein rekursives IIR Filter gelöst?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren