| Signal Processing Toolbox | ![]() |
表示
b = cremez(n,f,'fresp') b = cremez(n,f,'fresp',w) b=cremez(n,f,{'fresp',p1,p2,...},w) b=cremez(n,f,a,w) b=cremez(...,'sym') b=cremez(...,'skip_stage2') b=cremez(...,'debug') b=cremez(...,{lgrid}) [b,delta,opt]=cremez(...)
詳細
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です。
lowpass, highpass, bandpass, bandstopこれらの関数は、共通の構文を使います。ここでは、'lowpass'の例を示します。
multibandは、任意帯域振幅をもつ線形位相周波数応答フィルタを設計します。 b = cremez(n,f,{'multiband',a},...) および
b = cremez(n,f,{'multiband',a,d},...) は、fの中の帯域エッジに希望する振幅を含んだベクトルaを設定します。kが奇数の場合、点(f(k), f(k+1))の間の周波数で希望する振幅は、点(f(k),a(k))と点(f(k+1),a(k+1))を結ぶ線分となります。
differentiatorは、線形位相微分器を設計します。これらの設計では、ゼロ周波数は遷移帯域内になければならず、帯域の重み付けは周波数に反比例して設定されます。 b = cremez(n,f,{'differentiator',fs},...) および
b = cremez(n,f,{'differentiator',fs,d},...)は、微分器の応答の勾配を決定するのに用いるサンプリングレートfsを設定します。省略した場合、fsは 1にデフォルト設定されます。
hilbfiltは、線形位相Hilbert変換フィルタの応答を設計します。Hilbert設計では、ゼロ周波数は遷移帯域内になければなりません。 は、b = cremez(n,f,a,w)
b = cremez(n,f,{'multiband',a},w)と等価です。
は、設計のインパルス応答に対称性を制約とします。ここで、b = cremez(...,'sym')
'sym'には、つぎの文字列を設定することができます。
'none':対称性の制約なし これは、任意の負の帯域エッジ周波数を通過させる場合か、あるいは'fresp'によってデフォルト値が与えられない場合のデフォルト値です。
'even':実数かつ偶数のインパルス応答 これは、ハイパス、ローパス、バンドパス、バンドストップ、および、マルチバンド設計の場合のデフォルト値です。
'odd':実数かつ奇数のインパルス応答 これは、Hilbertおよび微分器設計の場合のデフォルト値です。
'real':周波数応答に対する共役対称性 '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を出力し、つぎの内容が含まれています。
例題 1
b = cremez(30,[-1 -0.5 -0.4 0.7 0.8 1],'lowpass');
freqz(b,1,512,'whole');
例題 2
まず、希望する周波数応答を出力する関数frespを選択します。この例題では、frespは、非線形位相オールパスフィルタの周波数応答を出力するsignal/signal/privateデレクトリに存在するallpass.m関数を選択します。この例題を行う前に、allpass.mをMATLABパス上の他の位置にコピーします。
フィルタ係数を作成するために、allpass.mと共に、cremezを使う前に、希望する応答を作成するためにallpass.mのみを単独で読み込みます。
n=22; % フィルタ次数 f=[-1 1]; % 周波数バンドエッジ w=[1 1]; % 最適化用の重み gf=linspace(-1,1,256); % 周波数点のグリッド d=allpass(n,f,gf,w); % 希望する周波数応答
さて、ベクトルdは、cremezにより計算されるFIRフィルタに対して、希望する複素周波数応答を含んでいます。
b = cremez(n,f,'allpass',w,'real' ); % 近似
freqz(b,1,256,'whole');
freqzプロットは、希望する応答を近似するためcremez で計算されるフィルタの周波数応答を示しています。このプロット上に希望する周波数応答を重ねて近似の精度をチェックしてください。
subplot(2,1,1); hold on
plot(pi*(gf+1),20*log10(abs(fftshift(d))),'r--')
subplot(2,1,2); hold on
plot(pi*(gf+1),unwrap(angle(fftshift(d)))*180/pi,'r--')
legend('Approximation','Desired')
注意
'fresp'に対する既定の周波数応答関数の代わりに、ユーザ定義可能関数を使用することができます。この関数は、つぎの構文を使って、cremez内部に読み込まれます。
[dh,dw] =fresp(n,f,gf,w,p1,p2,...)
n はフィルタ次数です。 f は、-1と1の間に単調に表現する周波数帯域エッジのベクトルです。ここで、1はNyquist周波数です。 gfは、cremezによって設定された各周波数帯域上で線形に補間されたグリッド点のベクトルです。gf は、応答関数を評価しなければならない周波数グリッドを決定します。これは、opt構造体のfgridメンバーの中にcremezにより出力されるものと同じです。 wは、最適化の際に用いられる帯域毎の1つの実数かつ正の重みを設定するベクトルです。wは、cremezの使用において、オプションです。未設定の場合は、'fresp'に渡される前に単位重みに設定されます。dhとdw は、それぞれ、グリッドgf内の各周波数で評価される希望する複素周波数応答と帯域重みベクトルです。 p1, p2, ...は、'fresp'に渡すことができるオプションパラメータです。さらに、事前に'fresp'を使って、デフォルトの対称性'sym'を決定します。これには、つぎの構文を使います。
sym =fresp('defaults',{n,f,[],w,p1,p2,...})
必要に応じて、適切な対称性デフォルトを求めるのに引数を使用することができます。関数private/lowpass.mは、新しい周波数応答関数を生成するためのテンプレートとして役立ちます。
アルゴリズム
複素数の場合には、Remez交換法の拡張型が実行されます。この交換法により、フィルタの等リップル特性がn+2の極値をもつように制限された場合に、最適フィルタが得られます。これが収束しない場合、アルゴリズムは上昇-下降アルゴリズムに切り替わり、引き継いで最適解へ収束するようにします。詳細については、参考文献を参照してください。
参考
|
ウィンドウベースの有限インパルス応答フィルタの設計 − 標準応答 |
|
ウィンドウベースの有限インパルス応答フィルタの設計 − 任意応答 |
|
最小2乗線形位相FIRフィルタの設計 |
|
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 | ![]() |