【问题标题】:Finding peaks in noisy data with find_peaks_cwt使用 find_peaks_cwt 在噪声数据中查找峰值
【发布时间】:2017-07-05 23:08:25
【问题描述】:

我正在尝试在一些非常嘈杂的数据中找到峰值,例如:

在没有很好理解术语的情况下,我将峰定义为窄(宽度

我正在尝试使用 scipy 的 find_peaks_cwt 但文档对我来说很不清楚。我试过find_peaks_cwt(my_data, np.arange(1,30)),但它返回了大量的峰值。然后我尝试添加 noise_perc=60 参数,但这并没有真正解决问题。我也尝试过使用其他参数,但我真的不明白“脊线”是什么。

我应该做些什么不同的事情? widths=np.arange(1,30) 是否像我想的那样设置我的宽度要求?如何指定高度要求?

【问题讨论】:

  • 对我来说效果更好的另一种方法是手动过滤信号,首先将其与高斯窗口进行卷积,然后搜索最大值(参见 this answer)。

标签: python scipy


【解决方案1】:

很大程度上取决于您的数据的实际含义(或您认为它们应该表示的含义)。下面是一个合成数据的例子:

from scipy.signal import find_peaks_cwt
from matplotlib.pyplot import plot, ylim
from numpy import *
N = 2000
x = arange(N)
pwid = 200.
zideal = sinc(x/pwid - 2)**2 # Vaguely similar to yours
z = zideal * random.randn(N)**2 # adding noise
plot(x, zideal, lw=4)
ylim(0, 1)
zf = find_peaks_cwt(z, pwid/4+zeros(N))
plot(x[zf], zideal[zf], '*', ms=20, color='green')
# Create averaging zones around peaks
xlow = maximum(array(zf) - pwid/2, 0)
xhigh = minimum(array(zf) + pwid/2, x.max())
zguess = 0*xlow # allocate space
for ii in range(len(zf)):
   zguess[ii] = z[xlow[ii]:xhigh[ii]].mean()
plot(x[zf], zguess, 'o', ms=10, color='red')

pwidthsinc() 函数中缩放峰的宽度。在对find_peaks_cwt() 的调用中,对widths 使用较大的值会产生较少的峰(峰密度较低)。最好的结果似乎是将widths 中的值缩放到峰值的半峰半宽度 (HWHM) 左右。

find_peaks_cwt() 在从理想数据中找到峰值方面做得非常出色。对这些值求和是一种猜测峰值的方法。如果您要对光谱功率求和,您可能应该将两者之间的所有值相加,而不是像我在这个快速而肮脏的演示中所做的那样,对固定间隔进行求和。

我发现该功能特别令人印象深刻,因为它可以在存在较大峰的情况下找到较小的峰。

【讨论】:

  • 似乎区分您的峰值搜索的主要特征是pwid/4+zeros(N)。你能解释一下你是怎么选择的吗?我不明白你是如何选择大小的,也不明白它应该是一个与点数长度相同的数组。
  • 从文档中,宽度是:“用于计算 CWT 矩阵的一维宽度数组。通常,此范围应涵盖预期的感兴趣峰的宽度。”在这种情况下,我将 sinc() 中的间隔缩放为 pwid。 “宽度”数组是单边宽度,所以我将其缩放以接近峰的 HWHM。
猜你喜欢
  • 2014-10-23
  • 2012-12-28
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-06
  • 2023-02-17
  • 2014-05-15
相关资源
最近更新 更多