거의 모든 경우에 최선의 선택은 컨볼 루션이나 FFT가 아니라 단순히 IIR 필터를 직접 적용하는 것입니다 (예 : sosfilt () 함수 사용). 이것은 CPU 및 메모리 소비 측면에서 훨씬 더 효율적입니다.
수치 차이를 만드는지 여부는 특정 필터에 따라 다릅니다. 극점이 단위 원에 매우 가까운 경우 약간의 차이가 발생할 수 있습니다. 도움이 될만한 몇 가지 트릭도 있습니다. 전달 함수 표현과 filter ()를 사용하지 말고 sosfilt ()와 함께 극점과 0을 사용하십시오. 차이점에 대한 예는 다음과 같습니다.
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 ()는 44.1kHz에서 약 15Hz의 컷오프에서 나빠집니다. sosfilt ()의 경우 컷오프는 아무 문제없이 Hz @ 44.1kHz의 1/100보다 훨씬 낮을 수 있습니다.
안정성 문제가있는 경우 FFT는 그다지 도움이되지 않습니다. 필터는 IIR 필터이므로 임펄스 응답은 무한하므로 먼저 잘 려야합니다. 이러한 매우 낮은 주파수에서 임펄스 응답은 너무 길어 FFT도 비실용적이됩니다.
예를 들어 44.1 kHz에서 1/100 Hz의 컷오프를 원하고 100 dB의 임펄스 응답에서 다이나믹 레인지를 원한다면 약 2,500 만 개의 샘플이 필요합니다 !!! 44.1 kHz에서 거의 10 분이 걸리고 원래 신호보다 몇 배나 더 길다