Demo program of digital signal processing: Variable LPF/HPF, Vocal canceller, Pitch shifter, Reverbrator. ディジタル信号処理のデモプログラム. 遮断周波数可変 LPF/HPF,ボーカルキャンセラ,ピッチシフタ,残響生成器.

Dependencies:   Array_Matrix F446_AD_DA UIT_AQM1602 mbed

Revision:
0:fa74b1130cc3
Child:
5:503bd366fd73
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SignalProcessing/ReverbUnit.hpp	Sun Jan 29 09:11:30 2017 +0000
@@ -0,0 +1,108 @@
+//--------------------------------------------------------------
+// Reverb unit
+//  2017/01/28, Copyright (c) 2017 MIKAMI, Naoki
+//--------------------------------------------------------------
+
+#ifndef REVERB_UNIT_HPP
+#define REVERB_UNIT_HPP
+
+#include "mbed.h"
+#include "Array.hpp"
+namespace Mikami
+{
+    // Base class for reverb unit
+    class Reverb
+    {
+    public:
+        // Constructor
+        Reverb(int delay) : DELAY_(delay), un_(delay)
+        {   
+            ptr_ = 0;
+            Clear();
+        }
+        
+        ~Reverb() {}
+
+        // 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:
+        const int DELAY_;
+        Array<float> un_;   // for delay
+        int ptr_;
+
+        // disallow copy constructor and assignment operator
+        Reverb(const Reverb&);
+        Reverb& operator=(const Reverb&);
+    };
+
+    // Reverb unit using comb filter
+    class CombFilter : public Reverb
+    {
+    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;
+         }
+
+        // Execute comb filter with variable delay
+        float Execute(float x, int n)
+        {
+            float yn = Reverb::Get(n);
+            Reverb::Set(x + G0_*yn);
+            return yn;
+         }
+
+    private:
+        const float G0_;
+    };
+
+    // Reverb unit using allpass filter
+    class AllPassFilter : public Reverb
+    {
+    public:
+        // Constructor
+        AllPassFilter(float g, int delay)
+            : Reverb(delay), G0_(g) {}
+
+        // Execute allpass filter 
+        virtual float Execute(float x)
+        {
+            float un = x + G0_*Reverb::Get();
+            float yn = -G0_*un + Reverb::Get();
+            Reverb::Set(un);
+            return yn;
+        }
+    private:
+        const float G0_;
+    };
+}
+#endif  // REVERB_UNIT_HPP
+