Dalam hampir semua kasus, pilihan terbaik Anda bukanlah konvolusi atau FFT tetapi cukup menerapkan filter IIR secara langsung (menggunakan misalnya fungsi sosfilt ()). Ini akan jauh lebih efisien dalam hal konsumsi CPU dan memori.
Apakah itu membuat perbedaan numerik tergantung pada filter spesifik. Satu-satunya kasus di mana beberapa perbedaan dapat terjadi adalah jika kutubnya sangat, sangat dekat dengan lingkaran unit. Bahkan ada beberapa trik yang bisa membantu. JANGAN GUNAKAN representasi fungsi transfer dan filter () tetapi gunakan kutub dan nol dengan sosfilt (). Berikut adalah contoh perbedaannya.
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 () memburuk saat cutoff sekitar 15Hz @ 44.1kHz. Untuk sosfilt () cutoffnya bisa jauh di bawah 1/100 dari Hz @ 44.1kHz tanpa masalah.
JIKA Anda memiliki masalah stabilitas, FFT juga tidak banyak membantu. Karena filter Anda adalah filter IIR, respons impuls tidak terbatas dan harus dipotong terlebih dahulu. Pada frekuensi yang sangat rendah ini, respons impuls menjadi begitu lama sehingga FFT menjadi tidak praktis juga.
Sebagai contoh jika Anda ingin cutoff 1/100 Hz @ 44,1 kHz dan ingin rentang dinamis dalam respons impuls 100 dB, Anda memerlukan sekitar 25 juta sampel !!! Itu hampir 10 menit pada 44,1 kHz dan banyak, berkali-kali lebih lama dari sinyal asli Anda