
用於Linux,Mac OSX和Windows的無限衝動響應(IIR)濾波器庫,該庫實現了Butterworth,RBJ,Chebychev濾波器,並且可以輕鬆導入Python(Scipy)生成的係數。
過濾器通過樣品處理數據樣本以進行實時處理。
它使用模板分配所需的內存,以便可以在沒有任何malloc / new命令的情況下運行。記憶是在編譯時間分配的,因此永遠不會有內存洩漏的風險。
所有實時過濾器代碼都在標題文件中,該文件保證有效地集成到主程序中,並且編譯器可以同時優化過濾器代碼和主程序。
將以下內容添加到您的代碼中:
#include "Iir.h"
一般的編碼方法是,首先是實例化指定其順序,然後使用函數setup設置參數,然後通過示例實時過濾將其用於示例。
這個想法是用模板參數在編譯時間分配過濾器的內存,以避免任何新命令。這樣可以防止內存洩漏,並且可以在編譯時進行優化。提供給模板的order (例如,在這裡使用低通濾波器):
Iir::Butterworth::LowPass<order> f;
由以下setup命令用作默認順序,但如果需要,可以被較低順序覆蓋。
setup所有過濾器均以低通,高通,帶通和帶擋/凹槽過濾器的形式使用。 Butterworth/Chebyshev還提供具有指定的Pastband增益和0DB增益的低/高/帶扣。
這些頻率可以是模擬速率的模擬率,也可以是0..1/2之間的歸一化率,其中1/2是奈奎斯特頻率。請注意,歸一化頻率僅為F = f/fs,並且以1/樣本為單位。在內部,庫使用歸一化頻率,如果給出了設置命令,則簡單地除以採樣率。選擇:
setup :採樣率和模擬截止頻率setupN :f = 0..1/2之間的1/樣品中的歸一化頻率其中1/2 = nyquist。默認情況下, setup使用模板參數提供的順序,但可以被較低的過濾器訂單覆蓋。
請參閱iir中的標題文件或有關setup命令參數的文檔。
下面的示例是低通濾波器:
Butterworth.h標準過濾器適用於大多數應用。單調響應。 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 Ripple在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第二訂單過濾器具有截止和Q因子。 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也將引發異常。
您可以通過CMAKE或您的程序中定義IIR1_NO_EXCEPTIONS來關閉Exection處理。
如果您使用cmake作為構建系統,則只需添加到您的CMakeLists.txt中的Dynamic Library以下幾行:
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它可用於64位Intel和32,64位臂(Raspberry Pi等)。開發程序包和示例程序的文檔在:
/usr/share/doc/iir1-dev/
構建工具是cmake ,它為不同平台生成製作或項目文件。 cmake可用於Linux,Windows和Mac。它還直接在覆盆子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位構建。然後開始視覺C ++並打開解決方案。這將創建DLL和LIB文件。在Windows下,強烈建議使用靜態庫並將其鏈接到應用程序程序。
通過鍵入make test或僅僅是ctest來運行單元測試。這些測試如果在三角洲脈衝後所有過濾器放鬆到零,則它們的輸出永遠不會變成NAN,並且直接形式I和II過濾器通過通過Scipy sosfilt的輸出所產生的結果進行比較來計算預期序列。
您可以通過將IIR1_BUILD_TESTING設置為OFF來禁用測試的生成。
最簡單的學習方法是從demo目錄中的示例中。 Delta脈衝作為測試信號發送到不同的過濾器中並保存在文件中。使用Python腳本plot_impulse_fresponse.py ,您可以繪製頻率響應。
您可以通過將IIR1_BUILD_DEMO設置為OFF來禁用演示的彙編。
此外,包含單元測試的目錄還提供了每種過濾器類型的示例。
所有類,方法和特別setup功能的PDF都在docs/pdf目錄中。
在線文檔在這裡:http://berndporr.github.io/iir1
這些響應是由iirdemo.cpp在/demo/ Directory中生成的,然後用plot_impulse_fresponse.py繪製。







該圖書館是從Vinnie Falco的出色原始作品中進一步開發的,可以在這裡找到:
https://github.com/vinniefalco/dspfilters
雖然原始庫處理音頻陣列,但該庫已改編成通過示例進行快速的實時處理示例。 setup命令不需要過濾順序,而是從模板參數中記住它。類結構已簡化,並記錄了Doxygen的所有功能。如果參數是錯誤的,則不用讓essert()語句拋出異常。任何需要優化的過濾器設計(例如橢圓濾波器)已被刪除,而添加了一個函數,可以輕鬆從Scipy導入係數。
Bernd Porr -http://www.berndporr.me.uk