メインコンテンツ

cfirpm

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

説明

b = cfirpm(n,f,fresp) は、関数 fresp (関数ハンドル @fresp によって呼び出される) によって返される f の周波数において、目的の応答に最も近似する長さ n+1 の FIR フィルターを返します。詳細については、ユーザー定義の周波数応答関数を参照してください。

b = cfirpm(n,f,fresp,w) では、w で指定された重みを使用して、各周波数帯域の近似に重み付けが行われます。

b = cfirpm(n,f,a) では、f の帯域エッジの振幅 a を指定します。この構文は、b = cfirpm(n,f,{@multiband,a}) と同じ結果を返します。詳細については、事前に定義された周波数応答関数を参照してください。

b = cfirpm(n,f,a,w) では、最適化中にオプションとして使用される、帯域ごとに 1 つの正加重のセットが適用されます。w を指定しない場合、関数は重みを 1 に設定します。

b = cfirpm(___,sym) では、設計のインパルス応答に対称的な制約を与えます。sym の指定に加え、前の構文の入力引数を任意に組み合わせて指定します。

b = cfirpm(___,debug) では、フィルター設計中に中間結果を表示または非表示にします。

b = cfirpm(___,lgrid) では、周波数グリッドの密度を制御します。

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

[b,delta] = cfirpm(___) では、最大リップル高 delta が返されます。

[b,delta,res] = cfirpm(___) は、さらに周波数応答特性を構造体 res として返します。

すべて折りたたむ

30 次の線形位相ローパス フィルターを設計します。その振幅応答と位相応答を表示します。

b = cfirpm(30,[-1 -0.5 -0.4 0.7 0.8 1],@lowpass);
freqz(b,1,[],"whole")

Figure contains 2 axes objects. Axes object 1 with title Phase, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Phase (degrees) contains an object of type line. Axes object 2 with title Magnitude, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Magnitude (dB) contains an object of type line.

cfirpm を使用して、正規化された周波数範囲 w[-1,1] の非線形位相オールパス システムを近似する次数 N = 22 の FIR フィルターを設計します。フィルターの周波数応答を計算します。

n = 22;
w = [-1 1];

b = cfirpm(n,w,"allpass");

[h,f] = freqz(b,1,[],'whole');

cfirpm アルゴリズムは、exp(-jπwN/2+j4πw|w|) によって得られるフィルター応答を近似します。周波数応答の実数部と虚数部をプロットし、ターゲット応答を重ね合わせます。

gf = linspace(-1,1,256);
d = exp(-1j*pi*gf*n/2 + 4j*pi*gf.*abs(gf));

figure
subplot(2,1,1)
plot(f/pi,real(h), ...
    gf+1,fftshift(real(d)),'.')
ylabel("Real")
ylim(1.1*[-1 1])

subplot(2,1,2)
plot(f/pi,imag(h), ...
    gf+1,fftshift(imag(d)),'.')
ylabel("Imaginary")
ylim(1.1*[-1 1])

Figure contains 2 axes objects. Axes object 1 with ylabel Real contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 2 with ylabel Imaginary contains 2 objects of type line. One or more of the lines displays its values using only markers

FIR フィルターの振幅および位相応答をプロットします。振幅応答を dB 単位で、位相応答を度単位で表します。

freqz(b,1,[],'whole')

Figure contains 2 axes objects. Axes object 1 with title Phase, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Phase (degrees) contains an object of type line. Axes object 2 with title Magnitude, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Magnitude (dB) contains an object of type line.

カスタム周波数応答関数 fresp を使用して次数 30 のローパス フィルターを設計します。関数 fresp のコードは、この例の終わりにあります。

[b,delta]= cfirpm(30,linspace(-1,1,32),@fresp);

フィルターの振幅応答を可視化します。

freqz(b,1,"whole")

Figure contains 2 axes objects. Axes object 1 with title Phase, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Phase (degrees) contains an object of type line. Axes object 2 with title Magnitude, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Magnitude (dB) contains an object of type line.

ユーザー定義の fresp 関数: ローパス フィルターの設計

関数 fresp を使用すると、ローパス フィルター、ハイパス フィルター、または微分器の設計を選択できます。フィルター次数 N と周波数配列 F を指定しなければなりません。周波数グリッド GF と重み W を指定しない場合、関数はこれらの値を自動的に決定します。

function [dh,dw] = fresp(N,F,GF,W)

