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,選用
一個包含三個陣列的元組,與使用相同參數 x 和 peaks 呼叫
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_data 或 rel_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()