窓関数を用いたFIRフィルタ設計プログラム(Scilab)
- Scilabで作成した、逆フーリエ変換と窓関数を用いたFIRフィルタ設計のサンプルプログラムです. Scilab Ver.5.5.2で動作確認をおこなっています.
- FIRフィルタ係数をフーリエ変換するとフィルタの周波数特性が得られます. ならば、フィルタの周波数特性の仕様の逆フーリエ変換がFIRフィルタの係数となります. その際、FIRフィルタの係数長を調整するのに窓関数を用いています.
- サンプルプログラムではFIRフィルタの周波数特性の仕様を1Hzステップで与えています. サンプリング周波数は48kHzとしているので、0Hz〜48000Hzまでの間の48000点で周波数特性を定義しています.
- 48000点の周波数特性仕様を逆フーリエ変換すると、48000タップのFIRフィルタ係数が得られます.
- 48000タップのフィルタ係数、すなわちフィルタのインパルス・レスポンスを打ち切って256タップのFIRフィルタ係数を得るのに窓関数(ハニング窓)を用いてます. 当然ですが、窓関数の長さは256点です.
- 以上のフィルタ係数設計の途中で、データの並び替えの処理をおこなっています. これは逆フーリエ変換の性質に基づくもので、特別な意味はありません.
- サンプルプログラムでは設計した256点FIRフィルタ係数を、最終的に固定小数点演算のためのデータ長16bitの係数に変換しています.
- 同様の簡易なFIRフィルタ設計の手法として、逆フーリエ変換と転移標本を用いた設計法があります. これらの手法の詳細はOppenheimの教科書(Discrete-Time Signal Processing)等を参照してください.
- ろくにコメントも入っていないプログラムですが、処理は大変簡単なものですので中間の処理結果のグラフを描きながら読めば、何をしているかは簡単に理解できるはずです.
- フィルタの肩特性、阻止帯域の減衰量は使用する窓関数の特性に依存します. 下図のような任意特性のフィルタを設計することが出来ます.
窓関数を用いたFIRフィルタ設計プログラム(Scilab) fir_win_design.sce
0Hz〜48000Hz(サンプリング周波数)の間、1Hzステップで与えたフィルタの周波数特性の仕様
0Hz〜24000Hzの間のフィルタ仕様のdB表示(振幅周波数特性)
フィルタ仕様の逆フーリエ変換と変換後のデータの並べ替えにより求めたFIRフィルタ係数(48000タップ)
48000タップのFIRフィルタ係数の中央部の拡大表示(256タップ分)
窓関数をかけて打ち切ったFIRフィルタ係数(256タップ)
フィルタ仕様と設計した256タップFIRフィルタの特性
青:仕様
赤:256タップFIRフィルタ
フィルタ仕様と設計した256タップFIRフィルタ(係数長16bit)の特性
青:仕様
赤:256タップFIRフィルタ(係数長16bit)