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

📄 tx3.m

📁 信道估计程序,对多用户,多入射角度情况进行仿真.
💻 M
字号:
function [E,G,T,L,Q]=tx3(TS_num,K,c)
Lm=144; %时隙中缀码长度144。
P=128; %基本中缀码长度128。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%初始化及变量赋值部分%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%BER=input('误比特率的要求BER=');
%TS_num=floor(100/BER/88)+1; %%仿真的时隙数,以时隙的最小比特数88为参考。
TS_interval=136;  %给一个合理的时隙间隔,使得在仿真的时间里信道变化可以忽略。
t=TS_num*(864+TS_interval)*675/864*0.000001; %仿真时间以秒为单位计算。
%K=zeros(1); %开辟存储空间以便调试和性能估计时查找参照。
%c=zeros(1); %小区序号,间接决定了扰码组(4个)和中缀码组(4个)序号。
l=zeros(1); %扰码的序号--4个码中的第几个,开辟内存空间存以便调试和性能估计时查找参照。
m=zeros(1,128); %基本中缀码集。
mid_num=zeros(1); %中缀码的序号4个码中的第几个,开辟内存空间存以便调试和性能估计时查找参照。

%c=input('小区的序号(1-32)c=');
mid_num=(c-1)*4; %与小区序号相关的中缀码组(四个基本中缀码)。
l=(c-1)*4+1; %小区的序号与之有关的扰码组(四个基本中缀码)。

