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

时间:2017-05-25 07:44:36

标签: matlab signal-processing

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

Full signal

你会注意到第二个负斜率部分的峰值,放大到这里:

Magnified false peak

此峰值是测量的已知工件,我想将其排除。我有很多这样的数据,有些是神器,有些没有,所以我想在遇到时自动排除它们。我需要在findpeaks中调整哪些设置才能删除这些伪峰?我已经尝试过'MinPeakProminence','Threshold'和'MinPeakWidth'无济于事。虽然从图片中可能不太明显,但这些数据有数千个数据点,因此任何点的最近邻点都非常相似(查看x轴刻度)。

2 个答案:

答案 0 :(得分:1)

首先使用中位数滤镜平滑数据: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

答案 1 :(得分:1)

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