【问题标题】:Single dimension peak fitting单维峰拟合
【发布时间】:2010-05-25 18:58:10
【问题描述】:

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

峰值在粗体部分的某处。

有什么想法吗?

【问题讨论】:

    标签: c# algorithm math


    【解决方案1】:

    您可以将low-pass 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
    

    如果您对“高原”的宽度有所了解,可以选择棚车半径(大约是预期高原宽度的一半)以检测适当比例的特征。

    【讨论】:

      【解决方案2】:

      您需要首先定义“小”的含义。比如说,最大值附近的“小”波动被定义为最大值±ε内的任何值。然后,很容易识别高原。

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

      【讨论】:

      • 这里有几个人给出了类似的答案,你是第一个。谢谢 Anon,我没想过以这种方式解决问题。我在最大值的 ± ϵ 内检索了“窗口”的数组索引,并将这两个值取平均值。这是速度和准确性的完美结合。再次感谢!
      【解决方案3】:

      峰值检测是Phase Correlation 和其他用于视频压缩等地方的运动估计算法的阶段之一。一种方法是这样的:考虑一个峰值的候选者和一定数量的邻居的窗口。现在使用标准回归拟合二次函数。具有亚像素精度的峰值在拟合二次方的最大值处。

      【讨论】:

        【解决方案4】:

        显然,精确的解决方案取决于细节。如果您的分布总是像您的示例中那样好,您可以:

        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)
        

        【讨论】:

          猜你喜欢
          • 2016-10-01
          • 1970-01-01
          • 2022-01-22
          • 2023-04-06
          • 1970-01-01
          • 2013-10-26
          • 2010-10-06
          • 2019-12-12
          • 2018-03-12
          相关资源
          最近更新 更多