% 12.215 Script M-file to look at GPS correlations
%
% setup a dialog box with the parameters we need
clear all
prompt = {'Seed', 'Signal GPS1', 'Signal GPS2', ...
	'Noise Level', 'Delay 1', ...
	'Delay 2', };
name = 'GPS Code Simulator';
nlines = 1;
defaults = {'1','1','1','1.0','10','-20'};
% Get user inputs and save in the appropriate valuyes
result = inputdlg(prompt,name,nlines, defaults,'on');
seed = eval(result{1});
S1 = eval(result{2}) ; % Signal strength of GPS1
S2 = eval(result{3}) ; % Signal strength of GPS2
Noise = eval(result{4}) ;  % Level of the Noise (Gaussian)
% If the noise is >15 time the signal the correlation will tend to fail.

% In this version of the code the lag is an integer value
% A more complete simulation would allow fractional lags
D1 = eval(result{5}); % Lag of GPS signal 1
D2 = eval(result{6}); % Lag of GPS signal 2
%
% reset the state of the random number generator
randn('state',seed);
% Fake C/A code on GPS 1 (bi-mode)
C1 = randn(1,1024);
for i = 1:1024;
    if( C1(i) < 0 ) 
        C1(i) = -S1;
    else
        C1(i) = +S1;
    end
end
% Generate Fake signal on GPS 2
C2 = randn(1,1024);
for i = 1:1024;
    if( C2(i) < 0 ) 
        C2(i) = -S2;
    else
        C2(i) = +S2;
    end
end
% Now generate the signals from GPS (Repeating code eveb 1024 chips)
X1 = [ C1 C1 C1 C1 C1 C1];
X2 = [ C2 C2 C2 C2 C2 C2];

% Now generate the signals
% Generate a noise vector (Noise is the amplitude of the noise)
% (Generate at half the length of the repeated codes so that we can get the
% sigmal lags (both positive and negative)
N = randn(1,length(X1)/2)*Noise;
signal = N + X1(2048+D1:2047+D1+length(N)) + X2(2048+D2:2047+D2+length(N));
%
% Correlate the signal with the code values
figure(1)
lenS = length(signal);
corr1 = xcor(X1(1024:1023+lenS),signal,lenS/2,'coeff');

plot([-lenS/2:lenS/2],corr1);
xlabel('Lag time'); ylabel('Correlation');
% Get the time of maxiumum correlation
[MaxC1 LagC1] = max(corr1);
Lag1 = LagC1 - lenS/2 -1;  % Index is from -num_lags to +num_lags
titl1 = sprintf('Code 1 Estimated Lag %d Input Lag %d Noise %6.1f', ...
    Lag1, D1, Noise)
title(titl1);
%print -dpng -r72 GPSSim_fig1.png

figure(2)
corr2 = xcor(X2(1024:1023+lenS),signal,lenS/2,'coeff');

plot([-lenS/2:lenS/2],corr2,'g');
xlabel('Lag time'); ylabel('Correlation');
% Get the time of maxiumum correlation
[MaxC2 LagC2] = max(corr2);
Lag2 = LagC2 - lenS/2 -1;
titl2 = sprintf('Code 2: Estimated Lag %d Input Lag %d Noise %6.1f', ...
    Lag2, D2, Noise)
title(titl2);
%print -dpng -r72 GPSSim_fig2.png

% As an example now plot the signal
figure(3)
plot(signal,'r'); hold on; plot(X1(1024:1023+lenS),'k');
ylabel('Time'); xlabel('Signal'); title('Data and GPS code signal');
hold off;
%print -dpng -r72 GPSSim_fig3.png


