使用卡尔曼滤波器平滑数据

信息处理 卡尔曼滤波器 平滑
2022-02-05 14:25:39

我想问一下使用卡尔曼滤波器平滑数据的问题。由于量化,我的数据不平滑。如何使用卡尔曼滤波器平滑这些数据。供您参考,数据不是恒定的并且有一些梯度。

2个回答

使用与this answer to another question相同的状态转换信息,但使用:

y(t) = round(H*x_truth(:,t) + rand(1,1,"normal")*sqrt(R));

作为信号模型的输出方程,我们可以应用相同的卡尔曼滤波器。

这不是很准确,因为该round函数是一种类似于量化的非线性。但是,量化也可以建模为加性噪声,因此我们将继续。

结果如下图所示。

这里,

  • 黑线是真实位置,
  • 红色+符号是量化的、有噪声的位置测量,以及
  • 绿线是卡尔曼滤波器对位置的估计。

这是你感兴趣的那种“平滑”吗?

在此处输入图像描述

真实位置与卡尔曼滤波器估计之间的误差为:

在此处输入图像描述


包括完整的 scilab 脚本供参考。

// Signal Model
DeltaT = 0.1;
F = [1 DeltaT; 0 1];
G = [DeltaT^2/2; DeltaT];
H = [1 0];

x0 = [0;0];
sigma_a = 0.1;

Q = sigma_a^2;
R = 0.1;

N = 1000;

a = rand(1,N,"normal")*sigma_a;

x_truth(:,1) = x0;
for t=1:N,
    x_truth(:,t+1) = F*x_truth(:,t) + G*a(t);
    y(t) = round(H*x_truth(:,t) + rand(1,1,"normal")*sqrt(R));  // <== Changed line!!
end

// Kalman Filter
p0 = 100*eye(2,2);

xx(:,1) = x0;
pp = p0;
pp_norm(1) = norm(pp);
for t=1:N,
    [x1,p1,x,p] = kalm(y(t),xx(:,t),pp,F,G,H,Q,R);
    xx(:,t+1) = x1;
    pp = p1;
    pp_norm(t+1) = norm(pp);
end

// Plots
figure(1);
clf;
plot(x_truth(1,:),'ko');
plot(y,'r+');  
plot(xx(1,:),'g.');

figure(2);
clf;
plot(x_truth(1,:) - xx(1,:));

卡尔曼增益是测量和当前状态估计的相对确定性的函数,并且可以“调整”以实现特定性能。

A. 如果我们可以将增益参数调高,滤波器将强调(跟随)传感器测量,并将跟随传感器测量。

-这种设置不允许您平滑数据

B. 如果我们可以将增益参数调低,滤波器将更加强调(跟随)系统/信号模型预测的值,并消除数据中的噪声。

-这种类型的调整会以数据对波动的响应为代价来平滑数据

在极端情况下,增益为 1 会导致滤波器完全忽略状态估计,而增益为零会导致测量被忽略。