peak_widths#
- scipy.signal.peak_widths(x, peaks, rel_height=0.5, prominence_data=None, wlen=None)[源代码]#
计算信号中每个峰的宽度。
此函数计算峰的宽度(以样本为单位),该宽度与峰的高度和突出度有相对距离。
- 参数:
- x序列
带有峰的信号。
- peaks序列
x 中的峰的索引。
- rel_height浮点数,可选
选择测量峰宽度的相对高度,以其突出度的百分比表示。 1.0 计算峰在其最低轮廓线处的宽度,而 0.5 在突出度一半的高度处进行评估。必须至少为 0。有关进一步解释,请参阅注释。
- prominence_data元组,可选
一个三数组元组,与使用相同参数 x 和 peaks 调用时
peak_prominences
的输出匹配。如果未提供,则会在内部计算此数据。- wlen整数,可选
一个以样本为单位的窗口长度,作为可选参数传递给
peak_prominences
,用于内部计算 prominence_data。如果给出 prominence_data,则忽略此参数。
- 返回:
- widthsndarray
每个峰的宽度,以样本为单位。
- width_heightsndarray
评估 widths 时轮廓线的高度。
- 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()