我正在尝试在MATLAB图中获得峰的x坐标(附例)。我一直在使用findpeaks
,但它似乎不喜欢我绘制点而不是线的事实。
我不会总是有两个高峰。有时我会有三个,有时我会有一个。多个峰值始终至少相隔x范围的1/4,峰值始终至少是噪声水平的两倍。
这是我期望的工作:
[pks,locs] = findpeaks(yData,...
'SortStr','descend',...
'MinPeakDistance',floor(range(xData)/4),...
'MinPeakHeight',floor(max(yData)/2)...
)
而不是获得两个峰值,我在第一个峰值周围捆绑了四个:
>> locs
locs =
6774 166785 326792 486799
>> xData(locs)
ans =
-96780.787939025 -96770.1800919265
-96770.8959353367 -96771.6117787468
我假设MinPeakDistance正在处理xData索引而不是数据本身。如何使用峰值之间的距离而不是峰值指数之间的距离?
答案 0 :(得分:1)
findpeaks
对x坐标或绘制的内容一无所知。您需要在索引方面指定MinPeakDistance
。这是一个例子:
xData = -100:1:-1;
yData = rand(1,100);
yData(10) = 100; % peak
yData(11) = 99; % not a peak
yData(50) = 100; % peak
yData(51) = 99; % not a peak
[pks,locs] = findpeaks(yData,...
'SortStr','descend',...
'MinPeakDistance',floor(length(yData)/4),...
'MinPeakHeight',floor(max(yData)/2)...
);
xLocs = xData(locs);
pks =
100 100
locs =
10 50
答案 1 :(得分:0)
虽然我已经接受了莫莉的回答,但我发现自己的麻烦略少,但不那么优雅:
%find all peaks significantly above noise floor
[pks,locs] = findpeaks(yData,'SortStr','descend','MinPeakHeight',floor(max(yData)/2));
xLocs = xData(locs);
%find number of peak clusters
numPeaks = length(unique(round(xLocs/100)));
%find locations of numPeaks peaks
[pks,locs] = findpeaks(yData,'SortStr','descend','npeaks',numPeaks);