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

邮电通讯系统

开发平台:

Matlab

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