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

邮电通讯系统

开发平台:

Matlab

  1. function y = Rayleigh_Doppler_singlePath(fc,v,startT,endT,deltaT)
  2. %He jian, 2005.3
  3. %产生单径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. if (endT-startT<=sectionTime/1000)
  10. '计算时间段必须小于总时长!'
  11. return;
  12. end
  13. if (sectionTime>0&&deltaT>=sectionTime)
  14. 'deltaT要小于时间段!'
  15. return;
  16. end
  17. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  18. %6种产生单径Rayleigh方法,参考如下:
  19. %1&2: A deterministic digital simulation model for Suzuki processes with application to a shadowed Rayleigh channel
  20. %3  : Rayleigh Channel Fading Simulator:Problems and Solutions
  21. %4  : 频域滤波方法参见rayleigh_Filter_Model.m
  22. %5  : Improved Models for the Generation of Multiple Uncorrelated Rayleigh Fading Waveforms
  23. %6  : Simulation Models With Correct Statistical Properties for Rayleigh Fading Channels
  24. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  25. method_flag = 6; %1,Suzuki-MEA;?只有正频率部分 对该方法(一次计算部分)进行了优化处理!
  26.  %2,Suzuki-MED;?好象这个有点问题,出来的pdf与rayleigh比较,波动较大,不如MEA!
  27.  %3,New model(t);对该方法(一次计算部分)进行了优化处理!
  28.  %4,Filter model(f); rayleigh_Filter_Model.m
  29.  %5,New model(t) IEEE.2002.06;对该方法(一次计算部分)进行了优化处理!
  30.  %6,New model(t) IEEE.2003.06;对该方法进行了优化处理!
  31.  
  32. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  33. %检查该方法的结果是否为rayleigh的pdf!(幅度|Z(t)|的PDF)
  34. %clear;r=Rayleigh_Doppler_singlePath(2000,30,0,20,1,0);test_rayleigh_pdf(r);
  35. %检查其相位分布??
  36. %phase=angle(xcorr(r))*180/pi;figure;subplot(2,1,1);plot(phase);subplot(2,1,2);hist(phase,50);
  37. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  38. if (method_flag==1)
  39. method_str = ['Suzuki-MEA'];
  40. elseif (method_flag==2)
  41. method_str = ['Suzuki-MED'];
  42. elseif (method_flag==3)
  43. method_str = ['New model(t)'];
  44. elseif (method_flag==4)
  45. method_str = ['Filter model(f)'];
  46. elseif (method_flag==5)
  47. method_str = ['New model(t) IEEE.2002.06'];
  48. elseif (method_flag==6)
  49. method_str = ['New model(t) IEEE.2003.06'];
  50. else
  51. end
  52. sigma_u = sqrt(1/2);%为rayleigh分布pdf的参数
  53. c=3*10^8;%光速(m/s)
  54. fmax = (fc*10^6)*(v*10^3/3600)/c; % Max Doppler Shift (Hz)
  55. fs=1000/deltaT;%抽样频率,if fs=1000-->模拟时间间隔=1/1000秒,即1ms
  56. rand('state',sum(100*clock));
  57. %如果涉及fft等计算,在Nfm点数为2的幂次方时,计算效率最高!
  58. %确保2*fmax的频率范围内,抽样点数满足2的幂次方要求!同时又要超过抽样点数!
  59. %   |---------------|----------------------........----------------------------|
  60. %   0              2*fmax                                                     fs
  61. %   |<---- Nfm ---->|                                                          |     
  62. %   |<----------------------------- Nfs -------------------------------------->|
  63. tic;
  64. N = 32;%模拟均匀到达的rays数
  65. if(method_flag==1)%MEA
  66. fd = fmax*sin((1:N)*pi/2/N); %cos(2*pi*((1:N)/N))*fmax; 
  67. phase = unifrnd(0,2*pi,N,1);  %phase = 2*pi*((1:N)/N);%相位 0-2*pi 均匀分布 
  68. %phase = unifrnd(-pi,pi,N,1);   
  69. Nt = length([startT:deltaT/1000:endT]);
  70. %temp = ones(1,Nt);
  71. %phase = phase(:)*temp;
  72. step = 0;
  73. r1 = zeros(length(startT:deltaT/1000:endT),1);
  74. for t = startT:deltaT/1000:endT
  75. step = step + 1;
  76. r1(step) = sum((exp(i*(2*pi*fd(:)*t + phase(:)))))*sigma_u*sqrt(2/N);%幅度
  77. end
  78. %t = [startT:deltaT/1000:endT];
  79. %r1 = sum((exp(i*(2*pi*fd(:)*t + phase))))*sigma_u*sqrt(2/N);%幅度
  80. %r1 = r1(:);
  81. elseif(method_flag==2)%MED
  82. fd = fmax*(2*(1:N)-1)/(2*N);%fd = fmax*(-N/2:N/2-1)/N; 
  83. phase = unifrnd(0,2*pi,N,1);  %phase = 2*pi*((1:N)/N);%相位 0-2*pi 均匀分布 
  84. cn = sqrt(4*sigma_u*sigma_u*(asin((1:N)/N)-asin(((1:N)-1)/N))/pi);
  85. Nt = length([startT:deltaT/1000:endT]);
  86. step = 0;
  87. for t = startT:deltaT/1000:endT
  88. step = step + 1;
  89. r1(step) = sum(exp(i*(2*pi*fd(:)*t + phase(:))).*cn(:));%幅度
  90. end
  91. r1 = r1(:);
  92. elseif(method_flag==3)%New model(t)
  93. M3 = 16; %>=8即可!
  94. N3 = 4*M3 + 2;
  95. theta = unifrnd(-pi,pi,M3+1,1);  %[-pi,pi)均匀分布
  96. fi = unifrnd(-pi,pi,M3+1,1);  %[-pi,pi)均匀分布
  97. ys = unifrnd(-pi,pi,M3+1,1);  %[-pi,pi)均匀分布
  98. wd = 2*pi*fmax;
  99. wn = wd*cos(2*pi*[0:M3]'/N3+theta(:)/N3);
  100. step = 0;
  101. r1 = zeros(length(startT:deltaT/1000:endT),1);
  102. for t = startT:deltaT/1000:endT
  103. step = step + 1;
  104. Xc = 2/sqrt(N3)*((sqrt(2)*cos(ys(1))*cos(wn(1)*t+fi(1)))+sum(2*cos(ys(2:end)).*cos(wn(2:end)*t+fi(2:end))));
  105. Xs = 2/sqrt(N3)*((sqrt(2)*sin(ys(1))*cos(wn(1)*t+fi(1)))+sum(2*sin(ys(2:end)).*cos(wn(2:end)*t+fi(2:end))));
  106. r1(step) = Xc + i*Xs;%幅度
  107. r1(step) = r1(step) * sigma_u;
  108. end
  109. %r1 = r1(:);
  110. elseif(method_flag==4)%Filter model(f)
  111. r1 = rayleigh_Filter_Model(fmax,fs,(endT-startT)*fs+1);
  112. r1 = r1(:);
  113. elseif(method_flag==5)%New model(t) IEEE.2002.06
  114. M5 = 32;%>=8
  115. %theta = unifrnd(-pi,pi,M5,1);  %[-pi,pi)均匀分布
  116. theta = unifrnd(-pi,pi,1,1);  %[-pi,pi)均匀分布
  117. fi = unifrnd(-pi,pi,M5,1);  %[-pi,pi)均匀分布
  118. ys = unifrnd(-pi,pi,M5,1);  %[-pi,pi)均匀分布
  119. a5 = (2*pi*[1:M5]'-pi+theta)/(4*M5);
  120. step = 0;
  121. r1 = zeros(length(startT:deltaT/1000:endT),1);
  122. for t = startT:deltaT/1000:endT
  123. step = step + 1;
  124. Zc = sqrt(2/M5)* sum(cos(2*pi*fmax*t*cos(a5)+fi));
  125. Zs = sqrt(2/M5)* sum(cos(2*pi*fmax*t*sin(a5)+ys));
  126. r1(step) = Zc + i*Zs;%幅度
  127. r1(step) = r1(step) * sigma_u;
  128. end
  129. %r1 = r1(:);
  130. elseif(method_flag==6)%New model(t) IEEE.2003.06
  131. '一次计算中... ...'
  132. M6 = 32;%>=8
  133. %theta = unifrnd(-pi,pi,M6,1);  %[-pi,pi)均匀分布
  134. %fi = unifrnd(-pi,pi,M6,1);  %[-pi,pi)均匀分布
  135. theta = unifrnd(-pi,pi,1,1);  %[-pi,pi)均匀分布
  136. fi = unifrnd(-pi,pi,1,1);  %[-pi,pi)均匀分布
  137. ys = unifrnd(-pi,pi,M6,1);  %[-pi,pi)均匀分布
  138. a6 = (2*pi*[1:M6]'-pi+theta)/(4*M6);
  139. step = 0;
  140. r1 = zeros(length(startT:deltaT/1000:endT),1);
  141. for t = startT:deltaT/1000:endT
  142. step = step + 1;
  143. Xc = sqrt(4/M6)* sum(cos(ys).*cos(2*pi*fmax*t*cos(a6)+fi));
  144. Xs = sqrt(4/M6)* sum(sin(ys).*cos(2*pi*fmax*t*cos(a6)+fi));
  145. r1(step) = Xc + i*Xs;%幅度
  146. r1(step) = r1(step) * sigma_u;
  147. end
  148. %r1 = r1(:);
  149. else
  150. end
  151. disp(['one rayleigh channel time: ' num2str(toc) '秒']);
  152. plot_flag = 0;   %2:-包括own的Welch法,周期图法(对高采样率优化plot);
  153.                  %       matlab的periodogram,pwelch,pmtm,pyulear;
  154.  %   -还可以计算积分功率;
  155.                  %1:需要一般plot(只有周期图法)
  156.                  %0:not plot
  157.                  
  158. if(method_flag==1)
  159. f_lim_range = [-fmax*0.2,fmax*2];
  160. elseif(method_flag==2)
  161. f_lim_range = [-fmax*0.2,fmax*2];
  162. elseif(method_flag==3)
  163. f_lim_range = [-fmax*2,fmax*2];
  164. elseif(method_flag==4)
  165. f_lim_range = [-fmax*2,fmax*2];
  166. elseif(method_flag==5)
  167. f_lim_range = [-fmax*2,fmax*2];
  168. elseif(method_flag==6)
  169. f_lim_range = [-fmax*2,fmax*2];
  170. end
  171. if plot_flag==1
  172. Power_dB = 10*log10(abs(r1).^2);
  173. subplot(2,2,1);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,',method_str]);xlabel('ms');ylabel('dB值');
  174. %功率谱估计
  175. yw = fft(r1);
  176. yw=fftshift(yw);
  177. yw = abs(yw).^2/length(yw);
  178. len = length(yw);
  179. f_range = [-fs/2:1/(endT-startT):fs/2];%(0:len-1)/len*fs;
  180. subplot(2,2,2);plot(f_range,10*log10(yw));grid;xlim(f_lim_range);title('周期图法 功率谱 abs()^2/N');xlabel('频率(Hz)');ylabel('功率谱(dB)');
  181. rt = xcorr(r1,r1);
  182. subplot(2,2,3);plot(10*log10(abs(rt)/length(rt)));grid;axis tight;title(['自相关性']);
  183. clear yw;
  184. yw = xcorr(r1,r1);
  185. len = length(yw);
  186. yw = fft(yw);yw=fftshift(yw);
  187. Pyw = abs(yw)/length(yw);%.^2/length(yw);
  188. subplot(2,2,4);
  189. plot((-len/2:len/2-1)/len*fs,10*log10(Pyw));grid;xlim(f_lim_range);title(['自相关法 功率谱,plot_flag=',num2str(plot_flag)]);xlabel('频率(Hz)');ylabel('功率谱(dB)');
  190. elseif plot_flag==2
  191. %功率谱估计
  192. fs = 1000/deltaT; 
  193. Nfft = 2^4;
  194. while(Nfft)
  195. if (Nfft < length(r1))
  196. Nfft = 2*Nfft;
  197. else
  198. break;
  199. end
  200. end
  201. Nfft = Nfft/2;%让数据长度为2的幂,又不超出采样长度
  202. r2 = r1(1:Nfft);
  203. Power_dB = 20*log10(abs(r2));%dB
  204. figure;
  205. subplot(2,2,1);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,',method_str]);xlabel('ms');ylabel('dB值');
  206. legend(['E(r^2)=',num2str(10*log10(sum(abs(r2).^2)/length(r2)),'%.2f'),' dB']);
  207. clear Power_dB;
  208. %  yw = abs(fftshift(fft(r2))).^2/length(r2);
  209. %  len = length(yw);
  210. %  f_range = (-len/2:len/2-1)/len*fs; %[-fs/2:1/(endT-startT):fs/2];%(0:len-1)/len*fs;
  211. %  subplot(2,2,2);plot(f_range,10*log10(yw));grid;xlim(f_lim_range);title('周期图法 功率谱');xlabel('频率(Hz)');ylabel('功率谱(dB)');
  212. %  yw2=yw;f_less=find(f_range<0);f_more=find(f_range>fmax);yw2([f_less,f_more])=[];
  213. %  %size(yw2),fmax*len/fs
  214. %  %legend(['(0,fmax)mean=',num2str(10*log10(sum(yw2)*fs/len/fmax),'%.2f'),' dB/Hz']);
  215. %  legend(['(0,fmax)mean=',num2str(10*log10(mean(yw2)),'%.2f'),' dB/Hz']);
  216. %  clear yw2;
  217. %  subplot(2,2,3);plot(f_range,10*log10(yw));grid;xlim([-fmax*4,fmax*4]);title(['周期图法 功率谱']);xlabel('频率(Hz)');ylabel('功率谱(dB)');
  218. %  clear yw;
  219. %  %======= Welch K from 2 to 5 使频域不至于展开过宽,而分辨不清!=======
  220. %  Kmax = 3; K=Kmax+1;
  221. %  L = 2^4; %每段数据长度,2的幂
  222. %  if (1.5*L>=length(r2))
  223. %  'Welch: 数据总长度应> 1.5*L!'
  224. %  return;
  225. %  end
  226. %  while (K>Kmax)
  227. %  Lmax = floor(length(r2)*2/L)/2*L; %需要从r2中提取的数据总长度
  228. %  K = Lmax*2/L-1; %数据分段数
  229. %  if (K <= Kmax)
  230. %  if (K==1)
  231. %  K = 2;
  232. %  L = L/2;
  233. %  end
  234. %  break;
  235. %  else
  236. %  L = 2*L;
  237. %  end
  238. %  end
  239. %  w_hn = hanning(L); 
  240. %  Pw = [];
  241. %  for k=1:1:K
  242. %  Pw(k,:) = (abs(fftshift(fft(w_hn.*r2(1+(k-1)*L/2:L+(k-1)*L/2)))).^2)';
  243. %  end
  244. %  Pw = sum(Pw)/(norm(w_hn)^2*K);
  245. %  f_range = (-L/2:L/2-1)/L*fs;
  246. %  subplot(2,2,4);plot(f_range,10*log10(Pw));grid;xlim(f_lim_range);title(['Welch法 功率谱,K=',num2str(K),',L=2^',num2str(log2(L)),',plot_flag=',num2str(plot_flag)]);xlabel('频率(Hz)');ylabel('功率谱(dB)');
  247. %  f_less=find(f_range<0);f_more=find(f_range>fmax);Pw([f_less,f_more])=[];
  248. %  %legend(['(0,fmax)mean=',num2str(10*log10(sum(Pw)*fs/L/fmax),'%.2f'),' dB/Hz']);
  249. %  legend(['(0,fmax)mean=',num2str(10*log10(mean(Pw)),'%.2f'),' dB/Hz']);
  250. %  clear Pw;
  251. %  figure;
  252. %  subplot(2,2,1);
  253. %  [psd_matlab,f_matlab] = periodogram(r2,[],'twosided',Nfft,fs);%
  254. %  psd_matlab = fftshift(psd_matlab);
  255. %  len = length(f_matlab);
  256. %  plot([-flipud(f_matlab(2:len/2+1));f_matlab(1:len/2)],10*log10(psd_matlab));xlim(f_lim_range);grid;
  257. %  title(['periodogram(),',num2str(fc), 'MHz,',num2str(v), 'km/h,Max Doppler=',num2str(fmax,'%.2f'),'Hz,']);
  258. %  xlabel('Hz');ylabel('dB/Hz');
  259. subplot(2,2,2);
  260. clear psd_matlab;clear f_matlab;
  261. [psd_matlab,f_matlab] = pwelch(r2,[],[],'twosided',Nfft,fs);%pwelch(x,window,noverlap,nfft,fs)
  262. psd_matlab = fftshift(psd_matlab);
  263. len = length(f_matlab);
  264. plot([-flipud(f_matlab(2:len/2+1));f_matlab(1:len/2)],10*log10(psd_matlab));
  265. %doppler shift
  266. hold on;
  267. sigma_u4 = sqrt(1/2);fm4 = [-fmax*0.999:fmax/100:fmax*0.999];fc4 = 0;
  268. Sf4 = 1.5*sigma_u4/(pi*fmax).*1./(sqrt(1-((fm4-fc4)./fmax).^2));
  269. 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);
  270. legend('仿真值','理论值');
  271. xlim(f_lim_range);grid;
  272. title('pwelch(),Welch Method');xlabel('Hz');ylabel('dB/Hz');
  273. subplot(2,2,3);
  274. clear psd_matlab;clear f_matlab;
  275. [psd_matlab,f_matlab] = pmtm(r2,4,'twosided',Nfft,fs);
  276. psd_matlab = fftshift(psd_matlab);
  277. len = length(f_matlab);
  278. plot([-flipud(f_matlab(2:len/2+1));f_matlab(1:len/2)],10*log10(psd_matlab));
  279. %doppler shift
  280. hold on;
  281. 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);
  282. legend('仿真值','理论值');
  283. xlim(f_lim_range);grid;
  284. title('pmtm(),Multitaper method(MTM)');xlabel('Hz');ylabel('dB/Hz');
  285. subplot(2,2,4);
  286. clear psd_matlab;clear f_matlab;
  287. [psd_matlab,f_matlab] = pyulear(r2,round(Nfft/20),'twosided',Nfft,fs);
  288. psd_matlab = fftshift(psd_matlab);
  289. len = length(f_matlab);
  290. plot([-flipud(f_matlab(2:len/2+1));f_matlab(1:len/2)],10*log10(psd_matlab));
  291. %doppler shift
  292. hold on;
  293. 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);
  294. legend('仿真值','理论值');
  295. xlim(f_lim_range);grid;
  296. title('pyulear(),Yule-Walker AR Method');xlabel('Hz');ylabel('dB/Hz');
  297. clear r2;
  298. else
  299. end
  300. y=r1(:);%信道复变量