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

Dependencies:   mbed SerialTxRxIntr F446_AD_DA_Multirate

reverb_unit.hpp

Committer:
MikamiUitOpen
Date:
2019-01-20
Revision:
0:8473107e47de

File content as of revision 0:8473107e47de:

//--------------------------------------------------------------
// 残響生成器で使うフィルタ
//
// 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