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

Dependencies:   mbed SerialTxRxIntr DSP_MultirateLinearphase

Committer:
MikamiUitOpen
Date:
Wed Mar 30 05:00:14 2022 +0000
Revision:
2:3955cb401851
Parent:
0:f1e2a221b526
3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:f1e2a221b526 1 //--------------------------------------------------------------
MikamiUitOpen 0:f1e2a221b526 2 // 可変 IIR フィルタのクラス
MikamiUitOpen 0:f1e2a221b526 3 //
MikamiUitOpen 0:f1e2a221b526 4 // 2022/02/21, Copyright (c) 2022 MIKAMI, Naoki
MikamiUitOpen 0:f1e2a221b526 5 //--------------------------------------------------------------
MikamiUitOpen 0:f1e2a221b526 6
MikamiUitOpen 0:f1e2a221b526 7 #include "IIR_Cascade.hpp"
MikamiUitOpen 0:f1e2a221b526 8
MikamiUitOpen 0:f1e2a221b526 9 #ifndef VARIABLE_IIR_FILTER_HPP
MikamiUitOpen 0:f1e2a221b526 10 #define VARIABLE_IIR_FILTER_HPP
MikamiUitOpen 0:f1e2a221b526 11
MikamiUitOpen 0:f1e2a221b526 12 namespace Mikami
MikamiUitOpen 0:f1e2a221b526 13 {
MikamiUitOpen 0:f1e2a221b526 14 class VariableIir
MikamiUitOpen 0:f1e2a221b526 15 {
MikamiUitOpen 0:f1e2a221b526 16 public:
MikamiUitOpen 0:f1e2a221b526 17 // コンストラクタ
MikamiUitOpen 0:f1e2a221b526 18 VariableIir() : fPtr2_(&VariableIir::Off)
MikamiUitOpen 0:f1e2a221b526 19 {
MikamiUitOpen 0:f1e2a221b526 20 SetOff(); // 最初は出力 Off
MikamiUitOpen 0:f1e2a221b526 21 Validate(); // フィルタ処理有効
MikamiUitOpen 0:f1e2a221b526 22 }
MikamiUitOpen 0:f1e2a221b526 23
MikamiUitOpen 0:f1e2a221b526 24 // IIR フィルタの実行
MikamiUitOpen 0:f1e2a221b526 25 float Execute(float xn) { return (this->*fPtr_)((this->*fPtr2_)(xn)); }
MikamiUitOpen 0:f1e2a221b526 26
MikamiUitOpen 0:f1e2a221b526 27 // IIR フィルタの係数を設定する
MikamiUitOpen 0:f1e2a221b526 28 void SetCoefficients(int order, const Biquad::Coefs ck[], float g0)
MikamiUitOpen 0:f1e2a221b526 29 { iirFilter_.SetCoefs(order, ck, g0); }
MikamiUitOpen 0:f1e2a221b526 30
MikamiUitOpen 0:f1e2a221b526 31 // フィルタの遅延器をクリア
MikamiUitOpen 0:f1e2a221b526 32 void Clear() { iirFilter_.Clear(); }
MikamiUitOpen 0:f1e2a221b526 33
MikamiUitOpen 0:f1e2a221b526 34 // IIR フィルタの処理を有効にする
MikamiUitOpen 0:f1e2a221b526 35 void Validate() { fPtr_ = &VariableIir::Filtering; }
MikamiUitOpen 0:f1e2a221b526 36
MikamiUitOpen 0:f1e2a221b526 37 // IIR フィルタの処理を無効にする
MikamiUitOpen 0:f1e2a221b526 38 void Invalidate() { fPtr_ = &VariableIir::Through; }
MikamiUitOpen 0:f1e2a221b526 39
MikamiUitOpen 0:f1e2a221b526 40 // 出力を On にする
MikamiUitOpen 0:f1e2a221b526 41 void SetOn() { fPtr2_ = &VariableIir::On; }
MikamiUitOpen 0:f1e2a221b526 42
MikamiUitOpen 0:f1e2a221b526 43 // 出力を Off にする
MikamiUitOpen 0:f1e2a221b526 44 void SetOff() { fPtr2_ = &VariableIir::Off; }
MikamiUitOpen 0:f1e2a221b526 45
MikamiUitOpen 0:f1e2a221b526 46 private:
MikamiUitOpen 0:f1e2a221b526 47 IirCascade iirFilter_;
MikamiUitOpen 0:f1e2a221b526 48
MikamiUitOpen 0:f1e2a221b526 49 float (VariableIir::*fPtr_)(float); // フィルタ処理タの有無
MikamiUitOpen 0:f1e2a221b526 50 float (VariableIir::*fPtr2_)(float); // 出力の On/Off
MikamiUitOpen 0:f1e2a221b526 51
MikamiUitOpen 0:f1e2a221b526 52 float Through(float xn) { return xn; } // そのまま出力
MikamiUitOpen 0:f1e2a221b526 53 float Filtering(float xn) // フィルタを実行して出力
MikamiUitOpen 0:f1e2a221b526 54 { return iirFilter_.Execute(xn); }
MikamiUitOpen 0:f1e2a221b526 55 float On(float xn) { return xn; } // 出力: On
MikamiUitOpen 0:f1e2a221b526 56 float Off(float xn) { return 0; } // 出力: Off
MikamiUitOpen 0:f1e2a221b526 57
MikamiUitOpen 0:f1e2a221b526 58 // コピー・コンストラクタ,代入演算子禁止禁止のため
MikamiUitOpen 0:f1e2a221b526 59 VariableIir(const VariableIir&);
MikamiUitOpen 0:f1e2a221b526 60 VariableIir& operator=(const VariableIir&);
MikamiUitOpen 0:f1e2a221b526 61 };
MikamiUitOpen 0:f1e2a221b526 62 }
MikamiUitOpen 0:f1e2a221b526 63 #endif // VARIABLE_IIR_FILTER_HPP