CQエレクトロニクス・セミナ「実習・マイコンを動かしながら学ぶディジタル・フィルタ」で使う適応線スペクトル強調器(ALE)のプログラム.ステップサイズパラメータをターミナルから変更できる. http://seminar.cqpub.co.jp/ccm/ES18-0020
Dependencies: F746_GUI F746_SAI_IO mbed
Diff: Filter/ALE_Variable.hpp
- Revision:
- 0:c8e52f514e03
- Child:
- 2:ef391be185f5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Filter/ALE_Variable.hpp Fri Mar 02 06:43:33 2018 +0000 @@ -0,0 +1,53 @@ +//--------------------------------------------------- +// 適応線スペクトル強調器(ALE): μ可変 +// +// 2018/03/01, Copyright (c) 2018 MIKAMI, Naoki +//--------------------------------------------------- + +#ifndef IIR_1ST_VARIABLE_HPP +#define IIR_1ST_VARIABLE_HPP + +#include "Array.hpp" + +class AleVariable +{ +public: + // コンストラクタ + AleVariable(int delay, int order, float mu) + : xm_(delay, 0.0f), xk_(order+1, 0.0f), hk_(order+1, 0.0f), + delay_(delay), order_(order), mu_(mu) {} + + // ALE を実行する + int16_t Execute(int16_t xn) + { + xm_[0] = xn; // 遅延器の初段に入力信号を格納 + for (int k=order_-1; k>=0; k--) // フィルタ内の信号のシフト + xk_[k+1] = xk_[k]; + xk_[0] = xm_[delay_-1]; // フィルタの初段に遅延器の最終段の信号を格納 + for (int k=delay_-2; k>=0; k--) // 遅延器内の信号のシフト + xm_[k+1] = xm_[k]; + + // FIRフィルタの計算 + float yn = 0.0f; + for (int k=0; k<=order_; k++) yn = yn + hk_[k]*xk_[k]; + + // 係数の更新 + float errMu = (xn - yn)*mu_; // 誤差信号×μ の計算 + for (int k=0; k<=order_; k++) hk_[k] = hk_[k] + errMu*xk_[k]; + + return (int16_t)yn; + } + + // μ の設定 + void SetMu(float mu) { mu_ = mu; } + +private: + Array<float> xm_; // 相関除去のための遅延器 + Array<float> xk_; // FIR フィルタの遅延器 + Array<float> hk_; // FIR フィルタの係数 + + int delay_; // 相関除去のための遅延器数 + int order_; // FIR フィルタの次数 + float mu_; // ステップサイズパラメータ +}; +#endif // IIR_1ST_VARIABLE_HPP