我试图使用MathNet滤波器将带通滤波器应用于信号;准确地说,我使用的是MathNet.Filtering.OnlineFiter.CreateBandpass(..)
方法。
问题是,我没有得到预期的结果,我被方法的参数弄糊涂了。我有一个信号采样在1千赫,我想删除4到6赫兹范围以外的一切。调用方法CreateBandpass(..)
的正确方法是什么?
编辑
这是代码,正如注释中所要求的那样:
OnlineFilter bandPass = CreateBandpass(ImpulseResponse.Finite, samplingRate, 3, 7);
postProcessedData = bandPass.ProcessSamples(preProcessedData);
该源为正弦波,只有5赫兹,有一些相对较高的频率噪声(如30-70赫兹);信号的振幅在20峰值左右,集中在0(SO-10至+10)。滤波后的信号为5 Hz正弦波,无噪声,峰值幅值为2.1。
P.S.
顺便说一下,在测试波中也会发生这种情况。如果一个产生一个纯的正弦波(不管频率)并在它的频率周围过滤它,我得到一个相同频率的正弦波和一个完全无关的振幅。另一方面,如果我(仍然使用MathNet)的波,并删除我不感兴趣的成分,然后我可以重建在预期的振幅和完全消除噪音。
发布于 2017-11-13 13:25:53
如果你的信号是在5赫兹,你的噪音在30-70赫兹,你真的不需要一个带通滤波器,一个低通就可以做到这一点。同时,也希望有一些衰减,虽然在你的情况下有点过分,原因是.您的过滤器是太窄的。或者使用截止频率为10赫兹的低通,或者低/高截止频率为0-10赫兹的带通。下面的示例显示了这些选项之间的比较。注意,不足为奇的是,低通和带通滤波器的结果,在相同的10赫兹带宽,是一个完全匹配,如预期。
//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
https://stackoverflow.com/questions/46729817
复制相似问题