Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

firls

最小二乗線形位相 FIR フィルターの設計

説明

b = firls(n,f,a) では、n 次の FIR フィルターの n+1 係数を含む行ベクトル b が返されます。結果として得られるフィルターの周波数と振幅の特性は、ベクトル fa によって与えられる特性と一致します。

b = firls(n,f,a,w)w を使用して周波数ビンを重み付けします。

b = firls(___,ftype) では、反対称 (奇数) フィルターが設計されます。ここで、ftype は、フィルターを微分器またはヒルベルト変換器として指定します。前の入力構文のいずれでも ftype を使用できます。

すべて折りたたむ

0.25π0.3π の遷移領域をもつ 255 次の FIR ローパス フィルターを設計します。フィルターの振幅応答と位相応答を表示します。

b = firls(255,[0 0.25 0.3 1],[1 1 0 0]);
freqz(b,1)

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.

理想的な微分器には、D(ω)=jω で与えられる周波数応答があります。0.9π より高い周波数を減衰させる次数 30 の微分器を設計します。周波数は π で正規化されるため、振幅に π の係数を含めます。フィルターのゼロ位相応答を表示します。

b = firls(30,[0 0.9],[0 0.9*pi],'differentiator');

zerophase(b,1)

Figure contains an axes object. The axes object with title Zero-Phase Response, xlabel Normalized Frequency ( times blank pi blank rad/sample), ylabel Amplitude contains an object of type line.

区分線形通過帯域をもつ 24 次の反対称フィルターを設計します。

F = [0 0.3 0.4 0.6 0.7 0.9]; 
A = [0 1.0 0.0 0.0 0.5 0.5];
b = firls(24,F,A,'hilbert');

目的の周波数応答と実際の周波数応答をプロットします。

[H,f] = freqz(b,1,512,2);
plot(f,abs(H))
hold on
for i = 1:2:6, 
   plot([F(i) F(i+1)],[A(i) A(i+1)],'r--')
end
legend('firls design','Ideal')
grid on
xlabel('Normalized Frequency (\times\pi rad/sample)')
ylabel('Magnitude')

Figure contains an axes object. The axes object with xlabel Normalized Frequency ( times pi blank rad/sample), ylabel Magnitude contains 4 objects of type line. These objects represent firls design, Ideal.

FIR ローパス フィルターを設計します。通過帯域を DC から 0.45π ラジアン/サンプルの範囲とします。阻止帯域を 0.55π ラジアン/サンプルからナイキスト周波数の範囲とします。最小二乗近似での帯域の重みを変えて、3 つの異なる設計を作成します。

1 番目の設計では、阻止帯域の重みを通過帯域の重みより 100 倍大きくします。阻止帯域の振幅応答がフラットで 0 に近いことが不可欠な場合には、この仕様を使用します。通過帯域リップルは、阻止帯域リップルより約 100 倍高くなります。

bhi = firls(18,[0 0.45 0.55 1],[1 1 0 0],[1 100]);

2 番目の設計では、通過帯域の重みが阻止帯域の重みより 100 倍大きくなるように重みを逆にします。通過帯域の振幅応答がフラットで 1 に近いことが不可欠な場合には、この仕様を使用します。阻止帯域リップルは、通過帯域リップルより約 100 倍高くなります。

blo = firls(18,[0 0.45 0.55 1],[1 1 0 0],[100 1]);

3 番目の設計では、両方の帯域に同じ重みを与えます。その結果、通過帯域と阻止帯域のリップルが似たフィルターになります。

b = firls(18,[0 0.45 0.55 1],[1 1 0 0],[1 1]);

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

hfvt = fvtool(bhi,1,blo,1,b,1,'MagnitudeDisplay','Zero-phase');
legend(hfvt,'bhi: w = [1 100]','blo: w = [100 1]','b: w = [1 1]')

