如何“平滑”数据并计算线条渐变?

时间:2008-10-15 09:45:33

标签: algorithm curvesmoothing

我正在从测量距离的设备上读取数据。我的采样率很高,因此我可以测量距离(即速度)的大变化,但这意味着,当速度较低时,设备会提供相同的多个测量值(由于设备的粒度)。这导致了“阶梯式”曲线。

我需要做的是平滑曲线以计算速度。然后,我需要计算加速度。

如何最好地解决这个问题?

(采样率高达1000Hz,计算速率为10Hz即可。在VS2005中使用C#)

6 个答案:

答案 0 :(得分:26)

来自moogs的维基百科条目是平滑数据的良好起点。但它并没有帮助你做出决定。

这一切都取决于您的数据和所需的处理速度。

移动平均值 将顶部值压平。如果您对最小值和最大值感兴趣,请不要使用此值。另外我认为使用移动平均线会影响您对加速度的测量,因为它会使您的数据变平(一点点),因此加速度似乎会更小。这一切都归结为所需的准确性。

<强> Savitzky-格雷 快速算法。和移动平均线一样快。这将保持高峰的高度。实施起来有点困难。而且你需要正确的系数。我会选这个。

卡尔曼过滤器 如果你知道分布,这可以给你很好的结果(它用于GPS导航系统)。实施起来可能有些困难。我提到这个是因为我过去曾经使用过它们。但对于这类东西的首发,它们可能不是一个好的选择。

以上将减少信号噪音。

接下来你需要做的是检测“加速度”的起点和终点。您可以通过创建原始信号的Derivative来完成此操作。导数与Y轴(零点)相交的点可能是信号中的峰值,可能表示加速度的开始和结束。

然后,您可以创建二阶导数以获得最小加速度和最大加速度。

答案 1 :(得分:9)

你需要一个平滑滤波器,最简单的是“移动平均线”:只计算最后n个点的平均值。

这里的问题是,如何确定n,您能告诉我们更多关于您的申请的信息吗?

(还有其他更复杂的过滤器。它们保留输入数据的方式各不相同。好的列表在Wikipedia

编辑!:对于10Hz,平均最后100个值。

答案 2 :(得分:3)

移动平均线通常很糟糕 - 但对于白噪声效果很好。两个移动平均线和Savitzky-Golay都归结为相关性 - 因此速度非常快,可以实时实施。如果您需要更高的订单信息,如一阶和二阶衍生品 - SG是一个不错的选择。 SG的神奇之处在于滤波器所需的恒定相关系数 - 一旦确定了多项式的长度和程度以适合局部,系数只需要找到一次。您可以使用R(sgolay)或Matlab计算它们。

您还可以通过Savitzky-Golay最佳拟合多项式估计噪声信号的一阶导数 - 这些多项式有时称为Savitzky-Golay导数 - 通常可以很好地估计一阶导数。

卡尔曼滤波可能非常有效,但计算量更大 - 速度很难超过短卷积!

保罗
CenterSpace软件

答案 3 :(得分:1)

除上述文章外,请查看Catmull-Rom Splines

答案 4 :(得分:0)

您可以使用moving average来平滑数据。

答案 5 :(得分:0)

除了GvS上面的优秀答案,您还可以考虑使用一些常规曲线拟合(如三次或二次样条)来平滑/减少平均结果的步进效果。