在MATLAB中使用findpeaks和minpeakdistance来查找按距离而不是索引分隔的峰

时间:2013-08-07 15:38:21

标签: matlab graph analysis figure

我正在尝试在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索引而不是数据本身。如何使用峰值之间的距离而不是峰值指数之间的距离?

enter image description here

2 个答案:

答案 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);