Main Content

フィルター設計ギャラリー

この例では、Signal Processing Toolbox® 製品の関数 designfilt を使用する、さまざまな FIR および IIR デジタル フィルターの設計法を説明します。

ギャラリーは、対象となるフィルター応答を特定し、コードを表示して独自のプロジェクトで使用できるように設計されています。ここには designfilt が提供する利用可能なフィルター応答のそれぞれについての例が含まれています。ただし、これらは、各応答タイプに対応するフィルターを設計する方法として可能なもののごく一部であることを留意してください。仕様セットを網羅したリストについては、Signal Processing Toolbox のドキュメンテーションを参照してください。

この例では、特に注意書きがなければ、周波数の単位はいずれも Hz で、すべてのリップルと減衰の値の単位はデシベルです。

ローパス FIR フィルター

等リップル設計

Fpass = 100;
Fstop = 150;
Apass = 1;
Astop = 65;
Fs = 1e3;
d1 = designfilt("lowpassfir", ...
    PassbandFrequency=Fpass, ...
    StopbandFrequency=Fstop, ...
    PassbandRipple=Apass, ...
    StopbandAttenuation=Astop, ...
    DesignMethod="equiripple", ...
    SampleRate=Fs);
filterAnalyzer(d1)

ローパス IIR フィルター

最大フラット設計

Fpass = 100;
Fstop = 150;
Apass = 0.5;
Astop = 65;
Fs = 1e3;
d2 = designfilt("lowpassiir", ...
    PassbandFrequency=Fpass, ...
    StopbandFrequency=Fstop, ...
    PassbandRipple=Apass, ...
    StopbandAttenuation=Astop, ...
    DesignMethod="butter", ...
    SampleRate=Fs);
filterAnalyzer(d2)

通過帯域および阻止帯域のリップル

N = 8;
Fpass = 100;
Apass = 0.5;
Astop = 65;
Fs = 1e3;
d3 = designfilt("lowpassiir", ...
    FilterOrder=N, ...
    PassbandFrequency=Fpass, ...
    PassbandRipple=Apass, ...
    StopbandAttenuation=Astop, ...
    SampleRate=Fs);
filterAnalyzer(d3)

ハイパス FIR フィルター

等リップル設計

Fstop = 350;
Fpass = 400;
Astop = 65;
Apass = 0.5;
Fs = 1e3;
d4 = designfilt("highpassfir", ...
    StopbandFrequency=Fstop, ...
    PassbandFrequency=Fpass, ...
    StopbandAttenuation=Astop, ...
    PassbandRipple=Apass, ...
    DesignMethod="equiripple", ...
    SampleRate=Fs);
filterAnalyzer(d4)

ハイパス IIR フィルター

最大フラット設計

Fstop = 350;
Fpass = 400;
Astop = 65;
Apass = 0.5;
Fs = 1e3;
d5 = designfilt("highpassiir", ...
    StopbandFrequency=Fstop ,...
    PassbandFrequency=Fpass, ...
    StopbandAttenuation=Astop, ...
    PassbandRipple=Apass, ...
    DesignMethod="butter", ...
    SampleRate=Fs);
filterAnalyzer(d5)

通過帯域および阻止帯域のリップル

N = 8;
Fpass = 400;
Astop = 65;
Apass = 0.5;
Fs = 1e3;
d6 = designfilt("highpassiir", ...
    FilterOrder=N, ...
    PassbandFrequency=Fpass, ...
    StopbandAttenuation=Astop, ...
    PassbandRipple=Apass, ...
    SampleRate=Fs);
filterAnalyzer(d6)

バンドパス FIR フィルター

等リップル設計

Fstop1 = 150;
Fpass1 = 200;
Fpass2 = 300;
Fstop2 = 350;
Astop1 = 65;
Apass  = 0.5;
Astop2 = 65;
Fs = 1e3;
d7 = designfilt("bandpassfir", ...
    StopbandFrequency1=Fstop1, ...
    PassbandFrequency1=Fpass1, ...
    PassbandFrequency2=Fpass2, ...
    StopbandFrequency2=Fstop2, ...
    StopbandAttenuation1=Astop1, ...
    PassbandRipple=Apass, ...
    StopbandAttenuation2=Astop2, ...
    DesignMethod="equiripple", ...
    SampleRate=Fs);
