Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет НИР_Боронин_6_М.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
546.35 Кб
Скачать

Приложение 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