Signal Processing Toolbox | ![]() ![]() |
ウィンドウ法
0ラジアン/秒のカットオフ周波数をもつ、理想的なすなわち"急峻な特性をもつ"ディジタルローパスフィルタを考えます。このフィルタは、
0未満の周波数でゲイン1をもち、
0と
の間の周波数でゲイン0になります。このフィルタのインパルス応答列h(n)は、
となります。このフィルタは、インパルス応答が無限で、非因果的であるため実現することはできません。有限時間のインパルス応答を作成するには、ウィンドウを適用することにより、これを打ち切ります。この打ち切りにおいてインパルス応答の中心部分を保持することにより、線形位相FIRフィルタが得られます。たとえば、0.4ラジアン/秒のローパスカットオフ周波数
0をもつ長さ51のフィルタは、つぎのようになります。
b = 0.4*
sinc(0.4*
(-25:25));
ここで、適用するウィンドウは、単純な箱形すなわちボックスカーウィンドウです。Parsevalの定理によって、これは、誤差の二乗和を最小にする点で理想的なローパスフィルタに最良近似する長さ51のフィルタとなります。この周波数応答を表示するには、つぎのようにします。
[H,w] = freqz(b,1,512,2); plot(w,abs(H)), grid
特に、帯域エッジ付近の応答内のリンギングとリップルに注目してください。フィルタの長さが長くなっても、このギブズ効果が消えることはありませんが、非箱形ウィンドウを使うことで、その大きさは小さくなります。時間領域でウィンドウを適用することは、周波数領域でのコンボリューションまたは平滑化をもたらします。つぎのようにして、このフィルタに長さ51のHammingウィンドウを適用します。
b = b.*
hamming(51)';
[H,w] = freqz(b,1,512,2);
plot(w,abs(H)), grid
これを見ればわかるように、リンギングが大幅に減少しています。この改善は、遷移幅(ウィンドウを適用すると通過帯域から遮断帯域までのランプがより長くなります)と最適性(ウィンドウ適用形では二乗和誤差が最小にはなりません)を犠牲に成り立っています。
関数fir1
およびfir2
は、このウィンドウ処理に基づいています。希望の理想フィルタの次数および表現が与えられると、これらの関数は、その理想フィルタのウィンドウを適用した逆フーリエ変換を出力します。デフォルトでは、共にHammingウィンドウを使用しますが、任意のウィンドウ関数を設定することもできます。ウィンドウの概要とその特性については、"ウィンドウ"の節を参照してください。
標準帯域FIRフィルタの設計: fir1
fir1
は、ウィンドウを適用した線形位相FIRディジタルフィルタ設計の古典的な手法を実行します。これは、標準帯域構造(ローパス、バンドパス、ハイパス、およびバンドストップ)でフィルタ設計するように定式化されているという点でIIRフィルタ設計関数に似ています。
n = 50; Wn = 0.4; b = fir1(n,Wn);
は、n
次のHammingウィンドウフィルタの係数を含む行ベクトルb
を作成します。これは、カットオフ周波数Wn
をもつローパス線形位相FIRフィルタです。ここで、Wn
は0と1の間の数で、1はサンプリング周波数の1/2であるNyquist周波数に相当します(他の手法とは異なり、ここで、Wn
は6
dB点に対応します)。ハイパスフィルタの場合、単に関数の入力引数に文字列'high'
を付加するだけです。バンドパス、または、バンドストップフィルタの場合、通過帯域エッジ周波数を含む2要素ベクトルとしてWnを設定し、バンドストップ構成に対しては文字列'stop'
を付加します。
b = fir1(n,Wn,window)
は、列ベクトルwindow
に設定されたウィンドウを使用して設計を行います。ベクトルwindow
は、n+1
の要素長でなければなりません。ウィンドウを設定しなければ、fir1
はHammingウィンドウを適用します。
Kaiserウィンドウの次数推定
関数kaiserordは、与えられた仕様を満たすために必要なフィルタの次数、カットオフ周波数、およびKraiserウィンドウのベータパラメータを推定します。周波数帯域エッジのベクトルと対応する大きさのベクトル、さらに許容最大リップルが与えられると、kaiserord
は関数fir1に適切な入力パラメータを出力します。
複数帯域FIRフィルタ設計: fir2
関数fir2もまた、ウィンドウを適用したFIRフィルタを設計しますが、任意の形状の区分的線形周波数応答をもっています。これは、標準的なローパス、ハイパス、バンドパス、およびバンドストップ構造でのみフィルタを設計するfir1
とは異なります。
n = 50; f = [0 .4 .5 1]; m = [1 1 0 0]; b = fir2(n,f,m);
は、その周波数-ゲイン特性がベクトルf
およびm
によって与えられるものと一致するn
次のFIRフィルタの(n+1
)個の係数を含む行ベクトルb
を出力します。ここで、f
は0から1の範囲の周波数点のベクトルで、1はNyquist周波数を表わします。m
は、ベクトルfに設定された点での希望するゲイン応答を含むベクトルです(IIRで、この関数に相当するものはyulewalk
であり、これもまた任意の区分的線形ゲイン応答に基づいてフィルタを設計します。詳細については、"IIRフィルタ設計"を参照してください)。
![]() |
線形位相フィルタ | 遷移帯域付き複数帯域FIRフィルタ設計 | ![]() |