4

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

现在我正在使用average最后一个 X 值,其中 X 通常是 5-15 之间的数字。我在 excel 中绘制这些值以查看与原始数据的差异。这工作得很好,但lower历史价值是,less我的曲线变得平滑。历史higher值,smoother我的曲线得到,但它也会对后期变化做出反应并忽略其中一些。

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

我正在寻找的是一种更复杂的方法来过滤掉噪音,它可以给我提供接近原始数据的值,但也忽略了小的变化和噪音。

那可能是什么方法,或者我可以对现有设置做些什么?

4

3 回答 3

5

为此,卡尔曼滤波器正是您所需要的。这是一个实现它的免费库:http: //kalman.sourceforge.net/

另一方面,卡尔曼很难理解,需要进行一些研究才能正确使用它(而且实施起来非常困难)。根据这个答案,您可能会发现互补过滤器更容易实现。

于 2012-08-01T11:52:03.977 回答
1

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

filtered_speed+=0.02 * (speed_measurement - filtered_speed);

0.02 是一个调谐常数,其最佳值取决于您的测量噪声有多大以及您期望实际速度变化的速度有多快。这也相当于一个简单的IIR 滤波器

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

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

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

于 2013-11-30T14:52:11.600 回答
0

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

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

如果您有一个干净的信号可以比较,您也可以使用 Wiener 过滤器: http ://en.wikipedia.org/wiki/Wiener_filter

于 2012-08-01T11:54:44.870 回答