filterAnalyzer(d7)

非対称バンド減衰

N = 50;
Fstop1 = 150;
Fpass1 = 200;
Fpass2 = 300;
Fstop2 = 350;
Wstop1 = 3;
Wstop2 = 100;
Fs = 1e3;
d8 = designfilt("bandpassfir", ...
    FilterOrder=N, ...
    StopbandFrequency1=Fstop1, ...
    PassbandFrequency1=Fpass1, ...
    PassbandFrequency2=Fpass2, ...
    StopbandFrequency2=Fstop2, ...
    StopbandWeight1=Wstop1,StopbandWeight2=Wstop2, ...
    DesignMethod="equiripple",SampleRate=Fs);
filterAnalyzer(d8)

バンドパス IIR フィルター

最大フラット設計

Fstop1 = 150;
Fpass1 = 200;
Fpass2 = 300;
Fstop2 = 350;
Astop1 = 65;
Apass  = 0.5;
Astop2 = 65;
Fs = 1e3;
d9 = designfilt("bandpassiir", ...
    StopbandFrequency1=Fstop1, ...
    PassbandFrequency1=Fpass1, ...
    PassbandFrequency2=Fpass2, ...
    StopbandFrequency2=Fstop2, ...
    StopbandAttenuation1=Astop1, ...
    PassbandRipple=Apass, ...
    StopbandAttenuation2=Astop2, ...
    DesignMethod="butter", ...
    SampleRate=Fs);
filterAnalyzer(d9)

通過帯域および阻止帯域のリップル

N = 8;
Fpass1 = 200;
Fpass2 = 300;
Astop1 = 65;
Apass  = 0.5;
Astop2 = 65;
Fs = 1e3;
d10 = designfilt("bandpassiir", ...
    FilterOrder=N, ...
    PassbandFrequency1=Fpass1, ...
    PassbandFrequency2=Fpass2, ...
    StopbandAttenuation1=Astop1, ...
    PassbandRipple=Apass, ...
    StopbandAttenuation2=Astop2, ...
    SampleRate=Fs);
filterAnalyzer(d10)

バンドストップ FIR フィルター

等リップル設計

Fpass1 = 100;
Fstop1 = 150;
Fstop2 = 350;
Fpass2 = 400;
Apass1 = 0.5;
Astop  = 65;
Apass2 = 0.5;
Fs = 1e3;
d11 = designfilt("bandstopfir", ...
    PassbandFrequency1=Fpass1, ...
    StopbandFrequency1=Fstop1, ...
    StopbandFrequency2=Fstop2, ...
    PassbandFrequency2=Fpass2, ...
    PassbandRipple1=Apass1, ...
    StopbandAttenuation=Astop, ...
    PassbandRipple2=Apass2, ...
    DesignMethod="equiripple", ...
    SampleRate=Fs);
filterAnalyzer(d11)

非対称通過帯域リップル

N = 30;
Fpass1 = 100;
Fstop1 = 150;
Fstop2 = 350;
Fpass2 = 400;
Wpass1 = 1;
Wpass2  = 10;
Fs = 1e3;
d12 = designfilt("bandstopfir", ...
    FilterOrder=N, ...
    PassbandFrequency1=Fpass1, ...
    StopbandFrequency1=Fstop1, ...
    StopbandFrequency2=Fstop2, ...
    PassbandFrequency2=Fpass2, ...
    PassbandWeight1=Wpass1, ...
    PassbandWeight2=Wpass2, ...
    DesignMethod="equiripple", ...
    SampleRate=Fs);
filterAnalyzer(d12)

バンドストップ IIR フィルター

最大フラット設計

Fpass1 = 100;
Fstop1 = 150;
Fstop2 = 350;
Fpass2 = 400;
Apass1 = 0.5;
Astop  = 65;
Apass2 = 0.5;
Fs = 1e3;
d13 = designfilt("bandstopiir", ...
    PassbandFrequency1=Fpass1, ...
    StopbandFrequency1=Fstop1, ...
    StopbandFrequency2=Fstop2, ...
    PassbandFrequency2=Fpass2, ...
    PassbandRipple1=Apass1, ...
    StopbandAttenuation=Astop, ...
    PassbandRipple2=Apass2, ...
    DesignMethod="butter", ...
    SampleRate=Fs);
