ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

firpm

Parks-McClellan 最適 FIR フィルターの設計

構文

b = firpm(n,f,a)
b = firpm(n,f,a,w)
b = firpm(n,f,a, 'ftype')
b = firpm(n,f,a,w, 'ftype')
b = firpm(...,{lgrid})
[b,err] = firpm(...)
[b,err,res] = firpm(...)
b = firpm(n,f,@fresp,w)
b = firpm(n,f,@fresp,w,'ftype')

説明

firpm では、Parks-McClellan アルゴリズム [1] を使用して、 線形位相 FIR フィルターが設計されます。Parks-McClellan アルゴリズムでは、Remez 交換アルゴリズムとチェビシェフ 近似理論が使用され、希望する周波数応答と実際の周波数応答が最も近づくようにフィルターを設計します。フィルターは、希望周波数応答と実際の周波数応答間の最大誤差が最小化されているという点で、最適化されているといえます。この方法で設計されたフィルターは、周波数応答で等リップル動作を示すため、"等リップル フィルター" と呼ばれる場合もあります。firpm は、この等リップル特性のため、インパルス応答の最初と最後に非連続性を示します。

b = firpm(n,f,a) では、ベクトル fa で表される周波数-振幅特性を近似する n 次 FIR フィルターの n+1 個の係数を含んだ行ベクトル b が返されます。

b の出力フィルター係数 (タップ) は、対称関係に従います。

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

ベクトル fa では、フィルターの周波数-振幅特性が指定されます。

  • f は、0 ~ 1 の範囲で指定される、正規化された周波数点のペアのベクトルです。ここで、1 はナイキスト周波数に相当します。周波数は増加する順でなければなりません。

  • a は、f で指定した点での希望する振幅を含むベクトルです。

    k が偶数の場合 (f(k),f(k+1)) 点間の周波数における希望する振幅は、点 (f(k),a(k)) と点 (f(k+1),a(k+1)) の間を接続するライン セグメントです。

    k が奇数の場合、点のペア (f(k),f(k+1)) 間の周波数において希望する振幅は指定されません。このような点の間の領域は、遷移領域または "don't care" 領域です。

  • fa は同じ長さでなければなりません。長さは偶数でなければなりません。

希望周波数応答を定義するベクトル f とベクトル a 間の関係を、以下の例で示します。

firpm では、偶数の対称性と、ナイキスト周波数で非ゼロの通過帯域をもつ構成に対し、常に偶数のフィルター次数が使用されます。これは、偶数の対称性と奇数の次数を示すインパルス応答に対し、ナイキスト周波数での周波数応答が必ず 0 になるためです。n に奇数の値を指定した場合、firpm によりこの値に 1 が加算されます。

b = firpm(n,f,a,w) では、ベクトル w の重みを使用して、各周波数帯域の近似に重みを付けます。w の長さは、f および a の長さの半分になるため、帯域ごとに厳密に 1 つの重みが存在します。

    メモ:   b = firpm(n,f,a,w) は、b = firpm(n,f,{@firpmfrf,a},w) と等価です。ここで、@firpmfrffirpm に対してあらかじめ定義された周波数関数のハンドルです。必要に応じて、自分独自の応答関数を作成できます。詳細は、help private/firpmfrf を参照してください。

b = firpm(n,f,a, 'ftype') および

b = firpm(n,f,a,w, 'ftype') では、フィルター タイプが指定されます。ここで、'ftype' は次のいずれかになります。

  • 'hilbert': 奇数の対称な線形位相フィルター (III 型および IV 型) 用。

    b の出力係数は、 b(k) = –b(n+2 –k), k= 1, ...,n+1 の関係に従ったものとなります。このクラスのフィルターには、全帯域にわたり 1 という望ましい振幅をもつヒルベルト変換器が含まれます。

    たとえば、

    h = firpm(30,[0.1 0.9],[1 1],'hilbert');
    

    上の式では、長さ 31 の近似 FIR ヒルベルト変換器が設計されます。

  • 'differentiator': 特別な重み付け手法を使った III 型と IV 型フィルター用。

    ゼロ以外の振幅帯域に対しては、低周波数での誤差が高周波数での誤差よりも小さくなるように、誤差に 1/f 分の重みが付けられます。周波数に比例した振幅特性をもつ FIR 微分器に対しては、これらのフィルターでは最大相対誤差 (希望する振幅に対する最大誤差率) が最小化されます。

b = firpm(...,{lgrid}) では、整数 lgrid を使用して周波数グリッドの密度がコントロールされます。このグリッドにはおよそ (lgrid*n)/(2*bw) の周波数点があり、bwf でカバーされる周波数帯域区間 [0,1] 全体の一部です。lgrid を増やすと、多くの場合等リップルフィルターにほぼ正確に一致するフィルターとなりますが、計算に時間がかかります。既定値 16 は、lgrid に指定できる最小値です。{lgrid} 引数は 1 行 1 列のセル配列であることに注意してください。

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

[b,err,res] = firpm(...) は、以下のフィールドをもつ構造 res を返します。

res.fgrid

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

res.des

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

res.wt

opt.fgrid の各点の重み

res.H

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

res.error

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

res.iextr

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

res.fextr

極値周波数のベクトル

