phased array antenna simulation

20 views (last 30 days)
Mani
Mani on 29 Apr 2024
Commented: Mani on 13 May 2024
i want to simualte antenna radition pattern of radar rx antenna using 8 element linear antenna (as shown in figure 2).i could able to create the required radiation pattern by placing the antenna element on Y axis(ref figure 1) ,(Matlab code is attached for reference):
%%%%%%%%%START of matlab code for antenna element placing on Y axis %%%%%%%%%%%%%
clc;
clear all;
close all;
%fc = 77e9;
fc = 60e9;
%c = 3e8;
c = physconst('LightSpeed');
lambda = c/fc;
Nt = 2;
Nr = 4;
ang = -90:90;
% % If both arrays have half-wavelength spacing, which are sometimes referred to as full arrays,
% % then the two-way pattern is close to the receive array pattern.
dr = lambda/2;
dt = Nr*(lambda/2);
Vy_pos1 = [0;-lambda;0];
Vy_pos2 = [0;-lambda+(lambda/2);0];
Vy_pos3 = [0;-lambda+ 2*(lambda/2);0];
Vy_pos4 = [0;-lambda+ 3*(lambda/2);0];
Vy_pos5 = [0;-lambda+ 4*(lambda/2);0];
Vy_pos6 = [0;-lambda+ 5*(lambda/2);0];
Vy_pos7 = [0;-lambda+ 6*(lambda/2);0];
Vy_pos8 = [0;-lambda+ 7*(lambda/2);0];
vxarray_4 = phased.ConformalArray('ElementPosition',[Vy_pos1,Vy_pos2,Vy_pos3,Vy_pos4,Vy_pos5,Vy_pos6,Vy_pos7,Vy_pos8]);
figure
viewArray(vxarray_4 ,'ShowIndex','All','ShowNormal',true,'Title',' conformal virtual array ,aantenna elements placed on Y axis');
patv_4 = pattern(vxarray_4,fc,ang,0,'Type','powerdb');
figure;
helperPlotMultipledBPattern(ang,[patv_4],[-30 0],...
{'Two-way Pattern','Virtual Array Pattern'},...
'Patterns of thin/full arrays and virtual array',...
{'-','--'},[1 2]);
%%%%%%%%%End of matlab code for antenna element placing on Y axis %%%%%%%%%%%%%
But my requirement is to achieve the same radaiation pattern by keeping antenna elements placement on X axis insetad of Y axis.please kindly check and confirm on how to realise same pattern by placing antenna element on the X axis(instead of y axis)?
i tried to place antenna elements on X axis and try to plot the resultant pattern but it doesnot meet the my required pattern.
figures and codes of the same are attached for reference.
%%%%%%%%%START of matlab code for antenna element placing on X axis %%%%%%%%%%%%%
clc;
clear all;
close all;
%fc = 77e9;
fc = 60e9;
%c = 3e8;
c = physconst('LightSpeed');
lambda = c/fc;
Nt = 2;
Nr = 4;
ang = -90:90;
% % If both arrays have half-wavelength spacing, which are sometimes referred to as full arrays,
% % then the two-way pattern is close to the receive array pattern.
dr = lambda/2;
dt = Nr*(lambda/2);
Vx_pos1 = [-lambda;0;0];
Vx_pos2 = [-lambda+(lambda/2);0;0];
Vx_pos3 = [-lambda+ 2*(lambda/2);0;0];
Vx_pos4 = [-lambda+ 3*(lambda/2);0;0];
Vx_pos5 = [-lambda+ 4*(lambda/2);0;0];
Vx_pos6 = [-lambda+ 5*(lambda/2);0;0];
Vx_pos7 = [-lambda+ 6*(lambda/2);0;0];
Vx_pos8 = [-lambda+ 7*(lambda/2);0;0];
vxarray_3 = phased.ConformalArray('ElementPosition',[Vx_pos1,Vx_pos2,Vx_pos3,Vx_pos4,Vx_pos5,Vx_pos6,Vx_pos7,Vx_pos8]);
figure
viewArray(vxarray_3 ,'ShowIndex','All','ShowNormal',true,'Title',' conformal virtual array ,antenna elements placed on X axis');
patv_3 = pattern(vxarray_3,fc,ang,0,'Type','powerdb');
figure;
helperPlotMultipledBPattern(ang,[patv_3],[-30 0],...
{'Two-way Pattern','Virtual Array Pattern'},...
'Patterns of thin/full arrays and virtual array',...
{'-','--'},[1 2]);
%%%%%%%%%End of matlab code for antenna element placing on X axis %%%%%%%%%%%%%
please kindly check and confirm on how to realise rquired pattern by placing antenna element on the X axis(instead of y axis)?

Answers (1)

