-
Notifications
You must be signed in to change notification settings - Fork 40
/
utf_smooth1.m
163 lines (151 loc) · 3.84 KB
/
utf_smooth1.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
%UTF_SMOOTH1 Smoother based on two unscented Kalman filters
%
% Syntax:
% [M,P] = UTF_SMOOTH1(M,P,Y,[ia,Q,aparam,h,R,hparam,,alpha,beta,kappa,mat,same_p_a,same_p_h])
%
% In:
% M - NxK matrix of K mean estimates from Kalman filter
% P - NxNxK matrix of K state covariances from Kalman Filter
% Y - Measurement vector
% ia - Inverse prediction as a matrix IA defining
% linear function ia(xw) = IA*xw, inline function,
% function handle or name of function in
% form ia(xw,param) (optional, default eye())
% Q - Process noise of discrete model (optional, default zero)
% aparam - Parameters of a (optional, default empty)
% h - Measurement model function as a matrix H defining
% linear function h(x) = H*x, inline function,
% function handle or name of function in
% form h(x,param)
% R - Measurement noise covariance.
% hparam - Parameters of h (optional, default aparam)
% alpha - Transformation parameter (optional)
% beta - Transformation parameter (optional)
% kappa - Transformation parameter (optional)
% mat - If 1 uses matrix form (optional, default 0)
% same_p_a - If 1 uses the same parameters
% on every time step for a (optional, default 1)
% same_p_h - If 1 uses the same parameters
% on every time step for h (optional, default 1)
%
% Out:
% M - Smoothed state mean sequence
% P - Smoothed state covariance sequence
%
% Description:
% Two filter nonlinear smoother algorithm. Calculate "smoothed"
% sequence from given extended Kalman filter output sequence
% by conditioning all steps to all measurements.
%
% Example:
% [...]
%
% See also:
% UKF_PREDICT1, UKF_UPDATE1
% History:
% 02.08.2007 JH Changed the name to utf_smooth1
% 04.05.2007 JH Added the possibility to pass different parameters for a and h
% for each step.
% 2006 SS Initial version.
% Copyright (C) 2006 Simo Särkkä
% 2007 Jouni Hartikainen
%
% $Id$
%
% This software is distributed under the GNU General Public
% Licence (version 2 or later); please refer to the file
% Licence.txt, included with the software, for details.
%
function [M,P] = utf_smooth1(M,P,Y,ia,Q,aparam,h,R,...
hparam,alpha,beta,kappa,mat,same_p_a,same_p_h)
%
% Check which arguments are there
%
if nargin < 3
error('Too few arguments');
end
if nargin < 4
ia = [];
end
if nargin < 5
Q = [];
end
if nargin < 6
aparam = [];
end
if nargin < 7
h = [];
end
if nargin < 8
R = [];
end
if nargin < 9
hparam = [];
end
if nargin < 10
alpha = [];
end
if nargin < 11
beta = [];
end
if nargin < 12
kappa = [];
end
if nargin < 13
mat = [];
end
if nargin < 14
same_p_a = 1;
end
if nargin < 15
same_p_h = 1;
end
%
% Apply defaults
%
if isempty(mat)
mat = 0;
end
%
% Run the backward filter
%
BM = zeros(size(M));
BP = zeros(size(P));
%fm = zeros(size(M,1),1);
%fP = 1e12*eye(size(M,1));
fm = M(:,end);
fP = P(:,:,end);
BM(:,end) = fm;
BP(:,:,end) = fP;
for k=(size(M,2)-1):-1:1
if isempty(hparam)
hparams = [];
elseif same_p_h
hparams = hparam;
else
hparams = hparam{k};
end
if isempty(aparam)
aparams = [];
elseif same_p_a
aparams = aparam;
else
aparams = aparam{k};
end
[fm,fP] = ukf_update1(fm,fP,Y(:,k+1),h,R,...
hparams,alpha,beta,kappa,mat);
%
% Backward prediction
%
[fm,fP] = ukf_predict2(fm,fP,ia,Q,aparams);
BM(:,k) = fm;
BP(:,:,k) = fP;
end
%
% Combine estimates
%
for k=1:size(M,2)-1
tmp = inv(inv(P(:,:,k)) + inv(BP(:,:,k)));
M(:,k) = tmp * (P(:,:,k)\M(:,k) + BP(:,:,k)\BM(:,k));
P(:,:,k) = tmp;
end