การใช้ตัวกรองเป็นการคูณหรือการแปลงมีความเสถียรหรือไม่


12

ฉันกำลังเขียนโปรแกรมเพื่อกรองสัญญาณ 20,000 ตัวอย่างด้วยตัวกรอง Butterworth ลำดับที่ห้าแบบออฟไลน์ ฉันสามารถใช้งาน FFT ได้ ดูเหมือนจะมีสองทางเลือกสำหรับการใช้งานการกรอง:

  • การชักจูงสัญญาณด้วยการตอบสนองแบบอิมพัลส์ในโดเมนเวลาหรือ
  • ทวีคูณสัญญาณด้วยการตอบสนองแบบอิมพัลส์ในโดเมนความถี่และแปลงผลลัพธ์ให้กลับด้าน

วิธีการเหล่านี้จะเหมือนกันในกรณี FT ทางทฤษฎี แม้ว่าจะทำในชีวิตจริงด้วย DFT แต่ฉันคิดว่าสิ่งต่าง ๆ หนึ่งในวิธีการเชิงตัวเลขมีเสถียรภาพมากขึ้นหรือไม่? มีปัญหาอื่น ๆ ที่ฉันควรทราบอีกหรือไม่ จำนวนการคำนวณไม่สำคัญ


วิธี FFT จะเร็วกว่ามากในการคำนวณความยาวของสัญญาณส่วนใหญ่ ความยาวสั้นเท่านั้นจะเร็วขึ้นด้วยการแปลงโดเมนเวลา
endolith

คำตอบ:


5

ด้วย convolution คุณจะไม่พบปัญหาความมั่นคงใด ๆ เนื่องจากไม่มีการกรองแบบเรียกซ้ำดังนั้นคุณจะไม่สะสมข้อผิดพลาดใด ๆ กล่าวอีกนัยหนึ่งระบบคือศูนย์ทั้งหมดไม่มีเสา ผมเคยได้ยิน anecdotally แต่ไม่ได้รับการตรวจสอบสำหรับตัวเองว่า FFT-based บิดมีต่ำกว่าข้อผิดพลาดกว่าบิดโดเมนเวลาเพียงเพราะมันมี O (n log n) ดำเนินการทางคณิตศาสตร์มากกว่า O (n ^ 2)

โดยทั่วไปเท่าที่ฉันทราบตัวกรอง Butterworth จะถูกใช้งานเป็นตัวกรองแบบเรียกซ้ำ (IIR) ดังนั้นจึงเป็นหัวข้อที่แตกต่างกัน ตัวกรอง IIR มีเสาเช่นเดียวกับศูนย์ดังนั้นจึงอาจมีปัญหาความมั่นคงในทางปฏิบัติ นอกจากนี้สำหรับตัวกรอง IIR วิธีการที่ใช้ FFT ไม่ใช่ตัวเลือก แต่ในทางกลับกันตัวกรอง IIR มีแนวโน้มที่จะเรียงลำดับต่ำมาก

เท่าที่ปัญหาความมั่นคงของตัวกรอง IIR พวกเขามักจะมีปัญหาในการสั่งซื้อที่สูงขึ้น - ฉันแค่โยนตัวเลขและพูดว่าลำดับที่ 6 ประมาณว่ากำลังผลักดันมัน โดยปกติจะใช้งานเป็น biquads แบบเรียงซ้อน (ส่วนตัวกรองลำดับที่สอง) สำหรับตัวกรองลำดับที่ 5 ของคุณให้เขียนเป็นฟังก์ชันถ่ายโอนโดเมน z (มันจะเป็นฟังก์ชันระดับเหตุผล 5) จากนั้นแยกตัวกรองลงใน 5 ขั้วและ 5 ศูนย์ รวบรวมคอนจูเกตที่ซับซ้อนแล้วคุณจะมี biquads สองตัวและตัวกรองลำดับที่หนึ่ง โดยทั่วไปแล้วปัญหาความมั่นคงมักจะเกิดขึ้นเมื่อเสาเข้ามาใกล้กับหน่วยวงกลมมากขึ้น

นอกจากนี้ยังอาจมีปัญหาเกี่ยวกับสัญญาณรบกวนและ จำกัด รอบในตัวกรอง IIR ดังนั้นจึงมีโทโพโลยีตัวกรองที่แตกต่างกัน (เช่นรูปแบบโดยตรง I, รูปแบบโดยตรง II) ที่มีคุณสมบัติตัวเลขที่แตกต่างกัน แต่ฉันจะไม่คิดใหม่ ความแม่นยำและเกือบจะดีพอแน่นอน


คุณหมายความว่าอย่างไรกับการทำงานกับตัวกรอง FIR เท่านั้น ฉันสันนิษฐานว่าตัวกรอง IIR จะต้องมีการสุ่มตัวอย่างอย่างใดอยู่แล้ว ตัวกรอง IIR มักจะใช้งานในโดเมนเวลาเพื่อหลีกเลี่ยงปัญหานี้หรือไม่
Andreas

1
เท่าที่ผมทราบกรอง IIR จะเสมอดำเนินการในโดเมนเวลา ตัวกรอง IIR (ที่นี่ยกตัวอย่างเช่นตัวกรองลำดับที่สองหรือ "biquad") y(n) = b0 * x(n) + b1 * x(n-1) + b2 * x(n-2) - a1 * y(n-1) - a2 * y(n-2)จะถูกกำหนดโดยสมการความแตกต่างเช่น โปรดทราบว่านี่เป็นการรวมกันของตัวอย่างอินพุตก่อนหน้า (ค่า x) และตัวอย่างผลลัพธ์ก่อนหน้า (ค่า y) ตัวกรอง FIR ขึ้นอยู่กับอินพุตที่ผ่านมาเท่านั้นดังนั้นจึงยอมรับการใช้โดเมนความถี่ที่มีประสิทธิภาพ ตัวกรอง IIR ไม่ได้ แต่มีประสิทธิภาพมากอยู่แล้วเพราะตัวกรอง IIR มักจะมีลำดับที่ต่ำกว่ามาก
schnarf

