Forum: Digitale Signalverarbeitung / DSP / Machine Learning IIR Filter für FFT über Zeitachse


von Patrick B. (p51d)


Angehängte Dateien:

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

von Jan K. (jan_k)


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.

: Bearbeitet durch User
von Patrick B. (p51d)


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

von Markus F. (Gast)


Lesenswert?

Patrick B. schrieb:
> Weil ein moving average Filter hier
> ausscheidet

Warum scheidet es aus?

von Patrick B. (p51d)


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?

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.