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

📄 muduwb_synchronization_fs.m

📁 UWB接收机的同步估计算法 能有效实现接收信号的同步
💻 M
字号:
%-------------------------------------------------------------------------
%synchronization: all search method 定了

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

clear all;close all;
datanum=1024;%512
M=datanum*2;
repeatnum=1;%==============OUT circulation, different data
iterate=1;%======Inner circulation, same data
% SIGMA =0.506;%=ADD NOISE:.402 .4256 . .451 .4775 .506 .5358 .5675 .6012 .6369 .6747 .7146 .7569 .8018 .8493 .8996(0dB) .9216 1.0093 1.0692 1.1325
%K = input('输入用户数目[1,15] K = ');
K=15;%max=15 
Tmin=0.1;
algorithp =1;% input('输入采用何种算法更新训练权系数[0-LMS,1-RLS] algorithp = ');
%--------------------------------------------------------------------------
%Multiple=2;
SY = 400;%data for synchronization
PN=400;%data for trainning after synchronization
TH=0.9;% no use
%M = input('输入帧长度 M = '); % 20000
%M=256*Multiple;
L=15;%一个比特的脉冲个数。
% fs =1;
across=2;
bit_extension=across*90;
total_all_rate=zeros(14,6);
 last_shift=zeros(6,14,K);

% encoder_BER=zeros(3,21);
% decoder_BER=zeros(3,21);
 for fs=1:1
     zz=0;
%     for across=8:8         for db=1.0:-0.5:1.0
 SIGMA=sqrt(0.80925/10^(0.1*db));
 zz=zz+1
%===============================================================================================================
Channel_Out_Data=load('d:\Channel2_Out_Data');%from impulse_response_DS.m
%ploting=Channel_Out_Data';
tailend=length(Channel_Out_Data(1,:));
%Fix_Train=fixsequence(K,PN);%产生fixed训练比特

Fix_Train=signalxy(K,SY);%产生random训练比特,并不固定
Channel_across=zeros(K,tailend+90*SY);
for jj=1:K%K selected
    for i=1:SY
        Channel_across(jj,(i-1)*90+1:(i-1)*90+fix(tailend))=Channel_across(jj,(i-1)*90+1:(i-1)*90+fix(tailend))+Fix_Train(jj,i)*Channel_Out_Data(jj,:);
    end
end
aa=Channel_across(1,15*fix(90/fs)+1:16*fix(90/fs));%取一个符号看看
Channel_sum=sum(Channel_across);%When K>1
%Channel_sum=Channel_across;%When K=1
% plot(Channel_sum(1,1000:2200));
% figure
% plot(Channel_across(1,1000:2200));
%-------------------对Channel_sum进行采样---------------------

% %fs = input('输入采样速率 fs = ');
%  Channel_sum_ts = zeros(1,fix(length(Channel_sum)/fs));
% 
% for i=1:fix(length(Channel_sum)/fs)         
%     Channel_sum_ts(i) = Channel_sum(fs*i);
% end
%-------------------叠加高斯白噪声-------------------
% 
% %open = input('是否加入高斯噪声(0-no;1-yes) open = ');
open =1;
%length(Channel_sum_ts);
noise = zeros(1,length(Channel_sum));
% 
% tempnoise1 = zeros(1,fix(90/fs));
% 
% tempnoise2 = zeros(1,fix(bit_extension/fs));
% 
if(open==1) % 考虑高斯噪声        
 MU = zeros(1,length(Channel_sum));    
 noise = normrnd(MU,SIGMA);  
     Channel_sum = Channel_sum+noise;

end
% 
 %==============================MMSE==============================
 %--------------------Training Stage-----------------------
 
% %algorithp = 1;
% %PN = input('输入训练比特数目 PN = ');
%  Sign_Train=signalxy(K,SY);% A function to add random data to all users.
 error = zeros(1,SY);
 %error_maxi = zeros(1,2*90/fs);
