This code contains the simulation of the direction of arrival sensor based on a dual 1.5 GHz and 48 GHz model. The code simulates a dual-frequency waveform at a given sampling rate and how the wave would be received at the sensor for a set number of phase config- urations for the sensor. Based on the amplitude measurements according to the phase, a direction of arrival for the signal is estimated.
%% Rotating Pair Antenna Triangulation
% This program simulates the behavior of a 2D DOA sensor with a target in
% 3D space. This version sets out to find the direction of arrival with a
% wide search first, and then narrows down to a fine search.
%% Plot Option Plot = 1;
%% Geometry setup
% [deg] Angular positions used for the sensor S1.phaselims = [0,180];
S2.phaselims = [133,137];
% Number of phase steps S1.steps = 500;
S2.steps = 1;
% Number of repetitions S1.reps = 500;
S2.reps = 1;
% [deg] Direction in longitude
%Long = 90 + 3.5260;
Long = 90 + 0.05*randn(1,1);
% [m] Location of the center of a single sensor SensLoc = [0,0,0];
TransLoc = 2*[cosd(Long+90),sind(Long+90),0]; % [m] Vector connecting the two
ST = SensLoc - TransLoc;
% [m] Distance connecting the center of the sensor to each antenna SR = 0.05;
%% Wave Properties
% [Hz] Frequency of the waves used for the wide search S1.freq = 1.4986e9;
S2.freq = 48e9;
% [Arb] Amplitude of the wave used for the wide search S1.amp = 1;
S2.amp = 1;
% [Amp] Signal to Noise ratio for the wide search S1.snr = 500;
S2.snr = 1;
% [Hz] Sample Rate of the waves S1.rate = 2e3*S1.freq;
S2.rate = 2e3*S2.freq; % [s] Duration of the waves S1.duration = 100/S1.freq; S2.duration = 100/S2.freq;
% [s] Period of the waves S1.period = 1/S1.freq; S2.period = 1/S2.freq;
% [m/s] Speed of the wave in air, found using the index of refraction Speed = 2.99792e8/1.00028;
% Number of samples simulated
S1.samplesperwave = S1.period*S1.rate; S2.samplesperwave = S2.period*S2.rate; % [m] The wavelength of each wave S1.wavelength = Speed/S1.freq;
S2.wavelength = Speed/S2.freq;
% For conviniece of comparison S = [S1,S2];
%% Vector math for first wave
% This creates the phase arrays, representing the position of each antenna
S1.phaseA = linspace(S1.phaselims(1),S1.phaselims(2),S1.steps); S1.phaseB = S1.phaseA - 180;
% This creates the vectors connecting the center of the sensor to each % antenna, for every angle specified
SAV = [SR*cosd(S1.phaseA);SR*sind(S1.phaseA);zeros(1,S1.steps)]’; SBV = [SR*cosd(S1.phaseB);SR*sind(S1.phaseB);zeros(1,S1.steps)]’; ST = CoordRepeat(ST,S1.steps);
% This creates the vectors from the transmitter to each antenna for every
% angle specified, and finds the resultant distance TA = ST + SAV; TB = ST + SBV; TAd = Magnitude(TA); TBd = Magnitude(TB); %clear ST SAV SBV TA TB %% Wave mechanics
% This section deals with the broadcast and reception of wavelengths
% This finds the minimum number of wavelengths between the transmitter and
% the receiver antennas, which determines how much of the wave should be
% simulated at each angular position - The number is arbitrary MinWavesBetween = min([min(TAd),min(TBd)])/S1.wavelength; WavesAcquired = floor(MinWavesBetween);
% This cuts the number of samples simulated down WavesToWait = floor(WavesAcquired/2);
% This determines the statrting point for each wave
WavesToWaitRA = Dist2Waves(TAd,S1.wavelength)+WavesToWait; WavesToWaitRB = Dist2Waves(TBd,S1.wavelength)+WavesToWait;
% This finds the indicies needed for acquisition RecAL = ceil(WavesToWaitRA*S1.samplesperwave+1);
RecAU = ceil((WavesAcquired+WavesToWaitRA)*S1.samplesperwave+1); RecBL = ceil(WavesToWaitRB*S1.samplesperwave+1);
RecBU = ceil((WavesAcquired+WavesToWaitRB)*S1.samplesperwave+1);
% This is the number of samples actually acquired for each position window = length(RecAL:RecAU-1); % preallocation of memory RecSigA = zeros(S1.steps,window); RecSigB = zeros(S1.steps,window); % [s] Creation of timespace t = linspace(0,S1.duration,S1.duration*S1.rate); % Easy Constant tau = 2*pi; t0 = clock;
%% Beginning of random numbers territory
for X = 1:S1.reps
tic;
% Creation of waveform
TransSig = S1.amp*sin(t*tau*S1.freq+rand()*tau);
for j = 1:S1.steps
RecSigA(j,:) = TransSig(RecAL(j):(RecAL(j) + window - 1)); end
for j = 1:S1.steps
end
% Addition of noise
RecSigA = RecSigA + (1/S1.snr)*randn(size(RecSigA)); RecSigB = RecSigB + (1/S1.snr)*randn(size(RecSigB)); % Interference - simple addition
Interfered = RecSigA + RecSigB;
% These next few lines make an amplitude measurement of the interfered
% signal and then massage the data for curve purposes Fs = S1.rate; InterferedAmp = zeros(1,S1.steps); InterferedAmpOld = zeros(1,S1.steps); InterferedAmpOld = (max((Interfered’),[],1))’; for i = 1:S1.steps; I = fft(Interfered(i,:)); I = I(1:length(Interfered(i,:))/2+1); I = I/length(Interfered(i,:)); I(2:end-1) = 2*I(2:end-1); InterferedAmp(i) = max(abs(I)); end InterferedAmp = medfilt1(InterferedAmp,3); InterferedAmp = 100*InterferedAmp/max(InterferedAmp); InterferedAmpOld = medfilt1(InterferedAmpOld,100); InterferedAmpOld = 100*InterferedAmpOld/max(InterferedAmpOld);
% These lines find the peak of the signal for a single iteration of the
% program, and records the mean and standard deviation
[dummy,GuessIndex] = max(D); if isempty(A) Guess(X) = NaN; end if ˜isempty(A) Guess(X) = S1.phaseA(B(GuessIndex)); end gaussEqn = ’a*exp(-((x-b)/c)ˆ2)’; startPoints = [1 90 1]; if Guess(X) < 45 fitcurve = fit(S1.phaseA’,InterferedAmp’,gaussEqn,... ’Start’,startPoints, ’Exclude’, S1.phaseA > 90);
elseif Guess(X) > 135
fitcurve = fit(S1.phaseA’,InterferedAmp’,gaussEqn,... ’Start’,startPoints, ’Exclude’, S1.phaseA < 90); else fitcurve = fit(S1.phaseA’,InterferedAmp’,gaussEqn,... ’Start’,startPoints); end x(X,:) = coeffvalues(fitcurve); Guessnew(X) = x(X,2); t2 = toc; Message = Progress(X,S1.reps,t2,t0); disp(Message); end % G1 = abs(mean(Guess-Long)); % G1a = std(Guess); G2 = mean(abs(Guessnew-Long)); G2a = std(Guessnew);
% SimAccuracy1 = G1; % SimPrecision1 = G1a;
SimAccuracy = G2; SimPrecision = G2a;
% disp(strcat([’The old accuracy was ’,...
% num2str(SimAccuracy1,4),char(176)]))
% disp(strcat([’The old precision was ’,...
% num2str(SimPrecision1,4),char(176)]))
disp(strcat([’The accuracy was ’,...
num2str(SimAccuracy,4),char(176)])) disp(strcat([’The precision was ’,... num2str(SimPrecision,4),char(176)])) if any(Plot) font = 16; subplot(2,1,1) hold ’off’ scatter(S1.phaseA,InterferedAmp,’*’) hold ’on’ scatter(S1.phaseA,InterferedAmpOld) p = plot(fitcurve); set(p,’LineWidth’,2)
xlabel(strcat(’Angular Position (’,char(176),’)’),’FontSize’,font) ylabel(’Amplitude (%)’,’FontSize’,font)
grid(’on’)
legend(’New Signal’,’Old Signal’,’Gaussian Fit’) axis([S1.phaselims(1),S1.phaselims(2),0,100]) set(gca,’FontSize’,font) %set(gca,’XTick’,[S1.phaselims(1):tickincrement:S1.phaselims(2)]) set(gca,’Ytick’,[0:20:100]) subplot(2,1,2) hold ’off’ histogram(Guess,20)
hold ’on’ subplot(2,1,2)
histogram(Guessnew,20)
axis([S1.phaselims(1) S1.phaselims(2) 0 S1.reps/4]) legend(’Old Method’,’New Method’)
xlabel(strcat(’Guessed Direction (’,char(176),’)’),’FontSize’,font) ylabel(’Counts’,’FontSize’,font)
set(gca,’FontSize’,font) grid(’on’)
end
% Big vectors to clear memory
clear RecSigA RecSigB t TransSig I RecAL RecAU RecBL RecBU TAd TBd
clear WavesToWaitRA WavesToWaitRB
clear Interfered x
clear SAV SBV ST TA TB
% Unneeded scalars
clear Fs gaussEqn i j MinWavesBetween Message Plot Speed startPoints
clear SR tau WavesAcquired WavesToWait window X
clear G1 G1a G2 G2a
filename = strcat(’C:\Users\Mark\Documents\MATLAB\Results\RotPairV6\’,... num2str(c(1)),’_’,... num2str(c(2)),’_’,... num2str(c(3)),’_’,... num2str(c(4)),... num2str(c(5))); save(filename)