MathNet.Filtering带通参数

问题描述:

我正在尝试使用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

如果你的信号是在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