使用find_peaks_cwt查找噪声数据中的峰值

时间:2017-02-16 17:21:22

标签: python scipy

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

如果不能很好地理解术语,我将峰定义为窄(宽度<30)并且比附近区域高出100000以上。

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

我应该做些什么? widths=np.arange(1,30)设置我的宽度要求就像我认为的那样吗?如何指定身高要求?

1 个答案:

答案 0 :(得分:2)

很大程度上取决于您的数据实际意味着什么(或者您认为它们应该是什么意思)。以下是合成数据的示例:

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')

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

find_peaks_cwt()在从理想数据中找到峰值方面做得相当可观。对值进行求和是一种猜测峰值的方法。如果你正在总和频谱功率,你应该把它们之间的所有值相加而不是固定的间隔,就像我为这个快速和肮脏的演示所做的那样。

ploted as in example

我发现这个函数特别令人印象深刻的是它在更大的峰值存在时找到更小的峰值。