ฉันจะใช้งานโอเพ่นซอร์สของอัลกอริธึมการออกแบบตัวกรอง FIR ที่เหมาะสมกับ Parks-McClellan ได้อย่างไร


20

ความเป็นมา:บ่อยครั้งที่ฉันทำงานการประมวลสัญญาณบางอย่างที่ต้องใช้ตัวกรองที่ไม่ซ้ำใคร ปกติจะอยู่ที่จุดนี้ผมไปที่ MATLAB และสร้างตัวกรองที่ไม่ซ้ำกันใหม่โดยใช้firpm() ) firpm()ฟังก์ชันMATLAB ใช้อัลกอริทึม Parks-McClellan ตอนนี้ฉันมีตัวกรองและใส่ตัวกรองลงในอาร์เรย์ฮาร์ดโค้ด แต่นี่คือปัญหาที่ฉันมีตัวกรอง hardcoded ซึ่งใช้ได้กับสถานการณ์เดียวเท่านั้น

ปัญหา:ตอนนี้ฉันสามารถแก้ปัญหาการประมวลผลสัญญาณของฉันได้สองทาง ... แต่สำหรับอัตราตัวอย่างเดี่ยวที่เฉพาะเจาะจงมากหรือสถานการณ์เฉพาะ

เป้าหมาย:ฉันต้องการที่จะสามารถที่จะเรียกfirpm()จากรหัส C หรือบางส่วนภาษาอื่น ๆ และให้รหัสการประมวลผลสัญญาณของฉันทั่วไปมากขึ้น ฉันไม่พบการใช้โอเพ่นซอร์สของfirpm()!

ฉันจะใช้งานโอเพ่นซอร์สของอัลกอริทึมการออกแบบตัวกรอง FIRของParks-McClellan ที่เหมาะสมได้อย่างไร (aka firpm()ใน MATLAB)

  • ป.ล.ฉันทราบว่าฉันสามารถออกแบบตัวกรองต่างกันโดยใช้หน้าต่างหรืออย่างอื่น ... อย่าลังเลที่จะพูดถึงพวกเขาในความคิดเห็น แต่ประเด็นของคำถามนี้ไม่ได้ถามว่า "เทคนิคการออกแบบตัวกรองอื่น ๆ คืออะไร" จุดคือการหาการดำเนินการเปิดแหล่งที่มาของที่ดีมีประโยชน์มากfirpm() ... หรือสิ่งที่คล้ายกัน

  • PPSหนึ่งในเป้าหมายของคำถามนี้คือการเรียนรู้ว่าอัลกอริทึม Parks-McClellan ทำงานอย่างไรโดยดูที่รหัสก่อนจากนั้นฉันวางแผนที่จะอ่านทฤษฎีพื้นหลัง


เป็นสิ่งสำคัญหรือไม่ที่การแก้ปัญหานั้นฟรี? คุณตรวจสอบ Matlab C API หรือไม่

2
ลำดับความสำคัญสูงสุดคือฉันต้องการดูซอร์สโค้ด (ไม่ควรเป็น Fortran ดังนั้นฉันจึงไม่จำเป็นต้องจ้องตา) ฉันจะไม่ใส่ข้อ จำกัด ที่ว่าจะต้องเป็นแบบฟรี (อาจจะมีโอเพ่นซอร์สบางประเภท แต่ไม่มีซอร์สโค้ด)
เทรเวอร์บอยด์สมิ ธ

3
ฉันรู้ว่าคุณสามารถรวบรวม Matlab โดยใช้ Matlab คอมไพเลอร์แล้วแจกจ่ายโดยใช้ Matlab Runtime ... ดังนั้นในทางเทคนิคลูกค้าของคุณไม่ต้องจ่ายใบอนุญาต Matlab ฉันยังรับรู้ถึง Matlab Engine (aka C ถึง Matlab API) ทั้งสองสิ่งนี้ไม่เกี่ยวข้องกันเพราะฉันมักจะใช้งานบนแพลตฟอร์มแบบฝังที่ไม่มีให้ใช้งาน
เทรเวอร์บอยด์สมิ ธ

