ULA (Uniform Linear Array)
ULA is the Object that is for design and simulating the set of antenna placed along a line. This is the type of array antenna that are used for MIMO (e.g, LTE MIMO).
Basic Numerical Test
ULA_Basic_01.m
|
c = 3e8; % propagation speed
fc = 26e9; % carrier frequency
lambda = c/fc; % wavelength
txarray = phased.ULA('NumElements',4,'ElementSpacing',lambda/2)
txmipos = getElementPosition(txarray)/lambda
txarraystv = phased.SteeringVector('SensorArray',txarray,'PropagationSpeed',c)
txang = [0 ; 0];
wt = txarraystv(fc,txang)'
txbeam_ang = 0;
txsv = steervec(txmipos,txbeam_ang)
txbeam = wt * txsv
|
txang = [0 ; 0];
txbeam_ang = 0
|
txarray =
phased.ULA with properties:
Element: [1×1 phased.IsotropicAntennaElement]
NumElements: 4
ElementSpacing: 0.0058
ArrayAxis: 'y'
Taper: 1
txmipos =
0 0 0 0
-0.7500 -0.2500 0.2500 0.7500
0 0 0 0
txarraystv =
phased.SteeringVector with properties:
SensorArray: [1×1 phased.ULA]
PropagationSpeed: 300000000
IncludeElementResponse: false
NumPhaseShifterBits: 0
wt =
1 1 1 1
txsv =
1
1
1
1
txbeam =
4
|
txang = [0 ; 0];
txbeam_ang = -10
|
txarray =
phased.ULA with properties:
Element: [1×1 phased.IsotropicAntennaElement]
NumElements: 4
ElementSpacing: 0.0058
ArrayAxis: 'y'
Taper: 1
txmipos =
0 0 0 0
-0.7500 -0.2500 0.2500 0.7500
0 0 0 0
txarraystv =
phased.SteeringVector with properties:
SensorArray: [1×1 phased.ULA]
PropagationSpeed: 300000000
IncludeElementResponse: false
NumPhaseShifterBits: 0
wt =
1 1 1 1
txsv =
0.6835 + 0.7300i
0.9630 + 0.2694i
0.9630 - 0.2694i
0.6835 - 0.7300i
txbeam =
3.2930
|
txang = [0 ; 0];
txbeam_ang = 10
|
txarray =
phased.ULA with properties:
Element: [1×1 phased.IsotropicAntennaElement]
NumElements: 4
ElementSpacing: 0.0058
ArrayAxis: 'y'
Taper: 1
txmipos =
0 0 0 0
-0.7500 -0.2500 0.2500 0.7500
0 0 0 0
txarraystv =
phased.SteeringVector with properties:
SensorArray: [1×1 phased.ULA]
PropagationSpeed: 300000000
IncludeElementResponse: false
NumPhaseShifterBits: 0
wt =
1 1 1 1
txsv =
0.6835 - 0.7300i
0.9630 - 0.2694i
0.9630 + 0.2694i
0.6835 + 0.7300i
txbeam =
3.2930
|
txang = [-10 ; 0];
txbeam_ang = 0
|
txarray =
phased.ULA with properties:
Element: [1×1 phased.IsotropicAntennaElement]
NumElements: 4
ElementSpacing: 0.0058
ArrayAxis: 'y'
Taper: 1
txmipos =
0 0 0 0
-0.7500 -0.2500 0.2500 0.7500
0 0 0 0
txarraystv =
phased.SteeringVector with properties:
SensorArray: [1×1 phased.ULA]
PropagationSpeed: 300000000
IncludeElementResponse: false
NumPhaseShifterBits: 0
wt =
0.6835 - 0.7300i 0.9630 - 0.2694i 0.9630 + 0.2694i 0.6835 + 0.7300i
txsv =
1
1
1
1
txbeam =
3.2930
|
txang = [10 ; 0];
txbeam_ang = 0
|
txarray =
phased.ULA with properties:
Element: [1×1 phased.IsotropicAntennaElement]
NumElements: 4
ElementSpacing: 0.0058
ArrayAxis: 'y'
Taper: 1
txmipos =
0 0 0 0
-0.7500 -0.2500 0.2500 0.7500
0 0 0 0
txarraystv =
phased.SteeringVector with properties:
SensorArray: [1×1 phased.ULA]
PropagationSpeed: 300000000
IncludeElementResponse: false
NumPhaseShifterBits: 0
wt =
0.6835 + 0.7300i 0.9630 + 0.2694i 0.9630 - 0.2694i 0.6835 - 0.7300i
txsv =
1
1
1
1
txbeam =
3.2930
|
Plotting Radiation Pattern in 2D
ULA_Basic_02.m
|
c = 3e8; % propagation speed
fc = 26e9; % carrier frequency
lambda = c/fc; % wavelength
NoOfTxAntenna = 4
txarray = phased.ULA('NumElements',NoOfTxAntenna,'ElementSpacing',lambda/2);
txmipos = getElementPosition(txarray)/lambda;
txarraystv = phased.SteeringVector('SensorArray',txarray,'PropagationSpeed',c);
txang = [0 ; 0];
wt = txarraystv(fc,txang)';
txbeam_ang = -90:90;
txbeam_ang_rad = (pi*txbeam_ang)/180;
txbeam = abs(wt*steervec(txmipos,txbeam_ang));
txbeam = txbeam/max(txbeam);
[txbeampos_x,txbeampos_y] = pol2cart(deg2rad(txbeam_ang),txbeam);
hFig = figure(1);
set(hFig, 'Position', [0 0 800 400]);
subplot(1,2,1);
plot(txbeam_ang,txbeam,'r-');
xlabel('txbeam ang');ylabel('txbeam');
set(gca,'xtick',-90:15:90)
xlim([txbeam_ang(1) txbeam_ang(end)]); ylim([0 1.0]);
subplot(1,2,2);
polarplot(txbeam_ang_rad,txbeam,'r');
set(gca,'RTickLabels',[]);
|
Following three example shows the beam pattern of the array antenna with 4 elements depending on different steering angles.
NoOfTxAntenna = 4
txang = [0 ; 0];
|
|
NoOfTxAntenna = 4
txang = [10 ; 0];
|
|
NoOfTxAntenna = 4
txang = [-30 ; 0];
|
|
Following three example shows the beam pattern of the array antenna with 8 elements depending on different steering angles.
NoOfTxAntenna = 8
txang = [0 ; 0];
|
|
NoOfTxAntenna = 4
txang = [-30 ; 0];
|
|
Following three example shows how the shape of the beam changes as the number of antenna elements in an array antenna gets larger.
NoOfTxAntenna = 2
txang = [0 ; 0];
|
|
NoOfTxAntenna = 2
txang = [0 ; 0];
|
|
NoOfTxAntenna = 8
txang = [0 ; 0];
|
|
NoOfTxAntenna = 16
txang = [0 ; 0];
|
|
Plotting Radiation Pattern in 3D
ULA_Basic_03.m
|
c = 3e8; % propagation speed
fc = 26e9; % carrier frequency
lambda = c/fc; % wavelength
NoOfTxAntenna = 8
txarray = phased.ULA('NumElements',NoOfTxAntenna,'ElementSpacing',lambda/2);
pattern(txarray,fc,[-180:180],[-90:90],...
'PropagationSpeed',c,...
'CoordinateSystem','polar',...
'Type','powerdb')
|
NoOfTxAntenna = 2
|
|
NoOfTxAntenna = 4
|
|
NoOfTxAntenna = 8
|
|
NoOfTxAntenna = 16
|
|
Steering with Custom Steering Vector
Followings are the examples that we define our own steering vector.
Example 01 >
The steering vector in this example (marked red) came from a CSI codebook for NR. It is derived as explained here.
c = 3e8; % propagation speed
fc = 26e9; % carrier frequency
lambda = c/fc; % wavelength
NoOfTxAntenna = 4;
antennaElement = phased.CrossedDipoleAntennaElement;
txarray = phased.ULA('NumElements',NoOfTxAntenna,'ElementSpacing',lambda/2,'Element',antennaElement);
txmipos = getElementPosition(txarray)/lambda;
txarraystv = phased.SteeringVector('SensorArray',txarray,'PropagationSpeed',c);
wt = [1 exp(j*pi/4) exp(j*pi/2) (exp(j*pi/2)*exp(j*pi/4))];
txbeam_ang = -90:90;
txbeam_ang_rad = (pi*txbeam_ang)/180;
txbeam = abs(wt*steervec(txmipos,txbeam_ang));
txbeam = txbeam/max(txbeam);
[txbeampos_x,txbeampos_y] = pol2cart(deg2rad(txbeam_ang),txbeam);
hFig = figure(1);
set(hFig, 'Position', [0 0 800 400]);
subplot(1,2,1);
plot(txbeam_ang,txbeam,'r-');
xlabel('txbeam ang');ylabel('txbeam');
set(gca,'xtick',-90:15:90)
xlim([txbeam_ang(1) txbeam_ang(end)]); ylim([0 1.0]);
subplot(1,2,2);
polarplot(txbeam_ang_rad,txbeam,'r');
set(gca,'RTickLabels',[]);
|
|
c = 3e8; % propagation speed
fc = 26e9; % carrier frequency
lambda = c/fc; % wavelength
NoOfTxAntenna = 4;
txarray = phased.ULA('NumElements',NoOfTxAntenna,'ElementSpacing',lambda/2);
w = [1 exp(j*pi/4) exp(j*pi/2) (exp(j*pi/2)*exp(j*pi/4))]';
hFig = figure(1);
pattern(txarray,fc,[-180:180],[-90:90],...
'PropagationSpeed',c,...
'CoordinateSystem','polar',...
'Type','powerdb', ...
'Weights',w)
set(gcf,'color','w');
view(90,20);
sTitle = sprintf("Antenna Array = %d by %d",1,NoOfTxAntenna);
title(sTitle);
set(hFig,'Position',[300 100 800 700]);
|
|
Disclaimer ! :
This page is only to show you the overall logics and visualization for various Phase Array Antenna System. I haven't investigated much about verifying about the accuracy.
If you think the code is not so efficient, it is 100% my fault. I haven't made any effort for effiecient code. I just tried to create code as simple as possible for the readers. As you know, easy-to-read code is not always efficient for a specific chipset.
If you find any mistake in terms of accuracy, it is also very highly likely be my fault. Not the problem of Matlab tool box itself.
Any comment and corrections if you find any mistake will be welcome and appreciated.
|