完整的实验报告下载连接

一、实验原理

    卡尔曼滤波和维纳滤波都是最小均方误差为准则的线性估计器。卡尔曼滤波和维纳滤波的不同点在于:(1)解决最佳滤波的方法不同,维纳滤波是用频域及传递函数的方法,卡尔曼是用时域及状态变量的方法;(2)维纳滤波要求过程的自相关系数和互相关函数的简单知识,而卡尔曼滤波则要求时域中状态变量及信号产生过程的详细知识;(3)维纳滤波要求平稳,而卡尔曼滤波则不要求。

1.1维纳滤波器原理

维纳滤波的原理是根据全部过去的和当前的观测数据xn,xn-1,… 来估计信号的当前值。以均方误差最小条件下求解系统的传递函数H(z) 或单位脉冲响应h(n) 。维纳滤波的信号模型是从信号与噪声的相关函数得到。

维纳滤波器的一般结构如下:

使用python进行维纳滤波 图像去模糊 维纳滤波函数_matlab

有一期望响应d(n) ,滤波器系数的设计准则是使得滤波器的输出y(n) 是均方意义上对期望响应的最优线性关系。

线性系统输出为:

yn=sn=mhmx(n-m)

均方误差为:Ee2n=Esn-m=0∞hmx(n-m)2

维纳滤波器的设计,实际上就是在最小均方误差的条件下,即∂E[e2n]hj=0 ,确定滤波器的冲激响应h(n) 或系统函数H(z) ,可等效于求解维纳-霍夫方程。

1.2卡尔曼滤波器原理

卡尔曼滤波的原理是不需要全部过去的观察数据,只根据前一个估计值和最近一个观察数据来估计信号的当前值。它是用状态空间法描述系统,即由状态方程和量测方程组成。解是以估计值的形式给出的,其算法是递推。卡尔曼滤波的信号模型(一维)如下:

使用python进行维纳滤波 图像去模糊 维纳滤波函数_卡尔曼滤波_02

离散系统的n维状态方程:x(k)=Akxk-1+wk-1

离散系统的m维测量方差:yk=ckxk+vk

Ak 表示状态变量之间的增益矩阵,ck 为状态变量与输出信号之间的增益矩阵,不随时间发生变化,动态噪声wk 与观测噪声vk 都是零均值的正态噪声,且两者互不相关,Rk=var[vk] =E[vkvkT] 为量测噪声协方差矩阵,Qk=var[wk] =E[wkwkT] 为动态噪声协方差矩阵。

系统初始条件为Ex0=μ0

varx0 =E[( x-μ0)(x-μ0)T ]=p0

cov[x0 ,wk]=Ex0wkT=0

cov[x0 ,vk]=Ex0vkT=0

卡尔曼滤波的基本思想是先不考虑激励噪声wk 和观测噪声vk ,得到的状态估计值xk 和观测数据的估计值yk ,再用观测数据的估计误差yk=yk-yk 去修正状态的估计值xk ,通过选择修正矩阵H使得状态估计误差的均方值Pk 最小。

卡尔曼滤波的递推公式如下:

xk=Akxk-1+Hk(yk-CkAkxk-1)

Hk=Pk'CkT(CkPk'CkT+Rk)-1

Pk'=AkPk-1AkT+Qk-1

Pk=(I-HkCk)Pk'

假设初始条件Ak,Ck,Qk,Rk,yk ,xk-1,Pk-1 已知,其中x0=Ex0 , P0=var[x0] ,则卡尔曼滤波的递推流程如下

使用python进行维纳滤波 图像去模糊 维纳滤波函数_matlab_03

二、实验内容

随机信号 服从 过程,它是一个宽带过程,参数如下:

使用python进行维纳滤波 图像去模糊 维纳滤波函数_卡尔曼滤波算法_04

(1)通过观测方程是方差为1的高斯白噪声,要求分别利用Wiener滤波器和Kalman滤波器通过测量信号估计的波形。

(2)将 的方差改为4,按(1)中要求,重新估计 的波形。

自行选择Wiener滤波器的阶数,自行选择实验扩展内容,写出实验报告,并进行相关分析。

三、实验过程

3.1维纳滤波器

利用维纳滤波测量信号时,建立模型如下:

使用python进行维纳滤波 图像去模糊 维纳滤波函数_维纳滤波_05

       1)将随机信号X(n)看成是由典型白噪声序列源W(n)激励一个线性系统产生,用一个差分方程表示xn-1.352xn-1+1.338xn-2-0.662xn-3+0.24xn-4=w(n) 。进行Z变换得到Hz=X(z)W(z)=11-1.352z-1+1.338z-2-0.662z-3+0.24z-4 ,均值为1的高斯白噪声序列W(n)可以用randn函数产生,再利用函数X=filter(B,A,W)产生随机信号X(n)。

