ドキュメンテーション

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

ローパス FIR フィルターの設計

この例では、ローパス FIR フィルターの設計法を示します。フィルター設計オブジェクト (fdesign) を使用して説明を進めます。

FIR フィルターは、高性能な設計アルゴリズム、非再帰的な形で実装された際の安定性、線形位相の得やすさ、マルチレート ケースへの簡単な拡張性、充実したハードウェア サポートなどにより、広く使用されています。この例では、さまざまな特性のローパス FIR フィルターの設計に使用できる DSP System Toolbox™ の機能を紹介します。ここで説明する多くの概念は、ハイパス、バンドパスなどの他の応答にも拡張できます。

簡単なローパス フィルターの設計

理想的なローパス フィルターには無限インパルス応答が必要です。インパルス応答の切り捨て (ウィンドウを使用) は、FIR フィルター設計のウィンドウ法となります。カットオフ周波数が 0.4*pi ラジアン/サンプルの単純なローパス フィルターの設計を考えてみます。

Fc    = 0.4;
N = 100;   % FIR filter order
Hf = fdesign.lowpass('N,Fc',N,Fc);

このローパス フィルターはウィンドウ法を使用して設計できます。たとえば、ハミング ウィンドウまたはドルフ・チェビシェフ ウィンドウを使用します。

Hd1 = design(Hf,'window','window',@hamming,'SystemObject',true);
Hd2 = design(Hf,'window','window',{@chebwin,50},'SystemObject',true);
hfvt = fvtool(Hd1,Hd2,'Color','White');
legend(hfvt,'Hamming window design','Dolph-Chebyshev window design')

フィルター次数の選択は任意でした。次数は無限が理想的なので、一般に、大きい次数の方が理想の近似値になりますが、実装がコスト高になります。たとえば、ドルフ・チェビシェフ ウィンドウで、次のようにフィルターの次数を増やして遷移領域を減らすことができます。

Hf.FilterOrder = 200;
Hd3 = design(Hf,'window','window',{@chebwin,50},'SystemObject',true);
hfvt = fvtool(Hd2,Hd3,'Color','White');
legend(hfvt,'Dolph-Chebyshev window design. Order = 100',...
    'Dolph-Chebyshev window design. Order = 200')

最小次数ローパス フィルターの設計

適したフィルター次数を判断するには、通過帯域リップルと阻止帯域の減衰の許容値を指定する必要があります。また、理想的なカットオフ周波数の周りの遷移領域の幅も指定する必要があります。後者は、通過帯域エッジ角周波数と阻止帯域エッジ角周波数を設定して指定します。この 2 つの差によって遷移幅が決まります。

Fp  = 0.38;
Fst = 0.42; % Fc = (Fp+Fst)/2;  Transition Width = Fst - Fp
Ap  = 0.06;
Ast = 60;
setspecs(Hf,'Fp,Fst,Ap,Ast',Fp,Fst,Ap,Ast);

ローパス フィルターの設計にもウィンドウ法をカイザー ウィンドウと共に使用できます。

Hd4 = design(Hf,'kaiserwin','SystemObject',true);
measure(Hd4)
 
ans =
 
Sample Rate      : N/A (normalized frequency)
Passband Edge    : 0.38                      
3-dB Point       : 0.39539                   
6-dB Point       : 0.4                       
Stopband Edge    : 0.42                      
Passband Ripple  : 0.016058 dB               
Stopband Atten.  : 60.092 dB                 
Transition Width : 0.04                      
 

1 つ留意することは、指定される遷移幅はカットオフ周波数 0.4 pi を中心とします。これは、ローパス フィルターのゲインが通過帯域ゲインの半分になる点 (またはフィルターが減衰 6 dB に達する点) になります。

最適な最小次数設計

カイザー ウィンドウ設計は最適な設計ではないため、この方法を使用して仕様を満たすために必要なフィルター次数は、必要以上に大きくなります。等リップル設計により、最低限の次数で仕様を満たすことができるローパス フィルターを得ることができます。

Hd5 = design(Hf,'equiripple','SystemObject',true);
hfvt = fvtool(Hd4,Hd5,'Color','White');
legend(hfvt,'Kaiser window design','Equiripple design')

この場合、カイザー ウィンドウ設計では係数が 183 必要ですが、等リップル設計では 146 です。

フィルター次数と通過帯域リップル/阻止帯域の減衰の制御

カスタム ハードウェアをターゲットとするとき、係数の数が一定数に制約される場合があります。このような場合は、結果のフィルター次数を制御できないため、最小次数設計は役に立ちません。たとえば、わずか 101 の係数を使用して、通過帯域リップル/阻止帯域の減衰の仕様を満たす必要があるとします。このような仕様では、まだ等リップル設計を使用できますが、増大する遷移幅を制御できなくなります。これは、通過帯域リップル/阻止帯域の減衰の仕様を維持しながら次数を減らすための代価です。

