从速度值中滤除噪音和变化

时间:2012-08-01 11:45:11

标签: c++ algorithm math

我有一个应用程序不断接收速度值(m / s)。这些值会产生一些噪音和变化。这种速度一直在变化,但有一些值得注意的真正变化。例如,当速度值显着下降时,可能会出现转弯。

现在我正在使用最后X值的average,其中X通常是5-15之间的数字。我在excel中绘制这些值以查看与原始数据的差异。这很有效,但历史值为lowerless平滑我的曲线。 higher历史记录值,smoother我的曲线得到,但它也会对后期更改做出反应并忽略其中的一些。

我还尝试对平均值计算中的最后一个值进行加权。结果是曲线仍然有很多噪音,但只比原始数据少一点。

我正在寻找的是一种更复杂的滤除噪声的方法,它可以使我的值接近原始数据,但也忽略了小的变化和噪声。

对于我现有的设置,我可以使用哪种方法或有什么方法?

3 个答案:

答案 0 :(得分:5)

为此目的,Kalman filter正是您所需要的。这是一个实现它的免费库:http://kalman.sourceforge.net/

另一方面,卡尔曼很难理解,需要一些研究才能正确使用它(并且实施真的很难)。根据{{​​3}},您可能会发现补充过滤器更容易实现。

答案 1 :(得分:1)

与许多人所说的相反,在这种情况下,简单的卡尔曼滤波器并不难实现。事实上,卡尔曼滤波器最简单的特殊情况是Exponential filter,它在您的C ++代码中将是:

filtered_speed+=0.02 * (speed_measurement - filtered_speed);

0.02是一个调谐常数,其最佳值取决于您的测量值的噪声程度以及您希望实际速度变化的速度。这也相当于一个简单的IIR filter

但这对你没什么帮助。卡尔曼滤波器并不神奇,它会产生比移动平均线更好的结果,除非你给它提供更多信息(这将使上述公式更复杂)。您可以使用以下信息:

  • 多个传感器:您能否从其他来源推断速度?然后,您可以使用卡尔曼滤波器
  • 组合两个测量值
  • 变化的传感器噪声:速度测量噪声通常是相同的,还是变化的(f.ex.测量结果是高速时的噪声,如低速时)。如果它正在改变,并且您可以估计每次测量的噪声,那么您可以在卡尔曼滤波器中使用该信息
  • 改变过程噪音:您是否从其他来源了解此时速度应该快速变化还是缓慢变化?该信息也可以使用
  • 控制输入:例如如果您正在测量汽车的速度,并且您还有加速踏板或制动器的数据,那么卡尔曼滤波器也可以使用它

这些可以使卡尔曼滤波器比简单移动平均线更好的东西。

答案 2 :(得分:0)

平均值是一种非常简单的低通滤波器。 也许您可以尝试其他人,例如ChebyshebButterworth

但之前要过滤噪音,您必须知道信号的截止频率。然后,根据切断频率和滤波器延迟,您可以为您的目的提供更好的滤波器。

如果您有干净的信号要比较,您还可以使用Wiener文件管理器: http://en.wikipedia.org/wiki/Wiener_filter