2)观测方程是Y(n)=X(n)+V(n),V(n)是方差为1的高斯白噪声,产生进入维纳滤波器的信号。

维纳滤波仿真流程如下:

使用python进行维纳滤波 图像去模糊 维纳滤波函数_卡尔曼滤波_06

3.2卡尔曼滤波器

卡尔曼滤波实际由两个过程组成:预测与校正。在预测阶段,滤波器使用上一状态的估计,做出对当前状态的预测。在校正阶段,滤波器利用对当前状态的观测值修正在预测阶段获得的预测值,以获得一个更接进真实值的新估计值。采用最陡下降算法,搜索方向为梯度负方向,每一步更新都使梯度函数值最小。

卡尔曼滤波仿真流程如下:

使用python进行维纳滤波 图像去模糊 维纳滤波函数_维纳滤波_07

四、实验结果

4.1 维纳滤波器实验结果

(1)维纳滤波器的阶数取101阶,观测点数取100,噪声方差为1时,通过仿真得到真实轨迹,观测样本及估计轨迹的比较图像,和通过仿真得到的平均误差如图4.1所示。

使用python进行维纳滤波 图像去模糊 维纳滤波函数_matlab_08

使用python进行维纳滤波 图像去模糊 维纳滤波函数_方差_09

        (a)真实轨迹、观测样本及估计轨迹的比较                                                            (b)平均误差

                                                                  图4.1 维纳滤波(噪声方差取1)

从图4.1(a)可以看出,利用维纳滤波器通过测量信号估计真实信号的波形,得到的估计轨迹接近于真实轨迹。当噪声方差为1时,估计轨迹与真实轨迹间的误差很小。

从图4.1(b)可以看出,利用维纳滤波器通过测量信号估计真实信号的波形,当噪声方差为1时,得到的估计轨迹与真实轨迹的平均误差较小,而且刚开始的时候平均误差相对较大,随着时间的推移,平均误差有逐渐减小的趋势。

(2)维纳滤波器的阶数取101阶,观测点数取100,噪声方差为4时,通过仿真得到真实轨迹,观测样本及估计轨迹的比较图像,和通过仿真得到的平均误差如图4.2所示。

使用python进行维纳滤波 图像去模糊 维纳滤波函数_方差_10

使用python进行维纳滤波 图像去模糊 维纳滤波函数_卡尔曼滤波算法_11

               (a)真实轨迹、观测样本及估计轨迹的比较                                                          (b)平均误差

                                                                               图4.2 维纳滤波(噪声方差取4)

从图4.2(a)可以看出,当噪声方差为4时,估计轨迹与真实轨迹间的误差变大了。

从图4.2(b)可以看出,当噪声方差为4时,估计轨迹与真实轨迹间的平均误差变大了。而且刚开始的时候平均误差相对较大,随着时间的推移,平均误差有逐渐见效的趋势。

4.2 卡尔曼滤波器实验结果

(1)卡尔曼滤波器的阶数取101阶,观测点数取100,噪声方差为1时,通过仿真得到真实轨迹,观测样本及估计轨迹的比较图像,和通过仿真得到的平均误差如图4.1所示。

 

使用python进行维纳滤波 图像去模糊 维纳滤波函数_方差_12

 

使用python进行维纳滤波 图像去模糊 维纳滤波函数_matlab_13

                   (a)真实轨迹、观测样本及估计轨迹的比较                                                (b)平均误差

                                                                    图4.3 卡尔曼滤波(噪声方差取1)

从图4.3(a)可以看出,利用卡尔曼滤波器通过测量信号估计真实信号的波形,得到的估计轨迹接近于真实轨迹。当噪声方差为1时,估计轨迹与真实轨迹间的误差很小。

从图4.3(b)可以看出,利用卡尔曼滤波器通过测量信号估计真实信号的波形,当噪声方差为1时,得到的估计轨迹与真实轨迹的平均误差较小,而且刚开始的时候平均误差相对较大,随着时间的推移,平均误差有逐渐减小的趋势。

(2)卡尔曼滤波器的阶数取101阶,观测点数取100,噪声方差为4时,通过仿真得到真实轨迹,观测样本及估计轨迹的比较图像,和通过仿真得到的平均误差如图4.4所示。

 