filterAnalyzer(d13)

通過帯域および阻止帯域のリップル

N = 8;
Fpass1 = 125;
Fpass2 = 375;
Apass = 0.5;
Astop  = 65;
Fs = 1e3;
d14 = designfilt("bandstopiir", ...
    FilterOrder=N, ...
    PassbandFrequency1=Fpass1, ...
    PassbandFrequency2=Fpass2, ...
    PassbandRipple=Apass, ...
    StopbandAttenuation=Astop, ...
    SampleRate=Fs);
filterAnalyzer(d14)

任意振幅 FIR フィルター

シングルバンド任意振幅設計

N = 300;
% Frequencies are in normalized units
F1 = 0:0.01:0.18;
F2 = [0.2 0.38 0.4 0.55 0.562 0.585 0.6 0.78];
F3 = 0.79:0.01:1;
FreqVect = [F1 F2 F3]; % vector of frequencies
% Define desired response using linear units
A1 = 0.5+sin(2*pi*7.5*F1)/4;    % Sinusoidal section
A2 = [0.5 2.3 1 1 -0.2 -0.2 1 1]; % Piece-wise linear section
A3 = 0.2+18*(1-F3).^2;          % Quadratic section
AmpVect = [A1 A2 A3];
d15 = designfilt("arbmagfir",...
    FilterOrder=N, ...
    Amplitudes=AmpVect, ...
    Frequencies=FreqVect,...
    DesignMethod="freqsamp");
filterAnalyzer(d15,MagnitudeMode="zerophase")

阻止帯域で階段状に減衰するマルチバンド ローパス設計

N = 150;
B = 2; % Number of bands
% Frequencies are in normalized units
F1 = [0 0.25]; % Passband
F2 = [0.3 0.4 0.401 0.5 0.501 0.6 0.601 0.7 0.701 0.8 0.801 0.9 0.901 1]; % Stopband
A1 = ones(size(F1));  % Desired amplitudes for band 1 in linear units
A2 = zeros(size(F2)); % Desired amplitudes for band 2 in linear units
% Vector of weights
W = 10.^([0 0 5 5 10 10 15 15 20 20 25 25 30 30 35 35]/20);
W1 = W(1:2);   % Weights for band 1
W2 = W(3:end); % Weights for band 2
d16 = designfilt("arbmagfir", ...
    FilterOrder=N, ...
    NumBands=B, ...
    BandFrequencies1=F1, ...
    BandAmplitudes1=A1, ...
    BandFrequencies2=F2, ...
    BandAmplitudes2=A2, ...
    BandWeights1=W1, ...
    BandWeights2=W2);
filterAnalyzer(d16)

微分器 FIR フィルター

フル バンド設計

N = 41;
Fs = 1e3;
d17 = designfilt("differentiatorfir", ...
    FilterOrder=N, ...
    DesignMethod="equiripple", ...
    SampleRate=Fs);
filterAnalyzer(d17,MagnitudeMode="zerophase",OverlayAnalysis="phase")

部分バンド設計

N = 40;
Fpass = 100;
Fstop = 150;
Fs = 1e3;
d18 = designfilt("differentiatorfir", ...
    FilterOrder=N, ...
    PassbandFrequency=Fpass, ...
    StopbandFrequency=Fstop, ...
    DesignMethod="equiripple", ...
    SampleRate=Fs);
filterAnalyzer(d18,MagnitudeMode="zerophase",OverlayAnalysis="phase")

ヒルベルト FIR フィルター

等リップル設計

N = 40;
Tw = 50;
Fs = 1e3;
d19 = designfilt("hilbertfir", ...
    FilterOrder=N, ...
    TransitionWidth=Tw, ...
    DesignMethod="equiripple", ...
    SampleRate=Fs);
filterAnalyzer(d19,MagnitudeMode="zerophase",OverlayAnalysis="phase")

参考

|