CQエレクトロニクス・セミナ「実習・マイコンを動かしながら学ぶディジタル・フィルタ」で使う適応線スペクトル強調器(ALE)のプログラム.ステップサイズパラメータをターミナルから変更できる. http://seminar.cqpub.co.jp/ccm/ES18-0020

Dependencies:   F746_GUI F746_SAI_IO mbed

Committer:
MikamiUitOpen
Date:
Fri Mar 02 06:43:33 2018 +0000
Revision:
0:c8e52f514e03
Child:
2:ef391be185f5
1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:c8e52f514e03 1 //---------------------------------------------------
MikamiUitOpen 0:c8e52f514e03 2 // 適応線スペクトル強調器(ALE): μ可変
MikamiUitOpen 0:c8e52f514e03 3 //
MikamiUitOpen 0:c8e52f514e03 4 // 2018/03/01, 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 xm_[0] = xn; // 遅延器の初段に入力信号を格納
MikamiUitOpen 0:c8e52f514e03 24 for (int k=order_-1; k>=0; k--) // フィルタ内の信号のシフト
MikamiUitOpen 0:c8e52f514e03 25 xk_[k+1] = xk_[k];
MikamiUitOpen 0:c8e52f514e03 26 xk_[0] = xm_[delay_-1]; // フィルタの初段に遅延器の最終段の信号を格納
MikamiUitOpen 0:c8e52f514e03 27 for (int k=delay_-2; k>=0; k--) // 遅延器内の信号のシフト
MikamiUitOpen 0:c8e52f514e03 28 xm_[k+1] = xm_[k];
MikamiUitOpen 0:c8e52f514e03 29
MikamiUitOpen 0:c8e52f514e03 30 // FIRフィルタの計算
MikamiUitOpen 0:c8e52f514e03 31 float yn = 0.0f;
MikamiUitOpen 0:c8e52f514e03 32 for (int k=0; k<=order_; k++) yn = yn + hk_[k]*xk_[k];
MikamiUitOpen 0:c8e52f514e03 33
MikamiUitOpen 0:c8e52f514e03 34 // 係数の更新
MikamiUitOpen 0:c8e52f514e03 35 float errMu = (xn - yn)*mu_; // 誤差信号×μ の計算
MikamiUitOpen 0:c8e52f514e03 36 for (int k=0; k<=order_; k++) hk_[k] = hk_[k] + errMu*xk_[k];
MikamiUitOpen 0:c8e52f514e03 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