簡體   English   中英

峰值檢測器-檢測小峰值

[英]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

  • 情況1: kpsh==False使arr_kpsh成為True數組。 由於bitwise_or操作正在使用做&arr_mpd & arr_kpsh將等於arr_mpd馬上所以arr_kpsh由無效時kpsh==False
  • 情況2: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM