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_datatuple,選用

一個包含三個陣列的元組,與使用相同參數 xpeaks 呼叫 peak_prominences 的輸出相符。如果未提供此資料,則會在內部計算。

wlenint,選用

傳遞給 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],則具有錯誤的 dtype、不是 C 連續的或不具有相同的形狀。

警告:
PeakPropertyWarning

如果任何計算的寬度為 0 則引發。這可能源自提供的 prominence_datarel_height 設定為 0。

Warning

此函數對於包含 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