使用python进行维纳滤波 图像去模糊 维纳滤波函数_卡尔曼滤波_14

 

使用python进行维纳滤波 图像去模糊 维纳滤波函数_方差_15

                    (a)真实轨迹、观测样本及估计轨迹的比较                                                             (b)平均误差

                                                                               图4.4 卡尔曼滤波(噪声方差取4)

从图4.4(a)可以看出,当噪声方差为4时,估计轨迹与真实轨迹间的误差变大了。

从图4.4(b)可以看出,当噪声方差为4时,估计轨迹与真实轨迹间的平均误差变大了。而且刚开始的时候平均误差相对较大,随着时间的推移,平均误差有逐渐见效的趋势。

五、总结与展望

通过此次实验,学会运用MATLAB工具实现构建维纳滤波器和卡尔曼滤波器,并对AR模型进行实验。从实验中,我了解到维纳滤波器是以LMS算法为核心的,而卡尔曼滤波器是从RLS算法演变而来的。从这两点则可以衍生出很多解题思路。最后通过MATLAB演示了信号在加入噪声后,通过维纳滤波器和卡尔曼滤波器进行估计,比较估计值和真实值,发现差别非常的小。希望后面若有遇到维纳滤波和卡尔曼滤波问时,能够回忆起课堂上和实验中学到的知识,充分的利用起来。

六、附录

6.1 维纳滤波器程序

(1)噪声方差为1时:

clc;

clear all;

maxlag=100;

N=100;%观测点数取100

x=zeros(N,1);

y=zeros(N,1);

%%列出状态方程%%

x(1)=randn(1,1);

x(2)=randn(1,1)+1.352*x(1);

x(3)=randn(1,1)+1.352*x(2)-1.338*x(1);

x(4)=randn(1,1)+1.352*x(3)-1.338*x(2)+0.602*x(1);

for n=5:N

    x(n)=1.352*x(n-1)-1.338*x(n-2)+0.602*x(n-3)-0.24*x(n-4)+randn(1,1);%x为真实值

end

v=randn(N,1);

y=x+v;%z_x为观测样本值=真值+噪声

%%滤波%%

x=x';

y=y';

xk_s(1)=y(1);%赋初值

xk_s(2)=y(2);

xk_s(3)=y(3);

xk_s(4)=y(4);

xk=[y(1);y(2);y(3);y(4)];

%%维纳滤波器的生成

[rx,lags]=xcorr(y,maxlag,'biased');%观测信号的自相关函数

rx1=toeplitz(rx(101:end));%对称化自相关函数矩阵使之成为方阵,滤波器的阶数为101阶

rx2=xcorr(x,y,maxlag,'biased');%观测信号与期望信号的互相关函数

rx2=rx2(101:end);

h=inv(rx1)*rx2';%维纳霍夫方程

xk_s=filter(h,1,y);%加噪信号通过滤波器后的输出

e_x=0;

eq_x=0;

e_x1=N:1;

%计算滤波的均值,计算滤波误差的均值

for i=1:N

    e_x(i)=x(i)-xk_s(i);%误差=真实值-滤波估计值

end

%%作图%%

t=1:N;

figure(1);

plot(t,x,'r-',t,y,'g:',t,xk_s,'b-.');

legend('真是轨迹','观测样本','估计轨迹');

figure(2);

plot(e_x);

legend('平均误差');

(2)噪声方差为4时:

clc;

clear all;

maxlag=100;

N=100;%观测点数取100

x=zeros(N,1);

y=zeros(N,1);

%%列出状态方程%%

x(1)=randn(1,1);

x(2)=randn(1,1)+1.352*x(1);

x(3)=randn(1,1)+1.352*x(2)-1.338*x(1);

x(4)=randn(1,1)+1.352*x(3)-1.338*x(2)+0.602*x(1);

for n=5:N

    x(n)=1.352*x(n-1)-1.338*x(n-2)+0.602*x(n-3)-0.24*x(n-4)+randn(1,1);%x为真实值

end

v=4*randn(N,1);

y=x+v;%z_x为观测样本值=真值+噪声

%%滤波%%

x=x';

y=y';

xk_s(1)=y(1);%赋初值

xk_s(2)=y(2);

xk_s(3)=y(3);

xk_s(4)=y(4);

xk=[y(1);y(2);y(3);y(4)];

%%维纳滤波器的生成

[rx,lags]=xcorr(y,maxlag,'biased');%观测信号的自相关函数

rx1=toeplitz(rx(101:end));%对称化自相关函数矩阵使之成为方阵,滤波器的阶数为101阶

