ドキュメンテーション

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

firls

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

構文

b = firls(n,f,a)
b = firls(n,f,a,w)
b = firls(n,f,a,'ftype')
b = firls(n,f,a,w,'ftype')

説明

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

b = firls(n,f,a) では、ベクトル fa で表される周波数-振幅特性を近似する n 次 FIR フィルターの n+1 個の係数を含んだ行ベクトル b が返されます。b に出力されるフィルター係数、すなわち "タップ" は、対称な関係をもちます。

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

これらは、I 型 (次数 n が奇数) と II 型 (n が偶数) の線形位相フィルターになります。ベクトル f と a では、フィルターの周波数-振幅特性が指定されます。

  • f は、0 ~ 1 の範囲で指定される周波数点のベクトルで、1 はナイキスト周波数に対応します。周波数は増加する順でなければなりません。重複する周波数点の設定は可能です。実際にこのような周波数点を使用して、関数 fir1 と関数 fir2 で返されるフィルターとまったく同じフィルターを、箱型ウィンドウ (rectwin)を使用して設計できます。

  • 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 は、同じ長さです。この長さは、偶数でなければなりません。

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

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

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

b = firls(n,f,a,'ftype')

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

  • 'hilbert' : 奇数の対称な線形位相フィルター (III 型および IV 型) 用。b の出力係数は、次の関係に従ったものとなります。

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

    このクラスのフィルターにはヒルベルト変換器が含まれ、これは帯域全体で目的の振幅 1 をもちます。

  • 'differentiator': 特別な重み付け手法を使った III 型と IV 型フィルター用。非ゼロの振幅帯域では、低周波数での誤差が高周波数での誤差よりも小さくなるように、積分二乗誤差に (1/f)2 の重み付けを行います。周波数に比例した振幅特性をもつ FIR 微分器では、フィルターによって相対的な積分二乗誤差 (誤差の望ましい振幅に対する比の二乗の積分) が最小にされます。

すべて折りたたむ

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

b = firls(255,[0 0.25 0.3 1],[1 1 0 0]);
fvtool(b,1,'OverlayedAnalysis','phase')

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

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

fvtool(b,1,'MagnitudeDisplay','zero-phase')

区分線形通過帯域をもつ 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')

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

1 番目の設計では、阻止帯域の重みを通過帯域の重みより 100 倍大きくします。阻止帯域の振幅応答がフラットでゼロに近いことが不可欠な場合には、この仕様を使用します。通過帯域リップルは、阻止帯域リップルより約 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]')

診断

誤った引数を使用した場合、次のいずれかの警告メッセージが表示されます。

F は偶数長でなければなりません。F と A は等しい長さでなければなりません。'hilbert' または 'differentiator' は対称にする必要があります。帯域ごとに 1 つの重みが必要です。F の周波数を減少するベクトルにはできません。F の周波数は [0,1] の範囲でなければなりません。

より深刻な警告メッセージは、次のとおりです。

Warning: Matrix is close to singular or badly scaled.

この警告は、フィルターの長さと遷移幅の積が大きくなったときに発生される傾向にあります。この場合、フィルター係数 b が希望のフィルターを表現していない可能性があります。周波数応答を調べることで、フィルターをチェックできます。

アルゴリズム

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

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

線形位相フィルター タイプフィルター次数係数の対称性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] Parks, Thomas W., and C. Sidney Burrus. Digital Filter Design. New York: John Wiley & Sons, 1987, pp. 54–83.

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

拡張機能

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

R2006a より前に導入