1 function [ARF,RCF,PE,DC,varargout] = mvar(Y, Pmax, Mode);
2 % MVAR estimates parameters of the Multi-Variate AutoRegressive model
4 % Y(t) = Y(t-1) * A1 + ... + Y(t-p) * Ap + X(t);
6 % Y(t) is a row vecter with M elements Y(t) = y(t,1:M)
8 % Several estimation algorithms are implemented, all estimators
9 % can handle data with missing values encoded as NaNs.
11 % [AR,RC,PE] = mvar(Y, p);
12 % [AR,RC,PE] = mvar(Y, p, Mode);
18 % Y Multivariate data series
20 % Mode determines estimation algorithm
23 % AR multivariate autoregressive model parameter
24 % RC reflection coefficients (= -PARCOR coefficients)
25 % PE remaining error variances for increasing model order
26 % PE(:,p*M+[1:M]) is the residual variance for model order p
28 % All input and output parameters are organized in columns, one column
29 % corresponds to the parameters of one channel.
31 % Mode determines estimation algorithm.
32 % 1: Correlation Function Estimation method using biased correlation function estimation method
33 % also called the 'multichannel Yule-Walker' [1,2]
34 % 6: Correlation Function Estimation method using unbiased correlation function estimation method
36 % 2: Partial Correlation Estimation: Vieira-Morf [2] using unbiased covariance estimates.
37 % In [1] this mode was used and (incorrectly) denominated as Nutall-Strand.
38 % Its the DEFAULT mode; according to [1] it provides the most accurate estimates.
39 % 5: Partial Correlation Estimation: Vieira-Morf [2] using biased covariance estimates.
40 % Yields similar results than Mode=2;
42 % 3: buggy: Partial Correlation Estimation: Nutall-Strand [2] (biased correlation function)
43 % 9: Partial Correlation Estimation: Nutall-Strand [2] (biased correlation function)
44 % 7: Partial Correlation Estimation: Nutall-Strand [2] (unbiased correlation function)
45 % 8: Least Squares w/o nans in Y(t):Y(t-p)
48 % 13: modified BURGV -
49 % 14: modified BURGV [4]
50 % 15: Least Squares based on correlation matrix
51 % 22: Modified Partial Correlation Estimation: Vieira-Morf [2,5] using unbiased covariance estimates.
52 % 25: Modified Partial Correlation Estimation: Vieira-Morf [2,5] using biased covariance estimates.
54 % 90,91,96: Experimental versions
58 % 200+Mode: forward, past missing values are assumed zero
59 % 300+Mode: backward, past missing values are assumed zero
60 % 400+Mode: forward+backward, past missing values are assumed zero
61 % 1200+Mode: forward, past missing values are replaced with predicted value
62 % 1300+Mode: backward, 'past' missing values are replaced with predicted value
63 % 1400+Mode: forward+backward, 'past' missing values are replaced with predicted value
64 % 2200+Mode: forward, past missing values are replaced with predicted value + noise to prevent decaying
65 % 2300+Mode: backward, past missing values are replaced with predicted value + noise to prevent decaying
66 % 2400+Mode: forward+backward, past missing values are replaced with predicted value + noise to prevent decaying
72 % [1] A. Schloegl, Comparison of Multivariate Autoregressive Estimators.
73 % Signal processing, Elsevier B.V. (in press).
74 % available at http://dx.doi.org/doi:10.1016/j.sigpro.2005.11.007
75 % [2] S.L. Marple 'Digital Spectral Analysis with Applications' Prentice Hall, 1987.
76 % [3] Schneider and Neumaier)
77 % [4] Stijn de Waele, 2003
78 % [5] M. Morf, et al. Recursive Multichannel Maximum Entropy Spectral Estimation,
79 % IEEE trans. GeoSci. Elec., 1978, Vol.GE-16, No.2, pp85-94.
82 % A multivariate inverse filter can be realized with
83 % [AR,RC,PE] = mvar(Y,P);
84 % e = mvfilter([eye(size(AR,1)),-AR],eye(size(AR,1)),Y);
86 % see also: MVFILTER, MVFREQZ, COVM, SUMSKIPNAN, ARFIT2
88 % $Id: mvar.m 9609 2012-02-10 10:18:00Z schloegl $
89 % Copyright (C) 1996-2006,2011,2012 by Alois Schloegl <alois.schloegl@ist.ac.at>
90 % This is part of the TSA-toolbox. See also
91 % http://pub.ist.ac.at/~schloegl/matlab/tsa/
92 % http://octave.sourceforge.net/
93 % http://biosig.sourceforge.net/
95 % This program is free software: you can redistribute it and/or modify
96 % it under the terms of the GNU General Public License as published by
97 % the Free Software Foundation, either version 3 of the License, or
98 % (at your option) any later version.
100 % This program is distributed in the hope that it will be useful,
101 % but WITHOUT ANY WARRANTY; without even the implied warranty of
102 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
103 % GNU General Public License for more details.
105 % You should have received a copy of the GNU General Public License
106 % along with this program. If not, see <http://www.gnu.org/licenses/>.
117 Pmax = min(max(N ,M ),Pmax);
121 % according to [1], and other internal validations this is in many cases the best algorithm
125 [C(:,1:M),n] = covm(Y,'M');
126 PE(:,1:M) = C(:,1:M)./n;
128 elseif Mode==0; % this method is broken
129 fprintf('Warning MVAR: Mode=0 is broken.\n')
130 C(:,1:M) = C(:,1:M)/N;
133 PEF = C(:,1:M); %?% PEF = PE(:,1:M);
136 [D,n] = covm(Y(K+1:N,:),Y(1:N-K,:),'M');
138 ARF(:,K*M+(1-M:0)) = D/PEB;
139 ARB(:,K*M+(1-M:0)) = D'/PEF;
141 tmp = F(K+1:N,:) - B(1:N-K,:)*ARF(:,K*M+(1-M:0))';
142 B(1:N-K,:) = B(1:N-K,:) - F(K+1:N,:)*ARB(:,K*M+(1-M:0))';
146 tmp = ARF(:,L*M+(1-M:0)) - ARF(:,K*M+(1-M:0))*ARB(:,(K-L)*M+(1-M:0));
147 ARB(:,(K-L)*M+(1-M:0)) = ARB(:,(K-L)*M+(1-M:0)) - ARB(:,K*M+(1-M:0))*ARF(:,L*M+(1-M:0));
148 ARF(:,L*M+(1-M:0)) = tmp;
151 RCF(:,K*M+(1-M:0)) = ARF(:,K*M+(1-M:0));
152 RCB(:,K*M+(1-M:0)) = ARB(:,K*M+(1-M:0));
154 PEF = [eye(M) - ARF(:,K*M+(1-M:0))*ARB(:,K*M+(1-M:0))]*PEF;
155 PEB = [eye(M) - ARB(:,K*M+(1-M:0))*ARF(:,K*M+(1-M:0))]*PEB;
156 PE(:,K*M+(1:M)) = PEF;
160 elseif Mode==1, %%%%% Levinson-Wiggens-Robinson (LWR) algorithm using biased correlation function
161 % ===== In [1,2] this algorithm is denoted 'Multichannel Yule-Walker' ===== %
162 C(:,1:M) = C(:,1:M)/N;
167 [C(:,K*M+(1:M)),n] = covm(Y(K+1:N,:),Y(1:N-K,:),'M');
168 C(:,K*M+(1:M)) = C(:,K*M+(1:M))/N;
172 D = D - ARF(:,L*M+(1-M:0))*C(:,(K-L)*M+(1:M));
174 ARF(:,K*M+(1-M:0)) = D / PEB;
175 ARB(:,K*M+(1-M:0)) = D'/ PEF;
177 tmp = ARF(:,L*M+(1-M:0)) - ARF(:,K*M+(1-M:0))*ARB(:,(K-L)*M+(1-M:0));
178 ARB(:,(K-L)*M+(1-M:0)) = ARB(:,(K-L)*M+(1-M:0)) - ARB(:,K*M+(1-M:0))*ARF(:,L*M+(1-M:0));
179 ARF(:,L*M+(1-M:0)) = tmp;
182 RCF(:,K*M+(1-M:0)) = ARF(:,K*M+(1-M:0));
183 RCB(:,K*M+(1-M:0)) = ARB(:,K*M+(1-M:0));
185 PEF = [eye(M) - ARF(:,K*M+(1-M:0))*ARB(:,K*M+(1-M:0))]*PEF;
186 PEB = [eye(M) - ARB(:,K*M+(1-M:0))*ARF(:,K*M+(1-M:0))]*PEB;
187 PE(:,K*M+(1:M)) = PEF;
191 elseif Mode==6, %%%%% Levinson-Wiggens-Robinson (LWR) algorithm using unbiased correlation function
192 C(:,1:M) = C(:,1:M)/N;
193 PEF = C(:,1:M); %?% PEF = PE(:,1:M);
197 [C(:,K*M+(1:M)),n] = covm(Y(K+1:N,:),Y(1:N-K,:),'M');
198 C(:,K*M+(1:M)) = C(:,K*M+(1:M))./n;
203 D = D - ARF(:,L*M+(1-M:0))*C(:,(K-L)*M+(1:M));
205 ARF(:,K*M+(1-M:0)) = D / PEB;
206 ARB(:,K*M+(1-M:0)) = D'/ PEF;
208 tmp = ARF(:,L*M+(1-M:0)) - ARF(:,K*M+(1-M:0))*ARB(:,(K-L)*M+(1-M:0));
209 ARB(:,(K-L)*M+(1-M:0)) = ARB(:,(K-L)*M+(1-M:0)) - ARB(:,K*M+(1-M:0))*ARF(:,L*M+(1-M:0));
210 ARF(:,L*M+(1-M:0)) = tmp;
213 RCF(:,K*M+(1-M:0)) = ARF(:,K*M+(1-M:0));
214 RCB(:,K*M+(1-M:0)) = ARB(:,K*M+(1-M:0));
216 PEF = [eye(M) - ARF(:,K*M+(1-M:0))*ARB(:,K*M+(1-M:0))]*PEF;
217 PEB = [eye(M) - ARB(:,K*M+(1-M:0))*ARF(:,K*M+(1-M:0))]*PEB;
218 PE(:,K*M+(1:M)) = PEF;
222 elseif Mode==2 %%%%% Partial Correlation Estimation: Vieira-Morf Method [2] with unbiased covariance estimation
223 %===== In [1] this algorithm is denoted 'Nutall-Strand with unbiased covariance' =====%
224 %C(:,1:M) = C(:,1:M)/N;
232 [D,n] = covm(F(K+1:N,:),B(1:N-K,:),'M');
235 ARF(:,K*M+(1-M:0)) = D / PEB;
236 ARB(:,K*M+(1-M:0)) = D'/ PEF;
238 tmp = F(K+1:N,:) - B(1:N-K,:)*ARF(:,K*M+(1-M:0)).';
239 B(1:N-K,:) = B(1:N-K,:) - F(K+1:N,:)*ARB(:,K*M+(1-M:0)).';
243 tmp = ARF(:,L*M+(1-M:0)) - ARF(:,K*M+(1-M:0))*ARB(:,(K-L)*M+(1-M:0));
244 ARB(:,(K-L)*M+(1-M:0)) = ARB(:,(K-L)*M+(1-M:0)) - ARB(:,K*M+(1-M:0))*ARF(:,L*M+(1-M:0));
245 ARF(:,L*M+(1-M:0)) = tmp;
248 RCF(:,K*M+(1-M:0)) = ARF(:,K*M+(1-M:0));
249 RCB(:,K*M+(1-M:0)) = ARB(:,K*M+(1-M:0));
251 [PEF,n] = covm(F(K+1:N,:),F(K+1:N,:),'M');
254 [PEB,n] = covm(B(1:N-K,:),B(1:N-K,:),'M');
257 PE(:,K*M+(1:M)) = PEF;
261 elseif Mode==5 %%%%% Partial Correlation Estimation: Vieira-Morf Method [2] with biased covariance estimation
262 %===== In [1] this algorithm is denoted 'Nutall-Strand with biased covariance' ===== %
269 [D,n] = covm(F(K+1:N,:),B(1:N-K,:),'M');
272 ARF(:,K*M+(1-M:0)) = D / PEB;
273 ARB(:,K*M+(1-M:0)) = D'/ PEF;
275 tmp = F(K+1:N,:) - B(1:N-K,:)*ARF(:,K*M+(1-M:0)).';
276 B(1:N-K,:) = B(1:N-K,:) - F(K+1:N,:)*ARB(:,K*M+(1-M:0)).';
280 tmp = ARF(:,L*M+(1-M:0)) - ARF(:,K*M+(1-M:0))*ARB(:,(K-L)*M+(1-M:0));
281 ARB(:,(K-L)*M+(1-M:0)) = ARB(:,(K-L)*M+(1-M:0)) - ARB(:,K*M+(1-M:0))*ARF(:,L*M+(1-M:0));
282 ARF(:,L*M+(1-M:0)) = tmp;
285 RCF(:,K*M+(1-M:0)) = ARF(:,K*M+(1-M:0));
286 RCB(:,K*M+(1-M:0)) = ARB(:,K*M+(1-M:0));
288 [PEB,n] = covm(B(1:N-K,:),B(1:N-K,:),'M');
291 [PEF,n] = covm(F(K+1:N,:),F(K+1:N,:),'M');
294 %PE(:,K*M+(1:M)) = PEF;
295 PE(:,K*M+(1:M)) = PEF./n;
299 elseif 0, Mode==3 %%%%% Partial Correlation Estimation: Nutall-Strand Method [2] with biased covariance estimation
300 %%% OBSOLETE because its buggy, use Mode=9 instead.
301 % C(:,1:M) = C(:,1:M)/N;
307 [D, n] = covm(F(K+1:N,:),B(1:N-K,:),'M');
310 ARF(:,K*M+(1-M:0)) = 2*D / (PEB+PEF);
311 ARB(:,K*M+(1-M:0)) = 2*D'/ (PEF+PEB);
313 tmp = F(K+1:N,:) - B(1:N-K,:)*ARF(:,K*M+(1-M:0)).';
314 B(1:N-K,:) = B(1:N-K,:) - F(K+1:N,:)*ARB(:,K*M+(1-M:0)).';
318 tmp = ARF(:,L*M+(1-M:0)) - ARF(:,K*M+(1-M:0))*ARB(:,(K-L)*M+(1-M:0));
319 ARB(:,(K-L)*M+(1-M:0)) = ARB(:,(K-L)*M+(1-M:0)) - ARB(:,K*M+(1-M:0))*ARF(:,L*M+(1-M:0));
320 ARF(:,L*M+(1-M:0)) = tmp;
324 RCF(:,K*M+(1-M:0)) = ARF(:,K*M+(1-M:0));
326 [PEF,n] = covm(F(K+1:N,:),F(K+1:N,:),'M');
329 [PEB,n] = covm(B(1:N-K,:),B(1:N-K,:),'M');
332 %PE(:,K*M+(1:M)) = PEF;
333 PE(:,K*M+(1:M)) = PEF./n;
337 elseif Mode==7 %%%%% Partial Correlation Estimation: Nutall-Strand Method [2] with unbiased covariance estimation
344 [D] = covm(F(K+1:N,:),B(1:N-K,:),'M');
347 ARF(:,K*M+(1-M:0)) = 2*D / (PEB+PEF);
348 ARB(:,K*M+(1-M:0)) = 2*D'/ (PEF+PEB);
350 tmp = F(K+1:N,:) - B(1:N-K,:)*ARF(:,K*M+(1-M:0)).';
351 B(1:N-K,:) = B(1:N-K,:) - F(K+1:N,:)*ARB(:,K*M+(1-M:0)).';
355 tmp = ARF(:,L*M+(1-M:0)) - ARF(:,K*M+(1-M:0))*ARB(:,(K-L)*M+(1-M:0));
356 ARB(:,(K-L)*M+(1-M:0)) = ARB(:,(K-L)*M+(1-M:0)) - ARB(:,K*M+(1-M:0))*ARF(:,L*M+(1-M:0));
357 ARF(:,L*M+(1-M:0)) = tmp;
361 RCF(:,K*M+(1-M:0)) = ARF(:,K*M+(1-M:0));
363 [PEF] = covm(F(K+1:N,:),F(K+1:N,:),'M');
366 [PEB] = covm(B(1:N-K,:),B(1:N-K,:),'M');
370 PE(:,K*M+(1:M)) = PEF;
374 elseif any(Mode==[3,9]) %%%%% Partial Correlation Estimation: Nutall-Strand Method [2] with biased covariance estimation
375 %% same as 3 but with fixed normalization
381 [D, n] = covm(F(K+1:N,:),B(1:N-K,:),'M');
383 ARF(:,K*M+(1-M:0)) = 2*D / (PEB+PEF);
384 ARB(:,K*M+(1-M:0)) = 2*D'/ (PEF+PEB);
386 tmp = F(K+1:N,:) - B(1:N-K,:)*ARF(:,K*M+(1-M:0)).';
387 B(1:N-K,:) = B(1:N-K,:) - F(K+1:N,:)*ARB(:,K*M+(1-M:0)).';
391 tmp = ARF(:,L*M+(1-M:0)) - ARF(:,K*M+(1-M:0))*ARB(:,(K-L)*M+(1-M:0));
392 ARB(:,(K-L)*M+(1-M:0)) = ARB(:,(K-L)*M+(1-M:0)) - ARB(:,K*M+(1-M:0))*ARF(:,L*M+(1-M:0));
393 ARF(:,L*M+(1-M:0)) = tmp;
397 RCF(:,K*M+(1-M:0)) = ARF(:,K*M+(1-M:0));
399 [PEF,nf] = covm(F(K+1:N,:),F(K+1:N,:),'M');
400 [PEB,nb] = covm(B(1:N-K,:),B(1:N-K,:),'M');
402 %PE(:,K*M+(1:M)) = PEF;
403 PE(:,K*M+(1:M)) = PEF./nf;
407 elseif Mode==4, %%%%% Kay, not fixed yet.
408 fprintf('Warning MVAR: Mode=4 is broken.\n')
410 C(:,1:M) = C(:,1:M)/N;
412 [C(:,M+(1:M)),n] = covm(Y(2:N,:),Y(1:N-1,:));
413 C(:,M+(1:M)) = C(:,M+(1:M))/N; % biased estimate
416 ARF(:,1:M) = C(:,1:M)\D;
417 ARB(:,1:M) = C(:,1:M)\D';
418 RCF(:,1:M) = ARF(:,1:M);
419 RCB(:,1:M) = ARB(:,1:M);
420 PEF = C(:,1:M)*[eye(M) - ARB(:,1:M)*ARF(:,1:M)];
421 PEB = C(:,1:M)*[eye(M) - ARF(:,1:M)*ARB(:,1:M)];
424 [C(:,K*M+(1:M)),n] = covm(Y(K+1:N,:),Y(1:N-K,:),'M');
425 C(:,K*M+(1:M)) = C(:,K*M+(1:M)) / N; % biased estimate
429 D = D - C(:,(K-L)*M+(1:M))*ARF(:,L*M+(1-M:0));
432 ARF(:,K*M+(1-M:0)) = PEB \ D;
433 ARB(:,K*M+(1-M:0)) = PEF \ D';
435 tmp = ARF(:,L*M+(1-M:0)) - ARF(:,K*M+(1-M:0))*ARB(:,(K-L)*M+(1-M:0));
436 ARB(:,(K-L)*M+(1-M:0)) = ARB(:,(K-L)*M+(1-M:0)) - ARB(:,K*M+(1-M:0))*ARF(:,L*M+(1-M:0));
437 ARF(:,L*M+(1-M:0)) = tmp;
439 RCF(:,K*M+(1-M:0)) = ARF(:,K*M+(1-M:0)) ;
440 RCB(:,K*M+(1-M:0)) = ARB(:,K*M+(1-M:0)) ;
442 PEF = PEF*[eye(M) - ARB(:,K*M+(1-M:0)) *ARF(:,K*M+(1-M:0)) ];
443 PEB = PEB*[eye(M) - ARF(:,K*M+(1-M:0)) *ARB(:,K*M+(1-M:0)) ];
444 PE(:,K*M+(1:M)) = PEF;
448 elseif Mode==8, %%%%% Least Squares
450 y = repmat(NaN,N-Pmax,M*Pmax);
452 y(:,k*M+[1-M:0]) = Y(ix-k,:);
454 ix2 = ~any(isnan([Y(ix,:),y]),2);
455 ARF = Y(ix(ix2),:)'/y(ix2,:)';
456 PE = covm(Y(ix,:) - y*ARF');
457 RCF = zeros(M,M*Pmax);
460 elseif Mode==10, %%%%% ARFIT
463 [w, ARF, PE] = arfit(Y, Pmax, Pmax, 'sbc', 'zero');
465 ARF = zeros(M,M*Pmax);
470 elseif Mode==11, %%%%% de Waele 2003
472 warning('MVAR: mode=11 is obsolete use Mode 13 or 14!');
473 [pc,R0] = burgv(reshape(Y',[M,1,N]),Pmax);
475 [ARF,ARB,Pf,Pb,RCF,RCB] = pc2parv(pc,R0);
477 [RCF,RCB,Pf,Pb] = pc2rcv(pc,R0);
478 [ARF,ARB,Pf,Pb] = pc2parv(pc,R0);
480 ARF = -reshape(ARF(:,:,2:end),[M,M*Pmax]);
481 RCF = -reshape(RCF(:,:,2:end),[M,M*Pmax]);
482 PE = reshape(Pf,[M,M*(Pmax+1)]);
487 warning('MVAR: mode=12 is obsolete use Mode 13 or 14!');
488 % this is equivalent to Mode==11
489 [pc,R0] = burgv(reshape(Y',[M,1,N]),Pmax);
490 [rcf,rcb,Pf,Pb] = pc2rcv(pc,R0);
492 %%%%% Convert reflection coefficients RC to autoregressive parameters
493 ARF = zeros(M,M*Pmax);
494 ARB = zeros(M,M*Pmax);
496 ARF(:,K*M+(1-M:0)) = -rcf(:,:,K+1);
497 ARB(:,K*M+(1-M:0)) = -rcb(:,:,K+1);
499 tmp = ARF(:,L*M+(1-M:0)) - ARF(:,K*M+(1-M:0))*ARB(:,(K-L)*M+(1-M:0));
500 ARB(:,(K-L)*M+(1-M:0)) = ARB(:,(K-L)*M+(1-M:0)) - ARB(:,K*M+(1-M:0))*ARF(:,L*M+(1-M:0));
501 ARF(:,L*M+(1-M:0)) = tmp;
504 RCF = -reshape(rcf(:,:,2:end),[M,M*Pmax]);
505 PE = reshape(Pf,[M,M*(Pmax+1)]);
509 % this is equivalent to Mode==11 but can deal with missing values
510 %%%%%%%%%%% [pc,R0] = burgv_nan(reshape(Y',[M,1,N]),Pmax,1);
511 % Copyright S. de Waele, March 2003 - modified Alois Schloegl, 2009
515 pc= zeros(sz); pc(:,:,1) =I;
516 K = zeros(sz); K(:,:,1) =I;
517 Kb= zeros(sz); Kb(:,:,1) =I;
521 %[P(:,:,1)]= covm(Y);
522 [P(:,:,1)]= PE(:,1:M); % normalized
527 %the recursive algorithm
532 %% normalized, unbiased
533 Rvv = covm(v); %Pfhat
534 Rww = covm(w); %Pbhat
535 Rvw = covm(v,w); %Pfbhat
536 Rwv = covm(w,v); % = Rvw', written out for symmetry
537 delta = lyap(Rvv*inv(P(:,:,i)),inv(Pb(:,:,i))*Rww,-2*Rvw);
539 TsqrtS = chol( P(:,:,i))'; %square root M defined by: M=Tsqrt(M)*Tsqrt(M)'
540 TsqrtSb= chol(Pb(:,:,i))';
541 pc(:,:,i+1) = inv(TsqrtS)*delta*inv(TsqrtSb)';
543 %The forward and backward reflection coefficient
544 K(:,:,i+1) = -TsqrtS *pc(:,:,i+1) *inv(TsqrtSb);
545 Kb(:,:,i+1)= -TsqrtSb*pc(:,:,i+1)'*inv(TsqrtS);
547 %filtering the reflection coefficient out:
548 f = (v'+ K(:,:,i+1)*w')';
549 b = (w'+Kb(:,:,i+1)*v')';
553 P(:,:,i+1) = (I-TsqrtS *pc(:,:,i+1) *pc(:,:,i+1)'*inv(TsqrtS ))*P(:,:,i);
554 Pb(:,:,i+1) = (I-TsqrtSb*pc(:,:,i+1)'*pc(:,:,i+1) *inv(TsqrtSb))*Pb(:,:,i);
558 %% [rcf,rcb,Pf,Pb] = pc2rcv(pc,R0);
559 rcf = zeros(sz); rcf(:,:,1) = I;
560 Pf = zeros(sz); Pf(:,:,1) = R0;
561 rcb = zeros(sz); rcb(:,:,1) = I;
562 Pb = zeros(sz); Pb(:,:,1) = R0;
565 TsqrtPf = chol( Pf(:,:,p))'; %square root M defined by: M=Tsqrt(M)*Tsqrt(M)'
566 TsqrtPb= chol(Pb(:,:,p))';
567 %reflection coefficients
568 rcf(:,:,p+1) = -TsqrtPf *pc(:,:,p+1) *inv(TsqrtPb);
569 rcb(:,:,p+1)= -TsqrtPb*pc(:,:,p+1)'*inv(TsqrtPf );
571 Pf(:,:,p+1) = (I-TsqrtPf *pc(:,:,p+1) *pc(:,:,p+1)'*inv(TsqrtPf ))*Pf(:,:,p);
572 Pb(:,:,p+1) = (I-TsqrtPb*pc(:,:,p+1)'*pc(:,:,p+1) *inv(TsqrtPb))*Pb(:,:,p);
573 end %for p = 2:order,
574 %%%%%%%%%%%%%% end %%%%%%
577 %%%%% Convert reflection coefficients RC to autoregressive parameters
578 ARF = zeros(M,M*Pmax);
579 ARB = zeros(M,M*Pmax);
581 ARF(:,K*M+(1-M:0)) = -rcf(:,:,K+1);
582 ARB(:,K*M+(1-M:0)) = -rcb(:,:,K+1);
584 tmp = ARF(:,L*M+(1-M:0)) - ARF(:,K*M+(1-M:0))*ARB(:,(K-L)*M+(1-M:0));
585 ARB(:,(K-L)*M+(1-M:0)) = ARB(:,(K-L)*M+(1-M:0)) - ARB(:,K*M+(1-M:0))*ARF(:,L*M+(1-M:0));
586 ARF(:,L*M+(1-M:0)) = tmp;
589 RCF = -reshape(rcf(:,:,2:end),[M,M*Pmax]);
590 PE = reshape(Pf,[M,M*(Pmax+1)]);
594 % this is equivalent to Mode==11 but can deal with missing values
595 %%%%%%%%%%%%%% [pc,R0] = burgv_nan(reshape(Y',[M,1,N]),Pmax,2);
596 % Copyright S. de Waele, March 2003 - modified Alois Schloegl, 2009
600 pc= zeros(sz); pc(:,:,1) =I;
601 K = zeros(sz); K(:,:,1) =I;
602 Kb= zeros(sz); Kb(:,:,1) =I;
606 %[P(:,:,1),nn]= covm(Y);
607 [P(:,:,1)]= C(:,1:M); %% no normalization
612 %the recursive algorithm
618 [Rvv,nn] = covm(v); %Pfhat
619 [Rww,nn] = covm(w); %Pbhat
620 [Rvw,nn] = covm(v,w); %Pfbhat
621 [Rwv,nn] = covm(w,v); % = Rvw', written out for symmetry
622 delta = lyap(Rvv*inv(P(:,:,i)),inv(Pb(:,:,i))*Rww,-2*Rvw);
624 TsqrtS = chol( P(:,:,i))'; %square root M defined by: M=Tsqrt(M)*Tsqrt(M)'
625 TsqrtSb= chol(Pb(:,:,i))';
626 pc(:,:,i+1) = inv(TsqrtS)*delta*inv(TsqrtSb)';
628 %The forward and backward reflection coefficient
629 K(:,:,i+1) = -TsqrtS *pc(:,:,i+1) *inv(TsqrtSb);
630 Kb(:,:,i+1)= -TsqrtSb*pc(:,:,i+1)'*inv(TsqrtS);
632 %filtering the reflection coefficient out:
633 f = (v'+ K(:,:,i+1)*w')';
634 b = (w'+Kb(:,:,i+1)*v')';
638 P(:,:,i+1) = (I-TsqrtS *pc(:,:,i+1) *pc(:,:,i+1)'*inv(TsqrtS ))*P(:,:,i);
639 Pb(:,:,i+1) = (I-TsqrtSb*pc(:,:,i+1)'*pc(:,:,i+1) *inv(TsqrtSb))*Pb(:,:,i);
643 %%%%%%%%%% [rcf,rcb,Pf,Pb] = pc2rcv(pc,R0);
645 rcf = zeros(sz); rcf(:,:,1) = I;
646 Pf = zeros(sz); Pf(:,:,1) = R0;
647 rcb = zeros(sz); rcb(:,:,1) = I;
648 Pb = zeros(sz); Pb(:,:,1) = R0;
650 TsqrtPf = chol( Pf(:,:,p))'; %square root M defined by: M=Tsqrt(M)*Tsqrt(M)'
651 TsqrtPb = chol(Pb(:,:,p))';
652 %reflection coefficients
653 rcf(:,:,p+1)= -TsqrtPf *pc(:,:,p+1) *inv(TsqrtPb);
654 rcb(:,:,p+1)= -TsqrtPb *pc(:,:,p+1)'*inv(TsqrtPf );
656 Pf(:,:,p+1) = (I-TsqrtPf *pc(:,:,p+1) *pc(:,:,p+1)'*inv(TsqrtPf))*Pf(:,:,p);
657 Pb(:,:,p+1) = (I-TsqrtPb *pc(:,:,p+1)'*pc(:,:,p+1) *inv(TsqrtPb))*Pb(:,:,p);
658 end %for p = 2:order,
659 %%%%%%%%%%%%%% end %%%%%%
661 %%%%% Convert reflection coefficients RC to autoregressive parameters
662 ARF = zeros(M,M*Pmax);
663 ARB = zeros(M,M*Pmax);
665 ARF(:,K*M+(1-M:0)) = -rcf(:,:,K+1);
666 ARB(:,K*M+(1-M:0)) = -rcb(:,:,K+1);
668 tmp = ARF(:,L*M+(1-M:0)) - ARF(:,K*M+(1-M:0))*ARB(:,(K-L)*M+(1-M:0));
669 ARB(:,(K-L)*M+(1-M:0)) = ARB(:,(K-L)*M+(1-M:0)) - ARB(:,K*M+(1-M:0))*ARF(:,L*M+(1-M:0));
670 ARF(:,L*M+(1-M:0)) = tmp;
673 RCF = -reshape(rcf(:,:,2:end),[M,M*Pmax]);
674 PE = reshape(Pf,[M,M*(Pmax+1)]);
677 elseif Mode==15, %%%%% Least Squares
680 [C(:,K*M+(1:M)),n] = covm(Y(K+1:N,:),Y(1:N-K,:),'M');
681 % C(K*M+(1:M),:) = C(K*M+(1:M),:)/N;
683 ARF = C(:,1:M)'/C(:,M+1:end)';
684 PE = covm(C(:,1:M)' - ARF * C(:,M+1:end)');
685 RCF = zeros(M, M*Pmax);
689 %%%%% ARFIT and handling missing values
690 % compute QR factorization for model of order pmax
691 [R, scale] = arqr(Y, Pmax, 0);
692 % select order of model
693 popt = Pmax; % estimated optimum order
694 np = M*Pmax; % number of parameter vectors of length m
695 % decompose R for the optimal model order popt according to
702 R12 = R(1:np, Pmax+1:Pmax+M);
703 R22 = R(M*Pmax+1:Pmax+M, Pmax+1:Pmax+M);
705 % return covariance matrix
706 dof = N-Pmax-M*Pmax; % number of block degrees of freedom
707 PE = R22'*R22./dof; % bias-corrected estimate of covariance matrix
711 [w, ARF, PE] = arfit(Y, Pmax, Pmax, 'sbc', 'zero');
713 ARF = zeros(M,M*Pmax);
718 elseif Mode==22 %%%%% Modified Partial Correlation Estimation: Vieira-Morf [2,5] using unbiased covariance estimates.
719 %--------Initialization----------
722 [PEF, n] = covm(Y(2:N,:),'M');
724 [PEB, n] = covm(Y(1:N-1,:),'M');
726 %---------------------------------
728 %---Update the estimated error covariances(15.89) in [2]---
729 [PEFhat,n] = covm(F(K+1:N,:),'M');
732 [PEBhat,n] = covm(B(1:N-K,:),'M');
735 [PEFBhat,n] = covm(F(K+1:N,:),B(1:N-K,:),'M');
736 PEFBhat = PEFBhat./n;
738 %---Compute estimated normalized partial correlation matrix(15.88)in [2]---
739 Rho = inv(chol(PEFhat)')*PEFBhat*inv(chol(PEBhat));
741 %---Update forward and backward reflection coefficients (15.82) and (15.83) in [2]---
742 ARF(:,K*M+(1-M:0)) = chol(PEF)'*Rho*inv(chol(PEB)');
743 ARB(:,K*M+(1-M:0)) = chol(PEB)'*Rho'*inv(chol(PEF)');
745 %---------------------------------
746 tmp = F(K+1:N,:) - B(1:N-K,:)*ARF(:,K*M+(1-M:0)).';
747 B(1:N-K,:) = B(1:N-K,:) - F(K+1:N,:)*ARB(:,K*M+(1-M:0)).';
751 tmp = ARF(:,L*M+(1-M:0)) - ARF(:,K*M+(1-M:0))*ARB(:,(K-L)*M+(1-M:0));
752 ARB(:,(K-L)*M+(1-M:0)) = ARB(:,(K-L)*M+(1-M:0)) - ARB(:,K*M+(1-M:0))*ARF(:,L*M+(1-M:0));
753 ARF(:,L*M+(1-M:0)) = tmp;
756 RCF(:,K*M+(1-M:0)) = ARF(:,K*M+(1-M:0));
757 RCB(:,K*M+(1-M:0)) = ARB(:,K*M+(1-M:0));
759 %---Update forward and backward error covariances (15.75) and (15.76) in [2]---
760 PEF = (eye(M)-ARF(:,K*M+(1-M:0))*ARB(:,K*M+(1-M:0)))*PEF;
761 PEB = (eye(M)-ARB(:,K*M+(1-M:0))*ARF(:,K*M+(1-M:0)))*PEB;
763 PE(:,K*M+(1:M)) = PEF;
767 elseif Mode==25 %%%%Modified Partial Correlation Estimation: Vieira-Morf [2,5] using biased covariance estimates.
768 %--------Initialization----------
771 [PEF, n] = covm(Y(2:N,:),'M');
773 [PEB, n] = covm(Y(1:N-1,:),'M');
775 %---------------------------------
777 %---Update the estimated error covariances(15.89) in [2]---
778 [PEFhat,n] = covm(F(K+1:N,:),'M');
781 [PEBhat,n] = covm(B(1:N-K,:),'M');
784 [PEFBhat,n] = covm(F(K+1:N,:),B(1:N-K,:),'M');
785 PEFBhat = PEFBhat./N;
787 %---Compute estimated normalized partial correlation matrix(15.88)in [2]---
788 Rho = inv(chol(PEFhat)')*PEFBhat*inv(chol(PEBhat));
790 %---Update forward and backward reflection coefficients (15.82) and (15.83) in [2]---
791 ARF(:,K*M+(1-M:0)) = chol(PEF)'*Rho*inv(chol(PEB)');
792 ARB(:,K*M+(1-M:0)) = chol(PEB)'*Rho'*inv(chol(PEF)');
794 %---------------------------------
795 tmp = F(K+1:N,:) - B(1:N-K,:)*ARF(:,K*M+(1-M:0)).';
796 B(1:N-K,:) = B(1:N-K,:) - F(K+1:N,:)*ARB(:,K*M+(1-M:0)).';
800 tmp = ARF(:,L*M+(1-M:0)) - ARF(:,K*M+(1-M:0))*ARB(:,(K-L)*M+(1-M:0));
801 ARB(:,(K-L)*M+(1-M:0)) = ARB(:,(K-L)*M+(1-M:0)) - ARB(:,K*M+(1-M:0))*ARF(:,L*M+(1-M:0));
802 ARF(:,L*M+(1-M:0)) = tmp;
805 RCF(:,K*M+(1-M:0)) = ARF(:,K*M+(1-M:0));
806 RCB(:,K*M+(1-M:0)) = ARB(:,K*M+(1-M:0));
808 %---Update forward and backward error covariances (15.75) and (15.76) in [2]---
809 PEF = (eye(M)-ARF(:,K*M+(1-M:0))*ARB(:,K*M+(1-M:0)))*PEF;
810 PEB = (eye(M)-ARB(:,K*M+(1-M:0))*ARF(:,K*M+(1-M:0)))*PEB;
812 PE(:,K*M+(1:M)) = PEF;
818 %%%%% EXPERIMENTAL VERSIONS %%%%%
823 C(:,1:M) = C(:,1:M)/N;
826 PEF = PE(:,1:M); %CHANGED%
827 PEB = PE(:,1:M); %CHANGED%
829 [D,n] = covm(Y(K+1:N,:),Y(1:N-K,:),'M');
831 ARF(:,K*M+(1-M:0)) = D/PEB;
832 ARB(:,K*M+(1-M:0)) = D'/PEF;
834 tmp = F(K+1:N,:) - B(1:N-K,:)*ARF(:,K*M+(1-M:0))';
835 B(1:N-K,:) = B(1:N-K,:) - F(K+1:N,:)*ARB(:,K*M+(1-M:0))';
839 tmp = ARF(:,L*M+(1-M:0)) - ARF(:,K*M+(1-M:0))*ARB(:,(K-L)*M+(1-M:0));
840 ARB(:,(K-L)*M+(1-M:0)) = ARB(:,(K-L)*M+(1-M:0)) - ARB(:,K*M+(1-M:0))*ARF(:,L*M+(1-M:0));
841 ARF(:,L*M+(1-M:0)) = tmp;
844 RCF(:,K*M+(1-M:0)) = ARF(:,K*M+(1-M:0));
845 RCB(:,K*M+(1-M:0)) = ARB(:,K*M+(1-M:0));
847 PEF = [eye(M) - ARF(:,K*M+(1-M:0))*ARB(:,K*M+(1-M:0))]*PEF;
848 PEB = [eye(M) - ARB(:,K*M+(1-M:0))*ARF(:,K*M+(1-M:0))]*PEB;
849 PE(:,K*M+(1:M)) = PEF;
853 elseif Mode==91, %%%%% Levinson-Wiggens-Robinson (LWR) algorithm using biased correlation function
854 % ===== In [1,2] this algorithm is denoted 'Multichannel Yule-Walker' ===== %
857 C(:,1:M) = C(:,1:M)/N;
858 PEF = PE(:,1:M); %CHANGED%
859 PEB = PE(:,1:M); %CHANGED%
862 [C(:,K*M+(1:M)),n] = covm(Y(K+1:N,:),Y(1:N-K,:),'M');
863 C(:,K*M+(1:M)) = C(:,K*M+(1:M))/N;
867 D = D - ARF(:,L*M+(1-M:0))*C(:,(K-L)*M+(1:M));
869 ARF(:,K*M+(1-M:0)) = D / PEB;
870 ARB(:,K*M+(1-M:0)) = D'/ PEF;
872 tmp = ARF(:,L*M+(1-M:0)) - ARF(:,K*M+(1-M:0))*ARB(:,(K-L)*M+(1-M:0));
873 ARB(:,(K-L)*M+(1-M:0)) = ARB(:,(K-L)*M+(1-M:0)) - ARB(:,K*M+(1-M:0))*ARF(:,L*M+(1-M:0));
874 ARF(:,L*M+(1-M:0)) = tmp;
877 RCF(:,K*M+(1-M:0)) = ARF(:,K*M+(1-M:0));
878 RCB(:,K*M+(1-M:0)) = ARB(:,K*M+(1-M:0));
880 PEF = [eye(M) - ARF(:,K*M+(1-M:0))*ARB(:,K*M+(1-M:0))]*PEF;
881 PEB = [eye(M) - ARB(:,K*M+(1-M:0))*ARF(:,K*M+(1-M:0))]*PEB;
882 PE(:,K*M+(1:M)) = PEF;
886 elseif Mode==96, %%%%% Levinson-Wiggens-Robinson (LWR) algorithm using unbiased correlation function
889 C(:,1:M) = C(:,1:M)/N;
890 PEF = PE(:,1:M); %CHANGED%
891 PEB = PE(:,1:M); %CHANGED%
894 [C(:,K*M+(1:M)),n] = covm(Y(K+1:N,:),Y(1:N-K,:),'M');
895 C(:,K*M+(1:M)) = C(:,K*M+(1:M))./n;
899 D = D - ARF(:,L*M+(1-M:0))*C(:,(K-L)*M+(1:M));
901 ARF(:,K*M+(1-M:0)) = D / PEB;
902 ARB(:,K*M+(1-M:0)) = D'/ PEF;
904 tmp = ARF(:,L*M+(1-M:0)) - ARF(:,K*M+(1-M:0))*ARB(:,(K-L)*M+(1-M:0));
905 ARB(:,(K-L)*M+(1-M:0)) = ARB(:,(K-L)*M+(1-M:0)) - ARB(:,K*M+(1-M:0))*ARF(:,L*M+(1-M:0));
906 ARF(:,L*M+(1-M:0)) = tmp;
909 RCF(:,K*M+(1-M:0)) = ARF(:,K*M+(1-M:0));
910 RCB(:,K*M+(1-M:0)) = ARB(:,K*M+(1-M:0));
912 PEF = [eye(M) - ARF(:,K*M+(1-M:0))*ARB(:,K*M+(1-M:0))]*PEF;
913 PEB = [eye(M) - ARB(:,K*M+(1-M:0))*ARF(:,K*M+(1-M:0))]*PEB;
914 PE(:,K*M+(1:M)) = PEF;
918 fprintf('Warning MVAR: Mode=%i not supported\n',Mode);
920 %%%%% IMPUTATION METHODS %%%%%
923 Mode0 = rem(Mode,100);
924 if ((Mode0 >= 10) && (Mode0 < 20)),
931 elseif Mode>=2400, % forward and backward
932 % assuming that past missing values are already IMPUTED with the prediction value + innovation process
935 [ARF,RCF,PE2] = mvar(Y, Pmax, Mode0);
936 c = chol( PE2 (:, M*Pmax+(1:M)));
939 Y1(1,isnan(Y1(1,:))) = 0;
942 [z1,z] = mvfilter(ARF,eye(M),Y1(k-1,:)',z);
944 z1 = z1 + (randn(1,M)*c)';
949 [ARB,RCF,PE] = mvar(Y2, Pmax, Mode0);
950 Y2(1,isnan(Y2(1,:))) = 0;
953 [z2,z] = mvfilter(ARB,eye(M),Y2(k-1,:)',z);
954 ix = isnan(Y(size(Y,1)-k+1,:));
955 z2 = z2 + (randn(1,M)*c)';
956 Y2(k,ix) = (z2(ix)' + Y2(k,ix))/2;
961 Y(isnan(Y)) = Z(isnan(Y));
963 [ARF,RCF,PE] = mvar(Y, Pmax, rem(Mode,100));
966 elseif Mode>=2300, % backward prediction
967 % assuming that past missing values are already IMPUTED with the prediction value + innovation process
971 [ARB,RCF,PE] = mvar(Y, Pmax, Mode0);
972 c = chol(PE(:,M*Pmax+(1:M)));
974 Y1(1,isnan(Y1(1,:))) = 0;
977 [z1,z] = mvfilter(ARB,eye(M),Y1(k-1,:)',z);
979 z1 = z1 + (randn(1,M)*c)';
983 [ARF,RCF,PE] = mvar(Y1, Pmax, rem(Mode,100));
986 elseif Mode>=2200, % forward predictions,
987 % assuming that past missing values are already IMPUTED with the prediction value + innovation process
989 [ARF,RCF,PE] = mvar(Y, Pmax, Mode0);
990 c = chol(PE(:,M*Pmax+(1:M)));
992 Y1(1,isnan(Y1(1,:))) = 0;
995 [z1,z] = mvfilter(ARF,eye(M),Y1(k-1,:)',z);
997 z1 = z1 + (randn(1,M)*c)';
1000 [ARF,RCF,PE] = mvar(Y1, Pmax, rem(Mode,100));
1003 elseif Mode>=1400, % forward and backward
1004 %assuming that past missing values are already IMPUTED with the prediction value
1005 [ARF,RCF,PE] = mvar(Y, Pmax, Mode0);
1007 Y1(1,isnan(Y1(1,:))) = 0;
1010 [z1,z] = mvfilter(ARF,eye(M),Y1(k-1,:)',z);
1011 ix = isnan(Y1(k,:));
1016 [ARB,RCF,PE] = mvar(Y2, Pmax, Mode0);
1017 Y2(1,isnan(Y2(1,:))) = 0;
1019 for k = 2:size(Y2,1)
1020 [z2,z] = mvfilter(ARB,eye(M),Y2(k-1,:)',z);
1021 ix = isnan(Y2(k,:));
1027 Y(isnan(Y)) = Z(isnan(Y));
1029 [ARF,RCF,PE] = mvar(Y, Pmax, rem(Mode,100));
1032 elseif Mode>=1300, % backward prediction
1034 [ARB,RCF,PE] = mvar(Y, Pmax, Mode0);
1036 Y2(1,isnan(Y2(1,:))) = 0;
1039 [z2,z] = mvfilter(ARB,eye(M),Y2(k-1,:)',z);
1040 ix = isnan(Y2(k,:));
1044 [ARF,RCF,PE] = mvar(Y2, Pmax, rem(Mode,100));
1047 elseif Mode>=1200, % forward predictions,
1048 %assuming that past missing values are already IMPUTED with the prediction value
1049 [ARF,RCF,PE] = mvar(Y, Pmax, Mode0);
1051 Y1(1,isnan(Y1(1,:))) = 0;
1054 [z1,z] = mvfilter(ARF,eye(M),Y1(k-1,:)',z);
1055 ix = isnan(Y1(k,:));
1058 [ARF,RCF,PE] = mvar(Y1, Pmax, rem(Mode,100));
1061 elseif Mode>=400, % forward and backward
1062 % assuming that 'past' missing values are ZERO
1063 [ARF,RCF,PE] = mvar(Y, Pmax, Mode0);
1066 Z1 = mvfilter([zeros(M),ARF],eye(M),Y1')';
1067 Y1(isnan(Y)) = Z1(isnan(Y));
1070 [ARB,RCF,PE] = mvar(Y, Pmax, Mode0);
1073 Z2 = mvfilter([zeros(M),ARB],eye(M),Y2')';
1074 Y2(isnan(Y)) = Z2(isnan(Y));
1077 [ARF,RCF,PE] = mvar((Y1+Y2)/2, Pmax, rem(Mode,100));
1080 elseif Mode>=300, % backward prediction
1081 % assuming that 'past' missing values are ZERO
1083 [ARB,RCF,PE] = mvar(Y, Pmax, Mode0);
1086 Z2 = mvfilter([zeros(M),ARB],eye(M),Y2')';
1087 Y2(isnan(Y)) = Z2(isnan(Y));
1090 [ARF,RCF,PE] = mvar(Y2, Pmax, rem(Mode,100));
1094 % forward predictions, assuming that past missing values are ZERO
1095 [ARF,RCF,PE] = mvar(Y, Pmax, Mode0);
1098 Z1 = mvfilter([zeros(M),ARF],eye(M),Y1')';
1099 Y1(isnan(Y)) = Z1(isnan(Y));
1101 [ARF,RCF,PE] = mvar(Y1, Pmax, rem(Mode,100));
1105 [ARF,RCF,PE] = mvar(Y, Pmax, Mode0);
1106 Z1 = mvfilter(ARF,eye(M),Y')';
1107 Z1 = [zeros(1,M); Z1(1:end-1,:)];
1108 Y(isnan(Y)) = Z1(isnan(Y));
1109 [ARF,RCF,PE] = mvar(Y, Pmax, rem(Mode,100));
1116 if any(ARF(:)==inf),
1117 % Test for matrix division bug.
1118 % This bug was observed in LNX86-ML5.3, 6.1 and 6.5, but not in SGI-ML6.5, LNX86-ML6.5, Octave 2.1.35-40; Other platforms unknown.
1120 FLAG_MATRIX_DIVISION_ERROR = ~all(all(isnan(repmat(0,p)/repmat(0,p)))) | ~all(all(isnan(repmat(nan,p)/repmat(nan,p))));
1122 if FLAG_MATRIX_DIVISION_ERROR,
1123 %fprintf(2,'%%% Warning MVAR: Bug in Matrix-Division 0/0 and NaN/NaN yields INF instead of NAN. Workaround is applied.\n');
1124 warning('MVAR: bug in Matrix-Division 0/0 and NaN/NaN yields INF instead of NAN. Workaround is applied.');
1132 %MAR = zeros(M,M*Pmax);
1135 % VAR{K+1} = -ARF(:,K*M+(1-M:0))';
1136 DC = DC + ARF(:,K*M+(1-M:0))'.^2; %DC meausure [3]