//----------------------------------------------------------------------
//  FIR フィルタと IIR フィルタの比較
//      FIRフィルタは直線位相
//      両者ともに 400 Hz 以上を通過域とする HPF
//
//  2023/01/16, Copyright (c) 2023 MIKAMI, Naoki
//----------------------------------------------------------------------

#include "MultirateLiPh.hpp"
#include "Coefs_FIR100th_HP400.hpp"
#include "FIR_Direct.hpp"
#include "Coefs_IIR6_Cascade_HP_400.hpp"
#include "IirCascade.hpp"
#pragma diag_suppress 870   // マルチバイト文字使用の警告抑制のため
using namespace Mikami;

const float FS_ = 10.0f;    // 入力の標本化周波数： 10 kHz
MultirateLiPh myAdDa_(FS_); // 出力標本化周波数を４倍にするオブジェクト
FirDirect dfFir_(ORDER_FIR_, HK_);          // 直接形 FIR フィルタのオブジェクト
IirCascade dfIir_(ORDER_IIR_, CK_, G0_);    // 縦続形 IIF フィルタのオブジェクト
bool fir_ = true;           // FIR フィルタの場合 true

// ADC 変換終了割込みに対する割込みサービス･ルーチン
void AdcIsr()
{
    float xn = myAdDa_.Input();             // 入力
    float ynFir = dfFir_.Execute(xn);       // FIR フィルタの処理
    float ynIir = dfIir_.Execute(xn);       // IIR フィルタの処理
    myAdDa_.Output(fir_ ? ynFir : ynIir);   // 出力
}

int main()
{
    printf("\r\nFIR フィルタと IIR フィルタを比較します\r\n");
    printf("'f': FIR フィルタ, 'i': IIR フィルタ\r\n");
    printf("起動時: FIR フィルタ\r\n");

    myAdDa_.Start(&AdcIsr);     // 標本化を開始する
    while (true)
    {
        char f_i = getchar();
        printf("%c", f_i);
        fir_ = (f_i == 'f') ? true : false;
    }
}
