//--------------------------------------------------------------
//  グラフィックイコライザのクラス
//
//  2022/10/19, Copyright (c) 2022 MIKAMI, Naoki
//--------------------------------------------------------------

#include "GraphicEqualizer.hpp"

namespace Mikami
{
    // コンストラクタ
    GrEqualizer::GrEqualizer(int bands, float fs, float qVal)
        : BANDS_(bands), Q_VAL_(qVal),
          biquad_(bands), f0_(bands), params_(bands, fs)
    {
        for (int n=0; n<BANDS_; n++) f0_[n] = 62.5f*powf(2, n);
        Flatten();  // 最初の周波数特性は平坦
        Validate();
    }

    // 周波数特性を平坦にする
    void GrEqualizer::Flatten()
    {
        for (int n=0; n<BANDS_; n++)
            biquad_[n].SetCoefficients(params_.Get(n, f0_[n], 0, Q_VAL_));
    }
    
    // グラフィック･イコライザの実行
    float GrEqualizer::Filtering(float xn)
    {
        float yn = xn;
        for (int n=0; n<BANDS_; n++)
            yn = biquad_[n].Execute(yn);
        return yn;
    }
}
