
Nucleo-F446 による残響生成器 . DA変換器にデータを送る際は 4 倍にアップ・サンプリング.
Dependencies: mbed SerialTxRxIntr F446_AD_DA_Multirate
reverb_unit.hpp@0:8473107e47de, 2019-01-20 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Sun Jan 20 10:46:15 2019 +0000
- Revision:
- 0:8473107e47de
1
Who changed what in which revision?
User | Revision | Line number | New 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 |