# 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).

###### MATLAB Code for Calculating Array Factor of Circular Array
```%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% CIRCULAR ARRAY WITH VARIABLE
% NUMBER OF ELEMENTS AND SPACING
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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))
```
###### 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 . 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 .

###### 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))

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 . Based upon this the radius of the ring is calculated.

###### References

 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

 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, USA and Europe. Worked as Research Assistant within 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 5G and 4G standards.
0.00 avg. rating (0% score) - 0 votes

## 24 thoughts on “Fundamentals of a Circular Array – Mathematical Model and Code”

1. L G M PRAKASAM says:

Mr John How to plot 2 polar plots on same graph with centres separated by distance in matlab

1. Yasir Ahmed (aka John) says:

Can you not shift the origin by the distance, like in a 2D circle.

2. Matlab 2015 says:

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. John (YA) says:

N*d_circular is the circumference which is also equal to 2*pi*a, where ‘a’ is the radius. Hope this clarifies.

1. Matlab 2015 says:

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.?

1. John (YA) says:

You can create as many circles as you want with the required radius and number of elements, and then add the responses. Hope this helps!

2. L G M PRAKASAM says:

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

3. Matlab 2015 says:

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?

4. Matlab 2015 says:

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. John (YA) says:

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. Matlab 2015 says:

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

5. Matlab 2015 says:

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. John (YA) says:

How do you define better? what are the metrics that you are considering?

1. Matlab 2015 says:

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. John (YA) says:

I guess you are right but please also look at the 3D graph.

1. Matlab 2015 says:

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,

2. John (YA) says:

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?

6. Matlab 2015 says:

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. John (YA) says:

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. Matlab 2015 says:

Thank you very much for your kind response. it works now.

2. s.ramesh babu says:

theta=-pi:pi/180:pi; what is the meaning of this statement.

1. John (YA) says:

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. John (YA) says:

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. Matlab 2015 says:

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 ?