W prawie wszystkich przypadkach najlepszym wyborem nie jest ani splot, ani FFT, ale po prostu zastosowanie filtra IIR bezpośrednio (za pomocą np. Funkcji sosfilt ()). Będzie to znacznie bardziej wydajne pod względem zużycia procesora i pamięci.
To, czy ma to znaczenie liczbowe, zależy od konkretnego filtra. Jedynym przypadkiem, w którym może się wkraść pewna różnica, jest to, że bieguny są bardzo, bardzo blisko koła jednostki. Nawet tam jest kilka sztuczek, które mogą pomóc. NIE UŻYWAJ reprezentacji funkcji przesyłania i filter (), ale używaj biegunów i zer z sosfilt (). Oto przykład różnicy.
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 () psuje się przy odcięciu około 15 Hz przy 44,1 kHz. W przypadku sosfilt () odcięcie może być znacznie poniżej 1/100 Hz przy 44,1 kHz bez żadnych problemów.
JEŚLI masz problemy ze stabilnością, FFT też niewiele pomaga. Ponieważ twój filtr jest filtrem IIR, odpowiedź impulsowa jest nieskończona i musiałaby zostać najpierw obcięta. Przy tak bardzo niskiej częstotliwości odpowiedź impulsowa staje się tak długa, że FFT również staje się niepraktyczne.
Na przykład, jeśli chcesz mieć wartość graniczną 1/100 Hz przy 44,1 kHz i chcesz zakres dynamiczny w odpowiedzi impulsowej 100 dB, potrzebujesz około 25 milionów próbek !!! To prawie 10 minut przy 44,1 kHz i wiele, wiele razy dłużej niż oryginalny sygnał