对一个数列求取峰值,求C代码编写算法

C语言 码拜 9年前 (2016-02-01) 3993次浏览
对一个数列求取峰值,求C代码编写算法
注意,在现实的工程环境中,会产生一些噪声,如右边的图所示意的
问题:
怎么样从这一序列的数据中,提取出全部的峰值?
解决方案:5分
峰值要么同时大于其前后两个数,要么同时小于其前后两个数。这样来判断就应该可以把峰值取出来!
解决方案:10分
含有噪声的图片在实际环境中的原始数据是这样显示的吗? 这噪声频率有点低,貌似还是挺有规律的、
可以根据已知的波幅大小与波峰之间的距离设置阀值:当前峰值点离上个峰值点的横向最小距离与纵向最小距离,若找到一个峰值首先判断横纵距离能否大于最小阀值。
假如只是计算峰值点个数,可以试着先进行滤波将数据平滑处理,将噪声的波幅减小。
解决方案:5分
1.首先你得保证采样率合适,即有足够的数据点;
2.噪声是什么类型的噪声,高斯白噪声?有没有突发噪声?
3.判断峰值干嘛用呢?能判断出高低电平还不够?
解决方案:10分
假如你数据点足够多可以进行再采样, 例如你这段数据有上W个点的话就适用.数据点少的话就不用了。
至于平滑处理的方法有很多, 简单的均值滤波,中值滤波,5点3次平滑滤波等。复杂点的FFT,小波都行。不过平滑滤波多是对于含有高频噪声进行滤波的,你这种噪声滤波的意义不会太大。只能适当的将噪声减小,假如噪声与有效数据的差别很大的话, 也可以过度平滑将噪声减到最小。
解决方案:10分
拟合下本人觉得是可以的,拟合后噪声的影响就去掉了
解决方案:10分
法1:计算 X[i-n] 到 X[i+n] 这 2n+1 个点的平均值,作为 Y[i] 的值;
法2:计算积分(可以用梯形法),再求导(中心差分法),结果和法1应该差不多。
原因是你说“采样频率合适,有足够的数据点,而且数据点时间距离可以看成是“绝对均匀”的”,而且从图上看,噪音的幅度和持续实现较短,因此使用这两种滤波法效果应该还不错。
解决方案:10分
搜“低通滤波”
解决方案:5分
那就加个权 1,2,4,2,1 之类的。
既然是滤波,精确要求就得放低。
解决方案:5分
突发性的噪声用中值滤波啊。
解决方案:5分
本人但土办法就是求导,导数接近0的就是峰值,当然对于拐点,导数也是0,所以还得求下2次导数。不过原因是是离散点,所以求出的导出误差比较大,阀值难以掌控,所以说是土办法。
解决方案:10分
额,没看到噪音,其实你先去噪后在用LS的办法取峰值就行了,当然这会导致误差又大了点。本人去噪还是土办法,取临近N个点取平均~
解决方案:5分
还是采集点加个滤波吧。
解决方案:10分
先低通,再FFT看看主信号的间隔点数,算峰值的时候注意间隔,最后找出峰值位置,没试过,不知道效果咋样。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明对一个数列求取峰值,求C代码编写算法
喜欢 (0)
[1034331897@qq.com]
分享 (0)