C语言实现卡尔曼滤波怎样设定噪声?

最近刚开始接触,不知道对不对。仿真时,看到比较多的程序是生成随机数,然后根据数据求出方差。实际应用时是需要先测得系统的系统噪声和观测噪声,然后把求得噪声的协方差用在卡尔曼滤波器中。推荐阅读张明友《近代信号处理理论与方法》。更新2015.4.1协方差经过一定次数的累加以后会收敛,这跟卡尔曼滤波器的目标是一致的。卡尔曼滤波最终是要求解均方误差的最小值,并且根据均方误差最小时求解卡尔曼增益。N=500;Kalman.S1(1)=0;Kalman.P(1)=1;%均方误差Kalman.B(1)=1;%卡尔曼滤波增益Kalman.C=0.2;%测量传递函数Kalman.A=1;%状态方程Kalman.S(1)=25;%参量Kalman.w=randn(1,N); %系统噪声% Kalman.w=wgn(1,N,1);Kalman.n=2*randn(1,N); %观察噪声for k=2:N Kalman.S(k)=Kalman.A*Kalman.S(k-1)+Kalman.w(k-1); %%仿真生成真值endfor k=1:N Kalman.Est(k)=Kalman.C*Kalman.S(k)+Kalman.n(k); %%仿真生成测量值 endgw=std(Kalman.w)^2; %%求得系统噪声方差gn=std(Kalman.n)^2; %%求得测量噪声方差for k=2:N %%卡尔曼滤波 P1(k)=Kalman.P(k-1)*Kalman.A^2+gw; Kalman.B(k)=Kalman.C*P1(k)*(P1(k)*Kalman.C^2+gn)^-1; Kalman.S1(k)=Kalman.A*Kalman.S1(k-1)+Kalman.B(k)*(Kalman.Est(k-1)-Kalman.C*Kalman.A*Kalman.S1(k-1)); Kalman.P(k)=P1(k)-Kalman.C*Kalman.B(k)*P1(k);endplot(Kalman.S1,\u0026#39;r\u0026#39;);hold onplot(Kalman.S,\u0026#39;g\u0026#39;);plot(Kalman.Est,\u0026#39;k\u0026#39;);legend(\u0026#39;filter\u0026#39;,\u0026#39;real\u0026#39;,\u0026#39;estimate\u0026#39;);
■网友
你是是指Q和R吗 看你相信谁 相信系统把R搞大点 反之把Q搞大点
■网友
当然不能设成常数。如果是常数的话,直接补偿掉就好了。其实从另一方面讲,可以把常数当作均值不为零、但方差为零的噪声,如此随机与确定便没有了严格界限,而卡尔曼滤波所得是有偏估计~


    推荐阅读