scipy.signal.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元组,可选

一个由三个数组组成的元组,该数组与 peak_prominences 当使用相同的参数调用时 xpeaks 。如果未提供,此数据将在内部计算。

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_{{eval}} = h_{{Peak}} - P \cdot R\) ,在哪里 \(h_{{Peak}}\) 是山峰本身的高度, \(P\) 是山峰的突出处 \(R\) 使用参数指定的正比率 rel_height

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

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

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

1.1.0 新版功能.

示例

>>> 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