1+ classdef ExtendedKF < handle
2+ properties
3+
4+ Xhistory
5+ Plast
6+ Xtrue
7+ statetransitionfcn
8+ measurementfcn
9+ statej
10+ measurementj
11+ statecovariance
12+ measurementcovariance
13+ T
14+ xk
15+ k
16+ vk % plant noise
17+ wk % measurement noise
18+ state_dim
19+ measurement_dim
20+ hasadditivenoise
21+ end
22+
23+ methods
24+
25+ % constructor of class
26+ function self = ExtendedKF(statetransition_f , measurement_f ,...
27+ state_j , measurement_j , state_covariance ,...
28+ measurement_covariance , sampling_time , initial_x )
29+ if nargin == 8
30+ self.statetransitionfcn = statetransition_f ;
31+ self.measurementfcn = measurement_f ;
32+ self.statej = state_j ;
33+ self.measurementj = measurement_j ;
34+ self.statecovariance = state_covariance ;
35+ self.measurementcovariance = measurement_covariance ;
36+ self.T = sampling_time ;
37+
38+ self.state_dim = size(self .statecovariance(: , 1 ));
39+ self.measurement_dim = size(self .measurementcovariance(: , 1 ));
40+ self .Xtrue(: , 1 ) = initial_x ;
41+ self.Xhistory = zeros(self .state_dim );
42+ self.k = 1 ;
43+ self.hasadditivenoise = true ;
44+ self.Plast = eye(self .state_dim(1 ));
45+ end
46+
47+ end
48+
49+
50+ function [Xpred , Ppred ] = predict(self )
51+ % create plant noise
52+ self.vk = sqrt(self .statecovariance )*randn(self .state_dim(1 ), 1 );
53+ % create noisy plant state: REFERENCE VALUE
54+ xtrue_last = self .Xtrue(: , end );
55+ self.xk = self .statetransitionfcn(xtrue_last , self .T ) + self .vk ;
56+
57+ xhat_last = self .Xhistory(: , end );
58+ F = self .statej(xhat_last , self .T );
59+ Xpred = self .statetransitionfcn(xhat_last , self .T );
60+ Ppred = F *(self .Plast )*F ' + self .statecovariance ;
61+
62+ % save the new values:
63+ self .k = self .k +1;
64+ self .Plast = Ppred ;
65+ self .Xhistory(:, self .k ) = Xpred ;
66+ self .Xtrue(:, self .k ) = self .xk ;
67+
68+
69+ end
70+
71+ function [Xcorr , Pcorr ] = correct(self )
72+ % create measurement noise
73+ self.wk = sqrt(self .measurementcovariance )*randn(self .measurement_dim(1 ), 1 );
74+ % create true measurement
75+ yk = self .measurementfcn(self .xk , self .T ) + self .wk ;
76+
77+ % correcting measurement
78+ Xpred = self .Xhistory(: , self .k );
79+ H = self .measurementj(Xpred , self .T );
80+ Ypred = self .measurementfcn(Xpred );
81+ Sk = H * self .Plast * H ' + self .measurementcovariance ;
82+ Kk = self .Plast * H ' *inv(Sk );
83+
84+
85+
86+ % correct the readings
87+ Xcorr = Xpred + Kk *(yk - Ypred );
88+ Pcorr = self .Plast - Kk * H * self .Plast ;
89+
90+
91+ % overwrite to existing values:
92+ self.Plast = Pcorr ;
93+ self .Xhistory(: , self .k ) = Xcorr ;
94+
95+ end
96+
97+ end
98+ end
0 commit comments