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

📄 bss_gbjz_ep_eeg_end.m

📁 语音信号的盲分离
💻 M
字号:


function main()  %主程序

clear all;
%------------------------常量初值--------------------- 
load eeg.txt

 load c07_0.dat;
 epsig=c07_0;

 
 hello=epsig/5;



N=2000;%快拍数

 hello2=hello.';
 hello=zeros(1,N);
 hello(1,1:N)=hello2(1,1:N);

eeg2=eeg.';
eeg=zeros(1,N);
eeg(1,1:N)=eeg2(1,1:N);



M=5;%传感器个数
n=0:N-1;
P=2;%信号源个数

%-----------------------------------------------------

source_angle=-20;%期望信号角度
sita_s=source_angle*pi/180;%期望信号方位

source_angle_2=40;%期望信号角度
sita_s_2=source_angle_2*pi/180;%期望信号方位

 

%-----------------------------------------------------

 power_source=10^(20/20);%期望信号功率

power_noise=10^( 0/20);%干扰信号功率

%-----------------------------------------------------
alpha=1.4;%稳定分布特征指数,0<alpha<2
beta=0;
gama=1;
miu=0;

p=1.2;%分数阶矩的阶数p<alpha<2
%-----------------------------------------------------

 source=power_source*hello(1,1:N);
 source=source-mean(source);

  source_2= power_source*eeg(1,1:N);
 


 noise =power_noise*sasd(N,alpha).'; % 复稳定分布
 %noise =power_noise*casd(N,alpha,beta,gama,miu); % 复稳定分布



 ii=[0:M-1].';
 asita_s=exp(-i*ii*pi*(sin(sita_s)))/sqrt(M);  %  期望信号方向矢量
 asita_s_2=exp(-i*ii*pi*(sin(sita_s_2)))/sqrt(M);  %  期望信号方向矢量

 
 
    X= (asita_s*source  + asita_s_2*source_2)*sqrt(M) + ones(M,1)*noise%+  randn(M,N);  % 阵列接收信号
   % X= (asita_s*source  + asita_s_2*source_2)*sqrt(M)+  randn(M,N);  % 阵列接收信号
  
    
        % for nu=1:N 
        % X(:,nu)=X(:,nu)-mean(X(:,nu));
        %end
 %for nu=1:M 
  %   X(nu,:)=X(nu,:)-mean(X(nu,:));
  %end
     
    X=X./50;  
     
     
     
  %%%%%%---1----%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   
     
     
   
      cov_X=covariationmatrix(X,p,alpha);%计算 X 的共变矩阵
    % cov_X=flocmatrix(X,p);%计算 X 的FLOC矩阵
  
 [vec,di ]=eig(cov_X)
 
 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   %  V=([di(1,1) 0;0 di(2,2)]^(-1/2))*[vec(:,1) vec(:,2)].';
   % Z=V*X ;
      V=[vec(:,1) vec(:,2)]*([di(1,1) 0;0 di(2,2)]^(-1/2));

      %V=[vec(:,1) vec(:,2) vec(:,3)]*([di(1,1) 0 0;0 di(2,2) 0;0 0 di(3,3)]^(-1/2));
    % V=([di(1,1) 0;0 di(2,2)]^(-1/2))*[vec(:,1) vec(:,2)]';
    %V=[vec(:,M-1) vec(:,M)]*([di(M-1,M-1) 0;0 di(M,M)]^(-1/2));
  
    %  Z=V'*(abs(X).^(p-1).*conj(X)) ;%数据阵----FLOC化
     Z=V'*X ;%
    
    
     B= rand(P,P)+i*rand(P,P) ;
    % B= rand(M,M)+i*rand(M,M) ;
    B0=B;
    
    
    u=0.01;
 
   N_iter=N;%迭代次数
   
   
   
   for k=1:N_iter 
       
        Y(:,k)=B'*Z(:,k);
        
  
        B=B+u*( Z(:,k)-B*g1(Y(:,k)) )*g1(Y(:,k)');
        %B=B+u*( Z(:,k)-B*g(Y(:,k),p)) * g(Y(:,k).',p);
        norm_B_1(k)= abs(log10(norm(B-B0,2)));
    end      
  
  
     
      Y1=B'*Z ;
  
  
      
      
      
      
      
      
      
      
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
   cov_X=covariancematrix(X); %计算 协方差矩阵
  
 [vec,di ]=eig(cov_X) 
 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     %V=[vec(:,1) vec(:,2)]*([di(1,1) 0;0 di(2,2)]^(-1/2));
      V=[vec(:,M-1) vec(:,M)]*([di(M-1,M-1) 0;0 di(M,M)]^(-1/2));
    % V=[vec(:,M-2) vec(:,M-1) vec(:,M)]*([di(M-2,M-2) 0 0;0 di(M-1,M-1) 0;0 0 di(M,M)]^(-1/2));
  
   Z=V'*X ;
    
  
     B= rand(P,P)+i*rand(P,P) ;
    B0=B;
    
    
    u=0.01;
 
   for k=1:N_iter 
       
        Y(:,k)=B'*Z(:,k);
        
  
        B=B+u*( Z(:,k)-B*g2(Y(:,k) ))*g2(Y(:,k)');
        %B=B+u*( Z(:,k)-B*g(Y(:,k),p ))*g(Y(:,k).',p);
        norm_B_2(k)= abs(log10(norm(B-B0,2)));
    end      
  
  
     
      Y2=B'*Z ;
  
  
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 figure(1);
 MMM=300;
 subplot(3,2,1);
plot(0.001*real(source(1:MMM)-mean(source(1:MMM))),'r');
title('a.source signal 1');
 %subplot(4,2,3);
%plot(real(X(1,1:MMM)),'r');
%title('c.混合信号1');
  subplot(3,2,3);
  plot(real(Y2(1,:)+0.1*rasd(N,alpha,beta,gama,miu)),'r');
   plot(real(Y2(1,1:MMM)),'r');
title('c.separate signal 1(SOS)');
 subplot(3,2,5);
  plot(0.1*real(Y1(1,1:MMM)),'r');
title('e.separate signal 1(FLOS)');

 subplot(3,2,2);
plot(0.01*real(source_2(1:MMM)-mean(source_2)),'b');
title('b.source signal 2');
 %subplot(4,2,4);
%plot(real(X(2,1:MMM)),'b');
%title('d.混合信号2 ');
 subplot(3,2,4);
 %plot(real(Y2(2,:)+0.1*rasd(N,alpha,beta,gama,miu)),'b');
 plot(real(Y2(2,1:MMM)),'b');
title('d.separate signal 2(SOS)'); 
 subplot(3,2,6);
 plot(0.1*real(Y1(2,1:MMM)),'b');
title('f.separate signal 2(FLOS)'); 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

 
     figure(2);
     MM=500;
     plot(1:MM,abs(norm_B_1(1:MM)-mean(norm_B_1)),'r-',1:MM,abs(norm_B_2(1:MM)-mean(norm_B_2)),'b-.');
     xlabel('iteration nunber');
     ylabel('MSE');
    %legend('SOS','FLOS')
       legend('FLOS','SOS')






 %-------------------------
 
   
     function y=g1(x)
             p=1.2;
             y=abs(x).^(p-2).*conj(x) ;

             
            
      
      
 function y=g2(x )
     y= tanh(x) ;


 
     
  

 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %------------% 计算 协方差矩阵--------------------
 function r_X=covariancematrix(X)
 [M,N]=size(X);
 for in=1:M
        
         for jn=1:M
                         
             r_X_a(in,jn)=0;
             
             for nn=1:N
             r_X_a(in,jn)=r_X_a(in,jn)+X(in,nn)*conj(X(jn,nn));
             end
             
             r_X(in,jn)=r_X_a(in,jn)/N;
         end
     end  
     
     
 
     
     
     
 %------------% 计算 FLOC矩阵--------------------
 function r_X=flocmatrix(X,p)
 [M,N]=size(X);
 for in=1:M
        
         for jn=1:M
                         
             r_X_a(in,jn)=0;
             
             for nn=1:N
            % r_X_a(in,jn)=r_X_a(in,jn)+(X(in,nn))*abs(X(jn,nn))^(p-1)*conj(X(jn,nn));
              r_X_a(in,jn)=r_X_a(in,jn)+abs(X(in,nn))^(p-1)*conj(X(in,nn))*abs(X(jn,nn))^(p-1)*conj(X(jn,nn));
             end
             
             r_X(in,jn)=r_X_a(in,jn)/N;
         end
     end  


     
     
 %------计算 X 的共变矩阵------------
  function cov_X=covariationmatrix(X,p,alpha)
  
   [M,N]=size(X);
    for in=1:M
        
         for jn=1:M
                         
             cov_coef_a(in,jn)=0;
             cov_coef_b(in,jn)=0;
             
             for nn=1:N
             cov_coef_a(in,jn)=cov_coef_a(in,jn)+X(in,nn)*(abs(X(jn,nn)).^(p-2))*conj(X(jn,nn));
             cov_coef_b(in,jn)=cov_coef_b(in,jn)+(abs(X(jn,nn)).^(p-1));
             end
             
             c_p_alpha=2^(p+1)*gamma((p+2)/2)*gamma(-p/alpha)/(alpha*gamma(1/2)*gamma(-p/2));
             cov_X(in,jn)=(cov_coef_a(in,jn)/cov_coef_b(in,jn))*(cov_coef_b(in,jn)/(N*c_p_alpha)).^(alpha/p);
                       
         end
     end
     
 
     
     
%----------------产生 复全向 稳定分布信号-------------------
function X=casd(N,alpha,beta,gama,miu)

G1=normrnd(0,1,1,N);
G2=normrnd(0,1,1,N);
AA=rasd(N,alpha/2,1,(cos(pi*alpha/4))^2,miu);
X=AA.^(1/2).*(G1+i*G2);


function Y=rasd(N,alpha,beta,gama,miu)


% ----- 均匀分布 -----

%U=unifrnd(-pi/2,pi/2,1,N);

nuni=rand(1,N);
U=(nuni*pi)-pi/2;


% ----- 指数分布 -----

%W=exprnd(1,1,N);

zhi=rand(1,N);
%W=-log(1-zhi);
W=-log(zhi);




if alpha~=1
   X1=S(alpha,beta);
   X2=sin(alpha*(U+B(alpha,beta)))./(cos(U)).^(1/alpha);
   %X2=sin(alpha*(U-B(alpha,beta)))./(cos(U)).^(1/alpha);
   X3=(cos(U-alpha*(U+B(alpha,beta)))./W).^(1/alpha-1);
   %X3=(cos(U-alpha*(U-B(alpha,beta)))./W).^(1/alpha-1);
   X=X1.*X2.*X3;
else
    X=(2/pi)*( (pi/2+beta*U).*tan(U)-beta*log( 0.5*pi*W.*cos(U)./(pi/2+beta*U) ) );
    %X=(2/pi)*( (pi/2+beta*U).*(U)-beta*log( W.*cos(U)./(pi/2+beta*U) ) );
end



if alpha~=1
    Y=gama*X+miu;

else
    Y=gama*X+miu+(2/pi)*beta*gama*log(gama);
end




function y=B(alpha,beta)
y=atan(beta*tan(pi*alpha/2))/alpha;



function y=S(alpha,beta)
y=(1 + beta^2 * (tan(pi*alpha/2)) ^ 2  ) ^   (1/(2*alpha));






%-----------------------------------------------------------------------
%  This program generate an ARPHA-Stable random 
%  signal.

function [sas]=sasd(N,arpha)



pi2=pi/2;

beta=0;

zl=N;
% ----- 均匀分布 -----

nuni=rand(zl,1);
nunip=(nuni*pi)-pi2;

% ----- 指数分布 -----

zhi=rand(zl,1);
zhi1=-log(1-zhi);

% ----- ARPHA 稳定信号 ------

if arpha==1
    beta_a=beta;
    gamma_a=pi2;
    phi_0=0;
else
    ka=1-abs(1-arpha);
    beta_a=2*atan(beta*tan(pi*arpha/2))/(pi*ka);
    gamma_b=cos(pi*beta_a*ka/2);
    phi_0=-0.5*pi*beta_a*(ka/arpha);
end

ee=1-arpha;
tau=-ee*tan(arpha*phi_0);
a=tan(0.5*nunip);
b=tan(0.5*ee*nunip);

z=(cos(ee*nunip)-tan(arpha*phi_0)*sin(ee*nunip))./(zhi1.*cos(nunip));

if arpha==1
    d=0;
    B=0;
else
    d=(z.^(ee/arpha)-1)/ee;
    B=tan(b)./(0.5*ee*nunip);
end

y1=2*(a-b).*(1+a.*b)-tau*nunip.*B.*(b.*(1-a.*a)-2*a);
y2=(1-a.*a).*(1+b.*b);
sas=(y1./y2).*(1+ee*d)+tau.*d;




alphastring=num2str(arpha);



⌨️ 快捷键说明

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