1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2025-08-04 21:03:50 +00:00

solved a bug which caused the tracking pull-in test not to work correctly with Galileo E1 when using the downsampling filter in the acquisition.

This commit is contained in:
Marc Majoral 2018-11-09 20:50:32 +01:00
parent 047807ba0c
commit f150fe02c7
4 changed files with 225 additions and 174 deletions

View File

@ -69,8 +69,12 @@ GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga(
//fs_in = fs_in/2.0; // downampling filter //fs_in = fs_in/2.0; // downampling filter
//printf("fs_in pre downsampling = %ld\n", fs_in); //printf("fs_in pre downsampling = %ld\n", fs_in);
printf("fs_in pre downsampling = %ld\n", fs_in);
fs_in = fs_in/downsampling_factor; fs_in = fs_in/downsampling_factor;
printf("fs_in post downsampling = %ld\n", fs_in);
//printf("fs_in post downsampling = %ld\n", fs_in); //printf("fs_in post downsampling = %ld\n", fs_in);
@ -121,8 +125,11 @@ GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga(
float nbits = ceilf(log2f((float)code_length*2)); float nbits = ceilf(log2f((float)code_length*2));
unsigned int nsamples_total = pow(2, nbits); unsigned int nsamples_total = pow(2, nbits);
unsigned int vector_length = nsamples_total; unsigned int vector_length = nsamples_total;
printf("acq adapter vector_length = %d\n", vector_length);
//printf("acq adapter nsamples_total (= vector_length) = %d\n", vector_length); //printf("acq adapter nsamples_total (= vector_length) = %d\n", vector_length);
unsigned int select_queue_Fpga = configuration_->property(role + ".select_queue_Fpga", 0); unsigned int select_queue_Fpga = configuration_->property(role + ".select_queue_Fpga", 0);
printf("select queue = %d\n", select_queue_Fpga);
acq_parameters.select_queue_Fpga = select_queue_Fpga; acq_parameters.select_queue_Fpga = select_queue_Fpga;
std::string default_device_name = "/dev/uio0"; std::string default_device_name = "/dev/uio0";
std::string device_name = configuration_->property(role + ".devicename", default_device_name); std::string device_name = configuration_->property(role + ".devicename", default_device_name);

View File

@ -438,10 +438,10 @@ void pcps_acquisition_fpga::set_active(bool active)
send_positive_acquisition(); send_positive_acquisition();
d_state = 0; // Positive acquisition d_state = 0; // Positive acquisition
// printf("acq d_gnss_synchro->Acq_delay_samples = %f\n: ",d_gnss_synchro->Acq_delay_samples); //printf("acq d_gnss_synchro->Acq_delay_samples = %f\n: ",d_gnss_synchro->Acq_delay_samples);
// printf("acq d_gnss_synchro->Acq_samplestamp_samples = %d\n", (unsigned int) d_gnss_synchro->Acq_samplestamp_samples); //printf("acq d_gnss_synchro->Acq_samplestamp_samples = %d\n", (unsigned int) d_gnss_synchro->Acq_samplestamp_samples);
// printf("acq d_gnss_synchro->Acq_doppler_hz = %f\n", d_gnss_synchro->Acq_doppler_hz); //printf("acq d_gnss_synchro->Acq_doppler_hz = %f\n", d_gnss_synchro->Acq_doppler_hz);
// printf("acq d_gnss_synchro->PRN = %d\n", (int) d_gnss_synchro->PRN); //printf("acq d_gnss_synchro->PRN = %d\n", (int) d_gnss_synchro->PRN);
} }
else else
{ {
@ -477,7 +477,9 @@ void pcps_acquisition_fpga::read_acquisition_results(uint32_t *max_index,
float *max_magnitude, float *second_magnitude, uint64_t *initial_sample, uint32_t *doppler_index, uint32_t *total_fft_scaling_factor) float *max_magnitude, float *second_magnitude, uint64_t *initial_sample, uint32_t *doppler_index, uint32_t *total_fft_scaling_factor)
{ {
float input_power; // not used float input_power; // not used
acquisition_fpga->read_acquisition_results(max_index, max_magnitude, second_magnitude, initial_sample, &input_power, doppler_index, total_fft_scaling_factor); uint32_t max_index_tmp;
uint64_t initial_sample_tmp;
acquisition_fpga->read_acquisition_results(&max_index_tmp, max_magnitude, second_magnitude, &initial_sample_tmp, &input_power, doppler_index, total_fft_scaling_factor);
if (d_select_queue_Fpga == 0) if (d_select_queue_Fpga == 0)
@ -485,9 +487,9 @@ void pcps_acquisition_fpga::read_acquisition_results(uint32_t *max_index,
if (d_downsampling_factor > 1) if (d_downsampling_factor > 1)
{ {
//printf("yes here\n"); //printf("yes here\n");
*max_index = static_cast<double>(d_downsampling_factor*(*max_index)); *max_index = static_cast<double>(d_downsampling_factor*(max_index_tmp));
//d_gnss_synchro->Acq_samplestamp_samples = d_downsampling_factor*d_sample_counter - 81*0.25*d_downsampling_factor; // delay due to the downsampling filter in the acquisition //d_gnss_synchro->Acq_samplestamp_samples = d_downsampling_factor*d_sample_counter - 81*0.25*d_downsampling_factor; // delay due to the downsampling filter in the acquisition
*initial_sample = d_downsampling_factor*(*initial_sample) - 44; //33; //41; //+ 81*0.5; // delay due to the downsampling filter in the acquisition *initial_sample = (initial_sample_tmp)*d_downsampling_factor - 44; //33; //41; //+ 81*0.5; // delay due to the downsampling filter in the acquisition
//d_gnss_synchro->Acq_samplestamp_samples = d_downsampling_factor*d_sample_counter - 81/d_downsampling_factor; // delay due to the downsampling filter in the acquisition //d_gnss_synchro->Acq_samplestamp_samples = d_downsampling_factor*d_sample_counter - 81/d_downsampling_factor; // delay due to the downsampling filter in the acquisition
//d_gnss_synchro->Acq_delay_samples = static_cast<double>(2*(indext % acq_parameters.samples_per_code)); //d_gnss_synchro->Acq_delay_samples = static_cast<double>(2*(indext % acq_parameters.samples_per_code));
//d_gnss_synchro->Acq_delay_samples = static_cast<double>(2*(indext)); //d_gnss_synchro->Acq_delay_samples = static_cast<double>(2*(indext));
@ -505,6 +507,7 @@ void pcps_acquisition_fpga::read_acquisition_results(uint32_t *max_index,
//d_gnss_synchro->Acq_samplestamp_samples = d_downsampling_factor*d_sample_counter - 81*0.5*d_downsampling_factor; //d_gnss_synchro->Acq_samplestamp_samples = d_downsampling_factor*d_sample_counter - 81*0.5*d_downsampling_factor;
} }
} }
// printf("gnuradioblock acq samplestamp = %d\n", (int) *initial_sample);
// else // else
// { // {
// d_gnss_synchro->Acq_delay_samples = static_cast<double>(indext % acq_parameters.samples_per_code); // d_gnss_synchro->Acq_delay_samples = static_cast<double>(indext % acq_parameters.samples_per_code);

View File

@ -135,6 +135,7 @@ fpga_acquisition::fpga_acquisition(std::string device_name,
d_map_base = nullptr; // driver memory map d_map_base = nullptr; // driver memory map
d_all_fft_codes = all_fft_codes; d_all_fft_codes = all_fft_codes;
//printf("acq internal device name = %s\n", d_device_name.c_str());
// open communication with HW accelerator // open communication with HW accelerator
if ((d_fd = open(d_device_name.c_str(), O_RDWR | O_SYNC)) == -1) if ((d_fd = open(d_device_name.c_str(), O_RDWR | O_SYNC)) == -1)
{ {
@ -239,7 +240,7 @@ void fpga_acquisition::fpga_configure_acquisition_local_code(lv_16sc_t fft_local
//printf("debug local code %d real = %d imag = %d local_code = %d fft_data = %d\n", k, tmp, tmp2, local_code, fft_data); //printf("debug local code %d real = %d imag = %d local_code = %d fft_data = %d\n", k, tmp, tmp2, local_code, fft_data);
//printf("debug local code %d real = 0x%08X imag = 0x%08X local_code = 0x%08X fft_data = 0x%08X\n", k, tmp, tmp2, local_code, fft_data); //printf("debug local code %d real = 0x%08X imag = 0x%08X local_code = 0x%08X fft_data = 0x%08X\n", k, tmp, tmp2, local_code, fft_data);
} }
//printf("d_vector_length = %d\n", d_vector_length); //printf("acq d_vector_length = %d\n", d_vector_length);
//while(1); //while(1);
} }
@ -269,6 +270,7 @@ void fpga_acquisition::run_acquisition(void)
{ {
read_result_valid(&result_valid); // polling read_result_valid(&result_valid); // polling
} }
//printf("result valid\n");
// wait for interrupt // wait for interrupt
//nb = read(d_fd, &irq_count, sizeof(irq_count)); //nb = read(d_fd, &irq_count, sizeof(irq_count));
//usleep(500000); // debug //usleep(500000); // debug
@ -382,7 +384,7 @@ void fpga_acquisition::set_doppler_sweep(uint32_t num_sweeps)
phase_step_rad_int = static_cast<int32_t>(phase_step_rad_int_temp * (POW_2_29)); // * 2^29 (in total it makes x2^31 in two steps to avoid the warnings phase_step_rad_int = static_cast<int32_t>(phase_step_rad_int_temp * (POW_2_29)); // * 2^29 (in total it makes x2^31 in two steps to avoid the warnings
//printf("AAA writing phase_step_rad_int for doppler step = %d to d map base 4\n", phase_step_rad_int); //printf("AAA writing phase_step_rad_int for doppler step = %d to d map base 4\n", phase_step_rad_int);
d_map_base[4] = phase_step_rad_int; d_map_base[4] = phase_step_rad_int;
//printf("AAA writing num sweeps to d map base 5 = %d\n", num_sweeps); //printf("AAA writing num sweeps to d map base 5 = 1\n");
d_map_base[5] = 1; // 1 sweep d_map_base[5] = 1; // 1 sweep
} }
@ -442,9 +444,9 @@ void fpga_acquisition::configure_acquisition()
//printf("acq lib configure acquisition called\n"); //printf("acq lib configure acquisition called\n");
//printf("AAA d_select_queue = %d\n", d_select_queue); //printf("AAA d_select_queue = %d\n", d_select_queue);
d_map_base[0] = d_select_queue; d_map_base[0] = d_select_queue;
//printf("AAA writing d_vector_length = %d to d map base 1\n ", d_vector_length); //printf("acq internal writing d_vector_length = %d to d map base 1\n ", d_vector_length);
d_map_base[1] = d_vector_length; d_map_base[1] = d_vector_length;
//printf("AAA writing d_nsamples = %d to d map base 2\n ", d_nsamples); //printf("acq interal writing d_nsamples = %d to d map base 2\n ", d_nsamples);
d_map_base[2] = d_nsamples; d_map_base[2] = d_nsamples;
//printf("AAA writing LOG2 d_vector_length = %d to d map base 7\n ", (int)log2((float)d_vector_length)); //printf("AAA writing LOG2 d_vector_length = %d to d map base 7\n ", (int)log2((float)d_vector_length));
d_map_base[7] = static_cast<int32_t>(log2(static_cast<float>(d_vector_length))); // log2 FFTlength d_map_base[7] = static_cast<int32_t>(log2(static_cast<float>(d_vector_length))); // log2 FFTlength

View File

@ -73,7 +73,7 @@
#define NSAMPLES_TRACKING 200000000 // number of samples during which we test the tracking module #define NSAMPLES_TRACKING 200000000 // number of samples during which we test the tracking module
#define NSAMPLES_FINAL 50000 // number of samples sent after running tracking to unblock the SW if it is waiting for an interrupt of the tracking module #define NSAMPLES_FINAL 50000 // number of samples sent after running tracking to unblock the SW if it is waiting for an interrupt of the tracking module
#define NSAMPLES_ACQ_DOPPLER_SWEEP 50000000 // number of samples sent to the acquisition module when running acquisition when the HW controls the doppler loop #define NSAMPLES_ACQ_DOPPLER_SWEEP 50000000 // number of samples sent to the acquisition module when running acquisition when the HW controls the doppler loop
#define DOWNAMPLING_FILTER_INIT_SAMPLES 100 // some samples to initialize the state of the downsampling filter #define DOWNAMPLING_FILTER_INIT_SAMPLES 100 // some samples to initialize the state of the downsampling filter
#define DOWNSAMPLING_FILTER_DELAY 11 #define DOWNSAMPLING_FILTER_DELAY 11
// HW related options // HW related options
@ -448,7 +448,7 @@ struct DMA_handler_args {
void *handler_DMA(void *arguments) void *handler_DMA(void *arguments)
{ {
//printf("in handler DMA NO tracking\n");
// DMA process that configures the DMA to send the samples to the acquisition engine // DMA process that configures the DMA to send the samples to the acquisition engine
int tx_fd; // DMA descriptor int tx_fd; // DMA descriptor
FILE *rx_signal_file_id; // Input file descriptor FILE *rx_signal_file_id; // Input file descriptor
@ -464,6 +464,7 @@ void *handler_DMA(void *arguments)
struct DMA_handler_args *args = (struct DMA_handler_args *) arguments; struct DMA_handler_args *args = (struct DMA_handler_args *) arguments;
unsigned int nsamples_tx = args->nsamples_tx; unsigned int nsamples_tx = args->nsamples_tx;
//printf("in handler DMA to send %d\n", nsamples_tx);
std::string file = args->file; // input filename std::string file = args->file; // input filename
unsigned int skip_used_samples = args->skip_used_samples; unsigned int skip_used_samples = args->skip_used_samples;
@ -483,9 +484,9 @@ void *handler_DMA(void *arguments)
printf("DMA can't open input file\n"); printf("DMA can't open input file\n");
exit(1); exit(1);
} }
//printf("in handler DMA waiting for send samples start\n");
while(send_samples_start == 0); // wait until acquisition starts while(send_samples_start == 0); // wait until acquisition starts
//printf("in handler DMA going to send samples\n");
// skip initial samples // skip initial samples
int skip_samples = (int) FLAGS_skip_samples; int skip_samples = (int) FLAGS_skip_samples;
@ -498,11 +499,15 @@ void *handler_DMA(void *arguments)
//printf("dma file_completed = %d\n", file_completed); //printf("dma file_completed = %d\n", file_completed);
//printf("dma nsamples = %d\n", nsamples); //printf("dma nsamples = %d\n", nsamples);
//printf("dma nsamples_tx = %d\n", nsamples_tx); //printf("dma nsamples_tx = %d\n", nsamples_tx);
usleep(50000); // wait some time to give time to the main thread to start the acquisition module usleep(50000); // wait some time to give time to the main thread to start the acquisition module
unsigned int kk;
//printf("enter kk");
//scanf("%d", &kk);
while (file_completed == false) while (file_completed == false)
{ {
//printf("samples sent = %d\n", nsamples);
if (nsamples_tx - nsamples > MAX_INPUT_COMPLEX_SAMPLES_TOTAL) if (nsamples_tx - nsamples > MAX_INPUT_COMPLEX_SAMPLES_TOTAL)
{ {
nsamples_block = MAX_INPUT_COMPLEX_SAMPLES_TOTAL; nsamples_block = MAX_INPUT_COMPLEX_SAMPLES_TOTAL;
@ -549,9 +554,9 @@ void *handler_DMA(void *arguments)
} }
dma_index += 4; dma_index += 4;
} }
//printf("writing samples to send\n");
nsamples_transmitted = write(tx_fd, &input_samples_dma[0], nread_elements*NUM_QUEUES); nsamples_transmitted = write(tx_fd, &input_samples_dma[0], nread_elements*NUM_QUEUES);
//printf("exited writing samples to send\n");
if (nsamples_transmitted != nread_elements*NUM_QUEUES) if (nsamples_transmitted != nread_elements*NUM_QUEUES)
{ {
std::cout << "Error : DMA could not send all the requested samples" << std::endl; std::cout << "Error : DMA could not send all the requested samples" << std::endl;
@ -559,9 +564,10 @@ void *handler_DMA(void *arguments)
} }
} }
close(tx_fd); close(tx_fd);
fclose(rx_signal_file_id); fclose(rx_signal_file_id);
//printf("DMA finished\n");
return NULL; return NULL;
} }
@ -707,10 +713,12 @@ bool TrackingPullInTestFpga::acquire_signal(int SV_ID)
if (implementation.compare("GPS_L1_CA_DLL_PLL_Tracking_Fpga") == 0) if (implementation.compare("GPS_L1_CA_DLL_PLL_Tracking_Fpga") == 0)
{ {
baseband_sampling_freq_acquisition = baseband_sampling_freq/4; // downsampling filter in L1/E1 baseband_sampling_freq_acquisition = baseband_sampling_freq/4; // downsampling filter in L1/E1
printf(" aaaaaa baseband_sampling_freq_acquisition = %d\n", baseband_sampling_freq_acquisition);
} }
else if (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga") == 0) else if (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga") == 0)
{ {
baseband_sampling_freq_acquisition = baseband_sampling_freq/4; // downsampling filter in L1/E1 baseband_sampling_freq_acquisition = baseband_sampling_freq/4; // downsampling filter in L1/E1
printf(" aaaaaa baseband_sampling_freq_acquisition = %d\n", baseband_sampling_freq_acquisition);
} }
// 1. Setup GNU Radio flowgraph (file_source -> Acquisition_10m) // 1. Setup GNU Radio flowgraph (file_source -> Acquisition_10m)
@ -769,6 +777,7 @@ bool TrackingPullInTestFpga::acquire_signal(int SV_ID)
acquisition_GpsE1_Fpga->set_channel(0); acquisition_GpsE1_Fpga->set_channel(0);
acquisition_GpsE1_Fpga->set_threshold(config->property("Acquisition.threshold", FLAGS_external_signal_acquisition_threshold)); acquisition_GpsE1_Fpga->set_threshold(config->property("Acquisition.threshold", FLAGS_external_signal_acquisition_threshold));
acquisition_GpsE1_Fpga->connect(top_block); acquisition_GpsE1_Fpga->connect(top_block);
printf(" bbbbbbbb baseband_sampling_freq_acquisition = %d\n", baseband_sampling_freq_acquisition);
} }
else if (implementation.compare("Galileo_E5a_DLL_PLL_Tracking_Fpga") == 0) else if (implementation.compare("Galileo_E5a_DLL_PLL_Tracking_Fpga") == 0)
{ {
@ -836,6 +845,7 @@ bool TrackingPullInTestFpga::acquire_signal(int SV_ID)
else if (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga") == 0) else if (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga") == 0)
{ {
top_block->msg_connect(acquisition_GpsE1_Fpga->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); top_block->msg_connect(acquisition_GpsE1_Fpga->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events"));
printf(" cccccc baseband_sampling_freq_acquisition = %d\n", baseband_sampling_freq_acquisition);
} }
else if (implementation.compare("Galileo_E5a_DLL_PLL_Tracking_Fpga") == 0) else if (implementation.compare("Galileo_E5a_DLL_PLL_Tracking_Fpga") == 0)
{ {
@ -878,145 +888,145 @@ bool TrackingPullInTestFpga::acquire_signal(int SV_ID)
setup_fpga_switch(); setup_fpga_switch();
if (doppler_control_in_sw == 0) // if (doppler_control_in_sw == 0)
{ // {
//
args.file = file; // args.file = file;
args.nsamples_tx = NSAMPLES_ACQ_DOPPLER_SWEEP; // number of samples to transfer // args.nsamples_tx = NSAMPLES_ACQ_DOPPLER_SWEEP; // number of samples to transfer
args.skip_used_samples = 0; // args.skip_used_samples = 0;
//
//
if (implementation.compare("GPS_L1_CA_DLL_PLL_Tracking_Fpga") == 0) // if (implementation.compare("GPS_L1_CA_DLL_PLL_Tracking_Fpga") == 0)
{ // {
acquisition_GpsL1Ca_Fpga->set_single_doppler_flag(0); // acquisition_GpsL1Ca_Fpga->set_single_doppler_flag(0);
args.freq_band = 0; // args.freq_band = 0;
} // }
else if (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga") == 0) // else if (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga") == 0)
{ // {
acquisition_GpsE1_Fpga->set_single_doppler_flag(0); // acquisition_GpsE1_Fpga->set_single_doppler_flag(0);
args.freq_band = 0; // args.freq_band = 0;
} // }
else if (implementation.compare("Galileo_E5a_DLL_PLL_Tracking_Fpga") == 0) // else if (implementation.compare("Galileo_E5a_DLL_PLL_Tracking_Fpga") == 0)
{ // {
acquisition_GpsE5a_Fpga->set_single_doppler_flag(0); // acquisition_GpsE5a_Fpga->set_single_doppler_flag(0);
args.freq_band = 1; // args.freq_band = 1;
} // }
else if (implementation.compare("GPS_L5_DLL_PLL_Tracking_Fpga") == 0) // else if (implementation.compare("GPS_L5_DLL_PLL_Tracking_Fpga") == 0)
{ // {
acquisition_GpsL5_Fpga->set_single_doppler_flag(0); // acquisition_GpsL5_Fpga->set_single_doppler_flag(0);
args.freq_band = 1; // args.freq_band = 1;
} // }
//
for (unsigned int PRN = 1; PRN < MAX_PRN_IDX; PRN++) // for (unsigned int PRN = 1; PRN < MAX_PRN_IDX; PRN++)
{ // {
//
tmp_gnss_synchro.PRN = PRN; // tmp_gnss_synchro.PRN = PRN;
//
if (implementation.compare("GPS_L1_CA_DLL_PLL_Tracking_Fpga") == 0) // if (implementation.compare("GPS_L1_CA_DLL_PLL_Tracking_Fpga") == 0)
{ // {
acquisition_GpsL1Ca_Fpga->set_doppler_max(config->property("Acquisition.doppler_max", FLAGS_external_signal_acquisition_doppler_max_hz)); // acquisition_GpsL1Ca_Fpga->set_doppler_max(config->property("Acquisition.doppler_max", FLAGS_external_signal_acquisition_doppler_max_hz));
acquisition_GpsL1Ca_Fpga->set_doppler_step(config->property("Acquisition.doppler_step", FLAGS_external_signal_acquisition_doppler_step_hz)); // acquisition_GpsL1Ca_Fpga->set_doppler_step(config->property("Acquisition.doppler_step", FLAGS_external_signal_acquisition_doppler_step_hz));
//
acquisition_GpsL1Ca_Fpga->set_gnss_synchro(&tmp_gnss_synchro); // acquisition_GpsL1Ca_Fpga->set_gnss_synchro(&tmp_gnss_synchro);
acquisition_GpsL1Ca_Fpga->init(); // acquisition_GpsL1Ca_Fpga->init();
acquisition_GpsL1Ca_Fpga->set_local_code(); // acquisition_GpsL1Ca_Fpga->set_local_code();
} // }
else if (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga") == 0) // else if (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga") == 0)
{ // {
acquisition_GpsE1_Fpga->set_doppler_max(config->property("Acquisition.doppler_max", FLAGS_external_signal_acquisition_doppler_max_hz)); // acquisition_GpsE1_Fpga->set_doppler_max(config->property("Acquisition.doppler_max", FLAGS_external_signal_acquisition_doppler_max_hz));
acquisition_GpsE1_Fpga->set_doppler_step(config->property("Acquisition.doppler_step", FLAGS_external_signal_acquisition_doppler_step_hz)); // acquisition_GpsE1_Fpga->set_doppler_step(config->property("Acquisition.doppler_step", FLAGS_external_signal_acquisition_doppler_step_hz));
//
acquisition_GpsE1_Fpga->set_gnss_synchro(&tmp_gnss_synchro); // acquisition_GpsE1_Fpga->set_gnss_synchro(&tmp_gnss_synchro);
acquisition_GpsE1_Fpga->init(); // acquisition_GpsE1_Fpga->init();
acquisition_GpsE1_Fpga->set_local_code(); // acquisition_GpsE1_Fpga->set_local_code();
} // }
else if (implementation.compare("Galileo_E5a_DLL_PLL_Tracking_Fpga") == 0) // else if (implementation.compare("Galileo_E5a_DLL_PLL_Tracking_Fpga") == 0)
{ // {
acquisition_GpsE5a_Fpga->set_doppler_max(config->property("Acquisition.doppler_max", FLAGS_external_signal_acquisition_doppler_max_hz)); // acquisition_GpsE5a_Fpga->set_doppler_max(config->property("Acquisition.doppler_max", FLAGS_external_signal_acquisition_doppler_max_hz));
acquisition_GpsE5a_Fpga->set_doppler_step(config->property("Acquisition.doppler_step", FLAGS_external_signal_acquisition_doppler_step_hz)); // acquisition_GpsE5a_Fpga->set_doppler_step(config->property("Acquisition.doppler_step", FLAGS_external_signal_acquisition_doppler_step_hz));
//
acquisition_GpsE5a_Fpga->set_gnss_synchro(&tmp_gnss_synchro); // acquisition_GpsE5a_Fpga->set_gnss_synchro(&tmp_gnss_synchro);
acquisition_GpsE5a_Fpga->init(); // acquisition_GpsE5a_Fpga->init();
acquisition_GpsE5a_Fpga->set_local_code(); // acquisition_GpsE5a_Fpga->set_local_code();
} // }
else if (implementation.compare("GPS_L5_DLL_PLL_Tracking_Fpga") == 0) // else if (implementation.compare("GPS_L5_DLL_PLL_Tracking_Fpga") == 0)
{ // {
acquisition_GpsL5_Fpga->set_doppler_max(config->property("Acquisition.doppler_max", FLAGS_external_signal_acquisition_doppler_max_hz)); // acquisition_GpsL5_Fpga->set_doppler_max(config->property("Acquisition.doppler_max", FLAGS_external_signal_acquisition_doppler_max_hz));
acquisition_GpsL5_Fpga->set_doppler_step(config->property("Acquisition.doppler_step", FLAGS_external_signal_acquisition_doppler_step_hz)); // acquisition_GpsL5_Fpga->set_doppler_step(config->property("Acquisition.doppler_step", FLAGS_external_signal_acquisition_doppler_step_hz));
//
acquisition_GpsL5_Fpga->set_gnss_synchro(&tmp_gnss_synchro); // acquisition_GpsL5_Fpga->set_gnss_synchro(&tmp_gnss_synchro);
acquisition_GpsL5_Fpga->init(); // acquisition_GpsL5_Fpga->init();
acquisition_GpsL5_Fpga->set_local_code(); // acquisition_GpsL5_Fpga->set_local_code();
} // }
//
// create DMA child process // // create DMA child process
//printf("|||||||| args freq_band = %d\n", args.freq_band); // //printf("|||||||| args freq_band = %d\n", args.freq_band);
if (pthread_create(&thread_DMA, NULL, handler_DMA, (void *)&args) < 0) // if (pthread_create(&thread_DMA, NULL, handler_DMA, (void *)&args) < 0)
{ // {
printf("ERROR cannot create DMA Process\n"); // printf("ERROR cannot create DMA Process\n");
} // }
//
msg_rx->rx_message = 0; // msg_rx->rx_message = 0;
top_block->start(); // top_block->start();
//
pthread_mutex_lock(&mutex); // pthread_mutex_lock(&mutex);
send_samples_start = 1; // send_samples_start = 1;
pthread_mutex_unlock(&mutex); // pthread_mutex_unlock(&mutex);
//
if (implementation.compare("GPS_L1_CA_DLL_PLL_Tracking_Fpga") == 0) // if (implementation.compare("GPS_L1_CA_DLL_PLL_Tracking_Fpga") == 0)
{ // {
acquisition_GpsL1Ca_Fpga->reset(); // set active // acquisition_GpsL1Ca_Fpga->reset(); // set active
} // }
else if (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga") == 0) // else if (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga") == 0)
{ // {
acquisition_GpsE1_Fpga->reset(); // set active // acquisition_GpsE1_Fpga->reset(); // set active
} // }
else if (implementation.compare("Galileo_E5a_DLL_PLL_Tracking_Fpga") == 0) // else if (implementation.compare("Galileo_E5a_DLL_PLL_Tracking_Fpga") == 0)
{ // {
acquisition_GpsE5a_Fpga->reset(); // set active // acquisition_GpsE5a_Fpga->reset(); // set active
} // }
else if (implementation.compare("GPS_L5_DLL_PLL_Tracking_Fpga") == 0) // else if (implementation.compare("GPS_L5_DLL_PLL_Tracking_Fpga") == 0)
{ // {
acquisition_GpsL5_Fpga->reset(); // set active // acquisition_GpsL5_Fpga->reset(); // set active
} // }
//
if (start_msg == true) // if (start_msg == true)
{ // {
std::cout << "Reading external signal file: " << FLAGS_signal_file << std::endl; // std::cout << "Reading external signal file: " << FLAGS_signal_file << std::endl;
std::cout << "Searching for " << System_and_Signal << " Satellites..." << std::endl; // std::cout << "Searching for " << System_and_Signal << " Satellites..." << std::endl;
std::cout << "["; // std::cout << "[";
start_msg = false; // start_msg = false;
} // }
//
// wait for the child DMA process to finish // // wait for the child DMA process to finish
pthread_join(thread_DMA, NULL); // pthread_join(thread_DMA, NULL);
//
pthread_mutex_lock(&mutex); // pthread_mutex_lock(&mutex);
send_samples_start = 0; // send_samples_start = 0;
pthread_mutex_unlock(&mutex); // pthread_mutex_unlock(&mutex);
//
while (msg_rx->rx_message == 0) // while (msg_rx->rx_message == 0)
{ // {
usleep(100000); // usleep(100000);
} // }
//
if (msg_rx->rx_message == 1) // if (msg_rx->rx_message == 1)
{ // {
std::cout << " " << PRN << " "; // std::cout << " " << PRN << " ";
doppler_measurements_map.insert(std::pair<int, double>(PRN, tmp_gnss_synchro.Acq_doppler_hz)); // doppler_measurements_map.insert(std::pair<int, double>(PRN, tmp_gnss_synchro.Acq_doppler_hz));
code_delay_measurements_map.insert(std::pair<int, double>(PRN, tmp_gnss_synchro.Acq_delay_samples)); // code_delay_measurements_map.insert(std::pair<int, double>(PRN, tmp_gnss_synchro.Acq_delay_samples));
acq_samplestamp_map.insert(std::pair<int, double>(PRN, tmp_gnss_synchro.Acq_samplestamp_samples)); // acq_samplestamp_map.insert(std::pair<int, double>(PRN, tmp_gnss_synchro.Acq_samplestamp_samples));
} // }
else // else
{ // {
std::cout << " . "; // std::cout << " . ";
} // }
top_block->stop(); // top_block->stop();
std::cout.flush(); // std::cout.flush();
} // }
} // }
else // else
{ // {
unsigned int code_length; unsigned int code_length;
unsigned int nsamples_to_transfer; unsigned int nsamples_to_transfer;
@ -1028,7 +1038,8 @@ bool TrackingPullInTestFpga::acquire_signal(int SV_ID)
else if (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga") == 0) else if (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga") == 0)
{ {
code_length = static_cast<unsigned int>(std::round(static_cast<double>(baseband_sampling_freq_acquisition) / (Galileo_E1_CODE_CHIP_RATE_HZ / Galileo_E1_B_CODE_LENGTH_CHIPS))); code_length = static_cast<unsigned int>(std::round(static_cast<double>(baseband_sampling_freq_acquisition) / (Galileo_E1_CODE_CHIP_RATE_HZ / Galileo_E1_B_CODE_LENGTH_CHIPS)));
nsamples_to_transfer = static_cast<unsigned int>(std::round(static_cast<double>(baseband_sampling_freq) / (GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS))); nsamples_to_transfer = static_cast<unsigned int>(std::round(static_cast<double>(baseband_sampling_freq) / (Galileo_E1_CODE_CHIP_RATE_HZ / Galileo_E1_B_CODE_LENGTH_CHIPS)));
printf("dddddd code_length = %d nsamples_to_transfer = %d\n", code_length, nsamples_to_transfer);
} }
else if (implementation.compare("Galileo_E5a_DLL_PLL_Tracking_Fpga") == 0) else if (implementation.compare("Galileo_E5a_DLL_PLL_Tracking_Fpga") == 0)
{ {
@ -1053,6 +1064,7 @@ bool TrackingPullInTestFpga::acquire_signal(int SV_ID)
else if (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga") == 0) else if (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga") == 0)
{ {
acquisition_GpsE1_Fpga->set_single_doppler_flag(1); acquisition_GpsE1_Fpga->set_single_doppler_flag(1);
printf("eeeeeee just set doppler flag\n");
} }
else if (implementation.compare("Galileo_E5a_DLL_PLL_Tracking_Fpga") == 0) else if (implementation.compare("Galileo_E5a_DLL_PLL_Tracking_Fpga") == 0)
{ {
@ -1066,12 +1078,18 @@ bool TrackingPullInTestFpga::acquire_signal(int SV_ID)
int acq_doppler_max = config->property("Acquisition.doppler_max", FLAGS_external_signal_acquisition_doppler_max_hz); int acq_doppler_max = config->property("Acquisition.doppler_max", FLAGS_external_signal_acquisition_doppler_max_hz);
int acq_doppler_step = config->property("Acquisition.doppler_step", FLAGS_external_signal_acquisition_doppler_step_hz); int acq_doppler_step = config->property("Acquisition.doppler_step", FLAGS_external_signal_acquisition_doppler_step_hz);
printf("acq_doppler_max = %d\n", acq_doppler_max);
printf("acq_doppler_step = %d\n", acq_doppler_step);
int num_doppler_steps = (2*acq_doppler_max)/acq_doppler_step + 1; int num_doppler_steps = (2*acq_doppler_max)/acq_doppler_step + 1;
float result_table[MAX_PRN_IDX][num_doppler_steps][3]; float result_table[MAX_PRN_IDX][num_doppler_steps][3];
for (unsigned int PRN = 1; PRN < MAX_PRN_IDX; PRN++) uint32_t index_debug[MAX_PRN_IDX];
//for (unsigned int PRN = 13; PRN < 15; PRN++) uint32_t samplestamp_debug[MAX_PRN_IDX];
//for (unsigned int PRN = 1; PRN < MAX_PRN_IDX; PRN++)
for (unsigned int PRN = 0; PRN < 17; PRN++)
{ {
uint32_t max_index = 0; uint32_t max_index = 0;
@ -1093,6 +1111,8 @@ bool TrackingPullInTestFpga::acquire_signal(int SV_ID)
int doppler_num = 0; int doppler_num = 0;
for (int doppler_shift = -acq_doppler_max;doppler_shift <= acq_doppler_max;doppler_shift = doppler_shift + acq_doppler_step) for (int doppler_shift = -acq_doppler_max;doppler_shift <= acq_doppler_max;doppler_shift = doppler_shift + acq_doppler_step)
{ {
//printf("doppler_shift = %d\n", doppler_shift); //printf("doppler_shift = %d\n", doppler_shift);
@ -1124,7 +1144,7 @@ bool TrackingPullInTestFpga::acquire_signal(int SV_ID)
acquisition_GpsE1_Fpga->init(); acquisition_GpsE1_Fpga->init();
acquisition_GpsE1_Fpga->set_local_code(); acquisition_GpsE1_Fpga->set_local_code();
args.freq_band = 0; args.freq_band = 0;
//printf("ending configuring acquisition\n"); //printf("ffffffffffff ending configuring acquisition\n");
} }
else if (implementation.compare("Galileo_E5a_DLL_PLL_Tracking_Fpga") == 0) else if (implementation.compare("Galileo_E5a_DLL_PLL_Tracking_Fpga") == 0)
{ {
@ -1152,8 +1172,9 @@ bool TrackingPullInTestFpga::acquire_signal(int SV_ID)
args.file = file; args.file = file;
if ((implementation.compare("GPS_L1_CA_DLL_PLL_Tracking_Fpga") == 0) or (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga"))) if ((implementation.compare("GPS_L1_CA_DLL_PLL_Tracking_Fpga") == 0) or (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga") == 0))
{ {
//printf("gggggggg \n");
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// send the previous samples to set the downsampling filter in a good condition // send the previous samples to set the downsampling filter in a good condition
send_samples_start = 0; send_samples_start = 0;
@ -1166,6 +1187,8 @@ bool TrackingPullInTestFpga::acquire_signal(int SV_ID)
args.skip_used_samples = - DOWNAMPLING_FILTER_INIT_SAMPLES; // set the counter 2000 samples before args.skip_used_samples = - DOWNAMPLING_FILTER_INIT_SAMPLES; // set the counter 2000 samples before
} }
args.nsamples_tx = DOWNAMPLING_FILTER_INIT_SAMPLES + DOWNSAMPLING_FILTER_DELAY; //50000; // max size of the FFT args.nsamples_tx = DOWNAMPLING_FILTER_INIT_SAMPLES + DOWNSAMPLING_FILTER_DELAY; //50000; // max size of the FFT
//printf("sending pre init %d\n", args.nsamples_tx);
if (pthread_create(&thread_DMA, NULL, handler_DMA, (void *)&args) < 0) if (pthread_create(&thread_DMA, NULL, handler_DMA, (void *)&args) < 0)
{ {
printf("ERROR cannot create DMA Process\n"); printf("ERROR cannot create DMA Process\n");
@ -1210,6 +1233,7 @@ bool TrackingPullInTestFpga::acquire_signal(int SV_ID)
// create DMA child process // create DMA child process
//printf("||||||||1 args freq_band = %d\n", args.freq_band); //printf("||||||||1 args freq_band = %d\n", args.freq_band);
//printf("sending samples main DMA %d\n", args.nsamples_tx);
if (pthread_create(&thread_DMA, NULL, handler_DMA, (void *)&args) < 0) if (pthread_create(&thread_DMA, NULL, handler_DMA, (void *)&args) < 0)
{ {
printf("ERROR cannot create DMA Process\n"); printf("ERROR cannot create DMA Process\n");
@ -1228,6 +1252,7 @@ bool TrackingPullInTestFpga::acquire_signal(int SV_ID)
} }
else if (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga") == 0) else if (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga") == 0)
{ {
//printf("hhhhhhhhhhhh\n");
acquisition_GpsE1_Fpga->reset(); // set active acquisition_GpsE1_Fpga->reset(); // set active
} }
else if (implementation.compare("Galileo_E5a_DLL_PLL_Tracking_Fpga") == 0) else if (implementation.compare("Galileo_E5a_DLL_PLL_Tracking_Fpga") == 0)
@ -1270,6 +1295,7 @@ bool TrackingPullInTestFpga::acquire_signal(int SV_ID)
} }
else if (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga") == 0) else if (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga") == 0)
{ {
//printf("iiiiiiiiiiiiii\n");
acquisition_GpsE1_Fpga->read_acquisition_results(&max_index_iteration, &max_magnitude_iteration, &second_magnitude_iteration, &initial_sample_iteration, &doppler_index_iteration, &total_fft_scaling_factor); acquisition_GpsE1_Fpga->read_acquisition_results(&max_index_iteration, &max_magnitude_iteration, &second_magnitude_iteration, &initial_sample_iteration, &doppler_index_iteration, &total_fft_scaling_factor);
//acquisition_GpsE1_Fpga->read_fpga_total_scale_factor(&total_fft_scaling_factor, &fw_fft_scaling_factor); //acquisition_GpsE1_Fpga->read_fpga_total_scale_factor(&total_fft_scaling_factor, &fw_fft_scaling_factor);
} }
@ -1291,26 +1317,31 @@ bool TrackingPullInTestFpga::acquire_signal(int SV_ID)
//printf("max_magnitude_iteration = %f\n", max_magnitude_iteration); //printf("max_magnitude_iteration = %f\n", max_magnitude_iteration);
//printf("second_magnitude_iteration = %f\n", second_magnitude_iteration); //printf("second_magnitude_iteration = %f\n", second_magnitude_iteration);
if ((implementation.compare("GPS_L1_CA_DLL_PLL_Tracking_Fpga") == 0) or (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga"))) if ((implementation.compare("GPS_L1_CA_DLL_PLL_Tracking_Fpga") == 0) or (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga") == 0))
{ {
//printf("jjjjjjjjjjjjjjj\n");
if (max_magnitude_iteration > max_magnitude) if (max_magnitude_iteration > max_magnitude)
{ {
max_index = max_index_iteration; int interpolation_factor = 4;
index_debug[PRN - 1] = max_index_iteration;
max_index = max_index_iteration - interpolation_factor*(DOWNSAMPLING_FILTER_DELAY - 1);
max_magnitude = max_magnitude_iteration; max_magnitude = max_magnitude_iteration;
second_magnitude = second_magnitude_iteration; second_magnitude = second_magnitude_iteration;
initial_sample = initial_sample_iteration; samplestamp_debug[PRN - 1] = initial_sample_iteration;
initial_sample = 0; //initial_sample_iteration;
doppler_index = doppler_index_iteration; doppler_index = doppler_index_iteration;
doppler_shift_selected = doppler_shift; doppler_shift_selected = doppler_shift;
} }
} }
else else
{ {
if (max_magnitude_iteration > max_magnitude) if (max_magnitude_iteration > max_magnitude)
{ {
max_index = max_index_iteration; max_index = max_index_iteration;
max_magnitude = max_magnitude_iteration; max_magnitude = max_magnitude_iteration;
second_magnitude = second_magnitude_iteration; second_magnitude = second_magnitude_iteration;
initial_sample = initial_sample_iteration - (DOWNAMPLING_FILTER_INIT_SAMPLES + DOWNSAMPLING_FILTER_DELAY); initial_sample = initial_sample_iteration;
doppler_index = doppler_index_iteration; doppler_index = doppler_index_iteration;
doppler_shift_selected = doppler_shift; doppler_shift_selected = doppler_shift;
} }
@ -1379,7 +1410,7 @@ bool TrackingPullInTestFpga::acquire_signal(int SV_ID)
} }
} }
} // }
std::cout << "]" << std::endl; std::cout << "]" << std::endl;
std::cout << "-------------------------------------------\n"; std::cout << "-------------------------------------------\n";
@ -1389,6 +1420,12 @@ bool TrackingPullInTestFpga::acquire_signal(int SV_ID)
} }
for (unsigned k=0;k<MAX_PRN_IDX;k++)
{
printf("index_debug %d = %d\n", k+1, (int) index_debug[k]);
printf("samplestamp_debug %d = %d\n", k+1, (int) samplestamp_debug[k]);
}
// report the elapsed time // report the elapsed time
end = std::chrono::system_clock::now(); end = std::chrono::system_clock::now();
elapsed_seconds = end - start; elapsed_seconds = end - start;
@ -1605,14 +1642,14 @@ TEST_F(TrackingPullInTestFpga, ValidationOfResults)
//true_acq_doppler_hz = -4000; //true_acq_doppler_hz = -4000;
//true_acq_delay_samples = 1292; //true_acq_delay_samples = 1292;
if ((implementation.compare("GPS_L1_CA_DLL_PLL_Tracking_Fpga") == 0) or (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga"))) // if ((implementation.compare("GPS_L1_CA_DLL_PLL_Tracking_Fpga") == 0) or (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking_Fpga")))
{ // {
acq_samplestamp_samples = 0; // acq_samplestamp_samples = 0;
//
true_acq_delay_samples = true_acq_delay_samples - interpolation_factor*DOWNSAMPLING_FILTER_DELAY; // true_acq_delay_samples = true_acq_delay_samples - interpolation_factor*(DOWNSAMPLING_FILTER_DELAY - 1);
printf("acq_samplestamp_samples = %d\n", (int)acq_samplestamp_samples); printf("acq_samplestamp_samples = %d\n", (int)acq_samplestamp_samples);
printf("true_acq_delay_samples = %d\n", (int)true_acq_delay_samples); printf("true_acq_delay_samples = %d\n", (int)true_acq_delay_samples);
} // }
gnss_synchro.Acq_samplestamp_samples = acq_samplestamp_samples; gnss_synchro.Acq_samplestamp_samples = acq_samplestamp_samples;
//simulate a Doppler error in acquisition //simulate a Doppler error in acquisition
gnss_synchro.Acq_doppler_hz = true_acq_doppler_hz + acq_doppler_error_hz_values.at(current_acq_doppler_error_idx); gnss_synchro.Acq_doppler_hz = true_acq_doppler_hz + acq_doppler_error_hz_values.at(current_acq_doppler_error_idx);
@ -2027,4 +2064,6 @@ TEST_F(TrackingPullInTestFpga, ValidationOfResults)
} }
} }
} }