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

传真(Fax)编程

开发平台:

Matlab

  1. function   [user_subc_alloc , mod_subc ,pwr_subc ,pad_bit_cnt] = adpt_mod_para... 
  2.                 ( coded_user_bit,N_sym,Idx_data ,AllocMethod , AdptMethod, H , var_noise, TargetBer );
  3.             
  4. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5. % 功能:自适应调制和多用户复用
  6. % 输入:     coded_user_bit, 输入用户比特序列,为cell结构
  7. %           N_sym, 本帧中的OFDM符号个数
  8. %           Idx_data, 数据OFDM符号的子载波标号
  9. %           AllocMethod, 子载波分配方法
  10. %           AdptMethod, 自适应调制方法
  11. %           H, 频域信道响应
  12. %           var_noise, 噪声样点的功率
  13. %           TargetBer, 目标误比特率
  14. %输出:      user_subc_alloc, 用户分配的子载波序号,为cell结构
  15. %           pad_bit_cnt, 为保证用户比特在调制器中能正确调制,需要填充的比特数
  16. %           mod_subc, 用户对应user_subc_alloc子载波上的调制方式,为cell结构
  17. %           pwr_subc, 用户对应user_subc_alloc子载波上的功率,为cell结构 
  18.             
  19. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  20. if nargin == 4
  21.     
  22. %   多用户,使用固定或动态子载波分配,不需要自适应调制    
  23.     N_user = size(coded_user_bit,2);
  24.     num_subc_user = length(Idx_data) / N_user ;   % 平均分配,每个用户的子载波数
  25.     user_subc_alloc = cell(1,N_user);
  26.     mod_subc = cell(1,N_user);
  27.     pwr_subc = cell(1,N_user);
  28.     
  29.     for u = 1:N_user
  30.         % 先计算出为保证所有用户的比特恰好分完, 需要填充的比特数, 在本帧末尾填充零
  31.         % 每个用户每个OFDM符号的比特数
  32.         userbit_sym = length(coded_user_bit{u})/N_sym;     
  33.         % 每个用户使用的调制方式
  34.         mod_user = ceil(userbit_sym / num_subc_user);     
  35.          % 调制方式对应: 1--BPSK调制, 2--QPSK调制,3--8PSK调制, 4--16QAM调制,6--64QAM调制
  36.         if mod_user > 6
  37.             error('单个用户比特数太多,无法进行调制,子程序adpt_mod_para出错!');
  38.         elseif mod_user == 5 
  39.             mod_user = 6;                  
  40.         end                                  
  41.         pad_bit_cnt(u) = mod_user * num_subc_user * N_sym - length(coded_user_bit{u}) ;
  42.     
  43.     
  44.         % 然后根据选择的固定子载波分配方法( 1--相邻分配, 2--交织分配, 3---跳频分配 )
  45.         % 把子载波均匀地分配给用户. 用户的比特数不同, 会造成不同用户的调制方式和
  46.         % 填充比特数的不同
  47.     
  48.         switch AllocMethod
  49.            
  50.         case    1           % 相邻分配 
  51.             %user_subc_alloc((u-1)*num_subc_user + 1: u*num_subc_user) = u;
  52.             user_subc_alloc{u} = Idx_data((u-1)*num_subc_user + 1: u*num_subc_user)';
  53.             mod_subc{u} = mod_user*ones(num_subc_user, 1);
  54.             pwr_subc{u} = ones(num_subc_user,1);
  55.             
  56.         case    2           % 交织分配
  57.             
  58.         case    3           % 跳频分配 
  59.             
  60.         case    4           % 自适应分配
  61.         
  62.         otherwise
  63.         
  64.         end
  65.     
  66.     end
  67.     
  68. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  69. else
  70.     % 单用户,有自适应调制,多用户子载波分配方法由AllocMethod确定, 自适应调制方法由AdptMethod确定
  71.     
  72.     % 如果使用固定子载波分配方法
  73.     if (AllocMethod == 1) | (AllocMethod == 2) | (AllocMethod == 3)
  74.         
  75.         N_user = size(coded_user_bit,2);
  76.         N_data = length(Idx_data);
  77.         % 平均分配,每个用户的子载波数
  78.         num_subc_user = N_data / N_user;   
  79.         user_subc_alloc = cell(1,N_user);
  80.         mod_subc = cell(1,N_user);
  81.         pwr_subc = cell(1,N_user);
  82.         
  83.         for u = 1:N_user
  84.             
  85.             % 先计算出,为保证每个用户每个OFDM符号的比特数为调整步长的整数倍, 需要填充的比特数
  86.             % 如果使用基于功率梯度最小的QAM 算法, 分配给各子载波的比特数为0,2,4,6, 步长为2
  87.             step = 2;
  88.             
  89.             % 每个用户本帧需要填充的比特数      
  90.             if mod(length(coded_user_bit{u}) , step*N_sym) ~= 0
  91.                 pad_bit_cnt(u) = step*N_sym - mod(length(coded_user_bit{u}) , step*N_sym);
  92.             else
  93.                 pad_bit_cnt(u) = 0;
  94.             end
  95.             
  96.             % 每个用户每个OFDM符号的比特数
  97.             num_userbit_sym = (length(coded_user_bit{u}) + pad_bit_cnt(u))/N_sym;
  98.    
  99.             switch AllocMethod
  100.                 case    1           % 相邻分配
  101.                     %user_subc_alloc((u-1)*num_subc_user + 1: u*num_subc_user) = u;
  102.                     user_subc_alloc{u} = Idx_data((u-1)*num_subc_user + 1: u*num_subc_user)';
  103.                     %mod_subc{u} = mod_user*ones(num_subc_user, 1);
  104.                     %pwr_subc{u} = ones(num_subc_user,1);
  105.             
  106.                 case    2           % 交织分配
  107.             
  108.                 case    3           % 跳频分配 
  109.         
  110.                 otherwise
  111.             end
  112.             
  113.             % 当前用户对应子载波的信道相应
  114.             H_user = H{u}(user_subc_alloc{u},1,1);             
  115.             
  116.             switch AdptMethod
  117.                 % 自适应调制方法1, 给功率增加最小的子载波分配比特和功率
  118.                 case    1               
  119.                     [mod_subc{u},pwr_subc{u}]=adaptive_power1(H_user,TargetBer,...
  120.                                           num_subc_user,var_noise,num_userbit_sym);
  121.                                                           
  122.                 % 自适应调制方法2, 按照信道响应降序排列,子载波间争夺比特
  123.                 case    2               
  124.                     mod_subc{u} =adaptive(H_user,num_subc_user,num_userbit_sym);
  125.                     pwr_subc{u} = ones(num_subc_user,1);
  126.                     
  127.                 otherwise
  128.             end
  129.     
  130.         end
  131.         
  132.     elseif  (AllocMethod == 4)           % 自适应子载波分配
  133.         
  134.         % 自适应子载波和比特功率分配
  135.         for u = 1:N_user
  136.             % 先计算需要填充的比特数
  137.             step = 2;
  138.             % 每个用户本帧需要填充的比特数              
  139.             pad_bit_cnt(u) = step*N_sym - mod(length(coded_user_bit{u}) , step*N_sym);
  140.             % 每个用户每个OFDM符号的比特数
  141.             num_userbit_sym(u) = (length(coded_user_bit{u}) + pad_bit_cnt(u))/N_sym;
  142.         end
  143.         % 此函数未写
  144.         % adaptive_pwr_subc ( H(:,1) ,N_data, var_noise, num_userbit_sym );
  145.         
  146.     end
  147.     
  148. end