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

📄 ewasobi.m

📁 ICALAB for Signal Processing Toolbox for BSS, ICA, cICA, ICA-R, SCA and MCA
💻 M
📖 第 1 页 / 共 2 页
字号:
function [Wwasobi,Wsobi,ISR,signals]= ewasobi(x,AR_order,rmax,eps0); %% implements algorithm WASOBI for blind source separation of% AR sources in a fast way, allowing separation up to 100 sources% in the running time of the order of tens of seconds.%% INPUT:    x .... input data matrix d x N%           d .... dimension of the data%           N .... length of the data%           ARmax .. maximum AR order of the separated sources%           rmax ... a constant that may help to stabilize the algorithm.%                    it has the meaning of maximum magnitude of poles of the%                    AR sources. The choice rmax=1 means that no stabilization %                    is applied. The choice rmax=0.99 may lead to more stable%                    results.%           eps0 ... machine dependent constant to control condition number%                    of weight matrices%% OUTPUT: Wwasobi ...... estimated de-mixing matrix%         Wsobi ........ initial estimate of the matrix obtained by FFDiag2%         ISR .......... estimated ISR matrix which represents approximate accuracy %                        of the separation provided that there is no additive %                        noise in the model.%         signals....... separated signals%% Code by Petr Tichavsky, using inputs from Eran Doron, Pavel Laskov % and Andreas Ziehe. A paper that describes the algorithm is submitted % to ICASSP 2007.%if nargin<4   eps0=5.0e-7;endif nargin<3   rmax=0.99;end  num_of_iterations = 3;[d N]=size(x);Xmean=mean(x,2);x=x-Xmean*ones(1,N);  %%%%%%%%%  removing the sample mean%[AOL_1 Rx_est] = sobi(x,AR_order); WOL_1=inv(AOL_1);T=length(x(1,:))-AR_order;C0=corr_est(x,T,AR_order);%Wsobi = ffdiag2(C0,eye(d)); Wwasobi=Wsobi; WOL_1=Wsobi;Rx_est = [];%for in = 1:num_of_iterations    [WOL_1,Rx_est,AR]=newasobi(x,AR_order+1,WOL_1,Rx_est,rmax,eps0);    Wwasobi=WOL_1*Wwasobi;endISR=CRLB4(AR)/N;sqdnorm=diag(Wwasobi*C0(1:d,1:d)*Wwasobi');Wwasobi=Wwasobi./(sqrt(sqdnorm)*ones(1,d));signals=Wwasobi*x+(Wwasobi*Xmean)*ones(1,N);end  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% of EWASOBI%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function [W_est_WASOBI,Rx_est,AR]=newasobi(x,M,W_pre,Rx_est1,rmax,eps0);%%   Computes one iteration needed for wasobi%%   d ... number of independent components%   M ... number of lags = AR_order+1%   Vnorm ... estimated demixing matrix obtained in preprocessing%   Wnorm ...  estimated demixing matrix obtained by the advanced tuning%status=1;[d,N]=size(x);d2=d*(d-1)/2;T=length(x(1,:))-M+1;if isempty(Rx_est1)    Rx_est=corr_est(x,T,M-1,W_pre);else   for index=1:M       id=(index-1)*d;       Rx_est(:,id+1:id+d)=W_pre*Rx_est1(:,id+1:id+d)*W_pre';%       Rx_est(:,:,index)=W_pre*Rx_est1(:,:,index)*W_pre';   endendR=zeros(M,d);for index=1:M    id=(index-1)*d;    R(index,:)=diag(Rx_est(:,id+1:id+d)).'; %     R(index,:)=diag(Rx_est(:,:,index)).'; %%% columns of R will contain                            %%% covariance function of the separated componentsend%[AR,sigmy]=armodel(R,rmax);      %%% compute AR models of estimated components%AR3=[]; for i=2:d  for k=1:i-1    AR3=[AR3 conv(AR(:,i),AR(:,k))];  end  endphi=ar2r(AR3);     %%%%%%%%%% functions phi to evaluate CVinvCVinv=THinv5(phi,M,d2,eps0*phi(1,:));  %%%% to compute inversions of CV                                        %%%% It has dimension zeros(M,M*d2).im=1; for i=2:d  for k=1:i-1     fact=1/(sigmy(1,i)*sigmy(1,k));     CVinv(:,(im-1)*M+1:im*M)=CVinv(:,(im-1)*M+1:im*M)*fact;     im=im+1;  endend  W_est_WASOBI=serial10(Rx_est, CVinv);  %%% TO MINIMIZE THE WEIGHTED CRITERIONend %%%%%%%%%%%%%%%%%%%%%%%%%%   of newasobi%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function [ r ] = ar2r( a )%%%%%%%%%% Computes covariance function of AR processes from %%%%% the autoregressive coefficients using an inverse Schur algorithm %%%%% and an inverse Levinson algorithm (for one column it is equivalent to  %%%%%      "rlevinson.m" in matlab)%   if (size(a,1)==1)      a=a'; % chci to jako sloupce  end    [p m] = size(a);    % pocet vektoru koef.AR modelu  alfa = a;  K=zeros(p,m);  p = p-1;  for n=p:-1:1      K(n,:) = -a(n+1,:);      for k=1:n-1          alfa(k+1,:) = (a(k+1,:)+K(n,:).*a(n-k+1,:))./(1-K(n,:).^2);      end      a=alfa;  end%    r  = 1./prod(1-K.^2);  f=[r(1,:); zeros(p,m)];  b=f;  for k=1:p       for n=k:-1:1          f(n,:)=f(n+1,:)+K(n,:).*b(k-n+1,:);          b(k-n+1,:)=-K(n,:).*f(n+1,:)+(1-K(n,:).^2).*b(k-n+1,:);      end      b(k+1,:)=f(1,:);      r=[r; f(1,:)];   end       end %%%%%%%%%%%%%%%%%%%%%%%%%%%  of ar2r%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function R_est=corr_est(x,T,q,W_pre)%[K,KK]=size(x);R_est=[];if ~exist('W_pre')   for index=1:q+1       R_est=[R_est 1/T*(x(:,1:T)*x(:,index:T+index-1)')];   end    else   for index=1:q+1       R_est=[R_est 1/T*W_pre*(x(:,1:T)*x(:,index:T+index-1)')*W_pre'];   end    endend %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% of corr_est%%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxfunction [AR,sigmy]=armodel(R,rmax)%% to compute AR coefficients of the sources given covarience functions % but if the zeros have magnitude > rmax, the zeros are pushed back.%[M,d]=size(R); v1=zeros(1,d); v2=v1; Rs=R;for id=1:d    AR(:,id)=[1; -toeplitz(R(1:M-1,id),R(1:M-1,id)')\R(2:M,id)];    v=roots(AR(:,id)); %%% mimicks the matlab function "polystab"%    v1(1,id)=max(abs(v));    vs=0.5*(sign(abs(v)-1)+1);    v=(1-vs).*v+vs./conj(v);    vmax=max(abs(v));%    v2(1,id)=max(abs(v));    if vmax>rmax       v=v*rmax/vmax;    end       AR(:,id)=real(poly(v)'); %%% reconstructs back the covariance functionend Rs=ar2r(AR);sigmy=R(1,:)./Rs(1,:);% [v1; v2]end %%%%%%%%%%%%%%%%%%%%%%%  of armodel%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function W=serial10(Rx_est,CVinv);%[d Md]=size(Rx_est);M=Md/d; dd=d^2-d; dd2=dd/2;W=eye(d);%num_of_iteration=5;for iteration=1:num_of_iteration    A0=eye(d);    im=1;     for i=2:d      for k=1:i-1        Y(im,:)=(Rx_est(i,k:d:Md)+Rx_est(k,i:d:Md))/2;  %        Y(im,:)=squeeze(Rx_est(i,k,:)+Rx_est(k,i,:))/2;         im=im+1;      end    end    for i=1:d        LaMat(i,:)=Rx_est(i,i:d:Md);    end     b11=zeros(dd2,1); b12=b11; b22=b11; c1=b11; c2=c1;    m=0;     for id=2:d              for id2=1:id-1          m=m+1; im=(m-1)*M;          Wm=CVinv(:,im+1:im+M);          Wlam1=Wm*LaMat(id,:)';          Wlam2=Wm*LaMat(id2,:)';          b11(m,1)=LaMat(id2,:)*Wlam2;          b12(m,1)=LaMat(id,:)*Wlam2;          b22(m,1)=LaMat(id,:)*Wlam1;          c1(m,1)=c1(m,1)+Wlam2'*Y(m,:)';          c2(m,1)=c2(m,1)+Wlam1'*Y(m,:)';       end    end    det0=b11.*b22-b12.^2;     d1=(c1.*b22-b12.*c2)./det0;     d2=(b11.*c2-b12.*c1)./det0;%    value=norm([d1; d2])    m=0;    for id=2:d        for id2=1:id-1            m=m+1;            A0(id,id2)=d1(m,1);            A0(id2,id)=d2(m,1);        end    end      Ainv=inv(A0);      if iteration<num_of_iteration              for m=1:M %          Rx_est(:,:,m)=Ainv*Rx_est(:,:,m)*Ainv';           id=(m-1)*d;           Rx_est(:,id+1:id+d)=Ainv*Rx_est(:,id+1:id+d)*Ainv';       end    end    W=Ainv*W;end     end  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  of serial10function ISR = CRLB4(AR);%% CRLB4(AR) generates the CRLB for gain matrix elements (in term % of ISR) for blind separation of K Gaussian autoregressive sources % whose AR coefficients (of the length M, where M-1 is the AR order)% are stored as columns in matrix AR.[M K]=size(AR);Rs=ar2r(AR);sum_Rs_s=zeros(K,K);for s=0:M-1    for t=0:M-1        sum_Rs_s=sum_Rs_s+(AR(s+1,:).*AR(t+1,:))'*Rs(abs(s-t)+1,:);    endenddenom=sum_Rs_s'.*sum_Rs_s+eye(K)-1;ISR=sum_Rs_s'./denom.*(ones(K,1)*Rs(1,:))./(Rs(1,:)'*ones(1,K));ISR(eye(K)==1)=0;end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% of CRLB4function G=THinv5(phi,K,M,eps);%%%%% Implements fast (complexity O(M*K^2))%%%% computation of the following piece of code:%%C=[];%for im=1:M %  A=toeplitz(phi(1:K,im),phi(1:K,im)')+hankel(phi(1:K,im),phi(K:2*K-1,im)')+eps(im)*eye(K);%  C=[C inv(A)];%end  %% DEFAULT PARAMETERS: M=2; phi=randn(2*K-1,M); eps=randn(1,2);%   SIZE of phi SHOULD BE (2*K-1,M).%   SIZE of eps SHOULD BE (1,M).phi(2*K,1:M)=0;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%almold=2*phi(1,:)+eps;C0=1./almold;x1=zeros(K,M); x2=x1; x3=x1; x4=x1;x1(1,:)=C0; x2(1,:)=C0; x3(1,:)=-C0.*phi(2,:); x4(1,:)=-2*C0.*phi(2,:); x4old=[];lalold=2*phi(2,:)./almold;for k=1:K-1    f2o=phi(k+1:-1:2,:)+phi(k+1:2*k,:);    alm=sum(f2o.*x4(1:k,:),1)+phi(1,:)+eps+phi(2*k+1,:);    a0=zeros(1,M);     if k<K-1       a0=phi(k+2,:);

⌨️ 快捷键说明

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