W = [1;1]*(W(:).'); W = W(:);

type = 'lowpass';

mags = zeros(size(W));

switch type
    case 'lowpass'
        mags(10:end-10) = 1;
    case 'highpass'
        mags(1:10) = 1;
        mags(end-10:end) = 1;
    case 'differentiator'
        mags = abs(linspace(-pi,pi,length(mags)));
end

dh = interp1(F(:),mags,GF).*exp(-1j*pi*GF*N/2);
dw = interp1(F(:),W,GF);

end

入力引数

すべて折りたたむ

フィルター次数。正の実数スカラーとして指定します。

正規化周波数点。範囲 [–1, 1] の要素をもつ実数値のベクトルとして指定します。ここで、1 は正規化されたナイキスト周波数に対応します。周波数は増加する順でなければならず、f は偶数長であることが必要です。周波数帯域は、k が奇数の場合、f(k)f(k+1) の範囲です。奇数 k に対して f(k+1) ~ f(k+2) の区間は "遷移帯域"、すなわち最適化の "don't care" 領域です。

周波数応答。関数ハンドルとして指定します。詳細については、事前に定義された周波数応答関数ユーザー定義の周波数応答関数を参照してください。

f で指定した点での目的の振幅。ベクトルとして指定します。k が偶数の場合、点 f(k) と点 f(k+1) 間の周波数における希望する振幅は、点 (f(k),a(k)) と点 (f(k+1),a(k+1)) とを結ぶライン セグメントです。

各周波数帯域の適合の調整に使用される重み付け。実数値ベクトルとして指定します。w の長さは f の長さの半分で、帯域あたり厳密に 1 つの重みに相当します。w を指定しない場合、関数は重みを 1 に設定します。

フィルター設計のインパルス応答に課される対称性の制約。次のいずれかの値を指定します。

  • 'none' — 対称性の制約を課しません。関数に負の帯域周波数を渡した場合、または fresp によって既定値が与えられない場合は、このオプションが既定値になります。

  • 'even' — 実数かつ偶数のインパルス応答に制限します。このオプションはハイパス、ローパス、オールパス、バンドパス、バンドストップ、逆 sinc およびマルチバンドの設計の場合の既定値です。

  • 'odd' — 実数かつ奇数のインパルス応答に制限します。このオプションは、ヒルベルト変換および微分器設計の場合の既定値です。

  • 'real' — 周波数応答に共役対称性の制約を課します。

'none' 以外の値を指定した場合、正の周波数上にのみ帯域エッジを指定しなければなりません (負の周波数領域は対称性によって埋められます)。sym を指定しない場合、関数は既定の設定を確認するために fresp を呼び出します。ユーザー定義の関数 fresp は、フィルター次数 n として 'defaults' を受け取れば、有効な sym オプションを返さなければなりません。

フィルター設計中の中間結果の表示。'off''trace''plots' または 'both' として指定します。

周波数グリッドの密度。整数の cell 配列として指定します。周波数グリッドには約 2^nextpow2(lgrid*n) 個の周波数点があります。

出力引数

すべて折りたたむ

フィルター係数。長さ n+1 の行ベクトルとして返されます。

最大リップル高。スカラーとして返されます。

周波数応答の特性。構造体として返されます。構造体 res には次のフィールドが含まれています。

フィールド

説明

res.fgrid

フィルター設計の最適化に使用される周波数グリッド ベクトル

res.des

res.fgrid の各点に対する望ましい周波数応答

res.wt

res.fgrid の各点の重み

res.H

res.fgrid の各点に対する実際の周波数応答

res.error

res.fgrid (res.des-res.H) の各点の誤差

res.iextr

極値周波数に対する res.fgrid へのインデックスのベクトル

res.fextr

極値周波数のベクトル

詳細

すべて折りたたむ

アルゴリズム

関数 cfirpm を使用すると、複素となる可能性のある FIR フィルターの設計において、任意の周波数領域の制約を指定できます。チェビシェフ (またはミニマックス) フィルター誤差が最適化され、等リップル FIR フィルター設計が作成されます。

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

参照

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

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

[3] Karam, L.J., and J. H. McClellan. "Complex Chebyshev Approximation for FIR Filter Design." IEEE® Transactions on Circuits and Systems II: Analog and Digital Signal Processing 42, no. 3 (March 1995): 207–216.

拡張機能

すべて展開する

バージョン履歴

R2006a より前に導入