Project 2 - Patch Antenna Far-Field Pattern Calculation in MATLAB (May 2015)

Download as pdf or txt
Download as pdf or txt
You are on page 1of 17
At a glance
Powered by AI
The document discusses modelling and simulating the far-field pattern of a microstrip patch antenna. It derives the pattern mathematically and compares it to simulations in HFSS.

The microstrip patch antenna is modelled as a dielectric-loaded cavity, with the fields inside found by treating the cavity walls as perfect electric conductors and magnetic walls.

The far-field pattern is derived by treating the radiating surfaces as magnetic currents on two sides of the cavity and modelling the radiating slots as a two-element array of slot antennas.

The Ohio State University

Electrical and Computer Engineering Dept


EM Field Theory II, ECE-7010

TITLE:

Patch Antenna Far-Field Pattern

NAMES:

Roland Tallos, Stephen Watt

DATE DUE:

May 8th, 2015

DATE RECEIVED:

Introduction

The microstrip patch antenna can be considered as a dielectric-loaded cavity for analysis
purposes. The fields within the dielectric substrate can be found by treating the cavity walls as
perfect electric conductors on top and bottom and magnetic walls on all sides. Applying the
surface equivalence principle results in two radiating surface magnetic currents on two sides of
the cavity. Treating the radiating slots as a two-element array of slot antennas yields a
reasonable approximation for the patch antenna pattern.

Patch Antenna Pattern Derivation

See attached notes for derivation of patch antenna pattern.

MATLAB Calculation

After completing the derivation for the far field pattern of the radiating surface
currents, the final formulas were input into MATLAB (see Appendix for full code). The patch
antenna parameters used in the calculations are listed in Table 1. The code inputs and far-field
pattern calculations are depicted in Fig. 1 and Fig. 2 respectively.

Table 1: Example patch antenna parameters used for calculation

Figure 1: Code inputs for example patch antenna

Figure 2: Calculating the far-field electric field pattern using patch dimensions

Calculated E-Plane and H-Plane Patterns


0
-10

Pattern (dB)

-20
-30
-40
-50
E-plane ( = 90)
H-plane ( = 0)

-60
-70
-80

-80

-60

-40

-20

(deg)

20

40

60

80

Figure 3: Calculated far-field E-plane and H-plane patterns from MATLAB

Comparison to HFSS Simulation

Next the patch antenna model is created in HFSS to determine the simulated E-plane
and H-plane far-field patterns. The same dimensions from the MATLAB calculation are
incorporated in the patch model, as depicted in Fig. 4.

Figure 4: Patch antenna model in HFSS

Simulated E-Plane and H-Plane Patterns

Pattern (dB)

-5

-10
E-plane ( = 90)
H-plane ( = 0)
-15

-60

-80

-40

-20

(deg)

20

40

80

60

Figure 4: Simulated far-field E-plane and H-plane patterns from HFSS


E-Plane Pattern Comparison

H-Plane Pattern Comparison

-2

-10

Pattern (dB)

Pattern (dB)

-20
-4
-6
-8

-60

-40

-20

(deg)

20

40

Calculated H-plane Pattern


Simulated H-plane Pattern

-50

-70

-12
-80

-40

-60

Calculated E-plane Pattern


Simulated E-plane Pattern

-10

-30

60

-80

80

-80

-60

-40

-20

(deg)

20

40

Figure 5: Comparison of calculated and simulated patterns (rectangular plots)

Figure 6: Comparison of calculated and simulated patterns (polar plots)


5

60

80

Conclusion

The calculated E-plane pattern from MATLAB shows strong agreement with the pattern
from HFSS simulations. However, the calculated H-plane pattern has sharp nulls at = 80 and
at = -80. The HFSS simulated H-plane pattern is very smooth in comparison to the calculated
pattern.

Appendix: MATLAB Code


%%
%
%
%

Roland K. Tallos & Steve Watt


ECE7010 Patch Antenna Pattern
ElectroScience Laboratory
The Ohio State University, May 2015

