Fundamentals of a Circular Array – Mathematical Model and Code

Array Factor and Element Factor

In the previous post we discussed the case of a Square Array which is a special case of a Rectangular Array. The code we shared can handle both the cases as well as Uniform Linear Array. We did briefly talk about the response of an element vs the response of an array, but we did not put forward the mathematical relationship. So here it is:

Response of an Array = Array Factor x Element Factor

In this post as well as previous posts we have assumed the element response to be isotropic (or at least omni-directional in the plane of the array) giving us an Element Factor of 1. So the array response is nothing but equal to the Array Factor.  In this post we mostly discuss the 2D Array Factor but briefly touch upon the 3D case well at the end.

Excess Path Length Calculation

As discussed in the previous posts when a plane wave impinges upon an array its absolute phase is not that important (although it might be important in synchronization at the receiver but we defer that discussion for the moment). What is important is the relative phase at the array elements. This can be calculated by first determining the excess path length at each element from a reference element and then adding up the contribution of each element to the array pattern.

The excess path length calculation, for the elements of a Circular Array, is not as as straightforward as that for a Uniform Linear Array or a Rectangular Array. We show two methods for calculation of the excess path length, you can chose whichever you prefer. It’s no surprise that both methods give identical results. One point that needs to be clarified about the mathematical model below is that we drop the term cos(φ) from the final equation. This is because it is a common term for all the array elements and does not have any impact on the composite pattern (Array Factor).

Derivation of Array Factor
Circular Array – Derivation – Method 1

 

Circular Array – Derivation – Method 2
MATLAB Code for Calculating Array Factor of Circular Array
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% CIRCULAR ARRAY WITH VARIABLE 
% NUMBER OF ELEMENTS AND SPACING 
% COPYRIGHT RAYMAPS 2018
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all
close all

f=1e9;
c=3e8;
l=c/f;
k=(2*pi)/l;
N=8;
n=0:N-1;
phi_n=2*pi*n/N;
phi=0:pi/180:2*pi;
M=length(phi);
d_circular=l/2;
a=(N*d_circular)/(2*pi);
for m=1:M

  AF(m)=sum(exp(-i*k*a*(cos(phi(m)-phi_n))));

end
polar(phi, abs(AF))
8-Element Antenna Pattern
Eight Element Circular Array
Discussion on 8-Element Antenna Pattern

It is seen that array pattern for 8-element array has almost a uniform response with a gain of about 3. Here the element separation, along the circumference of the ring, is set to half the wavelength. Different antenna patterns can be generated by varying the inter-element spacing (which determines the radius of the ring). More complicated patterns can be generated by using multi-ring antenna formations [1]. Also, it must be noted that we are simply adding the signal arriving at each of the elements without altering the phase or the amplitude. In actual implementations there is always a weighting pattern applied to the signals arriving at the array elements to get more useful patterns [2].

3D Array Factor

Lastly I would like to briefly comment on the 3D patterns that can be generated by using 3D Array Factors, a natural extension to the models discussed above. The equation of the 3D Array Factor is really not that complicated and has just one additional variable θ, which is nothing but the angle of elevation. In the above we have assumed that the angle of elevation to be 90 degrees. If the angle of elevation is not 90 degrees, that is we are not in the plane of the array, the array factor is modified to:

∑ e -jka(cosφ cosφnsinθ+sinφ sinφnsinθ)

∑ e -jkasinθ(cosφ cosφn+sinφ sinφn)

∑ e -jkasinθ(cos(φ -φn))

3D Array Response

If we fix the value of φ to be zero and vary θ from -90 degrees to +90 degrees we get a very interesting pattern. This pattern shows that with isotropic array elements it is possible to have a maximum gain of 8 on the linear scale (or 9 dB on the logarithmic scale), which is expected from an array with 8 elements and Element Factor of unity. This can also be verified from the above equation by realizing that sin(θ)=sin(0)=0 and anything raised to the power of zero is one. Eight of these terms added together give a total gain of 8.

Note: Inter-element separation on the circumference is labelled as ‘d_circular’ and this is set to half the wavelength [2]. Based upon this the radius of the ring is calculated.

References

