Target Strength Patterns for Underwater Object Detection with an Active Sonar Example
Show older comments
Hi,
I'm using the example here https://www.mathworks.com/help/phased/ug/underwater-target-detection-with-an-active-sonar-system.html to simulate Sonar Data for targeting simple objects. The example uses a sine wave or a pattern of 1's, and my team wanted to use basic 3D-shapes instead of those.
I implemented the cylinder tsSignature pattern found here https://www.mathworks.com/help/fusion/ref/tssignature.html; Using the target strength signature of a cylinder in the original simulation can still target that pattern and output results.
However, the results do not change with the size of the cylinder, they only change if the cylinder's origin is moved. I think the issue could be in two areas: The target creation, or the Transmitter/Recever Simulation. I have also created a random array that is the same size of the target strength signatures of the previously mentioned targets, and the Integrated Pulse Data displays the same exact pattern. Since there are 10,000 samples taken in about 65 seconds, this can't be coincidence.
My question is, has anyone integrated different targets into this example successfully? Our goal is very simple 3D-shapes, nothing complicated. Any recommendations on how to go about this would be greatly appreciated, I've been setback a couple of weeks trying to fix this issue.
The structure of the script is the same as the Underwater Target Detection program, and uses the Phased Array ToolBox as well.
The two sections of the code that I think are the source of the problem, as well as the function for creating the target strength cylinder are below:
%% Creating the Targets for the Sonar
target1 = phased.BackscatterSonarTarget('Model','Nonfluctuating', ...
'AzimuthAngles',az1,'ElevationAngles',el1, ...
'TSPattern',tspatterndb1);
target2 = phased.BackscatterSonarTarget('Model','Nonfluctuating', ...
'AzimuthAngles',az2,'ElevationAngles',el2, ...
'TSPattern',tspatterndb2);
tgt{1} = target1; % Assigning targets
tgt{2} = target2;
InitialPositiontgt1 = [500; 100; -70]; % Position of target #1
InitialPositiontgt2 = [500; -90; -40]; % Position of target #2
% Creating transpose matrices of the initial positions for a plot
iposition = [InitialPositiontgt1 InitialPositiontgt2];
tgtplat{1} = phased.Platform(InitialPositiontgt1,[0; 0; 0]);
% Creating the position and velocity of target #1
tgtplat{2} = phased.Platform(InitialPositiontgt2,[0; 0; 0]);
% Creating the position and velocity of target #2
%% Transmitter Waveform
% Creating a rectangular waveform as the energy towards the targets
maxRange = 50000; % Maximum unambiguous range
rangeRes = 10; % Required range resolution
prf = propSpeed/(2*maxRange); % Pulse repetition frequency
pulse_width = 2*rangeRes/propSpeed; % Pulse width
pulse_bw = 1/pulse_width; % Pulse bandwidth
fs = 2*pulse_bw; % Sampling rate
wav = phased.RectangularWaveform(...
'PulseWidth',pulse_width,...
'PRF',prf,...
'SampleRate',fs);
% Rectangular Waveform created
% Changing Sample Rate of channels to coincide with waveform
channel{1}.SampleRate = fs; % Channel 1 Sample Rate
channel{2}.SampleRate = fs; % Channel 2 Sample Rate
%% Transmitter
plat = phased.Platform(...
'InitialPosition',[0; 0; 0],...
'Velocity',[0; 0; 0]);
% The same source position is used in the above helperPathsPlot
proj = phased.IsotropicProjector(...
'FrequencyRange',[0 30e3],'VoltageResponse',80,'BackBaffled',true);
% Projectors that will transmit the signal
[ElementPosition,ElementNormal] = helperSphericalProjector(8,fc,propSpeed);
projArray = phased.ConformalArray(...
'ElementPosition',ElementPosition,...
'ElementNormal',ElementNormal,'Element',proj);
figure(3)
% A third figure is created to show how the projectors output the signal
% for detection, this can be commented out or removed entirely when the
% code is verified
viewArray(projArray,'ShowNormals',true);
%% Receiver
hydro = phased.IsotropicHydrophone(...
'FrequencyRange',[0 30e3],'VoltageSensitivity',-100);
% Receiver made of a hydrophone and an amplifier
rx = phased.ReceiverPreamp(...
'Gain',10,... % dB Gain
'NoiseFigure',10,... % Noise in dB
'SampleRate',fs,... % Same sampling rate as the transmitter & waveform
'SeedSource','Property',...
'Seed',2007);
% Receiver Simulated
%% Radiator and Collector
% The below code is taken from the Underwater Active Sonar Simulation
radiator = phased.Radiator('Sensor',projArray,'OperatingFrequency',...
fc,'PropagationSpeed',propSpeed);
% Represents the radiator using the same parameters as the receiver
collector = phased.Collector('Sensor',hydro,'OperatingFrequency',fc,...
'PropagationSpeed',propSpeed);
% The collector also uses the same parameters
%% Sonar System Simulation
x = wav(); % Generate pulse
xmits = 100; % Number of repetition intervals
rx_pulses = zeros(size(x,1),xmits); % Creates a receiver pulse for each
% transmission
t = (0:size(x,1)-1)/fs; % Sets time interval of transmission using
% sampling parameters from transmitter/receiver
for j = 1:xmits % Usually for i:xmits
% Update target and sonar position
[sonar_pos,sonar_vel] = plat(1/prf);
for i = 1:2 %Loop over targets
[tgt_pos,tgt_vel] = tgtplat{i}(1/prf);
% Compute transmission paths using the method of images. Paths are
% updated according to the CoherenceTime property.
[paths,dop,aloss,tgtAng,srcAng] = isopath{i}(...
sonar_pos,tgt_pos,...
sonar_vel,tgt_vel,1/prf);
% Compute the radiated signals. Steer the array towards the target.
tsig = radiator(x,srcAng);
% Propagate radiated signals through the channel.
tsig = channel{i}(tsig,paths,dop,aloss);
% Target
tsig = tgt{i}(tsig,tgtAng);
% Collector
rsig = collector(tsig,srcAng);
rx_pulses(:,j) = rx_pulses(:,j) + ...
rx(rsig);
end
end
% Transmits the waveform, simulation of signal received each transmission
%% Plotting the Integrated Received Pulses
figure(4) % New figure, switch to #5 if the Azimuth cut plot is needed
rx_pulses = pulsint(rx_pulses,'noncoherent'); % Array of receiver data
plot(t,abs(rx_pulses)) % Time and receiver data
grid on
xlabel('Time (s)') % Xlabel
ylabel('Amplitude (V)') % Ylabel
title('Integrated Received Pulses') % Title
% The below line has time limits that can be changed to zoom in on a
% desired interval, useful for seeing a spike, uncomment and edit to desire
xlim([.5 1])
%% Function definitions for target strength cylinder
function ts = ts_cylinder(L,a,az,el,lambda)
k = 2*pi/lambda;
beta = k*L*sind(el')*ones(size(az));
gamma = cosd(el')*ones(size(az));
ts = a*L^2*(sinc(beta).^2).*gamma.^2/2/lambda;
ts = max(ts,10^(-5));
end
function s = sinc(theta)
s = ones(size(theta));
idx = (abs(theta) <= 1e-2);
s(idx) = 1 - 1/6*(theta(idx)).^2;
s(~idx) = sin(theta(~idx))./theta(~idx);
end
Thank you for any time and help you can provide, Jay
Answers (0)
Categories
Find more on Transmitters and Receivers in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!