
Butterworth、RBJ、Chebychevフィルターを実装するLinux、Mac OSX、およびWindows用の無限のインパルス応答(IIR)フィルターライブラリで、Python(SCIPY)によって生成された係数を簡単にインポートできます。
フィルターは、リアルタイム処理のためにサンプルごとにデータサンプルを処理します。
テンプレートを使用して、必要なメモリを割り当てて、malloc / newコマンドなしで実行できるようにします。メモリはコンパイル時に割り当てられているため、メモリリークのリスクはありません。
すべてのリアルタイムフィルターコードはヘッダーファイルにあり、メインプログラムへの効率的な統合を保証し、コンパイラはフィルターコードとメインプログラムの両方を同時に最適化できます。
次のものを追加するコードにステートメントを含めます。
#include "Iir.h"
一般的なコーディングアプローチは、最初にフィルターがその順序を指定するインスタンス化され、次にパラメーターが関数setupで設定され、サンプルのリアルタイムフィルタリングでサンプルに使用できることです。
アイデアは、新しいコマンドを避けるために、コンパイル時にフィルターのメモリをテンプレート引数で割り当てることです。これにより、メモリリークが防止され、コンパイル時に最適化できます。テンプレートに提供されたorder (たとえば、ローパスフィルターの場合はこちら):
Iir::Butterworth::LowPass<order> f;
以下のsetupコマンドによってデフォルトの順序として使用されますが、必要に応じて低次でオーバーライドできます。
setupすべてのフィルターは、ローパス、ハイパス、バンドパス、バンドストップ/ノッチフィルターとして利用できます。 Butterworth/Chebyshevは、スプトップバンドに指定されたパスバンドゲインと0dBゲインを備えた低/高/バンドシェルブも提供しています。
周波数は、サンプリングレートに対してアナログのものであるか、0..1/2の間の正規化されたレートに対してアナログのものである可能性があります。1/2はナイキスト周波数です。正規化された周波数は単にf = f/fsであり、1/サンプルの単位であることに注意してください。内部的には、ライブラリは正規化された周波数を使用し、セットアップコマンドは、与えられた場合にサンプリングレートで除算するだけです。いずれかを選択してください:
setup :サンプリングレートとアナログカットオフ周波数setupN :1/2 =ナイキストf = 0..1/2の間の1つのサンプルの正規化周波数。デフォルトでは、 setupテンプレート引数によって提供される注文を使用しますが、より低いフィルター順序でオーバーライドできます。
setupコマンドの引数については、 iirのヘッダーファイルまたはドキュメントを参照してください。
以下の例は、ローパスフィルター用です。
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 、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係数を使用した2番目の注文フィルター。 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);
サンプルは1つずつ処理されます。下の例では、サンプルxがfilterコマンドで処理され、 yに保存されます。 xとyのタイプはフロートまたはダブルのいずれかです(整数も許可されますが、それでも浮動小数点として内部で処理されます):
y = f.filter(x);
これは、ループまたはイベントハンドラーのすべての着信サンプルに対して繰り返されます。
setup()に提供される無効な値は例外をスローします。 setup()に提供されるパラメーターは、係数がNANになることをもたらします。
Cmakeまたはプログラムを介してIIR1_NO_EXCEPTIONS定義することにより、Exeption Handlingをオフにすることができます。
CMAKEをビルドシステムとして使用する場合は、動的ライブラリの次の行をCMakeLists.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-dev64ビットIntelと32,64ビットアーム(Raspberry PIなど)で利用できます。開発パッケージのドキュメントとプログラムのサンプルは次のとおりです。
/usr/share/doc/iir1-dev/
ビルドツールは、さまざまなプラットフォームのメイクまたはプロジェクトファイルを生成するcmakeです。 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単なるタイピングでユニットテストを実行します。これらのテストは、すべてのフィルターがすべてゼロにリラックスした後、それらの出力がNANにならないこと、および直接フォームI&IIフィルターがScipyのsosfiltの出力によって作成された結果からそれらを比較することにより、予想シーケンスを計算する場合、そのテスト。
IIR1_BUILD_TESTINGオフに設定することにより、テストの生成を無効にできます。
最も簡単な方法は、 demoディレクトリにある例からです。テスト信号としてのデルタパルスが異なるフィルターに送信され、ファイルに保存されます。 pythonスクリプトplot_impulse_fresponse.pyを使用すると、周波数応答をプロットできます。
IIR1_BUILD_DEMOをオフにすることにより、デモの編集を無効にできます。
また、ユニットテストを含むディレクトリは、すべてのフィルタータイプの例を提供します。
すべてのクラス、メソッド、特にsetup関数のPDFはdocs/pdfディレクトリにあります。
オンラインドキュメントはこちら:http://berndporr.github.io/iir1です
これらの応答は/demo/ directoryでiirdemo.cppによって生成され、 plot_impulse_fresponse.pyでプロットされます。







このライブラリは、ここにあるVinnie Falcoの素晴らしいオリジナル作品からさらに開発されました。
https://github.com/vinniefalco/dspfilters
元のライブラリはオーディオ配列を処理しますが、このライブラリはサンプルごとに高速リアルタイム処理サンプルを実行するように適合しています。 setupコマンドはフィルター順序を必要とせず、代わりにテンプレート引数からそれを覚えています。クラス構造は簡素化されており、すべての機能がドキシゲン用に文書化されています。 assert()ステートメントを作成する代わりに、このlibaryはパラメーターが間違っている場合に例外をスローします。最適化を必要とするフィルター設計(Ellipicフィルターなど)が削除されており、代わりにScipyから簡単に係数をインポートできる関数が追加されています。
Bernd Porr -http://www.berndporr.me.uk