トップ音響信号処理 > FIRフィルタ

FIRフィルタとは

FIR(Finite Impulse Response)フィルタとは移動平均を拡張したようなものである。 「有限」とは入力データはある決められた有限の期間のみ使用することを意味する。 常にある区間のデータを平均化することにより、急峻な変化は抑制され、波形が滑らかになる。 すなわち、移動平均はローパスフィルタの一種である。

例えば、4つのデータを使う場合、入力信号 x[n] と出力信号 y[n] の関係は次式で表される。

    y[n] = a0・x[n]+a1・x[n-1]+a2・x[n-2]+a3・x[n-3]
ここで、|a0| + |a1| + |a2| + |a3| = 1.0 である(一般にこの関係は保証されていない。 したがって、出力信号の最大値が入力信号の最大値を超えることがある)。 移動平均は係数の値を同じ値にしたものである。 移動平均と異なり、デジタルフィルタでは一部の係数は負の値をとり、ローパスフィルタ(ある基準値よりも低い周波数成分のみを通す)だけでなく、 ハイパスフィルタ(ある基準値よりも高い周波数成分のみを通す)、バンドパスフィルタ(ある範囲の周波数成分のみを通す)も構成できる。

FIR のプログラムを考えよう。段数は K で表し、a0, a1, ... は a[0], a[1], ... で表す。 音声データのサンプリング数を N で表す。 入力信号 x[n] と出力信号 y[n] の関係をプログラムにしてみると、 次のようになる。

    int n, k;
    double x[N], y[N], y;
    for (n = 0; n < N; n++) {
        x[n] ← 入力
        y = 0.0;
        for (k = 0; k < K; k++) {
            y += a[k] * x[n-k];
        }
        y[n] = y;
        y[n] → 出力
    }

このプログラムでは、x[-1], x[-2], ... , x[-K+1] が現れるので、 このままでは、いけない。また、通常は、音声データ全体を配列に置く必要性はない。 最低限必要なのはフィルタの段数 N サンプリング分のデータだけである。 このような場合、常套手段として、リングバッファを使うことになる。 リングバッファを使用したプログラムを下に示す。 x[(n-k)%N] ではなく、x[(n+K-k)%N] としたのは、時刻 0 以前のデータに対する対策である。 初期化で x[-1], x[-2], ... , x[-K+1] はゼロとしている。 また、通常は、直ちに出力すればいいので、特に配列はいらない。

    int n, k;
    double x[K], y;
    memset(x, 0, sizeof(x));	// 配列 x をゼロクリア
    for (n = 0; n < N; n++) {
        x[n%K] ← 入力
        y = 0.0;
        for (k = 0; k < K; k++) {
            y += a[k] * x[(n+K-k)%N];
        }
        y → 出力
    }

テキスト形式の音声データに対して、FIRフィルタ処理を行い、 同様のテキスト形式の音声データとして出力するプログラムを下に示す。

fir.c

440Hz の la.wav の 10周期分の波形を以下に示す(画像ファイル)。 この例では、FIRによって、矩形波が台形波に変化している。

Java Applet実行はこちら

このときの、振幅スペクトルを下に示す(画像ファイル)。高調波成分が著しく減少していることがわかる。

Java Applet実行はこちら

FIRフィルタプログラム

矩形波で生成したWAVファイルを読み込んで、FIRフィルタ処理を施して、 新しいWAVファイルを生成するJavaアプリケーションプログラムを次に示す。

WavFIR01.java

プログラムの実行例を下に示す。

c:\MH\www\asp\java>java WavFIR01 ex0.wav 1,1,1,1,1,1,1,1,1,1 ex0fir.wav
c:\MH\www\asp\java>java WavFIR01 la.wav 1,1,1,1,1,1,1,1,1,1 lafir.wav

元の音[矩形波]とFIRフィルタを通した音[台形波]の聴き比べてください。 元の音(Original)には高次の高調波の比率が高いため、全般的に高い音ですが、 FIRを通した音(FIRed)は高音が抑えられかなり柔らかい音になります。
ラ(440Hz)元の音 FIRを通した音
とおりゃんせ元の音 FIRを通した音

FIRプログラム(2)

文献 [坂巻:見てわかるディジタル信号処理、工業調査会(2000)] にある係数を使った21段のFIRフィルタプログラムを以下に示す。

WavFIR02.java


参考文献

[1] 第 2 章 デジタル信号処理入門 (デジタルフィルタ)