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/ReverbUnit.hpp	Fri Mar 17 01:26:25 2017 +0000
+++ b/MyAcousticEffector_MIC/ReverbUnit.hpp	Mon Apr 10 13:44:13 2017 +0000
@@ -1,106 +1,62 @@
 //--------------------------------------------------------------
-// Reverb unit
-//  2016/04/12, Copyright (c) 2016 MIKAMI, Naoki
+// Reverb unit: comb filter and all-pass filter
+//  2017/04/08, Copyright (c) 2017 MIKAMI, Naoki
 //--------------------------------------------------------------
 
 #ifndef REVERB_UNIT_HPP
 #define REVERB_UNIT_HPP
 
-#include "mbed.h"
+#include "ReverbUnitBase.hpp"
 
 namespace Mikami
 {
-    // Base class for reverb unit
-    class Reverb
-    {
-    public:
-        // Constructor
-        Reverb(int delay) : ptr_(0), delay_(delay)
-        {
-            un_ = new float[delay];
-            Clear();
-        }
-        
-        ~Reverb()
-        {   delete[] un_; }
-
-        // Execute of filter (pure virtual function)
-        virtual float Execute(float x) = 0;
-
-        // Clear internal delay elements
-        void Clear()
-        {   for (int n=0; n<delay_; n++) un_[n] = 0; }
-
-    protected:
-        float Get() { return un_[ptr_]; }
-        
-        float Get(int n)
-        {
-            int k = ptr_ + n;
-            if (k > delay_) k -= delay_;
-            if (k < 0) k += delay_;
-            return un_[k];
-        }        
-
-        void Set(float x)
-        {
-            un_[ptr_] = x;   
-            if (++ptr_ >=  delay_) ptr_ = 0;
-        }
-    private:
-        int ptr_;
-        int delay_;
-        float *un_;    // for delay
-        Reverb(const Reverb&);
-        Reverb& operator=(const Reverb&);
-    };
-
     // Reverb unit using comb filter
-    class CombFilter : public Reverb
+    class CombFilter : public ReverbBase
     {
     public:
         // Constructor
         CombFilter(float g, int delay)
-            : Reverb(delay), G0_(g) {}
-
-        // Execute comb filter 
-        virtual float Execute(float x)
-        {
-            float yn = Reverb::Get();
-            Reverb::Set(x + G0_*yn);
-            return yn;
-         }
+            : ReverbBase(delay), G_C_(g) {}
 
         // Execute comb filter with variable delay
         float Execute(float x, int n)
         {
-            float yn = Reverb::Get(n);
-            Reverb::Set(x + G0_*yn);
+            float yn = Get(n);
+            Set(x + G_C_*yn);
             return yn;
          }
 
     private:
-        const float G0_;
+        const float G_C_;
+
+        // disallow copy constructor and assignment operator
+        CombFilter(const CombFilter&);
+        CombFilter& operator=(const CombFilter&);
     };
 
     // Reverb unit using allpass filter
-    class AllPassFilter : public Reverb
+    class AllPassFilter : public ReverbBase
     {
     public:
         // Constructor
         AllPassFilter(float g, int delay)
-            : Reverb(delay), G0_(g) {}
+            : ReverbBase(delay), G_A_(g) {}
 
         // Execute allpass filter 
-        virtual float Execute(float x)
+        float Execute(float x)
         {
-            float un = x + G0_*Reverb::Get();
-            float yn = -G0_*un + Reverb::Get();
-            Reverb::Set(un);
+            float un = x + G_A_*Get();
+            float yn = -G_A_*un + Get();
+            Set(un);
             return yn;
         }
+
     private:
-        const float G0_;
+        const float G_A_;
+
+        // disallow copy constructor and assignment operator
+        AllPassFilter(const AllPassFilter&);
+        AllPassFilter& operator=(const AllPassFilter&);
     };
 }
 #endif  // REVERB_UNIT_HPP