📄 mvar.m
字号:
D = D./n; ARF(:,K*M+(1-M:0)) = D / PEB; ARB(:,K*M+(1-M:0)) = D'/ PEF; tmp = F(K+1:N,:) - B(1:N-K,:)*ARF(:,K*M+(1-M:0)).'; B(1:N-K,:) = B(1:N-K,:) - F(K+1:N,:)*ARB(:,K*M+(1-M:0)).'; F(K+1:N,:) = tmp; for L = 1:K-1, tmp = ARF(:,L*M+(1-M:0)) - ARF(:,K*M+(1-M:0))*ARB(:,(K-L)*M+(1-M:0)); 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)); ARF(:,L*M+(1-M:0)) = tmp; end; RCF(:,K*M+(1-M:0)) = ARF(:,K*M+(1-M:0)); RCB(:,K*M+(1-M:0)) = ARB(:,K*M+(1-M:0)); [PEF,n] = covm(F(K+1:N,:),F(K+1:N,:),'M'); PEF = PEF./n; [PEB,n] = covm(B(1:N-K,:),B(1:N-K,:),'M'); PEB = PEB./n; PE(:,K*M+(1:M)) = PEF; end; elseif Mode==5, %%%%% multi-channel Levinsion algorithm [2] using Nutall-Strand Method %%%%% multi-channel Levinsion algorithm %%%%% using Nutall-Strand Method [2] %%%%% Covariance matrix is normalized by N=length(X) %C{1} = C{1}/N; F = Y; B = Y; PEF = C(:,1:M); PEB = C(:,1:M); for K=1:Pmax, [D,n] = covm(F(K+1:N,:),B(1:N-K,:),'M'); %D=D/N; ARF(:,K*M+(1-M:0)) = D / PEB; ARB(:,K*M+(1-M:0)) = D'/ PEF; tmp = F(K+1:N,:) - B(1:N-K,:)*ARF(:,K*M+(1-M:0)).'; B(1:N-K,:) = B(1:N-K,:) - F(K+1:N,:)*ARB(:,K*M+(1-M:0)).'; F(K+1:N,:) = tmp; for L = 1:K-1, tmp = ARF(:,L*M+(1-M:0)) - ARF(:,K*M+(1-M:0))*ARB(:,(K-L)*M+(1-M:0)); 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)); ARF(:,L*M+(1-M:0)) = tmp; end; RCF(:,K*M+(1-M:0)) = ARF(:,K*M+(1-M:0)); RCB(:,K*M+(1-M:0)) = ARB(:,K*M+(1-M:0)); [PEB,n] = covm(B(1:N-K,:),B(1:N-K,:),'M'); %PEB = D/N; [PEF,n] = covm(F(K+1:N,:),F(K+1:N,:),'M'); %PEF = D/N; PE(:,K*M+(1:M)) = PEF; end; elseif Mode==3, %%%%% multi-channel Levinsion algorithm [2] using Vieira-Morf Method fprintf('Warning MDURLEV: It''s not recommended to use this mode\n') C(:,1:M) = C(:,1:M)/N; F = Y; B = Y; PEF = C(:,1:M); PEB = C(:,1:M); for K=1:Pmax, [D, n] = covm(F(K+1:N,:),B(1:N-K,:),'M'); D = D./n; ARF(:,K*M+(1-M:0)) = (PEF.^-.5)*D*(PEB.^-.5)'; ARB(:,K*M+(1-M:0)) = ARF(:,K*M+(1-M:0)); tmp = F(K+1:N,:) - B(1:N-K,:)*ARF(:,K*M+(1-M:0)).'; B(1:N-K,:) = B(1:N-K,:) - F(K+1:N,:)*ARB(:,K*M+(1-M:0)).'; F(K+1:N,:) = tmp; for L = 1:K-1, tmp = ARF(:,L*M+(1-M:0)) - ARF(:,K*M+(1-M:0))*ARB(:,(K-L)*M+(1-M:0)); 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)); ARF(:,L*M+(1-M:0)) = tmp; end; %RCF{K} = ARF{K}; RCF = ARF(:,K*M+(1-M:0)); [PEF,n] = covm(F(K+1:N,:),F(K+1:N,:),'M'); PEF = PEF./n; [PEB,n] = covm(B(1:N-K,:),B(1:N-K,:),'M'); PEB = PEB./n; %PE{K+1} = PEF; PE(:,K*M+(1:M)) = PEF; end; elseif Mode==7 %%%%% multi-channel Levinsion algorithm [2] using Vieira-Morf Method fprintf('Warning MDURLEV: It''s not recommended to use this mode\n') C(:,1:M) = C(:,1:M)/N; F = Y; B = Y; PEF = C(:,1:M); PEB = C(:,1:M); for K=1:Pmax, [D,n] = covm(F(K+1:N,:),B(1:N-K,:),'M'); D = D./n; ARF(:,K*M+(1-M:0)) = (PEF.^-.5)*D*(PEB.^-.5); ARB(:,K*M+(1-M:0)) = (PEF.^-.5)*D'*(PEB.^-.5); tmp = F(K+1:N,:) - B(1:N-K,:)*ARF(:,K*M+(1-M:0)).'; B(1:N-K,:) = B(1:N-K,:) - F(K+1:N,:)*ARB(:,K*M+(1-M:0)).'; F(K+1:N,:) = tmp; for L = 1:K-1, tmp = ARF(:,L*M+(1-M:0)) - ARF(:,K*M+(1-M:0))*ARB(:,(K-L)*M+(1-M:0)); 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)); ARF(:,L*M+(1-M:0)) = tmp; end; %RCF{K} = ARF{K}; RCF = ARF(:,K*M+(1-M:0)); [PEF,n] = covm(F(K+1:N,:),F(K+1:N,:),'M'); PEF = PEF./n; [PEB,n] = covm(B(1:N-K,:),B(1:N-K,:),'M'); PEB = PEB./n; %PE{K+1} = PEF; PE(:,K*M+(1:M)) = PEF; end; elseif Mode==4, %%%%% nach Kay, not fixed yet. fprintf('Warning MDURLEV: It''s not recommended to use this mode\n') C(:,1:M) = C(:,1:M)/N; K = 1; [C(:,M+(1:M)),n] = covm(Y(2:N,:),Y(1:N-1,:)); C(:,M+(1:M)) = C(:,M+(1:M))/N; % biased estimate D = C(:,M+(1:M)); ARF(:,1:M) = C(:,1:M)\D; ARB(:,1:M) = C(:,1:M)\D'; RCF(:,1:M) = ARF(:,1:M); RCB(:,1:M) = ARB(:,1:M); PEF = C(:,1:M)*[eye(M) - ARB(:,1:M)*ARF(:,1:M)]; PEB = C(:,1:M)*[eye(M) - ARF(:,1:M)*ARB(:,1:M)]; for K=2:Pmax, [C(:,K*M+(1:M)),n] = covm(Y(K+1:N,:),Y(1:N-K,:),'M'); C(:,K*M+(1:M)) = C(:,K*M+(1:M)) / N; % biased estimate D = C(:,K*M+(1:M)); for L = 1:K-1, D = D - ARF(:,L*M+(1-M:0))*C(:,(K-L)*M+(1:M)); end; ARF(:,K*M+(1-M:0)) = PEB \ D; ARB(:,K*M+(1-M:0)) = PEF \ D'; for L = 1:K-1, ARFtmp(:,L*M+(1-M:0)) = ARF(:,L*M+(1-M:0)) - ARB(:,(K-L)*M+(1-M:0)) *ARF(:,K*M+(1-M:0)) ; ARB(:,L*M+(1-M:0)) = ARB(:,L*M+(1-M:0)) - ARF(:,(K-L)*M+(1-M:0)) *ARB(:,K*M+(1-M:0)) ; end; ARF(:,1:(K-1)*M) = ARFtmp; RCF(:,K*M+(1-M:0)) = ARF(:,K*M+(1-M:0)) ; RCB(:,K*M+(1-M:0)) = ARB(:,K*M+(1-M:0)) ; PEF = PEF*[eye(M) - ARB(:,K*M+(1-M:0)) *ARF(:,K*M+(1-M:0)) ]; PEB = PEB*[eye(M) - ARF(:,K*M+(1-M:0)) *ARB(:,K*M+(1-M:0)) ]; PE(:,K*M+(1:M)) = PEF; end;end;if any(ARF(:)==inf),% Test for matrix division bug. % 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.p = 3;
FLAG_MATRIX_DIVISION_ERROR = ~all(all(isnan(repmat(0,p)/repmat(0,p)))) | ~all(all(isnan(repmat(nan,p)/repmat(nan,p))));if FLAG_MATRIX_DIVISION_ERROR, %fprintf(2,'### Warning MVAR: Bug in Matrix-Division 0/0 and NaN/NaN yields INF instead of NAN. Workaround is applied.\n'); warning('MVAR: bug in Matrix-Division 0/0 and NaN/NaN yields INF instead of NAN. Workaround is applied.'); %%%%% Workaround ARF(ARF==inf)=NaN; RCF(RCF==inf)=NaN;end;end; %MAR = zeros(M,M*Pmax);DC = zeros(M);for K = 1:Pmax,% VAR{K+1} = -ARF(:,K*M+(1-M:0))'; DC = DC + ARF(:,K*M+(1-M:0))'.^2; %DC meausure [3]end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -