Main Content

MATLAB でのローパス フィルター設計

この例では、ローパス フィルターの設計法を示します。DSP System Toolbox™ の最も一般的に使用されるいくつかのコマンド ライン ツールを紹介します。ここで示す設計は、いずれもフィルター ビルダー アプリを使用して実装することもできます。その他の設計オプションについては、ローパス FIR フィルターの設計を参照してください。

はじめに

ローパス フィルターを設計するときは、最初に FIR フィルターと IIR フィルターのどちらを設計するかを決めます。一般に、位相応答の線形性が重要な場合は FIR フィルターを選択します。FIR フィルターは、一般に量子化の影響に対するロバスト性に優れているため、固定小数点の実装にもよく使用される傾向にあります。また、FIR フィルターはパイプライン化に適しているため、FPGA や ASIC などの多くの高速な実装にも使用されています。IIR フィルター (特に双二次フィルター) は、位相の線形性が問題にならないアプリケーション (オーディオ信号処理など) で使用されます。IIR フィルターは、通常、設計仕様を FIR フィルターよりも少ない係数で満たせるという点で計算効率に優れています。また、IIR フィルターには、過渡応答が短く、群遅延が小さいという傾向もあります。ただし、最小位相のマルチレートの設計を使用すれば、群遅延や計算効率の点で FIR フィルターも IIR フィルターと同等になります。

FIR ローパス設計 - フィルター次数の指定

実際の状況においては、フィルター次数を指定しなければならないことがよくあります。たとえば、ターゲットのハードウェアでフィルター次数が特定の数に制約されている場合があります。また、実装に使用できる計算の割り当て (MIPS) を計算した結果、フィルター次数が制限される場合もよくあります。Signal Processing Toolbox の FIR 設計関数 (fir1firpmfirls) では、いずれも指定した次数のローパス フィルターを設計できます。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)

Figure Figure 1: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB), xlabel Frequency (kHz), ylabel Magnitude (dB) contains an object of type line.

結果の阻止帯域エッジ周波数は約 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')

Figure Figure 2: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB), xlabel Frequency (kHz), ylabel Magnitude (dB) contains 2 objects of type line. These objects represent 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 および firgrdsp.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);

Figure Figure 3: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB), xlabel Frequency (kHz), ylabel Magnitude (dB) contains 2 objects of type line.

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');

Figure Figure 4: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB), xlabel Frequency (kHz), ylabel Magnitude (dB) contains 2 objects of type line. These objects represent 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.VariableBandwidthFIRFilterdsp.VariableBandwidthIIRFilter を使用します。

関連するトピック