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, 可选
当使用相同的参数 x 和 peaks 调用
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()