CQエレクトロニクス・セミナ「実習・マイコンを動かしながら学ぶディジタル・フィルタ」で使う適応線スペクトル強調器(ALE)のプログラム.ステップサイズパラメータをターミナルから変更できる. http://seminar.cqpub.co.jp/ccm/ES18-0020
Dependencies: F746_GUI F746_SAI_IO mbed
Filter/ALE_Variable.hpp@4:bde47691ec93, 2018-09-04 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Tue Sep 04 05:52:44 2018 +0000
- Revision:
- 4:bde47691ec93
- Parent:
- 2:ef391be185f5
5
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:c8e52f514e03 | 1 | //--------------------------------------------------- |
MikamiUitOpen | 0:c8e52f514e03 | 2 | // 適応線スペクトル強調器(ALE): μ可変 |
MikamiUitOpen | 0:c8e52f514e03 | 3 | // |
MikamiUitOpen | 2:ef391be185f5 | 4 | // 2018/03/20, Copyright (c) 2018 MIKAMI, Naoki |
MikamiUitOpen | 0:c8e52f514e03 | 5 | //--------------------------------------------------- |
MikamiUitOpen | 0:c8e52f514e03 | 6 | |
MikamiUitOpen | 0:c8e52f514e03 | 7 | #ifndef IIR_1ST_VARIABLE_HPP |
MikamiUitOpen | 0:c8e52f514e03 | 8 | #define IIR_1ST_VARIABLE_HPP |
MikamiUitOpen | 0:c8e52f514e03 | 9 | |
MikamiUitOpen | 0:c8e52f514e03 | 10 | #include "Array.hpp" |
MikamiUitOpen | 0:c8e52f514e03 | 11 | |
MikamiUitOpen | 0:c8e52f514e03 | 12 | class AleVariable |
MikamiUitOpen | 0:c8e52f514e03 | 13 | { |
MikamiUitOpen | 0:c8e52f514e03 | 14 | public: |
MikamiUitOpen | 0:c8e52f514e03 | 15 | // コンストラクタ |
MikamiUitOpen | 0:c8e52f514e03 | 16 | AleVariable(int delay, int order, float mu) |
MikamiUitOpen | 0:c8e52f514e03 | 17 | : xm_(delay, 0.0f), xk_(order+1, 0.0f), hk_(order+1, 0.0f), |
MikamiUitOpen | 0:c8e52f514e03 | 18 | delay_(delay), order_(order), mu_(mu) {} |
MikamiUitOpen | 0:c8e52f514e03 | 19 | |
MikamiUitOpen | 0:c8e52f514e03 | 20 | // ALE を実行する |
MikamiUitOpen | 0:c8e52f514e03 | 21 | int16_t Execute(int16_t xn) |
MikamiUitOpen | 0:c8e52f514e03 | 22 | { |
MikamiUitOpen | 0:c8e52f514e03 | 23 | // FIRフィルタの計算 |
MikamiUitOpen | 0:c8e52f514e03 | 24 | float yn = 0.0f; |
MikamiUitOpen | 0:c8e52f514e03 | 25 | for (int k=0; k<=order_; k++) yn = yn + hk_[k]*xk_[k]; |
MikamiUitOpen | 0:c8e52f514e03 | 26 | |
MikamiUitOpen | 0:c8e52f514e03 | 27 | // 係数の更新 |
MikamiUitOpen | 0:c8e52f514e03 | 28 | float errMu = (xn - yn)*mu_; // 誤差信号×μ の計算 |
MikamiUitOpen | 0:c8e52f514e03 | 29 | for (int k=0; k<=order_; k++) hk_[k] = hk_[k] + errMu*xk_[k]; |
MikamiUitOpen | 0:c8e52f514e03 | 30 | |
MikamiUitOpen | 2:ef391be185f5 | 31 | for (int k=order_-1; k>=0; k--) // フィルタ内の信号のシフト |
MikamiUitOpen | 2:ef391be185f5 | 32 | xk_[k+1] = xk_[k]; |
MikamiUitOpen | 2:ef391be185f5 | 33 | xk_[0] = xm_[delay_-1]; // フィルタの初段に遅延器の最終段の信号を格納 |
MikamiUitOpen | 2:ef391be185f5 | 34 | for (int k=delay_-2; k>=0; k--) // 遅延器内の信号のシフト |
MikamiUitOpen | 2:ef391be185f5 | 35 | xm_[k+1] = xm_[k]; |
MikamiUitOpen | 2:ef391be185f5 | 36 | xm_[0] = xn; // 遅延器の初段に入力信号を格納 |
MikamiUitOpen | 2:ef391be185f5 | 37 | |
MikamiUitOpen | 0:c8e52f514e03 | 38 | return (int16_t)yn; |
MikamiUitOpen | 0:c8e52f514e03 | 39 | } |
MikamiUitOpen | 0:c8e52f514e03 | 40 | |
MikamiUitOpen | 0:c8e52f514e03 | 41 | // μ の設定 |
MikamiUitOpen | 0:c8e52f514e03 | 42 | void SetMu(float mu) { mu_ = mu; } |
MikamiUitOpen | 0:c8e52f514e03 | 43 | |
MikamiUitOpen | 0:c8e52f514e03 | 44 | private: |
MikamiUitOpen | 0:c8e52f514e03 | 45 | Array<float> xm_; // 相関除去のための遅延器 |
MikamiUitOpen | 0:c8e52f514e03 | 46 | Array<float> xk_; // FIR フィルタの遅延器 |
MikamiUitOpen | 0:c8e52f514e03 | 47 | Array<float> hk_; // FIR フィルタの係数 |
MikamiUitOpen | 0:c8e52f514e03 | 48 | |
MikamiUitOpen | 0:c8e52f514e03 | 49 | int delay_; // 相関除去のための遅延器数 |
MikamiUitOpen | 0:c8e52f514e03 | 50 | int order_; // FIR フィルタの次数 |
MikamiUitOpen | 0:c8e52f514e03 | 51 | float mu_; // ステップサイズパラメータ |
MikamiUitOpen | 0:c8e52f514e03 | 52 | }; |
MikamiUitOpen | 0:c8e52f514e03 | 53 | #endif // IIR_1ST_VARIABLE_HPP |