
ไลบรารีตัวกรองการตอบสนองแบบไม่สิ้นสุด (IIR) สำหรับ Linux, Mac OSX และ Windows ซึ่งใช้ Butterworth, RBJ, Chebychev Filters และสามารถนำเข้าค่าสัมประสิทธิ์ที่สร้างขึ้นโดย Python (Scipy) ได้อย่างง่ายดาย
ตัวกรองประมวลผลตัวอย่างข้อมูลโดยตัวอย่างสำหรับการประมวลผลแบบเรียลไทม์
มันใช้เทมเพลตเพื่อจัดสรรหน่วยความจำที่ต้องการเพื่อให้สามารถทำงานได้โดยไม่ต้องมีคำสั่ง malloc / ใหม่ หน่วยความจำได้รับการจัดสรรในเวลาคอมไพล์เพื่อไม่ให้มีความเสี่ยงต่อการรั่วไหลของหน่วยความจำ
รหัสตัวกรองเรียลไทม์ทั้งหมดอยู่ในไฟล์ส่วนหัวซึ่งรับประกันการรวมเข้ากับโปรแกรมหลักและคอมไพเลอร์สามารถเพิ่มประสิทธิภาพทั้งรหัสกรองและโปรแกรมหลักในเวลาเดียวกัน
เพิ่มคำสั่งรวมต่อไปนี้ลงในรหัสของคุณ:
#include "Iir.h"
วิธีการเข้ารหัสทั่วไปคือตัวกรองแรกคือการระบุคำสั่งซื้อจากนั้นพารามิเตอร์จะถูกตั้งค่าด้วย setup ฟังก์ชั่นจากนั้นก็พร้อมที่จะใช้สำหรับตัวอย่างโดยการกรองตัวอย่างเรียลไทม์
แนวคิดคือการจัดสรรหน่วยความจำของตัวกรองในเวลาคอมไพล์ด้วยอาร์กิวเมนต์เทมเพลตเพื่อหลีกเลี่ยงคำสั่งใหม่ใด ๆ สิ่งนี้จะช่วยป้องกันการรั่วไหลของหน่วยความจำและสามารถปรับให้เหมาะสมในเวลารวบรวม order ที่ให้กับเทมเพลต (ตัวอย่างเช่นที่นี่สำหรับตัวกรอง lowpass):
Iir::Butterworth::LowPass<order> f;
ใช้เป็นคำสั่งเริ่มต้นโดยคำสั่ง setup ด้านล่าง แต่สามารถแทนที่ด้วยลำดับที่ต่ำกว่าหากจำเป็น
setupตัวกรองทั้งหมดมีให้เลือกเช่นตัวกรอง lowpass, highpass, bandpass และ bandstop/notch ข้อเสนอ Butterworth/Chebyshev ยังมีระดับต่ำ/สูง/แบนด์พร้อมอัตราขยาย passband ที่ระบุและเพิ่ม 0db ในแถบหยุด
ความถี่สามารถเป็นอะนาล็อกกับอัตราการสุ่มตัวอย่างหรือค่าปกติระหว่าง 0..1/2 โดยที่ 1/2 คือความถี่ Nyquist โปรดทราบว่าความถี่ปกติเป็นเพียง F = F/FS และอยู่ในหน่วยของ 1/ตัวอย่าง ภายในห้องสมุดใช้ความถี่ปกติและคำสั่งการตั้งค่าเพียงแค่หารด้วยอัตราการสุ่มตัวอย่างหากได้รับ เลือกระหว่าง:
setup : อัตราการสุ่มตัวอย่างและความถี่ตัดอะนาล็อกsetupN : ความถี่ปกติใน 1/ตัวอย่างระหว่าง f = 0..1/2 โดยที่ 1/2 = nyquist โดย setup เริ่มต้นใช้คำสั่งซื้อที่จัดทำโดยอาร์กิวเมนต์เทมเพลต แต่สามารถแทนที่ด้วยคำสั่งซื้อตัวกรองที่ต่ำกว่า
ดูไฟล์ส่วนหัวใน iir หรือเอกสารประกอบสำหรับอาร์กิวเมนต์ของคำสั่ง setup
ตัวอย่างด้านล่างสำหรับตัวกรอง lowpass:
Butterworth.h Standard Filter เหมาะสำหรับการใช้งานส่วนใหญ่ การตอบสนองแบบโมโนโทนิก const int order = 4; // 4th order (=2 biquads)
Iir::Butterworth::LowPass<order> f;
const float samplingrate = 1000; // Hz
const float cutoff_frequency = 5; // Hz
f.setup (samplingrate, cutoff_frequency);
หรือระบุความถี่ปกติระหว่าง 0..1/2:
f.setupN(norm_cutoff_frequency);
ChebyshevI.h พร้อมระลอกคลื่น passband ที่อนุญาตใน db Iir::ChebyshevI::LowPass<order> f;
const float passband_ripple_in_db = 5;
f.setup (samplingrate,
cutoff_frequency,
passband_ripple_in_dB);
หรือระบุความถี่ปกติระหว่าง 0..1/2:
f.setupN(norm_cutoff_frequency,passband_ripple_in_dB);
ChebyshevII.h พร้อมการปฏิเสธแถบหยุดที่เลวร้ายที่สุดใน DB Iir::ChebyshevII::LowPass<order> f;
double stopband_ripple_in_dB = 20;
f.setup (samplingrate,
cutoff_frequency,
stopband_ripple_in_dB);
หรือระบุความถี่ปกติระหว่าง 0..1/2:
f.setupN(norm_cutoff_frequency,stopband_ripple_in_dB);
RBJ.h ตัวกรองคำสั่งซื้อที่ 2 พร้อม cutoff และ q Factor Iir::RBJ::LowPass f;
const float cutoff_frequency = 100;
const float Q_factor = 5;
f.setup (samplingrate, cutoff_frequency, Q_factor);
หรือระบุความถี่ปกติระหว่าง 0..1/2:
f.setupN(norm_cutoff_frequency, Q_factor);
Custom.h ########
# Python
# See "elliptic_design.py" for the complete code.
from scipy import signal
order = 4
sos = signal.ellip(order, 5, 40, 0.2, 'low', output='sos')
print(sos) # copy/paste the coefficients over & replace [] with {}
///////
// C++
// part of "iirdemo.cpp"
const double coeff[][6] = {
{1.665623674062209972e-02,
-3.924801366970616552e-03,
1.665623674062210319e-02,
1.000000000000000000e+00,
-1.715403014004022175e+00,
8.100474793174089472e-01},
{1.000000000000000000e+00,
-1.369778997100624895e+00,
1.000000000000000222e+00,
1.000000000000000000e+00,
-1.605878925999785656e+00,
9.538657786383895054e-01}
};
const int nSOS = sizeof(coeff) / sizeof(coeff[0]); // here: nSOS = 2 = order / 2
Iir::Custom::SOSCascade<nSOS> cust(coeff);
ตัวอย่างจะถูกประมวลผลทีละคน ในตัวอย่างด้านล่างตัวอย่าง x ถูกประมวลผลด้วยคำสั่ง filter แล้วบันทึกใน y ประเภทของ x และ y สามารถลอยหรือสองเท่า (อนุญาตให้จำนวนเต็มได้ แต่ยังคงดำเนินการภายในเป็นจุดลอยตัว):
y = f.filter(x);
สิ่งนี้จะทำซ้ำสำหรับตัวอย่างที่เข้ามาทุกครั้งในห่วงหรือตัวจัดการเหตุการณ์
ค่าที่ไม่ถูกต้องที่ให้ไว้สำหรับ setup() จะส่งข้อยกเว้น พารามิเตอร์ที่มีให้กับ setup() ซึ่งส่งผลให้ค่าสัมประสิทธิ์เป็น NAN ก็จะมีข้อยกเว้นเช่นกัน
คุณสามารถปิดการจัดการ exeption โดยกำหนด IIR1_NO_EXCEPTIONS ผ่าน cmake หรือในโปรแกรมของคุณ
หากคุณใช้ CMake เป็นระบบสร้างของคุณเพียงเพิ่มลงใน CMakeLists.txt ของคุณ txt บรรทัดต่อไปนี้สำหรับไลบรารีแบบไดนามิก:
find_package(iir)
target_link_libraries(... iir::iir)
หรือสำหรับแบบคงที่:
find_package(iir)
target_link_libraries(... iir::iir_static)
เชื่อมโยงกับไลบรารีแบบไดนามิก (Unix/Mac: -liir , Windows: iir.lib ) หรือไลบรารีคงที่ (Unix/Mac: libiir_static.a , Windows: libiir_static.lib )
หากคุณใช้ Ubuntu LTS คุณสามารถติดตั้งไลบรารีนี้เป็นแพ็คเกจที่รวบรวมไว้ล่วงหน้า
เพิ่มที่เก็บนี้ลงในระบบของคุณ:
sudo add-apt-repository ppa:berndporr/dsp
จากนั้นติดตั้งแพ็คเกจ:
sudo apt install iir1sudo apt install iir1-devมีให้บริการสำหรับ Intel 64 บิตและแขน 32,64 บิต (Raspberry Pi ฯลฯ ) เอกสารของแพ็คเกจการพัฒนาและโปรแกรมตัวอย่างอยู่ใน:
/usr/share/doc/iir1-dev/
เครื่องมือสร้างคือ cmake ซึ่งสร้างไฟล์ make- หรือ project สำหรับแพลตฟอร์มที่แตกต่างกัน cmake พร้อมใช้งานสำหรับ Linux, Windows และ Mac นอกจากนี้ยังรวบรวมโดยตรงบน Raspberry Pi
วิ่ง
cmake .
ซึ่งสร้าง makefile จากนั้นเรียกใช้:
make
sudo make install
ซึ่งติดตั้งภายใต้ /usr/local/lib และ /usr/local/include
ทั้ง GCC และ Clang ได้รับการทดสอบ
cmake -G "Visual Studio 16 2019" -A x64 .
ดู cmake สำหรับตัวเลือกการสร้างที่แตกต่างกัน ด้านบนมีไว้สำหรับการสร้าง 64 บิต จากนั้นเริ่ม Visual C ++ และเปิดโซลูชัน สิ่งนี้จะสร้างไฟล์ DLL และ LIB ภายใต้ Windows ขอแนะนำให้ใช้ไลบรารีคงที่และเชื่อมโยงเข้ากับโปรแกรมแอปพลิเคชัน
เรียกใช้การทดสอบหน่วยโดยการพิมพ์ make test หรือเพียงแค่ ctest การทดสอบเหล่านี้หากหลังจาก Delta Pulse ตัวกรองทั้งหมดผ่อนคลายเป็นศูนย์ว่าเอาต์พุตของพวกเขาจะไม่กลายเป็น NAN และหากตัวกรองแบบฟอร์ม I & II โดยตรงคำนวณลำดับที่คาดหวังโดยเปรียบเทียบจากผลลัพธ์ที่สร้างขึ้นโดยผลลัพธ์ของ sosfilt ของ Scipy
คุณสามารถปิดการสร้างการทดสอบได้โดยการตั้งค่า IIR1_BUILD_TESTING เพื่อปิด
วิธีที่ง่ายที่สุดในการเรียนรู้คือจากตัวอย่างที่อยู่ในไดเรกทอรี demo พัลส์เดลต้าเป็นสัญญาณทดสอบจะถูกส่งไปยังตัวกรองที่แตกต่างกันและบันทึกไว้ในไฟล์ ด้วย python script plot_impulse_fresponse.py คุณสามารถพล็อตการตอบสนองความถี่
คุณสามารถปิดการรวบรวมการสาธิตได้โดยการตั้ง IIR1_BUILD_DEMO เป็นปิด
นอกจากนี้ไดเรกทอรีที่มีการทดสอบหน่วยยังให้ตัวอย่างสำหรับทุกประเภทตัวกรอง
PDF ของทุกคลาสวิธีการและฟังก์ชั่น setup โดยเฉพาะอย่างยิ่งอยู่ในไดเรกทอรี docs/pdf
เอกสารออนไลน์อยู่ที่นี่: http://berndporr.github.io/iir1
คำตอบเหล่านี้ถูกสร้างขึ้นโดย iirdemo.cpp ใน /demo/ directory จากนั้นพล็อตด้วย plot_impulse_fresponse.py







