单维峰值拟合

buf*_*erz 6 c# algorithm math

我有一个浮点值的单维数组(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

峰值位于粗体部分的某处.

有任何想法吗?

Jim*_*wis 6

您可以对输入数组应用低通滤波器,以消除小波动,然后在滤波数据中找到峰值.最简单的例子可能是"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
Run Code Online (Sandbox Code Playgroud)

如果您对"高原"的宽度有所了解,可以选择箱车半径(约为预期平台宽度的一半)来检测适当比例的特征.


vad*_*vad 3

您需要首先定义“小”的含义。比如说,围绕最大值的“小”波动被定义为最大值 ± ϵ 范围内的任何值。然后,很容易识别平台期。

遍历数据以确定最大值,然后进行第二次遍历以识别最大值 ± ϵ 范围内的所有值。