Sage-Husa自适应卡尔曼滤波
Sage-Husa 自适应滤波是在利用观测数据递推滤波时,实时估计和修正系统噪声和观测噪声的统计特性,从而降低系统模型误差,提高滤波精度。
首先列出系统方程如下:
x k = A x k − 1 + B u k + C w k x_{k}=Ax_{k-1}+ B u_{k}+ C w_{k} xk=Axk−1+Buk+Cwk
y k = H x k + v k y_{k}=H x_{k}+v_{k} yk=Hxk+vk
其中, x k , y k , u k x_{k},y_{k},u_{k} xk,yk,uk 分别表示状态量,输出量,输入量。 w k , v k w_{k},v_{k} wk,vk 为噪声
E [ w k ] = q k E\left[ w_{k} \right]=q_{k} E[wk]=qk
E [ w k w j T ] = Q k δ k j E\left[ w_{k} w _{j}^{T}\right]=Q_{k}\delta_ {kj} E[wkwjT]=Qkδkj
E [ v k ] = r k E\left[ v_{k} \right]=r_{k} E[vk]=rk
E [ v k v j T ] = R k δ k j E\left[ v_{k} v _{j}^{T}\right]=R_{k}\delta_ {kj} E[vkvjT]=Rkδkj
E [ w k v j T ] = 0 E\left[ w_{k} v _{j}^{T}\right]=0 E[wkvjT]=0
Q k , R k , q k , r k Q_{k},R_{k},q_{k},r_{k} Qk,Rk,qk,rk 将在后续进行更新,这也是区别于卡尔曼滤波的最主要的地方。
那么,Sage-Husa滤波器的公式如下。
1)计算一步预测方程
x ^ k , k − 1 = A x ^ k − 1 + B u k − 1 + C q ^ k − 1 \hat{x}_{k,k-1}=A \hat{x}_{k-1}+ B u_{k-1}+ C \hat{q}_{k-1} x^k,k−1=Ax^k−1+Buk−1+Cq^k−1
这里的 x ^ k , k − 1 , q ^ k − 1 \hat{x}_{k,k-1},\hat{q}_{k-1} x^k,k−1,q^k−1 的上标表示为估计值。卡尔曼滤波器的对应公式为,即 q q q为0。
x ^ k , k − 1 = A x ^ k − 1 + B u k − 1 \hat{x}_{k,k-1}=A \hat{x}_{k-1}+ B u_{k-1} x^k,k−1=Ax^k−1+Buk−1
2)一步预测均方误差方程
P k , k − 1 = A P k − 1 A T + C Q ^ k − 1 C T P_{k,k-1}=A P_{k-1} A^{T}+ C \hat{Q}_{k-1} C^{T} Pk,k−1=APk−1AT+CQ^k−1CT
卡尔曼滤波器的对应公式为,也就是 Q Q Q 为常数
P k , k − 1 = A P k − 1 A T + C Q C T P_{k,k-1}=A P_{k-1} A^{T}+ CQ C^{T} Pk,k−1=APk−1AT+CQCT
3)更新滤波增益方程
K k = P k , k − 1 H T [ H P k , k − 1 H T + R ^ k − 1 ] − 1 K_{k}=P_{k,k-1} H^{T}\left[ H P_{k,k-1} H^{T} +\hat{R}_{k-1}\right]^{-1} Kk=Pk,k−1HT[HPk,k−1HT+R^k−1]−1
卡尔曼滤波器的对应公式为,也就是 R R R 常数
K k = P k , k − 1 H T [ H P k , k − 1 H T + R ] − 1 K_{k}=P_{k,k-1} H^{T}\left[ H P_{k,k-1} H^{T} +R\right]^{-1} Kk=Pk,k−1HT[HPk,k−1HT+R]−1
4)计算残差
ε k = y k − H x ^ k , k − 1 − r ^ k − 1 \varepsilon_{k}=y_{k}-H\hat{x}_{k,k-1}-\hat{r}_{k-1} εk=yk−Hx^k,k−1−r^k−1
卡尔曼滤波器的对应公式为,也就是 r r r 为0
ε k = y k − H x ^ k , k − 1 \varepsilon_{k}=y_{k}-H\hat{x}_{k,k-1} εk=yk−Hx^k,k−1
5)k时刻的状态估计
x ^ k = x ^ k , k − 1 + K k ε k \hat{x}_{k}=\hat{x}_{k,k-1}+K_{k}\varepsilon_{k} x^k=x^k,k−1+Kkεk
卡尔曼滤波器的对应公式是一样的。
6)k时刻的均方误差方程
P k = [ I − K k H ] P k , k − 1 P_{k}=\left[ I-K_{k} H \right]P_{k,k-1} Pk=[I−KkH]Pk,k−1
卡尔曼滤波器的对应公式是一样的。
接下来开始更新 q ^ k , Q ^ k , r ^ k , R ^ k \hat{q}_{k},\hat{Q}_{k},\hat{r}_{k},\hat{R}_{k} q^k,Q^k,r^k,R^k,以下部分卡尔曼滤波器是没有的。
7)计算加权系数
d k = 1 − b 1 − b k + 1 , 0 < b < 1 d_{k}=\frac{1-b}{1-b^{k+1}},0<b<1 dk=1−bk+11−b,0<b<1
从中以及下面的公式可知,随着时间的推移, 1 − d k 1-d_{k} 1−dk 趋近于 b b b。
还有一种加权系数形式为 d k = 1 k d_{k}=\frac{1}{k} dk=k1
从中以及下面的公式可知,随着时间的推移, 1 − d k 1-d_{k} 1−dk 趋近于1。如果令 d k = 0 d_{k} =0 dk=0 ,则还原为普通卡尔曼滤波器了,也就是说采用这种形式的 d k d_{k} dk,随着时间的推移,还原为普通卡尔曼滤波器了。
8)更新 q ^ k , Q ^ k , r ^ k , R ^ k \hat{q}_{k},\hat{Q}_{k},\hat{r}_{k},\hat{R}_{k} q^k,Q^k,r^k,R^k
q ^ k = ( 1 − d k − 1 ) q ^ k − 1 + d k − 1 ( x ^ k − A x ^ k − 1 ) \hat{q}_{k}=\left( 1-d_{k-1}\right)\hat{q}_{k-1}+d_{k-1} \left( \hat{x}_{k} -A \hat{x}_{k-1}\right) q^k=(1−dk−1)q^k−1+dk−1(x^k−Ax^k−1)
Q ^ k = ( 1 − d k − 1 ) Q ^ k − 1 + d k − 1 ( K k ε k ε k T K k T + P k − A P k − 1 A T ) \hat{Q}_{k}=\left( 1-d_{k-1} \right)\hat{Q}_{k-1}+d_{k-1}\left( K_{k}\varepsilon_{k} \varepsilon_{k} ^{T}K_{k}^{T}+P_k-AP_{k-1}A^{T}\right) Q^k=(1−dk−1)Q^k−1+dk−1(KkεkεkTKkT+Pk−APk−1AT)
r ^ k = ( 1 − d k − 1 ) r ^ k − 1 + d k − 1 ( y k − H x ^ k , k − 1 ) \hat{r}_{k}=\left( 1-d_{k-1} \right)\hat{r}_{k-1}+d_{k-1} \left( y_{k}- H\hat{x}_{k,k-1} \right) r^k=(1−dk−1)r^k−1+dk−1(yk−Hx^k,k−1)
R ^ k = ( 1 − d k − 1 ) R ^ k − 1 + d k − 1 ( ε k ε k T − H P k , k − 1 H T ) \hat{R}_{k}=\left( 1-d_{k-1} \right)\hat{R}_{k-1}+d_{k-1}\left( \varepsilon_{k} \varepsilon_{k} ^{T}-HP_{k,k-1}H^{T} \right) R^k=(1−dk−1)R^k−1+dk−1(εkεkT−HPk,k−1HT)
如果系统维数较高,而 Sage-Husa自适应滤波算法中增加对系统噪声统计特性的计算,计算量将增加,实时性将难以保证。此外,对于阶次较高的系统,算法中R和Q的在线估计有时会由于计算发散失去半正定性和正定性而出现滤波发散现象,此时滤波算法的稳定性和收敛性不能完全保证。
代码如下,供大家参考。
clc
clear
a=randn(1,5000)*sqrt(0.1);
y=zeros(1,5000);
y(1)=a(1);
y(2)=a(2)-0.575*a(1);
for k=3:5000
y(k)=0.0673*y(k-1)+0.1553*y(k-2)+a(k)-0.575*a(k-1);
end
y = y+sqrt(0.05)*randn(1,length(y));
figure(1)
subplot(2,1,1)
plot(a),title('a');
subplot(2,1,2)
plot(y),title('y');
b=0;
% inlitial Kalman Filter
F = [0.0673 0.1553; 1 0];
G = [1 -0.575 ; 0 0];
H = [1 0];
s=1*eye(2);
Q0=diag([0.1,0.1]);
R0 = 0.5;
P0=eye(2)*10000;
X0=[0;0];
[X,e,P]=Sage_HusaKF(F,G,H,Q0,R0,X0,y,P0,b,s);
% [X,e,P]=StdKF2(F,G,H,Q0,R0,X0,y,P0);
% plot kalman
figure(2)
t=1:length(X);
subplot(2,1,1)
plot(t,X(1,:));%yk
subplot(2,1,2)
plot(t,X(2,:));%yk-1
figure(3)
plot(t,y);
hold on
plot(t,y,'r',t,X(1,:),'b');
hold off
%%
function [X,e,P]=Sage_HusaKF(F,G,H,Q0,R0,X0,Z,P0,b,s);
% X 是指得到的k状态下的最优的估算值
% e 残差epsilon(k)
% P 是指更新的k状态下X对应的协方差
% F 系统参数,对于多模型系统,它们为矩阵
% G 系统参数,对于多模型系统,它们为矩阵
% H 表示协方差的转换系数
% Q0 表示系统过程的协方差初值
% R0 表示某种不确定性(传感器噪声)的协方差初值
% X0 是最优的估算值初值
% Z 表示k 时刻状态下的观测值。
% P0 是X对应的协方差初值
% b sage-Husa更新时用到,未用到默认
% s 2*2的单位矩阵,初值
% Sage-Husa adeptive KF
N=length(Z);
M=length(X0);
X=zeros(M,N);
X(:,1)=X0;
s=1*eye(2);
P=P0;
q0 = zeros(M,1);
r0 = 0;
q = q0;
r = r0;
Q = Q0;
R = R0;
for k=2:N
X_est=F*X(:,k-1)+q; %计算一步预测估计:X(k/k-1)
P_pre=F*P*F'+G*Q*G'; %一步预测估计的均方误差P(k/k-1)
e(:,k)=Z(:,k)-H*X_est-r; %计算残差epsilon(k)
K=P_pre*H'*inv((H*P_pre*H')+R); %k时刻的增益阵
X(:,k)=X_est+K*e(:,k); %k时刻的状态估计X(k)
P = (eye(M)-K*H)*P_pre;%*(eye(M)-K*H)'+K*R*K'; %均方误差矩阵P(k)
% % sage-Husa更新Q,R,q,r
% d = (1-b)/(1-b^(k));
% r = (1-d)*r +d*(Z(:,k)-H*X_est);
% q = (1-d)*q +d*(X(:,k)-F*X(:,k-1));
% R = (1-d)*R +d*(Z(:,k)*Z(:,k)'-H*P*H');
% Q = (1-d)*Q +d*(K*e(:,k)*e(:,k)'*K'+P-F*P*F');
%
r = 1/k*((k-1)*r +Z(:,k)-H*X_est);
q = 1/k*((k-1)*q+X(:,k)-F*X(:,k-1));
R = 1/k*((k-1)*R+Z(:,k)*Z(:,k)'-H*P*H');
Q = 1/k*((k-1)*Q+K*e(:,k)*e(:,k)'*K'+P-F*P*F');
%
end
end
基于极大似然准则的自适应滤波
基于极大似然准则的自适应滤波,通过系统状态方差阵和量测噪声方差阵 实时估计系统噪声统计特性的变化,以保证滤波器更好地适应这种变化。极大似然估计从系统观测值出现概率最大的角度估计,其特点是不仅考虑新息的变化,而且考虑新息协方差矩阵的变化。
R
^
k
=
C
v
k
−
H
P
k
,
k
−
1
H
T
\hat{R}_k={C}_{vk}-HP_{k,k-1}H^T
R^k=Cvk−HPk,k−1HT
Q
^
k
=
1
N
∑
i
=
k
−
N
+
1
k
Δ
x
i
Δ
x
i
T
+
P
k
−
A
T
P
k
−
1
A
\hat{Q}_k=\frac{1}{N}\sum_{i=k-N+1}^k{\Delta x_i\Delta x_{i}^{T}}+P_k-A^TP_{k-1}A
Q^k=N1∑i=k−N+1kΔxiΔxiT+Pk−ATPk−1A
Δ
x
k
=
x
^
k
−
x
^
k
,
k
−
1
=
K
k
v
k
\Delta x_k=\hat{x}_k-\hat{x}_{k,k-1}=K_kv_k
Δxk=x^k−x^k,k−1=Kkvk
C
v
k
=
1
N
∑
i
=
k
−
N
+
1
k
v
i
v
i
T
C_{vk}=\frac{1}{N}\sum_{i=k-N+1}^k{v_iv_{i}^{T}}
Cvk=N1∑i=k−N+1kviviT
式中
v
k
=
y
k
−
y
^
k
,
k
−
1
v_k=y_k-\hat{y}_{k,k-1}
vk=yk−y^k,k−1,
N
N
N 为平滑窗口宽度。