ห้องสมุดนี้ได้รับการพัฒนาเพิ่มเติมจากงานต้นฉบับที่ยอดเยี่ยมของ Vinnie Falco ซึ่งสามารถพบได้ที่นี่:
https://github.com/vinniefalco/dspfilters
ในขณะที่ไลบรารีดั้งเดิมประมวลผลอาร์เรย์เสียงไลบรารีนี้ได้รับการปรับให้เข้ากับตัวอย่างการประมวลผลแบบเรียลไทม์อย่างรวดเร็วโดยตัวอย่าง คำสั่ง setup ไม่จำเป็นต้องใช้ลำดับตัวกรองและจำได้จากอาร์กิวเมนต์เทมเพลตแทน โครงสร้างคลาสได้รับการทำให้ง่ายขึ้นและฟังก์ชั่นทั้งหมดที่บันทึกไว้สำหรับ Doxygen แทนที่จะมีคำสั่งยืนยัน () libary นี้จะมีข้อยกเว้นในกรณีที่พารามิเตอร์ไม่ถูกต้อง การออกแบบตัวกรองใด ๆ ที่ต้องการการปรับให้เหมาะสม (ตัวอย่างเช่นตัวกรองรูปวงรี) ได้ถูกลบออกและมีการเพิ่มฟังก์ชั่นแทนซึ่งสามารถนำเข้าสัมประสิทธิ์ได้อย่างง่ายดายจาก Scipy
Bernd Porr - http://www.berndporr.me.uk