[1] F. Gozasht, G. R. Dadashzadeh, S. Nikmehr “A Comprehensive Performance Study of Circular and Hexagonal Array Geometries in the LMS Algorithm for Smart Antenna Applications”, Progress in Electromagnetics Research, PIER 68, 281-296, 2007

[2] Harry L. Van Trees “Optimum Array Processing”, Part IV of Detection, Estimation and Modulation Theory, Wiley 2002.

Author: Yasir Ahmed (aka John)

More than 20 years of experience in various organizations in Pakistan, the USA, and Europe. Worked as a Research Assistant within the Mobile and Portable Radio Group (MPRG) of Virginia Tech and was one of the first researchers to propose Space Time Block Codes for eight transmit antennas. The collaboration with MPRG continued even after graduating with an MSEE degree and has resulted in 12 research publications and a book on Wireless Communications. Worked for Qualcomm USA as an Engineer with the key role of performance and conformance testing of UMTS modems. Qualcomm is the inventor of CDMA technology and owns patents critical to the 4G and 5G standards.
0.00 avg. rating (0% score) - 0 votes

36 thoughts on “Fundamentals of a Circular Array – Mathematical Model and Code

  1. Dear John I checked your response several times, but I don’t see any of your response to my recent post. Please respond so that I can proceed further. Regards,

  2. Dear John normally I see that in a circular array, both the angles are there in the expression. I mean both the angle of elevation and the angle of azimuth are there in the expression but here you have given only one angle. If I want to bring the 2nd angle also in the expression, how will the model look like? Regards,

    1. You are absolutely right, we need both the angles if we want to plot in 3D. We have plotted in 3D as you can see. Use the equations given at the end. Quite straightforward to modify the code using these equations.

      1. Thanks a lot dear John for your prompt response. I found the following code on this page as below:
        f=1e9;
        c=3e8;
        l=c/f;
        k=(2*pi)/l;
        N=8;
        n=0:N-1;
        phi_n=2*pi*n/N;
        phi=-pi:pi/18:pi;
        theta=0:pi/18:pi/2;
        M=length(theta);
        P=length(phi);
        d_circular=l/2;
        a=(N*d_circular)/(2*pi);
        for p=1:P
        for m=1:M
        AF(m,p)=sum(exp(-i*k*a*sin(theta(m))*(cos(phi(p)-phi_n))));
        x(m,p)=abs(AF(m,p))*sin(theta(m))*cos(phi(p));
        y(m,p)=abs(AF(m,p))*sin(theta(m))*sin(phi(p));
        z(m,p)=abs(AF(m,p))*cos(theta(m));
        end
        end
        mesh(x,y,z)
        %—————————————-
        If I take two sources at angles 30, 50 and -30 -50 respectively in a desired vector like this: desired_angles=[30 50 -30 -50];
        Now what changes will I do in the above code to estimate these angles with MUSIC algorithm? Regards,

          1. Dear John 1st of all thanks a lot to you for your precious time that you give for replying to our post.
            I tried to convert the above code for estimating my desired angles using MUSIC algorithm according to your instructions. My code is as below:
            clear;clc
            f=1e9;
            c=3e8;
            l=c/f;
            k=(2*pi)/l;
            N=8;
            %n=0:N-1;
            n=transpose(1:N);
            phi_n=2*pi*n/N;
            phi=-pi:pi/18:pi;
            theta=[pi/6, pi/3, pi/2];%0:pi/18:pi/2;

            %M=length(theta);
            %P=length(phi);
            d_circular=l/2;
            a=(N*d_circular)/(2*pi);
            % for p=1:P
            % for m=1:M
            % AF(m,p)=sum(exp(-1i*k*a*sin(theta(m))*(cos(phi(p)-phi_n))));
            % x(m,p)=abs(AF(m,p))*sin(theta(m))*cos(phi(p));
            % y(m,p)=abs(AF(m,p))*sin(theta(m))*sin(phi(p));
            % z(m,p)=abs(AF(m,p))*cos(theta(m));
            % end
            % end
            % mesh(x,y,z)
            %x1=exp(-1i*(n-1)*2*pi*d*cos(theta(1))/l);
            x=exp(-1j*k*a*sin(theta(1))*(cos(phi(p)-phi_n)))*sin(theta(1))*cos(phi(p));
            y=exp(-1j*k*a*sin(theta(2))*(cos(phi(p)-phi_n)))*sin(theta(2))*sin(phi(p));
            z=exp(-1j*k*a*sin(theta(1))*(cos(phi(p)-phi_n)))*cos(theta(3));

            ReceivedSignal=x+y+z;
            ReceivedSignal=ReceivedSignal(:);
            %%%%% MUSIC/Pisarenko Spectrum Generation %%%%%
            M=100;
            p=2;

            f=0:fs/(N-1):fs;
            w=2*pi*f/fs;

            cov_matrix=zeros(M,M);
            for n=1:N-M+1
            cov_matrix=cov_matrix+(x(n:n+M-1))*(x(n:n+M-1))’;
            end

            [V,lambda]=eig(cov_matrix);
            e=exp(j*((0:M-1)’)*w);

            den=zeros(length(w),1);
            for n=1:M-p
            v=(V(:,n));
            den=den+(abs((e’)*v)).^2;
            end
            PSD_MUSIC=1./den;
            plot(f,10*log10(PSD_MUSIC/max(PSD_MUSIC)),’linewidth’,3,’ro-‘)
            hold on
            %———————–End————————-

            But this code doesn’t run and gives errors. I tried several times to remove the errors but in vain. Can you guide me further, where am I making mistakes?
            Regards,

  3. Dear John hope you are doing well. The code you have given above is reproduced here:
    f=1e9;
    c=3e8;
    l=c/f;
    k=(2*pi)/l;
    N=8;
    n=0:N-1;
    phi_n=2*pi*n/N;
    phi=-pi:pi/18:pi;
    theta=0:pi/18:pi/2;
    M=length(theta);
    P=length(phi);
    d_circular=l/2;
    a=(N*d_circular)/(2*pi);
    for p=1:P
    for m=1:M
    AF(m,p)=sum(exp(-i*k*a*sin(theta(m))*(cos(phi(p)-phi_n))));
    x(m,p)=abs(AF(m,p))*sin(theta(m))*cos(phi(p));
    y(m,p)=abs(AF(m,p))*sin(theta(m))*sin(phi(p));
    z(m,p)=abs(AF(m,p))*cos(theta(m));
    end
    end
    mesh(x,y,z)
    % ————————————————————————

    Note: It gives us the 3D Array response as you have shown above.

    Question1: What do you mean by 3D Array? you mean that the sensors are placed in the form of a sphere instead of a circle?
    Question2: This code gives us the response pattern. But if I write the desired angles in the form of a vector like:
    desiredAngles=[20 30 40 50 60 70 80 110] ;

    as is usually written for DOA estimation in MUSIC algorithm. Then what changes should we do in this code? Further if it’s a 3D array, then it must estimate both the elevation angles as well as the azimuth angles. I tried like this but its not giving me estimated DOAs:

    f=1e9;
    c=3e8;
    l=c/f;
    k=(2*pi)/l;
    N=8;
    n=0:N-1;
    phi_n=[20 30];%phi_n=2*pi*n/N; % [Elevation1 Elevation2];
    phi=[40 50];%phi=-pi:pi/18:pi; %[Azimuth1 Azimuth2];
    theta=0:pi/18:pi/2;
    M=length(theta);
    P=length(phi);
    d_circular=l/2;
    a=(N*d_circular)/(2*pi);
    for p=1:P
    for m=1:M
    AF(m,p)=sum(exp(-i*k*a*sin(theta(m))*(cos(phi(p)-phi_n))));
    x(m,p)=abs(AF(m,p))*sin(theta(m))*cos(phi(p));
    y(m,p)=abs(AF(m,p))*sin(theta(m))*sin(phi(p));
    z(m,p)=abs(AF(m,p))*cos(theta(m));
    end
    end
    mesh(x,y,z)

  4. Dear John I had asked you a question that how can we use this code for concentric circles, so your reply was as:
    “You can create as many circles as you want with the required radius and number of elements, and then add the responses.”

    So I have tried like this:

    clear all; clc

    f=1e9;
    c=3e8;
    l=c/f;
    k=(2*pi)/l;

    N1=8; % For 1st circle
    N2=10;% For 2nd circle
    N3=12;% For 3rd circle
    N4=14;% For 4th circle

    n1=0:N1-1;
    n2=0:N2-1;
    n3=0:N3-1;
    n4=0:N4-1;

    phi_n1=2*pi*n1/N1;
    phi_n2=2*pi*n2/N2;
    phi_n3=2*pi*n3/N3;
    phi_n4=2*pi*n4/N4;

    phi=0;
    theta=-pi:pi/180:pi;
    M=length(theta);
    d_circular=l/2;

    a1=(N1*d_circular)/(2*pi);% 1st radius
    a2=(N2*d_circular)/(2*pi);% 2nd radius
    a3=(N3*d_circular)/(2*pi);% 3rd radius
    a4=(N4*d_circular)/(2*pi);% 4th radius

    for m=1:M
    AF1(m)=sum(exp(-i*k*a1*sin(theta(m))*(cos(phi-phi_n1))));% Response of 1st circle
    AF2(m)=sum(exp(-i*k*a2*sin(theta(m))*(cos(phi-phi_n2))));% Response of 2nd circle
    AF3(m)=sum(exp(-i*k*a3*sin(theta(m))*(cos(phi-phi_n3))));% Response of 3rd circle
    AF4(m)=sum(exp(-i*k*a4*sin(theta(m))*(cos(phi-phi_n4))));% Response of 4th circle
    end
    AF=AF1 + AF2+ AF3 + AF4; % Combined response due to all circles
    polar(theta, abs(AF))
    title(‘Combined response’)

    figure
    polar(theta, abs(AF1))
    title(‘1st circle response’)

    figure
    polar(theta, abs(AF2))
    title(‘2nd circle response’)

    figure
    polar(theta, abs(AF3))
    title(‘3rd circle response’)

    figure
    polar(theta, abs(AF4))
    title(‘4th circle response’)
    %%%%%%%%%%%%%%%%%%%%%%%

    Now my question is what improvement/improvements has the combined effect brought in the individual response?
    My 2nd question is I want to see these graph on a single graph instead of separate windows. I tried like this:

    polar(theta, abs(AF1), theta, abs(AF2), theta, abs(AF3), theta, abs(AF4), theta, abs(AF) )

    But it gives me the error as:

    Error using polar
    Too many input arguments.

    Error in concentricCircles (line 62)
    polar(theta, abs(AF1), theta, abs(AF2), theta, abs(AF3), theta, abs(AF4), theta, abs(AF))

  5. Hi dear John!
    Indeed I didn’t saw another site like this till now. You have done a wonderful job by giving us this site. Its very helping site. I have certain confusion in the above code. In this what is meant by the statement: d_circular=l/2;
    Is it the circumference of the circle?
    Further, what is: a=(N*d_circular)/(2*pi);
    Is it the radius of the circe? If yes, then from mathematics, we know that the circumference of a circle is given by circumeference=2*pi*r which implies r=circumfernce/2*pi. But here it is N*d_circular? So does “d_circular” denote circumference? or this whole thing i.e., N*d_circular represents the circumference?
    Regards,

      1. Thank you very much dear John for your response. Further if I want to use this code for arrays of concentric circles, then what changes should I do in this code.?

      2. Sorry for my interruption. I think d_circular is the arc length between two elements. Then the equation satisfies.

  6. Dear John I have heard from one of my friend that the response of 2L shaped array is better than 1L shaped array? When I asked him how? He replied that we can estimate DOAs accurately with 2L shaped array than with 1L shaped array? But how? Then he didn’t explain further. So, I ask the same question from you that how?

  7. That’s the standard way, how AF is written in terms of delta…same relationship exists in all the posts…correct me if I am wrong?

    Thank you dear John for your reply. I am not saying you are wrong. I learn a lot from you, so I became your student, then how can I say that you are wrong. I mean to say that you have written the expression for AF in case of circular array directly. But in case of ULA, you have taken your start from the 1st step i.e., r=e^-iwt. see the URL: http://www.raymaps.com/index.php/fundamentals-of-a-uniform-linear-array-ula/mathematical-framework-for-ula-four-elements/

    Now if I take the same r=e^-iwt=e^-i2pift=e^-i2pi(ct/lambda)=e^-i2pi(x/lambda).Then I cannot figure out where should I put the value of this delta in this expression? That’s why I am asking. The rest you can guide me better. Thanks once again.

    1. Angular Wave Number=k=2*pi/lambda…AF is sometimes written in terms of k rather than wavelength or frequency. x=c*t is the distance travelled. Instead of x you can just write delta, since you interested in access distance only, not the absolute value.

      1. Thank you very much dear John. Yes, now its ok. Actually I could not figure it out. But now its ok. Thanks once again.

  8. The results of Uniform Linear Array(ULA) are better than Uniform Circular Array (UCA). Then why should we use circular array instead of ULA?

      1. Thank you very much dear John for your response. I look at the two graphs, you have given. For ULA, the graph is given on URL: http://www.raymaps.com/index.php/fundamentals-of-a-uniform-linear-array-ula/

        And the circular is given on this page. If we look at the two graphs, the graph of ULA is directional but here in case of UCA, there is no directionality. Its just in ring shape. It means that if we want to estimate the DOA , then ULA should give better results.

          1. Thank you very much dear John for your response. Yes, if we look at the 3D graph, again there is some wastage of energy in the ring form which is not there in case of ULA. So, again in my opinion ULA seems to be better than the UCA. But I am not an expert like you, you can comment better whether I am right or wrong.
            2ndly I have a complaint. Sometimes, you give reply to my question and sometimes you don’t give reply to my question. Why it is so? I am a learner and I want to become an expert like you, so I request you, please give reply to my each question so that my confusion is rectified. By the way, again I am going to ask you a question:
            In the above mathematical model of UCA , you have derived delta value, but then you have directly written AF=sigma…..
            Though this proof made me understand how to find value of delta, but does not tell me how you got the expression of AF?
            Regards,

  9. I liked your post very much as this helped me a lot. I implemented the MATLAB code by including the 3D array factor and kept phi as constant. The code is given below:

    ERRONEOUS CODE REMOVED. PLEASE SEE CORRECT IMPLEMENTATION BELOW.

    (1)But the graph is not the same as yours.
    (2) If I want to keep both the parameters variable and want to see graph of 3D, then how can we change this code?

    1. clear all
      close all

      f=1e9;
      c=3e8;
      l=c/f;
      k=(2*pi)/l;
      N=8;
      n=0:N-1;
      phi_n=2*pi*n/N;
      phi=0;
      theta=-pi:pi/180:pi;
      M=length(theta);
      d_circular=l/2;
      a=(N*d_circular)/(2*pi);

      for m=1:M
      AF(m)=sum(exp(-i*k*a*sin(theta(m))*(cos(phi-phi_n))));
      end

      polar(theta, abs(AF))

        1. This statement means that theta has values from -pi to pi with increments of pi/180. Or in degree terms, theta goes from -180 degrees to 180 degrees with 1 degree increments.

    2. f=1e9;
      c=3e8;
      l=c/f;
      k=(2*pi)/l;
      N=8;
      n=0:N-1;
      phi_n=2*pi*n/N;
      phi=-pi:pi/18:pi;
      theta=0:pi/18:pi/2;
      M=length(theta);
      P=length(phi);
      d_circular=l/2;
      a=(N*d_circular)/(2*pi);
      for p=1:P
      for m=1:M
      AF(m,p)=sum(exp(-i*k*a*sin(theta(m))*(cos(phi(p)-phi_n))));
      x(m,p)=abs(AF(m,p))*sin(theta(m))*cos(phi(p));
      y(m,p)=abs(AF(m,p))*sin(theta(m))*sin(phi(p));
      z(m,p)=abs(AF(m,p))*cos(theta(m));
      end
      end
      mesh(x,y,z)

      1. Thank you very much for your kind response. But can we make this code as a function inside which we give our desired vector consisting of our theta and phi’s as:
        myDesired=[theta1 theta2 theta3 theta4 phi1 phi2 phi3 phi4]=[ 35 55 67 85 45 70 170 250 335]
        then I call that function from GA(genetic algorithm) and after completing the iterations, it gives me the estimated vector nearly equal to myDesired. If yes, how can we do that ?

Leave a Reply

Your email address will not be published. Required fields are marked *