2010-12-07 56 views
1

編輯:其實這並非意想不到的行爲,但我仍然需要一個解決方案。 findpeaks compares each element of data to its neighboring values.函數findpeaks在MATLAB的信號處理工具箱中發生意外的行爲

我有數據,其中包含我用信號處理工具箱中的功能findpeaks檢測到的峯。有時,當我有兩個相同的值時,函數似乎不能正確檢測峯值。出現這種情況很rarly在我的數據,但這裏是一個示例來說明我的問題:

>> values 

values = 

    -0.0324 
    -0.0371 
    -0.0393 
    -0.0387 
    -0.0331 
    -0.0280 
    -0.0216 
    -0.0134 
    -0.0011 
    0.0098 
    0.0217 
    0.0352 
    0.0467 
    0.0548 
    0.0639 
    0.0740 
    0.0813 
    0.0858     <-- here should be another peak 
    0.0858     <-- 
    0.0812 
    0.0719 
    0.0600 
    0.0473 
    0.0353 
    0.0239 
    0.0151 
    0.0083 
    0.0034 
    -0.0001 
    -0.0025 
    -0.0043 
    -0.0057 
    -0.0048 
    -0.0038 
    -0.0026 
    0.0007 
    0.0043 
    0.0062 
    0.0083 
    0.0106 
    0.0111 
    0.0116 
    0.0102 
    0.0089 
    0.0057 
    0.0025 
    -0.0025 
    -0.0056 

現在findpeaks函數只找到一個峯值:

>> [pks loc] = findpeaks(values) 

pks = 

    0.0116 


loc = 

    42 

如果我繪製的數據,可以很明顯找到的峯值將會丟失18/19位置的峯值之一,因爲它們的值均爲0.08579

alt text

什麼是找到那些缺失峯值的最佳方式?

+1

請嘗試以下資源:http://www.billauer.co.il/peakdet.html,http://terpconnect.umd.edu/~toh/spectrum/PeakFindingandMeasurement.htm – Amro 2010-12-08 06:59:47

回答

1

如果您有圖像處理工具箱,你可以使用IMREGIONALMAX找到峯值,之後就可以使用regionprops尋找區域的中心(如果這就是你所需要的),即

bw = imregionalmax(signal); 
peakLocations = find(bw); %# returns n peaks for an n-tuple of max-values 

stats = regionprops(bw,'Centroid'); 
peakLocations = cat(1,stats.Centroid); %# returns the center of the n-tuple of max-values 
+0

問題不在於我只檢測到一個峯值,但我根本沒有檢測到高峯值。 – Lucas 2010-12-07 14:16:21

+0

@Lucas:是的,這並沒有很好地制定,過濾解決方案不能保證解決問題,所以我已經刪除它。無論如何,`imregionalmax`做你想要的,除非它有兩個以上相等的值也是有效的。您仍然可能需要首先進行過濾以消除因噪音引起的局部最大值。 – Jonas 2010-12-07 14:23:36

0

我最終編寫了我自己的更簡單的findpeaks版本,這似乎適用於我的目的。

function [pks,locs] = my_findpeaks(X)  
    M = numel(X); 
    pks = []; 
    locs = []; 
    if (M < 4) 
     datamsgid = generatemsgid('emptyDataSet'); 
     error(datamsgid,'Data set must contain at least 4 samples.'); 
    else 
     for idx=1:M-3 
      if X(idx)< X(idx+1) && X(idx+1)>=X(idx+2) && X(idx+2)> X(idx+3) 
       pks = [pks X(idx)]; 
       locs = [locs idx]; 
      end 

     end 

    end 
end 

編輯:爲了澄清,問題出現了,當我有一個高峯而這正是兩個採樣點,這兩個採樣點之間有巧合的是相同的值。在10,000多個案例中,它只發生過幾次。

1

這是一個老話題,但也許有的還在尋找一個更容易的解決這個(像我一樣今天):

你也可以只。減去的高原上從所有價值一些非常小的固定值,除了第一個值。這導致高原上的每個第一個值始終是相應高原上的最高值,導致它們被包括爲峯值。

只是要像你這部分代碼:

peaks = yourdata; 
verysmallvalue = .001; 
plateauvalue = peaks(1); 

for i = 2:size(peaks,1) 
    if peaks(i) == plateauvalue 
     peaks(i) = peaks(i) - verysmallvalue; 
    else 
     plateauvalue = peaks(i); 
    end 
end 

[PKS,LOCS] = findpeaks(peaks); 
plot(yourdata); 
hold on; 
plot(LOCS, yourdata(LOCS), 'Color', 'Red', 'Line', 'None', 'Marker', 'o'); 

希望這有助於!

相關問題