1

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

在此处输入图像描述

4

2 回答 2

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
于 2013-08-07T16:15:41.757 回答
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);
于 2013-08-07T16:36:08.427 回答