Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ミニマックス FIR フィルターの設計

この例では、一般化された Remez FIR フィルター設計関数の主要機能のいくつかの使い方を示します。この関数は、firpm に含まれているすべての機能に加え、ここに示す多くの追加機能を提供します。

重み付きチェビシェフ設計

以下は、重み付きチェビシェフ設計を示したものです。この例は、firpm との firgr の互換性を示しています。

N = 22;             % Filter order
F = [0 0.4 0.5 1];  % Frequency vector
A = [1 1 0 0];      % Magnitude vector
W = [1 5];          % Weight vector
b = firgr(N,F,A,W);
fvtool(b,1)

以下は、タイプ 4 フィルター (奇数次数、非対称) が明示的に指定されている重み付きチェビシェフ設計です。

N = 21;             % Filter order
F = [0 0.4 0.5 1];  % Frequency vector
A = [0 0 1 1];      % Magnitude vector
W = [2 1];          % Weight vector
b = firgr(N,F,A,W,'4');
fvtool(b,1)

"最小二乗法類似" 設計

以下は、"最小二乗類似" 設計を示しています。ユーザーが指定した周波数応答関数 (taperedresp.m) を使用して誤差の重みが付けられます。

N = 53;                                  % Filter order
F = [0 0.3 0.33 0.77 0.8 1];             % Frequency vector
fresp = {@taperedresp, [0 0 1 1 0 0]};  % Frequency response function
W = [2 2 1];                             % Weight vector
b = firgr(N,F,fresp,W);
fvtool(b,1)

特定の単一点帯域に対して設計されたフィルター

これは、指定された単一点帯域に対して設計されたフィルターを示したものです。周波数点 f = 0.25 および f = 0.55 は、単一帯域点です。これらの点にはゼロに近づくゲインがあります。

他の帯域エッジは正規です。

N = 42;                               % Filter order
F = [0 0.2 0.25 0.3 0.5 0.55 0.6 1];  % Frequency vector
A = [1 1 0 1 1 0 1 1];                % Magnitude vector
S = {'n' 'n' 's' 'n' 'n' 's' 'n' 'n'};
b = firgr(N,F,A,S);
fvtool(b,1)

特定の帯域内値に対して設計されたフィルター

これは、指定された帯域内値に対して設計されたフィルターを示したものです。値は、f = 0.06 に指定されている値 0.0 に強制的に設定されます。

これは、60 Hz の除去に使用できます (Fs = 2 kHz)。0.055 における帯域エッジは次の帯域に接触するので不定です。

N = 82;                         % Filter order
F = [0 0.055 0.06 0.1 0.15 1];  % Frequency vector
A = [0 0 0 0 1 1];              % Magnitude vector
S = {'n' 'i' 'f' 'n' 'n' 'n'};
b = firgr(N,F,A,S);
zerophase(b,1)

特定の複数の独立した近似誤差を使用したフィルター設計

これは、複数の独立した近似誤差を使用したフィルターの設計例です。この手法は、エクストラリップル フィルターや最大リップル フィルターを直接設計するために使用されます。これらのフィルターの特徴として、局所的に最小な遷移領域幅の存在があります。さらに、これらの設計は一般的に非常にすばやく収束します。

N = 12;             % Filter order
F = [0 0.4 0.5 1];  % Frequency vector
A = [1 1 0 0];      % Magnitude vector
W = [1 1];          % Weight vector
E = {'e1' 'e2'};    % Approximation errors
b = firgr(N,F,A,W,E);
fvtool(b,1)

エクストラリップル バンドパス フィルター

これは、2 つの独立した近似誤差をもつエクストラリップル バンドパス フィルターを示したものです。1 つの近似誤差は 2 つの通過帯域によって共有されており、もう 1 つは阻止帯域 (青) 用です。比較のため、標準の重み付きチェビシェフ設計もプロットされています (緑)。

N = 28;                     % Filter order
F = [0 0.4 0.5 0.7 0.8 1];  % Frequency vector
A = [1 1 0 0 1 1];          % Magnitude vector
W = [1 1 2];                % Weight vector
E = {'e1','e2','e1'};       % Approximation errors
b1 = firgr(N,F,A,W,E);
b2 = firgr(N,F,A,W);
fvtool(b1,1,b2,1)

3 つの独立した誤差を使用した帯域内ゼロ フィルターの設計

ここでは、3 つの独立した誤差を使用して帯域内ゼロの例を再設計します。

