Main Content

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

FIR フィルターの設計

FIR フィルターと IIR フィルター

有限時間のインパルス応答をもつデジタル フィルター (全零、または FIR フィルター) は、無限時間のインパルス応答 (IIR) フィルターと比較した場合、利点と欠点の両方をもっています。

FIR フィルターには、主に次のような利点があります。

  • 厳密な線形位相をもつことができる

  • 常に安定している

  • 設計法が一般に線形である

  • ハードウェアで効率的に実現できる

  • フィルター処理を開始する際の過渡時間が有限である

FIR フィルターの主な欠点は、与えられた性能レベルを達成するために、IIR フィルターよりはるかに高い次数を必要とする場合が多いことです。そのため FIR フィルターの遅延が同等の性能をもつ IIR フィルターよりも大きいことがしばしばあります。

FIR フィルターの概要

FIR フィルター

フィルター設計法

説明

フィルター関数

ウィンドウ処理

指定した「急峻な特性」をもつフィルターを逆フーリエ変換して切り取ったものに、ウィンドウを適用

fir1, fir2, kaiserord

遷移帯付きマルチバンド

周波数範囲の部分的な範囲に渡り、等リップルまたは最小二乗法を使用

firls, firpm, firpmord

条件付き最小二乗法

最大誤差に関する制約のもとで、周波数範囲全体に渡たる積分誤差の二乗を最小化

fircls, fircls1

任意応答法

非線形位相や複素フィルターを含む任意応答

cfirpm

レイズド コサイン

滑らかな正弦波遷移を伴うローパス応答

rcosdesign

線形位相フィルター

cfirpm を除き、すべての FIR フィルター設計関数では、線形位相フィルターのみが設計されます。このようなフィルター係数、すなわち "タップ" は、偶対称または奇対称の関係に従います。この対称性や、フィルターの次数 n が偶数か奇数かに応じて、長さ n+1 のベクトル b に格納される線形位相フィルターは、その周波数応答で特定の固有の制限をもちます。

線形位相フィルター タイプフィルター次数 係数の対称性f = 0 での応答 H(f)f = 1 (ナイキスト) での応答 H(f)

I 型

偶数

偶数:

b(k)=b(n+2k),k=1,...,n+1

制約なし

制約なし

II 型

奇数

偶数:

b(k)=b(n+2k),k=1,...,n+1

制約なし

H(1) = 0

III 型

偶数

奇数:

b(k)=b(n+2k),k=1,...,n+1

H(0) = 0

H(1) = 0

IV 型

奇数

奇数:

b(k)=b(n+2k),k=1,...,n+1

H(0) = 0

制約なし

線形位相 FIR フィルターの位相遅延および群遅延は、周波数帯全体に渡り等しく、かつ一定です。n 次線形位相 FIR フィルターの場合、群遅延は n/2 であり、フィルター処理した信号は、単に n/2 タイム ステップ遅れます (また、フーリエ変換の振幅は、フィルターの振幅応答でスケーリングされます)。この特性により、通過帯域内で信号の波形が保持されます。つまり、位相歪みは生じません。

関数 fir1fir2firlsfirpmfircls および fircls1 はいずれも、既定で I 型および II 型の線形位相 FIR フィルターを設計します。rcosdesign は I 型のフィルターのみを設計します。firlsfirpm はともに、'hilbert' または 'differentiator' フラグが付けられた場合、III 型および IV 型の線形位相 FIR フィルターを設計します。cfirpm では、任意のタイプの線形位相フィルターに加え、非線形位相フィルターも設計できます。

メモ

II 型フィルターの周波数応答は、ナイキスト周波数 (「高い」周波数) でゼロになるため、fir1 では II 型のハイパス フィルターおよびバンドストップ フィルターは設計されません。このような場合に n が奇数であると、fir1 では次数に 1 が加えられ、I 型フィルターが返されます。

ウィンドウ処理法

