Audio singal input and output example for DISCO-F746. Input: MEMS mic, Output: CN10 OUT, Acoustic effect: echo and frequency shift. DISCO-F746 によるオーディオ信号入出力.入力:MEMS マイク,出力:CN10 OUT,音響効果:エコー,周波数変換.
Dependencies: F746_GUI F746_SAI_IO
Diff: MyAcousticEffector_MIC/IIR_Cascade.hpp
- Revision:
- 10:56f2f01df983
- Parent:
- 5:7de034938856
--- a/MyAcousticEffector_MIC/IIR_Cascade.hpp Fri Mar 17 01:26:25 2017 +0000 +++ b/MyAcousticEffector_MIC/IIR_Cascade.hpp Mon Apr 10 13:44:13 2017 +0000 @@ -1,49 +1,59 @@ //------------------------------------------------------------------------------ // 縦続形 IIR フィルタのクラス // -// 2016/04/12, Copyright (c) 2016 MIKAMI, Naoki +// 2017/04/07, Copyright (c) 2017 MIKAMI, Naoki //------------------------------------------------------------------------------ #ifndef IIR_CASCADE_HPP #define IIR_CASCADE_HPP #include "Biquad.hpp" +#include "Array.hpp" namespace Mikami { - template<int order> class IIR_Cascade + class IIR_Cascade { public: // コンストラクタ - IIR_Cascade(const Biquad::Coefs ck[], float g0) : g0_(g0) + IIR_Cascade(int order, const Biquad::Coefs ck[], float g0) + : ORDER2_(order/2), G0_(g0), hk_(ORDER2_) { + if ((order % 2) != 0) + { + fprintf(stderr, "\r\nOrder is not even number.\r\n"); + while (true) {} + } for (int n=0; n<order/2; n++) hk_[n] = Biquad(ck[n]); Clear(); } - + // デストラクタ - ~IIR_Cascade() - { - for (int n=0; n<order/2; n++) delete hk_[n]; - } - - // 過去の計算結果を格納する配列のクリア + ~IIR_Cascade() {} + + // 過去の計算結果を格納する遅延器のクリア void Clear() { - for (int k=0; k<order/2; k++) hk_[k].Clear(); + for (int k=0; k<ORDER2_; k++) hk_[k].Clear(); } // フィルタ処理の実行 float Execute(float xn) { - float yn = g0_*xn; - for (int k=0; k<order/2; k++) yn = hk_[k].Execute(yn); + float yn = G0_*xn; + for (int k=0; k<ORDER2_; k++) yn = hk_[k].Execute(yn); return yn; } private: - Biquad hk_[order/2]; // 2 次の IIR フィルタ - const float g0_; // 利得定数 + const int ORDER2_; // 次数/2 + const float G0_; // 利得定数 + + Array<Biquad> hk_; // 2 次の IIR フィルタのオブジェクトの配列 + + // disallow copy constructor and assignment operator + IIR_Cascade(const IIR_Cascade&); + IIR_Cascade& operator=(const IIR_Cascade&); }; } #endif // IIR_CASCADE_HPP