1
@TrevorBoydSmith เนื่องจากคุณแค่ต้องการดูซอร์สโค้ดคุณได้ลองใช้งานtype firpm.mใน MATLAB แล้วหรือยัง ที่จะแสดงให้คุณเห็นการใช้งานของ MATLAB
Lorem Ipsum

1
การออกแบบตัวกรอง FIR มีประโยชน์มากสำหรับการประมวลผลสัญญาณและ Parks-mcclelan เป็นหัวข้อที่ไม่สำคัญ และถึงกระนั้นฉันก็ถูกลงคะแนนซ้ำ ๆ เพื่อถามเกี่ยวกับเรื่องที่ IMO เหมาะสมอย่างเต็มที่ในกฎบัตร dsp.stackexchange กรุณาอธิบาย downvotes ของคุณ
เทรเวอร์บอยด์สมิ ธ

คำตอบ:


5

นี่คืออัลกอริทึมการแลกเปลี่ยน Remez รุ่น LGPL ดูเหมือนว่ารหัสอ็อกเทฟนั้นจะได้มาจากมัน มันได้รับการเชื่อมโยงจากหน้าวิกิพีเดียสวนสาธารณะ McClellanหน้า
รหัส Janovetz ดั้งเดิมอาจใช้งานได้ง่ายขึ้นในโครงการของคุณเนื่องจากไม่มีการเรียกระดับแปดเสียง แต่ควรที่จะขุดผ่านคู่ svn changelog สำหรับข้อมูลเกี่ยวกับการแก้ไขข้อบกพร่องหรือการเร่งความเร็วในไฟล์ remez.cc .


ฉันเห็นด้วยกับการใช้รหัส Janovetz ในโครงการจะง่ายขึ้นเพราะมันตรง C. ฉันยังเห็นด้วยอย่างแน่นอนว่าการตรวจสอบบันทึกการเปลี่ยนแปลงของการใช้งานระดับแปดเสียงจะฉลาดมาก
เทรเวอร์บอยด์สมิ ธ

รหัส Janovetz IMO น่าจะเป็นร่างแรกหรือครั้งที่สอง ... แต่ไม่ได้ใช้อย่างหนักเหมือนรหัสคู่
เทรเวอร์บอยด์สมิ ธ

หมายเหตุสำคัญมาก: รหัส Janovetz คือ LGPL เพื่อให้คุณสามารถใช้ในการตั้งค่าเชิงพาณิชย์
เทรเวอร์บอยด์สมิ ธ

ลิงก์แรกจากคำตอบเสียดังนั้นนี่คือลิงค์ไปยังไลบรารีที่ใช้การใช้งานเดียวกัน
Machta

11

มีการใช้โอเพ่นซอร์สของ Parks-McClellan (หรือที่รู้จักกันว่าอัลกอริธึมการแลกเปลี่ยน Remez) ใน GNU Octave ซึ่งเป็นการใช้งานซอฟต์แวร์ฟรีของสภาพแวดล้อมแบบ MATLAB ฟังก์ชั่นที่เรียกว่า "Remez" ที่มีอยู่ใน"สัญญาณ" แพคเกจซึ่งเป็นเจ้าภาพที่คู่เจน หากคุณดาวน์โหลดแพ็คเกจคุณจะพบ "remez.cc" ซึ่งเป็น C + + ของการใช้อัลกอริทึม

สิ่งหนึ่งที่ดีเกี่ยวกับ Octave ก็คือมันเกือบจะเข้ากันได้กับรหัส MATLAB ดังนั้นคุณสามารถพอร์ตรหัสได้อย่างง่ายดายเพื่อใช้ที่นั่นหากคุณต้องการ มันเป็นวิธีที่ดีในการดูภายใต้ประทุนที่การใช้อัลกอริทึมที่มีให้ในรูปแบบ MEX ใน MATLAB


"อัลกอริทึม Parks-McClellan เป็นรูปแบบของอัลกอริทึม Remez หรืออัลกอริทึมแลกเปลี่ยน Remez กับการเปลี่ยนแปลงที่ถูกออกแบบมาโดยเฉพาะสำหรับตัวกรอง FIR และกลายเป็นวิธีมาตรฐานสำหรับการออกแบบตัวกรอง FIR" นอกจากนี้ใน SciPy: docs.scipy.org/doc/scipy/reference/generated/…
endolith


