我有一个应用程序不断接收速度值(m / s)。这些值会产生一些噪音和变化。这种速度一直在变化,但有一些值得注意的真正变化。例如,当速度值显着下降时,可能会出现转弯。
现在我正在使用最后X值的average
,其中X通常是5-15之间的数字。我在excel中绘制这些值以查看与原始数据的差异。这很有效,但历史值为lower
,less
平滑我的曲线。 higher
历史记录值,smoother
我的曲线得到,但它也会对后期更改做出反应并忽略其中的一些。
我还尝试对平均值计算中的最后一个值进行加权。结果是曲线仍然有很多噪音,但只比原始数据少一点。
我正在寻找的是一种更复杂的滤除噪声的方法,它可以使我的值接近原始数据,但也忽略了小的变化和噪声。
对于我现有的设置,我可以使用哪种方法或有什么方法?
答案 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。
但这对你没什么帮助。卡尔曼滤波器并不神奇,它会不产生比移动平均线更好的结果,除非你给它提供更多信息(这将使上述公式更复杂)。您可以使用以下信息:
这些可以使卡尔曼滤波器比简单移动平均线更好的东西。
答案 2 :(得分:0)
平均值是一种非常简单的低通滤波器。 也许您可以尝试其他人,例如Chebysheb或Butterworth:
但之前要过滤噪音,您必须知道信号的截止频率。然后,根据切断频率和滤波器延迟,您可以为您的目的提供更好的滤波器。
如果您有干净的信号要比较,您还可以使用Wiener文件管理器: http://en.wikipedia.org/wiki/Wiener_filter