首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MathNet.Filtering带通参数

MathNet.Filtering带通参数
EN

Stack Overflow用户
提问于 2017-10-13 12:20:09
回答 1查看 3.8K关注 0票数 2

我试图使用MathNet滤波器将带通滤波器应用于信号;准确地说,我使用的是MathNet.Filtering.OnlineFiter.CreateBandpass(..)方法。

问题是,我没有得到预期的结果,我被方法的参数弄糊涂了。我有一个信号采样在1千赫,我想删除4到6赫兹范围以外的一切。调用方法CreateBandpass(..)的正确方法是什么?

编辑

这是代码,正如注释中所要求的那样:

代码语言:javascript
运行
复制
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)的波,并删除我不感兴趣的成分,然后我可以重建在预期的振幅和完全消除噪音。

EN

回答 1

Stack Overflow用户

发布于 2017-11-13 13:25:53

如果你的信号是在5赫兹,你的噪音在30-70赫兹,你真的不需要一个带通滤波器,一个低通就可以做到这一点。同时,也希望有一些衰减,虽然在你的情况下有点过分,原因是.您的过滤器是太窄的。或者使用截止频率为10赫兹的低通,或者低/高截止频率为0-10赫兹的带通。下面的示例显示了这些选项之间的比较。注意,不足为奇的是,低通和带通滤波器的结果,在相同的10赫兹带宽,是一个完全匹配,如预期。

代码语言:javascript
运行
复制
    //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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46729817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档