ω0 ラジアン/サンプルのカットオフ周波数をもつ理想的な、すなわち「急峻な特性」のデジタル ローパス フィルターを考えてみましょう。このフィルターは、すべての周波数において振幅が 1 で、振幅は ω0 未満です。また、振幅が ω0 と π の間の周波数では振幅が 0 になります。そのインパルス応答シーケンス h(n) は、以下のようになります。

h(n)=12πππH(ω)ejωndω=12πω0ω0ejωndω=sinω0nπn

このフィルターはインパルス応答が無限で非因果的であるため、実装することはできません。有限時間のインパルス応答を作成するには、ウィンドウを適用してそれを切り詰めます。この切り取りにおいて、インパルス応答の中心部分を保持することにより、線形位相 FIR フィルターが得られます。たとえば、0.4 π rad/s のローパス カットオフ周波数 ω0 をもつ長さ 51 のフィルターは、以下のようになります。

b = 0.4*sinc(0.4*(-25:25));

ここで適用されているのは単純な箱型ウィンドウです。パーセバルの定理によって、これは、誤差の積分二乗を最小にする点で理想的なローパス フィルターを最もよく近似する長さ 51 のフィルターとなります。FVTool で周波数応答を表示するには、次のコマンドを使用します。

fvtool(b,1)

以下の図の y 軸では、[振幅の二乗] が使用されていることに注意してください。この設定を行うには、軸のラベルを右クリックして、メニューから [振幅の二乗] を選択します。

特に帯域エッジの近くでは、応答でリンギングとリップルが発生しています。「ギブス現象」は、フィルターの長さが増しても消えることはありませんが、非箱型ウィンドウを使うと小さくなります。時間領域でウィンドウを適用すると、周波数領域で畳み込み、または、平滑化が行われます。長さが 51 のハミング ウィンドウをフィルターに適用し、FVTool を使用して結果を表示します。

b = 0.4*sinc(0.4*(-25:25));
b = b.*hamming(51)';
fvtool(b,1)

以下の図の y 軸では、[振幅の二乗] が使用されていることに注意してください。この設定を行うには、軸のラベルを右クリックして、メニューから [振幅の二乗] を選択します。

この図からわかるように、ハミング ウィンドウを使用することでリンギングが大幅に減少しています。この結果を得る上では、遷移幅 (ウィンドウを適用すると通過帯域から阻止帯域までのランプが長くなります) と最適性 (ウィンドウを適用すると積分二乗誤差が最小になりません) が犠牲になっています。

標準帯域 FIR フィルターの設計: fir1

fir1 は、最小二乗近似を使用して、フィルター係数を計算し、ウィンドウでインパルス応答を平滑化します。ウィンドウとそのプロパティの概要については、ウィンドウを参照してください。fir1 は、標準帯域構成 (ローパス、バンドパス、ハイパス、およびバンドストップ) でフィルターを設計するように定式化されているという点で IIR フィルター設計関数に似ています。

以下のステートメントを見てみましょう。

n = 50;
Wn = 0.4;
b = fir1(n,Wn);

このステートメントでは、n 次のハミング ウィンドウ フィルターの係数を含む行ベクトル b が作成されます。これはカットオフ周波数 Wn をもつローパス線形位相 FIR フィルターです。Wn は 0 ~ 1 の数値です。ここで、1 はサンプリング周波数の 1/2 (ナイキスト周波数) に相当します。(他の手法とは異なり、ここでの Wn は 6 dB の点に対応します)。ハイパス フィルターでは、関数のパラメーターのリストに 'high' を追加します。バンドパスまたはバンドストップ フィルターの場合は、Wn を通過帯域のエッジ周波数を含む 2 要素ベクトルとして指定します。バンドストップ構成に 'stop' を追加します。

b = fir1(n,Wn,window) では、列ベクトル window で指定されたウィンドウを使用して設計を行います。ベクトル window の長さは n+1 要素でなければなりません。ウィンドウを指定しないと、fir1 ではハミング ウィンドウが適用されます。