メモ: 強制された帯域内値をもつ設計を収束させるには、独立した近似誤差の使用が必要になる場合があります。そうしないと、多項式の近似が非常に劣決定になるためです。前者の設計は緑で表示されています。

N = 82;                         % Filter order
F = [0 0.055 0.06 0.1 0.15 1];  % Frequency vector
A = [0 0 0 0 1 1];              % Magnitude vector
S = {'n' 'i' 'f' 'n' 'n' 'n'};
W = [10 1 1];                   % Weight vector
E = {'e1' 'e2' 'e3'};           % Approximation errors
b1 = firgr(N,F,A,S,W,E);
b2 = firgr(N,F,A,S);
fvtool(b1,1,b2,1)

遷移領域異常の確認

'check' オプションを使用すると、設計中のフィルターの遷移領域に異常がある可能性に気付くことができます。ここでは、異常のあるフィルター例を示しています。'check' オプションは、この異常のいずれかを警告します。結果としてベクトル res.edgeCheck も得られます。このベクトル内のゼロの値の要素は、異常の可能性がある位置を示しています。"-1" のエントリは、確認されなかったエッジに対するものです (f = 0 または f = 1 での異常はあり得ません)。

N = 44;                     % Filter order
F = [0 0.3 0.4 0.6 0.8 1];  % Frequency vector
A = [1 1 0 0 1 1];          % Magnitude vector
b = firgr(N,F,A,'check');
Warning: Probable transition-region anomalies.  Verify with freqz.
fvtool(b,1)

最小フィルター次数の判断

firpm アルゴリズムは、仕様を満たす最初の反復に到達するまで繰り返しフィルターを設計します。仕様は、必要な制約をすべて満足したときに満たされます。'minorder' を指定すると、firpmord を使用して初期推定が求められます。最小、偶数次数または最小、奇数次数フィルター設計をそれぞれ取得するための 'mineven''minodd' も用意されています。

F = [0 0.4 0.5 1];  % Frequency vector
A = [1 1 0 0];      % Magnitude vector
R = [0.1 0.02];     % Deviation (ripple) vector
b = firgr('minorder',F,A,R);
zerophase(b,1)

微分器とヒルベルト変換器

最小次数機能を使用する場合は、フィルター次数の初期推定を行うことができます。その場合、firpmord は使用されません。これは、微分器やヒルベルト変換器などの、firpmord がサポートしていないフィルターや、ユーザーの指定した周波数応答関数に必要になります。

N = {'mineven',18}; % Minimum even-order, start order estimate at 18
F = [0.1 0.9];      % Frequency vector
A = [1 1];          % Magnitude vector
R = 0.1;            % Deviation (ripple)
b = firgr(N,F,A,R,'hilbert');
freqz(b,1,'whole')

内挿フィルターの設計

この節では、内挿フィルターを使用して、帯域制限された信号を整数係数によってアップサンプリングする例を示します。通常、この目的には Signal Processing Toolbox™ の intfilt(r,l,alpha) を使用します。ただし intfilt には firgr のような柔軟性が設計にもたらされません。

N = 30;                     % Filter order
F = [0 0.1 0.4 0.6 0.9 1];  % Frequency vector
A = [4 4 0 0 0 0];          % Magnitude vector
W = [1 100 100];            % Weight vector
b = firgr(N,F,A,W);
fvtool(b,1)

firpmintfilt の比較

ここでは、firpm を使用して設計されたフィルター (青) と intfilt を使用して設計された 30 次のフィルター (緑) の比較を示しています。

firpm で重み付き関数を使用することで、最小の阻止帯域の減衰量を 20 dB 近く改善できることに注目してください。

b2 = intfilt(4, 4, 0.4);
fvtool(b,1,b2,1)

ここで、2 番目の阻止帯域の等リップル減衰は、intfilt を使用して設計されたフィルターの最小の阻止帯域の減衰量よりも約 6 dB 大きいことに注目してください。また、通過帯域リップルは、intfilt を使用して設計されたフィルターのリップルよりは大きいですが、それでも非常に小さいことにも注目してください。

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

ここでは最小位相ローパス フィルターを示しています。

N = 42;             % Filter order
F = [0 0.4 0.5 1];  % Frequency vector
A = [1 1 0 0];      % Magnitude vector
W = [1 10];        % Weight-constraint vector
b = firgr(N,F,A,W, {64},'minphase');

極/零点プロットは、単位円の外部にルートがないことを示しています。

zplane(b,1)