%% Input Parameters (lengths are in m)


freq = 2.345e9;
L = 0.04941;
% Patch length along x direction
W = 0.04136;
% Patch width along y direction
d = 1.5748e-3 ;
% Patch height along z direction
epsr = 2.2;
% dielectric constant
Xo = 0.02873;
% feed location from the origin in the +x direction
Yo = 0.02471;
% feed location from the origin in the +y direction
% constants
eta = 377;
% intrinsic impedance
eo = 8.854e-12;
% permittivity
muo = pi*4e-7;
% permeability
ko = 2*pi*freq*sqrt(muo*eo);
kd = 2*pi*freq*sqrt(muo*eo*epsr);
ereff=(epsr+1.0)/2.0+(epsr-1)/(2.0*sqrt(1.0+12.0*d/W));
dl=0.412*d*((ereff+0.3)*(W/d+0.264))/((ereff-0.258)*(W/d+0.8));
Leff= L +2*dl;
% effective length

%% Compute E-theta & E-phi


% Angles of interest
theta=[-90*(pi/180):(pi/180):90*(pi/180)];
theta_deg=theta*(180/pi);
phi = 90;
% E-Plane (phi=90deg), H-Plane (phi=0deg)
% breaking up equation
arg1 = (4*sqrt(W*L))/(kd^2 - (pi/L)^2);
arg2 = W.*d.*sin(phi);
arg3 = sinc(((ko*W)/2).*sin(theta).*cos(phi));
arg4 = sinc(((ko*d)/2)*cos(theta));
AF = 2*cos(((ko*Leff)/2)*sin(theta)*sin(phi));
arg5 = cos(theta)*cos(phi)*W*d;
Eth = arg1.*arg2.*arg3.*arg4.*AF;
Eph = arg1.*arg5.*arg3.*arg4.*AF;
%% Compute E-Plane Far-field Radiation Pattern
U = (1/(2*eta)).*(abs(Eth).^2 + abs(Eph).^2);
Uo = max(U);
Eplane_calc = 10.*log10(U./Uo);

% [Balanis 12-12]

%% Compute E-theta & E-phi (H-Plane)


phi = 0;
% H-Plane (phi=0deg)
% breaking up equation
arg1 = (4*sqrt(W*L))/(kd^2 - (pi/L)^2);
arg2 = W.*d.*sin(phi);
arg3 = sinc(((ko*W)/2).*sin(theta).*cos(phi));
arg4 = sinc(((ko*d)/2)*cos(theta));
AF = 2*cos(((ko*Leff)/2)*sin(theta)*sin(phi));
arg5 = cos(theta)*cos(phi)*W*d;
Eth = arg1.*arg2.*arg3.*arg4.*AF;
Eph = arg1.*arg5.*arg3.*arg4.*AF;

%% Compute H-Plane Far-field Radiation Pattern


U = (1/(2*eta)).*(abs(Eth).^2 + abs(Eph).^2);
Uo = max(U);
Hplane_calc = 10.*log10(U./Uo);

% [Balanis 12-12]

%% Plot E-Plane and H-Plane Far Field Patterns