カイザー ウィンドウの次数推定.  関数 kaiserord では、与えられた仕様のセットを満たすために必要なフィルターの次数、カットオフ周波数、およびカイザー ウィンドウのベータ パラメーターが推定されます。周波数帯域エッジのベクトルと、対応する大きさのベクトル、さらに許容最大リップルが与えられると、kaiserord からは関数 fir1 に適切な入力パラメーターが返されます。

マルチバンド FIR フィルターの設計: fir2

関数 fir2 もウィンドウを適用した FIR フィルターを設計しますが、結果として得られるフィルターは任意の形状の区分線形周波数応答をもっています。これは、標準的なローパス、ハイパス、バンドパス、およびバンドストップの構成でのみフィルターを設計する fir1 とは対照的です。

次のコマンドを見てみましょう。

n = 50;
f = [0 .4 .5 1];
m = [1  1  0 0];
b = fir2(n,f,m);

このコマンドでは、ベクトル f および m によって与えられるものと周波数-振幅特性が一致する、n 次の FIR フィルターの n+1 個の係数を含む行ベクトル b が返されます。ここで、f は、0 ~ 1 の範囲の周波数点を表すベクトルで、1 はナイキスト周波数を表します。m は、ベクトル f で指定された点での指定した振幅応答を含むベクトルです。(この関数に相当する IIR 関数は yulewalk で、これもまた任意の区分線形振幅応答に基づいたフィルターを設計します。詳細については、IIR フィルターの設計を参照してください)。

遷移帯域付きマルチバンド FIR フィルターの設計

関数 firls および関数 firpm では、関数 fir1 や関数 fir2 に比べて、指定した理想フィルターを設定する方法がより一般的になっています。これらの関数では、ヒルベルト変換器、微分器、およびその他の奇数対称係数をもつフィルター (III 型および IV 型の線形位相フィルター) が設計されます。また、誤差の最小化を行わない遷移帯域、すなわち "don't care" 領域を含めることができ、帯域に依存した最小化の加重が行われます。

関数 firls は、指定した周波数応答と実際の周波数応答との間の誤差の二乗和を最小にするという点で、関数 fir1 および fir2 を拡張したものです。

関数 firpm は、Parks-McClellan アルゴリズムを実装するもので、Remez 交換アルゴリズムとチェビシェフ近似理論を使用して、指定した周波数応答と実際の周波数応答が最適になるようにフィルターを設計します。フィルターは、指定した周波数応答と実際の周波数応答間の最大誤差が最小化されているという点で、最適化されているといえます。誤差を最小するように最適化されており、場合によっては、"ミニマックス" フィルターとも呼ばれます。この方法で設計されたフィルターは、周波数応答で等リップルを示すため、"等リップル" フィルター としても知られています。Parks-McClellan FIR フィルター設計アルゴリズムは、おそらく最も一般的で広く使用されている FIR フィルター設計法であると考えられます。

firls および firpm の構文は同じで、唯一の違いは最小化のスキームです。以下の例では、firlsfirpm で設計されたフィルターが、これらの異なるスキームをどのように反映するかについて示します。

基本構成

firlsfirpm の既定の演算モードでは、指定したフィルターの次数が奇数か偶数かに応じて、それぞれ I 型または II 型の線形位相フィルターが設計されます。たとえば、0 ~ 0.4 Hz の近似振幅が 1 で、0.5 ~ 1.0 Hz の近似振幅が 0 であるローパス フィルターは、以下のようになります。

n = 20;                    % Filter order
f = [0 0.4 0.5 1];         % Frequency band edges
a = [1  1  0 0];           % Amplitudes
b = firpm(n,f,a);

0.4 ~ 0.5 Hz では、firpm では誤差の最小化は行われません。この帯域が遷移帯域、すなわち "don't care" 領域です。遷移帯域では、遷移速度を遅くすることで、関心のある帯域での誤差が最小にされます。このように、このタイプのフィルターは、ウィンドウ処理による FIR 設計と同様に固有の妥協点をもっています。

最小二乗フィルター設計と等リップル フィルター設計を比較するには、firls を使用して同様のフィルターを作成します。型

bb = firls(n,f,a);

を入力し、次のようにして、FVTool を使用して周波数応答を比較します。

