Ist es numerisch stabiler, Filterung als Multiplikation oder Faltung zu implementieren?

12

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.

Andreas
quelle
Die FFT-Methode ist für die meisten Signallängen viel schneller zu berechnen. Mit der Zeitbereichsfaltung sind nur kurze Längen schneller.
Endolith

Antworten:

5

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.

schnarf
quelle
Was meinst du damit, dass es nur für FIR-Filter funktioniert? Ich nahm an, dass IIR-Filter irgendwie abgetastet werden müssten. Werden IIR-Filter normalerweise im Zeitbereich implementiert, um dies zu vermeiden?
Andreas
1
Soweit mir bekannt ist, werden IIR-Filter immer im Zeitbereich implementiert. Ein IIR-Filter (hier zum Beispiel ein Filter zweiter Ordnung oder "Biquad") wird durch eine Differenzgleichung wie definiert 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.
Schnarf
1
Der Grund, warum IIR-Filter in der Regel eine viel niedrigere Ordnung haben, ist, dass die Pole (die Rückkopplung vorheriger Ausgangsabtastwerte) das Filter mit sehr wenigen Koeffizienten steiler werden lassen als bei einem FIR-Filter. Wenn ich eine viel niedrigere Ordnung sage, ist ein typisches IIR-Filter möglicherweise ein Filter zweiter Ordnung (5 Koeffizienten), während ein typisches FIR-Filter für dieselbe Aufgabe möglicherweise Tausende von Koeffizienten aufweist.
schnarf
4

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.

n = 2^16;  % filter length
fs = 44100; % sample rate
x = zeros(n,1); x(1) = 1;
f0 = 15; % cutoff frequency in Hz
% design with poles and zeroes
[z,p,k] = butter(5,f0*2/fs);
clf
plot(sosfilt(zp2sos(z,p,k),x));
% design with transfer function
[b,a] = butter(5,f0*2/fs);
hold on
plot(filter(b,a,x),'k');

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

Hilmar
quelle
Dies beantwortet die Frage nach numerischen Problemen nicht wirklich, aber ich war mir der Probleme mit filter- danke nicht bewusst ! Meine Hochpassabschaltung beträgt 0,5 Hz bei 250 Hz. Was ist der Grund für die Probleme mit filter? Ich schreibe die Implementierung selbst.
Andreas
2

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:

x=randn(5,1);
y=randn(5,1);
X=fft(x,length(x)+length(y)-1);
Y=fft(y,length(x)+length(y)-1);

z1=conv(x,y);z2=ifft(X.*Y);
z1-z2

ans =

   1.0e-15 *

   -0.4441
   -0.6661
         0
   -0.2220
    0.8882
   -0.2220
         0
   -0.4441
    0.8882

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.

Lorem Ipsum
quelle
1
Ich denke, die ursprüngliche Frage betraf genau die Fließkomma-Probleme, die der FFT-basierten Filterung im Vergleich zur direkten Implementierung des Filters im Zeitbereich inhärent sind. Dies kann ein Problem für die Festkomma-Signalverarbeitung sein, wenn Sie beispielsweise sehr lange Filter verwenden oder wenn Sie eine schlechte FFT-Implementierung haben. Sie werden definitiv keine Effekte für Sequenzen der Länge 5 in Gleitkommazahlen mit doppelter Genauigkeit sehen.
Jason R
@JasonR Die Fehler sind immer noch maschinengenau, wenn Sie die Länge der Sequenzen im obigen Beispiel auf 1e6 verlängern. Die von Ihnen erwähnten Fehler treten hauptsächlich aufgrund eines schlechten Filterdesigns oder einer schlechten FFT-Implementierung auf. Wenn das in Ordnung ist, verstehe ich nicht, warum die Faltung im Zeitbereich eine andere Antwort geben sollte als im Frequenzbereich.
Lorem Ipsum
1
Es sollte keine andere Antwort geben, je nachdem in welchem ​​Bereich Sie die Berechnungen durchführen. Mein einziger Punkt ist, dass sich die tatsächlichen mathematischen Operationen zwischen den beiden Ansätzen stark unterscheiden. Je nachdem, welche Implementierungen Sie jeweils zur Verfügung haben, ist es möglich, dass Sie dies tun könnte spürbare Unterschiede sehen. Bei doppelter Genauigkeit würde ich, vorausgesetzt Sie haben gute Implementierungen, keinen Unterschied erwarten, außer in extremen Fällen.
Jason R