このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
MATLAB でのローパス フィルター設計
この例では、ローパス フィルターの設計法を示します。DSP System Toolbox™ の最も一般的に使用されるいくつかのコマンド ライン ツールを紹介します。ここで示す設計は、いずれもフィルター ビルダー アプリを使用して実装することもできます。その他の設計オプションについては、ローパス FIR フィルターの設計を参照してください。
はじめに
ローパス フィルターを設計するときは、最初に FIR フィルターと IIR フィルターのどちらを設計するかを決めます。一般に、位相応答の線形性が重要な場合は FIR フィルターを選択します。FIR フィルターは、一般に量子化の影響に対するロバスト性に優れているため、固定小数点の実装にもよく使用される傾向にあります。また、FIR フィルターはパイプライン化に適しているため、FPGA や ASIC などの多くの高速な実装にも使用されています。IIR フィルター (特に双二次フィルター) は、位相の線形性が問題にならないアプリケーション (オーディオ信号処理など) で使用されます。IIR フィルターは、通常、設計仕様を FIR フィルターよりも少ない係数で満たせるという点で計算効率に優れています。また、IIR フィルターには、過渡応答が短く、群遅延が小さいという傾向もあります。ただし、最小位相のマルチレートの設計を使用すれば、群遅延や計算効率の点で FIR フィルターも IIR フィルターと同等になります。
FIR ローパス設計 - フィルター次数の指定
実際の状況においては、フィルター次数を指定しなければならないことがよくあります。たとえば、ターゲットのハードウェアでフィルター次数が特定の数に制約されている場合があります。また、実装に使用できる計算の割り当て (MIPS) を計算した結果、フィルター次数が制限される場合もよくあります。Signal Processing Toolbox の FIR 設計関数 (fir1
、firpm
、firls
) では、いずれも指定した次数のローパス フィルターを設計できます。DSP System Toolbox の関数で、指定した次数のローパス FIR フィルターの設計によく使用されるのは firceqrip
です。この関数は、指定された通過帯域/阻止帯域リップルの値と指定された通過帯域エッジ周波数で最適な等リップル ローパス/ハイパス FIR フィルターを設計します。阻止帯域エッジ周波数は設計の結果から決まります。
48 kHz でサンプリングされるデータに対するローパス FIR フィルターを設計します。通過帯域エッジ周波数は 8 kHz です。通過帯域リップルは 0.01 dB、阻止帯域の減衰量は 80 dB です。フィルター次数を 120 に制約します。
N = 120; Fs = 48e3; Fp = 8e3; Ap = 0.01; Ast = 80;
通過帯域リップルと阻止帯域リップルの線形単位の最大偏差を求めます。
Rp = (10^(Ap/20) - 1)/(10^(Ap/20) + 1); Rst = 10^(-Ast/20);
firceqrip
を使用してフィルターを設計し、振幅周波数応答を表示します。
NUM = firceqrip(N,Fp/(Fs/2),[Rp Rst],'passedge'); fvtool(NUM,'Fs',Fs)
結果の阻止帯域エッジ周波数は約 9.64 kHz になります。
最小次数設計
最適な等リップル フィルターを設計するためのもう 1 つの関数に firgr
があります。firgr
では、通過帯域/阻止帯域リップルの制約に加えて指定した遷移幅も満たすフィルターを最小のフィルター次数で設計できます。たとえば、阻止帯域エッジ周波数を 10 kHz と指定すると、結果のフィルターは firceqrip
で設計される 120 次のフィルターではなく 100 次のフィルターになります。フィルター次数は遷移帯域が大きいほど小さくなります。
阻止帯域エッジ周波数を 10 kHz と指定します。通過帯域リップルが 0.01 dB で阻止帯域の減衰量が 80 dB の最小次数の FIR フィルターを取得します。
Fst = 10e3; NumMin = firgr('minorder',[0 Fp/(Fs/2) Fst/(Fs/2) 1],... [1 1 0 0],[Rp,Rst]);
firgr
で取得した最小次数の FIR フィルターと firceqrip
で設計した 120 次フィルターの振幅周波数応答をプロットします。最小次数設計のフィルターの次数は 100 になります。予想どおり、120 次フィルターの遷移領域は次数が 100 のフィルターよりも狭くなります。
hvft = fvtool(NUM,1,NumMin,1,'Fs',Fs); legend(hvft,'N = 120','N = 100')
データのフィルター処理
フィルターをデータに適用するには、filter
コマンドを使用するか、dsp.FIRFilter
を使用します。dsp.FIRFilter
には、ループで実行する際に状態を管理できるという利点があります。また、dsp.FIRFilter
には固定小数点機能があり、C コード生成、HDL コード生成、ARM® Cortex® M および ARM Cortex A に最適化されたコード生成もサポートされます。
120 次 FIR ローパス フィルターを使用して、ゼロ平均と単位標準偏差をもつ 10 秒間のホワイト ノイズを 256 サンプルのフレームでフィルター処理します。スペクトル アナライザーで結果を表示します。
LP_FIR = dsp.FIRFilter('Numerator',NUM); SA_FIR = spectrumAnalyzer('SampleRate',Fs); tic while toc < 10 x = randn(256,1); y = LP_FIR(x); step(SA_FIR,y); end release(SA_FIR)
dsp.LowpassFilter
の使用
firceqrip
および firgr
を dsp.FIRFilter
と組み合わせて使用する代わりに、dsp.LowpassFilter
を使用することもできます。基本的に、dsp.LowpassFilter
は 2 つのステップのプロセスを 1 つにまとめたものです。dsp.LowpassFilter
には、固定小数点のサポート、C コード生成のサポート、HDL コード生成のサポート、および ARM Cortex コード生成のサポートについて、dsp.FIRFilter
と同じ利点があります。
48 kHz でサンプリングされるデータに対するローパス FIR フィルターを設計します。通過帯域エッジ周波数は 8 kHz です。通過帯域リップルは 0.01 dB、阻止帯域の減衰量は 80 dB です。フィルター次数を 120 に制約します。仕様に基づいて dsp.FIRFilter
を作成します。
LP_FIR = dsp.LowpassFilter('SampleRate',Fs,... 'DesignForMinimumOrder',false,'FilterOrder',N,... 'PassbandFrequency',Fp,... 'PassbandRipple',Ap,'StopbandAttenuation',Ast);
LP_FIR
の係数は NUM
の係数と同じです。
NUM_LP = tf(LP_FIR);
前の例に示したように、LP_FIR
を使用してデータを直接フィルター処理できます。また、FVTool を使用してフィルターを解析したり、measure
を使用して応答を測定したりできます。
fvtool(LP_FIR,'Fs',Fs);
measure(LP_FIR)
ans = Sample Rate : 48 kHz Passband Edge : 8 kHz 3-dB Point : 8.5843 kHz 6-dB Point : 8.7553 kHz Stopband Edge : 9.64 kHz Passband Ripple : 0.01 dB Stopband Atten. : 79.9981 dB Transition Width : 1.64 kHz
dsp.LowpassFilter を使用した最小次数設計
dsp.LowpassFilter
を使用して最小次数フィルターを設計し、measure
を使用して設計が指定の仕様を満たすことを確認できます。フィルターの次数はここでも 100 です。
LP_FIR_minOrd = dsp.LowpassFilter('SampleRate',Fs,... 'DesignForMinimumOrder',true,... 'PassbandFrequency',Fp,... 'StopbandFrequency',Fst,... 'PassbandRipple',Ap,... 'StopbandAttenuation',Ast); measure(LP_FIR_minOrd)
ans = Sample Rate : 48 kHz Passband Edge : 8 kHz 3-dB Point : 8.7136 kHz 6-dB Point : 8.922 kHz Stopband Edge : 10 kHz Passband Ripple : 0.0098641 dB Stopband Atten. : 80.122 dB Transition Width : 2 kHz
Nlp = order(LP_FIR_minOrd)
Nlp = 100
IIR フィルターの設計
楕円フィルターは、最適な等リップル FIR フィルターに相当する IIR のフィルターです。したがって、同じ仕様を使用して楕円フィルターを設計できます。IIR フィルターでは、取得するフィルター次数が対応する FIR フィルターの次数よりもはるかに小さくなります。
サンプリング周波数、カットオフ周波数、通過帯域リップル制約、および阻止帯域の減衰量を 120 次 FIR フィルターと同じにして楕円フィルターを設計します。楕円フィルターのフィルター次数を 10 に減らします。
N = 10; LP_IIR = dsp.LowpassFilter('SampleRate',Fs,... 'FilterType','IIR',... 'DesignForMinimumOrder',false,... 'FilterOrder',N,... 'PassbandFrequency',Fp,... 'PassbandRipple',Ap,... 'StopbandAttenuation',Ast);
FIR と IIR の設計を比較します。2 つの実装のコストを計算します。
hfvt = fvtool(LP_FIR,LP_IIR,'Fs',Fs); legend(hfvt,'FIR Equiripple, N = 120',... 'IIR Elliptic, N = 10');
cost_FIR = cost(LP_FIR)
cost_FIR = struct with fields:
NumCoefficients: 121
NumStates: 120
MultiplicationsPerInputSample: 121
AdditionsPerInputSample: 120
cost_IIR = cost(LP_IIR)
cost_IIR = struct with fields:
NumCoefficients: 25
NumStates: 20
MultiplicationsPerInputSample: 25
AdditionsPerInputSample: 20
振幅応答は FIR フィルターと IIR フィルターで同様です。コストは IIR フィルターが FIR フィルターの約 1/6 になります。
IIR フィルターの実行
IIR フィルターは双二次フィルターとして設計されています。フィルターをデータに適用するには、FIR の場合と同じコマンドを使用します。
10 次 IIR ローパス フィルターを使用して、ゼロ平均と単位標準偏差をもつ 10 秒間のガウス ノイズを 256 サンプルのフレームでフィルター処理します。スペクトル アナライザーで結果を表示します。
SA_IIR = spectrumAnalyzer('SampleRate',Fs); tic while toc < 10 x = randn(256,1); y = LP_IIR(x); SA_IIR(y); end release(SA_IIR)
可変帯域幅の FIR フィルターと IIR フィルター
実行時にカットオフ周波数が変更可能なフィルターを設計することもできます。その場合は dsp.VariableBandwidthFIRFilter
と dsp.VariableBandwidthIIRFilter
を使用します。