使用 MATLAB 的 findpeaks() 查找重要峰值

Finding significant peaks with MATLAB's findpeaks()

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

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

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

首先使用中值滤波器平滑数据: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

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