scipy.signal.

peak_widths#

scipy.signal.peak_widths(x, peaks, rel_height=0.5, prominence_data=None, wlen=None)[源代码][源代码]#

计算信号中每个峰值的宽度。

此函数计算峰值在样本中的宽度,相对于峰值高度和显著性的相对距离。

参数:
x序列

一个带有峰值的信号。

序列

x 中峰值的索引。

rel_heightfloat, 可选

选择测量峰宽的相对高度,作为其突出度的百分比。1.0 计算峰在其最低等高线处的宽度,而 0.5 则在突出度高度的一半处进行评估。必须至少为 0。详见注释以进一步解释。

prominence_datatuple, 可选

当使用相同的参数 xpeaks 调用 peak_prominences 时,匹配其输出的三个数组的元组。如果未提供,则此数据在内部计算。

wlenint, 可选

以样本为单位的窗口长度,作为可选参数传递给 peak_prominences 用于内部计算 prominence_data。如果提供了 prominence_data,则忽略此参数。

返回:
宽度ndarray

每个峰值的宽度,单位为样本。

宽度_高度ndarray

评估 widths 时等高线的海拔高度。

left_ips, right_ipsndarray

在相应评估高度处,水平线的左右交点的插值位置。

Raises:
ValueError

如果提供了 prominence_data 但不符合每个峰值的条件 0 <= left_base <= peak <= right_base < x.shape[0],或者具有错误的 dtype,不是 C 连续的,或者形状不相同。

警告:
PeakPropertyWarning

如果任何计算的宽度为0,则会引发此错误。这可能源于提供的 prominence_data 或如果 rel_height 设置为0。

警告

对于包含 NaN 的数据,此函数可能会返回意外结果。为了避免这种情况,应删除或替换 NaN。

参见

find_peaks

根据峰值属性在信号内寻找峰值。

peak_prominences

计算山峰的突出度。

注释

计算峰值宽度的基本算法如下:

  • 计算评估高度 \(h_{eval}\) 的公式为 \(h_{eval} = h_{Peak} - P \cdot R\),其中 \(h_{Peak}\) 是峰值本身的高度,\(P\) 是峰值的突出度,\(R\) 是一个由参数 rel_height 指定的正比率。

  • 在评估高度处向两侧绘制一条水平线,从峰值的当前垂直位置开始,直到线条与斜率、信号边界相交或穿过峰值基部的垂直位置(参见 peak_prominences 的定义)。对于第一种情况,与信号的交点,使用线性插值估计真实的交点。

  • 计算宽度为所选两侧端点之间的水平距离。因此,每个峰的最大可能宽度是其基部之间的水平距离。

如上所述,要计算一个峰的宽度,必须知道其突出度和基线。你可以通过参数 prominence_data 自己提供这些数据。否则,它们会在内部计算(参见 peak_prominences)。

Added in version 1.1.0.

示例

>>> import numpy as np
>>> from scipy.signal import chirp, find_peaks, peak_widths
>>> import matplotlib.pyplot as plt

创建一个包含两个叠加谐波的测试信号

>>> x = np.linspace(0, 6 * np.pi, 1000)
>>> x = np.sin(x) + 0.6 * np.sin(2.6 * x)

找到所有峰值并计算它们在相对高度为0.5(在突出高度一半处的等高线)和1(在全突出高度处的最低等高线)处的宽度。

>>> peaks, _ = find_peaks(x)
>>> results_half = peak_widths(x, peaks, rel_height=0.5)
>>> results_half[0]  # widths
array([ 64.25172825,  41.29465463,  35.46943289, 104.71586081,
        35.46729324,  41.30429622, 181.93835853,  45.37078546])
>>> results_full = peak_widths(x, peaks, rel_height=1)
>>> results_full[0]  # widths
array([181.9396084 ,  72.99284945,  61.28657872, 373.84622694,
    61.78404617,  72.48822812, 253.09161876,  79.36860878])

绘制信号、峰值和计算宽度的等高线

>>> plt.plot(x)
>>> plt.plot(peaks, x[peaks], "x")
>>> plt.hlines(*results_half[1:], color="C2")
>>> plt.hlines(*results_full[1:], color="C3")
>>> plt.show()
../../_images/scipy-signal-peak_widths-1.png