IIR Cascade

Dependencies:   DSP_MultirateLinearphase mbed

Files at this revision

API Documentation at this revision

Comitter:
CQpub0Mikami
Date:
Tue Sep 13 07:48:33 2022 +0000
Commit message:
1

Changed in this revision

Biquad.hpp Show annotated file Show diff for this revision Revisions of this file
Coefs_IIR6_Cascade_LP_300.hpp Show annotated file Show diff for this revision Revisions of this file
DSP_MultirateLinearphase.lib Show annotated file Show diff for this revision Revisions of this file
IirCascade.hpp Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /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
--- /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
--- /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
--- /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
--- /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
--- /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