Honglei Chen
Honglei Chen on 10 May 2024
You can set the ArrayAxis in phased.ULA to 'x' to achieve that.
Hope this helps
  3 Comments
Honglei Chen
Honglei Chen on 13 May 2024
Edited: Honglei Chen on 13 May 2024
In general if you put elements on x axis, then the pattern would be different. Could you explain what you mean by "the same radiation pattern"? If it's the same shape but rotated then that's possible. Otherwise, in general it is not expected that the two patterns can match.
Also, when I mentioned seeting the array axis to 'x', I meant
phased.ULA('ArrayAxis','x')
Mani
Mani on 13 May 2024
hi honglei,
i m just adding few more additional information here over the reply i have sent it via mail in the morning.this info might helpful to get better understanding on my requirement and issue.
i have just used the matlab example "increasing angular resolution with virtual arrays"- this example shows how to simulate a coherent MIMO radar signal processing chain using Phased Array System Toolbox.
my requirement also same simulating radar model to detect the target present infront of the antenna.only changes need is antenna element placement on the X-axis instead of Y-axis and try to detect the targets.
(i have attached the matlab example code below for your reference
%%%%%%%%%%% start of matlab increasing angular resolution with virtual arrays example %%%%%%%%
clc;
close all;
clear all;
%%%%%%%%%%%%%%%% TDM MIMO MATLAB EXAMPLE %%%%%%%%%
% the two-way pattern of a conventional phased array radar. The two-way pattern of a phased array radar is the product of its transmit array pattern and receive array pattern. For example,
% consider a 77 GHz millimeter wave radar with a 2-element transmit array and a 4-element receive array.
fc = 77e9;
c = 3e8;
lambda = c/fc;
Nt = 2;
Nr = 4;
% % If both arrays have half-wavelength spacing, which are sometimes referred to as full arrays,
% % then the two-way pattern is close to the receive array pattern.
dt = lambda/2;
dr = lambda/2;
%%%%%%%%% to place antenna elements on y axis %%%%
txarray = phased.ULA(Nt,dt,'ArrayAxis','y');
rxarray = phased.ULA(Nr,dr,'ArrayAxis','y');
%%%%%%%%% to place antenna elements on X axis %%%%
% txarray = phased.ULA(Nt,dt,'ArrayAxis','x');
% rxarray = phased.ULA(Nr,dr,'ArrayAxis','x');
ang = -90:90;
pattx = pattern(txarray,fc,ang,0,'Type','powerdb');
patrx = pattern(rxarray,fc,ang,0,'Type','powerdb');
pat2way = pattx+patrx;
helperPlotMultipledBPattern(ang,[pat2way pattx patrx],[-30 0],...
{'Two-way Pattern','Tx Pattern','Rx Pattern'},...
'Patterns of full/full arrays - 2Tx, 4Rx',...
{'-','--','-.'});
% % If the full transmit array is replaced with a thin array, meaning the element spacing is wider than half wavelength, then the two-way pattern has a narrower beamwidth.
% % Notice that even though the thin transmit array has grating lobes, those grating lobes are not present in the two-way pattern.
dt = Nr*lambda/2;
txarray = phased.ULA(Nt,dt);
pattx = pattern(txarray,fc,ang,0,'Type','powerdb');
pat2way = pattx+patrx;
figure
helperPlotMultipledBPattern(ang,[pat2way pattx patrx],[-30 0],...
{'Two-way Pattern','Tx Pattern','Rx Pattern'},...
'Patterns of full/full arrays - 2Tx, 4Rx',...
{'-','--','-.'});
varray = phased.ULA(Nt*Nr,dr);
patv = pattern(varray,fc,ang,0,'Type','powerdb');
figure
helperPlotMultipledBPattern(ang,[pat2way patv],[-30 0],...
{'Two-way Pattern','Virtual Array Pattern'},...
'Patterns of thin/full arrays and virtual array',...
{'-','--'},[1 2]);
%%%%%% TDM-MIMO Radar Simulation%%%%
waveform = helperDesignFMCWWaveform(c,lambda);
fs = waveform.SampleRate;
transmitter = phased.Transmitter('PeakPower',0.001,'Gain',36);
receiver = phased.ReceiverPreamp('Gain',40,'NoiseFigure',4.5,'SampleRate',fs);
txradiator = phased.Radiator('Sensor',txarray,'OperatingFrequency',fc,...
'PropagationSpeed',c,'WeightsInputPort',true);
rxcollector = phased.Collector('Sensor',rxarray,'OperatingFrequency',fc,...
'PropagationSpeed',c);
radar_speed = 100*1000/3600; % Ego vehicle speed 100 km/h
radarmotion = phased.Platform('InitialPosition',[0;0;0.5],'Velocity',[radar_speed;0;0]);
car_dist = [40 50]; % Distance between sensor and cars (meters)
car_speed = [-80 96]*1000/3600; % km/h -> m/s
car_az = [-10 10];
car_rcs = [20 40];
car_pos = [car_dist.*cosd(car_az);car_dist.*sind(car_az);0.5 0.5];
cars = phased.RadarTarget('MeanRCS',car_rcs,'PropagationSpeed',c,'OperatingFrequency',fc);
carmotion = phased.Platform('InitialPosition',car_pos,'Velocity',[car_speed;0 0;0 0]);
channel = phased.FreeSpace('PropagationSpeed',c,...
'OperatingFrequency',fc,'SampleRate',fs,'TwoWayPropagation',true);
rng(2017);
Nsweep = 64;
Dn = 2; % Decimation factor
fs = fs/Dn;
xr = complex(zeros(fs*waveform.SweepTime,Nr,Nsweep));
w0 = [0;1]; % weights to enable/disable radiating elements
for m = 1:Nsweep
% Update radar and target positions
[radar_pos,radar_vel] = radarmotion(waveform.SweepTime);
[tgt_pos,tgt_vel] = carmotion(waveform.SweepTime);
[~,tgt_ang] = rangeangle(tgt_pos,radar_pos);
% Transmit FMCW waveform
sig = waveform();
txsig = transmitter(sig);
% Toggle transmit element
w0 = 1-w0;
txsig = txradiator(txsig,tgt_ang,w0);
% Propagate the signal and reflect off the target
txsig = channel(txsig,radar_pos,tgt_pos,radar_vel,tgt_vel);
txsig = cars(txsig);
% Dechirp the received radar return
rxsig = rxcollector(txsig,tgt_ang);
rxsig = receiver(rxsig);
dechirpsig = dechirp(rxsig,sig);
% Decimate the return to reduce computation requirements
for n = size(xr,2):-1:1
xr(:,n,m) = decimate(dechirpsig(:,n),Dn,'FIR');
end
end
xr1 = xr(:,:,1:2:end);
xr2 = xr(:,:,2:2:end);
xrv = cat(2,xr1,xr2);
nfft_r = 2^nextpow2(size(xrv,1));
nfft_d = 2^nextpow2(size(xrv,3));
figure
rngdop = phased.RangeDopplerResponse('PropagationSpeed',c,...
'DopplerOutput','Speed','OperatingFrequency',fc,'SampleRate',fs,...
'RangeMethod','FFT','PRFSource','Property',...
'RangeWindow','Hann','PRF',1/(Nt*waveform.SweepTime),...
'SweepSlope',waveform.SweepBandwidth/waveform.SweepTime,...
'RangeFFTLengthSource','Property','RangeFFTLength',nfft_r,...
'DopplerFFTLengthSource','Property','DopplerFFTLength',nfft_d,...
'DopplerWindow','Hann');
[resp,r,sp] = rngdop(xrv);
plotResponse(rngdop,squeeze(xrv(:,1,:)));
respmap = squeeze(mag2db(abs(resp(:,1,:))));
ridx = helperRDDetection(respmap,-10);
xv = squeeze(sum(resp(ridx,:,:),1))';
doa = phased.BeamscanEstimator('SensorArray',varray,'PropagationSpeed',c,...
'OperatingFrequency',fc,'DOAOutputPort',true,'NumSignals',2,'ScanAngles',ang);
[Pdoav,target_az_est] = doa(xv);
fprintf('target_az_est = [%s]\n',num2str(target_az_est));
doarx = phased.BeamscanEstimator('SensorArray',rxarray,'PropagationSpeed',c,...
'OperatingFrequency',fc,'DOAOutputPort',true,'ScanAngles',ang);
Pdoarx = doarx(xr);
figure
helperPlotMultipledBPattern(ang,mag2db(abs([Pdoav Pdoarx])),[-30 0],...
{'Virtual Array','Physical Array'},...
'Spatial spectrum for virtual array and physical array',{'-','--'});
%%%%%%%%%%% End of matlab increasing angular resolution with virtual arrays example %%%%%%%%
Note: antenna placement axis can be changed in the above code by commenting/uncommenting phased.ULA code line in the above code.
my question:
1. with antenna elements placed on Y-axis ,target Azimuth angles are estimated
target_az_est = [-6 10] correctly close to theortical values car_az = [-10 10] in the initial position.
but with antenna elements placed on X-axis ,target Azimuth angles are estimated
target_az_est = [72 16] incorrectly compare to theortical values of car_az = [-10 10] in the initial position.
its clear that this incorrect estimation is happening due to antenna pattern only,
my requirement is to detect the target azimuth angle correctly with antenna elements placed on X-axis.
please check and let me know how to do it? and what changes need to be done in the code?
Regards,
Mani

Sign in to comment.

Products


Release

R2020a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!