【问题标题】:Finding significant peaks with MATLAB's findpeaks()使用 MATLAB 的 findpeaks() 查找显着峰值
【发布时间】:2017-10-25 18:47:19
【问题描述】:

我正在使用 MATLAB 的 findpeaks 函数来快速识别数据中的峰值:

您会注意到第二个负倾斜部分的峰值,在此处放大:

这个峰值是已知的测量结果,我想排除它。我有很多这样的数据,有些带有工件,有些没有,所以我想要一种在遇到时自动排除它们的方法。我需要在 findpeaks 中调整哪些设置以消除这些伪峰?我尝试了“MinPeakProminence”、“Threshold”和“MinPeakWidth”,但无济于事。虽然从图片上可能看不出来,但是这个数据有上千个数据点,所以任何一个点的最近邻都非常相似(看x轴刻度)。

【问题讨论】:

  • 过滤数据,重复。
  • 我担心的是,由于我对峰值位置非常敏感,我不想用过滤器稍微修改它。
  • @Pete:'MinPeakProminence''MinPeakWidth' 有什么问题?似乎即使是 0.1 的最小峰值突出也很容易抓住这个例子。

标签: matlab signal-processing


【解决方案1】:

如果您有 R2014b 或更高版本,请尝试查看 MinPeakProminence name-value pair。这可以帮助您选择更突出的峰(相对衡量它们突出的程度),而不是按绝对值选择它们。

【讨论】:

    【解决方案2】:

    首先使用中值滤波器平滑数据:y = medfilt1(x),然后对其应用查找峰值z = findpeaks(y)

    或者,找到峰值:[pks,locs] = findpeaks(data),然后遍历每个峰值,看看它是否是其附近的绝对最大值:

    span = 10;%play with this number
    counter = 0
    for ii = 1:length(pks)
       if pks(ii) == max(data(locs(ii)-span:locs(ii)+span))
          counter = counter + 1;
          new_pks[counter]  = pks[ii];
          new_locs[counter] = locs[ii];
       end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 2014-11-28
      • 2014-09-04
      • 2015-02-10
      • 2011-05-13
      • 1970-01-01
      相关资源
      最近更新 更多