2

นี่คือแหล่งข้อมูลอื่นสำหรับอัลกอริทึม Parks McClellan ใน C. รหัสนี้แตกต่างจากรหัส SciPy ที่กล่าวถึงข้างต้นซึ่งมี 61 ของ 69 คำสั่ง goto เดิมที่ถูกลบออก (รหัส SciPy ยังคงมีประมาณ 37 goto) นอกจากนี้ยังแก้ไขรหัสใน 3 ตำแหน่งที่สามารถหารด้วยศูนย์ได้และมีรหัสเพิ่มเติมบางอย่างที่ช่วงตรวจสอบค่าขอบแบนด์

http://www.iowahills.com/A7ExampleCodePage.html


1

บางทีคุณอาจรู้แล้ว แต่ถ้าคุณมี MATLAB คุณสามารถใช้ตัวเข้ารหัส MATLAB และสร้างฟังก์ชั่นง่าย ๆ ที่ใช้คุณสมบัติที่คุณต้องการตรวจสอบ จากนั้นเรียกใช้และดูรหัส C ที่สร้างขึ้น ฉันลองกับ FFT และด้วยการสลายตัวของ QR และในขณะที่มันยุ่งเล็กน้อยก็สามารถเข้าใจได้ดี


1

นี่คือกระดาษที่ใช้ Matez รุ่น "Matlab" ของอัลกอริทึม Remez จริง “ โปรแกรมออกแบบ FIR ฟิลเตอร์ multiband ที่เหมาะสมกับ MATLAB ตามแนวคิดดั้งเดิมของอัลกอริธึมการแลกเปลี่ยนหลาย Remez” -2011 IEEE International Symposium บนวงจรและระบบ (ISCAS) - ผู้เขียน (Ahsan, Saramaki)

บทความนี้ทำงานได้ดีในการอธิบายอัลกอริทึมพื้นฐาน เป้าหมายของบทความนี้คือการหลีกเลี่ยงการใช้รหัส Fortran ดั้งเดิมซึ่งไม่ได้อธิบายขั้นตอนวิธีที่ดีมากและมักจะได้รับการแปลเป็นภาษาอื่น ๆ โดยตรง

สิ่งหนึ่งที่ฉันจะแสดงความคิดเห็นใน หนึ่งในแนวคิดหลักของอัลกอริทึมก็คือให้พอดีกับส่วนโค้งแล้วหาจุดที่มากที่สุด โดยปกติแล้วการแก้ไขลากรองจ์จะใช้ในการอธิบายความคิดนี้ แต่การแก้ไขลากรองจ์มีคุณสมบัติตัวเลขที่ไม่ดี ในอัลกอริทึมดั้งเดิมให้ใช้ Barycentric Implementation ของการแก้ไขลากรองจ์ - ซึ่งหลีกเลี่ยงข้อผิดพลาดที่เกี่ยวข้องจำนวนมากของการแก้ไขลากรองจ์ ดังนั้นหากคุณพยายามเข้าใจรหัสอย่างสมบูรณ์คุณอาจต้องการค้นหา Barycentric Interpolation


ดูกระดาษ - มันเป็นรหัส Parks-McClellan ที่แก้ไขแล้ว มันยังคงใช้อัลกอริธึมการแลกเปลี่ยน Remez แต่มีแนวโน้มที่จะมีประสิทธิภาพที่ดีขึ้นและช่วยให้คุณสามารถออกแบบตัวกรองที่ยาวกว่าที่คุณได้รับจากอัลกอริทึม PM (หรือการใช้งานของ Matlab)
David

1

ระวังความแตกต่างระหว่างเฟิร์มแวร์ของ Matlab กับ Remip ของ Scipy.signal ตัวอย่างเช่นคำสั่งสองข้อความนี้เทียบเท่า:

% Matlab
firpm(10,[.2 .8],[1 1],'Hilbert')
# Python
from scipy.signal import remez

remez(11, [0.1, 0.4], [1], type='hilbert')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.