2008-10-15 55 views
9

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

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

如何最好的去解决这个问题?

(采样率高达1000Hz的,为10Hz的计算速度将是确定使用VS2005 C#)

回答

25

来自moogs的维基百科条目是平滑数据的一个很好的起点。但它不能帮助你作出决定。

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

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

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

卡尔曼滤波器 如果你知道分布,这可以给你很好的结果(它用于GPS导航系统)。也许有点难以实施。我提到这个是因为我过去曾经使用过它们。但他们可能不是这种类型的初学者的好选择。

以上将减少您的信号噪音。

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

然后,您可以创建二阶导数来获取最小值和最大加速度本身。

9

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

这里的问题是,如何确定n,你能告诉我们更多关于你的应用程序吗?

(还有其他的,更复杂的过滤器。他们对他们是如何保持输入数据有所不同。一个很好的列表是Wikipedia

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

+0

纠正。谢谢! – moogs 2008-10-15 09:58:14

+0

您能否解释为什么要使用10Hz的100个值?谢谢。 – 2008-10-15 10:16:53

+0

@Guido - 根据我对他所说的话的解释,他每秒钟有1000个值,但实际上只需要每秒获得10次数据。所以,一个简单的方法就是将100个值作为一个值(得到平均值)。 – moogs 2008-10-15 10:28:44

0

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

3

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

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

卡尔曼滤波可以是非常有效的,但它在计算上更重 - 难以击败短的卷积速度!

保罗
CenterSpace软件