2017-05-25 29 views
1

我使用MATLAB的findpeaks顯著峯函數來快速識別數據中的峯值:查找與MATLAB的findpeaks()

Full signal

你會注意到在第二負傾斜部分的高峯期,這裏放大:

Magnified false peak

這個峯值是測量已知神器,我想將它排除在外。我有很多這樣的數據,其中一些有神器,一些沒有,所以我希望有一種自動化的方式來排除它們。我需要在findpeaks中調整哪些設置以消除這些僞峯?我嘗試過'MinPeakProminence','Threshold'和'MinPeakWidth'無濟於事。儘管從圖片中可能不太明顯,但這些數據有數千個數據點,所以任何點的最近鄰居都非常相似(查看x軸縮放比例)。

+0

過濾數據,重複。 –

+1

我的擔心是因爲我對峯值位置非常敏感,我不想用濾波器稍微修改它。 – Pete

+0

@Pete:關於「MinPeakProminence」或「MinPeakWidth」是什麼都不起作用?似乎即使是0.1的最低峯值突出也很容易捕捉到這個例子。 – gnovice

回答

1

首先採用中值濾波平滑數據:y = medfilt1(x),然後應用在其上找到峯z = findpeaks(y)

或者,找峯:[pks,locs] = findpeaks(data),然後再在每個峯的,看看它是最大絕對在它周圍:

span = 10;%play with this number 
counter = 0 
for ii = 1:length(pks) 
    if pks(ii) == max(data(locs(ii)-span:locs(ii)+span)) 
     counter = counter + 1; 
     new_pks[counter] = pks[ii]; 
     new_locs[counter] = locs[ii]; 
    end 
end 
1

如果你有R2014b或更高版本,請檢查出MinPeakProminence name-value pair。這可以幫助您選擇更突出的峯值(相對量度它們的突出程度),而不是按絕對值選擇峯值。