CQエレクトロニクス・セミナで使用する遮断周波数可変の LPF/HPF のプログラム

Dependencies:   mbed SerialTxRxIntr DSP_MultirateLinearphase

Revision:
0:f1e2a221b526
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IirVariable/IIR_Cascade.hpp	Fri Feb 25 02:26:41 2022 +0000
@@ -0,0 +1,56 @@
+//---------------------------------------------------
+//  縦続形 IIR フィルタ
+//
+//  2022/02/19, Copyright (c) 2022 MIKAMI, Naoki
+//---------------------------------------------------
+
+#ifndef IIR_CASCADE_HPP
+#define IIR_CASCADE_HPP
+
+#include "Biquad.hpp"
+#include "Array.hpp"    // Array クラスが定義されている
+
+namespace Mikami
+{
+    class IirCascade
+    {
+    public:
+        // コンストラクタ
+        IirCascade(int order = 0, const Biquad hk[] = NULL, float g0 = 1)
+            : order_(order), hn_((order+1)/2, hk), g0_(g0) {}
+
+        // フィルタ処理を実行する
+        float Execute(float xn)
+        {
+            float yn = g0_*xn;
+            for (int k=0; k<(order_+1)/2; k++) yn = hn_[k].Execute(yn);
+            return yn;
+        }
+
+        // 係数の設定
+        void SetCoefs(int order, const Biquad::Coefs ck[], float g0)
+        {
+            if (order_ != order)
+            {
+                order_ = order;
+                hn_.SetSize((order+1)/2);
+            }
+            g0_ = g0;
+            for (int k=0; k<(order+1)/2; k++) hn_[k].SetCoefs(ck[k]);
+        }
+
+        // 内部変数(遅延器)のクリア
+        void Clear()
+        {   for (int k=0; k<(order_+1)/2; k++) hn_[k].Clear(); }
+
+    private:
+        int order_;         // 次数
+        Array<Biquad> hn_;  // Biquad クラスのオブジェクトの配列
+        float g0_;          // 利得定数
+
+        // コピー・コンストラクタ,代入演算子禁止禁止のため
+        IirCascade(const IirCascade&);
+        IirCascade& operator=(const IirCascade&);
+    };
+}
+#endif  // IIR_CASCADE_HPP