[英]Peak Detector - Detecting Small Peaks
我正在通過Marcos Duarte的峰值檢測器 ,了解每條線,除了他檢測到比最小峰值距離更近的小峰值時所用的部分:
if ind.size and mpd > 1:
ind = ind[np.argsort(x[ind])][::-1] # sort ind by peak height
idel = np.zeros(ind.size, dtype=bool)
for i in range(ind.size):
if not idel[i]:
# keep peaks with the same height if kpsh is True
idel = idel | (ind >= ind[i] - mpd) & (ind <= ind[i] + mpd) \
& (x[ind[i]] > x[ind] if kpsh else True)
idel[i] = 0 # Keep current peak
# remove the small peaks and sort back the indices by their occurrence
ind = np.sort(ind[~idel])
特別是我不明白這一行:
idel = idel | (ind >= ind[i] - mpd) & (ind <= ind[i] + mpd) \
& (x[ind[i]] > x[ind] if kpsh else True)
我知道他按峰高對峰數組( ind
)進行排序,並創建相同大小的布爾數組,並使用錯誤的值對其進行初始化。 然后,他遍歷idel
數組,首先檢查當前值是否為0(假)。
我已經分別運行了下一行的不同布爾比較,但是無法弄清楚他如何使用mpd
,因為他正在數組和元素級別上使用ind
。 有人可以快速給我解釋一下嗎? 我被困在這一點上。
提前致謝!
回想一下, kpsh
是覆蓋mpd
的選項。 通常,如果選擇mpd
則在任何給定長度為2*mpd
段中只能看到一個峰值。 但是,如果選擇了kpsh
,則共享同一高度的峰將成為例外,因為這是平局 。
現在,讓我們分析一下:
(ind >= ind[i] - mpd) & (ind <= ind[i] + mpd)
部分檢查ind
FOR EACH元素是否在ind[i]
的mpd
附近,因此它將返回一個布爾值與ind
大小相同的數組。 我將其稱為arr_mpd
。 假設一秒鍾沒有kpsh
。 idel | arr_mpd
將會發生什么? 如果ind[i]
已經在其附近定義了一個峰值,則索引i
idel | arr_mpd
將返回True
。 因此它會通過稍后將idel[i]
設置為TRUE
來丟棄ind[i]
,因為ind = np.sort(ind[~idel])
將負責刪除它們。
現在讓我們關注(x[ind[i]] > x[ind] if kpsh else True)
。 我將其稱為arr_kpsh
。
kpsh==False
使arr_kpsh
成為True
數組。 由於bitwise_or操作正在使用做&
, arr_mpd & arr_kpsh
將等於arr_mpd
馬上所以arr_kpsh
由無效時kpsh==False
。 kpsh==True
就是發生魔術的地方。 x[ind[i]] > x[ind]
逐個元素地檢查與ind[i]
相對應的峰的值是否大於到該點為止發現的任何其他峰索引。 如果是這種情況,則意味着它的高度不同(不需要檢查直接相等性,因為峰值只能更大)。 但是,如果不更大,則意味着存在另一個具有相同高度的峰。 這arr_mpd & arr_kpsh
上的該元素覆蓋為False
。 如果在idel
alededy中該元素也是假的,那么它將被保留,從而當kpsh=True
時保持相同的高度。 我希望這有幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.