![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
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
Diff: SignalProcessing/ReverbUnit.hpp
- 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 +