メインコンテンツ

標準的 IIR フィルター設計

この例では、標準的 IIR フィルターの設計法を示します。この例では、最初に、重要な設計パラメーターがカットオフ周波数であるシナリオを考えます。フィルターのパワーは、カットオフ周波数においてノミナル通過帯域値の半分 (–3 dB) に減衰します。

次に、この例では、バタワース設計を同じ次数のチェビシェフ フィルターまたは楕円フィルターに置き換えて、フィルターの通過帯域や阻止帯域内のリップルをある程度犠牲にして急峻なロールオフを得る方法を示します。この例では、最小次数フィルター設計と調整可能なフィルターについても検討します。

ローパス フィルター

正規化されたカットオフ周波数が 0.4 の 8 次フィルターを設計します。最初に、可能な限り平坦なバタワース フィルターを設計します (通過帯域や阻止帯域にリップルはありません)。

N = 8; 
F3dB = .4;
Hbutter = designfilt('lowpassiir',FilterOrder=N,HalfPowerFrequency=F3dB,...
    DesignMethod='butter',SystemObject=true);

チェビシェフ I 型フィルターは、通過帯域でリップルをもち、阻止帯域でリップルをもちません。チェビシェフ I 型設計では、通過帯域のリップルを制御できます。通過帯域のリップルを大きくすると、急峻なロールオフが得られます。

0.5 dB のピーク間リップルをもつチェビシェフ I 型フィルターを設計します。

Ap = .5;
Hcheby1 = designfilt('lowpassiir',FilterOrder=N,HalfPowerFrequency=F3dB,...
    PassbandRipple=Ap,DesignMethod='cheby1',SystemObject=true);
hfvt = filterAnalyzer(Hbutter,Hcheby1);
setLegendStrings(hfvt,["Butterworth","Chebyshev Type I"]);

チェビシェフ II 型フィルターは、阻止帯域でリップルをもち、通過帯域でリップルをもちません。チェビシェフ II 型設計では、阻止帯域の減衰量を制御できます。阻止帯域の減衰量を小さくすると、急峻なロールオフが得られます。

80 dB の阻止帯域の減衰量をもつチェビシェフ II 型フィルターを設計します。

Ast = 80;
Hcheby2 = designfilt('lowpassiir',FilterOrder=N,HalfPowerFrequency=F3dB,...
    StopbandAttenuation=Ast,DesignMethod='cheby2',SystemObject=true);
hfvt = filterAnalyzer(Hbutter,Hcheby2);
setLegendStrings(hfvt,["Butterworth","Chebyshev Type II"]);

最後に、楕円フィルターは、阻止帯域と通過帯域の両方でリップルを使用できるので、前の設計と比較して急峻なロールオフを提供できます。このことを示すために、前の手順と同じ通過帯域と阻止帯域の特性を使用して楕円フィルターを設計します。

Hellip = designfilt('lowpassiir',FilterOrder=N,HalfPowerFrequency=F3dB,...
    PassbandRipple=Ap,StopbandAttenuation=Ast,DesignMethod='ellip',SystemObject=true);
hfvt = filterAnalyzer(Hbutter,Hcheby1,Hcheby2,Hellip);
setLegendStrings(hfvt, ...
    ["Butterworth","Chebyshev Type I","Chebyshev Type II","Elliptic"]);

通過帯域をズームインし、すべてのフィルターに同じ -3 dB 周波数点があること、およびバタワース設計とチェビシェフ II 型設計のみで完全に平坦な通過帯域があることを確認します。

位相の考慮事項

位相応答が設計上の問題である場合、バタワースおよびチェビシェフ タイプ II の歪みが小さい (群遅延が平坦である) ことに注意してください。前の手順で設計した 4 つのフィルターの群遅延応答を比較して、そのことを確認します。

opts = filterAnalysisOptions("groupdelay");
setAnalysisOptions(hfvt,opts);

最小次数設計

