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

传真(Fax)编程

开发平台:

Matlab

  1. function h_time = channel_gen( Power, Doppler, N_samlpe_ofdm, T_sample, N_ofdm, N_frame, idx_frame, N_Tx_ant, N_Rx_ant )
  2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3. % 得到时域信道的参数
  4. % 输入:    Power,  功率衰减向量(实际衰减,非dB值)
  5. %           Doppler,    多普勒频移(Hz)
  6. %           N_samlpe_ofdm,  每个OFDM符号占多少个样点,包括循环前缀
  7. %           T_sample,   时域样点时间间隔(秒)
  8. %           N_ofdm,     每帧中的OFDM符号个数
  9. %           N_frame,    仿真的帧总数目
  10. %           idx_frame,  当前的帧编号
  11. %           N_Tx_ant,   发送天线数
  12. %           N_Rx_ant,   接收天线数
  13. % 输出:   时域信道响应h_time, 安排如下:
  14. % 1) 不同行表示不同径的信道, 不同径独立, 已经乘以了功率衰减 ,共length(Delay)行
  15. % 2) 不同列表示本帧中的不同OFDM符号的信道,考虑每个OFDM符号的所有样点经历相同衰减,一个OFDM符号一个信道参数
  16. %    不同列时域信道响应的差异是由多普勒频移造成的,反映了信道的时变性。共N_ofdm列
  17. % 3) 不同矩阵第三维表示不同天线对之间的信道参数,不同天线之间独立,共N_Tx_ant * N_Rx_ant个
  18. %     其顺序为: 第1条发送天线和第1条接收天线(1-->1)的信道, 2-->1,...,N_Tx_ant-->1, ...,
  19. %     1-->2, 2-->2, ..., N_Tx_ant-->2,依次下去。
  20. %     单天线信道,设置 N_Tx_ant = N_Rx_ant = 1 即可
  21. % 说明:
  22. % 1) 调用本程序,程序根据当前帧的编号输出本帧的时域信道响应,多次调用,产生的不同帧信道参数独立
  23. % 2) 瑞利衰落系数产生的方法: 每条径的瑞利衰落系数序列由Jakes模型截取. 为保证不同径的瑞利衰落独立,
  24. % 不同天线的瑞利衰落独立, 我们截取的距离要等于或大于相干时间对应的多径时延样点数. 
  25. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  26. % 临时变量
  27. N_ant_pair = N_Tx_ant * N_Rx_ant;                       % 收发天线对数目
  28. N_path = length(Power);                                 % 多径数目
  29. min_fd = 1/(N_ofdm*N_samlpe_ofdm*T_sample*100);         % 是否使用Jakes模型的临界多普勒频移值
  30. Tc = round( 1/(Doppler * T_sample * N_samlpe_ofdm) );   % 相干时间对应的OFDM符号数
  31. T_sym = T_sample*N_samlpe_ofdm;                         % OFDM符号周期
  32. T_cut = Tc*12;                                          % 截取Jakes模型的变量
  33. Power = Power./sum(Power);                              % 功率归一化
  34. % 返回变量
  35. h_time = zeros(N_path , N_ofdm , N_ant_pair);
  36. % 如果多普勒频移大于预先设定最小值
  37. if Doppler > min_fd       
  38.     
  39.     % 否则如果是第1帧,生成所有帧,所有OFDM符号,所有径的瑞利衰落向量,并保存为数据文件
  40.     if idx_frame == 1
  41.         
  42.         % 计算需要产生的瑞利衰落样点序列的长度 fading_len
  43.         % 原则: 每条径使用的瑞利衰落系数要独立, 也就是截取Jakes模型时, 径和径之间的截取间隔要等于或
  44.         % 大于相干时间对应的OFDM符号数.
  45.         % 从产生的瑞利衰落的幅度图plot(abs(jakes_coff))可以看出, 前面一部分系数幅度变化不合理
  46.         % 我们加 T_cut, 目的是截取位置靠后,舍去前面幅度较大的部分
  47.         fading_len =  N_ofdm * N_frame * N_path * N_ant_pair  + Tc * N_frame * N_path * N_ant_pair + T_cut;
  48.         jakes_coff = Tap_Rayleigh_Jakes(Doppler , T_sym , fading_len );
  49.         
  50.         % 截取Jakes模型产生瑞利衰落序列
  51.         fading_trunc = jakes_coff(10*Tc + 1 : end );
  52.         
  53.         % 将Jakes模型产生的序列进行功率归一化
  54.         fading_jakes = fading_trunc./sqrt( sum(fading_trunc.*conj(fading_trunc)) / length(fading_trunc) );
  55.         
  56.         % 保存产生的瑞利衰落数据
  57.         save fading_jakes.mat fading_jakes;
  58.         
  59.     else
  60.         % 如果不是第一帧,调出保存的数据
  61.         load fading_jakes.mat;
  62.         
  63.     end
  64. end
  65. % 按照当前的帧编号,提取出本帧的数据, 并返回
  66. for ant = 1:N_ant_pair
  67.     for p = 1:N_path    
  68.         
  69.         if  Doppler > min_fd
  70.             % 每条径的瑞利衰落系数
  71.             fading_path = fading_jakes((ant - 1)*Tc + (p-1)*Tc + (idx_frame - 1)*Tc + 1: ...
  72.                 (ant - 1)*Tc + (p - 1)*Tc + (idx_frame - 1)*Tc + N_ofdm  );
  73.         else
  74.             % 使用randn + j*randn 方式产生N_path条径,1列的复高斯向量,本帧所有符号都使用同一衰减
  75.             % 因为多普勒频移很小时,使用Jakes模型要产生大量的点,才能满足截取的距离要等于相干时间对应的
  76.             % 多径时延样点数,非常费时,有时是不可能的。当帧时间长度 ( N_ofdm*N_samlpe_ofdm*T_sample ) >> 1/(Doppler),
  77.             % 产生的不同符号的瑞利衰落系数非常接近,可以使用同一个衰落系数
  78.             fading_path = repmat( ( randn(1) + j*randn(1) )/sqrt(2) ,1,N_ofdm );   
  79.         end
  80.         
  81.         % 把每条径的幅度乘上瑞利衰落序列
  82.         path_tmp =  sqrt(Power(p)) * fading_path;
  83.         
  84.         % 返回的数据
  85.         h_time(p,:,ant) = path_tmp ;
  86.         
  87.     end
  88. end