【问题标题】:Optimal algorithm for 5-point weighted average in CC中5点加权平均的最优算法
【发布时间】:2013-08-18 20:56:39
【问题描述】:

我想在一组数字中找到“真实”的峰值位置。在找到最大值的索引后,我应用加权平均值来确定真正的峰值位置。这需要左侧两个索引和右侧两个索引。但是,如果最高峰在索引 0 或 1,或者长度为 1 和长度为 2 上怎么办?现在我使用 ifs 来做边界检查。在数组之前和之后用两个零填充数组会更快吗,这会使 ifs 变得不必要?

【问题讨论】:

  • 你可以尝试两种方法并测量。
  • 这是 FFT 的结果吗?
  • 是的,这是一个fft结果。
  • 对于 FFT 结果,正确的答案是用零填充。没有低于 DC 的能量(桶 0)。

标签: c algorithm optimization weighted-average


【解决方案1】:

解决方案取决于问题。如果峰值出现在数组的前一个或两个条目处,那么左边的数据值应该为零,或者可能是前一个或两个元素的反映:

index:  -2 -1  0  1  2  3  4
         0  0 12  8  1  2  3   <<A assume this, or

         1  8 12  8  1  2  3   <<B or this

取决于问题的具体情况。同样的考虑也适用于数组的末尾。

一般来说,如果您的数据是泊松分布,那么 A 可能是最佳估计值。如果数据是高斯的,那么 B 是一个很好的假设。

【讨论】:

  • 为了完整起见,简单地重复“12”是另一种选择。
  • @BenJackson,问题是如何估计缺失数据的价值。您可以假设索引 -2 和 -1 的任何值,但在所有可能的值中假设然后证明选择是合理的。
  • 这种边缘情况在图像处理中一直发生,常见的解决方案包括以零扩展(你的“A”)、跨边缘镜像(你的“B”)、无限扩展边缘像素(我的评论)或包装到相反的边缘。我认为 this 问题的答案将受到样本物理意义的影响(我怀疑这种意义的存在是因为他希望找到加权峰值,就像在 FFT 中一样)。
  • 实际上,我认为我用零获得了最好的结果。我尝试重复但不反思。我将测试所有选项。总体而言,填充似乎使代码更好,负索引在 C99 中运行良好,所以现在我将使用它。我会等着看 Ben 是否提供答案。如果没有,我会接受这个。
  • 嗯,我不认为我可以,这是 FFT 的结果。数字从 0 (DC) 到奈奎斯特。
【解决方案2】:

如果 AVG[i] = a[i-2] 到 a[i+2] 的平均值,我喜欢
AVG[1] 是 a[0] 到 a 的平均值的想法[3] 和
AVG[0] 是 a[0] 到 a[2] 的平均值。


所以创建 a[-1] 和 a[-2] 来满足这些目标,那么“AVG[i] = a[i-2] 到 a[i+2] 的平均值”的无例外使用可能使用。

令 a[-1] 的值使得 (a[-1] 到 a[3]) 的平均值 = (a[0] 到 a[3]) 的平均值。
a[-1] = (a[0] + a[1] + a[2] + a[3])/4

设 a[-2] 的值使得 (a[-2] 到 a[2]) 的平均值 = (a[0] 到 a[2]) 的平均值。
a[-2] = (5*a[0] + 5*a[1] + 5*a[2] -3*a[3])/12

另一端以类似的方式工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多