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

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