2017-10-13 56 views
2

我正在嘗試使用MathNet濾波器將帶通濾波器應用於信號;準確地說,我使用的是MathNet.Filtering.OnlineFiter.CreateBandpass(..)方法。MathNet.Filtering帶通參數

問題是,我沒有得到預期的結果,我對該方法的參數感到困惑。我有一個以1KHz採樣的信號,我想除去4至6Hz範圍以外的所有信號。什麼是調用方法CreateBandpass(..)的正確方法?


編輯

這是代碼的要求,在註釋:

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

源是在完全相同5赫茲一些相對高的頻率的噪聲的正弦波(如30 -70赫茲);信號的幅度大約爲20峯 - 峯值,集中在0(所以-10到+10)。經濾波的信號是2.1


P.S.在5赫茲,無噪音和振幅,峯 - 峯正弦波,

順便說一句,測試波也會出現這種情況。如果生成一個純正弦波(無論頻率如何)並在其頻率附近對其進行濾波,則可獲得相同頻率和完全不相關振幅的正弦波。另一方面,如果我FFT(仍然使用MathNet)wave並刪除我不感興趣的組件,那麼我可以在預期的振幅下重建波形,並且完全從噪聲中清除乾淨。

+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