查找样品之间的局部峰


10

我有地震信号y [ n ]的离散样本: ny[n]在此处输入图片说明

我想在信号中找到局部最大值。

y[n]

y[n]:maxima if y[n]>y[n1] and y[n]>y[n+1]

i=4.25

y[n]

  • 如何使用插值法找到最大值?
  • 我应该使用哪种插值形式?

如您所见,我的信号不是很嘈杂,但是如果该方法还进行了一些滤波以使最大值超过阈值并具有一定的宽度(没有尖峰),那将是很好的。

但是,我最大的问题只是在样品之间找到峰。有什么建议可以做到这一点吗?

预先感谢您的任何回答!


1
也许看问题1问题2
Geerten 2012年


第二个没有答案@Geerten ;-)
Ivo Flipse

1
哦..哈哈,好点。好吧,我将在这个问题上再次引用这个问题;)
Geerten 2012年

Answers:


7

获得子样本分辨率

一个非常便宜的(就代码大小而言)解决方案只是对信号进行上采样。在matlab中,可以使用完成interp(y ,ratio)。一个稍微复杂些的解决方案包括天真地检测峰值。对于每个峰,通过y [peak-1],y [peak],y [peak + 1]拟合抛物线;然后使用该抛物线最大的点作为真正的峰值位置。

关于峰检测

一堆技术可以帮助:

  • 正如希尔马(Hilmar)所建议的那样,通过高斯或汉恩窗口对信号进行卷积,其宽度大约等于要在检测到的峰之间看到的最小间隔的一半。由于时间精度对于您的应用程序似乎至关重要,因此请确保考虑到过滤带来的时间延迟!
  • 减去您的信号本身的中值滤波版本(具有相当大的观察窗口);并将结果除以本身的标准差过滤版本。这消除了趋势,并允许阈值以标准差为单位表示。
  • 对于峰采集,我使用“礼帽式”过滤器进行公式化。将信号的高顶滤波版本定义为yt [n] = max(y [n-W],y [n-W + 1],...,y [n + W-1],y [n + W]);并将y [n] == yt [n]和y [n]>阈值的点用作峰。

只需几次传递nlfilter,即可在Matlab中非常有效地实现所有这些功能。


上采样与抛物线插值的组合可能比单独使用的效果更好。
hotpaw2 2012年

3

尝试使用有损峰值检测器:

y[n] = max(abs(x[n]),a*y[n-1]);

其中“ a”是一个小于1的数字,用于控制检测器的衰减速度。它确定相邻峰之间的距离有多近,而不会陷入一个峰中。然后进行阈值检测。


您的方程式中同时具有ax [n]和y [n]。这是正确的还是应该只是y [n]?
安迪

x [n]是输入,y [n]是输出。总体而言,答案很差,有一个错字(现已修复),我误解了这个问题。抱歉
Hilmar 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.