ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

データのフィルター処理

はじめに

MATLAB® のさまざまな IEEE® 関数で、生データの変動を成形する差分方程式とフィルターを使用できます。これらの関数は、ベクトルと行列に作用します。フィルター処理は、データの高周波の変動を滑らかにしたり、特定の周波数の周期的なトレンドを除きたい場合に使用します。

ベクトル入力は、サンプリングされた単一のデータ信号 (または列) を表します。行列の入力に対して、各信号は行列の列に対応し、各データ サンプルは行に対応します。

フィルター関数

関数

y = filter(b,a,x)

は、ベクトル ab により記述されたフィルターで、ベクトルx のデータを処理し、フィルター処理されたデータ y を作成します。

関数 filter は、以下の差分方程式で示される一般的なタップ付遅延線形フィルターです。

a(1)y(n)=b(1)x(n)+b(2)x(n1)++b(Nb)x(nNb+1)                 a(2)y(n1)a(Na)y(nNa+1)

ここで、n は現在のサンプルのインデックスで、Na はベクトル a で記述される多項式の次数、Nb はベクトル b で記述される多項式の次数です。出力 y(n) は、現在の入力とその前の入力 x(n) x(n – 1)..., および、前の出力 y(n – 1) y(n – 2)... の線形結合です .

移動平均フィルター

この例では、移動平均フィルターを使って count.dat のデータを平滑化し、4 時間枠 (現在の 1 時間とそれまでの 3 時間) の平均交通量を求める方法を示します。このプロセスは、次の差分方程式で表されます。

$$y(n)=\frac{1}{4}x(n)+\frac{1}{4}x(n-1)+\frac{1}{4}x(n-2)+\frac{1}{4}x(n-3).$$

対応するベクトルを作成します。

a = 1;
b = [1/4 1/4 1/4 1/4];

関数 load を使用してデータを count.dat からインポートします。

load count.dat

このデータを読み込むと、MATLAB® ワークスペースに count という 24 行 3 列の行列が作成されます。

count の最初の列を抽出し、ベクトル x に割り当てます。

x = count(:,1);

データの 4 時間の移動平均は、次のように計算します。

y = filter(b,a,x);

オリジナル データとフィルター処理されたデータをプロットします。

figure
t = 1:length(x);
plot(t,x,'--',t,y,'-'),grid on
legend('Original Data','Smoothed Data',2)
title('Plot of Original and Smoothed Data')

プロット内で実線で表示されるフィルター処理されたデータは、count の 4 時間移動平均です。オリジナル データは、破線で表示されます。

離散フィルター

この例では入力信号に伝達関数を適用してデータを成形するために、離散フィルターを使用する方法を示します。

目的に応じて、選択した伝達関数は、データの変動の振幅と位相をさまざまな周波数において変更し、より平滑化した出力、またはより粗い出力を生成します。

以下の差分方程式の Z 変換を行います。

$$\begin{array}{rcl}
a(1)y(n) &=& b(1)x(n)+b(2)x(n-1)+...+b(N_{b})x(n-N_{b}+1)\\
&&{}-a(2)y(n-1)-...-a(N_{a})y(n-N_{a}+1)\end{array}$$

次の伝達関数になります。

$$Y(z) = H(z^{-1})X(z) =
\frac{b(1)+b(2)z^{-1}+...+b(N_{b})z^{-N_{b}+1}}{a(1)+a(2)z^{-1}+...+a(N_{a})z^{-N_{a}+1}}X(z).$$

ここで、Y(z) は、フィルター処理された出力 y(n) の Z 変換です。係数 b と a は、Z 変換により変更されません。

デジタル信号処理 (DSP) では、 $z^{-1}$ の有理式で伝達関数を記述し、分子と分母の式は $z^{-1}$ の昇べきの順に並べるのが通例です。

次の伝達関数について考えます。

$$H(z^{-1}) = \frac{b(z^{-1})}{a(z^{-1})} =
\frac{2+3z^{-1}}{1+0.2z^{-1}}.$$

次のコードは、この伝達関数を定義し、count.dat のデータに適用します。

ワークスペースに行列 count を読み込みます。

load count.dat

最初の列を抽出し、x に割り当てます。

x = count(:,1);

$z^{-1}$ の昇べきの順に並んだ分母の係数を入力して $1+0.2z^{-1}$ を表します。

a = [1 0.2];

分子の係数を入力して $2+3z^{-1}$ を表します。

b = [2 3];

フィルター関数を呼び出します。

y = filter(b,a,x);

オリジナル データと成形したデータとを 2 つの曲線として重ね書きして比べます。

t = 1:length(x);
plot(t,x,'-.',t,y,'-'), grid on
legend('Original Data','Shaped Data',2)
title('Plot of Original and Shaped Data')

このプロットから、このフィルターは第一にオリジナル データの振幅を変更していることがわかります。

この情報は役に立ちましたか?