Hemen hemen her durumda en iyi seçiminiz ne kıvrım ne de FFT'dir, ancak IIR filtresini doğrudan uygulamaktır (örneğin sosfilt () işlevini kullanarak). Bu, CPU ve bellek tüketimi açısından çok daha verimli olacaktır.
Sayısal bir fark yaratıp yaratmadığı, ilgili filtreye bağlıdır. Bazı farkların ortaya çıkabileceği tek durum, kutupların birim daireye çok, çok yakın olmasıdır. Hatta yardımcı olabilecek birkaç numara var. Aktarım işlevi gösterimini ve filter () KULLANMAYIN, ancak sosfilt () ile kutup ve sıfır kullanın. İşte fark için bir örnek.
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 (), yaklaşık 15Hz @ 44.1kHz'lik bir kesimde bozulur. Sosfilt () için kesim, 44.1kHz Hz'in 1 / 100'ünün çok altında olabilir.
İstikrar problemleriniz varsa FFT de pek yardımcı olmaz. Filtreniz bir IIR filtresi olduğundan, dürtü yanıtı sonsuzdur ve önce kısaltılması gerekir. Bu çok düşük frekansta, dürtü yanıtı o kadar uzar ki FFT de pratik olmaz.
Örneğin, 1/100 Hz @ 44,1 kHz'de bir kesme ve 100 dB'lik dürtü yanıtında dinamik bir aralık istiyorsanız, yaklaşık 25 milyon örneğe ihtiyacınız var !!! Bu, 44.1 kHz'de neredeyse 10 dakika ve orijinal sinyalinizden çok daha uzun