ファンクション・ジェネレータ このプログラムの説明は,CQ出版社「トランジスタ技術」の2021年10月号から開始された連載記事「STM32マイコンではじめるPC計測」の中にあります.このプログラムといっしょに使うPC側のプログラムについても同誌を参照してください.
Dependencies: Array_Matrix mbed SerialTxRxIntr MyTicker7
IIR_Filter/IirCascade.hpp@1:0430f1ed6c2c, 2021-10-06 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Wed Oct 06 12:20:04 2021 +0000
- Revision:
- 1:0430f1ed6c2c
- Parent:
- 0:53c0fa8a9aa2
2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:53c0fa8a9aa2 | 1 | //--------------------------------------------------- |
MikamiUitOpen | 0:53c0fa8a9aa2 | 2 | // 縦続形 IIR フィルタ |
MikamiUitOpen | 0:53c0fa8a9aa2 | 3 | // |
MikamiUitOpen | 0:53c0fa8a9aa2 | 4 | // 2020/11/04, Copyright (c) 2020 MIKAMI, Naoki |
MikamiUitOpen | 0:53c0fa8a9aa2 | 5 | //--------------------------------------------------- |
MikamiUitOpen | 0:53c0fa8a9aa2 | 6 | |
MikamiUitOpen | 0:53c0fa8a9aa2 | 7 | #include "Biquad.hpp" |
MikamiUitOpen | 0:53c0fa8a9aa2 | 8 | #include "Array.hpp" // Array クラスが定義されている |
MikamiUitOpen | 0:53c0fa8a9aa2 | 9 | using namespace Mikami; |
MikamiUitOpen | 0:53c0fa8a9aa2 | 10 | |
MikamiUitOpen | 0:53c0fa8a9aa2 | 11 | #ifndef IIR_CASCADE_HPP |
MikamiUitOpen | 0:53c0fa8a9aa2 | 12 | #define IIR_CASCADE_HPP |
MikamiUitOpen | 0:53c0fa8a9aa2 | 13 | |
MikamiUitOpen | 0:53c0fa8a9aa2 | 14 | class IirCascade |
MikamiUitOpen | 0:53c0fa8a9aa2 | 15 | { |
MikamiUitOpen | 0:53c0fa8a9aa2 | 16 | public: |
MikamiUitOpen | 0:53c0fa8a9aa2 | 17 | // コンストラクタ |
MikamiUitOpen | 0:53c0fa8a9aa2 | 18 | IirCascade(int order, const Biquad::Coefs ck[], float g0) |
MikamiUitOpen | 0:53c0fa8a9aa2 | 19 | : order_(order), hn_((order+1)/2) |
MikamiUitOpen | 0:53c0fa8a9aa2 | 20 | { SetCoefs(order, ck, g0); } |
MikamiUitOpen | 0:53c0fa8a9aa2 | 21 | |
MikamiUitOpen | 0:53c0fa8a9aa2 | 22 | // コンストラクタ |
MikamiUitOpen | 0:53c0fa8a9aa2 | 23 | IirCascade(int order, const Biquad hk[], float g0) |
MikamiUitOpen | 0:53c0fa8a9aa2 | 24 | : order_(order), hn_((order+1)/2, hk), g0_(g0) {} |
MikamiUitOpen | 0:53c0fa8a9aa2 | 25 | |
MikamiUitOpen | 0:53c0fa8a9aa2 | 26 | virtual ~IirCascade() {} |
MikamiUitOpen | 0:53c0fa8a9aa2 | 27 | |
MikamiUitOpen | 0:53c0fa8a9aa2 | 28 | // フィルタ処理を実行する |
MikamiUitOpen | 0:53c0fa8a9aa2 | 29 | float Execute(float xn) |
MikamiUitOpen | 0:53c0fa8a9aa2 | 30 | { |
MikamiUitOpen | 0:53c0fa8a9aa2 | 31 | float yn = g0_*xn; |
MikamiUitOpen | 0:53c0fa8a9aa2 | 32 | for (int k=0; k<(order_+1)/2; k++) yn = hn_[k].Execute(yn); |
MikamiUitOpen | 0:53c0fa8a9aa2 | 33 | return yn; |
MikamiUitOpen | 0:53c0fa8a9aa2 | 34 | } |
MikamiUitOpen | 0:53c0fa8a9aa2 | 35 | |
MikamiUitOpen | 0:53c0fa8a9aa2 | 36 | // 係数の設定 |
MikamiUitOpen | 0:53c0fa8a9aa2 | 37 | void SetCoefs(int order, const Biquad::Coefs ck[], float g0) |
MikamiUitOpen | 0:53c0fa8a9aa2 | 38 | { |
MikamiUitOpen | 0:53c0fa8a9aa2 | 39 | if (order_ != order) |
MikamiUitOpen | 0:53c0fa8a9aa2 | 40 | { |
MikamiUitOpen | 0:53c0fa8a9aa2 | 41 | order_ = order; |
MikamiUitOpen | 0:53c0fa8a9aa2 | 42 | hn_.SetSize((order+1)/2); |
MikamiUitOpen | 0:53c0fa8a9aa2 | 43 | } |
MikamiUitOpen | 0:53c0fa8a9aa2 | 44 | g0_ = g0; |
MikamiUitOpen | 0:53c0fa8a9aa2 | 45 | for (int k=0; k<(order+1)/2; k++) hn_[k].SetCoefs(ck[k]); |
MikamiUitOpen | 0:53c0fa8a9aa2 | 46 | } |
MikamiUitOpen | 0:53c0fa8a9aa2 | 47 | |
MikamiUitOpen | 0:53c0fa8a9aa2 | 48 | // 内部変数(遅延器)のクリア |
MikamiUitOpen | 0:53c0fa8a9aa2 | 49 | void Clear() |
MikamiUitOpen | 0:53c0fa8a9aa2 | 50 | { for (int k=0; k<(order_+1)/2; k++) hn_[k].Clear(); } |
MikamiUitOpen | 0:53c0fa8a9aa2 | 51 | |
MikamiUitOpen | 0:53c0fa8a9aa2 | 52 | private: |
MikamiUitOpen | 0:53c0fa8a9aa2 | 53 | int order_; // 次数 |
MikamiUitOpen | 0:53c0fa8a9aa2 | 54 | Array<Biquad> hn_; // Biquad クラスのオブジェクトの配列 |
MikamiUitOpen | 0:53c0fa8a9aa2 | 55 | float g0_; // 利得定数 |
MikamiUitOpen | 0:53c0fa8a9aa2 | 56 | }; |
MikamiUitOpen | 0:53c0fa8a9aa2 | 57 | #endif // IIR_CASCADE_HPP |