การเรียงลำดับส่วน biquad สำหรับตัวกรองคำสั่งซื้อที่สูงขึ้นทำงานอย่างไร


20

ฉันกำลังพยายามใช้ตัวกรอง IIR อันดับที่ 8 และบันทึกย่อของแอปพลิเคชันและหนังสือทุกเล่มที่ฉันได้อ่านบอกว่ามันเป็นการดีที่สุดที่จะใช้ตัวกรองลำดับที่สองมากกว่านั้นเป็นส่วนที่สอง ฉันใช้tf2sosMATLAB เพื่อรับค่าสัมประสิทธิ์สำหรับส่วนที่สองซึ่งทำให้ฉันมีค่า 6x4 coeffs สำหรับส่วนของคำสั่งที่สอง 4 ตามที่คาดไว้ ก่อนการใช้งานเป็น SOS ตัวกรองลำดับที่ 8 จำเป็นต้องเก็บค่าตัวอย่าง 7 ค่าก่อนหน้า (และค่าเอาต์พุตด้วย) ตอนนี้เมื่อดำเนินการตามลำดับส่วนที่สองโฟลว์ทำงานอย่างไรจากอินพุตไปยังเอาต์พุตฉันต้องเก็บค่าตัวอย่างก่อนหน้านี้เพียง 2 ค่าหรือไม่ หรือผลลัพธ์ของตัวกรองตัวแรกป้อนเช่นเดียวx_inกับตัวกรองที่สองและอื่น ๆ ?


คุณจำเป็นต้องจัดเก็บสถานะก่อนหน้านี้สำหรับทุกขั้นตอนขึ้นอยู่กับลำดับของตัวกรองในระยะนั้นดังนั้นมันจะไม่ใช่แค่ 2 อย่างที่คุณพูดถึง

คำตอบ:


13

มันเป็นสิ่งสุดท้ายที่คุณพูด ("หรือเอาท์พุทของตัวกรองตัวแรกป้อนเป็น x_in ในตัวกรองที่สองเป็นต้น") แนวคิดนั้นง่าย: คุณปฏิบัติกับ biquads เป็นตัวกรองลำดับที่สองที่แยกต่างหากที่อยู่ในน้ำตก เอาต์พุตจากตัวกรองแรกคืออินพุตไปยังวินาทีและอื่น ๆ ดังนั้นเส้นหน่วงเวลาจะถูกกระจายออกไประหว่างตัวกรอง หากคุณต้องการปรับโครงสร้างให้เหมาะสมในสภาพแวดล้อมที่ จำกัด หน่วยความจำคุณสามารถสังเกตได้ว่า biquads ที่อยู่ติดกันมีหน่วยความจำแบบหน่วงเวลาซ้ำซ้อน ไม่ต้องจัดเก็บแยกต่างหากเหมือนที่คุณต้องการหากคุณใช้ตัวกรองแยกต่างหาก)


ขอบคุณ! ฉันเพิ่งจะทำได้อย่างรวดเร็วใน MATLAB สาเหตุของความสับสนก่อนหน้านี้คือฉันลืมที่จะทวีคูณกำไร (อ๊ะ!) และด้วยเหตุนี้ความคิดทุกประเภทจึงเริ่มคืบคลานเข้ามา
anasimtiaz

หากคุณไม่ต้องการขอผลตอบแทนจากการหาเรื่องจาก tf2sos (เช่นในตัวอย่างโค้ดที่โพสต์ของฉัน) คุณไม่จำเป็นต้องรำคาญกับการคูณมันกลับมาอีกครั้ง
เรียนรู้

9

จริง ๆ แล้วมีสองวิธีในการใช้ส่วนคำสั่งที่สอง: ขนานและอนุกรม ในเวอร์ชั่นอนุกรมเอาต์พุตของส่วน N คืออินพุตไปยังส่วน N + 1 ในรุ่นคู่ขนานทุกส่วนมีอินพุตเหมือนกัน (และมีศูนย์จริงเพียงศูนย์เดียวแทนที่จะเป็นศูนย์คู่ที่ซับซ้อนแบบคอนจูเกต) และแต่ละส่วนของเอาต์พุตจะถูกรวมเข้าด้วยกัน ทั้งสองวิธีมีความสัมพันธ์ผ่านการขยายบางส่วนของฟังก์ชั่นการถ่ายโอนโดเมน Z คำเตือน: นี่เป็นปัญหาที่มีตัวเลขและการใช้งานมาตรฐาน Matlab "ตกค้าง" สามารถมีข้อผิดพลาดเชิงตัวเลขที่มีขนาดใหญ่มากสำหรับตัวกรองเสียงทั่วไปที่มีเสาใกล้กับวงกลมหน่วย


6

นี่คือตัวอย่างรหัสเล็กน้อยที่จะแสดงว่าทำไมคุณถึงดีกว่าในการเรียงลำดับที่ 2

clc

sr = 44100;
order = 13;

[b,a] = butter(order,1000/(sr/2),'low');
[sos] = tf2sos(b,a);

x = [1; zeros(299,1)]; %impulse


% all in one
Y = filter(b,a,x);

% cascaded biquads
Z = x;
for nn = 1:size(sos,1);
    Z = filter(sos(nn,1:3),sos(nn,4:6), Z );
end


cla; plot(Y, 'k'); hold on; plot(Z,':r'); hold off

สำหรับตัวกรอง lowpass ที่ระบุไว้ในตัวอย่างข้างต้นตามคำสั่งประมาณ 12 ถึง 13 ข้อผิดพลาดเชิงตัวเลขจะสร้างขึ้นเพื่อให้การตอบสนองต่อแรงกระตุ้นที่แตกต่างกันอย่างเห็นได้ชัดสำหรับการใช้งานที่ไม่ได้ใช้ biquads เรียงซ้อน ระยะทางของคุณจะแตกต่างกันไปตามตัวกรอง

ORDER = 10

ป้อนคำอธิบายรูปภาพที่นี่

ORDER = 13

ป้อนคำอธิบายรูปภาพที่นี่


@learvst แก้ไขให้ฉันถ้าฉันผิด แต่รหัสของคุณพลาดกำไร ไม่ควรเป็น:[sos gain] = tf2sos(b,a); // Rest of code for nn = 1:size(sos,1); Z = filter(sos(nn,1:3),sos(nn,4:6), Z ); end Z = filter(gain,1,Z);
915783
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.