Main Content

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

移動平均フィルターと FIR フィルターの違いとは

移動平均フィルターは、標準 FIR フィルターの特殊なケースです。両方のフィルターに有限インパルス応答があります。移動平均フィルターはスケーリングされた 1 のシーケンスを係数として使用しますが、FIR フィルターの係数はフィルター仕様に基づいて設計されます。これらは通常、1 のシーケンスではありません。

ストリーミング データの移動平均は、有限スライディング ウィンドウを使用して計算されます。

movAvg=x[n]+x[n1]+...+x[nN]N+1

N + 1 はフィルターの長さです。このアルゴリズムは、係数ベクトルが [b0, b1, ..., bN] である標準 FIR フィルターの特殊なケースです。

FIROutput=b0x[n]+b1x[n1]+...+bNx[nN]

出力を計算するには、標準 FIR フィルターは各データ サンプルに [b0, b1, ..., bN] ベクトルの係数を乗算し、結果を加算します。移動平均フィルターは乗算器を使用しません。アルゴリズムは、すべてのデータ サンプルを加算し、結果と 1 / filterLength を乗算します。

移動平均フィルターと FIR フィルターの周波数応答

移動平均フィルターの周波数応答と標準 FIR フィルターの周波数応答を比較します。標準 FIR フィルターの係数をスケーリングされた 1 のシーケンスとして設定します。スケーリング係数は 1/|filterLength| です。

dsp.FIRFilter System object™ を作成して、その係数を 1/40 に設定します。移動平均を計算するには、スライディング ウィンドウの長さが 40 の dsp.MovingAverage System object を作成します。両方のフィルターの係数は同じです。入力は平均 0、標準偏差 1 のガウス ホワイト ノイズです。

filter = dsp.FIRFilter('Numerator',ones(1,40)/40);
mvgAvg = dsp.MovingAverage(40);
input = randn(1024,1);
filterOutput = filter(input);
mvgAvgOutput = mvgAvg(input);

fvtool を使用して両方のフィルターの周波数応答を可視化します。

hfvt = fvtool(filterOutput,1,mvgAvgOutput,1);
legend(hfvt,'FIR Filter','Moving Average Filter');

周波数応答が厳密に一致し、これは移動平均フィルターが FIR フィルターの特殊なケースであることを証明しています。

比較のために、フィルターの周波数応答をノイズなしで表示します。

fvtool(filter);

フィルターの周波数応答を理想フィルターの周波数応答と比較します。通過帯域のメイン ローブがフラットではなく、阻止帯域のリップルは制限されていないことがわかります。移動平均フィルターの周波数応答は、理想フィルターの周波数応答とは一致しません。

理想 FIR フィルターを実現するには、フィルター係数をスケーリングされた 1 のシーケンスではないベクトルに変更します。フィルターの周波数応答が変更され、理想フィルターの応答に近づく傾向があります。

事前定義されたフィルター仕様に基づきフィルター係数を設計します。たとえば、正規化されたカットオフ周波数が 0.1、通過帯域リップルが 0.5、阻止帯域の減衰量が 40 dB の等リップル FIR フィルターを設計します。fdesign.lowpass を使用してフィルター仕様を定義し、design メソッドを使用してフィルターを設計します。

FIReq = fdesign.lowpass('N,Fc,Ap,Ast',40,0.1,0.5,40);
filterCoeff = design(FIReq,'equiripple','SystemObject',true);
fvtool(filterCoeff)

通過帯域のフィルターの応答はほぼフラット (理想的な応答と同様) であり、阻止帯域には制約付き等リップルがあります。

関連するトピック