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

cjfdqchwhj 2014-02-26 04:35:32


注意,在现实的工程环境中,会产生一些噪声,如右边的图所示意的

问题:
如何从这一序列的数据中,提取出所有的峰值?
...全文
2289 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
易小侠 2016-03-02
  • 打赏
  • 举报
回复
点搞,我现在也在做峰峰值算法,我先做的滤波,滤波之后就不知道怎么弄了
灌水号 2015-09-14
  • 打赏
  • 举报
回复
先低通,再FFT看看主信号的间隔点数,算峰值的时候注意间隔,最后找出峰值位置,没试过,不知道效果咋样。
wuyubiaobiao 2015-09-14
  • 打赏
  • 举报
回复
请问楼主解决问题了吗?我也遇到同样的问题,求楼主能提供具体的解决方案,定当酬谢
cjfdqchwhj 2014-02-28
  • 打赏
  • 举报
回复
引用 18 楼 vipcxj 的回复:
我但土办法就是求导,导数接近0的就是峰值,当然对于拐点,导数也是0,所以还得求下2次导数。不过因为是离散点,所以求出的导出误差比较大,阀值难以掌控,所以说是土办法。
说的很在理
ForestDB 2014-02-28
  • 打赏
  • 举报
回复
还是采集点加个滤波吧。
赵4老师 2014-02-27
  • 打赏
  • 举报
回复
搜“低通滤波”
cjfdqchwhj 2014-02-27
  • 打赏
  • 举报
回复
引用 12 楼 lpcads 的回复:
法1:计算 X[i-n] 到 X[i+n] 这 2n+1 个点的平均值,作为 Y[i] 的值; 法2:计算积分(可以用梯形法),再求导(中心差分法),结果和法1应该差不多。 因为你说“采样频率合适,有足够的数据点,而且数据点时间距离可以看成是“绝对均匀”的”,而且从图上看,噪音的幅度和持续实现较短,因此使用这两种滤波法效果应该还不错。
法1应该是不合适的。求这2n+1个点的平均值,肯定比真实的峰值小。
cjfdqchwhj 2014-02-27
  • 打赏
  • 举报
回复
引用 11 楼 bbs2241 的回复:
拟合下我觉得是可以的,拟合后噪声的影响就去掉了
具体如何拟合?请简要说说方法,谢谢。
vipcxj 2014-02-27
  • 打赏
  • 举报
回复
额,没看到噪音,其实你先去噪后在用LS的办法取峰值就行了,当然这会导致误差又大了点。我去噪还是土办法,取临近N个点取平均~
vipcxj 2014-02-27
  • 打赏
  • 举报
回复
我但土办法就是求导,导数接近0的就是峰值,当然对于拐点,导数也是0,所以还得求下2次导数。不过因为是离散点,所以求出的导出误差比较大,阀值难以掌控,所以说是土办法。
千树之影 2014-02-27
  • 打赏
  • 举报
回复
突发性的噪声用中值滤波啊。
lpcads 2014-02-27
  • 打赏
  • 举报
回复
引用 14 楼 cjfdqchwh 的回复:
[quote=引用 12 楼 lpcads 的回复:] 法1:计算 X[i-n] 到 X[i+n] 这 2n+1 个点的平均值,作为 Y[i] 的值; 法2:计算积分(可以用梯形法),再求导(中心差分法),结果和法1应该差不多。 因为你说“采样频率合适,有足够的数据点,而且数据点时间距离可以看成是“绝对均匀”的”,而且从图上看,噪音的幅度和持续实现较短,因此使用这两种滤波法效果应该还不错。
法1应该是不合适的。求这2n+1个点的平均值,肯定比真实的峰值小。 [/quote] 那就加个权 1,2,4,2,1 之类的。 既然是滤波,精确要求就得放低。
lpcads 2014-02-26
  • 打赏
  • 举报
回复
引用 7 楼 cjfdqchwh 的回复:
[quote=引用 6 楼 reFreever 的回复:] 如果只是计算峰值点个数,可以试着先进行滤波将数据平滑处理,将噪声的波幅减小。
现在内存上存在这么一段数列,通过什么方法,实现“先进行滤波将数据平滑处理,将噪声的波幅减小”的目的?谢谢[/quote] 法1:计算 X[i-n] 到 X[i+n] 这 2n+1 个点的平均值,作为 Y[i] 的值; 法2:计算积分(可以用梯形法),再求导(中心差分法),结果和法1应该差不多。 因为你说“采样频率合适,有足够的数据点,而且数据点时间距离可以看成是“绝对均匀”的”,而且从图上看,噪音的幅度和持续实现较短,因此使用这两种滤波法效果应该还不错。
bobo_包子 2014-02-26
  • 打赏
  • 举报
回复
拟合下我觉得是可以的,拟合后噪声的影响就去掉了
reFreever 2014-02-26
  • 打赏
  • 举报
回复
如果你数据点足够多可以进行再采样, 比如你这段数据有上W个点的话就适用.数据点少的话就不用了。 至于平滑处理的方法有很多, 简单的均值滤波,中值滤波,5点3次平滑滤波等。复杂点的FFT,小波都行。不过平滑滤波多是对于含有高频噪声进行滤波的,你这种噪声滤波的意义不会太大。只能适当的将噪声减小,如果噪声与有效数据的差别很大的话, 也可以过度平滑将噪声减到最小。
cjfdqchwhj 2014-02-26
  • 打赏
  • 举报
回复
引用 8 楼 skyliuxu 的回复:
1.首先你得保证采样率合适,即有足够的数据点; 2.噪声是什么类型的噪声,高斯白噪声?有没有突发噪声? 3.判断峰值干嘛用呢?能判断出高低电平还不够?
问的好 首先,采样频率合适,有足够的数据点,而且数据点时间距离可以看成是“绝对均匀”的; 2. 不是高斯白噪声,这种噪声绝大多数都是突发噪声,由于外力影响导致的; 3. 解决方案就是要提取出峰值,提取峰值就是唯一的目标。
skyliuxu 2014-02-26
  • 打赏
  • 举报
回复
1.首先你得保证采样率合适,即有足够的数据点; 2.噪声是什么类型的噪声,高斯白噪声?有没有突发噪声? 3.判断峰值干嘛用呢?能判断出高低电平还不够?
cjfdqchwhj 2014-02-26
  • 打赏
  • 举报
回复
引用 6 楼 reFreever 的回复:
如果只是计算峰值点个数,可以试着先进行滤波将数据平滑处理,将噪声的波幅减小。
现在内存上存在这么一段数列,通过什么方法,实现“先进行滤波将数据平滑处理,将噪声的波幅减小”的目的?谢谢
reFreever 2014-02-26
  • 打赏
  • 举报
回复
含有噪声的图片在实际环境中的原始数据是这样显示的吗? 这噪声频率有点低,貌似还是挺有规律的、 可以根据已知的波幅大小与波峰之间的距离设置阀值:当前峰值点离上个峰值点的横向最小距离与纵向最小距离,若找到一个峰值首先判断横纵距离是否大于最小阀值。 如果只是计算峰值点个数,可以试着先进行滤波将数据平滑处理,将噪声的波幅减小。
cjfdqchwhj 2014-02-26
  • 打赏
  • 举报
回复
在算法处理上,本人粗陋浅薄,恳请大家不吝指教,非常感谢!
加载更多回复(4)

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