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

Приложение f

GeoForms.cpp

FILE* file = fopen(“rawData.dat”, “r”); //считываем файл

int* Data = (int*)malloc(signal_length * sizeof(Complex16));

fread(Data, signal_length+22, sizeof(Complex16), file);

fclose(file);

Complex16* inData = (Complex16*)Data;

for ( int I = 1; I < 4; i++)

{

oppler = RawDoppler(inData, lim, precision, pos, i);

Form1->Memo1->Lines->Add(i);

Form1->Memo1->Lines->Add(“Допплеровский сдвиг:”);

Form1->Memo1->Lines->Add(oppler);

Complex16 exp[signal_length];

for (int I = 0; I < signal_length; i++)

{

phase[i] = (float)(deltaT*oppler*i);

exp[i].re = 32767*cos(phase[i]);

exp[i].im = 32767*sin(phase[i]);

}

Mult(inData, exp, resDop, signal_length);

Searcher Sput(i);

Sput.Corr(resDop, signalCor, i);

searchSput(signalCor, qual, caLen, sample, SignalOUT);

Form1->Memo1->Lines->Add(“-----------------------------“);

}

Приложение g

Файл Search.cpp

#include "Searcher.h"

Searcher::Searcher(int sv):

svId(sv),

//system(system),

satellites(Gnss::Satellites::Locate())

{

}

Searcher::~Searcher()

{

}

ItemSearcher Searcher::GetItem(void)

{

return item;

}

int RawDoppler(Complex16* inData, const int lim, const int precision, int pos, int sv)

{

double maxVal = 0;

int place = 0;

int doppler = 0;

//int dopAdd = 1660;

for(int dopAdd = -lim; dopAdd < lim + precision; dopAdd += precision)

{

Searcher Sput(sv);

Complex16 exp[signal_length];

for (int i = 0; i < signal_length; i++)

{

phase[i] = (float)(deltaT*dopAdd*i);

exp[i].re = 32767*cos(phase[i]);

exp[i].im = 32767*sin(phase[i]);

}

Mult(inData, exp, signalPh, signal_length);

Sput.Corr(signalPh, signalCor, sv);

double max = 0;

for ( int i = 0; i < signal_length; i++)

{

if (signalCor[i].Abs() > maxVal)

{

max = signalCor[i].Abs();

place = i;

}

}

if (max > maxVal)

{

maxVal = max;

doppler = dopAdd;

pos = place;

}

}

return (doppler);

}

void Mult(Complex16 in1[], Complex16 in2[], Complex32 out[], int count)

{

for (int i = 0; i < count; ++i)

{

out[i].re = 0.0001*(int)(in1[i].re * in2[i].re - in1[i].im * in2[i].im);

out[i].im = 0.0001*(int)(in1[i].re * in2[i].im + in1[i].im * in2[i].re);

}

}

void Searcher::Corr(Complex32* signalPh, ComplexD* signal, int sv)

{

Gnss::Satellite& satellite = satellites[sv];

fftwf_complex* FFTCA = satellite.Pattern(); //БПФ для СА

CalcFFT(signalPh, FFTSignal, signal_length); //БПФ для сигнала

FILE* file = fopen("rawDataOUT.dat", "w"); //считываем файл

int* Data = (int*)malloc(signal_length * sizeof(Complex16));

for (int i = 2046; i < signal_length; i++)

{

FFTCA[i][0] = 0;

FFTCA[i][1] = 0;

}

Complex32 multOUT[signal_length];

for (int i = 0; i < signal_length; ++i)

{

multOUT[i].re = 0.001*(FFTCA[i][0] * (float)FFTSignal[i].re - FFTCA[i][1] * (float)FFTSignal[i].im);

multOUT[i].im = 0.001*(FFTCA[i][0] * (float)FFTSignal[i].im + FFTCA[i][1] * (float)FFTSignal[i].re);

}

iCalcFFT(multOUT, signal, signal_length); //Обратное БПФ */

}

void searchSput(ComplexD inData[], const float qual, const int caLen,

const int sample, ComplexD cor[])

{

int pos = 0;

for (int i = 0; i < 10; i++)

{

int max = 0;

int place = 0;

int p = 0;

int buf[10];

for (int k = i*caLen*sample+1; k < i*caLen*sample+caLen*sample+1; k++)

{

cor[p].re = cor[p].re + inData[k].re;

cor[p].im = cor[p].im + inData[k].im;

if (cor[p].Abs() > max)

{

max = cor[p].Abs(); //максимум за i интеррацию

place = p; //позиция максимума

}

p++;

}

if (place > 1 || place < 2046)

{

cor[place - 1].re = 0;

cor[place - 1].im = 0;

cor[place].re = 0;

cor[place].im = 0;

cor[place + 1].re = 0;

cor[place + 1].im = 0;

}

else

if (place == 1)

{

cor[place].re = 0;

cor[place].im = 0;

cor[place + 1].re = 0;

cor[place + 1].im = 0;

}

else

{

cor[place - 1].re = 0;

cor[place - 1].im = 0;

cor[place].re = 0;

cor[place].im = 0;

}

pos = place;

}

for (int i = 0; i < caLen*sample; i++)

{

Signal[i] = cor[i].Abs();

}

//поиск максимума

IntMath::Peak A;

A = IntMath::GetPeak(Signal, caLen*sample);

if (A.quality >= qual)

{

Form1->Memo1->Lines->Add("спутник обнаружен");

Form1->Memo1->Lines->Add(A.quality);

Form1->Memo1->Lines->Add("Положение максимума:");

Form1->Memo1->Lines->Add(pos);

}

else

{

Form1->Memo1->Lines->Add("спутник не обнаружен");

Form1->Memo1->Lines->Add(A.quality);

Form1->Memo1->Lines->Add("Положение максимума:");

Form1->Memo1->Lines->Add(pos);

}

}