N = 100; % Order = 100 -> 101 coefficients
setspecs(Hf,'N,Fc,Ap,Ast',N,Fc,Ap,Ast);
Hd6 = design(Hf,'equiripple','SystemObject',true);
measure(Hd6)
hfvt = fvtool(Hd5,Hd6,'Color','White');
legend(hfvt,...
    'Equiripple design, 146 coefficients',...
    'Equiripple design, 101 coefficients')
 
ans =
 
Sample Rate      : N/A (normalized frequency)
Passband Edge    : 0.37316                   
3-dB Point       : 0.39285                   
6-dB Point       : 0.4                       
Stopband Edge    : 0.43134                   
Passband Ripple  : 0.06 dB                   
Stopband Atten.  : 60 dB                     
Transition Width : 0.058177                  
 

遷移幅が 50% 近く増えていることに注目してください。係数の数 101 と 146 にほぼ 50% の差があると考えると、驚くにはあたりません。

遷移領域幅の制御

係数の数を設定するときに、通過帯域リップル/阻止帯域の減衰を制御することで遷移幅を維持するという選択肢もあります。

setspecs(Hf,'N,Fp,Fst',N,Fp,Fst);
Hd7 = design(Hf,'equiripple','SystemObject',true);
measure(Hd7)
hfvt = fvtool(Hd5,Hd7,'Color','White');
legend(hfvt,...
    'Equiripple design, 146 coefficients',...
    'Equiripple design, 101 coefficients')
 
ans =
 
Sample Rate      : N/A (normalized frequency)
Passband Edge    : 0.38                      
3-dB Point       : 0.39407                   
6-dB Point       : 0.4                       
Stopband Edge    : 0.42                      
Passband Ripple  : 0.1651 dB                 
Stopband Atten.  : 40.4369 dB                
Transition Width : 0.04                      
 

この場合は、使用する係数 146 と 101 の差が、通過帯域リップルの増大と阻止帯域の減衰の減少に反映されます。

重みを使用すると、同じフィルター次数と遷移幅を維持しながら、阻止帯域の減衰を増やすことが可能です。重みは、通過帯域リップルと阻止帯域の減衰の相対的な重要性を指定する方法です。既定の設定では、通過帯域と阻止帯域は同等の重み付けがされています (それぞれに重み 1 が指定されます)。阻止帯域の重みを増やすと、阻止帯域の減衰を増やすことができますが、阻止帯域リップルも増えてしまいます。

Hd8 = design(Hf,'equiripple','Wstop',5,'SystemObject',true);
measure(Hd8)
hfvt = fvtool(Hd7,Hd8,'Color','White');
legend(hfvt,...
    'Passband weight = 1; Stopband weight = 1',...
    'Passband weight = 1, Stopband weight = 5')
 
ans =
 
Sample Rate      : N/A (normalized frequency)
Passband Edge    : 0.38                      
3-dB Point       : 0.39143                   
6-dB Point       : 0.39722                   
Stopband Edge    : 0.42                      
Passband Ripple  : 0.34529 dB                
Stopband Atten.  : 48.0068 dB                
Transition Width : 0.04                      
 

もう一つの可能性は、必要な阻止帯域の減衰を正確に指定し、通過帯域リップルの制御を失うことです。これは強力で理想的な指定です。対象となるほとんどのパラメーターを制御できます。

setspecs(Hf,'N,Fp,Fst,Ast',N,Fp,Fst,Ast);
Hd9 = design(Hf,'equiripple','SystemObject',true);
hfvt = fvtool(Hd8,Hd9,'Color','White');
legend(hfvt,...
    'Equiripple design using weights',...
    'Equiripple design constraining the stopband')

最適な非等リップル ローパス フィルター

等リップル設計は、理想的な応答からの標準偏差を均等に分散して最適化を達成します。これは最大偏差 (リップル) を最小限にするという利点がありますが、そのエネルギー面から測定した全体的な偏差が大きくなる傾向があります。これは常に望ましいとは限りません。信号をローパス フィルターする場合、これは阻止帯域の信号の残留エネルギーが比較的大きい可能性を示唆しています。これが問題になる場合は、阻止帯域のエネルギーを最小限にする最適な設計を提供するのが最小二乗法です。

setspecs(Hf,'N,Fp,Fst',N,Fp,Fst);
Hd10 = design(Hf,'firls','SystemObject',true);
hfvt = fvtool(Hd7,Hd10,'Color','White');
legend(hfvt,'Equiripple design','Least-squares design')

