簡體   English   中英

單維峰值擬合

[英]Single dimension peak fitting

我有一個浮點值的單維數組(c#加倍FYI),我需要找到值的“峰值”......好像是繪制的。

我不能只取最高值,因為峰值實際上是一個波動很小的高原。 這個高原正處於一堆噪音的中間。 我正在尋找能夠讓我成為這個高原中心的解決方案。

示例數組可能如下所示:

1,2,1,1,2,1,3,2,4,4,4,5,6,8,8,8,8,7,8,7,9,7,5,4,4, 3,3,2,2,1,1,1,1,1,2,1,1,1,1

峰值位於粗體部分的某處。

有任何想法嗎?

您可以對輸入數組應用低通濾波器 ,以消除小波動,然后在濾波數據中找到峰值。 最簡單的例子可能是“boxcar”濾波器,其中輸出值是距當前陣列位置一定距離內的輸入值的總和。 在偽代碼中,它看起來像這樣:

for i = 0, samplecount-1
  if (i < boxcar_radius) or (i >= (samplecount - boxcar_radius))  then
       filtered_data[i] = 0 // boxcar runs off edge of input array, don't use
  else
    filtered_data[i] = 0
    for j = i-boxcar_radius, i+boxcar_radius
       filtered_data[i] = filtered_data[i] + input_data[j]
    endfor
  endif
endfor

如果您對“高原”的寬度有所了解,可以選擇箱車半徑(約為預期平台寬度的一半)來檢測適當比例的特征。

你需要先用'小'來定義你的意思。 比如,圍繞最大值的“小”波動被定義為在最大值的±ε內的任何值。 然后,直接識別平台。

通過數據以識別最大值,然后執行第二次傳遞以識別在最大值的±ε內的所有值。

峰值檢測是相位相關和其他運動估計算法中的一個階段,用於視頻壓縮等場合。 一種方法是:考慮峰值的候選者和一定數量的鄰居的窗口。 現在使用標准回歸擬合二次函數。 具有亞像素精度的峰值處於擬合二次曲線的最大值。

顯然,確切的解決方案取決於細節。 如果您的發行版總是很好,就像在您的示例中一樣,您可以:

def GetPeak(l):
  large = max(l) * 0.8
  above_large = [i for i in xrange(len(l)) if l[i] > large]
  left_peak = min(above_large)
  right_peak = max(above_large)
  return (left_peak, right_peak)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM