pilot_insert.m
上传用户:look542
上传日期:2009-06-04
资源大小:784k
文件大小:6k
源码类别:

传真(Fax)编程

开发平台:

Matlab

  1. function [pilot_added ,known_pilot] = pilot_insert(st_coded,N_pilot_sym_ts,N_data_sym_ts,N_ts,Pos_pilot_sym,...
  2.     Pos_data_sym,Idx_pilot,PilotValue,N_subc,Idx_used,N_Tx_ant,L_delay,MIMO_CE_Method ,SwitchOrthogonalPilot);
  3. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4. % 在数据OFDM符号中加间隔的导频,并在数据符号帧之间插入导频OFDM符号
  5. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6. % 加导频OFDM符号,共加入 N_pilot_sym_ts*N_ts*N_Tx_ant 个,用于信道估计. 导频OFDM符号是伪随机序列
  7. PN_seq = mseq( 12 , [2 4 7 10] , [1 1 1 1 0 0 0 0 0 0 0 0], N_pilot_sym_ts*N_ts*N_Tx_ant);
  8. % BPSK调制导频符号
  9. PN_seq = 2*PN_seq' - 1; 
  10. tmp = PN_seq(1:length(Idx_used) , :);
  11. %  插入的导频值
  12.  PN_seq1 = mseq( 12 , [2 4 7 10] , [1 1 0 1 0 0 0 1 0 1 0 0], 1);
  13. PN_seq2 = mseq( 12 , [1 3 5] , [0 0 0 1 0 1 0 0 0 1 0 0], 1);
  14. PN_seq3 = mseq( 12 , [3 5 10] , [0 0 1 1 0 1 1 0 0 1 1 0], 1);
  15. PN_seq4 = mseq( 12 , [6 8 9] , [ 1 0 1 0 1 0 0 1 1 1 0 1], 1);
  16. % For Orthogonal Design Pilot . 
  17. tmp = 2*PN_seq1(1:length(Idx_used))' - 1; 
  18. % For Non-Orthogonal Design Pilot . 
  19. tmp1 = tmp;
  20. tmp2 = tmp*exp(j*pi/2);
  21. tmp3 = tmp*exp(j*pi);
  22. tmp4 = tmp*exp(j*3*pi/2);
  23. % 为返回变量预先定义存储空间
  24. pilot_added = zeros(N_subc,N_ts*(N_pilot_sym_ts + N_data_sym_ts), N_Tx_ant);
  25. known_pilot = zeros(N_subc,N_ts*N_pilot_sym_ts,N_Tx_ant);
  26. % 中间变量
  27. pilot_ofdm_sym = zeros(N_subc,N_pilot_sym_ts);
  28. N_used = length(Idx_used);
  29. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  30. for ant = 1:N_Tx_ant
  31.     % 加数据OFDM符号中的间隔导频,用于同步
  32.     st_coded(Idx_pilot,:,ant) = repmat(PilotValue,1,size(st_coded,2));
  33.     
  34.     % 每个时隙加入的导频OFDM符号N_pilot_sym_ts个,放在位置Pos_pilot_sym上
  35.     % 如果是单天线,则接收机分别估计出导频位置的频域信道响应,然后进行时域插值
  36.     % 如果是多天线,则不同发送天线的导频不同,接收机分别估计导频位置的频域信道响应,然后进行时域插值
  37.     
  38.     for ts = 1:N_ts
  39.         pilot_ofdm_sym = zeros(N_used,N_pilot_sym_ts);
  40.         % 此处加入不同的插导频的方法
  41.         
  42.         if (N_Tx_ant~= 1) & (MIMO_CE_Method == 1)
  43.             % 得到当前时隙的导频符号,注意:导频OFDM符号和数据OFDM符号的功率相同,都需要进行发送天线归一化! 
  44.             %pilot_ofdm_sym(Idx_used,:) = PN_seq( 1:length(Idx_used) ,(ant + ts - 2)*N_pilot_sym_ts + 1: ...
  45.             %    (ant + ts - 2)*N_pilot_sym_ts + N_pilot_sym_ts ) / sqrt(N_Tx_ant) ;
  46.             
  47.             % 为简化接收机复杂度,假设不同时隙,不同导频位置的PN序列相同
  48.             pilot_ofdm_sym(Idx_used,:) = repmat( PN_seq( 1:length(Idx_used) ,ant) / sqrt(N_Tx_ant) , 1 ,N_pilot_sym_ts);
  49.             
  50.         elseif (N_Tx_ant~= 1) & (MIMO_CE_Method == 2)
  51.             % 使用不同发送天线正交的训练序列
  52.             % Imad Barhumi提出的训练序列,满足相位旋转正交特性
  53.             pilot_ofdm_sym(Idx_used,:) = repmat(exp(-j*2*pi*ant*L_delay.*[0:N_used-1]'/N_used),1,N_pilot_sym_ts) / sqrt(N_Tx_ant) ;
  54.             
  55.         elseif (N_Tx_ant~= 1) & (MIMO_CE_Method == 3)
  56.             % 使用不同发送天线正交的训练序列,加权信道估计改进
  57.             pilot_ofdm_sym(Idx_used,:) = repmat(exp(-j*2*pi*ant*L_delay.*[0:N_used-1]'/N_used),1,N_pilot_sym_ts) / sqrt(N_Tx_ant);
  58.             
  59.         elseif (N_Tx_ant~= 1) & (MIMO_CE_Method == 4)
  60.             % 使用不同发送天线正交的训练序列,Robust信道估计改进
  61.             pilot_ofdm_sym(Idx_used,:) = repmat(exp(-j*2*pi*ant*L_delay.*[0:N_used-1]'/N_used),1,N_pilot_sym_ts) / sqrt(N_Tx_ant);
  62.             
  63.         elseif (N_Tx_ant~= 1) & (MIMO_CE_Method == 5)
  64.             % 不同的发送天线使用不同的子载波间隔传导频
  65.             tmp = PN_seq( 1:length(Idx_used)/N_Tx_ant ,(ant + ts - 2)*N_pilot_sym_ts + 1: ...
  66.                 (ant + ts - 2)*N_pilot_sym_ts + N_pilot_sym_ts );
  67.             Idx_ant = Idx_used(ant:N_Tx_ant:length(Idx_used));
  68.             pilot_ofdm_sym(Idx_ant,:) = tmp / sqrt(N_Tx_ant);
  69.             
  70.             
  71.         elseif (N_Tx_ant~= 1) & (MIMO_CE_Method == 6)
  72.             % 使用类似Walsh码的结构,得到不同位置导频符号的值
  73.             
  74.             if N_Tx_ant == 2
  75.                 if SwitchOrthogonalPilot == 1
  76.                     %%%%%%%%%%%%%% Orthogonal design
  77.                     if ant == 1
  78.                         pilot_ofdm_sym(Idx_used,:) = [ tmp tmp ];
  79.                     elseif ant == 2    
  80.                         pilot_ofdm_sym(Idx_used,:) = [ tmp  -tmp ];
  81.                     end
  82.                 elseif SwitchOrthogonalPilot == 0
  83.                     %%%%%%%%%%%%%% Non-Orthogonal design
  84.                     if ant == 1
  85.                         pilot_ofdm_sym(Idx_used,:) = [ tmp1 tmp2 ];
  86.                     elseif ant == 2    
  87.                         pilot_ofdm_sym(Idx_used,:) = [ tmp3  tmp4 ];
  88.                     end
  89.                 end
  90.                 
  91.                 
  92.             elseif N_Tx_ant == 4
  93.                 if ant == 1
  94.                     pilot_ofdm_sym(Idx_used,:) = [ tmp tmp tmp tmp];
  95.                 elseif ant == 2    
  96.                     pilot_ofdm_sym(Idx_used,:) = [ tmp tmp -tmp -tmp];
  97.                 elseif ant == 3    
  98.                     pilot_ofdm_sym(Idx_used,:) = [ tmp -tmp tmp -tmp];
  99.                 elseif ant == 4    
  100.                     pilot_ofdm_sym(Idx_used,:) = [ -tmp tmp tmp -tmp];
  101.                 end
  102.             end
  103.             
  104.         elseif  N_Tx_ant == 1
  105.             pilot_ofdm_sym(Idx_used,:) = repmat( PN_seq( 1:length(Idx_used) ,ant) / sqrt(N_Tx_ant) , 1 ,N_pilot_sym_ts);
  106.             
  107.         end
  108.         
  109.         % 把导频OFDM符号放在输出的时隙中
  110.         pilot_added(:,(ts-1)*(N_pilot_sym_ts + N_data_sym_ts) + Pos_pilot_sym, ant) = pilot_ofdm_sym;
  111.         % 把数据OFDM符号放在输出的时隙中
  112.         pilot_added(:,(ts-1)*(N_pilot_sym_ts + N_data_sym_ts) + Pos_data_sym, ant) = st_coded(:,(ts-1)*N_data_sym_ts + 1:ts*N_data_sym_ts,ant);
  113.         % 把发送的已知导频放在known_pilot中返回   
  114.         known_pilot(:,(ts-1)*N_pilot_sym_ts + 1 : ts*N_pilot_sym_ts , ant) = pilot_ofdm_sym;
  115.         
  116.     end
  117.     
  118. end