% Sign_Train_add_B=zeros(K,SY+M+10);
% for jj=1:K
% Sign_Train_add_B(jj,1:SY)=Sign_Train(jj,:);
% end

 u = zeros(1,fix(bit_extension));
 uu = zeros(1,fix(bit_extension/fs));
 %last_shift=zeros(1,K);
 for jj = 13:K%K每个用户分别同步
nn=0;
shift=0;
stepsize=fix(90);
count=0;
error_maxi=zeros(1,3);
error_shift = zeros(1,3);
 syn=zeros(1,8);
 shift_syn=zeros(1,8);

NUM = fix(tailend/90)/2;%除2表示NUM取一个脉冲多径长度的一半
    for nn=1:NUM-1%同步偏移,以字符长度为单位,最多一个脉冲的多径长度
         % 采用RLS算法的参数
 diat = 1;
 nmda = 0.999; 
 I = eye(fix(bit_extension/fs)); 
 w = zeros(fix(bit_extension/fs),1); % 初使化用户的权值  
 P = diat*I;
  
        
       for i = 1:SY % 训练比特数,每偏移一次,训练SY 个。
           
           u(1,1:fix(bit_extension)) =   Channel_sum(1,((i-1)+(nn-1))*90+1:(across+(i-1)+(nn-1))*90);  
           for l=1:fix(length(u)/fs)         
           uu(l) = u(fs*l);
           end

        %     %-----------------画误差曲线图----------------
    
    temp = 0;
    
        temp = abs(Fix_Train(jj,i) - w(:,1)'*uu');
        
         %temp = temp + abs(b(jj,i) - w(:,jj)'*u');
        error(1,i) = temp;% 各用户第i个比特训练误差
       
    
           if(algorithp==1)
    
            pai = uu*P;% for all users
    
             k = pai'/(nmda+pai*uu'); % for all users
    
            w(:,1) = w(:,1) + (Fix_Train(jj,i) - w(:,1)'*uu')*k; % for different users ,RLS
        
            P = (P-k*pai)/nmda; % for all users
    
           elseif(algorithp==0)
    
              if(i<SY/2)
        
              mlms = 0.0032;
            
              else
            
              mlms = 0.0005;
            
              end
        
            w(:,1) = w(:,1) + mlms*(Fix_Train(jj,i) - w(:,1)'*uu')*uu'; % for different users ,LMS
    
           end   

       end%i
     %----------------------------------------------
%--------------判断是否同步--------------
% MSE = std(error(jj,SY-100:SY));
%       if (MEAN<0.5)&(MSE<0.5) 
%ee=error';

MAX(1,nn)=max(error(1,SY-300:SY));
MEAN(1,nn)=mean(error(1,SY-300:SY));
STD(1,nn)=std(error(1,SY-300:SY));
end%nn
 [C1,index1] = min(MAX);
 [C2,index2] = min(MEAN);
 [C3,index3] = min(STD);
 %[C,index] = [C2,index2];%Try every algorithm
 C = C2;
 index = index2;
 shift = (index-1)*fix(90)+1;

 syn(1,1)=C;
 error_maxi(1,1)=C;
 shift_syn(1,1)=shift;
 error_shift(1,1) = shift;
 stepsize = fix((90)/2);
 
 for n=2:8
 
  
   for ii=1:2
  diat = 1;
  nmda = 0.999; 
  I = eye(fix(bit_extension/fs)); 
  w = zeros(fix(bit_extension/fs),1); % 初使化用户的权值  
  P = diat*I;
     
          if (ii==1)
          shift = shift+stepsize;
         else
       
          shift = shift-2*stepsize;
            if (shift <=0)
              shift = stepsize;%shift=fix(stepsize/2)+1;
            end
              
         end
         

   for i = 1:SY % 训练比特数,每偏移一次,训练SY 个。
           
           u(1,1:fix(bit_extension)) =   Channel_sum(1,(i-1)*90+shift:(across+(i-1))*90+shift-1);  
            for l=1:fix(length(u)/fs)         
           uu(l) = u(fs*l);
           end
        %     %-----------------画误差曲线图----------------
    
        temp = 0;
    
        temp = abs(Fix_Train(jj,i) - w(:,1)'*uu');
        
         %temp = temp + abs(b(jj,i) - w(:,jj)'*u');
        error(1,i) = temp;% 各用户第i个比特训练误差
       
    
           if(algorithp==1)
    
            pai = uu*P;% for all users
    
             k = pai'/(nmda+pai*uu'); % for all users
    
            w(:,1) = w(:,1) + (Fix_Train(jj,i) - w(:,1)'*uu')*k; % for different users ,RLS
        
            P = (P-k*pai)/nmda; % for all users
    
           elseif(algorithp==0)
    
              if(i<SY/2)
        
              mlms = 0.0032;
            
              else
            
              mlms = 0.0005;
            
              end
        
            w(:,1) = w(:,1) + mlms*(Fix_Train(jj,i) - w(:,1)'*uu')*uu'; % for different users ,LMS
    
           end   

       end%i
     %-------------------change shift------------
      
    
     error_maxi(1,ii+1)=mean(error(1,SY-300:SY));
     error_shift(1,ii+1) = shift;
 end%ii
    [syn(1,n),temp] = min(error_maxi);
