Main Content

フィルターの実装

畳み込みとフィルター処理

フィルター処理の数学的な基盤は、畳み込みです。有限インパルス応答 (FIR) フィルターの場合、フィルター処理の出力 y(k) は、インパルス応答 h(k):

y(k)=l=h(l)x(kl).

のある入力信号 x(k) の畳み込みです。

入力信号が有限長でもある場合、MATLAB® 関数 conv を使用してフィルター処理を実装できます。たとえば、3 次平均化フィルターで 5 サンプルのランダムなベクトルをフィルター処理するには、ベクトル xx(k)、ベクトル hh(k) を格納して、その 2 つを畳み込むことができます。

x = randn(5,1);
h = [1 1 1 1]/4;   % A third-order filter has length 4
y = conv(h,x)
y =
   -0.3375
    0.4213
    0.6026
    0.5868
    1.1030
    0.3443
    0.1629
    0.1787
y の長さは、xh の長さの合計よりも 1 小さくなります。

フィルターと伝達関数

フィルターの伝達関数は、インパルス応答の Z 変換です。FIR フィルターの場合、出力 y の Z 変換、Y(z) は伝達関数の積で、X(z) は入力 x の Z 変換です。

Y(z)=H(z)X(z)=(h(1)+h(2)z1++h(n+1)zn)X(z).

多項式係数 h(1), h(2), …, h(n + 1) は、n 次フィルターのインパルス応答の係数に対応します。

メモ

フィルター係数インデックスは、0 から n ではなく、1 から (n + 1) まで実行します。これは、MATLAB ベクトルに使用される標準インデックス方式を反映しています。

FIR フィルターは、全零、非再帰、または移動平均 (MA) フィルターとも呼ばれます。

無限インパルス応答 (IIR) フィルターの場合、伝達関数は多項式ではなく有理関数です。入力信号と出力信号の Z 変換は、

Y(z)=H(z)X(z)=b(1)+b(2)z1+...+b(n+1)zna(1)+a(2)z1+...+a(m+1)zmX(z),

に関連しています。b(i) と a(i) はフィルター係数です。この場合、フィルターの次数は nm の最大値です。n = 0 の IIR フィルターは、全極、再帰、または自己回帰 (AR) フィルターとも呼ばれます。nm の両方が 0 より大きい IIR フィルターの場合、極-零点、再帰、または自己回帰移動平均 (ARMA) フィルターとも呼ばれます。AR、MA、ARMA の頭字語は通常、フィルターされた確率過程に関連するフィルターに適用されます。

関数 filter を使用したフィルター処理

IIR フィルターの場合、フィルター処理は、単純な畳み込みではなく、伝達-関数関係から見つかる差分方程式で表されます。a(1) = 1 と仮定し、分母を左辺に移項し、逆 Z 変換を実行して

y(k)+a(2)y(k1)++a(m+1)y(km)=b(1)x(k)+b(2)x(k1)++b(n+1)x(kn).

を取得します。

現在と過去の入力、および過去の出力に関して、y(k) は次のようになります。

y(k)=b(1)x(k)+b(2)x(k1)++b(n+1)x(kn)a(2)y(k1)a(m+1)y(km),

これは、デジタル フィルターの標準時間領域の表現です。y (1) から始まり、因果システムの初期条件を 0 と仮定しています。表現は

y(1)=b(1)x(1)y(2)=b(1)x(2)+b(2)x(1)a(2)y(1)y(3)=b(1)x(3)+b(2)x(2)+b(3)x(1)a(2)y(2)a(3)y(1)y(n)=b(1)x(n)++b(n)x(1)a(2)y(n1)a(n)y(1).

と同等です。

このフィルター処理を実装するには、MATLAB の関数 filter を使用します。filter は 2 つの行ベクトルに係数を保存します。一方には分子係数が、もう一方には分母係数が格納されます。たとえば、差分方程式

y(n)0.9y(n1)=x(n)Y(z)=110.9z1X(z)=H(z)X(z),

を解くには、以下を使用します。

b = 1;
a = [1 -0.9];
y = filter(b,a,x);
関数 filter では、入力サンプル数と同数の出力サンプル数が出力されます。つまり、y の長さは x の長さと同じです。a の最初の要素が 1 でない場合、filter によって差分方程式を実装する前に係数が a(1) で除算されます。

参考

アプリ

関数