NAudioのBiQuadFilterを使ってみた。 BiQuadFilterクラスをインスタンス化しようと思ってコードを書いていたのでうまくいかなかったけど、オブジェクトブラウザをよく見たら、それぞれのフィルターは、BiQuadFilterクラスが返り値のスタティックメソッドだった。
またフィルターの実行は、Transformメソッドを使ってやればいいらしいことも解った。
で、WaveInで入力をキャプチャしてFFTで表示するコードを、WaveIn_DataAvailableの中でTransformしてFFTに渡すように書き換えた。
ソースの主要部分だけ書くと..(LowPassFilterの 場合)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//グローバル変数の宣言 BiQuadFilter filter; //Form1_Load(... //第1引数 サンプルレート、第2引数 カットオフ周波数、第3引数 Q filter = BiQuadFilter.LowPassFilter(44100, 3000, 50); //WaveIn_DataAvailable(... for (int index = 0; index < e.BytesRecorded; index += 4) { var data = (short)((e.Buffer[index + 1] << 8) | e.Buffer[index + 0]); sdata[index / 4] = filter.Transform(data); } |
以前やったようにホワイトノイズを入力してFFT表示させてみた。
カットオフ周波数3kHz、Q=1のローパスフィルタ。
縦軸がいい加減なので減衰量とか不明だけど、LPFにはなっている。
Q=50にしてみた。 教科書どおりかな..。 実際に使う場合は、Qを調整しないといけないなぁ。
センター周波数3kHz、Q=1のバンドパスフィルタ。 バンドパスといえばバンドパスだけど..。
Q=50にしてみた。 帯域幅が設定できないのは使いづらいかも。
というわけで、NAudioのBiQuadFilterを使ってみたけど、特性はイマイチかな..。