How can I use replicated subarrays and still set individual taper and phases?

5 vues (au cours des 30 derniers jours)
Hi, I am trying to create a URA from sub arrays and steer the entire array by setting the wieghts and phases of each individaul element in each subarray. When I try to use 'SubarraySteering set to custom it yeilds an error asking for a differnet size input for ws. When I give it the size it wants it asks for another size. Is this a bug or am I appling the weighting wrong?
fc = 10e9;
c = physconst('lightspeed');
lambda = c/fc;
ele = phased.CosineAntennaElement;
antenna_spacing = lambda/2;
element_per_sub = [2 2];
sub_array = phased.URA('Element', ele, 'ElementSpacing', lambda/2, 'Size', element_per_sub);
num_sub_arrays = [2 4];
array = phased.ReplicatedSubarray('Subarray', sub_array, 'Layout', 'Custom', 'SubarraySteering', 'custom');
sub_pos =[];
sub_norm = [];
for ii = 1:num_sub_arrays(1)
for jj = 1:num_sub_arrays(2)
sub_pos(:,end+1) = [mod((ii-1),4)*antenna_spacing*2; mod((jj-1), 80)*2*antenna_spacing; 0];
sub_norm(:,end+1) = [0;-90];
end
end
array.SubarrayPosition=sub_pos;
array.SubarrayNormal = sub_norm;
taper = taylorwin(sub_array.Size(1)*num_sub_arrays(1)).*taylorwin(sub_array.Size(2)*num_sub_arrays(2))';
sub_array.Taper=taper;
ws = [];
for ii =1:num_sub_arrays(1)
for jj =1:num_sub_arrays(2)
temp_val = taper(element_per_sub(1)*(ii-1)+1:element_per_sub(1)*(ii), element_per_sub(2)*(jj-1)+1:element_per_sub(2)*(jj));
ws(:,end+1) = temp_val(:);
end
end
sv = phased.SteeringVector('SensorArray', array, 'IncludeElementResponse', true);
step(array, fc, c, [30;30], ws)
pattern(array, fc, 'Weights', ws(:))

Réponse acceptée

Honglei Chen
Honglei Chen le 22 Août 2019
If you set SubarraySteering to Custom, it means you want to control each element individually, thus you need to provide a weights that matches the number of elements. This is different than the SteeringVector since for a subarray, the steering vector is only computed at subarray level. You can specify the weights for each element using ElementWeights option when calling pattern(), like
fc = 10e9;
c = physconst('lightspeed');
lambda = c/fc;
ele = phased.CosineAntennaElement;
antenna_spacing = lambda/2;
element_per_sub = [2 2];
sub_array = phased.URA('Element', ele, 'ElementSpacing', lambda/2, 'Size', element_per_sub);
num_sub_arrays = [2 4];
array = phased.ReplicatedSubarray('Subarray', sub_array, 'Layout', 'Custom', 'SubarraySteering', 'custom');
sub_pos =[];
sub_norm = [];
for ii = 1:num_sub_arrays(1)
for jj = 1:num_sub_arrays(2)
sub_pos(:,end+1) = [mod((ii-1),4)*antenna_spacing*2; mod((jj-1), 80)*2*antenna_spacing; 0];
sub_norm(:,end+1) = [0;-90];
end
end
array.SubarrayPosition=sub_pos;
array.SubarrayNormal = sub_norm;
taper = taylorwin(sub_array.Size(1)*num_sub_arrays(1)).*taylorwin(sub_array.Size(2)*num_sub_arrays(2))';
% sub_array.Taper=taper;
ws = [];
for ii =1:num_sub_arrays(1)
for jj =1:num_sub_arrays(2)
temp_val = taper(element_per_sub(1)*(ii-1)+1:element_per_sub(1)*(ii), element_per_sub(2)*(jj-1)+1:element_per_sub(2)*(jj));
ws(:,end+1) = temp_val(:);
end
end
sv = phased.SteeringVector('SensorArray', array, 'IncludeElementResponse', true);
step(array, fc, [30;30], c, ws)
pattern(array, fc, 'ElementWeights', ws)
HTH
  1 commentaire
Garrett Newell
Garrett Newell le 22 Août 2019
Great, that worked. Although it appears to not actaully change the array response with the elementWeights arguments.
% function [array] = MakeArray()
% This will create the entire array and pass it back
fc=10e9;
rad_ele = phased.CosineAntennaElement('CosinePower', [1.5 1.5], 'FrequencyRange', [0 20e9]);
antenna_spacing = .58*.0254; % in meters
array_size = [64 1280];
sub_array_size = [16 16];
% num_sub_arrays = array_size./sub_array_size;
num_sub_arrays = [2 4];
sub_array = phased.URA('Element', rad_ele, 'ElementSpacing', antenna_spacing, 'Size', sub_array_size, 'ArrayNormal', 'x');
array = phased.ReplicatedSubarray('Subarray', sub_array, 'Layout', 'Custom', 'SubarraySteering', 'Phase');
sub_pos =[];
sub_norm = [];
for ii = 1:num_sub_arrays(1)
for jj = 1:num_sub_arrays(2)
sub_pos(:,end+1) = [ 0 ;mod((ii-1),4)*antenna_spacing*16; mod((jj-1), 80)*16*antenna_spacing];
sub_norm(:,end+1) = [0;0];
end
end
array.SubarrayPosition = sub_pos;
array.SubarrayNormal= sub_norm;
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(2)*(y-1)+1:sub_array_size(2)*(y),sub_array_size(1)*(x-1)+1:sub_array_size(1)*(x));
temp_taper = flipud((temp_taper)');
temp = ~temp;
ws(:,end+1) = temp_taper(:);
end
end
p=pattern(array, fc, 0, -10:.1:10, 'ElementWeights', ws, 'CoordinateSystem', 'Rectangular', 'normalize', true, 'type' , 'powerdb');
%% Refernce
temp_array = phased.URA('Element', rad_ele, 'ElementSpacing', antenna_spacing, 'Size', num_sub_arrays.*sub_array_size)
p_ref1 = pattern(temp_array, fc, -10:.1:10,0, 'CoordinateSystem', 'Rectangular', 'normalize', true, 'type' , 'powerdb');
temp_array.Taper = taper;
p_ref = pattern(temp_array, fc, -10:.1:10,0, 'CoordinateSystem', 'Rectangular', 'normalize', true, 'type' , 'powerdb');
figure; hold;
plot( -10:.1:10, p, '-xb', 'DisplayName', 'SubArray Response With Taper')
plot( -10:.1:10, p_ref, 'DisplayName', 'URA Response With Taper')
plot( -10:.1:10, p_ref1, 'DisplayName', 'URA Response Without Taper')
legend
Results.jpg

Connectez-vous pour commenter.

Plus de réponses (0)

Community Treasure Hunt

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

Start Hunting!

Translated by