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

传真(Fax)编程

开发平台:

Matlab

  1. function [pattern] = rect_array(Nxr,Nyr,dolxr,dolyr,theta0,phi0,winid,win,nbits);
  2. %%%%%%%%%%%%%%%%%%%% ************************ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3. % This function computes the 3-D directive gain patterns for a plannar array
  4. % This function uses the fft2 to compute its output
  5. %%%%%%%%%%%%%%%%%%%% ************  INPUTS ************ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6. % Nxr ==> number of along x-aixs; Nyr ==> number of elemnts along y-axis
  7. % dolxr ==> element spacing in x-direction; dolyr ==> element spacing in y-direction Both are in lambda units
  8. % theta0 ==> elevation steering angle in degrees, phi0 ==> azimuth steering angle in degrees
  9. % winid ==> window identifier; winid negative ==> no window ; winid positive ==> use window given by win
  10. % win ==> input window function (2-D window) MUST be of size (Nxr X Nyr)
  11. % nbits is the number of nbits used in phase quantization; nbits negative ==> NO quantization
  12. %%%%%%%%%%%%%%%%%%%% *********** OUTPUTS ************* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  13. % pattern ==> directive gain pattern
  14. %%%%%%%%%%%%%%%%%%%% ************************ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  15. eps = 0.0001;
  16. nx = 0:Nxr-1;
  17. ny = 0:Nyr-1;
  18. i = sqrt(-1);
  19. % check that window size is the same as the array size
  20. [nw,mw] = size(win);
  21. if winid >0
  22.     if nw ~= Nxr
  23.     fprintf('STOP == Window size must be the same as the array')
  24.     return
  25. end
  26. if mw ~= Nyr
  27.     fprintf('STOP == Window size must be the same as the array')
  28.     return
  29. end
  30. end
  31. %if dol is > 0.5 then; choose dol = 0.5 and compute new N
  32. if(dolxr <=0.5)
  33.    ratiox = 1  ;
  34.    dolx = dolxr ;
  35.    Nx = Nxr ;
  36. else
  37.    ratiox = ceil(dolxr/.5) ;
  38.    Nx = (Nxr -1 ) * ratiox + 1 ;
  39.    dolx = 0.5 ;
  40. end
  41. if(dolyr <=0.5)
  42.    ratioy = 1  ;
  43.    doly = dolyr ;
  44.    Ny = Nyr ;
  45. else
  46.    ratioy = ceil(dolyr/.5) ;
  47.    Ny = (Nyr -1) * ratioy + 1 ;
  48.    doly = 0.5 ;
  49. end
  50. % choose proper size fft, for minimum value choose 256X256
  51. Nrx = 10 * Nx; 
  52. Nry = 10 * Ny;
  53. nfftx = 2^(ceil(log(Nrx)/log(2)));
  54. nffty = 2^(ceil(log(Nry)/log(2)));
  55. if nfftx < 256
  56.    nfftx = 256;
  57. end
  58. if nffty < 256
  59.    nffty = 256;
  60. end
  61. % generate array of elements with or without window
  62. if winid < 0 
  63.    array = ones(Nxr,Nyr);
  64. else
  65.    array = win;
  66. end
  67. % convert steering angles (theta0, phi0) to radians
  68. theta0 = theta0 * pi / 180;
  69. phi0 = phi0 * pi / 180;
  70. % convert steering angles (theta0, phi0) to U-V sine-space
  71. u0 = sin(theta0) * cos(phi0);
  72. v0 = sin(theta0) * sin(phi0);
  73. % Use formula thetal = (2*pi*n*dol) * sin(theta0) divided into 2^m levels
  74. % and rounded to the nearest qunatization level
  75. if nbits < 0
  76.     phasem = exp(i*2*pi*dolx*u0 .* nx *ratiox);
  77.     phasen = exp(i*2*pi*doly*v0 .* ny *ratioy);
  78. else
  79.     levels = 2^nbits;
  80.     qlevels = 2.0*pi / levels; % compute quantization levels
  81.     sinthetaq = round(dolx .* nx * u0 * levels * ratiox) .* qlevels; % vector of possible angles
  82.     sinphiq = round(doly .* ny * v0 * levels *ratioy) .* qlevels; % vector of possible angles
  83.     phasem = exp(i*sinthetaq);
  84.     phasen = exp(i*sinphiq);     
  85. end
  86.      
  87. % add the phase shift terms
  88. array = array .* (transpose(phasem) * phasen);
  89.   
  90. % determine if interpolation is needed (i.e N > Nr)
  91. if (Nx > Nxr )| (Ny > Nyr)
  92.    for xloop = 1 : Nxr
  93.       temprow = array(xloop, :) ;
  94.       w( (xloop-1)*ratiox+1, 1:ratioy:Ny) =  temprow ;
  95.    end
  96.    array = w;
  97. else
  98.     w = array ;
  99. %    w(1:Nx, :) = array(1:N,:);
  100. end
  101. % Compute array pattern
  102. arrayfft = abs(fftshift(fft2(w,nfftx,nffty))).^2 ;
  103. %compute [su,sv] matrix
  104. U = [-nfftx/2:(nfftx/2)-1] ./(dolx*nfftx);
  105. indexx = find(abs(U) <= 1);
  106. U = U(indexx);
  107. V = [-nffty/2:(nffty/2)-1] ./(doly*nffty);
  108. indexy = find(abs(V) <= 1);
  109. V = V(indexy);
  110. %Normalize to generate gain patern
  111. rbar=sum(sum(arrayfft(indexx,indexy))) / dolx/doly/4./nfftx/nffty;
  112. arrayfft = arrayfft(indexx,indexy) ./rbar;
  113. [SU,SV] = meshgrid(V,U);
  114. indx = find((SU.^2 + SV.^2) >1);
  115. arrayfft(indx) = eps/10;
  116. pattern = 10*log10(arrayfft +eps);
  117. figure(1)
  118. mesh(V,U,pattern);
  119. xlabel('V')
  120. ylabel('U');
  121. zlabel('Gain pattern - dB')
  122. figure(2)
  123. contour(V,U,pattern)
  124. grid
  125. axis image
  126. xlabel('V')
  127. ylabel('U');
  128. axis([-1 1 -1 1])
  129. figure(3)
  130. x0 = (Nx+1)/2 ;
  131. y0 = (Ny+1)/2 ;
  132. radiusx = dolx*((Nx-1)/2) ;
  133. radiusy = doly*((Ny-1)/2) ;
  134. [xxx, yyy]=find(abs(array)>eps);
  135. xxx = xxx-x0 ;
  136. yyy = yyy-y0 ;
  137. plot(yyy*doly, xxx*dolx,'rx')
  138. hold on
  139. axis([-radiusy-0.5 radiusy+0.5 -radiusx-0.5  radiusx+0.5]);
  140. grid
  141. title('antenna spacing pattern');
  142. xlabel('y - lambda units')
  143. ylabel('x - lambda units')
  144. [xxx0, yyy0]=find(abs(array)<=eps);
  145. xxx0 = xxx0-x0 ;
  146. yyy0 = yyy0-y0 ;
  147. plot(yyy0*doly, xxx0*dolx,'co')
  148. axis([-radiusy-0.5 radiusy+0.5 -radiusx-0.5  radiusx+0.5]);
  149. hold off
  150. return