linear_array.m
上传用户:szahd2008
上传日期:2020-09-25
资源大小:1275k
文件大小:3k
源码类别:

传真(Fax)编程

开发平台:

Matlab

  1. function [theta,patternr,patterng] = linear_array(Nr,dolr,theta0,winid,win,nbits);
  2. % This function computes and returns the gain radiation pattern for a linear array
  3. % It uses the FFT to computes the pattern
  4. %%%%%%%%%%%%%%%%%%%% ********** INPUTS ************** %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5. % Nr ==> number of elements; dolr ==> element spacing (d) in lambda units divided by lambda
  6. % theta0 ==> steering angle in degrees; winid ==> use winid negative for no window, winid positive to enter your window of size(Nr)
  7. % win is input window, NOTE that win must be an NrX1 row vector; nbits ==> number of bits used in the pahse shifters
  8. % negative nbits mean no quantization is used
  9. %%%%%%%%%%%%%%%%%%%% *********** OUTPUTS ************* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  10. % theta ==> real-space angle; patternr ==> array radiation pattern in dBs
  11. % patterng ==> array directive gain pattern in dBs
  12. %%%%%%%%%%%%%%%%%%%% ************************ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  13. eps = 0.00001;
  14. n = 0:Nr-1;
  15. i = sqrt(-1);
  16. %if dolr is > 0.5 then; choose dol = 0.25 and compute new N
  17. if(dolr <=0.5)
  18.    dol = dolr;
  19.    N = Nr;
  20. else
  21.    ratio = ceil(dolr/.25);
  22.    N = Nr * ratio;
  23.    dol = 0.25;
  24. end
  25. % choose proper size fft, for minimum value choose 256
  26. Nrx = 10 * N; 
  27. nfft = 2^(ceil(log(Nrx)/log(2)));
  28. if nfft < 256
  29.     nfft = 256;
  30. end
  31. % convert steering angle into radians; and compute the sine of angle
  32. theta0 = theta0 *pi /180.;
  33. sintheta0 = sin(theta0);
  34. % detrmine and comupte quantized steering angle
  35. if nbits < 0
  36.    phase0 = exp(i*2.0*pi .* n * dolr * sintheta0);
  37. else
  38.     % compute and add the phase shift terms (WITH nbits quantization)
  39.     % Use formula thetal = (2*pi*n*dol) * sin(theta0) divided into 2^nbits
  40.     % and rounded to the nearest qunatization level
  41.     levels = 2^nbits;
  42.     qlevels = 2.0 * pi / levels; % compute quantization levels
  43.     % compute the phase level and round it to the closest quantizatin level at each array element
  44.     angleq = round(dolr .* n * sintheta0 * levels) .* qlevels; % vector of possible angles
  45.     phase0 = exp(i*angleq);
  46. end
  47. % generate array of elements with or without window
  48. if winid < 0 
  49.     wr(1:Nr) = 1;
  50. else
  51.     wr = win';
  52. end
  53. % add the phase shift terms
  54.  wr =  wr .* phase0;
  55.  
  56. % determine if interpolation is needed (i.e N > Nr)
  57. if N > Nr
  58.     w(1:N) = 0;
  59.     w(1:ratio:N) = wr(1:Nr);
  60. else
  61.     w = wr;
  62. end
  63. % compute the sine(theta) in real space sthat correspond to the FFT index 
  64. arg = [-nfft/2:(nfft/2)-1] ./ (nfft*dol);
  65. idx = find(abs(arg) <= 1);
  66. sinetheta = arg(idx);
  67. theta = asin(sinetheta);
  68. % convert angle into degrees
  69. theta = theta .* (180.0 / pi);
  70. % Compute fft of w (radiation pattern)
  71. patternv = (abs(fftshift(fft(w,nfft)))).^2;
  72. % convert raditiona pattern to dBs
  73. patternr = 10*log10(patternv(idx) ./Nr +  eps);
  74. % Compute directive gain pattern  
  75. rbarr  = 0.5 *sum(patternv(idx)) ./ (nfft * dol);
  76. patterng = 10*log10(patternv(idx) + eps) - 10*log10(rbarr + eps);
  77. return