2016年9月20日火曜日

IIRフィルタ

IIRフィルタの設計仕様で計算できる係数を使ったフィルタをC#で実装してみた。例によって正しいかどうかは不明。
このWebページではIIRとかFIRの計算が簡単にできるのでおもしろい。

private void IIR(ref double[] datas, double k, double b1, double b2, double a0, double a1, double a2)
{
    double z1 = 0, z2 = 0;

    for (int i = 0; i < datas.Length; i++)
    {
        double x = datas[i] * k;

        x += -(
            z1 * b1 +
            z2 * b2);

        datas[i] =
            a0 * x +
            a1 * z1 +
            a2 * z2;

        z2 = z1;
        z1 = x;
    }
}

タップ数を増やす場合はそれぞれのセクションの係数を与えて繰り返し呼べばいい。
とりあえずセクション数8のLPF(1000Hz,250Hz,300Hz0.5dB,35dBで設計)の結果。




青が乱数をフィルタに通してFFTした結果。赤が設計出力画面の振幅特性。
結構似た感じの傾きになってる気がする。縦軸の扱いがよくわからないけど。

上のメソッドではデータを配列として受け取って処理しているので、リアルタイムでの処理はできない。


確かにFIRよりは急峻なフィルタになっている気がするけど、計算コストも結構高そう。加算と乗算だけでイケるFIRと比較しちゃだめなんだろうが、と思ったけど、IIRも加算と乗算だけだよね。かなり複雑な気がするけど。


サンプリングレートは低くていいので、マイコンのソフト浮動小数点でどれくらいのフィルタが作れるか、試してみないと。

0 件のコメント:

コメントを投稿