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

传真(Fax)编程

开发平台:

Matlab

  1. function output = multipath(input,Doppler_freq,factor,frame_Num, frame_idx)
  2. % 函数功能:使用Jakes模型,对输入的信号加上多径效应和多普勒频移. 注意:未加高斯白噪声
  3. % 输入:1) input,输入信号样点序列,行向量,样点间隔20ns(系统基带采样速率假定为50MHz)
  4. %       2) Doppler_freq,多普勒频移(Hz)
  5. %       3) factor, 对输入时域样点序列进行分块,多个时域样点使用1个瑞利衰落系数。 这个变量为块的样点个数。
  6. %       使用Jakes模型产生瑞利衰落序列, 当多普勒频移较小时,时域很多个样点都近似相等。目的是减小运算量和存储空间。
  7. %       如多普勒频移为100Hz, 则相干时间为10ms. 而样点间隔为20ns, 则10ms/20ns = 5*10^5个样点信道变化不大。
  8. %       如果为多载波CDMA系统或OFDM系统,建议factor值为一个OFDM符号的样点数(包括CP)
  9. %       4) frame_Num,为总的仿真的帧数目
  10. %       5) frame_idx,为当前帧的序号,从1到frame_Num
  11. % 输出:output,输出信号样点序列,行向量,样点间隔20ns , 系统带宽50MHz
  12. % 样点间隔20ns
  13. deltaT = 20*10^(-9);
  14. % 每个时域样点块的时间宽度.
  15. T_block = deltaT*factor;
  16. % 信道的功率时延谱
  17. % 城区指数衰落信道,等间隔取0us~ 5us 共6条径
  18. atten_power = exp(-[0:5]);
  19. path_delay = [0:5]*50;     % 20ns样点间隔    
  20. % 求信号幅度衰减,并归一化总功率
  21. atten = sqrt( atten_power );
  22. atten = atten./sqrt(sum(atten.*conj(atten)));
  23. % 输出样值序列
  24. output = zeros( 1,length(input) + max(path_delay) );
  25. % 相干时间对应的样点数
  26. Tc = round( (1/Doppler_freq)/deltaT );    
  27. % 计算如果每个点都加1个瑞利衰落系数,总共需要的瑞利衰落样点数
  28. % 原则: 每条径使用的瑞利衰落系数要独立, 也就是截取Jakes模型时, 径和径之间的截取间隔要等于或
  29. % 大于相干时间对应的样点数. 我们截取时是等于相干时间对应样点数.
  30. len = length(input) + Tc * length(path_delay) * frame_Num;
  31. % 如果考虑分块和需要多产生一些样点以方便截取,调用Jakes模型程序需要产生的瑞利衰落样点数
  32. % 乘15*Tc的目的是为了方便舍去Jakes模型产生的瑞利衰落系数前面幅度较大的部分
  33. fading_len = ceil(( len + 15*Tc)/ factor);
  34. if frame_idx == 1
  35.     % Jakes模型产生瑞利衰落序列
  36.     fading = Tap_Rayleigh_Jakes(Doppler_freq,T_block,fading_len);
  37.     
  38.     % 截取Jakes模型产生瑞利衰落序列 ,舍去Jakes模型产生的瑞利衰落系数前面幅度较大的部分,
  39.     % 从10倍相干时间对应的样点数处开始截取
  40.     fading_trunc =  fading( ceil(( 10*Tc + 1)/factor) : ceil((len + 10*Tc + 1)/factor) );
  41.     
  42.     % 将Jakes模型产生的序列进行功率归一化
  43.     fading_jakes = fading_trunc./sqrt( sum(fading_trunc.*conj(fading_trunc)) / length(fading_trunc) );
  44.     
  45.     % 为程序运行速度考虑,每帧都生成一次衰落系数序列,运行速度比较慢。可以在第1帧生成衰落系数序列
  46.     % 并保存下来,然后每帧,读取保存的数据,截取即可
  47.     save fading_jakes.mat fading_jakes; 
  48. else
  49.     load fading_jakes.mat;
  50. end
  51. for i = 1:length(path_delay)
  52.     % 每条径, 对瑞利衰落序列进行截取. 每条径截取间隔为相干时间, 长度为输入样点长度.
  53.     fading_path = fading_jakes( ceil( ( (i-1)*Tc + (frame_idx-1)*Tc + 1)/ factor ) :...
  54.         ceil( ( (i-1)*Tc + (frame_idx-1)*Tc +  length(input) ) / factor ) );
  55.     
  56.     % 把瑞利衰落序列扩展为每个样点1个衰落系数
  57.     fading_path2 =  reshape( repmat(fading_path ,factor ,1 ), 1 ,length(fading_path)*factor );     
  58.     
  59.     % 输入序列点乘上瑞利衰落序列, 再乘上对应径的幅度衰落因子atten(i)
  60.     tmp_output = atten(i)*fading_path2(1:length(input)).*input;
  61.     
  62.     % 多条径叠加在一起,输出
  63.     output = output + [zeros(1,path_delay(i)) tmp_output zeros(1,max(path_delay)-path_delay(i))];
  64. end