
Perpustakaan filter respons impuls tak terbatas (IIR) untuk Linux, Mac OSX dan Windows yang mengimplementasikan filter Butterworth, RBJ, Chebychev dan dapat dengan mudah mengimpor koefisien yang dihasilkan oleh Python (SCIPY).
Filter memproses sampel data dengan sampel untuk pemrosesan realtime.
Ini menggunakan templat untuk mengalokasikan memori yang diperlukan sehingga dapat berjalan tanpa perintah malloc / baru. Memori dialokasikan pada waktu kompilasi sehingga tidak pernah ada risiko kebocoran memori.
Semua kode filter realtime ada di file header yang menjamin integrasi yang efisien ke dalam program utama dan kompiler dapat mengoptimalkan kode filter dan program utama secara bersamaan.
Tambahkan pernyataan termasuk berikut ke kode Anda:
#include "Iir.h"
Pendekatan pengkodean umum adalah bahwa pertama -tama filter dipakai menentukan pesanannya, maka parameter diatur dengan setup fungsi dan kemudian siap digunakan untuk sampel dengan sampel penyaringan realtime.
Idenya adalah untuk mengalokasikan memori filter pada waktu kompilasi dengan argumen template untuk menghindari perintah baru. Ini mencegah kebocoran memori dan dapat dioptimalkan pada waktu kompilasi. order yang disediakan untuk templat (misalnya di sini untuk filter lowpass):
Iir::Butterworth::LowPass<order> f;
digunakan sebagai pesanan default oleh perintah setup di bawah ini tetapi dapat ditimpa dengan urutan yang lebih rendah jika diperlukan.
setupSemua filter tersedia sebagai filter lowpass, highpass, bandpass dan bandstop/takik. Butterworth/Chebyshev menawarkan juga rendah/tinggi/pita-shelves dengan gain passband yang ditentukan dan gain 0DB di stopband.
Frekuensi dapat menjadi analog terhadap laju pengambilan sampel atau yang dinormalisasi antara 0..1/2 di mana 1/2 adalah frekuensi Nyquist. Perhatikan bahwa frekuensi yang dinormalisasi hanyalah F = f/fs dan berada dalam satuan 1/sampel. Secara internal perpustakaan menggunakan frekuensi yang dinormalisasi dan perintah pengaturan cukup membagi dengan laju pengambilan sampel jika diberikan. Pilih antara:
setup : Laju Pengambilan Sampel dan Frekuensi Cutoff AnalogsetupN : Frekuensi yang dinormalisasi dalam 1/sampel antara F = 0..1/2 di mana 1/2 = Nyquist. Secara default setup menggunakan pesanan yang disediakan oleh argumen template tetapi dapat ditimpa dengan pesanan filter yang lebih rendah.
Lihat file header di iir atau dokumentasi untuk argumen perintah setup .
Contoh di bawah ini adalah untuk filter lowpass:
Butterworth.h Filter standar yang cocok untuk sebagian besar aplikasi. Respons monotonik. 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);
atau tentukan frekuensi yang dinormalisasi antara 0..1/2:
f.setupN(norm_cutoff_frequency);
ChebyshevI.h dengan riak passband yang diizinkan di DB. Iir::ChebyshevI::LowPass<order> f;
const float passband_ripple_in_db = 5;
f.setup (samplingrate,
cutoff_frequency,
passband_ripple_in_dB);
atau tentukan frekuensi yang dinormalisasi antara 0..1/2:
f.setupN(norm_cutoff_frequency,passband_ripple_in_dB);
ChebyshevII.h dengan penolakan stopband terbolehan terbolehan di DB. Iir::ChebyshevII::LowPass<order> f;
double stopband_ripple_in_dB = 20;
f.setup (samplingrate,
cutoff_frequency,
stopband_ripple_in_dB);
atau tentukan frekuensi yang dinormalisasi antara 0..1/2:
f.setupN(norm_cutoff_frequency,stopband_ripple_in_dB);
RBJ.h FILTER PESAN 2 dengan Cutoff dan Q Factor. Iir::RBJ::LowPass f;
const float cutoff_frequency = 100;
const float Q_factor = 5;
f.setup (samplingrate, cutoff_frequency, Q_factor);
atau tentukan frekuensi yang dinormalisasi antara 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);
Sampel diproses satu per satu. Dalam contoh di bawah sampel x diproses dengan perintah filter dan kemudian disimpan dalam y . Jenis x dan y dapat mengapung atau ganda (integer juga diizinkan tetapi masih diproses secara internal sebagai titik mengambang):
y = f.filter(x);
Ini kemudian diulangi untuk setiap sampel yang masuk dalam loop atau event handler.
Nilai tidak valid yang disediakan untuk setup() akan melempar pengecualian. Parameter yang disediakan untuk setup() yang menghasilkan koefisien adalah NAN juga akan memberikan pengecualian.
Anda dapat mematikan penanganan eksepsi dengan mendefinisikan IIR1_NO_EXCEPTIONS melalui CMake atau dalam program Anda.
Jika Anda menggunakan cmake sebagai sistem build Anda maka cukup tambahkan ke CMakeLists.txt Anda. TXT baris berikut untuk perpustakaan dinamis:
find_package(iir)
target_link_libraries(... iir::iir)
atau untuk yang statis:
find_package(iir)
target_link_libraries(... iir::iir_static)
Tautkan dengan pustaka dinamis (unix/mac: -liir , windows: iir.lib ) atau pustaka statis (unix/mac: libiir_static.a , windows: libiir_static.lib ).
Jika Anda menggunakan Ubuntu LTS maka Anda dapat menginstal pustaka ini sebagai paket yang telah dikompilasi sebelumnya.
Tambahkan repositori ini ke sistem Anda:
sudo add-apt-repository ppa:berndporr/dsp
Kemudian instal paket:
sudo apt install iir1sudo apt install iir1-devIni tersedia untuk 64 bit intel dan lengan 32,64 bit (raspberry pi dll). Dokumentasi paket pengembangan dan contoh program ada di:
/usr/share/doc/iir1-dev/
Alat build adalah cmake yang menghasilkan file Make atau Project untuk platform yang berbeda. cmake tersedia untuk Linux, Windows dan Mac. Ini juga dikompilasi langsung pada pi raspberry.
Berlari
cmake .
yang menghasilkan makefile. Kemudian jalankan:
make
sudo make install
yang menginstalnya di bawah /usr/local/lib dan /usr/local/include .
Baik GCC dan Clang telah diuji.
cmake -G "Visual Studio 16 2019" -A x64 .
Lihat cmake untuk opsi build yang berbeda. Di atas adalah untuk build 64 bit. Kemudian mulai visual C ++ dan buka solusinya. Ini akan membuat file DLL dan LIB. Di bawah Windows sangat disarankan untuk menggunakan pustaka statis dan menautkannya ke program aplikasi.
Jalankan tes unit dengan mengetik make test atau hanya ctest . Tes ini jika setelah pulsa delta semua filter rileks hingga nol, bahwa output mereka tidak pernah menjadi NAN dan jika filter Formulir I & II langsung menghitung urutan yang diharapkan dengan membandingkannya dari hasil yang dibuat oleh output sosfilt Scipy.
Anda dapat menonaktifkan generasi tes dengan mengatur IIR1_BUILD_TESTING ke OFF.
Cara termudah untuk belajar adalah dari contoh -contoh yang ada di direktori demo . Delta pulsa sebagai sinyal uji dikirim ke filter yang berbeda dan disimpan dalam file. Dengan skrip python plot_impulse_fresponse.py Anda kemudian dapat memplot respons frekuensi.
Anda dapat menonaktifkan kompilasi demo dengan mengatur IIR1_BUILD_DEMO ke OFF.
Juga direktori yang berisi uji unit memberikan contoh untuk setiap jenis filter.
PDF dari semua kelas, metode dan fungsi setup khusus ada di direktori docs/pdf .
Dokumentasi online ada di sini: http://berndporr.github.io/iir1
Tanggapan ini telah dihasilkan oleh iirdemo.cpp di /demo/ direktori dan kemudian diplot dengan plot_impulse_fresponse.py .







Perpustakaan ini telah dikembangkan lebih lanjut dari karya asli Vinnie Falco yang dapat ditemukan di sini:
https://github.com/vinniefalco/dspfilters
Sementara perpustakaan asli memproses array audio perpustakaan ini telah disesuaikan untuk melakukan sampel pemrosesan realtime cepat dengan sampel. Perintah setup tidak akan memerlukan urutan filter dan sebaliknya mengingatnya dari argumen template. Struktur kelas telah disederhanakan dan semua fungsi yang didokumentasikan untuk Doxygen. Alih -alih memiliki pernyataan asert () Libary ini melempar pengecualian jika parameter salah. Setiap desain filter yang membutuhkan optimasi (misalnya filter elipic) telah dihapus dan sebaliknya fungsi telah ditambahkan yang dapat mengimpor koefisien dengan mudah dari SCIPY.
Bernd Porr - http://www.berndporr.me.uk