FIR The Frequency Sampling Method 実験 Java
FIRのLPFとHPFを設計してみて、もう少し高度なことをやってみたくなった。ということで、日曜日はThe Frequency Sampling Methodにチャレンジ。特徴としてはLPFやHPFに比べ自由度の高いフィルターが作れるというところ。周波数ごとにフィルターを掛ける割合を微調整できるので、グラフィックイコライザーやパラメトリックイコライザーのようなことが実現できる。解像度を上げていけば市販品をしのぐことも夢ではない。LPF/HPFと同じようにJavaでデジタルフィルタ用の係数を出力するところまで、つまりインパルス応答を得るまで作る。 これを実現するにはフーリエ変換を勉強しないと手が出ない。以前勉強したのだが、すっかり忘れた。またちょっとメモを読み返したりして再勉強。 結論としては、IDFT(離散フーリエ逆変換)の式をプログラミングすることで、実現できそうだ。あとは、やりながら考えるのが手っ取り早い。細かな部分まで完全に理解しようとすると数年かかりそうなので、厳密さは無視して、ガンガンとプログラムを組んでみる。それにしても、この手の日本語情報は少ないなぁ。うまく見つけられないだけなのか? 結局下の英語ページを読みながら、プログラムをする。 http://cnx.org/content/m28292/latest/ h(n)がFIRのタップの係数に相当する。この(n)は無限大個数あるのが理想。でも当然無理なので、オーディオの場合は最低でも数百とかにする。LPFならもっと少なくても良いのだが、HPFを考慮するとまだ足りない。今回はサンプリング周波数44100Hzのオーディオファイルを使う。低域もきれいに加工したいので、タップ数は1万ぐらい欲しくなる。さらに直線位相特性などを考慮すると、その2倍というところだ。ということで2万程度で実験した。 H(k)は周波数域を分解したそれぞれの係数。Hには任意の0~1.0を入れる。自分が欲しい周波数特性をここでコントロールする。(k)を増やすと分解能が上がるので細かく周波数をいじることができる。今回は22050個にした。つまり扱える周波数を22050分割。サンプリング周波数44100Hzの場合、扱える周波数は22050Hzまでなので1Hz単位で制御できることになる。 式にeとかiがある。この手の専門教育