Rayleigh_Doppler_multiPath.m
上传用户:qin0369
上传日期:2013-03-07
资源大小:9k
文件大小:8k
源码类别:

邮电通讯系统

开发平台:

Matlab

  1. function y = Rayleigh_Doppler_multiPath(fc,v,startT,endT,deltaT,fchip,delayTime,averagePower)
  2. %He jian, 2005.3
  3. %产生multipath Rayleigh分布(Doppler Shift),基于Clarke模型
  4. %return 复变量
  5. %fc=2000;%载频(MHz)
  6. %v=50;%绝对时速(km/h)
  7. % startT,endT(s):分别表示信道仿真的开始时间、终止时间,通常startT=0,endT=1s,
  8. % deltaT(ms):时间间隔,通常deltaT=1ms
  9. %fchip=1.28;%chip速率(Mchip/s)
  10. %delayTime=[0,781,1563,2344];%ns(10^-9s)
  11. %averagePower=[0,-3,-6,-9];%dB
  12. %method_flag = 3; %1,按ns delay,运算量大(目前不考虑该方法!)
  13.                   %2,按chip delay,运算量较大,在path delay不是chip时间整数倍时有误差
  14.                   %3,直接在抽样上delay,运算量小
  15. if(fchip~=0)
  16. method_flag = 2;
  17. else
  18. method_flag = 3;
  19. end
  20. if (method_flag==1)
  21. method_flag_str = '第1种方法,按ns delay';
  22. elseif (method_flag==2)
  23. method_flag_str = '第2种方法,按chip delay';
  24. elseif (method_flag==3)
  25. method_flag_str = '第3种方法,在抽样上delay';
  26. else
  27. end
  28. %tic;%Start timer of the simulation
  29. averagePower=10.^(averagePower/10);
  30. averagePower=averagePower/sum(averagePower);%将信道做归一化!
  31. %get number of all paths
  32. Np=length(delayTime);%delayTime与averagePower维数必须一致
  33. if (method_flag==1)%对Np条径进行delay,1st method:按ns delay,运算量大
  34. elseif (method_flag==2)%对Np条径进行delay,2nd method:按chip delay,运算量小,在path delay不是chip时间整数倍时有误差
  35. Tchip=1/(fchip*10^6);%一个chip占用时间(s)
  36. %将延时折算成延chip!!
  37. delayChip=round(delayTime*10^-9/Tchip)
  38. %get Np rayleigh path,deltaT按一个chip周期
  39. deltaT=Tchip*1000;%ms
  40. r0 = zeros(Np,length([startT:deltaT/1000:endT]));
  41. for n=1:1:Np
  42. ['==========',method_flag_str,'==========',num2str(Np),'径--- 第',num2str(n),'径==========']
  43. %tic;
  44. tempr = sqrt(averagePower(n))*Rayleigh_Doppler_singlePath(fc,v,startT,endT,deltaT);
  45. %tempr = Rayleigh_Doppler_singlePath(fc,v,startT,endT,deltaT);
  46. %delay chip...
  47. r0(n,:) = [zeros(delayChip(n),1);tempr(1:length(tempr)-delayChip(n))]';
  48. %r0(n,:)=abs(r0(n,:)).^2 * averagePower(n);%Np条径
  49. clear tempr;
  50. %disp(['one rayleigh channel time: ' num2str(toc) '秒']);
  51. end
  52. rm = sum(r0)';
  53. clear r0;
  54. elseif (method_flag==3)
  55. %此时,delayTime以最晚一个径为基准,条件参数中是以第一个径为准的!
  56. for n=1:1:Np
  57. delayTime(n) = delayTime(Np) - delayTime(n);
  58. end
  59. for n=1:1:Np
  60. lenT(n) = length([startT+delayTime(n)*10^-9:deltaT/1000:endT]);
  61. end
  62. r0 = zeros(Np,min(lenT));
  63. for n=1:1:Np
  64. ['==========',method_flag_str,'==========',num2str(Np),'径--- 第',num2str(n),'径==========']
  65. %tic;
  66. tempr = sqrt(averagePower(n))*Rayleigh_Doppler_singlePath(fc,v,startT+delayTime(n)*10^-9,endT,deltaT);
  67. %tempr = Rayleigh_Doppler_singlePath(fc,v,startT+delayTime(n)*10^-9,endT,deltaT);
  68. r0(n,:) = tempr([1:min(lenT)])';
  69. %r0(n,:)=abs(r0(n,:)).^2 * averagePower(n);%Np条径
  70. clear tempr;
  71. %disp(['one rayleigh channel time: ' num2str(toc) '秒']);
  72. end
  73. rm = sum(r0)';
  74. clear r0;
  75. startT = startT+max(delayTime)*10^-9;
  76. ['起始时间 为 startT,',num2str(startT),' s!']
  77. else
  78. end
  79. plot_flag = 0;   %1:需要plot,0:not plot
  80. if plot_flag==1
  81. fs = 1000/deltaT; %fs = fchip*10^6;
  82. c=3*10^8;%光速(m/s)
  83. fmax = (fc*10^6)*(v*10^3/3600)/c; % Max Doppler Shift (Hz)
  84. f_lim_range = [-fmax*2,fmax*2];
  85. %功率谱估计
  86. Nfft = 2^4;
  87. while(Nfft)
  88. if (Nfft < length(rm))
  89. Nfft = 2*Nfft;
  90. else
  91. break;
  92. end
  93. end
  94. Nfft = Nfft/2;%让数据长度为2的幂,又不超出采样长度
  95. r2 = rm(1:Nfft);
  96. Power_dB = 20*log10(abs(r2));% to dB!
  97. figure;
  98. subplot(2,2,1);
  99. plot([startT*1000:deltaT:startT*1000+deltaT*(Nfft-1)],Power_dB);grid;axis tight;title([num2str(fc), 'MHz,',num2str(v), 'km/h,Max Doppler=',num2str(fmax,'%.2f'),'Hz,',num2str(Np),'条径']);xlabel('ms');ylabel('dB值');
  100. %plot([startT*1000:deltaT:endT*1000],Power_dB);grid;axis tight;title([num2str(fc), 'MHz,',num2str(v), 'km/h,Max Doppler=',num2str(fmax,'%.2f'),'Hz,',num2str(Np),'条径']);xlabel('ms');ylabel('dB值');
  101. legend(['E(r^2)=',num2str(10*log10(sum(abs(r2).^2)/length(r2)),'%.2f'),' dB']);
  102. clear Power_dB;
  103. subplot(2,2,2);
  104. clear psd_matlab;clear f_matlab;
  105. [psd_matlab,f_matlab] = pwelch(r2,[],[],'twosided',Nfft,fs);%pwelch(x,window,noverlap,nfft,fs)
  106. psd_matlab = fftshift(psd_matlab);
  107. len = length(f_matlab);
  108. plot([-flipud(f_matlab(2:len/2+1));f_matlab(1:len/2)],10*log10(psd_matlab));
  109. %doppler shift
  110. hold on;
  111. sigma_u4 = sqrt(1/2);fm4 = [-fmax*0.999:fmax/100:fmax*0.999];fc4 = 0;
  112. Sf4 = 1.5*sigma_u4/(pi*fmax).*1./(sqrt(1-((fm4-fc4)./fmax).^2));
  113. plot(fm4,10*log10(Sf4),'-.r',min(fm4).*ones(1,2),[min(10*log10(psd_matlab)),max(10*log10(Sf4))],'-.r',max(fm4).*ones(1,2),[min(10*log10(psd_matlab)),max(10*log10(Sf4))],'-.r','LineWidth',1.5);
  114. legend('仿真值','单径理论值');
  115. xlim(f_lim_range);grid;
  116. title('pwelch(),Welch Method');xlabel('Hz');ylabel('dB/Hz');
  117. subplot(2,2,3);
  118. clear psd_matlab;clear f_matlab;
  119. [psd_matlab,f_matlab] = pmtm(r2,4,'twosided',Nfft,fs);
  120. psd_matlab = fftshift(psd_matlab);
  121. len = length(f_matlab);
  122. plot([-flipud(f_matlab(2:len/2+1));f_matlab(1:len/2)],10*log10(psd_matlab));
  123. %doppler shift
  124. hold on;
  125. plot(fm4,10*log10(Sf4),'-.r',min(fm4).*ones(1,2),[min(10*log10(psd_matlab)),max(10*log10(Sf4))],'-.r',max(fm4).*ones(1,2),[min(10*log10(psd_matlab)),max(10*log10(Sf4))],'-.r','LineWidth',1.5);
  126. legend('仿真值','单径理论值');
  127. xlim(f_lim_range);grid;
  128. title('pmtm(),Multitaper method(MTM)');xlabel('Hz');ylabel('dB/Hz');
  129. subplot(2,2,4);
  130. clear psd_matlab;clear f_matlab;
  131. [psd_matlab,f_matlab] = pyulear(r2,round(Nfft/20),'twosided',Nfft,fs);
  132. psd_matlab = fftshift(psd_matlab);
  133. len = length(f_matlab);
  134. plot([-flipud(f_matlab(2:len/2+1));f_matlab(1:len/2)],10*log10(psd_matlab));
  135. %doppler shift
  136. hold on;
  137. plot(fm4,10*log10(Sf4),'-.r',min(fm4).*ones(1,2),[min(10*log10(psd_matlab)),max(10*log10(Sf4))],'-.r',max(fm4).*ones(1,2),[min(10*log10(psd_matlab)),max(10*log10(Sf4))],'-.r','LineWidth',1.5);
  138. legend('仿真值','单径理论值');
  139. xlim(f_lim_range);grid;
  140. title('pyulear(),Yule-Walker AR Method');xlabel('Hz');ylabel('dB/Hz');
  141. clear r2;
  142. %  yw = abs(fftshift(fft(r2))).^2/length(r2);
  143. %  clear r2;
  144. %  len = length(yw);
  145. %  f_range = (-len/2:len/2-1)/len*fs; %[-fs/2:1/(endT-startT):fs/2];%(0:len-1)/len*fs;
  146. %  subplot(2,2,2);plot(f_range,10*log10(yw));grid;xlim([-fmax*1.2,fmax*1.2]);title('周期图法 功率谱');xlabel('频率(Hz)');ylabel('功率谱(dB)');
  147. %  yw2=yw;f_less=find(f_range<0);f_more=find(f_range>fmax);yw2([f_less,f_more])=[];
  148. %  %legend(['(0,fmax)积分功率=',num2str(10*log10(sum(yw2)*fs/len/fmax),'%.2f'),' dB/Hz']);
  149. %  legend(['(0,fmax)积分功率=',num2str(10*log10(mean(yw2)),'%.2f'),' dB/Hz']);
  150. %  clear yw2;
  151. %  subplot(2,2,3);plot(f_range,10*log10(yw));xlim([-fmax*4,fmax*4]);grid;title(['周期图法 功率谱']);
  152. %  xlabel('频率(Hz)');ylabel('功率谱(dB)');
  153. %  clear yw;
  154. %  %======= Welch K from 2 to 5 使频域不至于展开过宽,而分辨不清!=======
  155. %  Kmax = 3; K=Kmax+1;
  156. %  L = 2^4; %每段数据长度,2的幂
  157. %  if (1.5*L>=length(rm))
  158. %  'Welch: 数据总长度应> 1.5*L!'
  159. %  return;
  160. %  end
  161. %  while (K>Kmax)
  162. %  Lmax = floor(length(rm)*2/L)/2*L; %需要从rm中提取的数据总长度
  163. %  K = Lmax*2/L-1; %数据分段数
  164. %  if (K <= Kmax)
  165. %  break;
  166. %  else
  167. %  L = 2*L;
  168. %  end
  169. %  end
  170. %  w_hn = hanning(L); 
  171. %  Pw = [];
  172. %  for k=1:1:K
  173. %  Pw(k,:) = (abs(fftshift(fft(w_hn.*rm(1+(k-1)*L/2:L+(k-1)*L/2)))).^2)';
  174. %  end
  175. %  Pw = sum(Pw)/(norm(w_hn)^2*K);
  176. %  f_range = (-L/2:L/2-1)/L*fs;
  177. %  subplot(2,2,4);plot(f_range,10*log10(Pw));grid;title(['Welch法 功率谱,K=',num2str(K),',L=2^',num2str(log2(L))]);xlim([-fmax*1.2,fmax*1.2]);xlabel('频率(Hz)');ylabel('功率谱(dB)');
  178. %  f_less=find(f_range<0);f_more=find(f_range>fmax);Pw([f_less,f_more])=[];
  179. %  %legend(['(0,fmax)积分功率=',num2str(10*log10(sum(Pw)*fs/L/fmax),'%.2f'),' dB/Hz']);
  180. %  legend(['(0,fmax)积分功率=',num2str(10*log10(mean(Pw)),'%.2f'),' dB/Hz']);
  181. %  clear Pw;
  182. end
  183. y=rm(:);