Figure Figure 1: Zero-phase Response contains an axes object. The axes object with title Zero-phase Response, xlabel Normalized Frequency ( times pi blank rad/sample), ylabel Amplitude contains 3 objects of type line. These objects represent bhi: w = [1 100], blo: w = [100 1], b: w = [1 1].

入力引数

すべて折りたたむ

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

正規化周波数点。実数値のベクトルとして指定します。引数は、[0, 1] の範囲でなければなりません。ここで、1 はナイキスト周波数に対応します。ベクトルの要素数は、常に 2 の倍数になります。周波数は非減少の順でなければなりません。

f で指定した点での目的の振幅。ベクトルとして指定します。fa は同じ長さでなければなりません。長さは偶数でなければなりません。

  • k が偶数の場合 (f(k),f(k+1)) 点間の周波数における希望する振幅は、点 (f(k),a(k)) と点 (f(k+1),a(k+1)) とを結ぶ線分です。

  • k が奇数の場合、点のペア (f(k),f(k+1)) 間の周波数において希望する振幅は指定されません。このような点の間の領域は、遷移領域または特定のアプリケーションにとって重要ではない領域です。

各周波数帯域の適合の調整に使用される重み付け。実数値ベクトルとして指定します。w の長さは、f および a の長さの半分になるため、帯域ごとに厳密に 1 つの重みが存在します。

奇数の対称な線形位相フィルター (III 型および IV 型) のフィルター タイプ。'hilbert' または 'differentiator' として指定します。

  • 'hilbert'b の出力係数は、関係式 b(k) = -b(n + 2 - k), k = 1, ..., n + 1 に従います。このクラスのフィルターにはヒルベルト変換器が含まれ、これは帯域全体で目的の振幅 1 をもちます。

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

出力引数

すべて折りたたむ

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

詳細

すべて折りたたむ

フィルター長と遷移幅の不整合

フィルター長と遷移幅の積が大きくなるようにフィルターを設計する場合、次のような警告メッセージが表示されることがあります。Matrix is close to singular or badly scaled以下の例はこの制限を示しています。

b = firls(100,[0 0.15 0.85 1],[1 1 0 0]);
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND =  2.228479e-18.
freqz(b,1)

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.

この場合、フィルター係数 b が希望のフィルターを表現していない可能性があります。周波数応答を調べることで、フィルターをチェックできます。

アルゴリズム

firls は、線形位相 FIR フィルターを設計します。これは、目的とする一連の周波数帯域で、理想的な区分線形関数とフィルターの振幅応答の間の重み付き積分二乗誤差を最小にします。

参考文献[2]には、firls の背景となる理論的手法が説明されています。この関数は、MATLAB®\ 演算子を使用して、ほぼ n\2 のサイズの内積行列を含む線形方程式系を解きます。

これらは、I 型 (n が奇数) と II 型 (n が偶数) の線形位相フィルターになります。ベクトル 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 は、同じ長さです。この長さは、偶数でなければなりません。

目的の振幅応答を定義する際のベクトル fa の関係は、以下の図のようになります。

この関数は、I 型、II 型、III 型、およびIV 型の線形位相フィルターを設計します。I 型と II 型は、それぞれ n が偶数と奇数の場合の既定フィルターですが、'hilbert''differentiator' のフラグを付けると、III 型 (n が偶数の場合) と IV 型 (n が奇数の場合) のフィルターが作成されます。さまざまなフィルター タイプには、それぞれ異なる対称性と周波数応答に関する制約があります (詳細については、参考文献[1]を参照してください)。

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

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] Oppenheim, Alan V., Ronald W. Schafer, and John R. Buck. Discrete-Time Signal Processing. Upper Saddle River, NJ: Prentice Hall, 1999.

[2] Parks, Thomas W., and C. Sidney Burrus. Digital Filter Design. Hoboken, NJ: John Wiley & Sons, 1987, pp. 54–83.

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

バージョン履歴

R2006a より前に導入

すべて展開する