firpm を使用して、希望する周波数応答を定義する関数を作成することもできます。firpm に対してあらかじめ定義された周波数応答関数のハンドルは @firpmfrf で、線形位相 FIR フィルターを設計するものです。

b = firpm(n,f,@fresp,w) では、n 次 FIR フィルターの n+1 個の係数を含んだ行ベクトル b が返されます。この周波数-振幅特性は、関数ハンドル @fresp が返す応答を最もよく近似します。この関数は、以下の構文によって firpm の内部から呼び出されます。

[dh,dw] = fresp(n,f,gf,w)

引数は firpm の引数と同様です。

  • n はフィルター次数です。

  • f は、0 ~ 1 (1 はナイキスト周波数) で単調増加する、正規化された周波数帯域エッジのベクトルです。

  • gf は、firpm により指定された各周波数帯域に対し線形に内挿されたグリッド点のベクトルです。gf は応答関数が評価される周波数グリッドを決定し、opt 構造の fgrid フィールドに cfirpm によって返されたデータと同じデータを含みます。

  • w は、最適化中に使用される帯域ごとの正で実数の重みのベクトルです。w は、firpm を呼び出す際にはオプションです。指定しない場合は、fresp に渡される前に均一の重み付けに設定されます。

  • dhdw は、それぞれ望ましい複素周波数応答と帯域重みのベクトルで、グリッド gf の各周波数で評価されます。

b = firpm(n,f,@fresp,w,'ftype') では、非対称 (奇数) フィルターが設計されます。ここで、'ftype' は、微分器を表す 'd' またはヒルベルト変換器を表す 'h' のいずれかとなります。ftype を指定しない場合、既定の対称性プロパティ symを決定するために、fresp が呼び出されます。この呼び出しは構文を使用して行われます。

sym = fresp('defaults',{n,f,[],w,p1,p2,...})

引数 nfw などは、必要に応じて、sym への適切な値を決定するのに使用されます。この値は、firpm によって 'even' または 'odd' が予想されています。関数 fresp でこの呼び出し構文がサポートされない場合、firpm は既定である偶数の対称に設定されます。

すべて折りたたむ

Parks-McClellan バンドパス フィルター

Parks-McClellan アルゴリズムを使用して次数 17 の FIR バンドパス フィルターを設計します。正規化された阻止帯域周波数 $0.3\pi$ $0.7\pi$ ラジアン/サンプルと正規化された通過帯域周波数 $0.4\pi$ $0.6\pi$ ラジアン/サンプルを指定します。目的の周波数応答と実際の周波数応答をプロットします。

f = [0 0.3 0.4 0.6 0.7 1];
a = [0 0.0 1.0 1.0 0.0 0];
b = firpm(17,f,a);

[h,w] = freqz(b,1,512);
plot(f,a,w/pi,abs(h))
legend('Ideal','firpm Design')
xlabel 'Radian Frequency (\omega/\pi)', ylabel 'Magnitude'

ヒント

フィルター設計が収束しない場合でも、フィルター設計は正しい可能性があります。周波数応答を調べて設計を検証してください。

フィルター設計が収束せず、生成されたフィルター設計が正しくない場合は、以下のうち 1 つまたは複数を試してください。

  • フィルターの次数を大きくする

  • 阻止帯域の減衰を小さくするか遷移領域を拡大する (あるいはその両方を行う) ことで、フィルターの設計を緩和する

詳細

すべて折りたたむ

アルゴリズム

firpm は、[1] からの元のフォートラン コードの MEX ファイルのバージョンで、任意の数の線形帯域で、任意の長さフィルターを設計するために変更されています。

firpm では、I 型、II 型、III 型、および IV 型の線形位相フィルターが設計されます。I 型および II 型は、それぞれ偶数 n および奇数 n の既定フィルターで、III 型 (n が偶数) および IV 型 (n が奇数) は、'hilbert' フラグおよび 'differentiator' フラグを設定して取得できます。異なるタイプのフィルターは、周波数応答に対して異なる対称性および制約をもちます (詳細は [5] を参照)。

線形位相フィルター タイプフィルター次数係数の対称性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

firpm では、ナイキスト周波数で非ゼロの通過帯域をもつ II 型のフィルターを作成する場合、フィルターの次数を 1 増やします。

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

制約なし

参考文献

[1] Digital Signal Processing Committee of the IEEE Acoustics, Speech, and Signal Processing Society, eds. Programs for Digital Signal Processing. New York: IEEE Press, 1979, algorithm 5.1.

[2] Digital Signal Processing Committee of the IEEE Acoustics, Speech, and Signal Processing Society, eds. Selected Papers in Digital Signal Processing. Vol. II. New York: IEEE Press, 1976.

[3] Parks, Thomas W., and C. Sidney Burrus. Digital Filter Design. New York: John Wiley & Sons, 1987, p. 83.

[4] Rabiner, Lawrence R., James H. McClellan, and Thomas W. Parks. “FIR Digital Filter Design Techniques Using Weighted Chebyshev Approximation.” Proceedings of the IEEE®. Vol. 63, Number 4, 1975, pp. 595–610.

[5] Oppenheim, Alan V., Ronald W. Schafer, and John R. Buck. Discrete-Time Signal Processing. Upper Saddle River, NJ: Prentice Hall, 1999, p. 486.

この情報は役に立ちましたか?