【问题标题】:scipy.signal.find_peaks_cwt returns additional points which are not peaksscipy.signal.find_peaks_cwt 返回不是峰值的附加点
【发布时间】:2023-04-05 04:21:01
【问题描述】:

我正在使用 scipy peakfinder scipy.signal.find_peaks_cwt 来查找信号中的峰值。可靠地找到所有峰值,但我总是得到不是峰值的额外结果(到目前为止,它们都在信号的末尾)。我想知道为什么会这样......

这是一个完整的合成数据示例:

from scipy.signal import find_peaks_cwt
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline # for jupyter notebooks

x = np.arange(0, 15, 0.1)
y = np.sin(x)
plt.plot(y)

peakinds = find_peaks_cwt(y, np.arange(1, 5))
plt.plot(peakinds, y[peakinds], 'o')

(要在普通的 python shell 中运行,请注释 %matplotlib inline 并在末尾添加 plt.show()

用点标记的峰值绘图:

(最后三个点不应该在那里)

我的真实数据也会发生同样的事情:

(这里最后一个点错了)

为什么会这样?

【问题讨论】:

    标签: python scipy signal-processing


    【解决方案1】:

    find_peaks_cwt 中的 widths 参数是问题所在。

    from scipy.signal import find_peaks_cwt
    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.arange(0, 15, 0.1)
    y = np.sin(x)
    fig0 = plt.figure()
    ax0 = fig0.add_subplot(111)
    ax0.plot(y)
    
    peakinds = find_peaks_cwt(y, np.arange(1, 10))  # Here changed 5 to 10
    ax0.plot(peakinds, y[peakinds], 'o')
    plt.axis([0, 160, -1.1, 1.1])
    

    来自documentation

    宽度:序列 用于计算 CWT 矩阵的一维宽度数组。通常,此范围应涵盖预期的目标峰宽度。

    编辑:

    使用的默认小波是 Ricker 小波。基本上,在所有指定的widths 处(通过调用ricker(width[i]))在信号和小波之间执行卷积。因此,您给出的范围必须从小(精确定位峰值)到足够大(用于检测感兴趣的峰值)但不要太大(以避免混叠 - 让我们记住小波在频域中工作)。

    文档摘录:算法如下: 1 - 对于提供的宽度,对向量执行连续小波变换。这是一个向量与每个宽度的小波(宽度)的卷积。

    如果您将widths 更改为np.arange(10, 20),您会注意到峰值已被检测到,但它们的最大值并未很好地定位(我们缺少精细的刻度)。如果您再次尝试使用np.arange(1, 20),则峰值会更好地定位。

    另外,如果你想可视化 ricker 小波:

    from scipy.signal import ricker
    vec = ricker(100, 10)  # (nb_of_points, frequency)
    fig0 = plt.figure()
    ax0 = fig0.add_subplot(111)
    ax0.plot(vec)
    

    编辑 2:

    至于在信号末尾错误检测到的额外峰值,这很可能是由于边界效应。基本上,卷积的窗口超出了信号的最后一个样本。通常,对信号进行填充(零填充、信号包装......),但取决于它是如何完成的(或根本不完成),可能会发生这种错误。在使用这些类型的方法时,通常可以忽略前几点和最后一点。

    【讨论】:

    • 我注意到玩弄宽度会有所帮助,但是我不知道如何获得可靠的值。例如,尝试np.arange(1, 50),然后您会两次获得第二个峰值。 50 应该没问题,因为峰比 50 宽。
    • 我详细说明了我对这个函数的理解。希望对您有所帮助。
    • 这对我理解函数很有帮助,谢谢!我仍然不确定如何解释我的真实数据图中的最后一个峰值。我正在使用width=np.arange(5, 20)
    • @Johannes 没有手头的数据很难判断...信号末端可能存在一些边界效应。我会自动丢弃第一个和最后几个点的结果。
    猜你喜欢
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多