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

Dependencies:   mbed SerialTxRxIntr F446_AD_DA_Multirate

Committer:
MikamiUitOpen
Date:
Sun Jan 20 10:46:15 2019 +0000
Revision:
0:8473107e47de
1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:8473107e47de 1 //--------------------------------------------------------------
MikamiUitOpen 0:8473107e47de 2 // 残響生成器で使うフィルタ
MikamiUitOpen 0:8473107e47de 3 //
MikamiUitOpen 0:8473107e47de 4 // 2018/07/11, Copyright (c) 2018 MIKAMI, Naoki
MikamiUitOpen 0:8473107e47de 5 //--------------------------------------------------------------
MikamiUitOpen 0:8473107e47de 6
MikamiUitOpen 0:8473107e47de 7 #ifndef REVERB_UNIT_HPP
MikamiUitOpen 0:8473107e47de 8 #define REVERB_UNIT_HPP
MikamiUitOpen 0:8473107e47de 9
MikamiUitOpen 0:8473107e47de 10 #include "mbed.h"
MikamiUitOpen 0:8473107e47de 11
MikamiUitOpen 0:8473107e47de 12 // 残響生成ユニットのための基底クラス
MikamiUitOpen 0:8473107e47de 13 template<int delay> class Reverb
MikamiUitOpen 0:8473107e47de 14 {
MikamiUitOpen 0:8473107e47de 15 private:
MikamiUitOpen 0:8473107e47de 16 int ptr_;
MikamiUitOpen 0:8473107e47de 17 float un_[delay]; // for delay
MikamiUitOpen 0:8473107e47de 18 protected:
MikamiUitOpen 0:8473107e47de 19 float Get() { return un_[ptr_]; }
MikamiUitOpen 0:8473107e47de 20 void Set(float x)
MikamiUitOpen 0:8473107e47de 21 {
MikamiUitOpen 0:8473107e47de 22 un_[ptr_] = x;
MikamiUitOpen 0:8473107e47de 23 if (++ptr_ >= delay) ptr_ = 0;
MikamiUitOpen 0:8473107e47de 24 }
MikamiUitOpen 0:8473107e47de 25 public:
MikamiUitOpen 0:8473107e47de 26 // コンストラクタ
MikamiUitOpen 0:8473107e47de 27 Reverb() : ptr_(0) { Clear(); }
MikamiUitOpen 0:8473107e47de 28
MikamiUitOpen 0:8473107e47de 29 // 残響生成フィルタの実行(純粋仮想関数)
MikamiUitOpen 0:8473107e47de 30 virtual float Execute(float x) = 0;
MikamiUitOpen 0:8473107e47de 31
MikamiUitOpen 0:8473107e47de 32 // 内部遅延器のクリア
MikamiUitOpen 0:8473107e47de 33 void Clear()
MikamiUitOpen 0:8473107e47de 34 { for (int n=0; n<delay; n++) un_[n] = 0; }
MikamiUitOpen 0:8473107e47de 35 };
MikamiUitOpen 0:8473107e47de 36
MikamiUitOpen 0:8473107e47de 37 // 櫛形フィルタによる残響生成ユニット
MikamiUitOpen 0:8473107e47de 38 template<int delay> class CombFilter : public Reverb<delay>
MikamiUitOpen 0:8473107e47de 39 {
MikamiUitOpen 0:8473107e47de 40 private:
MikamiUitOpen 0:8473107e47de 41 const float GC_;
MikamiUitOpen 0:8473107e47de 42 public:
MikamiUitOpen 0:8473107e47de 43 // コンストラクタ
MikamiUitOpen 0:8473107e47de 44 CombFilter(float g) : GC_(g) {}
MikamiUitOpen 0:8473107e47de 45
MikamiUitOpen 0:8473107e47de 46 // 櫛形フィルタの実行
MikamiUitOpen 0:8473107e47de 47 virtual float Execute(float x)
MikamiUitOpen 0:8473107e47de 48 {
MikamiUitOpen 0:8473107e47de 49 float yn = Reverb<delay>::Get();
MikamiUitOpen 0:8473107e47de 50 Reverb<delay>::Set(x + GC_*yn);
MikamiUitOpen 0:8473107e47de 51 return yn;
MikamiUitOpen 0:8473107e47de 52 }
MikamiUitOpen 0:8473107e47de 53 };
MikamiUitOpen 0:8473107e47de 54
MikamiUitOpen 0:8473107e47de 55 // 全域通過フィルタによる残響生成ユニット
MikamiUitOpen 0:8473107e47de 56 template<int delay> class AllpassFilter : public Reverb<delay>
MikamiUitOpen 0:8473107e47de 57 {
MikamiUitOpen 0:8473107e47de 58 private:
MikamiUitOpen 0:8473107e47de 59 const float G0_;
MikamiUitOpen 0:8473107e47de 60 public:
MikamiUitOpen 0:8473107e47de 61 // コンストラクタ
MikamiUitOpen 0:8473107e47de 62 AllpassFilter(float g) : G0_(g) {}
MikamiUitOpen 0:8473107e47de 63
MikamiUitOpen 0:8473107e47de 64 // 全域通過フィルタの実行
MikamiUitOpen 0:8473107e47de 65 virtual float Execute(float x)
MikamiUitOpen 0:8473107e47de 66 {
MikamiUitOpen 0:8473107e47de 67 float un = x + G0_*Reverb<delay>::Get();
MikamiUitOpen 0:8473107e47de 68 float yn = -G0_*un + Reverb<delay>::Get();
MikamiUitOpen 0:8473107e47de 69 Reverb<delay>::Set(un);
MikamiUitOpen 0:8473107e47de 70 return yn;
MikamiUitOpen 0:8473107e47de 71 }
MikamiUitOpen 0:8473107e47de 72 };
MikamiUitOpen 0:8473107e47de 73
MikamiUitOpen 0:8473107e47de 74 #endif // REVERB_UNIT_HPP