最小次数設計は、通過帯域、阻止帯域、および許容可能なリップルの振幅が完全に指定されている場合に適用されます。この場合、3 dB カットオフ周波数は重要ではありません。設計仕様を満たすのに必要な最小フィルター次数は、設計アルゴリズムによって自動的に導出されます。

最小次数の IIR フィルターを設計します。

Fp = .1; 
Fst = .3; 
Ap = 1;
Ast = 60;
Hbutter = designfilt('lowpassiir',PassbandFrequency=Fp,StopbandFrequency=Fst,...
    PassbandRipple=Ap,StopbandAttenuation=Ast,DesignMethod='butter',SystemObject=true);
Hcheby1 = designfilt('lowpassiir',PassbandFrequency=Fp,StopbandFrequency=Fst,...
    PassbandRipple=Ap,StopbandAttenuation=Ast,DesignMethod='cheby1',SystemObject=true);
Hcheby2 = designfilt('lowpassiir',PassbandFrequency=Fp,StopbandFrequency=Fst,...
    PassbandRipple=Ap,StopbandAttenuation=Ast,DesignMethod='cheby2',SystemObject=true);
Hellip = designfilt('lowpassiir',PassbandFrequency=Fp,StopbandFrequency=Fst,...
    PassbandRipple=Ap,StopbandAttenuation=Ast,DesignMethod='ellip',SystemObject=true);
hfvt = filterAnalyzer(Hbutter);
showSpecificationMask(hfvt,true);
addFilters(hfvt,Hcheby1,Hcheby2,Hellip);
setLegendStrings(hfvt,["Butterworth","Chebyshev Type I","Chebyshev Type II","Elliptic"]);

バタワース設計では 7 次のフィルターを適用することにより仕様を満たす必要がありますが、2 種類のチェビシェフ手法の場合は 5 次のフィルターで十分です。楕円設計では、必要なフィルター次数がさらに 4 まで減ります。

order(Hbutter)
ans = 
7
order(Hcheby1)
ans = 
5
order(Hcheby2)
ans = 
5
order(Hellip)
ans = 
4

通過帯域仕様または阻止帯域仕様の完全な一致

最小次数設計では、多くの場合、必要なすべてのフィルター仕様を超過し、ユーザーが実際に指定した場合と比較して、リップルと遷移幅が向上します。MatchExactly オプションを使用して、2 つの帯域のうち少なくとも 1 つで設計仕様が完全に一致するように制約します。既定では、チェビシェフ I 型設計のフィルター次数は、通過帯域で仕様を満たし、阻止帯域で仕様よりも大きくなります。バタワース設計とチェビシェフ II 型設計のフィルター次数は、阻止帯域で仕様を満たし、通過帯域で仕様よりも大きくなります。楕円フィルターの設計では、両方の帯域でターゲット減衰量の仕様を満たし、阻止帯域のエッジ周波数は仕様よりも大きくなります。

Hellipmin1 = designfilt('lowpassiir',PassbandFrequency=Fp,StopbandFrequency=Fst,...
    PassbandRipple=Ap,StopbandAttenuation=Ast,MatchExactly='passband',...
    DesignMethod='ellip',SystemObject=true);
Hellipmin2 = designfilt('lowpassiir',PassbandFrequency=Fp,StopbandFrequency=Fst,...
    PassbandRipple=Ap,StopbandAttenuation=Ast,MatchExactly='stopband',...
    DesignMethod='ellip',SystemObject=true);
hfvt = filterAnalyzer(Hellip);
showSpecificationMask(hfvt,true);
addFilters(hfvt, Hellipmin1, Hellipmin2);
setLegendStrings(hfvt,["Matched passband and stopband", ...
    "Matched passband", "Matched stopband"])

通過帯域でズームインし、通過帯域のエッジを比較します。両方の設計において一致する通過帯域の減衰は、通過帯域エッジ周波数 0.1 ラジアン/サンプルで正確に 1 dB です。

結果のフィルター次数が変化しないことを確認します。

order(Hellip)
ans = 
4
order(Hellipmin1)
ans = 
4
order(Hellipmin2)
ans = 
4

ハイパス、バンドパス、およびバンドストップ フィルター

