Trong hầu hết các trường hợp, lựa chọn tốt nhất của bạn không phải là tích chập hay FFT mà chỉ đơn giản là áp dụng bộ lọc IIR trực tiếp (sử dụng hàm sosfilt ()). Điều này sẽ hiệu quả hơn rất nhiều về mức tiêu thụ CPU và bộ nhớ.
Việc nó có tạo ra sự khác biệt về số hay không phụ thuộc vào bộ lọc cụ thể. Trường hợp duy nhất mà một số khác biệt có thể leo vào là nếu các cực rất, rất gần với vòng tròn đơn vị. Thậm chí có một vài thủ thuật có thể giúp đỡ. KHÔNG SỬ DỤNG biểu diễn và bộ lọc chức năng chuyển () mà sử dụng các cực và số 0 với sosfilt (). Dưới đây là một ví dụ cho sự khác biệt.
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');
bộ lọc () bị hỏng ở mức cắt khoảng 15Hz @ 44.1kHz. Đối với sosfilt (), mức cắt có thể thấp hơn 1/100 của Hz @ 44.1kHz mà không gặp vấn đề gì.
NẾU bạn có vấn đề về ổn định, FFT cũng không giúp được gì nhiều. Vì bộ lọc của bạn là bộ lọc IIR, đáp ứng xung là vô hạn và trước tiên phải được cắt bớt. Ở những tần số rất thấp này, đáp ứng xung sẽ kéo dài đến mức FFT cũng trở nên không thực tế.
Ví dụ: nếu bạn muốn mức cắt 1/100 Hz @ 44,1 kHz và muốn có dải động trong đáp ứng xung 100 dB, bạn cần khoảng 25 triệu mẫu !!! Đó là gần 10 phút ở 44,1 kHz và lâu hơn nhiều lần so với tín hiệu ban đầu của bạn