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.

 Akzeptierte Antwort

Honglei Chen
Honglei Chen am 27 Mai 2020

0 Stimmen

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 Kommentare

ubaid haroon
ubaid haroon am 28 Mai 2020
Bearbeitet: ubaid haroon am 28 Mai 2020
Hi Honglei,
That workaround did work for me. I would've never thought to take the subarray and add weights to that as my "ElementWeights", that was clever. However, It looks like the the pattern is not as expected in azimuth and elevation. If i steer @ Az = 20, El = 20, my mainlobe peaks should be at 20, and 20 for Azimuth and Elevation cuts. Can you please take a look
ubaid haroon
ubaid haroon am 28 Mai 2020
Please try that with num_sub_arrays = [40 27];
Honglei Chen
Honglei Chen am 28 Mai 2020
Bearbeitet: Honglei Chen am 28 Mai 2020
The beam directions seem to be working for me, could you elaborate what the issue is? Here is my code with steering angle set to [20;20] and num_sub_arrays set to [40 27].
fc=[4 12]*1e9;
c = physconst('lightspeed');
steerang = [20;20];
% 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 = [40 27];
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 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(1),20,-90:.1:90 ,'CoordinateSystem', 'Rectangular',...
'type','powerdb','SteerAngle',steerang,...
'Weights',wts_array(:,1),'ElementWeights',ws.*conj(wts_subarray(:,1)));
hold on
pattern(array, fc(2),20,-90:.1:90, 'CoordinateSystem', 'Rectangular',...
'type','powerdb','SteerAngle',steerang,...
'Weights',wts_array(:,2),'ElementWeights',ws.*conj(wts_subarray(:,2)));
subplot(2,1,2)
pattern(array, fc(1),-90:.1:90, 20 ,'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, 20 ,'CoordinateSystem', 'Rectangular',...
'type','powerdb','SteerAngle',steerang,...
'Weights',wts_array(:,2),'ElementWeights',ws.*conj(wts_subarray(:,2)));
ubaid haroon
ubaid haroon am 28 Mai 2020
I was missing to 20 degrees in pattern. This is working. Also, if i want to add some random noise to each element. How would I do that?
ubaid haroon
ubaid haroon am 28 Mai 2020
Bearbeitet: ubaid haroon am 28 Mai 2020
Honglei,
The elevation beam pattern is not as expected. the beam pattern for Az and El should be similar if the array configuration is close to a square. However, thats not the case.
Honglei Chen
Honglei Chen am 29 Mai 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.
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 am 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.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Produkte

Version

R2019a

Community Treasure Hunt

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

Start Hunting!

Translated by