Ich schreibe ein Programm, um ein 20.000-Samplesignal mit einem Butterworth-Filter fünfter Ordnung offline zu filtern. Ich habe Zugriff auf eine FFT-Implementierung. Es scheint zwei Alternativen für die Implementierung der Filterung zu geben:
- Faltung des Signals mit der Impulsantwort im Zeitbereich oder
- Multiplikation des Signals mit der Impulsantwort im Frequenzbereich und Rücktransformation des Ergebnisses
Diese Methoden wären im theoretischen FT-Fall identisch. Wenn ich es jedoch mit der DFT im wirklichen Leben mache, sind die Dinge vermutlich anders. Ist eine der Methoden numerisch stabiler? Gibt es noch andere Probleme, auf die ich achten sollte? Die Anzahl der Berechnungen ist nicht wichtig.
Antworten:
Bei der Faltung treten keine Stabilitätsprobleme auf, da keine rekursive Filterung vorhanden ist, sodass sich keine Fehler ansammeln. Mit anderen Worten, das System besteht aus Nullen und keinen Polen. Ich habe anekdotisch gehört, aber nicht für mich selbst bestätigt, dass die FFT-basierte Faltung einen geringeren Fehler aufweist als die Zeitbereichsfaltung, einfach weil sie O (n log n) -Arithmetikoperationen anstelle von O (n ^ 2) aufweist.
Soweit mir bekannt ist, werden Butterworth-Filter in der Regel als rekursive (IIR) Filter implementiert. Dies ist also ein anderes Thema. IIR-Filter haben sowohl Pole als auch Nullen, sodass es in der Praxis zu Stabilitätsproblemen kommen kann. Auch für IIR-Filter kommen FFT-basierte Methoden nicht in Frage, aber andererseits sind IIR-Filter in der Regel von sehr niedriger Ordnung.
Was Stabilitätsprobleme bei IIR-Filtern angeht, haben diese tendenziell Probleme bei höheren Ordnungen. Ich werde einfach eine Zahl wegwerfen und sagen, dass ungefähr die sechste Ordnung dies vorantreibt. Stattdessen werden sie typischerweise als kaskadierte Biquads (Filterabschnitte 2. Ordnung) implementiert. Schreiben Sie es für Ihren Filter 5. Ordnung als Z-Domain-Übertragungsfunktion (es wird eine rationale Funktion 5. Grades sein) und zerlegen Sie es dann in seine 5 Pole und 5 Nullen. Wenn Sie die komplexen Konjugate sammeln, erhalten Sie zwei Biquads und einen Filter erster Ordnung. Im Allgemeinen treten Stabilitätsprobleme auf, wenn sich die Pole dem Einheitskreis nähern.
Es kann auch Probleme mit Rausch- und Grenzzyklen in IIR-Filtern geben, daher gibt es verschiedene Filtertopologien (dh direkte Form I, direkte Form II), die unterschiedliche numerische Eigenschaften haben, aber ich würde diesen Punkt nicht überdenken. Präzision und es wird mit ziemlicher Sicherheit gut genug sein.
quelle
y(n) = b0 * x(n) + b1 * x(n-1) + b2 * x(n-2) - a1 * y(n-1) - a2 * y(n-2)
. Beachten Sie, dass dies eine Kombination aus den vorherigen Eingabebeispielen (den x-Werten) und den vorherigen Ausgabebeispielen (den y-Werten) ist. Ein FIR-Filter hängt nur von den bisherigen Eingaben ab, sodass eine effiziente Implementierung im Frequenzbereich möglich ist. Ein IIR-Filter funktioniert nicht, ist aber trotzdem sehr effizient, da IIR-Filter in der Regel eine viel niedrigere Ordnung aufweisen.In fast allen Fällen ist Ihre beste Wahl weder Faltung noch FFT, sondern die direkte Anwendung des IIR-Filters (z. B. mit der Funktion sosfilt ()). Dies wird hinsichtlich des CPU- und Speicherverbrauchs erheblich effizienter sein.
Ob es sich um einen numerischen Unterschied handelt, hängt vom jeweiligen Filter ab. Der einzige Fall, in dem sich ein gewisser Unterschied einschleichen kann, ist, wenn die Pole sehr, sehr nahe am Einheitskreis liegen. Auch da ein paar Tricks, die helfen können. VERWENDEN SIE KEINE Übertragungsfunktionsdarstellung und filter (), sondern verwenden Sie Pole und Nullen mit sosfilt (). Hier ist ein Beispiel für den Unterschied.
filter () geht bei einem Cutoff von ca. 15Hz @ 44.1kHz kaputt. Für sosfilt () kann der Cutoff ohne Probleme deutlich unter 1/100 Hz bei 44,1 kHz liegen.
WENN Sie Stabilitätsprobleme haben, hilft die FFT auch nicht viel. Da Ihr Filter ein IIR-Filter ist, ist die Impulsantwort unendlich und müsste zuerst abgeschnitten werden. Bei dieser sehr niedrigen Frequenz wird die Impulsantwort so lang, dass auch die FFT unpraktisch wird.
Wenn Sie beispielsweise einen Cutoff von 1/100 Hz bei 44,1 kHz und einen Dynamikbereich in der Impulsantwort von 100 dB wünschen, benötigen Sie ungefähr 25 Millionen Samples !!! Das sind fast 10 Minuten bei 44,1 kHz und um ein Vielfaches länger als Ihr ursprüngliches Signal
quelle
filter
- danke nicht bewusst ! Meine Hochpassabschaltung beträgt 0,5 Hz bei 250 Hz. Was ist der Grund für die Probleme mitfilter
? Ich schreibe die Implementierung selbst.Warum werden die Dinge wohl anders sein? Die theoretischen Konzepte sollten sich in praktische Anwendungen umsetzen lassen, mit dem einzigen Unterschied, dass es sich um Gleitkomma-Probleme handelt, denen wir uns nicht entziehen können. Sie können dies leicht anhand eines einfachen Beispiels in MATLAB überprüfen:
Wie Sie sehen, liegen die Fehler in der Größenordnung der Maschinengenauigkeit. Es sollte keinen Grund geben, die FFT-Methode nicht zu verwenden. Wie Endolith erwähnte, ist es weitaus üblicher, den FFT-Ansatz zum Filtern / Falten / Kreuzkorrelieren usw. zu verwenden und viel schneller, mit Ausnahme von sehr kleinen Stichproben (wie in diesem Beispiel). Nicht, dass die Verarbeitung im Zeitbereich niemals durchgeführt wird. Alles hängt von der Anwendung, den Anforderungen und den Einschränkungen ab.
quelle