【问题标题】:Partial sine data fit code C [closed]部分正弦数据拟合代码 C [关闭]
【发布时间】:2014-11-04 17:58:55
【问题描述】:

我有 8 个数据点形成部分正弦波的峰值。我试图拟合这些来得到一个方程,所以我发现了真正的最大位置的点(很可能位于数据点之间)。编码将使用 C 语言。有没有人有任何关于算法或理想代码示例的信息?

【问题讨论】:

  • 添加数据和约束(例如,所有数据都在 90 的 5 度范围内)会有所帮助。一般形式为y = A*sin(B*x + C) + D。了解 A、B、C、D 的限制会有所帮助。
  • 数据点在 x 方向上是否等距分布?
  • 是 - 在 x 轴上等距

标签: c curve-fitting trigonometry


【解决方案1】:

由于数据点都接近最大值,波形y = A*sin(B*x + C) + D 可以近似为抛物线,很像 cos(x) = (1.0 - x*x/2! + ...) 的前两项.

因此找到 8 个数据点的最佳拟合抛物线并计算最大值。 C- Peak detection via quadratic fit

存在很多谷歌示例。 Example

【讨论】:

    【解决方案2】:

    如果您的样本值形成一个“驼峰”,即先增加后减少样本,您可以尝试将样本值视为“权重”并计算“重心”:

    float cog = 0f;
    for (i=0; i<num_samples; ii+) {
        cog += i * samples[i];
    }
    cog /= num_samples;
    

    我过去曾在类似情况下使用过它。

    注意:此方案仅在使用的样本集包含单个峰时才有效,问题措辞肯定让我认为是这种情况。通过监控样本值是否增加或减少,选择“感兴趣”的样本范围并按照所述计算峰值位置,可以轻松找到感兴趣的位置。

    另外请注意,如果实际目标是确定输入信号的正弦波相位或频率,最好将信号与参考正弦波集相关联(换句话说,做傅里叶变换)。

    【讨论】:

    • 如上代码,它不起作用,但我喜欢这个想法,并将其作为测试
    • 如果多个峰值靠近则不起作用
    • 也许我的“开场白”不够清楚,但提供的代码估计了单个“驼峰”或“峰”的子样本位置,给定一组分布在该峰周围的样本。假设在其他地方找到每个峰值,并在其周围选择一个样本集
    猜你喜欢
    • 1970-01-01
    • 2015-02-09
    • 2016-11-07
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2012-11-23
    相关资源
    最近更新 更多