shift_syn(1,n) = error_shift(1,temp);
    shift = error_shift(1,temp);
     error_maxi(1,1)=syn(1,n);
     error_shift(1,1) = shift_syn(1,n);
    
      if abs(stepsize)==1
      break;
      end
     stepsize=fix(abs(stepsize/2));

  end%n
 syn(1,n)
 
 last_shift(fs,zz,jj) =shift_syn(1,n)
   jj
%    figure
%     hold on;
% 
%    title('每个用户达到同步时的最大判决误差曲线(Eb/No=dB)');
% 
%    xlabel('比特数');
% 
%    ylabel('误差值');
%    %for jj=1:K
%    plot(error_count(index,:),'r--'); 
%  
%   % hold on;
%   % plot(error(2,:),'g--');
%   %end
%   %plot(errord,'g--');
% 
%   line = ones(1,SY);
%  
%   plot(line);
end%jj
%========synchronous end ==================================================
Sign_Train_add_B=zeros(K,PN+M+10);
Sign_Train=signalxy(K,PN);
for jj=1:K%K
Sign_Train_add_B(jj,1:PN)=Sign_Train(jj,:);
end
sumsnr=zeros(K,1);
sumerror=0;
errord = zeros(1,repeatnum*M+PN);
data=signalxy10(K,M);%Why?
b = zeros(K,M);

for jj = 1:K

    for i = 1:M 

        % 用户 jj 的第 i 个比特

        temp = data(jj,i);%改encoderout!

        if temp ==0

            b(jj,i) = -1;

        else

            b(jj,i) = +1;

        end

    end    
Sign_Train_add_B(jj,PN+1:PN+M)=b(jj,:);

end%jj
Channel_across=zeros(K,tailend+90*(PN+M+10));%change length


for jj=1:K%K
    for i=1:PN+M
        Channel_across(jj,(i-1)*90+1:(i-1)*90+fix(tailend))=Channel_across(jj,(i-1)*90+1:(i-1)*90+fix(tailend))+Sign_Train_add_B(jj,i)*Channel_Out_Data(jj,:);
    end
end
Channel_sum=sum(Channel_across);%When K>1
%Channel_sum=Channel_across;%When K=1

%-------------------对Channel_sum进行采样---------------------

%fs = input('输入采样速率 fs = ');
%  Channel_sum_ts = zeros(1,fix(length(Channel_sum)/fs));
% 
% for i=1:fix(length(Channel_sum)/fs)         
%     Channel_sum_ts(i) = Channel_sum(fs*i);
% end
%-------------------叠加高斯白噪声-------------------
% 
% %open = input('是否加入高斯噪声(0-no;1-yes) open = ');
open =1;
%length(Channel_sum_ts);
noise = zeros(1,length(Channel_sum));
% 
% tempnoise1 = zeros(1,fix(90/fs));
% 
% tempnoise2 = zeros(1,fix(bit_extension/fs));
% 
if(open==1) % 考虑高斯噪声        
 MU = zeros(1,length(Channel_sum));    
 noise = normrnd(MU,SIGMA);  
     Channel_sum = Channel_sum+noise;

