代码之家  ›  专栏  ›  技术社区  ›  Irina

峰值检测器-检测小峰值

  •  0
  • Irina  · 技术社区  · 7 年前

    我正在经历 Marcos Duarte's peak detector 并理解每一条线,除了他检测到比最小峰值距离更近的小峰值的部分:

    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)
    

    我知道他对peak数组进行排序( ind )并创建一个大小相同的bool数组,并用假值初始化它。然后,他遍历 idel 数组,首先检查当前值是否为0(false)。

    我已经分别对下一行进行了不同的布尔比较,但无法确定他是如何使用 mpd 在数组和元素级别。有人能给我一个快速的解释吗?我被困在这一点上。

    提前谢谢!

    1 回复  |  直到 7 年前
        1
  •  1
  •   D_Serg    7 年前

    回想一下 kpsh 是一个覆盖的选项 mpd . 通常如果 mpd 如果选中,则在任何给定的长度段中只能看到一个峰值 2*mpd kpsh 选择此选项后,共享相同高度的山峰例外,因为它是 .

    现在,让我们分析一下:

    (ind >= ind[i] - mpd) & (ind <= ind[i] + mpd) ind 如果它是否在 mpd ind[i] ,因此它将返回一个与 . 我称之为 arr_mpd . 假设没有 kpsh . 将会发生的是 idel | arr_mpd 会回来的 True 指数 i ind[i] ind[i] 通过设置 idel[i] 到 TRUE 因为后来,, ind = np.sort(ind[~idel])

    (x[ind[i]] > x[ind] if kpsh else True) . 我要称之为 arr_kpsh .

    • 案例1: kpsh==False 制造 阿鲁克普什 符合事实的 s因为按位_或操作是使用 & arr_mpd & arr_kpsh 等于 就这样 阿鲁克普什 当 kpsh==False
    • 案例2: kpsh==True x[ind[i]] > x[ind] 按元素检查峰值的值是否与 ind[i] 大于迄今为止发现的任何其他峰值指数。如果是这种情况,则意味着它的高度不同(不需要检查直接相等,因为峰值只能更大)。如果它不是更大,那意味着有另一个同样高度的山峰。这将覆盖上的该元素 arr_mpd&阿鲁克普什 False . 如果该元素在 idel alraedy,那么它将被保留,因此当 kpsh=True .

    我希望这有帮助