使用 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 按绝对值计算它们。
我正在使用 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 按绝对值计算它们。