IIR Cascade
Dependencies: DSP_MultirateLinearphase mbed
Revision 0:fd55988037cc, committed 2022-09-13
- Comitter:
- CQpub0Mikami
- Date:
- Tue Sep 13 07:48:33 2022 +0000
- Commit message:
- 1
Changed in this revision
diff -r 000000000000 -r fd55988037cc Biquad.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Biquad.hpp Tue Sep 13 07:48:33 2022 +0000 @@ -0,0 +1,40 @@ +//-------------------------------------------------------------- +// 縦続形 IIR フィルタの構成要素として使う 2 次の IIR フィルタ +// b0 は 1 と仮定している +// +// 2022/01/18, Copyright (c) 2022 MIKAMI, Naoki +//-------------------------------------------------------------- + +#include "mbed.h" + +#ifndef IIR_BIQUAD_HPP +#define IIR_BIQUAD_HPP + +class Biquad +{ +public: + // フィルタの係数に対応する構造体 + struct Coefs { float a1, a2, b1, b2; }; + + // コンストラクタ + Biquad(const Coefs ck = (Coefs){0, 0, 0, 0}) + : a1_(ck.a1), a2_(ck.a2), b1_(ck.b1), b2_(ck.b2), + vn1_(0), vn2_(0) {} + + // 2 次のフィルタを実行する + float Execute(float xn) + { + float vn = xn + a1_*vn1_ + a2_*vn2_; + float yn = vn + b1_*vn1_ + b2_*vn2_; + + vn2_ = vn1_; + vn1_ = vn; + + return yn; + } + +private: + float a1_, a2_, b1_, b2_; // フィルタの係数 + float vn1_, vn2_; // 遅延器 +}; +#endif // IIR_BIQUAD_HPP \ No newline at end of file
diff -r 000000000000 -r fd55988037cc Coefs_IIR6_Cascade_LP_300.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Coefs_IIR6_Cascade_LP_300.hpp Tue Sep 13 07:48:33 2022 +0000 @@ -0,0 +1,23 @@ +//----------------------------------------------------- +// 縦続形 IIR フィルタの次数と係数の定義 +// 係数は float 型 +// 2022/01/19, Copyright (c) 2022 MIKAMI, Naoki +//----------------------------------------------------- + +#include "Biquad.hpp" + +// 低域通過フィルタ +// 連立チェビシェフ特性 +// 次数 : 6 次 +// 標本化周波数: 10.00 kHz +// 遮断周波数 : 0.30 kHz +// 通過域のリップル: 0.50 dB +// 阻止域の減衰量 :40.00 dB +const int ORDER_ = 6; // 次数 +const float G0_ = 9.900438E-03f; // 利得定数 + +// Biquad クラスの構造体 Coefs の配列で定義 +const Biquad::Coefs CK_[] = { + { 1.854098E+00f, -8.646499E-01f, -1.672938E+00f, 1.0f}, // 1段目 + { 1.916727E+00f, -9.442058E-01f, -1.934754E+00f, 1.0f}, // 2段目 + { 1.952184E+00f, -9.878896E-01f, -1.953737E+00f, 1.0f}}; // 3段目 \ No newline at end of file
diff -r 000000000000 -r fd55988037cc DSP_MultirateLinearphase.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DSP_MultirateLinearphase.lib Tue Sep 13 07:48:33 2022 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/MikamiUitOpen/code/DSP_MultirateLinearphase/#f7bfe38c93ab
diff -r 000000000000 -r fd55988037cc IirCascade.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/IirCascade.hpp Tue Sep 13 07:48:33 2022 +0000 @@ -0,0 +1,37 @@ +//--------------------------------------------------- +// 縦続形 IIR フィルタ +// +// 2022/01/18, Copyright (c) 2022 MIKAMI, Naoki +//--------------------------------------------------- + +#include "Biquad.hpp" +#include "Array.hpp" // Array クラスが定義されている +using Mikami::Array; + +#ifndef IIR_CASCADE_HPP +#define IIR_CASCADE_HPP + +class IirCascade +{ +public: + // コンストラクタ + IirCascade(int order, const Biquad::Coefs ck[], float g0) + : ORDER_(order), G0_(g0), hn_((order+1)/2) + { + for (int k=0; k<(order+1)/2; k++) hn_[k] = Biquad(ck[k]); + } + + // フィルタ処理を実行する + float Execute(float xn) + { + float yn = G0_*xn; + for (int k=0; k<(ORDER_+1)/2; k++) yn = hn_[k].Execute(yn); + return yn; + } + +private: + const int ORDER_; // 次数 + const float G0_; // 利得定数 + Array<Biquad> hn_; // Biquad クラスのオブジェクトの配列 +}; +#endif // IIR_CASCADE_HPP \ No newline at end of file
diff -r 000000000000 -r fd55988037cc main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Sep 13 07:48:33 2022 +0000 @@ -0,0 +1,31 @@ +//---------------------------------------------------------------------- +// 縦続形II IIR フィルタ,float 型を使用 +// +// 2022/01/19, Copyright (c) 2022 MIKAMI, Naoki +//---------------------------------------------------------------------- + +#include "MultirateLiPh.hpp" +#include "IirCascade.hpp" +#include "Coefs_IIR6_Cascade_LP_300.hpp" +#pragma diag_suppress 870 // マルチバイト文字使用の警告抑制のため +using namespace Mikami; + +const float FS_ = 10.0f; // 入力の標本化周波数: 10 kHz +MultirateLiPh myAdDa_(FS_); // 出力標本化周波数を4倍にするオブジェクト +IirCascade df_(ORDER_, CK_, G0_); + +// ADC 変換終了割込みに対する割込みサービス・ルーチン +void AdcIsr() +{ + float xn = myAdDa_.Input(); // 入力 + float yn = df_.Execute(xn); // 縦続形 IIR フィルタの処理 + myAdDa_.Output(yn); // 出力 +} + +int main() +{ + printf("\r\n縦続形 IIR フィルタを実行します\r\n"); + + myAdDa_.Start(&AdcIsr); // 標本化を開始する + while (true) {} +} \ No newline at end of file
diff -r 000000000000 -r fd55988037cc mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Tue Sep 13 07:48:33 2022 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400 \ No newline at end of file