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