我正在使用MATLAB的findpeaks函数快速识别数据中的峰值:
你会注意到第二个负斜率部分的峰值,放大到这里:
此峰值是测量的已知工件,我想将其排除。我有很多这样的数据,有些是神器,有些没有,所以我想在遇到时自动排除它们。我需要在findpeaks中调整哪些设置才能删除这些伪峰?我已经尝试过'MinPeakProminence','Threshold'和'MinPeakWidth'无济于事。虽然从图片中可能不太明显,但这些数据有数千个数据点,因此任何点的最近邻点都非常相似(查看x轴刻度)。
答案 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。这可以帮助您选择更突出的峰值(相对衡量它们脱颖而出的程度),而不是选择绝对值。