fvtool(b,1,bb,1)

以下の図の y 軸では、[振幅の二乗] が使用されていることに注意してください。この設定を行うには、軸のラベルを右クリックして、メニューから [振幅の二乗] を選択します。

firpm で設計されたフィルターは、等リップルの特性をもっていることがわかります。また、firls フィルターは通過帯域と阻止帯域のほぼ全体にわたり良好な応答を示していますが、帯域エッジ (f = 0.4 および f = 0.5) では、応答が firpm フィルターよりも理想から離れています。これは、firpm フィルターの "最大" 誤差が通過帯域および阻止帯域でより小さくなることを示しており、実際、この帯域エッジ構成とフィルター長に対して可能なかぎり最小になっています。

周波数帯域を短い周波数区間の線として考えてみてください。firpmfirls ではこのスキームを使用して、任意の遷移帯域をもつ、望ましい任意の区分線形周波数応答関数を表現しています。firlsfirpm では、ローパス フィルター、ハイパス フィルター、バンドパス フィルター、およびバンドストップ フィルターが設計されます。以下に示すのは、バンドパス フィルターの例です。

f = [0 0.3  0.4  0.7  0.8  1];   % Band edges in pairs
a = [0  0    1    1    0   0];   % Bandpass filter amplitude

厳密に言うと、これらの f および a ベクトルは、以下の 5 つの帯域を定義します。

  • 0.0 ~ 0.3 および 0.8 ~ 1.0 の 2 つの阻止帯域

  • 0.4 ~ 0.7 の 1 つの通過帯域

  • 0.3 ~ 0.4 および 0.7 ~ 0.8 の 2 つの遷移帯域

次に、ハイパス フィルターとバンドストップ フィルターの例を示します。

f = [0 0.7  0.8  1];            % Band edges in pairs
a = [0  0    1   1];            % Highpass filter amplitude
f = [0 0.3  0.4  0.5  0.8  1];  % Band edges in pairs
a = [1  1    0    0    1   1];  % Bandstop filter amplitude

マルチバンド フィルターの例は、次のようになります。

f = [0 0.1 0.15 0.25 0.3 0.4 0.45 0.55 0.6 0.7 0.75 0.85 0.9 1];
a = [1  1   0    0    1   1   0    0    1   1   0    0    1  1];

ほかに可能なものとしては、通過帯域と阻止帯域とを結ぶ線を遷移領域とするフィルターがあります。このフィルターは遷移領域が広い場合に、「ランナウェイ」振幅応答を制御するのに役立ちます。

f = [0 0.4 0.42 0.48 0.5  1];
a = [1 1 0.8 0.2 0 0];   % Passband, linear transition, 
                         %  stopband

重みベクトル

firlsfirpm の両方を使用して、ある周波数帯域での誤差の最小化を、他の周波数帯域での誤差の最小化と比べて重視するかどうかを指定することができます。このためには、周波数ベクトルと振幅ベクトルの後に重みベクトルを設定します。次に、阻止帯域のリップルが通過帯域の 1/10 であるローパス等リップル フィルターの例をあげます。

n = 20;              % Filter order
f = [0 0.4 0.5 1];   % Frequency band edges
a = [1  1   0  0];   % Amplitudes
w = [1 10];          % Weight vector
b = firpm(n,f,a,w);

有効な重みベクトルは、常にベクトル f およびベクトル a の長さの半分になります。1 つの帯域あたりの重みは 1 つのみでなければなりません。

非対称フィルター/ヒルベルト変換器

入力引数の最後に 'h'、つまり 'Hilbert' オプションを付けて呼び出した場合、firpm および firls では、奇数対称性をもつ FIR フィルター、すなわち III 型 (偶数次数の場合) または IV 型 (奇数次数の場合) の線形位相フィルターが設計されます。理想的なヒルベルト変換器は、周波数範囲全体に渡り、この非対称性と 1 の振幅をもちます。次に、ヒルベルト変換器を使用して以下の近似を行い、FVTool でプロットします。