前の手順の結果は、ハイパス、バンドパス、およびバンドストップ応答タイプに一般化できます。例として、3 つの最小次数バンドパス フィルターを設計します。

Hbutter = designfilt('bandpassiir',StopbandFrequency1=.35,PassbandFrequency1=.45,...
    PassbandFrequency2=.55,StopbandFrequency2=.65,StopbandAttenuation1=60,PassbandRipple=1,...
    StopbandAttenuation2=60,DesignMethod='butter',SystemObject=true);
Hcheby1 = designfilt('bandpassiir',StopbandFrequency1=.35,PassbandFrequency1=.45,...
    PassbandFrequency2=.55,StopbandFrequency2=.65,StopbandAttenuation1=60,PassbandRipple=1,...
    StopbandAttenuation2=60,DesignMethod='cheby1',SystemObject=true);
Hcheby2 = designfilt('bandpassiir',StopbandFrequency1=.35,PassbandFrequency1=.45,...
    PassbandFrequency2=.55,StopbandFrequency2=.65,StopbandAttenuation1=60,PassbandRipple=1,...
    StopbandAttenuation2=60,DesignMethod='cheby2',SystemObject=true);
Hellip = designfilt('bandpassiir',StopbandFrequency1=.35,PassbandFrequency1=.45,...
    PassbandFrequency2=.55,StopbandFrequency2=.65,StopbandAttenuation1=60,PassbandRipple=1,...
    StopbandAttenuation2=60,DesignMethod='ellip',SystemObject=true);
hfvt = filterAnalyzer(Hbutter);
showSpecificationMask(hfvt,true);
addFilters(hfvt,Hcheby1,Hcheby2,Hellip);
setLegendStrings(hfvt,...
    ["Butterworth","Chebyshev Type I","Chebyshev Type II","Elliptic"])

調整可能な IIR フィルター

シミュレーション中に IIR フィルターを調整するには、dsp.SOSFilterオブジェクトを作成し、CoefficientSource プロパティを 'Input port' に設定します。

sosFilt = dsp.SOSFilter;

designLowpassIIRdesignHighpassIIRdesignBandpassIIRdesignBandstopIIRなどの設計関数を使用して、それぞれローパス、ハイパス、バンドパス、バンドストップの IIR フィルターを設計できます。これらの関数を使用すると、設計されたフィルターを System object として返したり、フィルター係数を分子と分母の行列として返したりすることができます。シミュレーション中にフィルター係数を調整するには、設計関数を使用してフィルター係数を取得します。

designLowpassIIR 関数を使用して、フィルター次数 30、電力半値周波数 0.5 のローパス フィルターを設計し、取得したフィルター係数を sosFilt オブジェクトに設定します。

[b,a] = designLowpassIIR(FilterOrder=30,HalfPowerFrequency=0.5);
sosFilt.Numerator = b;
sosFilt.Denominator = a;
hfvt = filterAnalyzer(sosFilt);

spectrumAnalyzerオブジェクトを作成して、入力信号と出力信号のスペクトルを可視化します。

spectrumScope = spectrumAnalyzer(PlotAsTwoSidedSpectrum=false, ChannelNames=["Input Signal","Filtered Signal"]);

シミュレーション中に、フィルターの 3 dB カットオフ周波数を変化させます。designLowpassIIR 関数は、更新されたフィルター仕様に基づき係数を再設計します。これらの更新された係数を SOS フィルターに渡します。スペクトル アナライザーを使用して、入力信号とフィルター処理された信号のスペクトルを可視化します。

F3dB = 0.5;
for idx = 1:501
    if mod(idx,100)==0
        % Update filter specs once every 100 steps
        [b,a] = designLowpassIIR(FilterOrder=30,HalfPowerFrequency=F3dB,DesignMethod="butter");
        F3dB = F3dB + 0.05;
        sosFilt.Numerator = b;
        sosFilt.Denominator = a;
    end
    x = randn(1024,1);
    y = sosFilt(x);
    spectrumScope(x,y);     
end

参考

トピック