2013-08-07 34 views
1

我試圖在MATLAB圖中獲得峯值的x座標(附帶示例)。我一直在使用findpeaks,但似乎並不喜歡我在繪製點而不是線條的事實。在MATLAB中使用findpeaks和minpeakdistance查找由距離而不是索引分隔的峯值

我不會總是有兩個高峯。有時我會有三個,有時我會有一個。多個峯值將始終至少相隔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

回答

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 
+0

所以,如果我的指數都搞砸了(也就是'6774 166785 326792 486799'都在同一個xData中),我需要在找到峯值之前將我的xData排序爲有序索引,然後找到峯值,然後將我的有序索引映射回原始索引? –

+0

是的。查找峯值返回索引,您需要找到一種方法根據您的x座標來解釋它們。 – Molly

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); 
相關問題