clarkmodel.m
上传用户:tangoled
上传日期:2022-08-01
资源大小:1k
文件大小:3k
源码类别:

通讯/手机编程

开发平台:

Windows_Unix

  1. %clear;
  2. fd = 100;
  3. fs = 768000;
  4. Ns = 10000;
  5. % function r = ray(fd,fs,Ns)
  6. %
  7. % A Rayleigh fading simulator based on Clarke's Model
  8. % Creates a Rayleigh random process with PSD determined
  9. % by the vehicle's speed.
  10. %
  11. % INPUTS:
  12. %   fd = doppler frequency
  13. %        set fd = v*cos(theta)/lambda
  14. %        v = velocity (meters per second)
  15. %        lambda = carrier wavelength (meters)
  16. %        theta = angle w/ respect to tangent (radians).
  17. %   fs = sample frequency (Samples per second)
  18. %   Ns = number of samples of the Rayleigh fading
  19. %        process to produce
  20. %
  21. % OUTPUTS:
  22. %   r  = row vector containing Ns samples of the Rayleigh
  23. %        fading process 
  24. %
  25. % Author:  He Zhiqiang
  26. %          BUPT ITTC    
  27. %
  28. % For Academic Use Only
  29. N = 8;
  30. while(N)
  31.    if (N < 2*fd*Ns/fs) 
  32.       N = 2*N;
  33.    else
  34.       break;
  35.    end
  36. end 
  37. % number of ifft points (for smoothing)
  38. N_inv = ceil(N*fs/(2*fd));
  39. % determine the frequency spacings of signal after FFT
  40. delta_f = 2*fd/N;
  41. % determine time spacing of output samples
  42. delta_T_inv = 1/fs;
  43. %%%%%%%%%%% Begin Random Input Generation %%%%%%%%%%%%
  44. % fprintf( 'Generating Inputn');
  45. % generate a pair of TIME DOMAIN gaussian i.i.d. r.v.'s
  46. I_input_time = randn(1,N);
  47. Q_input_time = randn(1,N);
  48. % take FFT
  49. I_input_freq = fft(I_input_time);
  50. Q_input_freq = fft(Q_input_time);
  51. %%%  Generate Doppler Filter's Frequency Response %%%
  52. fprintf( 'Generating Doppler Filter Functionn');
  53. % filter's DC component
  54. SEZ(1) = 1.5/(pi*fd);
  55. % 0 < f < fd 
  56. for i=2:N/2
  57.    f(i) = (i-1)*delta_f;
  58.    SEZ(i) = 1.5/(pi*fd*sqrt(1-(f(i)/fd)^2));
  59.    SEZ(N-i+2) = SEZ(i);
  60. end
  61. % use a polynomial fit to get the component at f = fd
  62. p = polyfit( f(N/2-3:N/2), SEZ(N/2-3:N/2), 3);
  63. SEZ(N/2+1) = polyval( p, f(N/2)+delta_f );
  64. k = N/2 - 1;
  65. k = 3;
  66. p = polyfit( f(N/2-k:N/2), SEZ(N/2-k:N/2), k );
  67. SEZ(N/2+1) = polyval( p, f(N/2)+delta_f );
  68. %%%%%%%% Perform Filtering Operation %%%%%%%%%%%%%%
  69. % fprintf( 'Computing Outputn' );
  70. % pass the input freq. components through the filter
  71. I_output_freq = I_input_freq .* sqrt(SEZ);
  72. Q_output_freq = Q_input_freq .* sqrt(SEZ);
  73. % take inverse FFT
  74. I_temp = [I_output_freq(1:N/2) zeros(1,N_inv-N) I_output_freq(N/2+1:N)];
  75. I_output_time = ifft(I_temp);
  76. Q_temp = [Q_output_freq(1:N/2) zeros(1,N_inv-N) Q_output_freq(N/2+1:N)];
  77. Q_output_time = ifft(Q_temp);
  78. % make vector of times (in milliseconds)
  79. for j = 1:N_inv
  80.   t(j) = (j-1)*delta_T_inv*1000;
  81. end
  82. % take magnitude squared of each component and add together
  83. for i=1:N_inv
  84.   r(i) = sqrt( (abs(I_output_time(i)))^2 + (abs(Q_output_time(i)))^2);
  85. end
  86. % normalize and compute rms level
  87. rms = sqrt( mean( (I_output_time(1:Ns)+j*Q_output_time(1:Ns)).*conj(I_output_time(1:Ns)+j*Q_output_time(1:Ns))));
  88. r = (I_output_time(1:Ns)+j*Q_output_time(1:Ns))/rms;
  89. plot(1:Ns,abs(r),'-r');