b = firpm(21,[0.05 1],[1 1],'h');       % Highpass Hilbert
bb = firpm(20,[0.05 0.95],[1 1],'h');   % Bandpass Hilbert
fvtool(b,1,bb,1)

これらのフィルターを適用することで、信号 x の遅延されたヒルベルト変換を求めることができます。

fs = 1000;            % Sampling frequency
t = (0:1/fs:2)';      % Two second time vector
x = sin(2*pi*300*t);  % 300 Hz sine wave example signal
xh = filter(bb,1,x);  % Hilbert transform of x

x に対応する解析信号は、x と同じ実数部をもち、x のヒルベルト変換を虚数部とする複素信号になります。この FIR 手法 (関数 hilbert の代替法) では、解析信号を作成するためにフィルター次数の半分だけ x を遅延させる必要があります。

xd = [zeros(10,1); x(1:length(x)-10)];	    % Delay 10 samples
xa = xd + j*xh;                            % Analytic signal

この手法は、非整数の遅延を必要とする奇数次数のフィルターには直接適用できません。この場合には、ヒルベルト変換で説明するように、関数 hilbert を使って解析信号を推定します。あるいは、関数 resample を使用して、サンプルの非整数の数だけ信号を遅延させます。

微分器

時間領域内の信号の微分は、信号のフーリエ変換に虚数のランプ関数を乗算したものに相当します。すなわち、信号を微分するには、信号を応答 H(ω) = jω のフィルターにかけます。firpm または firls'd' または 'differentiator' オプションと併用して、理想的な微分器 (遅延をもつ) を近似します。

b = firpm(21,[0 1],[0 pi],'d');

III 型フィルターの場合には、微分帯域はナイキスト周波数より低く、振幅ベクトルはこの変化を反映して正確な勾配をもっていなければなりません。

bb = firpm(20,[0 0.9],[0 0.9*pi],'d');

firpm は、'd' モードでは非ゼロ振幅帯域において誤差に 1/ω の重みを付け、最大 "相対" 誤差を最小化します。firls は、'd' モードでは非ゼロ振幅帯域において、誤差に (1/ω)2 の重みを付けます。

上に示した微分器の振幅応答プロットは、次のようになります。

fvtool(b,1,bb,1)
legend('Odd order','Even order','Location','best')

制約付き最小二乗 FIR フィルターの設計

制約付き最小二乗 (CLS) FIR フィルター設計関数は、振幅応答の遷移帯域を明示的に定義せずに、FIR フィルターを設計できる手法を実装するものです。遷移帯域の設定を省略することができるということは、いくつかの状況において役立ちます。たとえば、ノイズと信号の情報が同一周波数帯域内に同時に出現する場合には、厳密に定義された遷移帯域の位置が明らでない可能性があります。同様に、遷移帯域がフィルターの応答に現れるギブズ現象の結果を制御するためにだけ存在する場合は、遷移帯域の設定を省略することは妥当だと言えます。この手法に関しては、Selesnick、Lang、および Burrus による [2] の参考文献を参照してください。

通過帯域、阻止帯域、および遷移領域を定義する代わりに、CLS 法では指定した応答における、カットオフ周波数 (ハイパス、ローパス、バンドパス、またはバンドストップの場合)、または通過帯域および阻止帯域エッジ (マルチバンドの場合) を指定できます。このようにして、CLS 法では明示的に遷移領域を定義します。

CLS 法の主な特徴は、振幅応答内の許容最大リップルを含む上下のしきい値を定義することができることです。この制約を与えると、この手法では特定の帯域を対象とする代わりに、フィルター応答の周波数範囲全体に最小二乗誤差最小化手法が適用されきます。この誤差の最小化には、理想的な「急峻な特性」をもつ応答における任意の不連続領域が含まれます。別の利点は、この方法ではギブズ現象から生じる任意の細かいピークを指定できることです。

このツールボックスでは、この設計法を実装する 2 つの関数が用意されています。

説明

関数

制約付き最小二乗マルチバンド FIR フィルター設計

fircls