%---- Plot Patterns (Rectangular Plot) ---- %
figure;
% Plot Gain
set(0,'defaultlinelinewidth',3);
set(gca,'fontsize',13)
plot(theta_deg,Eplane_calc,theta_deg,Eplane_sim);
legend('Calculated E-plane Pattern','Simulated E-plane
Pattern','Location','SouthWest')
grid on
xlabel('\fontsize{16}\Theta (deg)')
ylabel('\fontsize{16}Pattern (dB)')
title('E-Plane Pattern Comparison','FontSize',17)
axis([-90 90 -80 0])
figure;
% Plot Gain
set(0,'defaultlinelinewidth',3);
set(gca,'fontsize',13)
plot(theta_deg,Hplane_calc,theta_deg,Hplane_sim);
legend('Calculated H-plane Pattern','Simulated H-plane
Pattern','Location','SouthWest')
grid on
xlabel('\fontsize{16}\Theta (deg)')
ylabel('\fontsize{16}Pattern (dB)')
title('H-Plane Pattern Comparison','FontSize',17)
axis([-90 90 -80 0])
% ---- Plot Patterns (Polar Plot) ---- %
figure;
polar_dB(theta_deg,Hplane_calc,-80,0,4); hold on
polar_dB(theta_deg,Hplane_sim',-80,0,4);
title('E-Plane Comparison','fontsize',16);

%**************************************************************************
%
polar_dB(theta,rho,rmin,rmax,rticks,line_style)
%**************************************************************************
%
POLAR_DB is a MATLAB function that plots 2-D patterns in
%
polar coordinates where:
%
0
<= THETA (in degrees) <= 360
%
-infinity < RHO
(in dB)
< +infinity
%
%
Input Parameters Description
%
---------------------------%
- theta (in degrees) must be a row vector from 0 to 360 degrees
%
- rho (in dB) must be a row vector
%
- rmin (in dB) sets the minimum limit of the plot (e.g., -60 dB)
%
- rmax (in dB) sets the maximum limit of the plot (e.g.,
0 dB)
%
- rticks is the # of radial ticks (or circles) desired. (e.g., 4)
%
- linestyle is solid (e.g., '-') or dashed (e.g., '--')
%
%
Credits:
%
S. Bellofiore
%
S. Georgakopoulos
%
A. C. Polycarpou
%
C. Wangsvick
%
C. Bishop
%
%
Tabulate your data accordingly, and call polar_dB to provide the
%
2-D polar plot
%
%
Note: This function is different from the polar.m (provided by
%
MATLAB) because RHO is given in dB, and it can be negative
%---------------------------------------------------------------------------function hpol = polar_dB(theta,rho,rmin,rmax,rticks,line_style)
% Convert degrees into radians
theta = theta * pi/180;
% Font size,
font_size =
font_name =
line_width =

font style and line width parameters


16;
'Times';
1.5;

if nargin < 5
error('Requires 5 or 6 input arguments.')
elseif nargin == 5
if isstr(rho)
line_style = rho;
rho = theta;
[mr,nr] = size(rho);
if mr == 1
theta = 1:nr;
else
th = (1:mr)';
theta = th(:,ones(1,nr));
end
else

line_style = 'auto';
end
elseif nargin == 1
line_style = 'auto';
rho = theta;
[mr,nr] = size(rho);
if mr == 1
theta = 1:nr;
else
th = (1:mr)';
theta = th(:,ones(1,nr));
end
end
if isstr(theta) | isstr(rho)
error('Input arguments must be numeric.');
end
if any(size(theta) ~= size(rho))
error('THETA and RHO must be the same size.');
end
% get hold state
cax = newplot;
next = lower(get(cax,'NextPlot'));
hold_state = ishold;
% get x-axis text color so grid is in same color
tc = get(cax,'xcolor');
% Hold on to current Text defaults, reset them to the
% Axes' font attributes so tick marks use them.
fAngle = get(cax, 'DefaultTextFontAngle');
fName
= get(cax, 'DefaultTextFontName');
fSize
= get(cax, 'DefaultTextFontSize');
fWeight = get(cax, 'DefaultTextFontWeight');
set(cax, 'DefaultTextFontAngle', get(cax, 'FontAngle'), ...
'DefaultTextFontName',
font_name, ...
'DefaultTextFontSize',
font_size, ...
'DefaultTextFontWeight', get(cax, 'FontWeight') )
% only do grids if hold is off
if ~hold_state
% make a radial grid
hold on;
% v returns the axis limits
% changed the following line to let the y limits become negative
hhh=plot([0 max(theta(:))],[min(rho(:)) max(rho(:))]);
v = [get(cax,'xlim') get(cax,'ylim')];
ticks = length(get(cax,'ytick'));
delete(hhh);
% check radial limits (rticks)
if rticks > 5
% see if we can reduce the number
if rem(rticks,2) == 0

rticks = rticks/2;
elseif rem(rticks,3) == 0
rticks = rticks/3;
end
end
% define a circle
th = 0:pi/50:2*pi;
xunit = cos(th);
yunit = sin(th);
% now really force points on x/y axes to lie on them exactly
inds = [1:(length(th)-1)/4:length(th)];
xunits(inds(2:2:4)) = zeros(2,1);
yunits(inds(1:2:5)) = zeros(3,1);
rinc = (rmax-rmin)/rticks;
% label r
% change the following line so that the unit circle is not multiplied
% by a negative number. Ditto for the text locations.
for i=(rmin+rinc):rinc:rmax
is = i - rmin;
plot(xunit*is,yunit*is,'-','color',tc,'linewidth',0.5);
text(0,is+rinc/20,[' ' num2str(i)],'verticalalignment','bottom' );
end
% plot spokes
th = (1:6)*2*pi/12;
cst = cos(th); snt = sin(th);
cs = [-cst; cst];
sn = [-snt; snt];
plot((rmax-rmin)*cs,(rmax-rmin)*sn,'-','color',tc,'linewidth',0.5);
% plot the ticks
george=(rmax-rmin)/30; % Length of the ticks
th2 = (0:36)*2*pi/72;
cst2 = cos(th2); snt2 = sin(th2);
cs2 = [(rmax-rmin-george)*cst2; (rmax-rmin)*cst2];
sn2 = [(rmax-rmin-george)*snt2; (rmax-rmin)*snt2];
plot(cs2,sn2,'-','color',tc,'linewidth',0.15); % 0.5
plot(-cs2,-sn2,'-','color',tc,'linewidth',0.15); % 0.5

% annotate spokes in degrees


% Changed the next line to make the spokes long enough
rt = 1.1*(rmax-rmin);
for i = 1:max(size(th))
text(rt*cst(i),rt*snt(i),int2str(abs(i*3090)),'horizontalalignment','center' );
if i == max(size(th))
loc = int2str(90);
elseif i*30+90<=180
loc = int2str(i*30+90);
else
loc = int2str(180-(i*30+90-180));
end
text(-rt*cst(i),-rt*snt(i),loc,'horizontalalignment','center' );

10

end
% set viewto 2-D
view(0,90);
% set axis limits
% Changed the next line to scale things properly
axis((rmax-rmin)*[-1 1 -1.1 1.1]);
end
% Reset defaults.
set(cax, 'DefaultTextFontAngle', fAngle , ...
'DefaultTextFontName',
font_name, ...
'DefaultTextFontSize',
fSize, ...
'DefaultTextFontWeight', fWeight );
% transform data to Cartesian coordinates.
% changed the next line so negative rho are not plotted on the other side
for i = 1:length(rho)
if (rho(i) > rmin)
if theta(i)*180/pi >=0 & theta(i)*180/pi <=90
xx(i) = (rho(i)-rmin)*cos(pi/2-theta(i));
yy(i) = (rho(i)-rmin)*sin(pi/2-theta(i));
elseif theta(i)*180/pi >=90
xx(i) = (rho(i)-rmin)*cos(-theta(i)+pi/2);
yy(i) = (rho(i)-rmin)*sin(-theta(i)+pi/2);
elseif theta(i)*180/pi < 0
xx(i) = (rho(i)-rmin)*cos(abs(theta(i))+pi/2);
yy(i) = (rho(i)-rmin)*sin(abs(theta(i))+pi/2);
end
else
xx(i) = 0;
yy(i) = 0;
end
end
% plot data on top of grid
if strcmp(line_style,'auto')
q = plot(xx,yy);
else
q = plot(xx,yy,line_style);
end
if nargout > 0
hpol = q;
end
if ~hold_state
axis('equal');axis('off');
end
% reset hold state
if ~hold_state, set(cax,'NextPlot',next); end

11

You might also like