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并删除我不感兴趣的组件,那么我可以在预期的振幅下重建波形,并且完全从噪声中清除干净。
答
如果你的信号是在5Hz,你的噪音在30-70Hz,你不需要一个带通滤波器,低通会做到这一点。此外,预计会有一些衰减,虽然在你的情况是有点过度,原因是... 你的过滤器太窄。要么使用截止频率为10Hz的低通,要么使用低截止频率为0-10Hz的带通。下面的示例显示了这些选项之间的比较。请注意,不出所料,具有相同10Hz带宽的低通和带通滤波器结果与预期完全匹配。
//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
我得到相当不错的结果。什么对你不好?发布您的代码。 – jsanalytics