C++ 平滑离散数据

C++ 平滑离散数据,c++,embedded,arm,interpolation,curve-fitting,C++,Embedded,Arm,Interpolation,Curve Fitting,我正试图编写一个程序来平滑离散的数字化数据,以便在运动模拟器中使用。数据将作为一组t、x(t)点提供,用于创建循环运动;因此,平滑后的数据不仅在t值范围内是连续的,而且在两个端点之间也是连续的。此外,提供的数据很可能比要求的分辨率低得多,因此将进行大量插值 我研究过各种技术,比如高斯-牛顿(Gauss-Newton)和莱文伯格-马夸特(Levenberg-Marquardt)曲线拟合,但这些技术假设目标函数事先已知(而且不会)。不幸的是,所述运动模拟器的用户可能无法选择适当的功能(由于他们的背景

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

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


什么技术对此有用?

我实现了一个通用的三次样条拟合函数,可以应用于任何维度的欧几里德和四元数数据,这可能符合您的目的(没有双关语)。我不知道拟合与其他算法相比有多好,因为只有输入数据键被视为潜在的样条曲线键放置,但您可以在这里查看:(拟合样条曲线函数)

对于创建循环运动,您应该能够在安装的数据序列之前和之后复制关键点,并修改功能,以便在循环结束时强制创建关键点。这是一个相对简单的函数,所以像这样修改它应该不会太费劲。您还需要设置样条曲线拟合约束,以定义在何种条件下创建新样条曲线(例如,拟合数据到输入数据的距离公差是多少等)


干杯,Jarkko

应用数字信号处理(DSP)技术进行速率转换可能会更简单、更适合不同的数据集。C++库可能会帮助你——它支持几个.< /p>我不知道你的数据看起来是什么样的,但是多项式拟合的近似程度可能是一般的,我记得一些表面上相似的东西。在图像中定义一个模糊的圆形区域——在这个区域中,我将Matlab的
polyfit
polyval
函数拼凑起来,使用sin+cos的组合,而不是多项式作为基函数,在这种情况下效果非常好。我不确定这对你的数据有多合适,但这可能值得一想——我相信对于任何语言都有最小二乘拟合的代码。如果数据是“锯齿状”的和不精确的,这将如何工作?我不是在寻找适合所有数据点的东西(如标准插值),而是用低采样率平滑数据的锯齿。@gjsmo:这正是DSP技术适用的原因。“噪声”包含可通过适当的FIR滤波器去除的高频分量。最基本的是,boxcar滤波器实现了一个简单的滚动平均值,是一个FIR滤波器,所有系数都等于1,平滑程度由滤波器的长度决定。使用系数提供了一种更复杂的方法和更大的控制,但是确定系数是相当复杂的数学-有滤波器设计工具可以做到这一点-经常使用Matlab。这看起来很有用。我认为spines是一种可能性,不确定它的实现等等。评论旁边是否有相关文档?