2017-10-13 34 views
2

MathNetフィルタを使用して信号に帯域通過フィルタを適用しようとしています。正確には、私はMathNet.Filtering.OnlineFiter.CreateBandpass(..)メソッドを使用しています。MathNet.Filtering Bandpassパラメータ

問題は、私は期待された結果を得ていないと私は方法のパラメータによって混乱している。 1KHzでサンプリングされた信号があり、4〜6Hzの範囲外のものはすべて取り除きたい。メソッドCreateBandpass(..)を呼び出す正しい方法は何ですか?


編集

コメントで要求されたように、これは、コードである:

OnlineFilter bandPass = CreateBandpass(ImpulseResponse.Finite, samplingRate, 3, 7); 
postProcessedData = bandPass.ProcessSamples(preProcessedData); 

ソース(30のようないくつかの比較的高い周波数のノイズを正確に5 Hzの正弦波であります-70Hz);信号の振幅は約20ピークピークで、0を中心にしています(-10から+10)。フィルタリングされた信号は、2.1


P.S.のノイズおよび振幅なしで5 Hzの正弦波、ピーク - ピーク、あります

これはテストウェーブでも起こります。純粋な正弦波を生成して(その周波数が何であれ)、それをその周波数の周りにフィルタリングすると、同じ周波数と完全に無関係な振幅の正弦波が得られます。一方、私がFFT(まだMathNetを使用している)で波を除去し、私が興味を持っていないコンポーネントを取り除いたら、予想される振幅で波を再構築し、ノイズから完全にきれいにすることができます。

+0

私はかなりまともな結果を得ることができます。あなたにとってはまったく良くないものは何ですか?あなたのコードを投稿してください。 – jsanalytics

答えて

1

信号が5Hzで、ノイズが30-70Hzの場合は、実際にはバンドパスフィルタは必要ありません。ローパスはそれを行います。また、いくつかの減衰が予想されますが、あなたのケースでは少し過剰ですが、その理由は... あなたのフィルターは狭すぎます。カットオフ周波数が10Hzのローパス、またはカットオフが0〜10Hzのバンドパスを使用してください。以下のサンプルは、これらのオプションの比較を示しています。驚くことではありませんが、同じ10Hzの帯域幅を持つローパス・フィルタとバンドパス・フィルタの結果は、期待どおり正確に一致しています。

enter image description here

//signal + noise 
    double fs = 1000; //sampling rate 
    double fw = 5; //signal frequency 
    double fn = 50; //noise frequency 
    double n = 5; //number of periods to show 
    double A = 10; //signal amplitude 
    double N = 1; //noise amplitude 
    int size = (int)(n * fs/fw); //sample size 

    var t = Enumerable.Range(1, size).Select(p => p * 1/fs).ToArray(); 
    var y = t.Select(p => (A * Math.Sin(2 * pi * fw * p)) + (N * Math.Sin(2 * pi * fn * p))).ToArray(); //Original 

    //lowpass filter 
    double fc = 10; //cutoff frequency 
    var lowpass = OnlineFirFilter.CreateLowpass(ImpulseResponse.Finite, fs, fc); 

    //bandpass filter 
    double fc1 = 0; //low cutoff frequency 
    double fc2 = 10; //high cutoff frequency 
    var bandpass = OnlineFirFilter.CreateBandpass(ImpulseResponse.Finite, fs, fc1, fc2); 

    //narrow bandpass filter 
    fc1 = 3; //low cutoff frequency 
    fc2 = 7; //high cutoff frequency 
    var bandpassnarrow = OnlineFirFilter.CreateBandpass(ImpulseResponse.Finite, fs, fc1, fc2); 

    double[] yf1 = lowpass.ProcessSamples(y); //Lowpass 
    double[] yf2 = bandpass.ProcessSamples(y); //Bandpass 
    double[] yf3 = bandpassnarrow.ProcessSamples(y); //Bandpass Narrow