最小二乗法設計では阻止帯域の減衰が周波数に比例して増えますが、等リップル設計では一定です。最小二乗法の場合、増大した減衰は、フィルターされる信号のその帯域のエネルギーを最小化します。

阻止帯域の減衰が増大する等リップル設計

最小二乗法設計の望ましくない結果として、エッジ近くの通過帯域のリップルが大きくなる傾向があることです。ローパス フィルター全般では、フィルターする信号の通過帯域周波数への影響ができるだけ少ない方が望ましいとされています。この点で、通常は等リップル通過帯域が推奨されます。阻止帯域で減衰を増やす必要がある場合は、等リップル設計の設計オプションを使用してこれを達成できます。

Hd11 = design(Hf,'equiripple','StopbandShape','1/f','StopbandDecay',4,...
    'SystemObject',true);
hfvt = fvtool(Hd10,Hd11,'Color','White');
legend(hfvt,'Least-squares design',...
    'Equiripple design with stopband decaying as (1/f)^4')

阻止帯域はよく似ていますが、等リップル設計では通過帯域リップルが遥かに小さいことがわかります。

mls = measure(Hd10);
meq = measure(Hd11);
mls.Apass
meq.Apass
ans =

    0.3504


ans =

    0.1867

阻止帯域が (1/f)^M として減衰するフィルターは、1 オクターブで 6M dB 減衰します。阻止帯域を決定するもう一つの方法は、線形減衰の使用です。たとえば、減衰が 0.4*pi で約 38 dB とします。pi で 70 dB の減衰が望ましい場合に、線形減衰を使用すると、線の傾きは (70-38)/(1-0.4) = 53.333 で指定します。このような設計は次のように達成できます。

Hd12 = design(Hf,'equiripple','StopbandShape','linear',...
    'StopbandDecay',53.333,'SystemObject',true);
hfvt = fvtool(Hd11,Hd12,'Color','White');
legend(hfvt,...
 'Equiripple design with stopband decaying as (1/f)^4',...
 'Equiripple design with stopband decaying linearly and a slope of 53.333')

さらに別の可能性として、任意の振幅仕様を使用して 2 つの帯域を選択する (1 つは通過帯域用、もう一つは阻止帯域用) 方法があります。次に、2 番目の帯域の重みを使用すると、帯域全体の減衰を増大できます。この設計やその他の任意振幅設計の詳細は、「任意振幅フィルター設計」を参照してください。

N = 100;
B = 2; % Number of bands
F = [0 .38 .42:.02:1];
A = [1 1 zeros(1,length(F)-2)];
W = linspace(1,100,length(F)-2);
Harb = fdesign.arbmag('N,B,F,A',N,B,F(1:2),A(1:2),F(3:end),A(3:end));
Ha = design(Harb,'equiripple','B2Weights',W,'SystemObject',true);
hfvt = fvtool(Ha,'Color','White');

最小位相ローパス フィルターの設計

ここまでは、線形位相設計のみを考慮しました。線形位相は多くの用途に適しています。言うまでもなく、線形位相が必要条件でない場合は、最小位相設計の方が線形位相設計よりも大幅な改善を期待できます。たとえば、最小次数の事例に戻ると、同じ仕様の最小位相/最小次数設計は次のように計算できます。

setspecs(Hf,'Fp,Fst,Ap,Ast',Fp,Fst,Ap,Ast);
Hd13 =  design(Hf,'equiripple','minphase',true,'SystemObject',true);
hfvt = fvtool(Hd5,Hd13,'Color','White');
legend(hfvt,...
    'Linear-phase equiripple design',...
    'Minimum-phase equiripple design')

係数の数が 146 から 117 に減っています。もう一つの例として、阻止帯域が線形に減衰する設計を考えてみましょう。阻止帯域の減衰が増えていることがわかります。通過帯域のリップルも遥かに小さくなっています。

Hd14 = design(Hf,'equiripple','StopbandShape','linear',...
    'StopbandDecay',53.333,'minphase',true,'SystemObject',true);
hfvt = fvtool(Hd12,Hd14,'Color','White');
legend(hfvt,...
    'Linear-phase equiripple design with linearly decaying stopband',...
    'Minimum-phase equiripple design with linearly decaying stopband')

多段手法を使用した最小次数ローパス フィルターの設計

最小位相設計に関連しない係数の数を最小化する別の方法に、多段法の使用があります。ここでは内挿 FIR (IFIR) 法を紹介します。詳細は、「遷移帯域が狭い FIR フィルターの効率的な設計」を参照してください。

マルチレートの用途向けローパス フィルターの設計

ローパス フィルターは間引きや内挿の設計に広く用いられています。この設計および効率的な実装となる多段法の「間引き/内挿の多段設計」の詳細は、「間引き/内挿の多段設計」を参照してください。

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