CQエレクトロニクス・セミナで使用するファンクション・ジェネレータの プログラム
Dependencies: Array_Matrix mbed SerialTxRxIntr MyTicker7
Diff: IIR_Filter/IirCascade.hpp
- Revision:
- 0:8c8bc21159d9
diff -r 000000000000 -r 8c8bc21159d9 IIR_Filter/IirCascade.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/IIR_Filter/IirCascade.hpp Fri Feb 25 02:36:55 2022 +0000 @@ -0,0 +1,57 @@ +//--------------------------------------------------- +// 縦続形 IIR フィルタ +// +// 2020/11/04, Copyright (c) 2020 MIKAMI, Naoki +//--------------------------------------------------- + +#include "Biquad.hpp" +#include "Array.hpp" // Array クラスが定義されている +using namespace Mikami; + +#ifndef IIR_CASCADE_HPP +#define IIR_CASCADE_HPP + +class IirCascade +{ +public: + // コンストラクタ + IirCascade(int order, const Biquad::Coefs ck[], float g0) + : order_(order), hn_((order+1)/2) + { SetCoefs(order, ck, g0); } + + // コンストラクタ + IirCascade(int order, const Biquad hk[], float g0) + : order_(order), hn_((order+1)/2, hk), g0_(g0) {} + + virtual ~IirCascade() {} + + // フィルタ処理を実行する + 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_; // 利得定数 +}; +#endif // IIR_CASCADE_HPP