MATLAB Answers

Adding Tapering and Time Delay

9 views (last 30 days)
I am adding time delay on my subarrays and taylor tapering on each element of the subarray and having trouble.
clear,clc, close all
fc=[4 12]*1e9;
c = physconst('lightspeed');
steerang = [20;0];
% Element Definition
rad_ele = phased.CosineAntennaElement('CosinePower', [1.3 1.3], 'FrequencyRange', [0 20e9]);
% SubArray Definition
sub_array_size = [6 8];
antenna_spacing = 0.00762; % in meters
sub_array = phased.URA('Element', rad_ele, 'ElementSpacing', antenna_spacing, 'Size', sub_array_size, 'ArrayNormal', 'x');
%Array Defintion
num_sub_arrays = [20 20];
array = phased.ReplicatedSubarray('Subarray',sub_array,'GridSize',num_sub_arrays,'SubarraySteering','Custom');
% Tapering
taper = taylorwin(sub_array.Size(1)*num_sub_arrays(1)).*taylorwin(sub_array.Size(2)*num_sub_arrays(2))';
ws=[];
for x = 1:num_sub_arrays(2)
for y = 1:num_sub_arrays(1)
temp_taper = taper(sub_array_size(1)*(y-1)+1:sub_array_size(1)*(y),sub_array_size(2)*(x-1)+1:sub_array_size(2)*(x));
%temp_taper = flipud((temp_taper)');
ws(:,end+1) = temp_taper(:); % element weights with taylor tapering
end
end
% Steering vector
steeringvec_replarray = phased.SteeringVector('SensorArray',array,...
'PropagationSpeed',c,'IncludeElementResponse',true);
wts_array = squeeze(steeringvec_replarray(fc,steerang,ws) );
%Plotting
figure
subplot(2,1,1)
pattern(array, fc,-90:.1:90, 0 ,'CoordinateSystem', 'Rectangular',...
'normalize', true,'type','powerdb','SteerAngle',steerang,...
'ElementWeights',ws);
hold on
subplot(2,1,2)
pattern(array, fc,-90:.1:90, 0 ,'CoordinateSystem', 'Rectangular',...
'type','powerdb','SteerAngle',steerang,...
'Weights',wts_array,'ElementWeights',ws);
The trouble I am having is not with tapering but how do I steer my beam with true time delay after tapering?
I tried injecting element weights into the steer vector and looks like that doesn't work.

  0 Comments

Sign in to comment.

Accepted Answer

Honglei Chen
Honglei Chen on 27 May 2020
Unfortuantely at this point there is no straightforward way to combine the element taper with time steering. At this point, I think the best workaround is to build the time steering information, i.e., the steering vector at the proper frequency, into the element weights. Here is an example where I'll start from the defintion of the steering vector. Note that pattern plot will automatically include the element information so there is no need to include element response in the steering vector computation.
% Steering vector for Array
steeringvec_replarray = phased.SteeringVector('SensorArray',array,...
'PropagationSpeed',c,'IncludeElementResponse',false);
wts_array = squeeze(steeringvec_replarray(fc,steerang) );
% Steering vector for subarray
steeringvec_subarray = phased.SteeringVector('SensorArray',sub_array,...
'PropagationSpeed',c,'IncludeElementResponse',false);
wts_subarray = squeeze(steeringvec_subarray(fc,steerang));
%Plotting
figure
subplot(2,1,1)
pattern(array, fc,-90:.1:90, 0 ,'CoordinateSystem', 'Rectangular',...
'normalize', true,'type','powerdb','SteerAngle',steerang,...
'ElementWeights',ws);
subplot(2,1,2)
pattern(array, fc(1),-90:.1:90, 0 ,'CoordinateSystem', 'Rectangular',...
'type','powerdb','SteerAngle',steerang,...
'Weights',wts_array(:,1),'ElementWeights',ws.*conj(wts_subarray(:,1)));
hold on
pattern(array, fc(2),-90:.1:90, 0 ,'CoordinateSystem', 'Rectangular',...
'type','powerdb','SteerAngle',steerang,...
'Weights',wts_array(:,2),'ElementWeights',ws.*conj(wts_subarray(:,2)));
Note that you need to pass in the ElementWeights separeately for each frequency.
HTH and we will look into how to make this easier.

  8 Comments

Show 5 older comments
Honglei Chen
Honglei Chen on 29 May 2020
I think what you saw there is because the elevation cut is along a specific angle yet when the array is steered to [20;20], there is a slight tilt. I looked at the 3D pattern and it looked fine
The 3D does take a long time because of the size of the array.
When you say adding noise, do you mean to add noise to the element's weight or do you mean to add noise to the received signal? Thanks.
ubaid haroon
ubaid haroon on 29 May 2020
How come the weird sidelobe pattern shows up only in the elevation cut and not in azimuth cut? If I steer @ Az =20, and El = 20, I would assume both cuts to be almost the same. I was trying to plot a 3D image but it was taking more than 30 mins to plot. Is there a quicker way to plot the 3D response?
Before you provided me the solution, this is how I was adding noise (in this code, I was doing an experiment taper on the subarrays which was not ideal). If you see below, i was taking mean of ws for my weights.
clear,clc,% close all
fc=[10]*1e9;
c = physconst('lightspeed');
steerang = [0;0];
% Element Definition
rad_ele = phased.CosineAntennaElement('CosinePower', [1.3 1.3], 'FrequencyRange', [0 21e10]);
% SubArray Definition
sub_array_size = [10 10];
antenna_spacing = 0.011176; % in meters
sub_array = phased.URA('Element', rad_ele, 'ElementSpacing', antenna_spacing, 'Size', sub_array_size, 'ArrayNormal', 'x');
%Array Defintion
num_sub_arrays = [10 10 ];
%num_sub_arrays = [2 2];
array = phased.ReplicatedSubarray('Subarray',sub_array,'GridSize',num_sub_arrays,'SubarraySteering','Time');
% Tapering
taper = taylorwin( sub_array.Size(1)*num_sub_arrays(1) ).*taylorwin( sub_array.Size(2)*num_sub_arrays(2) )';
ws=[];
for x = 1:num_sub_arrays(2)
for y = 1:num_sub_arrays(1)
temp_taper = taper(sub_array_size(1)*(y-1)+1:sub_array_size(1)*(y),sub_array_size(2)*(x-1)+1:sub_array_size(2)*(x));
temp_taper = flipud((temp_taper)');
ws(:,end+1) = temp_taper(:); % element weights with taylor tapering
end
end
ws = mean(ws)';
% Steering vector
steervec = phased.SteeringVector('SensorArray',array,...
'PropagationSpeed',c,'IncludeElementResponse',false);
% steer in angle and freq
wts_array = steervec(fc,steerang);
% Generate Noise
sigma = 0.092; mu = 6*pi/180;
msize = [1,num_sub_arrays(1)*num_sub_arrays(2)];
perr = (1 + normrnd(0,sigma, msize)).*exp(1j*(mu+normrnd(0,sigma,msize)));
wts_err = wts_array.*perr'; % array with noise (you can compare wts_array weights and wts_err weights to see the error)
% Create Taper
wts_array_taper = ws.*wts_array;
% Add noise to taper
wts_err_taper = taylorwin(numel(wts_array )).*wts_array.*perr';
wts_err_taper = ws.*wts_array.*perr';
% Plotting to compare results
figure;
pattern(array, fc,-90:0.01:90,steerang(2),'CoordinateSystem', 'Rectangular',...
'weights',wts_array, ...
'type','powerdB','steerAngle',steerang)
hold on
pattern(array, fc,-90:0.01:90,steerang(2),'CoordinateSystem', 'Rectangular',...
'weights',wts_err, ...
'type','powerdB','steerAngle',steerang)
legend('No Noise','Noise')
figure;
pattern(array, fc,-90:0.01:90,steerang(2),'CoordinateSystem', 'Rectangular',...
'weights',wts_array_taper, ...
'type','powerdB','steerAngle',steerang)
hold on
pattern(array, fc,-90:0.01:90,steerang(2),'CoordinateSystem', 'Rectangular',...
'weights',wts_err_taper, ...
'type','powerdB','steerAngle',steerang)
legend('No Noise Taper','Noise Taper')
If I want to now add the noise perr (now the noise is going to be added to the elements rather than the subarrays. How would I do that?
This is what I did with the code you gave me, but the sidelobes come up really high. I am not sure if I did this right.
msize = [1,num_sub_arrays(1)*num_sub_arrays(2)];
perr = (1 + normrnd(0,sigma, msize)).*exp(1j*(mu+normrnd(0,sigma,msize)));
perr_sub = (1 + normrnd(0,sigma, [1,96])).*exp(1j*(mu+normrnd(0,sigma,[1 96])));
wts_err = wts_array.*perr'; % weights with noise
wts_err_sub = wts_subarray.*perr_sub'; % weights with noise
Honglei Chen
Honglei Chen on 4 Jun 2020
I think the weird shape is related to how we cut the pattern. Never really thought about that but I think once the array is steered, the pattern is actually uniform in the directional cosine space, therefore it is tilted in the constant angle cut.
I think your approach looks reasonable to me for the perturnbation. The only thing I'm not too sure is for the phase. I think normally the phase noise is uniform within 2pi.

Sign in to comment.

More Answers (0)