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

传真(Fax)编程

开发平台:

Matlab

  1. function mod_sym =  modulator(coded_user_bit,user_subc_alloc,mod_subc,...
  2.                    pwr_subc, pad_bit_cnt ,N_subc ,N_sym, AdptMod);
  3. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4. % 功能: 如果有自适应调制,进行逐用户,逐OFDM符号,逐子载波的星座调制
  5. %       此步骤比较费时, 但是因为各个子载波调制方式不同 , 无法使用向量进行调制 
  6. %       而如果没有自适应调制,则进行逐用户,逐OFDM符号的星座调制
  7. %       使用向量进行调制,速度较快
  8. % 输入: 
  9. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  10. mod_sym = zeros(N_subc,N_sym);
  11. N_user = length(coded_user_bit);
  12. for u = 1:N_user
  13.     % 功率归一化
  14.     pwr_subc{u} = pwr_subc{u}./( sum(pwr_subc{u}) / length(pwr_subc{u}) );
  15.     % 用户输入数据的指针
  16.     pointer = 1;   
  17.     % 先按照pad_bit_cnt, 在每个用户的数据比特序列后补零
  18.     coded_user_bit{u} = [ coded_user_bit{u} ;zeros(pad_bit_cnt(u),1)];
  19.     % 然后建立OFDM符号的循环, 以及本符号内用户子载波的循环
  20.     for n = 1:N_sym
  21.         
  22.         %有自适应调制
  23.         if AdptMod == 1
  24.             for k = 1:length(user_subc_alloc{u})
  25.                 % 第u个用户,第n个OFDM符号,第k个子载波序号
  26.                 subc_k = user_subc_alloc{u}(k);
  27.                 % 对应的调制方式
  28.                 bit_k = mod_subc{u}(k);
  29.                 if bit_k ~= 0
  30.                     % 对应的功率
  31.                     pwr_k = pwr_subc{u}(k);
  32.                     % 取出用于调制的比特
  33.                     bit_to_mod = coded_user_bit{u}( pointer : pointer + bit_k -1);
  34.                     pointer = pointer + bit_k;
  35.                     % 此函数可以根据输入的比特序列长度,进行调制
  36.                     sym = modu_sym(bit_to_mod);
  37.                     
  38.                     % 不能乘相应的功率因子! 因为如果是QAM调制,乘功率因子变化了
  39.                     % 幅度, 就有可能判错!!!!            
  40.                     % mod_sym(subc_k, n) = sym * pwr_k; % 错误!!
  41.                     mod_sym(subc_k, n) = sym ;          % 正确
  42.                 else
  43.                     mod_sym(subc_k, n) = 0;
  44.                 end
  45.             end
  46.         %没有自适应调制    
  47.         else
  48.             % 当前用户,当前OFDM符号,所有子载波的比特数(调制方式相同)
  49.             mod_type = mod_subc{u}(1);
  50.             tmp = length(user_subc_alloc{u})*mod_type;
  51.             % 取出用于调制的比特, 并变换为modu_sym认可的输入形式
  52.             tmp_bit = coded_user_bit{u}(pointer : pointer + tmp - 1);
  53.             pointer = pointer + tmp;
  54.             bit_to_mod = reshape(tmp_bit, mod_type , tmp/mod_type);
  55.             sym = modu_sym (bit_to_mod);
  56.             % 乘上相应的功率因子, 把符号放到对应的子载波上
  57.             mod_sym(user_subc_alloc{u}, n) = sym.' .* pwr_subc{u};
  58.         end
  59.     end
  60.     
  61. end
  62.