peak_widths#
- scipy.signal.peak_widths(x, peaks, rel_height=0.5, prominence_data=None, wlen=None)[源代码]#
计算信号中每个峰的宽度。
此函数计算峰在相对于其峰高和突出度(prominence)的距离处的样本宽度。
- 参数:
- 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()