Приложение b
Функция doppler_ident.m (поиск и устранение допплеровского сдвига)
% doppler_ident.m %
% Created on: 02:07:13
% Author: Melihova
% Editor: Boronin
% *********************
%
function dop = doppler_ident(signal_in, sv, sample, lim, precision) %% precision * 100 Hz = шаг по частоте %% lim/10 kHz - предел
caLen = 1023;
deltaT = 2*pi*10^(-3)/(sample * caLen);
signal_length = length(signal_in);
template = zeros(caLen*sample, 1);
signal = zeros(signal_length, 1);
temp = CAgen(sv);
for i = 1:sample
template(i:sample:end, 1) = temp(:);
end
maxVal = 0;
maxDop = 0;
% перебираем все возможные допелеровские сдвиги с заданным шагом
for dopAdd = -lim:precision:lim %
phase = deltaT*dopAdd*(0:signal_length-1);
signal(:, 1) = signal_in(:, 1).*exp(1i*phase).';
cor = Correlation(signal(:, 1),template(:, 1));
m = max(cor(:, 1));
if m > maxVal
maxDop = dopAdd;
maxVal = m;
end
end
dop(1, 1) = maxDop;
dop(2, 1) = maxVal;
end
Приложение с
Функция searchSput.m (поиск спутников)
function [position, val, outData] = searchSput( cor, tr, caLen, sample, coherency )
i = 0;
quality = zeros(1,10);
s = 0;
StepSum = zeros(10,caLen*sample);
while i < 10
s = s + cor(i*caLen*sample+1:i*caLen*sample+caLen*sample,coherency);
StepSum(i+1,:) = s;
[M, pos] = max(abs(s(:,1)));
test = s;
if pos > 1 && pos < 2046 %находим первый максимум, вырезаем и обрезаем
test(pos-1:pos+1) = 0;
elseif pos == 1
test(pos:pos+1) = 0;
elseif pos == 2046
test(pos-1:pos) = 0;
end
%mean = sum(s(:,1))./(caLen*sample);
std = sqrt(sum(abs(test(:,1)).*abs(test(:,1)))*1./(caLen*sample - 1));
quality(1,i+1) = 1 - std/M;
i = i + 1;
end
[N, posQ] = max(quality);
if abs(N) > tr
position = pos;
val = quality;
outData = StepSum(posQ,:)';
else
position = 0;
val = 0;
outData = 0;
end
end
Приложение d
Функция Correlation.m (вычисление корреляций массивов x и y)
function z = Correlation(x, y) %% x and y are massives of complex numbers
if( length(x) < length(y) )
len = length(y);
for inc = length(x)+1:length(y)
x(inc) = 0;
end
end
if( length(y) < length(x) )
len = length(x);
y(length(y)+1:length(x)) = 0;
end
if ( length(x) == length(y) )
len = length(x);
end
z_fft = zeros(len, 1);
z = zeros(len, 2);
x_fft = fft(x);
y_fft = fft(y);
z_fft(:, 1) = x_fft(:).*conj(y_fft(:));
zet = ifft(z_fft);
z(:, 1) = abs(zet(:, 1));
z(:, 2) = zet(:, 1);
end
Приложение e
Функция CAgen.m (генерация C/A кода)
function [ ca_used ] = codegen( svnum)
g2s = [5; 6; 7; 8; 17; 18; 139; 140; 141; 251; 252; 254; 255; 256; 257; 258;...
469; 470; 471; 472; 473; 474; 509; 512; 513; 514; 515; 516; 859; 860;...
861; 862;... %% 1- 32 for GPS
145; 175; 52; 21; 237; 235; 886; 657; 634; 762; 355; 1012; 176; 603;...
130; 359; 595; 68; 386]; %% 120 - 138 for SBAS
ca_used = zeros(1, 1023);
g1 = zeros(1, 1023);
g2 = zeros(1, 1023);
if (svnum < 0) || (svnum > 32 && svnum < 120) || (svnum > 138)
return;
end
if svnum < 33
codeNum = svnum;
else
codeNum = svnum - 120 + 33;
end
g2shift=g2s(codeNum, 1);
% ******* Generate G1 code *******
% load shift register
reg = -1*ones(1,10);
for i = 1:1023,
g1(i) = reg(10);
save1 = reg(3)*reg(10);
reg(1,2:10) = reg(1:1:9);
reg(1) = save1;
end,
% ******* Generate G2 code *******
% load shift register
reg = -1*ones(1,10);
for i = 1:1023,
g2(i) = reg(10);
save2 = reg(2)*reg(3)*reg(6)*reg(8)*reg(9)*reg(10);
reg(1,2:10) = reg(1:1:9);
reg(1) = save2;
end,
% ******* Shift G2 code *******
g2tmp(1,1:g2shift)=g2(1,1023-g2shift+1:1023);
g2tmp(1,g2shift+1:1023)=g2(1,1:1023-g2shift);
g2 = g2tmp;
% ******* Form single sample C/A code by multiplying G1 and G2
ss_ca = g1.*g2;
ca_used=-ss_ca;
end
