1. 程式人生 > >基於matlab模擬對卡爾曼濾波的理解

基於matlab模擬對卡爾曼濾波的理解

clear
clc;
N = 200;           
t = 1:N;
w = randn(1,N);          %噪聲w
x(1) = 0;
for i = 2:N
x(i) = x(i-1)+w(i-1);    
end
subplot(311);
plot(t,x);             %輸出帶噪聲函式
xlabel('原始資料');
v = randn(1,N);        %噪聲v
c = 0.2;               %同樣一個干擾係數
y = c*x+v;             %輸出帶噪聲函式

q1 = std(v);          
q2 = std(w);
p(1) = 2;           %協方差初始化
Q = q2.^2;          %預測(過程)噪聲方差
R = q1.^2;          %測量(觀測)噪聲方差

c = 0.2             %一個干擾係數
for k = 2:N       
x(k) = x(k-1);                     %上一次的最優解賦值,用於計算當前最優解 
p(k) = p(k-1)+Q;                   %估算預測協方差偏差
Kg(k) = c*p(k)/(c^2*p(k)+R);       %計算誤差增益
x(k) = x(k)+Kg(k)*(y(k)-c*x(k));   %修正 當前最優值為下次計算
p(k) = (1-c*Kg(k))*p(k);           %修正 協方差為下次計算
end
subplot(312);
plot(t,x);
xlabel('卡爾曼濾波結果');



Filter_Width = 10;                 %對x滑動濾波處理
Smooth_Result = zeros(1,N);
for i = Filter_Width+1:N
Temp_Sum = 0;
for j = i-Filter_Width:(i-1)
Temp_Sum = x(j)+Temp_Sum;
end
Smooth_Result(i) = Temp_Sum/Filter_Width;
end


subplot(313);
plot(t,y);
plot(t,y,'-g',t,x,'-k',t,Smooth_Result,'-m');
legend('measure','estimate','smooth_result');
xlabel('Kalman Filter Simulation');