【问题标题】:Using findpeaks and minpeakdistance in MATLAB to find peaks separated by distance rather than index在 MATLAB 中使用 findpeaks 和 minpeakdistance 来查找按距离而不是索引分隔的峰
【发布时间】:2013-08-09 02:00:52
【问题描述】:

我正在尝试获取 MATLAB 图中峰的 x 坐标(附示例)。我一直在使用findpeaks,但它似乎不喜欢我绘制点而不是线的事实。

我不会总是有两个高峰。有时我会拥有三个,有时我会拥有一个。多个峰将始终相隔至少 1/4 范围的 x,并且峰将始终至少是噪声水平的两倍。

这是我期望的工作:

[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 正在处理 in xData 索引而不是数据本身。如何让它使用峰值之间的距离而不是峰值索引之间的距离?

【问题讨论】:

    标签: matlab graph analysis figure


    【解决方案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
    

    【讨论】:

    • 所以,如果我的索引都搞砸了(也就是说,6774 166785 326792 486799 都是相同的 xData),我需要在找到峰值之前将我的 xData 排序为有序索引,然后找到峰值,然后将我的有序索引映射回原始索引?
    • 是的。查找峰值返回索引,您需要找到一种根据 x 坐标解释它们的方法。
    【解决方案2】:

    虽然我接受了 Molly 的回答,但我发现我自己的回答稍微少了些麻烦,但也不那么优雅:

      %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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-25
      • 2014-11-28
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多