我无法在此图中找到4个主要峰值
信号是非常紧张的,因为它们上升然后下降,使得很难找到最大值及其指数。
function [peaks, locations] = findMaxs (mag, threshold)
len = length(mag);
prev = 1;
cur = 2;
next = 3;
k = 1; %number of peaks
while next < len
if mag(cur) - mag(prev) > threshold
if mag(cur) > mag(next)
peaks(k) = mag(cur);
fprintf('peak at %d\n', cur);
k = k + 1;
end
end
prev = cur;
cur = next;
next = next + 1;
end
end
findpeaks()
给了我太多结果,所以我使用了这个功能。但是,如果我将阈值设置得太低,我会得到太多结果,如果我将它设置得太高,我会错过其中一个主要峰值。
我该怎么做?
答案 0 :(得分:5)
如果你的主要峰值与你所包含的图表中的分离一样,那么findpeaks()
的参数可以帮助很多。尝试:
findpeaks(x, 'MINPEAKDISTANCE', dist);
x
是你的大小,dist
是一个距离你可以假设是2个峰之间的最小距离。这可能会让你看到彼此超过2*dist
的2次偷看,如果是这样的话,请考虑使用'MINPEAKHEIGHT'
另一个选项是动态调整阈值,例如通过计算平均值m
和标准偏差sigma
并设置阈值,只计算n*sigma
高于m
的峰值}}
答案 1 :(得分:3)
您仍然可以使用findpeaks
。
例如[pks,locs] = findpeaks(data)
返回局部峰值的索引。
那么你可以对data(locs)
进行排序并得到前4个振幅。
[a ind]=sort(data(locs,'descend')
或设置一个阈值,data(locs)>threshold
等......
答案 2 :(得分:0)
这样做的一种方法是计算幅度数组的差函数(相当于连续函数的导数)。寻找差值函数的值从正到负的点。这些是你的最高分。
要找到最突出的峰值,请计算从一阶差分获得的点处的二阶差分函数,并选择具有最高阶数的那些。
如果事前未知突出峰值的数量,您可以使用此时的阈值作为突出度量。