⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 acsobiro.m

📁 含有多种ICA算法的eeglab工具箱
💻 M
字号:
% acsobiro() - A.C.'s Robust second-order blind identification (SOBI) by joint %              diagonalization of the time-delayed covariance matrices. NOTE:%              THIS CODE ASSUMES TEMPORALLY CORRELATED SIGNALS Thus, estimated %              time-delayed covariance matrices must be nonsingular for at least %              some time delays.%% Usage:  >>   [H] = acsobiro(X);%         >> [H,S] = acsobiro(X,n,p);% Inputs: %         X - data matrix of dimension [m,N] where%                    m is the number of sensors%                    N is the number of samples%         n - number of sources {Default: n=m}%         p - number of correlation matrices to be diagonalized {default: p=100}%             For noisy data, use at least 100 time delays.% Outputs:%         H - matrix of dimension [m,n] an estimate of the *mixing* matrix%         S - matrix of dimension [n,N] an estimate of the source activities%             where  >> X [m,N] = H [m,n] * S [n,N]%% Authors: Implemented and improved by A. Cichocki on the basis of %          the classical SOBI algorithm of Belouchrani and publications of: %           A. Belouchrani et al., F. Cardoso et al.,%           S. Choi, S. Cruces, S. Amari, and P. Georgiev%% Note: updated by Arnaud Delorme and Scott Makeig to process data epochs%       (compute an average correlation matrix respecting epoch boundaries).% REFERENCES:%  A. Belouchrani, K. Abed-Meraim, J.-F. Cardoso, and E. Moulines, ``Second-order%  blind separation of temporally correlated sources,'' in Proc. Int. Conf. on%  Digital Sig. Proc., (Cyprus), pp. 346--351, 1993.%%  A. Belouchrani, and A. Cichocki, %  Robust whitening procedure in blind source separation context, %  Electronics Letters, Vol. 36, No. 24, 2000, pp. 2050-2053.%  %  A. Cichocki and S. Amari, %  Adaptive Blind Signal and Image Processing, Wiley,  2003.function [H,S,D]=acsobiro(X,n,p),[m,N,ntrials]=size(X);if nargin<1 | nargin > 3  help sobielseif nargin==1, n=m; % source detection (hum...) p=min(100,ceil(N/3)); % number of time delayed correlation matrices to be diagonalized                  % Note: For noisy data, use at least p=100 the time-delayed covariance matrices.elseif nargin==2, p=min(100,ceil(N/3)); % number of correlation matrices to be diagonalizedend; X(:,:)=X(:,:)-(mean(X(:,:)')'*ones(1,N*ntrials));        % Remove data means for t = 1:ntrials     if t == 1        Rxx=(X(:,1:N-1,t)*X(:,2:N,t)')/(N-1)/ntrials; % Estimate the sample covariance matrix                                           % for the time delay p=1, to reduce influence                                           % of white noise.    else        Rxx=Rxx+(X(:,1:N-1,t)*X(:,2:N,t)')/(N-1)/ntrials; % Estimate the sample covariance matrix                                           % for the time delay p=1, to reduce influence                                           % of white noise.    end;end;[Ux,Dx,Vx]=svd(Rxx);Dx=diag(Dx);% n=11; if n<m, % under assumption of additive white noise and when the number          % of sources is known, or can be estimated a priori   Dx=Dx-real((mean(Dx(n+1:m))));  Q= diag(real(sqrt(1./Dx(1:n))))*Ux(:,1:n)';else    % under assumption of no additive noise and when the         % number of sources is unknown   n=max(find(Dx>1e-99)); % detect the number of sources   fprintf('acsobiro(): Estimated number of sources is %d\n',n);   Q= diag(real(sqrt(1./Dx(1:n))))*Ux(:,1:n)';end;Xb = zeros(size(X));Xb(:,:)=Q*X(:,:); % prewhitened data% Estimate the time delayed covariance matrices: k=1; pn=p*n; % for convenience for u=1:m:pn,    k=k+1;    for t = 1:ntrials        if t == 1           Rxp=Xb(:,k:N,t)*Xb(:,1:N-k+1,t)'/(N-k+1)/ntrials;       else           Rxp=Rxp+Xb(:,k:N,t)*Xb(:,1:N-k+1,t)'/(N-k+1)/ntrials;       end;   end;   M(:,u:u+m-1)=norm(Rxp,'fro')*Rxp;  % Frobenius norm = end;                                  % sqrt(sum(diag(Rxp'*Rxp)))% Approximate joint diagonalization:eps=1/sqrt(N)/100; encore=1; U=eye(n);while encore, encore=0; for p=1:n-1,  for q=p+1:n,    % Givens rotations:    g=[ M(p,p:n:pn)-M(q,q:n:pn)  ;        M(p,q:n:pn)+M(q,p:n:pn)  ;        i*(M(q,p:n:pn)-M(p,q:n:pn))];   [Ucp,D] = eig(real(g*g')); [la,K]=sort(diag(D));   angles=Ucp(:,K(3));angles=sign(angles(1))*angles;   c=sqrt(0.5+angles(1)/2);   sr=0.5*(angles(2)-j*angles(3))/c; sc=conj(sr);   asr = abs(sr)>eps ;   encore=encore | asr ;   if asr , % Update the M and U matrices:      colp=M(:,p:n:pn);     colq=M(:,q:n:pn);     M(:,p:n:pn)=c*colp+sr*colq;     M(:,q:n:pn)=c*colq-sc*colp;     rowp=M(p,:);     rowq=M(q,:);     M(p,:)=c*rowp+sc*rowq;     M(q,:)=c*rowq-sr*rowp;     temp=U(:,p);     U(:,p)=c*U(:,p)+sr*U(:,q);     U(:,q)=c*U(:,q)-sc*temp;   end  %% if  end  %% q loop end  %% p loopend  %% while% Estimate the mixing matrix H H= pinv(Q)*U(1:n,1:n); % Estimate the source activities Sif nargout>1  S=[];  W=U(1:n,1:n)'*Q;   S= W*X(:,:);end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -