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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.