Signal Processing Toolbox    
cremez

複素数かつ非線形位相の等リップルFIRフィルタの設計

表示

詳細

cremezは、複素数FIRフィルタ設計に対して、設定される任意の周波数領域での制約を使います。等リップルFIRフィルタ設計を行なうのに、Chebyshev(または、ミニマックス)フィルタ誤差を最適化します。

b = cremez(n,f,'fresp') は、関数frespによって出力される希望する周波数応答に最適近似する長さn+1のFIRフィルタを出力します。fは、周波数帯域エッジを含むベクトルであり、-1 から 1の範囲で設定します。ここで、1はサンプリング周波数の1/2(正規化されたNyquist周波数)です。周波数は、昇順でなければならず、fは偶数の長さでなければなりません。周波数帯域は、kが奇数の場合、f(k)からf(k+1)までの範囲で、つまりkが奇数の場合、f(k+1)からf(k+2)の区間は遷移帯域、あるいは、最適化の際に配慮されない領域です。

b = cremez(n,f,'fresp',w) は、ベクトルw内の実数で非負の重みを使って、各周波数帯域での近似に重みを付けます。wの長さは、fの長さの半分で、帯域当たり厳密に1つの重みに相当します。

b = cremez(n,f,{'fresp',p1,p2,...},...) は、オプションパラメータp1, p2, ...を周波数応答関数frespに渡します。'fresp'に既定の周波数応答関数は、前に述べたように、いくつかの一般的なフィルタ設計のために含まれているものです。既定の周波数応答関数について、fに負の周波数が全く含まれず、かつ'none'の場合、対称性オプション'sym' は、'even'にデフォルト設定され、他の場合には、'sym''none'にデフォルト設計されます(詳細については、以下の'sym'オプションを参照)。既定のすべての周波数応答関数について、dは群遅延オフセットを設定し、フィルタの応答がサンプリング間隔を単位として、(n/2+d)の群遅延をもつようにします。負の値を設定すると遅れは減少し、正の値を設定すると遅れが増加します。デフォルトでは、d = 0です。

b = cremez(n,f,a,w) は、b = cremez(n,f,{'multiband',a},w)と等価です。

b = cremez(...,'sym') は、設計のインパルス応答に対称性を制約とします。ここで、'sym'には、つぎの文字列を設定することができます。

'none'以外の任意の'sym'オプションを設定した場合、帯域エッジは正の周波数上にのみ設定します。すなわち、負の周波数領域は対称性により得られます。引数'sym'オプションが設定されていない場合、'fresp' は、デフォルト設定用に使われます。

b = cremez(...,'skip_stage2') は、cremezが標準のRemez誤差交換によって最適解が求められなかったと判定した場合にのみ実行される第2段最適化アルゴリズムを無効にします。このアルゴリズムを無効にすると計算速度が向上する場合がありますが、精度が低下する可能性もあります。デフォルトでは、第2段最適化は有効です。

b = cremez(...,'debug') は、フィルタ設計中の中間結果の表示を行ないます。ここで、'debug'には、'trace''plots''both'、または'off'のいずれか1つを設定することができます。デフォルトでは、'off'に設定されます。

b = cremez(...,{lgrid}) は、整数lgridを使って、周波数グリッドの密度をコントロールします。大まかに、グリッドは、2^nextpow2(lgrid*n)個の周波数点を所有しています。lgridに対するデフォルト値は、25です。引数{lgrid}は、1行1列のセル配列になります。

'sym''skip_stage2'debug'{lgrid}の間での任意の組み合わせを設定することができます。

[b,delta] = cremez(...) は、最大リップルの高さdeltaを出力します。

[b,delta,opt] = cremez(...) は、cremezが計算した最適結果の構造体optを出力し、つぎの内容が含まれています。

opt.fgrid
フィルタ設計最適化に用いる周波数グリッドベクトル
opt.des
opt.fgrid内の各点に対する希望する周波数応答
opt.wt
opt.fgrid内の各点に対する重み
opt.H
opt.fgridの各点の周波数応答
opt.error
opt.fgridの各点の誤差
opt.iextr
特別な周波数を示すopt.fgrid内のインデックス
opt.fextr
極値周波数のベクトル

例題

例題 1

31タップの線形位相ローパスフィルタを設計します。

例題 2

非線形位相オールパスFIRフィルタの設計

まず、希望する周波数応答を出力する関数frespを選択します。この例題では、frespは、非線形位相オールパスフィルタの周波数応答を出力するsignal/signal/privateデレクトリに存在するallpass.m関数を選択します。この例題を行う前に、allpass.mをMATLABパス上の他の位置にコピーします。

フィルタ係数を作成するために、allpass.mと共に、cremezを使う前に、希望する応答を作成するためにallpass.mのみを単独で読み込みます。

さて、ベクトルdは、cremezにより計算されるFIRフィルタに対して、希望する複素周波数応答を含んでいます。

さて、この応答に最も近似するFIRフィルタを計算します。

freqzプロットは、希望する応答を近似するためcremez で計算されるフィルタの周波数応答を示しています。このプロット上に希望する周波数応答を重ねて近似の精度をチェックしてください。

注意

'fresp'に対する既定の周波数応答関数の代わりに、ユーザ定義可能関数を使用することができます。この関数は、つぎの構文を使って、cremez内部に読み込まれます。

ここで、

さらに、事前に'fresp'を使って、デフォルトの対称性'sym'を決定します。これには、つぎの構文を使います。

必要に応じて、適切な対称性デフォルトを求めるのに引数を使用することができます。関数private/lowpass.mは、新しい周波数応答関数を生成するためのテンプレートとして役立ちます。

アルゴリズム

複素数の場合には、Remez交換法の拡張型が実行されます。この交換法により、フィルタの等リップル特性がn+2の極値をもつように制限された場合に、最適フィルタが得られます。これが収束しない場合、アルゴリズムは上昇-下降アルゴリズムに切り替わり、引き継いで最適解へ収束するようにします。詳細については、参考文献を参照してください。

参考
fir1
ウィンドウベースの有限インパルス応答フィルタの設計 − 標準応答
fir2
ウィンドウベースの有限インパルス応答フィルタの設計 − 任意応答
firls
最小2乗線形位相FIRフィルタの設計
remez
Parks-McClellan最適FIRフィルタの設計

参考文献

[1] Karam, L.J., and J.H. McClellan. "Complex Chebyshev Approximation for FIR Filter Design." IEEE Trans. on Circuits and Systems II. March 1995. Pgs. 207-216.

[2] Karam, L.J. Design of Complex Digital FIR Filters in the Chebyshev Sense. Ph.D. Thesis, Georgia Institute of Technology, March 1995.

[3] Demjanjov, V.F., and V.N. Malozemov. Introduction to Minimax. New York: John Wiley & Sons, 1974.


 cplxpair csd