📄 mvar.m
字号:
function [ARF,RCF,PE,DC,varargout] = mvar(Y, Pmax, Mode);% MVAR estimates Multi-Variate AutoRegressive model parameters% Several estimation algorithms are implemented, all estimators % can handle data with missing values encoded as NaNs. %% [AR,RC,PE] = mvar(Y, p);% [AR,RC,PE] = mvar(Y, p, Mode);%% INPUT:% Y Multivariate data series % p Model order% Mode determines estimation algorithm %% OUTPUT:% AR multivariate autoregressive model parameter% RC reflection coefficients (= -PARCOR coefficients)% PE remaining error variance%% All input and output parameters are organized in columns, one column % corresponds to the parameters of one channel.%% Mode determines estimation algorithm. % 1: Correlation Function Estimation method using biased correlation function estimation method% also called the "multichannel Yule-Walker" [1,2] % 6: Correlation Function Estimation method using unbiased correlation function estimation method%% 2: Partial Correlation Estimation: Vieira-Morf [2] using unbiased covariance estimates.% In [1] this mode was used and (incorrectly) denominated as Nutall-Strand. % Its the DEFAULT mode; according to [1] it provides the most accurate estimates.% 5: Partial Correlation Estimation: Vieira-Morf [2] using biased covariance estimates.% Yields similar results than Mode=2;%% 3: Partial Correlation Estimation: Nutall-Strand [2] (biased correlation function)% 7: Partial Correlation Estimation: Nutall-Strand [2] (unbiased correlation function)%% 10: ARFIT [3] % 11: BURGV [4] %% REFERENCES:% [1] A. Schl\"ogl, Comparison of Multivariate Autoregressive Estimators.% Signal processing, Elsevier B.V. (in press). % available at http://dx.doi.org/doi:10.1016/j.sigpro.2005.11.007% [2] S.L. Marple "Digital Spectral Analysis with Applications" Prentice Hall, 1987.% [3] Schneider and Neumaier)% [4] Stijn de Waele, 2003%%% A multivariate inverse filter can be realized with % [AR,RC,PE] = mvar(Y,P);% e = mvfilter([eye(size(AR,1)),-AR],eye(size(AR,1)),Y);% % see also: MVFILTER, MVFREQZ, COVM, SUMSKIPNAN, ARFIT2% $Revision: 1.18 $% $Id: mvar.m,v 1.18 2006/04/12 13:11:53 schloegl Exp $% Copyright (C) 1996-2006 by Alois Schloegl <a.schloegl@ieee.org> % This is part of the TSA-toolbox. See also % http://hci.tugraz.at/schloegl/matlab/tsa/% http://octave.sourceforge.net/% http://biosig.sourceforge.net/% This library is free software; you can redistribute it and/or% modify it under the terms of the GNU Library General Public% License as published by the Free Software Foundation; either% Version 2 of the License, or (at your option) any later version.%% This library is distributed in the hope that it will be useful,% but WITHOUT ANY WARRANTY; without even the implied warranty of% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU% Library General Public License for more details.%% You should have received a copy of the GNU Library General Public% License along with this library; if not, write to the% Free Software Foundation, Inc., 59 Temple Place - Suite 330,% Boston, MA 02111-1307, USA.% CHANGELOG:% - SUPPORT for ARFIT, BURGV added% - imputation methods added% - Correct scaling of PE and covariance matrices. % - some experimental versions added. % Inititialization[N,M] = size(Y);if nargin<2, Pmax=max([N,M])-1;end;if iscell(Y) Pmax = min(max(N ,M ),Pmax); C = Y;end;if nargin<3, % according to [1], and other internal validations this is in many cases the best algorithm Mode=2;end;[C(:,1:M),n] = covm(Y,'M');PE(:,1:M) = C(:,1:M)./n;if 0,elseif Mode==0; % this method is broken fprintf('Warning MVAR: Mode=0 is broken.\n') C(:,1:M) = C(:,1:M)/N; F = Y; B = Y; PEF = C(:,1:M); %?% PEF = PE(:,1:M); PEB = C(:,1:M); for K=1:Pmax, [D,n] = covm(Y(K+1:N,:),Y(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)); PEF = [eye(M) - ARF(:,K*M+(1-M:0))*ARB(:,K*M+(1-M:0))]*PEF; PEB = [eye(M) - ARB(:,K*M+(1-M:0))*ARF(:,K*M+(1-M:0))]*PEB; PE(:,K*M+(1:M)) = PEF; end; elseif Mode==1, %%%%% Levinson-Wiggens-Robinson (LWR) algorithm using biased correlation function % ===== In [1,2] this algorithm is denoted "Multichannel Yule-Walker" ===== % C(:,1:M) = C(:,1:M)/N; PEF = C(:,1:M); PEB = C(:,1:M); for K=1: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; 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)) = D / PEB; ARB(:,K*M+(1-M:0)) = D'/ PEF; 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 = [eye(M) - ARF(:,K*M+(1-M:0))*ARB(:,K*M+(1-M:0))]*PEF; PEB = [eye(M) - ARB(:,K*M+(1-M:0))*ARF(:,K*M+(1-M:0))]*PEB; PE(:,K*M+(1:M)) = PEF; end; elseif Mode==6, %%%%% Levinson-Wiggens-Robinson (LWR) algorithm using unbiased correlation function C(:,1:M) = C(:,1:M)/N; PEF = C(:,1:M); %?% PEF = PE(:,1:M); PEB = C(:,1:M); for K = 1: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; %C{K+1} = C{K+1}/N; 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)) = D / PEB; ARB(:,K*M+(1-M:0)) = D'/ PEF; 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 = [eye(M) - ARF(:,K*M+(1-M:0))*ARB(:,K*M+(1-M:0))]*PEF; PEB = [eye(M) - ARB(:,K*M+(1-M:0))*ARF(:,K*M+(1-M:0))]*PEB; PE(:,K*M+(1:M)) = PEF; end; elseif Mode==2 %%%%% Partial Correlation Estimation: Vieira-Morf Method [2] with unbiased covariance estimation %===== In [1] this algorithm is denoted "Nutall-Strand with unbiased covariance" =====% %C(:,1:M) = C(:,1:M)/N; F = Y; B = Y; %PEF = C(:,1:M); %PEB = C(:,1:M); PEF = PE(:,1:M); PEB = PE(:,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)); [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 %%%%% Partial Correlation Estimation: Vieira-Morf Method [2] with biased covariance estimation %===== In [1] this algorithm is denoted "Nutall-Strand with biased covariance" ===== % 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; PE(:,K*M+(1:M)) = PEF./n; end; elseif Mode==3 %%%%% Partial Correlation Estimation: Nutall-Strand Method [2] with biased covariance estimation % 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)) = 2*D / (PEB+PEF); ARB(:,K*M+(1-M:0)) = 2*D'/ (PEF+PEB); 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(:,K*M+(1-M:0)) = 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*M+(1:M)) = PEF; PE(:,K*M+(1:M)) = PEF./n; end; elseif Mode==7 %%%%% Partial Correlation Estimation: Nutall-Strand Method [2] with unbiased covariance estimation %C(:,1:M) = C(:,1:M)/N; F = Y; B = Y; %PEF = C(:,1:M); %PEB = C(:,1:M); PEF = PE(:,1:M); PEB = PE(:,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)) = 2*D / (PEB+PEF); ARB(:,K*M+(1-M:0)) = 2*D'/ (PEF+PEB); 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(:,K*M+(1-M:0)) = 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, %%%%% Kay, not fixed yet. fprintf('Warning MVAR: Mode=4 is broken.\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 - C(:,(K-L)*M+(1:M))*ARF(:,L*M+(1-M:0)); end; ARF(:,K*M+(1-M:0)) = PEB \ D; ARB(:,K*M+(1-M:0)) = PEF \ D'; 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 = 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;elseif Mode==10, %%%%% ARFIT try RCF = []; [w, ARF, PE] = arfit(Y, Pmax, Pmax, 'sbc', 'zero'); catch ARF = zeros(M,M*Pmax); RCF = ARF; end; elseif Mode==11, %%%%% de Waele 2003 [pc,R0] = burgv(reshape(Y',[M,1,N]),Pmax); try, [ARF,ARB,Pf,Pb,RCF,RCB] = pc2parv(pc,R0); catch [RCF,RCB,Pf,Pb] = pc2rcv(pc,R0); [ARF,ARB,Pf,Pb] = pc2parv(pc,R0); end; ARF = -reshape(ARF(:,:,2:end),[M,M*Pmax]); RCF = -reshape(RCF(:,:,2:end),[M,M*Pmax]); PE = reshape(Pf,[M,M*(Pmax+1)]);elseif Mode==12, % this is equivalent to Mode==11
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -