Kalman滤波器的基本原理及仿真Word格式.docx
《Kalman滤波器的基本原理及仿真Word格式.docx》由会员分享,可在线阅读,更多相关《Kalman滤波器的基本原理及仿真Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
(2)用递推法计算,不需要知道全部过去的值。
用状态方程描述状态变量的动态变化规律,因此,信号可以是平稳的,也可以是非平稳的;
(3)误差准则仍为均方误差最小准则。
四、有关Kalman滤波器的探索
设我们要研究的对象是一个房间的温度。
根据经验判断,这个房间的温度是恒定的,也就是下一分钟的温度等于现在这一分钟的温度(假设我们用一分钟来做时间单位)。
假设你对你的经验不是100%的相信,可能会有上下偏差几度。
我们把这些偏差看成是高斯白噪声(WhiteGaussianNoise),也就是这些偏差跟前后时间是没有关系的而且符合高斯分配(GaussianDistribution)。
另外,我们在房间里放一个温度计,但是这个温度计也不准确的,测量值会比实际值偏差。
我们也把这些偏差看成是高斯白噪声。
在对于某一分钟我们有两个有关于该房间的温度值:
你根据经验的预测值(系统的预测值)和温度计的值(测量值)。
下面我们要用这两个值结合他们各自的噪声来估算出房间的实际温度值。
现在要估算k时刻的是实际温度值。
首先你要根据k-1时刻的温度值,来预测k时刻的温度。
因为你相信温度是恒定的,所以你会得到k时刻的温度预测值是跟k-1时刻一样的,假设是23度,同时该值的高斯噪声的偏差是5度(5是这样得到的:
如果k-1时刻估算出的最优温度值的偏差是3,你对自己预测的不确定度是4度,他们平方相加再开方,就是5)。
然后,你从温度计那里得到了k时刻的温度值,假设是25度,同时该值的偏差是4度。
由于我们用于估算k时刻的实际温度有两个温度值,分别是23度和25度。
究竟实际温度是多少呢?
相信自己还是相信温度计呢?
究竟相信谁多一点,我们可以用他们的covariance来判断。
因为Kg^2=5^2/(5^2+4^2),所以Kg=0.78,我们可以估算出k时刻的实际温度值是:
23+0.78*(25-23)=24.56度。
可以看出,因为温度计的covariance比较小(比较相信温度计),所以估算出的最优温度值偏向温度计的值。
我们已经得到k时刻的最优温度值了,下一步就是要进入k+1时刻,进行新的最优估算。
到现在为止,好像还没看到什么自回归的东西出现。
对了,在进入k+1时刻之前,我们还要算出k时刻那个最优值(24.56度)的偏差。
算法如下:
((1-Kg)*5^2)^0.5=2.35。
这里的5就是上面的k时刻你预测的那个23度温度值的偏差,得出的2.35就是进入k+1时刻以后k时刻估算出的最优温度值的偏差(对应于上面的3)。
就是这样,卡尔曼滤波器就不断的把covariance递归,从而估算出最优的温度值。
他运行的很快,而且它只保留了上一时刻的covariance。
上面的Kg,就是卡尔曼增益(KalmanGain)。
他可以随不同的时刻而改变他自己的值
五、Kalman滤波器的的基本理论
5.1、标量(一阶递归模型)卡尔曼滤波器
信号模型和测量模型
为使卡尔曼滤波过程的物理意义明确,采用下列符号:
(1)用
代替
,表示用n时刻及以前所有数据对
所作的最佳线性估计。
(2)用
代替
,表示用n-1时刻及以前所有数据对
图一
对于图一所示的系统,他的迭代形式如下:
这是Kalman滤波器的标准形式。
5.1.1、物理意义
一步预测:
是利用n-1时刻及以前的数据对
的预测。
第二步预测:
是对
的最佳估计。
新息(Innovation):
是对
的预测误差,代表
中所含的无法预测的信息。
选择适当的系数
对新息进行加权,作为对预测值
的修正值,修正后得到对信号的最佳估计为:
信号n时刻的最佳估计为n时刻的一步预测
与新息
的加权
和。
不同时间的最佳加权系数
是不同的,相应的均方误差最小,即
现在来求取最佳修正加权系数:
滤波误差及功率:
令
需使误差
和
新息正交。
设信号的一步预测误差为:
则:
得到卡尔曼增益:
上式表明:
最佳加权系数
,因预测越不准确,利用
进行的修正就越多。
一步预测误差功率:
一步预测误差方程:
图二Kalman滤波的结构框图
5.2、矢量Kalman滤波器
实际应用中常需要根据观测数据同时估计若干个信号,或者估计一个高阶自回归过程,例:
对象:
q阶AR过程:
模型方程和量测方程:
若同时估计若干个信号:
信号矢量,噪声矢量,参数矩阵如下:
5.2.1矢量卡尔曼滤波器的计算公式
滤波方程:
预测误差方程:
增益方程:
滤波误差方程:
六、卡尔曼滤波器算法流程:
七、Kalman滤波器的matlab实现算法
7.1、Kalman滤波器的设计
离散系统:
x[n+1]=Ax[n]+B(u[n]+w[n])(7.1)
y[n]=Cx[n](7.2)
其中,w[n]是在输入端加入的高斯噪声。
状态矩阵参数分别为
A=[1.1269-0.49400.1129
1.000000
01.00000];
B=[-0.3832
0.5919
0.5191];
C=[100];
我们的目标是设计Kalman滤波器,在给定输入u[n]和带噪输出测量值yv[n]=Cx[n]+v[n]的情况下估计系统的输出。
其中,v[n]是高斯白噪声。
1)离散Kalman滤波器
上述问题的稳态Kalman滤波器方程如下:
测量值修正计算
2)稳态设计
我们可以通过kalman函数设计上述稳态滤波器。
首先定义带噪声的系统模型:
x[n+1]=Ax[n]+Bu[n]+Bw[n](状态方程)
y[n]=Cx[n](测量方程)
具体的程序代码如下:
Plant=ss(A,[BB],C,0,-1,′inputname′,{′u′′w′},′outputname′,′y′);
假设Q=R=1,下面可以设计离散Kalman滤波器:
Q=1;
R=1;
[kalmf,L,P,M]=kalman(Plant,Q,R);
图三Kalman滤波器
滤波器的功能是在已知输入噪声方差的条件下尽可能消除输出信号中的噪声影响。
图四显示了滤波前后的不同输出信号。
下面用程序来比较滤波后输出信号与系统实际信号相对理想输出的误差。
a=A;
b=[BB0*B];
c=[C;
C];
d=[000;
001];
P=ss(a,b,c,d,-1,′inputname′,{′u′′w′′v′},′outputname′,{′y′′yv′});
sys=parallel(P,kalmf,1,1,[],[])%创建并联系统
%将系统输出yv正反馈到滤波器的输入端,形成闭环系统
SimModel=feedback(sys,1,4,2,1)
%从I/O列表中删除yv
SimModel=SimModel([13],[123])
%产生高斯噪声信号
t=[0:
100]′;
u=sin(t/5);
n=length(t)
randn(′seed′,0)
w=sqrt(Q)*randn(n,1);
v=sqrt(R)*randn(n,1);
%系统仿真
[out,x]=lsim(SimModel,[w,v,u]);
y=out(:
1);
%系统真实(理想)输出响应
ye=out(:
2);
%滤波后的系统输出
yv=y+v;
%系统输出的测量值
%比较结果
subplot(211),plot(t,y,′--′,t,ye,′-′),
xlabel(′No.ofsamples′),ylabel(′Output′)
title(′Kalmanfilterresponse′)
subplot(212),plot(t,y-yv,′-.′,t,y-ye,′-′),xlabel(′No.ofsamples′),ylabel(′Error′)
比较结果如图五所示。
图中上面的图形显示的是真实响应y(虚线)和滤波后的输出ye(实线),下面的图形比较测量误差(虚线)与估计误差(实线)。
该图表明,滤波器最大程度地消除了系统输出中的噪声影响。
这可以通过计算误差的协方差进行验证。
MeasErr=y-yv;
MeasErrCov=sum(MeasErr.*MeasErr)/length(MeasErr);
EstErr=y-ye;
EstErrCov=sum(EstErr.*EstErr)/length(EstErr);
滤波前误差(测量误差)的协方差为
MeasErrCov
MeasErrCov=
1.1138
而滤波后的误差(估计误差)的协方差仅为
EstErrCov
EstErrCov=
0.2722
7.2完整程序
A=[1.1269-0.49400.1129
1.000000
01.00000];
B=[-0.3832
0.5919
0.5191];
C=[100];
Plant=ss(A,[BB],C,0,-1,'
inputname'
{'
u'
'
w'
},'
outputname'
'
y'
);
Q=1;
[kalmf,L,P,M]=kalman(Plant,Q,R);
kalmf=kalmf(1,:
a=A;
b=[BB0*B];
c=[C;
C];
d=[000;
001];
P=ss(a,b,c,d,-1,'
in