ローパスおよびハイパス線形位相フィルター用の制約付き最小二乗フィルター設計

fircls1

これらの関数構文の呼び出しについては、関数リファレンスを参照してください。

基本的なローパスおよびハイパス CLS フィルター設計

最も基本的な CLS 設計関数 fircls1 では、この手法を使用してローパスおよびハイパス FIR フィルターが設計されます。例として、61 次のインパルス応答と正規化された 0.3 のカットオフ周波数をもつフィルターの設計を考えます。さらに、設計プロセスを制限する上限および下限を、次のように定義します。

  • 1 からの最大通過帯域偏差 (通過帯域リップル) を 0.02 とします。

  • 0 からの最大阻止帯域偏差 (阻止帯域リップル) を 0.008 とします。

fircls1 を使用してこの例を解決するには、次のコマンドを使用します。

n = 61;
wo = 0.3;
dp = 0.02;	
ds = 0.008;
h = fircls1(n,wo,dp,ds);
fvtool(h,1)

以下の図の y 軸では、振幅が二乗になっていることに注意してください。この設定を行うには、軸のラベルを右クリックして、メニューから [振幅の二乗] を選択します。

マルチバンド CLS フィルターの設計

fircls では、同じ手法を使用して、指定した、区分的に定常な振幅応答をもつ FIR フィルターが設計されます。この場合、帯域エッジのベクトルと対応する帯域振幅のベクトルを指定することができます。さらに、帯域ごとにリップルの最大量を指定することもできます。

たとえば、次のようなフィルター仕様を考えます。

  • 0 ~ 0.3 (正規化): 振幅 0、上限 0.005、下限 –0.005

  • 0.3 ~ 0.5: 振幅 0.5、上限 0.51、下限 0.49

  • 0.5 ~ 0.7: 振幅 0、上限 0.03、下限 -0.03

  • 0.7 ~ 0.9: 振幅 1、上限 1.02、下限 0.98

  • 0.9 ~ 1: 振幅 0、上限 0.05、下限 -0.05

次のようにして、これらの仕様を満たす 129 次のインパルス応答次数をもつ CLS フィルターを設計します。

n = 129;
f = [0 0.3 0.5 0.7 0.9 1];
a = [0 0.5 0 1 0];
up = [0.005 0.51 0.03 1.02 0.05];
lo = [-0.005 0.49 -0.03 0.98 -0.05];
h = fircls(n,f,a,up,lo);
fvtool(h,1)

以下の図の y 軸では、振幅が二乗になっていることに注意してください。この設定を行うには、軸のラベルを右クリックして、メニューから [振幅の二乗] を選択します。

重み付き CLS フィルターの設計

重み付き CLS フィルター設計では、各帯域における誤差の最小化に相対的な重み付けを行うローパスまたはハイパス FIR フィルターを設計できます。関数 fircls1 では、重み付け最小二乗関数に対し、通過帯域および阻止帯域のエッジに加え、阻止帯域と通過帯域の重み付けの比率を指定する定数 k を指定できます。

たとえば、55 のインパルス応答次数で、0.3 (正規化) のカットオフ周波数をもつ FIR フィルターの仕様を考えてみましょう。また、許容最大通過帯域リップルを 0.02、許容最大阻止帯域リップルを 0.004 とします。さらに、次の重み付けを必要条件に加えます。

  • 重み関数に対する通過帯域エッジを 0.28 (正規化) とします。

  • 重み関数に対する阻止帯域エッジを 0.32 とします。

  • 阻止帯域での最小誤差が、通過帯域での最小誤差の 10 倍になるように重みを付けます。

fircls1 を使用してこの問題を解決するには、以下のように入力します。

n = 55;
wo = 0.3;
dp = 0.02;
ds = 0.004;
wp = 0.28;
ws = 0.32;
k = 10;
h = fircls1(n,wo,dp,ds,wp,ws,k);
fvtool(h,1)

以下の図の y 軸では、振幅が二乗になっていることに注意してください。この設定を行うには、軸のラベルを右クリックして、メニューから [振幅の二乗] を選択します。

