2012-04-24 173 views
14

我試圖瞭解如何從直方圖中檢測兩個峯。可以有多個,但我需要挑選最高的兩個。基本上我需要的是,雖然我會將這些高峯向左或向右移動,但我需要抓住它們。他們的傳播可能會有所不同,他們的PEAK值可能會改變,所以我必須找到一種方法來在Matlab中獲得這兩個峯值。從直方圖中檢測兩個最高峯

我到目前爲止所做的是創建一個5值窗口。該窗口填充了直方圖中的值,並執行掃描。每次我向前移動5步到下一個值時,將前一個窗口值與當前值進行比較。保留哪一個更大。

有沒有更好的方法來做到這一點?

enter image description here

+0

我想你不能在這個問題中分離信號處理和編程。如果有人提出基於統計的答案,它會是什麼?信號處理或編程? – 2012-04-25 01:24:20

回答

5

返回數據從HIST(或histc)函數的變量(y = hist(x,bin);),並使用PEAKFINDER FileExchange提交找局部最大值。

我也使用Eli Billauer的PEAKDET函數。很棒。您可以通過代碼示例查看我的answer

+1

我會建議在運行峯值查找器之前執行內核密度估計。 fileexchange頁面上的示例數字顯示了一些誤報。另外,爲什麼其他問題首先遷移到dsp? o_O – abcd 2012-04-24 18:19:55

+0

@Bringbackspy:是的,您可以使用'ksdensity'函數而不是'hist'。至於向dsp遷移問題,我不知道。當我正在研究答案時,主持人的決定讓我感動了。 – yuk 2012-04-24 18:33:39

+0

喲,太好了!感謝看起來很有希望,所以我將有一個PEEK進入它:) – 2012-04-25 01:25:24

6

最簡單的方法是首先使用高斯內核來平滑數據以消除高頻變化。

然後使用函數localmax來查找局部最大值。

+2

如果你知道你的直方圖是'固有'雙峯,那麼我會平滑它,直到它只有兩個最大值。 – leonbloy 2012-04-24 21:24:51

+0

@slayton,直方圖已經通過平滑階段。 – 2012-04-25 01:27:41

+1

@Wajih,好的,但是如果你只想分離峯值,那麼你可以更平滑它來濾除高頻變化。這些變化使峯值檢測變得困難,因爲您有很多局部最大值。如果你將它們過濾出來,因爲它很重要。 – slayton 2012-04-25 14:29:24