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

Committer:
MikamiUitOpen
Date:
Mon Apr 10 13:44:13 2017 +0000
Revision:
10:56f2f01df983
Parent:
5:7de034938856
11

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:f064b50f238e 1 //------------------------------------------------------------------------------
MikamiUitOpen 0:f064b50f238e 2 // 縦続形 IIR フィルタのクラス
MikamiUitOpen 0:f064b50f238e 3 //
MikamiUitOpen 10:56f2f01df983 4 // 2017/04/07, Copyright (c) 2017 MIKAMI, Naoki
MikamiUitOpen 0:f064b50f238e 5 //------------------------------------------------------------------------------
MikamiUitOpen 0:f064b50f238e 6
MikamiUitOpen 0:f064b50f238e 7 #ifndef IIR_CASCADE_HPP
MikamiUitOpen 0:f064b50f238e 8 #define IIR_CASCADE_HPP
MikamiUitOpen 0:f064b50f238e 9
MikamiUitOpen 0:f064b50f238e 10 #include "Biquad.hpp"
MikamiUitOpen 10:56f2f01df983 11 #include "Array.hpp"
MikamiUitOpen 0:f064b50f238e 12
MikamiUitOpen 0:f064b50f238e 13 namespace Mikami
MikamiUitOpen 0:f064b50f238e 14 {
MikamiUitOpen 10:56f2f01df983 15 class IIR_Cascade
MikamiUitOpen 0:f064b50f238e 16 {
MikamiUitOpen 0:f064b50f238e 17 public:
MikamiUitOpen 0:f064b50f238e 18 // コンストラクタ
MikamiUitOpen 10:56f2f01df983 19 IIR_Cascade(int order, const Biquad::Coefs ck[], float g0)
MikamiUitOpen 10:56f2f01df983 20 : ORDER2_(order/2), G0_(g0), hk_(ORDER2_)
MikamiUitOpen 0:f064b50f238e 21 {
MikamiUitOpen 10:56f2f01df983 22 if ((order % 2) != 0)
MikamiUitOpen 10:56f2f01df983 23 {
MikamiUitOpen 10:56f2f01df983 24 fprintf(stderr, "\r\nOrder is not even number.\r\n");
MikamiUitOpen 10:56f2f01df983 25 while (true) {}
MikamiUitOpen 10:56f2f01df983 26 }
MikamiUitOpen 0:f064b50f238e 27 for (int n=0; n<order/2; n++) hk_[n] = Biquad(ck[n]);
MikamiUitOpen 0:f064b50f238e 28 Clear();
MikamiUitOpen 0:f064b50f238e 29 }
MikamiUitOpen 10:56f2f01df983 30
MikamiUitOpen 0:f064b50f238e 31 // デストラクタ
MikamiUitOpen 10:56f2f01df983 32 ~IIR_Cascade() {}
MikamiUitOpen 10:56f2f01df983 33
MikamiUitOpen 10:56f2f01df983 34 // 過去の計算結果を格納する遅延器のクリア
MikamiUitOpen 0:f064b50f238e 35 void Clear()
MikamiUitOpen 0:f064b50f238e 36 {
MikamiUitOpen 10:56f2f01df983 37 for (int k=0; k<ORDER2_; k++) hk_[k].Clear();
MikamiUitOpen 0:f064b50f238e 38 }
MikamiUitOpen 0:f064b50f238e 39
MikamiUitOpen 0:f064b50f238e 40 // フィルタ処理の実行
MikamiUitOpen 0:f064b50f238e 41 float Execute(float xn)
MikamiUitOpen 0:f064b50f238e 42 {
MikamiUitOpen 10:56f2f01df983 43 float yn = G0_*xn;
MikamiUitOpen 10:56f2f01df983 44 for (int k=0; k<ORDER2_; k++) yn = hk_[k].Execute(yn);
MikamiUitOpen 0:f064b50f238e 45 return yn;
MikamiUitOpen 0:f064b50f238e 46 }
MikamiUitOpen 0:f064b50f238e 47
MikamiUitOpen 0:f064b50f238e 48 private:
MikamiUitOpen 10:56f2f01df983 49 const int ORDER2_; // 次数/2
MikamiUitOpen 10:56f2f01df983 50 const float G0_; // 利得定数
MikamiUitOpen 10:56f2f01df983 51
MikamiUitOpen 10:56f2f01df983 52 Array<Biquad> hk_; // 2 次の IIR フィルタのオブジェクトの配列
MikamiUitOpen 10:56f2f01df983 53
MikamiUitOpen 10:56f2f01df983 54 // disallow copy constructor and assignment operator
MikamiUitOpen 10:56f2f01df983 55 IIR_Cascade(const IIR_Cascade&);
MikamiUitOpen 10:56f2f01df983 56 IIR_Cascade& operator=(const IIR_Cascade&);
MikamiUitOpen 0:f064b50f238e 57 };
MikamiUitOpen 0:f064b50f238e 58 }
MikamiUitOpen 0:f064b50f238e 59 #endif // IIR_CASCADE_HPP