任意応答フィルターの設計

フィルター設計関数 cfirpm では、任意の複素応答をもつ FIR フィルターを設計するためのツールが提供されます。この関数は、フィルターの周波数応答の指定方法が他のフィルター設計関数とは異なります。関数 cfirpm では、周波数のグリッド上で計算したフィルター応答を返す関数名を受け取ることができるのです。このため cfirpm は、非常に柔軟で強力なフィルター設計法です。

この設計法は、非線形位相 FIR フィルター、非対称周波数応答フィルター (複素係数をもつ)、またはカスタムの周波数応答をもつ、より対称的なフィルターの作成に使用することができます。

この設計アルゴリズムでは、初期推定に拡張 Remez 交換アルゴリズムを使用して、チェビシェフ (またはミニマックス) 誤差が最適化されます。この交換法で最適なフィルターを求めることができなかった場合は、アルゴリズムが上昇・下降アルゴリズムに切り替わり、このアルゴリズムが処理を引き継いで最適な回答への収束が完了されます。

マルチバンド フィルターの設計

次の特別な周波数領域特性をもつ、マルチバンドフィルターを考えます。

帯域

振幅

最適化の重み付け

[–1 –0.5]

[5 1]

1

[–0.4 +0.3]

[2 2]

10

[+0.4 +0.8]

[2 1]

5

線形位相マルチバンド フィルターは、あらかじめ定義されている周波数応答関数 multiband を使用して、以下のように設計できます。

b = cfirpm(38, [-1 -0.5 -0.4 0.3 0.4 0.8], ...
               {'multiband', [5 1 2 2 2 1]}, [1 10 5]);

マルチバンド フィルターの特定のケースでは、firpm の構文と同様の簡易フィルター設計表記法を使用できます。

b = cfirpm(38,[-1 -0.5 -0.4 0.3 0.4 0.8], ...
              [5 1 2 2 2 1], [1 10 5]);

firpm と同様に、帯域エッジのベクトルが cfirpm に渡されます。このベクトルによって、最適化を行う周波数帯域が定義されます。ただし、–0.5 ~ –0.4 と 0.3 ~ 0.4 の 2 つの遷移帯域があることに注意してください。

いずれの場合にも、周波数応答が求められ、FVTool で線形のスケーリングを使用してプロットされます。

fvtool(b,1)

以下の図では、データの範囲が (-pi,pi) になっています。

このマルチバンド フィルターのフィルター応答は複素数となりますが、これは周波数領域での非対称性から予測可能なものです。インパルス応答を次に示します。このインパルス応答は FVTool ツール バーから選択できます。

遅延の小さいフィルターの設計

カットオフ周波数がナイキスト周波数の半分である、62 タップのローパス フィルターの設計を考えてみましょう。フィルター設計関数 lowpass に負のオフセット値を指定した場合、この設計に対する群遅延オフセットは、標準的な線形位相設計に対して得られるものより著しく低くなります。このフィルター設計は、次のように計算することができます。

b = cfirpm(61,[0 0.5 0.55 1],{'lowpass',-16});

結果として得られる振幅応答は、次のように表現されます。

fvtool(b,1)

また、y 軸では、振幅が 2 乗になっています。これは、軸のラベルを右クリックして、メニューから [振幅の二乗] を選択して設定します。

フィルターの群遅延は、オフセットが N/2 から N/2-16 (すなわち、30.5 から 14.5) に低減されたことを示しています。ただし、通過帯域における群遅延は平坦ではありません。このプロットを作成するには、ツール バーの [群遅延応答] ボタンをクリックします。

この非線形位相フィルターを、正確に 14.5 サンプルの群遅延をもつ線形位相フィルターと比較すると、結果として得られるフィルターの次数は 2*14.5、すなわち 29 となります。b = cfirpm(29,[0 0.5 0.55 1],'lowpass') を使用すると、通過帯域および阻止帯域のリップルは、29 次フィルターとしてははるかに大きくなります。これらの比較は、特定のアプリケーションに適したフィルターを判断するときに役立ちます。