ในเกือบทุกกรณีตัวเลือกที่ดีที่สุดของคุณไม่ใช่การแปลงหรือ FFT แต่ใช้ตัวกรอง IIR โดยตรง (ใช้เช่นฟังก์ชัน sosfilt ()) สิ่งนี้จะมีประสิทธิภาพมากกว่าในแง่ของการใช้ CPU และหน่วยความจำ
การสร้างความแตกต่างเชิงตัวเลขขึ้นอยู่กับตัวกรองเฉพาะหรือไม่ กรณีเดียวที่ความแตกต่างบางอย่างอาจคืบคลานเข้ามาคือถ้าเสานั้นอยู่ใกล้กับวงกลมหน่วยมาก แม้จะมีเทคนิคเล็กน้อยที่สามารถช่วยได้ อย่าใช้ฟังก์ชันการถ่ายโอนการเป็นตัวแทนและตัวกรอง () แต่ใช้เสาและศูนย์ด้วย sosfilt () นี่คือตัวอย่างของความแตกต่าง
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');
ตัวกรอง () ทำงานผิดพลาดเมื่อตัดประมาณ 15Hz @ 44.1kHz สำหรับ sosfilt () ค่าการตัดต่ำกว่า 1/100 ของ Hz @ 44.1kHz โดยไม่มีปัญหาใด ๆ
หากคุณมีปัญหาด้านความมั่นคง FFT ก็ไม่ได้ช่วยอะไรมาก เนื่องจากตัวกรองของคุณเป็นตัวกรอง IIR การตอบสนองต่อแรงกระตุ้นจึงไม่มีที่สิ้นสุดและจะต้องถูกตัดทอนก่อน ที่ความถี่ต่ำมากการตอบสนองแบบอิมพัลส์นั้นนานจน FFT ไม่สามารถใช้งานได้เช่นกัน
ตัวอย่างเช่นหากคุณต้องการการตัดออกที่ 1/100 Hz ที่ 44.1 kHz และต้องการช่วงไดนามิกในการตอบสนองแบบอิมพัลส์ที่ 100 เดซิเบลคุณต้องการตัวอย่างประมาณ 25 ล้านตัวอย่าง !!! นั่นคือเกือบ 10 นาทีที่ 44.1 kHz และนานกว่าสัญญาณดั้งเดิมของคุณหลายเท่า