【问题标题】:Smoothing discrete data平滑离散数据
【发布时间】:2014-08-04 11:43:56
【问题描述】:

我正在尝试编写一个程序来平滑离散数字化数据以用于运动模拟器。数据将作为一组 t, x(t) 点提供,旨在用于创建循环运动;因此,平滑后的数据不仅必须在 t 值范围内连续,而且必须在两个端点之间连续。此外,所提供的数据很可能比所需的分辨率低很多,因此会进行大量插值。

我研究了各种技术,例如 Gauss-Newton 和 Levenberg-Marquardt 曲线拟合,但这些都假设目标函数是事先已知的(而且它不会是)。不幸的是,所述运动模拟器的用户可能无法选择合适的功能(由于他们不同的背景)。最后,代码必须可以在非专有的、跨平台(最好是编译的)语言上使用,该语言可以在嵌入式平台(很可能是 ARM 上的 Linux)上运行——这排除了 Maple 的使用(它提供了一个通用的“适合”选择适当的目标函数的例程)、Matlab(类似 IIRC)或其他与数学相关的语言。我应该说由于经验,我倾向于使用 C++。

一些典型数据可以在页面here找到。

什么技术对此有用?

【问题讨论】:

  • 我不知道你的数据到底是什么样子,但具有适当度数的多项式拟合可能足够通用
  • 我记得一些表面上相似的东西——将连续循环函数拟合到一组点(转换为极坐标),在图像中定义一个模糊的圆形区域——我在其中破解了 Matlab 的 polyfit 和 @ 987654323@ 函数使用 sin+cos 的组合而不是多项式作为基函数,在这种情况下效果很好。不确定这对您的数据有多合适,但可能值得考虑 - 我相信几乎所有语言都有适合代码的最小二乘法。

标签: c++ embedded arm interpolation curve-fitting


【解决方案1】:

我实现了一个通用三次样条拟合函数,该函数可应用于任何维度的欧几里得和四元数数据,这可能符合(不是双关语)您的目的。我不知道拟合与其他算法相比有多好,因为只有输入数据键被认为是潜在的样条键放置,但您可以在这里查看它:http://sourceforge.net/p/spinxengine/code/HEAD/tree/sxp_src/core/math/parametric.inl(fit_spline 函数)。

为了创建循环运动,您应该能够在拟合数据序列之前和之后复制键并修改函数,以便在循环结束时强制创建键。这是一个相对简单的功能,因此像这样修改它应该不是很大的努力。您还需要设置样条拟合约束来定义在何种条件下创建新样条(例如,拟合数据到输入数据的距离容差是多少等)

干杯,Jarkko

【讨论】:

  • 这看起来很有用。我认为刺是一种可能性,但不确定实施等。在 cmets 旁边是否有这方面的文档?
【解决方案2】:

upsampling and interpolation 应用数字信号处理 (DSP) 技术进行速率转换可能会更简单、更适应不同的数据集。 C++ SPUC 库可以帮助您 - 它支持多个 interpolation filters

【讨论】:

  • 如果数据“参差不齐”且不精确,这将如何工作?我不是在寻找适合所有数据点的东西(如在标准插值中),而是在以低采样率平滑数据的锯齿状。
  • @gjsmo :这正是 DSP 技术适用的原因。 “噪声”包含可以通过适当的 FIR 滤波器去除的高频分量。最基本的 boxcar 滤波器实现了一个简单的滚动均值,并且是一个所有系数都等于 1 的 FIR 滤波器,平滑程度由滤波器的长度决定。使用系数可以提供更复杂的方法和更大的控制,但是确定系数是相当复杂的数学 - 有滤波器设计工具可以做到这一点 - 经常使用 Matlab。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 2014-10-10
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多