xiong57785 发表于 2015-3-10 20:08:16

卡尔曼滤波的matlab实现

看了三天的卡尔曼滤波 写了个小的滤波程序
%%%   观测值 噪声 定义比如超生波 噪声主要是观测噪声
N=800;
real=linspace(4,5,N);

z=real; % 观测值

w=0.5*randn(1,N); %观测噪声
z=z+w; % 加上观测噪声后的观测值
R=(std(w))^2; % 观测噪声的协方差

v=0.01*randn(1,N);% 定义过程噪声
Q=(std(v))^2;   %由过程噪声求出协方差
%%%变量初始化
p(1)=1;
x(1)=0;
%%%卡尔曼滤波程序   其中A=1 U=0 H=1
for t=2:N;
    x_(t)=x(t-1);
    p_(t)=p(t-1)+Q;

    k(t)=p_(t)/(p_(t)+R);
    x(t)=x_(t)+k(t)*(z(t)-x_(t));
    p(t)=(1-k(t))*p_(t);
end

t=1:N;
plot(t,z,'b',t,x,'r',t,real,'k'),legend('观测值','滤波后','实际值');


xiong57785 发表于 2015-3-10 20:13:13

另外总结的参数变化对滤波的影响 大家看看对不对
当状态转换过程为已确定时, Q 的取值越小越好。当 Q 取值逐渐增大时, 滤波收敛变慢, 且状态变量的扰动变大
R 取值过小或者过大都会造成滤波效果变差
R 取值越大收敛越慢(即动态相应变慢),但是滤波越平滑。

R越大 表示测量噪声越大   越不信任测量值,就是Kg越小当R为无穷时Kg=0完全变为了X(k)=X(k-1)
Q越大 表示过程噪音越大   越不信任过程值,反过来就是相信测量值结果Kg越大   当Q无穷大时Kg=1。

lans0625 发表于 2015-3-10 20:35:26

谢谢楼主分享。我已理解卡尔曼基本原理,还没机会实践。。。。。

s15200380596 发表于 2015-3-10 21:15:48

谢谢楼主分享

bailao99 发表于 2015-3-11 09:22:34

xiong57785 发表于 2015-3-10 20:13
另外总结的参数变化对滤波的影响 大家看看对不对
当状态转换过程为已确定时, Q 的取值越小越好。当 Q 取值 ...

采用楼主的程序,对一组数据处理如下。数据来源于二极管测温数据,那一组滤波结果更好呢?
R=25,Q=0.0001

R=9,Q=0.01

Black_xiang 发表于 2015-3-11 09:42:53

mark一下

bailao99 发表于 2015-3-11 10:09:55

本帖最后由 bailao99 于 2015-3-11 10:49 编辑

重新定义观测噪声与过程噪声

观测噪声是原始数据N点平均值与原始数据之差
过程噪声是观测噪声的0.01
测试发现:随着N增大,Q和Q同步增大,波形平滑程度变化不大,数据如下:
N        3        5        10        50        100        256
R        1.8        2.2        2.4        2.7        2.7        2.8
LZ怎么看待处理结果?

jorry 发表于 2016-11-30 18:34:49

mark!!!谢楼主分享

qiangxiaochen 发表于 2017-7-29 22:44:15

楼主厉害,正找这方面知识呢,谢谢!
页: [1]
查看完整版本: 卡尔曼滤波的matlab实现