Followings are the code that I wrote in Matlab 2019b and Phased Array System Toolbox to creates all the plots shown in this page. You may copy these code and play with these codes. Change variables and try yourself until you get your own intuitive understanding.
It will be helpful for you to understand the code here if you take a look at this page and understand how the radiation daigram for ULA (Uniform Linear Array). Make some practice until you are able to draw a radiation pattern of linear array antenna
on your own.
The highlighted part in the code is for drawing the radiation pattern, W_5_2_2_2_1_5() is to calculate the weight vector based on 3GPP NR Codebook Calculation Algorithm explained in this page.
NOTE : At first look, it may not make much of sense, but a couple of things that would seem obvious are
-
whenever i11changes the direction of the beam changes
-
whenever i2changes the direction of the beam does not changes. only phase value for each antenna element changes
-
Once you get this high level observation, check out the mathematics of this table and try to associate the observation with the math part if you are interested.
< Code 1 >
function main
c = 3e8; % propagation speed
fc = 26e9; % carrier frequency
lambda = c/fc; % wavelength
NoOfTxAntenna = 8;
antennaElement = phased.CrossedDipoleAntennaElement;
txarray = phased.ULA('NumElements',NoOfTxAntenna,'ElementSpacing',lambda/2,'Element',antennaElement);
txmipos = getElementPosition(txarray)/lambda;
txarraystv = phased.SteeringVector('SensorArray',txarray,'PropagationSpeed',c);
P_CSIRS = 16;
N1 = 8;
N2 = 1;
O1 = 4;
O2 = 1;
i2List = [0 1 2 3;4 5 6 7;8 9 10 11;12 13 14 15];
fidx = 1;
for i2si = 1:4
for i11 = 0 : (N1*O1-1)
for i12 = 0 : (N2*O2-1)
%for i2 = i2List(:,i2si)'
for i2 = i2List(i2si,:)
i_11 = i11;
i_12 = i12;
i_2 = i2;
W = W_5_2_2_2_1_5(2,P_CSIRS,N1,O1,N2,O2,i_11,i_12,i_2);
tStr = sprintf('i_{11} = %d, i_{12} = %d, i_2 = %d',i_11,i_12,i_2);
wStr = sprintf('i_11 = %d, i_12 = %d, i_2 = %d',i_11,i_12,i_2);
for i = 1:15
wStr = sprintf('%s ,%0.4f+%0.4fi',wStr,real(W(i)),imag(W(i)));
end
wStr = sprintf('%s\r\n',wStr);
disp(wStr);
disp(W);
%wt = W.';
wt = W;
wt1 = wt(1:numel(wt)/2);
wt2 = wt(numel(wt)/2+1:end);
txbeam_ang = -90:90;
txbeam_ang_rad = (pi*txbeam_ang)/180;
txbeam1 = (wt1*steervec(txmipos,txbeam_ang));
txbeamMag1 = abs(txbeam1)/max(abs(txbeam1));
txbeamArg1 = angle(txbeam1)/max(angle(txbeam1));
txbeam2 = (wt2*steervec(txmipos,txbeam_ang));
txbeamMag2 = abs(txbeam2)/max(abs(txbeam2));
txbeamArg2 = angle(txbeam2)/max(angle(txbeam2));
hFig = figure(1);
set(hFig, 'Position', [100 100 600 500]);
set(gcf,'color','w');
subplot(3,2,1);
polarplot(txbeam_ang_rad,txbeamMag1,'r');
set(gca,'RTickLabels',[]);
title(tStr);
subplot(3,2,2);
polarplot(txbeam_ang_rad,txbeamMag2,'r');
set(gca,'RTickLabels',[]);
title(tStr);
subplot(3,2,3);
polarplot(txbeam_ang_rad,txbeamArg1,'b');
set(gca,'RTickLabels',[]);
title('Phase');
subplot(3,2,4);
polarplot(txbeam_ang_rad,txbeamArg2,'b');
set(gca,'RTickLabels',[]);
title('Phase');
subplot(3,2,5);
plot(real(wt1),imag(wt1),'ro');
axis([-1.0 1.0 -1.0 1.0]);
pbaspect([1 1 1]);
title("W - pol 1");
subplot(3,2,6);
plot(real(wt2),imag(wt2),'ro');
axis([-1.0 1.0 -1.0 1.0]);
pbaspect([1 1 1]);
title("W - pol 2");
pause(0.2);
end
end
end
end
fclose(fileID);
end
function W = W_5_2_2_2_1_5(CBtype,P_CSIRS,N1,O1,N2,O2,i_11,i_12,i_2)
if CBtype == 1
l = i_11;
m = i_12;
n = i_2;
elseif CBtype == 2 & N2 == 1
if ismember(i_2, [0 1 2 3])
l = 2 * i_11 + 0;
elseif ismember(i_2, [4 5 6 7])
l = 2 * i_11 + 1;
elseif ismember(i_2, [8 9 10 11])
l = 2 * i_11 + 2;
elseif ismember(i_2, [12 13 14 15])
l = 2 * i_11 + 3;
end
m = 0;
n = mod(i_2,4);
%disp(n);
elseif CBtype == 2 & N2 > 1
% l = i_11;
% m = i_12;
% n = i_2;
end
Vlm = CalcVlm(l,N1,O1,m,N2,O2);
Pn = PhiN(n);
%W = (1/sqrt(P_CSIRS)) * [Vlm Pn*Vlm].';
W = (1/sqrt(P_CSIRS)) * [Vlm Pn.*Vlm];
end
function Pn = PhiN(n)
Pn = exp(j*pi*n/2);
end
function Vlm = CalcVlm(l,N1,O1,m,N2,O2)
Vlm = [1];
Um = CalcUm(m,N2,O2);
for n = 1 : N1-1
Vlm = [Vlm exp(j*(2*pi*l*n)/(O1*N1))*Um];
end
end
function Um = CalcUm(m,N2,O2)
if N2 == 1
Um = 1;
else
Um = [];
for n = 0 : N2-1
Um = [Um exp(j*(2*pi*m*n)/(O2*N2))];
end
end
end
|