Nucleo-F446 による残響生成器 . DA変換器にデータを送る際は 4 倍にアップ・サンプリング.

Dependencies:   mbed SerialTxRxIntr F446_AD_DA_Multirate

Revision:
0:8473107e47de
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/reverb_unit.hpp	Sun Jan 20 10:46:15 2019 +0000
@@ -0,0 +1,74 @@
+//--------------------------------------------------------------
+// 残響生成器で使うフィルタ
+//
+// 2018/07/11, Copyright (c) 2018 MIKAMI, Naoki
+//--------------------------------------------------------------
+
+#ifndef REVERB_UNIT_HPP
+#define REVERB_UNIT_HPP
+
+#include "mbed.h"
+
+// 残響生成ユニットのための基底クラス
+template<int delay> class Reverb
+{
+private:
+    int ptr_;
+    float un_[delay];    // for delay
+protected:
+    float Get() { return un_[ptr_]; }
+    void Set(float x)
+    {
+        un_[ptr_] = x;   
+        if (++ptr_ >=  delay) ptr_ = 0;
+    }
+public:
+    // コンストラクタ
+    Reverb() : ptr_(0) { Clear(); }
+
+    // 残響生成フィルタの実行(純粋仮想関数)
+    virtual float Execute(float x) = 0;
+
+    // 内部遅延器のクリア
+    void Clear()
+    { for (int n=0; n<delay; n++) un_[n] = 0; }
+};    
+   
+// 櫛形フィルタによる残響生成ユニット
+template<int delay> class CombFilter : public Reverb<delay>
+{
+private:
+    const float GC_;
+public:
+    // コンストラクタ
+    CombFilter(float g) : GC_(g) {}
+
+    // 櫛形フィルタの実行
+    virtual float Execute(float x)
+    {
+        float yn = Reverb<delay>::Get();
+        Reverb<delay>::Set(x + GC_*yn);
+        return yn;
+     }
+};
+
+// 全域通過フィルタによる残響生成ユニット
+template<int delay> class AllpassFilter : public Reverb<delay>
+{
+private:
+    const float G0_;
+public:
+    // コンストラクタ
+    AllpassFilter(float g) : G0_(g) {}
+
+    // 全域通過フィルタの実行
+    virtual float Execute(float x)
+    {
+        float un = x + G0_*Reverb<delay>::Get();
+        float yn = -G0_*un + Reverb<delay>::Get();
+        Reverb<delay>::Set(un);
+        return yn;
+     }
+};
+
+#endif  // REVERB_UNIT_HPP