end
% 

u = zeros(1,fix(bit_extension)); 
 uu = zeros(1,fix(bit_extension/fs));

errorT=zeros(K,PN+M);
ben = zeros(1,K); % 每个用户判决错误比特个数
soft_out = zeros(K,M);
total_all = 0; % 所有用户判决错误的总比特数
w = zeros(fix(bit_extension/fs),K); % 重新初使化用户的权值  

for jj=13:K%K selected
    
  for i = 1:PN % 训练比特数
       u(1,1:fix(bit_extension)) =   Channel_sum(1,(i-1)*90+last_shift(fs,zz,jj):(across+(i-1))*90+last_shift(fs,zz,jj)-1);  
        for l=1:fix(length(u)/fs)         
           uu(l) = u(fs*l);
           end
           %     %-----------------画误差曲线图----------------
    
    temp = 0;
    
        temp = abs(Sign_Train(jj,i) - w(:,jj)'*uu');
        
         %temp = temp + abs(b(jj,i) - w(:,jj)'*u');
        errorT(jj,i) = temp;% 各用户第i个比特训练误差
       
    
           if(algorithp==1)
    
            pai = uu*P;% for all users
    
             k = pai'/(nmda+pai*uu'); % for all users
    
            w(:,jj) = w(:,jj) + (Sign_Train(jj,i) - w(:,jj)'*uu')*k; % for different users ,RLS
        
            P = (P-k*pai)/nmda; % for all users
    
           elseif(algorithp==0)
    
              if(i<PN/2)
        
              mlms = 0.0032;
            
              else
            
              mlms = 0.0005;
            
              end
        
            w(:,jj) = w(:,jj) + mlms*(Sign_Train(jj,i) - w(:,jj)'*uu')*uu'; % for different users ,LMS
    
           end   

   end  %i
   
   for i = PN+1:PN+M % 训练比特数
       u(1,1:fix(bit_extension)) =   Channel_sum(1,(i-1)*90+last_shift(fs,zz,jj):(across+(i-1))*90+last_shift(fs,zz,jj)-1);
        for l=1:fix(length(u)/fs) %sample        
           uu(l) = u(fs*l);
           end
           %     %-----------------画误差曲线图----------------
    
    temp = 0;
    
        temp = abs(Sign_Train_add_B(jj,i) - w(:,jj)'*uu');
        
         %temp = temp + abs(b(jj,i) - w(:,jj)'*u');
        errorT(jj,i) = temp;% 各用户第i个比特误差
            if(Sign_Train_add_B(jj,i)~=sign(uu*w(:,jj)))
            
                ben(jj) = ben(jj) + 1;
            
                total_all = total_all + 1;
            
            end
    
           if(algorithp==1)
    
            pai = uu*P;% for all users
    
             k = pai'/(nmda+pai*uu'); % for all users
    
            w(:,jj) = w(:,jj) + (Sign_Train_add_B(jj,i) - w(:,jj)'*uu')*k; % for different users ,RLS
        
            P = (P-k*pai)/nmda; % for all users
    
           elseif(algorithp==0)
    
              if(i<PN/2)
        
              mlms = 0.0032;
            
              else
            
              mlms = 0.0005;
            
              end
        
            w(:,jj) = w(:,jj) + mlms*(Sign_Train_add_B(jj,i) - w(:,jj)'*uu')*uu'; % for different users ,LMS
    
           end   

   end  %i
end%jj
   %errord = zeros(1,repeatnum*M+PN);
ben_rate=ben./(M);

total_all_rate(zz,fs)=total_all/((M)*K);
end%db:zz
end%fs
% 
%     
% 
% 

⌨️ 快捷键说明

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