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