1+ % function [xhat_optimal,P_optimal] = KalmanFilter(y_k, Q_k, R_k, xhat_last, P_last, vk, wk, T)
2+ % %Predicts the state xk and covariance matrix pk given k-1 information
3+ %
4+ % %compute jacobian of system:
5+ % F_k = F_jacobian(T, vk, xhat_last);
6+ %
7+ % %compute predicted mean and covariance
8+ % [xhat_predict, P_k_predict] = state_predict(xhat_last,F_k, P_last, Q_k, vk, wk, T);
9+ %
10+ % %compute jacobian of sensor:
11+ % H_k = H_jacobian(xhat_predict);
12+ %
13+ % %predict the measured value
14+ % [yhat_predict,K_k] = measurement_predict(xhat_predict, H_k, P_k_predict, R_k);
15+ %
16+ % %Estimate:
17+ % xhat_optimal = xhat_predict + K_k*(y_k-yhat_predict);
18+ % P_optimal = P_k_predict-K_k*H_k*P_k_predict;
19+ %
20+ %
21+ % end
22+
23+
24+ classdef ExtendedKF < handle
25+ properties
26+
27+ Xhistory
28+ Plast
29+ Xtrue
30+ statetransitionfcn
31+ measurementfcn
32+ statej
33+ measurementj
34+ statecovariance
35+ measurementcovariance
36+ T
37+ xk
38+ k
39+ vk % plant noise
40+ wk % measurement noise
41+ state_dim
42+ measurement_dim
43+ hasadditivenoise
44+ end
45+
46+ methods
47+
48+ % constructor of class
49+ function self = ExtendedKF(statetransition_f , measurement_f ,...
50+ state_j , measurement_j , state_covariance ,...
51+ measurement_covariance , sampling_time , initial_x )
52+ if nargin == 8
53+ self.statetransitionfcn = statetransition_f ;
54+ self.measurementfcn = measurement_f ;
55+ self.statej = state_j ;
56+ self.measurementj = measurement_j ;
57+ self.statecovariance = state_covariance ;
58+ self.measurementcovariance = measurement_covariance ;
59+ self.T = sampling_time ;
60+
61+ self.state_dim = size(intial_x );
62+ self .Xtrue(: , 1 ) = initial_x ;
63+ self.Xhistory = zeros(state_dim );
64+ self.k = 1 ;
65+ self.hasadditivenoise = true ;
66+ self.Xtrue = zeros(state_dim );
67+ end
68+
69+ end
70+
71+
72+ function [Xpred , Ppred ] = predict(self )
73+ % create plant noise
74+ self.vk = sqrt(self .statecovariance )*randn(self .state_dim , 1 );
75+ % create noisy plant state: REFERENCE VALUE
76+ xtrue_last = self .Xtrue(: , end );
77+ self.xk = self .statetransitionfcn(xtrue_last , self .T ) + self .vk ;
78+
79+ xhat_last = self .Xhistory(: , end );
80+ F = self .statej(self .T , self .vk , xhat_last );
81+ Xpred = self .statetransitionfcn(xhat_last , self .T );
82+ Ppred = F *self .Plast *F ' + self .statecovariance ;
83+
84+ % save the new values:
85+ self .k = self .k +1;
86+ self .Plast = Ppred ;
87+ self .Xhistory(:, self .k ) = Xpred ;
88+ self .Xtrue(:, self .k ) = self .xk ;
89+
90+
91+ end
92+
93+ function [Xcorr , Pcorr ] = correct(self )
94+ % create measurement noise
95+ self.wk = sqrt(self .measurementcovariance )*randn(self .state_dim , 1 );
96+ % create true measurement
97+ yk = self .measurementfcn(self .xk ) + self .wk ;
98+
99+ % correcting measurement
100+ Xpred = self .Xhistory(: , self .k );
101+ H = self .measurementj(Xpred );
102+ Ypred = self .measurementfcn(Xpred );
103+ Sk = H * self .Plast * H ' + self .measurementcovariance ;
104+ Kk = self .Plast * H ' *inv(Sk );
105+
106+
107+
108+ % correct the readings
109+ Xcorr = Xpred + Kk *(yk - Ypred );
110+ Pcorr = self .Plast - Kk * H * self .Plast ;
111+
112+
113+ % overwrite to existing values:
114+ self.Plast = Pcorr ;
115+ self .Xhistory(: , self .k ) = Xcorr ;
116+
117+ end
118+
119+ end
120+ end
0 commit comments