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

传真(Fax)编程

开发平台:

Matlab

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