x=0; %针对TS_num个时隙desired_k用户数据bit的存放数组的起始位置。
z=0; %针对TS_num个时隙desired_k用户时隙码片chip的存放数组的起始位置。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%基本中缀码%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  m=remidable(mid_num);%找出需要的中缀码;
  L=scramble(l);  %找出需要的扰码;
    %K=input('当前时隙激活的用户数(<=16)K=');
    %desired_k=input('要做性能估计的用户(<=K)=');
    W=floor(128/K);%由K决定的用户的无线信道冲激响应抽头数目W。
    
    m_1=zeros(1,Lm+(K-1)*W); %产生复中缀码的中间过程。
    M=zeros(K,Lm); %K个用户的复中缀码集合,每一行为一个用户所对应的复中缀码。
    
   
   
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%扩频码矩阵%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %if (K<=16) & (K>8) %第一步:由K决定的扩频因子Q的大小选择。
     % Q=16;
     %elseif (K<=8) & (K>4) %有待升级优化,根据扩频树的使用原则。
     % Q=randsrc(1,1,[16,8]);
     %elseif (K<=4) & (K>2)  
    %  Q=randsrc(1,1,[16,8,4]);
    %elseif (K<=2) & (K>1)    
   %   Q=randsrc(1,1,[16,8,4,2]);
   %else 
  %    Q=randsrc(1,1,[16,8,4,2]);
  %end
  Q=16;
  A=[1];T=zeros(Q); %扩频码矩阵。
  data_symbol_num=352*2/Q; %两部份数据段的符号数与扩频因子及码片数352(*2)的关系。
  data_bit_num=data_symbol_num*2; %2个比特产生一个符号。
  E=zeros(K,(864+TS_interval)*TS_num); %记录了K个用户仿真时间内的所有发送chip。
  G=zeros(K,data_bit_num*TS_num); %纪录了K个用户仿真时间内的所有源bit,初始化的容量以最大的可能bit数为参考。
    for i=1:log2(Q)
       A=[A A;
         A -A];
    end 
  if Q==1 %第二步:扩频码矩阵。
      C=[1];T=A*C;
    elseif Q==2
      C=[1;sqrt(-1)];
      for j=1:2
          T(j,:)=C(j,1).*A(j,:);
       end
    elseif Q==4
      C=[-sqrt(-1);1;sqrt(-1);-1];
      for j=1:4
          T(j,:)=C(j,1).*A(j,:);
       end
    elseif Q==8
      C=[1;sqrt(-1);sqrt(-1);-1;-sqrt(-1);-1;-sqrt(-1);1];
      for j=1:8
          T(j,:)=C(j,1).*A(j,:);
       end
  else
      C=[-1;-sqrt(-1);1;1;sqrt(-1);-1;-1;1;-sqrt(-1);sqrt(-1);1;sqrt(-1);-sqrt(-1);-sqrt(-1);sqrt(-1);-1]; 
      for j=1:16
          T(j,:)=C(j,1).*A(j,:);
       end
   end
  clear A C;
  clear A C;
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%当前时隙K个用户的复中缀码矩阵M%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %通过调用basic_midamble_codes(mid_num)得到当前时隙user_num个用户应使用的基本中缀码集mp。
    %由基本中缀码集导出K个用户的中缀码集。
     for n=1:Lm+(K-1)*W
          if n<=P
             m_1(n)=m(n);
          else
             m_1(n)=m_1(n-P);
          end   
     end
    %每个用户的复中缀码的分配情况。第K个用户使用m_1(1)到m_1(144),第一个用户使用到m(end)。
     for n=1:K
          for j=1:Lm
              M(n,j)=(sqrt(-1))^j*m_1(j+(K-n)*W);
          end
     end
     clear mp m m_1 n;
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                         TS_num个时隙的循环                                                %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for f=1:TS_num    
         %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
         %              循环K次产生K个用户的当前时隙                              %                           
         %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
          
         for k=1:K %产生一个时隙激活的K个不同用户。
               B=zeros(1,864); %初始化存放当前时隙当前用户的数组。
               S=zeros(1,704);
               D_1=zeros(1,352);
               D_2=zeros(1,352);
               symbol=zeros(1,data_symbol_num);
               data= randsrc(1,data_bit_num,[0 1]);%比特到复数符号的映射:(00 +j,01 +1,10 -1,11 -j)。///////改动11月18日
              
                   
                  for n=1:2:data_bit_num
                       if (data(n)==data(n+1)) 
                          if (data(n)==0)
                              symbol((n-1)/2+1)=+sqrt(-1);
                          else
                              symbol((n-1)/2+1)=-sqrt(-1);
                          end
                       elseif  (data(n)==0)
                              symbol((n-1)/2+1)=+1;
                       else   
                              symbol((n-1)/2+1)=-1;
                       end
                  end    
                  
                  
                  %%%扩频部分
                   for n=1:data_symbol_num 
                      for j=1:Q 
                          S((n-1)*Q+j)=symbol(n)*T(Q-k+1,j); %每个符号乘以扩频码。
                      end
                  end    
                  clear symbol n;
                 %%%查找扰码。
                  v=16; %扰码的长度。如果704/v不为整数则需改动程序!!!!
                  for n=1:352/v
                      for j=1:v
                          D_1((n-1)*v+j)=S((n-1)*v+j)*L(j); %以码片为基本单位对齐进行扰码。
                      end
                  end
                 for n=352/v+1:704/v
                      for j=1:v
                          D_2((n-1)*v+j-352)=S((n-1)*v+j)*L(j); %以码片为基本单位对齐进行扰码。S(n)由spreading.m得到。
                      end
                  end
                clear S n;
                %%%第k个用户的时隙比特。
                 for n=1:864+TS_interval
                     if n<=352
                        B(n)=D_1(n); %第一部分数据,可以考虑用矩阵D_1表示。
                     elseif (n>352) & (n<=496)
                        B(n)=M(k,n-352); %第k个用户的复中缀码。:)
                     elseif (n>496) & (n<=848)  
                        B(n)=D_2(n-496); %第二部分数据,可以考虑用矩阵D_2表示。
                     else 
                        B(n)=0; %保护间隔。 :)
                    end
                end
                  E(k,x+1:x+864+TS_interval)=B; %第k行存放第k个用户TS_num*864个chip。
                  G(k,z+1:z+data_bit_num)=data; %第k行存放第k个用户TS_num*data_bit_num个data(source)。
                clear B data n;  
          end %一个时隙K个用户循环完毕。
          x=x+864+TS_interval; %%下个时隙E存放起始位置下标变量。
          z=z+data_bit_num; %%下个时隙G存放起始位置下标变量
 end    
  y1=E(1,:);y2=G(1,:);
  clear W;
        
        

    

⌨️ 快捷键说明

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