Reverb system using parallel structure of comb filters and cascade structure of allpass filters for ST Nucleo F401RE.
Dependencies: UITDSP_ADDA mbed
reverb_unit.hpp
- Committer:
- MikamiUitOpen
- Date:
- 2014-10-23
- Revision:
- 0:72e321f29769
- Child:
- 1:51c85e0a6e1e
File content as of revision 0:72e321f29769:
//-------------------------------------------------------------- // Comb filter // 2014/10/23, Copyright (c) 2014 MIKAMI, Naoki //-------------------------------------------------------------- #ifndef REVERB_UNIT_HPP #define REVERB_UNIT_HPP #include "mbed.h" // Base class for reverb unit 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: // Constructor Reverb() : ptr_(0) { Clear(); } // 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; } }; // Comb filter template<int delay> class CombFilter : public Reverb<delay> { private: const float G0_; public: // Constructor CombFilter(float g) : G0_(g) {} // Execute comb filter virtual float Execute(float x) { float yn = Reverb<delay>::Get(); Reverb<delay>::Set(x + G0_*yn); return yn; } }; // Allpass filter template<int delay> class AllpassFilter : public Reverb<delay> { private: const float G0_; public: // Constructor AllpassFilter(float g) : G0_(g) {} // Execute comb filter 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