我有一个浮点值的单维数组(c#加倍FYI),我需要找到值的“峰值”......好像是绘制的。
我不能只取最高值,因为峰值实际上是一个波动很小的高原。这个高原正处于一堆噪音的中间。我正在寻找能够让我成为这个高原中心的解决方案。
示例数组可能如下所示:
1,2,1,1,2,1,3,2,4,4,4,5,6,的 8,8,8,8,7,8,7,9,7 < / strong>下,5,4,4,3,3,2,2,1,1,1,1,1,2,1,1,1,1
其中峰值位于粗体部分的某处。
有什么想法吗?
答案 0 :(得分:6)
您可以将low-pass filter应用于输入数组,以消除小波动, 然后在过滤后的数据中找到峰值。最简单的例子可能是“棚车” filter,其中输出值是特定距离内输入值的总和 从当前阵列位置。在伪代码中,它看起来像这样:
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
如果您对“高原”的宽度有所了解,可以选择箱车半径(约为预期平台宽度的一半)来检测适当比例的特征。
答案 1 :(得分:3)
你需要首先用'小'来定义你的意思。比如,围绕最大值的“小”波动被定义为在最大值的±ε内的任何值。然后,直接识别平台。
通过数据识别最大值,然后进行第二次传递,以识别最大值±ε范围内的所有值。
答案 2 :(得分:2)
峰值检测是Phase Correlation以及视频压缩等场合使用的其他运动估计算法的一个阶段。一种方法是:考虑峰值的候选者和一定数量的邻居的窗口。现在使用标准回归拟合二次函数。具有亚像素精度的峰值处于拟合二次曲线的最大值。
答案 3 :(得分:1)
显然,确切的解决方案取决于细节。如果您的发行版总是很好,就像您的示例中那样:
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)