scipy.signal.

peak_widths#

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

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

此函数计算相对于峰的高度和显著性的相对距离处峰的宽度(以采样为单位)。

参数:
x序列

带有峰的信号。

peaks序列

x 中峰的索引。

rel_heightfloat,可选

选择计算峰宽度的相对高度,以其显著性的百分比表示。1.0 计算峰在其最低等高线处的宽度,而 0.5 评估峰显著性高度的一半。必须至少为 0。有关进一步的解释,请见注释。

prominence_data元组,可选

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

wlenint,可选

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

返回:
widthndarray

每个峰的宽度,以样本表示。

width_heightsndarray

用于评估 width 的等高线的线高。

left_ips, right_ipsndarray

在各自评估高度水平线上的左右交叉点的内插位置。

引发:
ValueError

如果提供了 prominence_data,但是不满足条件 0 <= left_base <= peak <= right_base < x.shape[0] 时,每个峰值的数据类型错误、不是 C 连续的或没有相同的形状。

警告:
PeakPropertyWarning

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

警告

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

另请参阅

find_peaks

根据峰的属性在信号中查找峰值。

peak_prominences

计算峰的突出度。

备注

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

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

  • 在评估高度以峰的当前垂直位置为起点,在两侧绘制一条水平线,直到线与一个斜坡相交或者到达信号边界或者跨过峰基准的垂直位置(有关定义,请参阅 peak_prominences)。对于第一种情况(与信号相交),将使用线性插值估计实际的交叉点。

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

如上图所示,要计算峰的宽度必须知道其突出度和基准。您可以使用参数 prominence_data 提供这些信息。否则,将对其进行内部计算(参见 peak_prominences)。

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