rx2=xcorr(x,y,maxlag,'biased');%观测信号与期望信号的互相关函数

rx2=rx2(101:end);

h=inv(rx1)*rx2';%维纳霍夫方程

xk_s=filter(h,1,y);%加噪信号通过滤波器后的输出

e_x=0;

eq_x=0;

e_x1=N:1;

%计算滤波的均值,计算滤波误差的均值

for i=1:N

    e_x(i)=x(i)-xk_s(i);%误差=真实值-滤波估计值

end

%%作图%%

t=1:N;

figure(1);

plot(t,x,'r-',t,y,'g:',t,xk_s,'b-.');

legend('真是轨迹','观测样本','估计轨迹');

figure(2);

plot(e_x);

legend('平均误差');

6.2 卡尔曼滤波器程序

(1)噪声方差为1时:

N=100;

x=zeros(N,1);

y=zeros(N,1);

var=1;

I=[1,0,0,0;0,1,0,0;0,0,1,0;0,0,0,1];

x(1)=randn(1,1);

x(2)=randn(1,1)+1.352*x(1);

x(3)=randn(1,1)+1.352*x(2)-1.338*x(1);

x(4)=randn(1,1)+1.352*x(3)-1.338*x(2)+0.602*x(1);

for n=5:N

    x(n)=1.352*x(n-1)-1.338*x(n-2)+0.602*x(n-3)-0.24*x(n-4)+randn(1,1);

end

v=randn(N,1);

y=x+v;

xk_s(1)=y(1);

xk_s(2)=y(2);

xk_s(3)=y(3);

xk_s(4)=y(4);

Ak=[1.352,-1.338,0.662,0.240;1,0,0,0;0,1,0,0;0,0,1,0];

Ck=[1,0,0,0];

Rk=[1];

Pk=[1 0 0 0

    0 1 0 0

    0 0 1 0

    0 0 0 1];

xk=[y(1);y(2);y(3);y(4)];

Qk=[1];

for r=5:N

    yk=y(r);

    Pk1=Ak*Pk*Ak'+Qk;

    Hk=Pk1*Ck'*inv(Ck*Pk1*Ck'+Rk);

    xk=Ak*xk+Hk*(yk-Ck*Ak*xk);

    Pk=(I-Hk*Ck)*Pk1;

    xk_s(r)=xk(1,1);

end

e_x=0;

for i=1:N

    e_x(i)=x(i)-xk_s(i);

end

t=1:N;

figure(1);

plot(t,x,'r-',t,y,'g:',t,xk_s,'b-');

legend('真实轨迹','观测样本','估计轨迹');

figure(2);

plot(e_x);

legend('平均误差');

(2)噪声方差为4时:

N=100;

x=zeros(N,1);

y=zeros(N,1);

var=2;

I=[1,0,0,0;0,1,0,0;0,0,1,0;0,0,0,1];

x(1)=randn(1,1);

x(2)=randn(1,1)+1.352*x(1);

x(3)=randn(1,1)+1.352*x(2)-1.338*x(1);

x(4)=randn(1,1)+1.352*x(3)-1.338*x(2)+0.602*x(1);

for n=5:N

    x(n)=1.352*x(n-1)-1.338*x(n-2)+0.602*x(n-3)-0.24*x(n-4)+randn(1,1);

end

v=4*randn(N,1);

y=x+v;

xk_s(1)=y(1);

xk_s(2)=y(2);

xk_s(3)=y(3);

xk_s(4)=y(4);

Ak=[1.352,-1.338,0.662,0.240;1,0,0,0;0,1,0,0;0,0,1,0];

Ck=[1,0,0,0];

Rk=[1];

Pk=[1 0 0 0

    0 1 0 0

    0 0 1 0

    0 0 0 1];

xk=[y(1);y(2);y(3);y(4)];

Qk=[1];

for r=5:N

    yk=y(r);

    Pk1=Ak*Pk*Ak'+Qk;

    Hk=Pk1*Ck'*inv(Ck*Pk1*Ck'+Rk);

    xk=Ak*xk+Hk*(yk-Ck*Ak*xk);

    Pk=(I-Hk*Ck)*Pk1;

    xk_s(r)=xk(1,1);

end

e_x=0;

for i=1:N

    e_x(i)=x(i)-xk_s(i);

end

t=1:N;

figure(1);

plot(t,x,'r-',t,y,'g:',t,xk_s,'b-');

legend('真实轨迹','观测样本','估计轨迹');

figure(2);

plot(e_x);

legend('平均误差');