MathNet.Filteringを使って見た。
NugetからMathNet.filteringパッケージをインストールする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
using MathNet.Filtering; ...... //Bandpass filter double f_low = 4000; double f_high = 10000; bandpass = OnlineFilter.CreateBandpass(ImpulseResponse.Finite, sr, f_low, f_high); .... Complex[] filterd = new Complex[datapt]; for(int i=0; i<sgdata.Length; i++) { var fil_Real = bandpass.ProcessSample(sgdata[i].Real); var fil_Imaginary = bandpass.ProcessSample(sgdata[i].Imaginary); filterd[i] = fil_Real + Complex.ImaginaryOne * fil_Imaginary; } |
ProcessSampleメッソドは、引数として配列を受けるやつもあるけど、Complex配列は渡せないみたいなので、1データずつ処理するやつを使った。 フィルターの次数とかどこかで設定できると思うけど、今回は使えるかどうか見るだけなので、とりあえず動かしてみた。
FFTに振幅0.1、周波数2kHzの信号と振幅1.0、周波数8kHzの信号を入力したところ。 縦軸一目盛りは、5dBぐらい。
4kHz~10kHzのバンドパスフィルタを追加した場合。
下のFFTの表示で、2kHzの信号が消えている。 8kHzの信号は、少し減衰しているように見える。
というわけで、MathNet.Filteringも簡単に使えそうなことが解った。