1
เหตุผลที่ตัวกรอง IIR มีลำดับที่ต่ำกว่ามากคือเสา (ข้อเสนอแนะของตัวอย่างผลลัพธ์ก่อนหน้า) ช่วยให้ตัวกรองมีความชันมากขึ้นพร้อมค่าสัมประสิทธิ์น้อยมากเมื่อเทียบกับตัวกรอง FIR เมื่อฉันพูดถึงลำดับที่ต่ำกว่าตัวกรอง IIR ทั่วไปอาจเป็นลำดับที่สอง (5 สัมประสิทธิ์) ในขณะที่ตัวกรอง FIR ทั่วไปสำหรับงานเดียวกันอาจมีค่าสัมประสิทธิ์นับพัน
schnarf

4

ในเกือบทุกกรณีตัวเลือกที่ดีที่สุดของคุณไม่ใช่การแปลงหรือ 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 และนานกว่าสัญญาณดั้งเดิมของคุณหลายเท่า


สิ่งนี้ไม่ได้ตอบคำถามเกี่ยวกับปัญหาเชิงตัวเลข แต่ฉันไม่ทราบปัญหาด้วยfilter- ขอบคุณ! ทางลัดสูงของฉันคือ 0.5 Hz @ 250 Hz อะไรคือสาเหตุของปัญหาด้วยfilter? ฉันกำลังเขียนการดำเนินการเอง
Andreas

2

ทำไมคุณคิดว่าสิ่งต่าง ๆ จะแตกต่างกัน? แนวคิดเชิงทฤษฎีควรแปลเป็นแอปพลิเคชั่นที่ใช้งานได้จริงโดยมีความแตกต่างเพียงอย่างเดียวคือประเด็นประเด็นลอยซึ่งเราไม่สามารถหลบหนีได้ คุณสามารถตรวจสอบได้อย่างง่ายดายด้วยตัวอย่างง่ายๆใน MATLAB:

x=randn(5,1);
y=randn(5,1);
X=fft(x,length(x)+length(y)-1);
Y=fft(y,length(x)+length(y)-1);

z1=conv(x,y);z2=ifft(X.*Y);
z1-z2

ans =

   1.0e-15 *

   -0.4441
   -0.6661
         0
   -0.2220
    0.8882
   -0.2220
         0
   -0.4441
    0.8882

อย่างที่คุณเห็นข้อผิดพลาดนั้นเป็นเรื่องของความแม่นยำของเครื่อง ไม่มีเหตุผลใดที่จะไม่ใช้วิธี FFT ดังที่เอนโดลิ ธ กล่าวถึงมันเป็นเรื่องธรรมดามากที่จะใช้วิธีการ FFT ในการกรอง / โน้มน้าว / ข้ามสัมพันธ์และอื่น ๆ และเร็วกว่ามากยกเว้นตัวอย่างที่มีขนาดเล็กมาก (เช่นในตัวอย่างนี้) ไม่ใช่การประมวลผลโดเมนเวลาที่ไม่เคยทำ ... มันทำให้ทุกอย่างลงในแอปพลิเคชันความต้องการและข้อ จำกัด


1
ฉันคิดว่าคำถามเดิมคือการเจาะลึกลงไปในประเด็นทศนิยมที่อยู่ในการกรองตาม FFT กับการใช้งานตัวกรองโดยตรงในโดเมนเวลา นี่อาจเป็นข้อกังวลอย่างแท้จริงสำหรับการประมวลผลสัญญาณจุดคงที่หากคุณมีตัวกรองที่ยาวมาก ๆ หรือหากคุณมีการใช้งาน FFT ที่ไม่ดีเช่น คุณจะไม่เห็นเอฟเฟกต์ใด ๆ สำหรับลำดับความยาว 5 ในทศนิยมที่มีความแม่นยำสองเท่า
Jason R

@JasonR ข้อผิดพลาดยังคงมีความแม่นยำของเครื่องจักรหากคุณขยายความยาวของลำดับเป็น 1e6 ในตัวอย่างด้านบน ข้อผิดพลาดที่คุณกล่าวถึงการครอบตัดส่วนใหญ่เกิดจากการออกแบบตัวกรองที่ไม่ดีหรือการใช้ FFT ที่ไม่ดี หากสิ่งเหล่านั้นดีฉันไม่เห็นว่าทำไมการโน้มน้าวใจในโดเมนเวลาควรให้คำตอบที่แตกต่างจากที่อยู่ในโดเมนความถี่
Lorem Ipsum

1
ไม่ควรให้คำตอบที่ต่างออกไปตามโดเมนที่คุณทำการคำนวณจุดเดียวของฉันคือการดำเนินการทางคณิตศาสตร์ที่เกิดขึ้นจริงนั้นแตกต่างกันอย่างมากระหว่างสองแนวทางดังนั้นขึ้นอยู่กับการใช้งานของแต่ละที่คุณมี สามารถเห็นความแตกต่างที่จับต้องได้ สำหรับความแม่นยำสองเท่าสมมติว่าคุณมีการใช้งานที่ดีฉันจะไม่คาดหวังความแตกต่างใด ๆ ยกเว้นในกรณีที่รุนแรง
Jason R
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.