FIR フィルターの設計
この例では、ウィンドウ処理、最小二乗法、または Parks-McClellan アルゴリズムを使用して、ローパス、ハイパス、マルチバンド、任意応答の各フィルター、微分器、またはヒルベルト変換器を設計する方法を示します。
FIR フィルターと IIR フィルター
有限時間のインパルス応答をもつデジタル フィルター (全零、または FIR フィルター) は、無限時間のインパルス応答 (IIR) フィルターと比較した場合、利点と欠点の両方をもっています。FIR フィルターには、主に次のような利点があります。
厳密な線形位相をもつことができる
常に安定している
設計法が一般に線形である
ハードウェアで効率的に実現できる
フィルター処理を開始する際の過渡時間が有限である
FIR フィルターの主な欠点は、与えられた性能レベルを達成するために、IIR フィルターよりはるかに高い次数を必要とする場合が多いことです。そのため FIR フィルターの遅延が同等の性能をもつ IIR フィルターよりも大きいことがしばしばあります。
FIR フィルターの概要
次の表に、Signal Processing Toolbox™ を使用したさまざまなフィルター設計方法をまとめ、これらの方法の実装に使用できる関数を記載します。
フィルター設計法 | 説明 | フィルター関数 |
---|---|---|
ウィンドウ処理 | 指定した "ブリック ウォール" フィルターを逆フーリエ変換して切り取ったものに、ウィンドウを適用 | |
遷移帯付きマルチバンド | 周波数範囲の部分的な範囲に渡り、等リップルまたは最小二乗法を使用 | |
条件付き最小二乗法 | 最大誤差に関する制約のもとで、周波数範囲全体に渡たる積分誤差の二乗を最小化 | |
任意応答法 | 非線形位相や複素フィルターを含む任意応答 | |
レイズド コサイン | 滑らかな正弦波遷移を伴うローパス応答 |
digitalFilter
オブジェクトを使用してデジタル フィルターを設計することもできます。詳細については、designfilt
を参照してください。
GUI ベースのワークフローの場合は、フィルター デザイナーアプリまたはフィルター設計ライブ タスクを使用してフィルターを設計します。
線形位相フィルター
cfirpm
を除き、すべての FIR フィルター設計関数では、線形位相フィルターのみが設計されます。このようなフィルター係数、すなわち "タップ" は、偶対称または奇対称の関係に従います。長さ のベクトル b
に格納される線形位相フィルターでは、この対称性や、フィルターの次数 n が偶数か奇数かに応じて、フィルター特有の制約が周波数応答に課せられます。
線形位相フィルター タイプ | フィルター次数 | 係数の対称性 | 応答 、 | 応答 、 (ナイキスト) |
---|---|---|---|---|
I 型 | 偶数 | 偶数: | 制約なし | 制約なし |
II 型 | 奇数 | 偶数: | 制約なし | |
III 型 | 偶数 | 奇数: | ||
IV 型 | 奇数 | 奇数: | 制約なし |
線形位相 FIR フィルターの位相遅延および群遅延は、周波数帯全体に渡り等しく、かつ一定です。n 次線形位相 FIR フィルターの場合、群遅延は であり、フィルター処理した信号は、単に タイム ステップ遅れます (また、フーリエ変換の振幅は、フィルターの振幅応答でスケーリングされます)。この特性により、通過帯域内で信号の波形が保持されます。つまり、位相歪みは生じません。
関数fir1
、fir2
、firls
、firpm
、fircls
およびfircls1
はいずれも、既定で I 型および II 型の線形位相 FIR フィルターを設計します。rcosdesign
は I 型のフィルターのみを設計します。firls
と firpm
はともに、"hilbert"
または "differentiator"
フラグが付けられた場合、III 型および IV 型の線形位相 FIR フィルターを設計します。cfirpm
では、任意のタイプの線形位相フィルターに加え、非線形位相フィルターも設計できます。
II 型フィルターの周波数応答は、ナイキスト周波数 (「高い」周波数) でゼロになるため、fir1
では II 型のハイパス フィルターおよびバンドストップ フィルターは設計されません。このような場合に n
が奇数であると、fir1
では次数に 1 が加えられ、I 型フィルターが返されます。
ウィンドウ処理法
ラジアン/サンプルのカットオフ周波数をもつ理想的なフィルター、すなわち "ブリック ウォール" デジタル ローパス フィルターを考えてみましょう。このフィルターは、周波数の大きさが 未満の場合は振幅がすべて 1 になり、周波数の大きさが ~ の場合は振幅が 0 になります。そのインパルス応答シーケンス は、以下のようになります。
このフィルターはインパルス応答が無限で非因果的であるため、実装することはできません。有限時間のインパルス応答を作成するには、ウィンドウを適用してそれを切り詰めます。この切り取りにおいて、インパルス応答の中心部分を保持することにより、線形位相 FIR フィルターが得られます。たとえば、0.4 π ラジアン/サンプルのローパス カットオフ周波数 をもつ長さ 51 のフィルターは、以下のようになります。
b = 0.4*sinc(0.4*(-25:25));
ここで適用されているのは単純な箱型ウィンドウです。パーセバルの定理によって、これは、誤差の積分二乗を最小にする点で理想的なローパス フィルターを最もよく近似する長さ 51 のフィルターとなります。フィルターの周波数応答を表示します。以下の y 軸が振幅の二乗で表示されていることに注意してください。
filterAnalyzer(b,MagnitudeMode="squared")
特に帯域エッジの近くでは、応答でリンギングとリップルが発生しています。「ギブス現象」は、フィルターの長さが増しても消えることはありませんが、非箱型ウィンドウを使うと小さくなります。時間領域でウィンドウを適用すると、周波数領域で畳み込み、または、平滑化が行われます。長さ 51 のハミング ウィンドウをフィルターに適用し、結果を表示します。この Figure の 軸が振幅の二乗で表示されていることに注意してください。
bw = b.*hamming(51)';
filterAnalyzer(bw,MagnitudeMode="squared")
この図からわかるように、ハミング ウィンドウを使用することでリンギングが大幅に減少しています。この結果を得る上では、遷移幅 (ウィンドウ処理されると通過帯域から阻止帯域までのランプが長くなります) と最適性 (ウィンドウ処理されると積分二乗誤差が最小になりません) が犠牲になっています。
標準帯域 FIR フィルターの設計: fir1
fir1
関数は、最小二乗近似を使用して、フィルター係数を計算し、ウィンドウでインパルス応答を平滑化します。ウィンドウとそのプロパティの概要については、ウィンドウを参照してください。fir1
は、標準帯域構成 (ローパス、バンドパス、ハイパス、およびバンドストップ) でフィルターを設計するように定式化されているという点で IIR フィルター設計関数に似ています。
ハミング ウィンドウが適用された 50 次ローパス フィルターの係数を含む行ベクトルを作成します。
n = 50; Wn = 0.4; bF1 = fir1(n,Wn);
これはカットオフ周波数 Wn
をもつローパス線形位相 FIR フィルターです。Wn
は 0 ~ 1 の数値です。ここで、1 はサンプリング周波数の 1/2 (ナイキスト周波数) に相当します。(他の手法とは異なり、ここでの Wn
は 6 dB の点に対応します)。ハイパス フィルターでは、関数のパラメーターのリストに "high"
を追加します。バンドパスまたはバンドストップ フィルターの場合は、Wn
を通過帯域のエッジ周波数を含む 2 要素ベクトルとして指定します。バンドストップ構成の場合は "stop"
を追加します。
bF1w = fir1(n,Wn,window)
は、列ベクトル window
で指定されたウィンドウを使用して設計を行います。ベクトル window
の長さは n+1
要素でなければなりません。ウィンドウを指定しないと、fir1
ではハミング ウィンドウが適用されます。
カイザー ウィンドウの次数推定
kaiserord
関数は、与えられた仕様のセットを満たすために必要なフィルターの次数、カットオフ周波数、およびカイザー ウィンドウのベータ パラメーターを推定します。周波数帯域エッジのベクトルと、対応する振幅のベクトル、さらに許容最大リップルを与えると、kaiserord
は、fir1
関数に与えるための適切な入力パラメーターを返します。
マルチバンド FIR フィルターの設計: fir2
fir2
関数もウィンドウ処理された FIR フィルターを設計しますが、結果として得られるフィルターは任意の形状の区分線形周波数応答をもっています。これは、標準的なローパス、ハイパス、バンドパス、およびバンドストップの構成でのみフィルターを設計するfir1
とは対照的です。
ベクトル f
および m
によって与えられるものと周波数-振幅特性が一致する、n
次の FIR フィルターの n+1
個の係数を含む行ベクトル b
を生成します。
n = 50;
f = [0 .4 .5 1];
m = [1 1 0 0];
bF2 = fir2(n,f,m);
filterAnalyzer(bF2,MagnitudeMode="squared")
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
の構文は同じで、唯一の違いは最小化のスキームです。以下の例では、firls
と firpm
で設計されたフィルターが、これらの異なるスキームをどのように反映するかについて示します。
基本構成
firls
と firpm
の既定の演算モードでは、指定したフィルターの次数が奇数か偶数かに応じて、それぞれ I 型または II 型の線形位相フィルターが設計されます。たとえば、0 ~ 0.4 Hz の近似振幅が 1 で、0.5 ~ 1.0 Hz の近似振幅が 0 であるローパス フィルターは、以下のようになります。
n0 = 20; % Filter order f0 = [0 0.4 0.5 1]; % Frequency band edges A0 = [1 1 0 0]; % Amplitudes bPM0 = firpm(n,f0,A0);
0.4 ~ 0.5 Hz では、firpm
では誤差の最小化は行われません。この帯域が遷移帯域、すなわち "don't care" 領域です。遷移帯域では、遷移速度を遅くすることで、関心のある帯域での誤差が最小にされます。このように、このタイプのフィルターには、ウィンドウ処理による FIR 設計と同様に固有のトレードオフがあります。
最小二乗フィルター設計と等リップル フィルター設計を比較するには、firls
を使用して同様のフィルターを作成します。次のように入力します。
bLS0 = firls(n0,f0,A0);
また、フィルター アナライザーを使用して、周波数応答を比較します。以下の図の y 軸では、振幅の二乗が使用されていることに注意してください。名前と値の引数 MagnitudeMode
を使用してこれを自動的に設定することも、フィルター アナライザー アプリの [アナライザー] セクションの [解析オプション] ボタンをクリックし、[振幅オプション] メニューから Squared
を選択して手動で設定することもできます。
filterAnalyzer(bPM0,1,bLS0,1, ... FilterNames=["bPM0" "bLS0"],MagnitudeMode="squared")
firpm
で設計されたフィルターは、等リップルの特性をもっていることがわかります。また、firls
フィルターは通過帯域と阻止帯域のほぼ全体にわたり良好な応答を示していますが、帯域エッジ (f
= 0.4
および f
= 0.5
) では、応答が firpm
フィルターよりも理想から離れています。これは、firpm
フィルターの "最大" 誤差が通過帯域および阻止帯域でより小さくなることを示しており、実際、この帯域エッジ構成とフィルター長に対して可能なかぎり最小になっています。
周波数帯域を短い周波数区間の線として考えてみてください。firpm
と firls
ではこのスキームを使用して、任意の遷移帯域をもつ、望ましい任意の区分線形周波数応答関数を表現しています。firls
と firpm
では、ローパス フィルター、ハイパス フィルター、バンドパス フィルター、およびバンドストップ フィルターが設計されます。以下に示すのは、バンドパス フィルターの例です。
fMB0 = [0 0.3 0.4 0.7 0.8 1]; % Band edges in pairs aMB0 = [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 つの遷移帯域
次に、ハイパス フィルターとバンドストップ フィルターの例を示します。
fHP = [0 0.7 0.8 1]; % Band edges in pairs aHP = [0 0 1 1]; % Highpass filter amplitude fBS = [0 0.3 0.4 0.5 0.8 1]; % Band edges in pairs aBS = [1 1 0 0 1 1]; % Bandstop filter amplitude
マルチバンド フィルターの例は、次のようになります。
fMB = [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]; aMB = [1 1 0 0 1 1 0 0 1 1 0 0 1 1];
ほかに可能なものとしては、通過帯域と阻止帯域とを結ぶ線を遷移領域とするフィルターがあります。このフィルターは遷移領域が広い場合に、「ランナウェイ」振幅応答を制御するのに役立ちます。
fTB = [0 0.4 0.42 0.48 0.5 1]; aTB = [1 1 0.8 0.2 0 0]; % Passband, linear transition, % stopband
重みベクトル
firls
と firpm
の両方を使用して、ある周波数帯域での誤差の最小化を、他の周波数帯域での誤差の最小化と比べて重視するかどうかを指定することができます。このためには、周波数ベクトルと振幅ベクトルの後に重みベクトルを設定します。次に、阻止帯域のリップルが通過帯域の 1/10 であるローパス等リップル フィルターの例をあげます。
nWV = 20; % Filter order fWV = [0 0.4 0.5 1]; % Frequency band edges aWV = [1 1 0 0]; % Amplitudes wv = [1 10]; % Weight vector bWV = firpm(nWV,fWV,aWV,wv);
反対称フィルターとヒルベルト変換器
入力引数の最後に "h"
オプションまたは "hilbert"
オプションを付けて呼び出した場合、firpm
および firls
では、奇数対称性をもつ FIR フィルター、すなわち III 型 (偶数次数の場合) または IV 型 (奇数次数の場合) の線形位相フィルターが設計されます。理想的なヒルベルト変換器は、周波数範囲全体に渡り、この反対称の特性と 1 の振幅をもちます。次の近似ヒルベルト変換器を試して、プロットします。
bHHP = firpm(21,[0.05 1],[1 1],"hilbert"); % Highpass bHBP = firpm(20,[0.05 0.95],[1 1],"hilbert"); % Bandpass filterAnalyzer(bHHP,1,bHBP,1,FilterNames=["bHHP" "bHBP"])
これらのフィルターを適用することで、信号 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(bHBP,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 + 1i*xh; % Analytic signal
この手法は、非整数の遅延を必要とする奇数次数のフィルターには直接適用できません。この場合には、ヒルベルト変換で説明するように、hilbert
関数を使って解析信号を推定します。あるいは、関数 resample
を使用して、サンプルの非整数の数だけ信号を遅延させます。
微分器
時間領域内の信号の微分は、信号のフーリエ変換に虚数のランプ関数を乗算したものに相当します。すなわち、信号を微分するには、信号を応答 のフィルターにかけます。firpm
または firls
を "d"
または "differentiator"
オプションと併用して、理想的な微分器 (遅延をもつ) を近似します。
bDiff10 = firpm(21,[0 1],[0 pi],"differentiator");
III 型フィルターの場合には、微分帯域はナイキスト周波数より低く、振幅ベクトルはこの変化を反映して正確な傾きをもっていなければなりません。
bDiff09 = firpm(20,[0 0.9],[0 0.9*pi],"differentiator");
firpm
は、"d"
モードでは非ゼロ振幅帯域において誤差に の重みを付け、最大 "相対" 誤差を最小化します。firls
は、"d"
モードでは非ゼロ振幅帯域において、誤差に の重みを付けます。
プロットは微分器の振幅応答を示しています。
filterAnalyzer(bDiff10,1,bDiff09,1,FilterNames=["Odd" "Even"])
制約付き最小二乗 FIR フィルターの設計
制約付き最小二乗 (CLS) FIR フィルター設計関数は、振幅応答の遷移帯域を明示的に定義せずに、FIR フィルターを設計できる手法を実装するものです。遷移帯域の設定を省略することができるということは、いくつかの状況において役立ちます。たとえば、ノイズと信号の情報が同一周波数帯域内に同時に出現する場合には、厳密に定義された遷移帯域の位置が明らでない可能性があります。同様に、遷移帯域がフィルターの応答に現れるギブズ現象の結果を制御するためにだけ存在する場合は、遷移帯域の設定を省略することは妥当だと言えます。この手法に関しては、Selesnick、Lang、および Burrus による[3]の参考文献を参照してください。
通過帯域、阻止帯域、および遷移領域を定義する代わりに、CLS 法では指定した応答における、カットオフ周波数 (ハイパス、ローパス、バンドパス、またはバンドストップの場合)、または通過帯域および阻止帯域エッジ (マルチバンドの場合) を指定できます。このようにして、CLS 法では明示的に遷移領域を定義します。
CLS 法の主な特徴は、振幅応答内の許容最大リップルを含む上下のしきい値を定義することができることです。この制約を与えると、この手法では特定の帯域を対象とする代わりに、フィルター応答の周波数範囲全体に最小二乗誤差最小化手法が適用されきます。この誤差の最小化には、理想的な "ブリック ウォール" 応答における任意の不連続領域が含まれます。別の利点は、この方法ではギブズ現象から生じる任意の細かいピークを指定できることです。
この設計法を実装する 2 つの関数が用意されています。
これらの関数構文の呼び出しについては、関数リファレンスを参照してください。
基本的なローパスおよびハイパス 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; bCLS = fircls1(n,wo,dp,ds);
振幅応答を表示します。y 軸が振幅の二乗で表示されていることに注意してください。
filterAnalyzer(bCLS,MagnitudeMode="squared")
マルチバンド 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 フィルターを設計します。振幅応答を表示します。y 軸が振幅の二乗で表示されていることに注意してください。
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];
bCLSmb = fircls(n,f,a,up,lo);
filterAnalyzer(bCLSmb,MagnitudeMode="squared")
重み付き CLS フィルターの設計
重み付き CLS フィルター設計では、各帯域における誤差の最小化に相対的な重み付けを行うローパスまたはハイパス FIR フィルターを設計できます。関数 fircls1
では、重み付け最小二乗関数に対し、通過帯域および阻止帯域のエッジに加え、阻止帯域と通過帯域の重み付けの比率を指定する定数 k
を指定できます。
たとえば、55 のインパルス応答次数で、0.3 (正規化) のカットオフ周波数をもつ FIR フィルターの仕様を考えてみましょう。また、許容最大通過帯域リップルを 0.02、許容最大阻止帯域リップルを 0.004 とします。さらに、次の重み付けを必要条件に加えます。
重み関数に対する通過帯域エッジを 0.28 (正規化) とします。
重み関数に対する阻止帯域エッジを 0.32 とします。
阻止帯域での最小誤差が、通過帯域での最小誤差の 10 倍になるように重みを付けます。
fircls1
を使用してこの問題を解決するには、次のコマンドを入力します。y 軸が振幅の二乗で表示されていることに注意してください。
n = 55;
wo = 0.3;
dp = 0.02;
ds = 0.004;
wp = 0.28;
ws = 0.32;
k = 10;
bCLSw = fircls1(n,wo,dp,ds,wp,ws,k);
filterAnalyzer(bCLSw,MagnitudeMode="squared")
任意応答フィルターの設計
cfirpm
フィルター設計関数では、任意の複素応答をもつ FIR フィルターを設計するためのツールが提供されます。この関数は、フィルターの周波数応答の指定方法が他のフィルター設計関数とは異なります。関数 cfirpm では、周波数のグリッド上で計算したフィルター応答を返す関数名を受け取ることができるのです。このため cfirpm
は、非常に柔軟で強力なフィルター設計法です。
この設計法は、非線形位相 FIR フィルター、非対称周波数応答フィルター (複素係数をもつ)、またはカスタムの周波数応答をもつ、より対称的なフィルターの作成に使用することができます。
この設計アルゴリズムでは、初期推定に拡張 Remez 交換アルゴリズムを使用して、チェビシェフ (またはミニマックス) 誤差が最適化されます。この交換法で最適なフィルターを求めることができなかった場合は、アルゴリズムが上昇・下降アルゴリズムに切り替わり、このアルゴリズムが処理を引き継いで最適な回答への収束が完了されます。
マルチバンド フィルターの設計
次の特別な周波数領域特性をもつ、マルチバンドフィルターを考えます。
帯域 | 振幅 | 最適化の重み付け |
---|---|---|
線形位相マルチバンド フィルターは、あらかじめ定義されている周波数応答関数 multiband
を使用して、以下のように設計できます。
bMBh = cfirpm(38, [-1 -0.5 -0.4 0.3 0.4 0.8], ...
{@multiband, [5 1 2 2 2 1]}, [1 10 5]);
マルチバンド フィルターの特定のケースでは、firpm
の構文と同様の簡易フィルター設計表記法を使用できます。
bMBd = 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 つの遷移帯域があることに注意してください。
いずれの場合も、周波数応答を求め、線形スケールを使用してプロットします。データの範囲が (-pi,pi)
であることに注意してください。
filterAnalyzer(bMBd,FrequencyRange="centered")
このマルチバンド フィルターのフィルター応答は複素数となりますが、これは周波数領域での非対称性から予測可能なものです。インパルス応答を次に示します。インパルス応答を以下に示します。
filterAnalyzer(bMBd,Analysis="impulse")
遅延の小さいフィルターの設計
カットオフ周波数がナイキスト周波数の半分である、62 タップのローパス フィルターの設計を考えてみましょう。フィルター設計関数 lowpass
に負のオフセット値を指定した場合、この設計に対する群遅延オフセットは、標準的な線形位相設計に対して得られるものより著しく低くなります。このフィルター設計は、次のように計算することができます。
bRD = cfirpm(61,[0 0.5 0.55 1],{@lowpass,-16});
結果として得られる振幅応答は、次のようになります。また、y 軸では、振幅が 2 乗になっています。これは、軸のラベルを右クリックして、メニューから [振幅の二乗] を選択して設定します。
filterAnalyzer(bRD,MagnitudeMode="squared")
フィルターの群遅延は、オフセットが N/2
から N/2-16
(すなわち、30.5
から 14.5
) に低減されたことを示しています。ただし、通過帯域における群遅延は平坦ではありません。このプロットを作成するには、ツール バーの [群遅延応答] ボタンをクリックします。
filterAnalyzer(bRD,Analysis="groupdelay")
この非線形位相フィルターを、正確に 14.5 サンプルの群遅延をもつ線形位相フィルターと比較すると、結果として得られるフィルターの次数は 2*14.5、すなわち 29 となります。bRD = cfirpm(29,[0 0.5 0.55 1],"lowpass")
を使用すると、通過帯域および阻止帯域のリップルは、29 次フィルターとしてははるかに大きくなります。これらの比較は、特定のアプリケーションに適したフィルターを判断するときに役立ちます。