1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2024-09-29 15:30:52 +00:00

Some fixes and code cleaning

This commit is contained in:
Carles Fernandez 2014-09-12 10:56:04 +02:00
parent 4db2c6e060
commit 35f9f30441
4 changed files with 55 additions and 58 deletions

View File

@ -77,7 +77,7 @@ galileo_e5a_dll_pll_make_tracking_cc(
float early_late_space_chips) float early_late_space_chips)
{ {
return galileo_e5a_dll_pll_tracking_cc_sptr(new Galileo_E5a_Dll_Pll_Tracking_cc(if_freq, return galileo_e5a_dll_pll_tracking_cc_sptr(new Galileo_E5a_Dll_Pll_Tracking_cc(if_freq,
fs_in, vector_length, queue, dump, dump_filename, pll_bw_hz, dll_bw_hz,pll_bw_init_hz, dll_bw_init_hz, ti_ms, early_late_space_chips)); fs_in, vector_length, queue, dump, dump_filename, pll_bw_hz, dll_bw_hz, pll_bw_init_hz, dll_bw_init_hz, ti_ms, early_late_space_chips));
} }
@ -130,8 +130,8 @@ Galileo_E5a_Dll_Pll_Tracking_cc::Galileo_E5a_Dll_Pll_Tracking_cc(
// Initialization of local code replica // Initialization of local code replica
// Get space for a vector with the E5a primary code replicas sampled 1x/chip // Get space for a vector with the E5a primary code replicas sampled 1x/chip
d_codeQ = (gr_complex*)volk_malloc((Galileo_E5a_CODE_LENGTH_CHIPS + 2)* sizeof(gr_complex), volk_get_alignment()); d_codeQ = new gr_complex[(int)Galileo_E5a_CODE_LENGTH_CHIPS + 2];
d_codeI = (gr_complex*)volk_malloc((Galileo_E5a_CODE_LENGTH_CHIPS + 2)* sizeof(gr_complex), volk_get_alignment()); d_codeI = new gr_complex[(int)Galileo_E5a_CODE_LENGTH_CHIPS + 2];
d_early_code = (gr_complex*)volk_malloc(2 * d_vector_length * sizeof(gr_complex), volk_get_alignment()); d_early_code = (gr_complex*)volk_malloc(2 * d_vector_length * sizeof(gr_complex), volk_get_alignment());
d_late_code = (gr_complex*)volk_malloc(2 * d_vector_length * sizeof(gr_complex), volk_get_alignment()); d_late_code = (gr_complex*)volk_malloc(2 * d_vector_length * sizeof(gr_complex), volk_get_alignment());
@ -140,11 +140,14 @@ Galileo_E5a_Dll_Pll_Tracking_cc::Galileo_E5a_Dll_Pll_Tracking_cc(
d_carr_sign = (gr_complex*)volk_malloc(2 * d_vector_length * sizeof(gr_complex), volk_get_alignment()); d_carr_sign = (gr_complex*)volk_malloc(2 * d_vector_length * sizeof(gr_complex), volk_get_alignment());
// correlator outputs (complex number) // correlator outputs (complex number)
d_Early = (gr_complex*)volk_malloc(sizeof(gr_complex), volk_get_alignment()); //d_Early = (gr_complex*)volk_malloc(sizeof(gr_complex), volk_get_alignment());
d_Prompt = (gr_complex*)volk_malloc(sizeof(gr_complex), volk_get_alignment()); //d_Prompt = (gr_complex*)volk_malloc(sizeof(gr_complex), volk_get_alignment());
d_Late = (gr_complex*)volk_malloc(sizeof(gr_complex), volk_get_alignment()); //d_Late = (gr_complex*)volk_malloc(sizeof(gr_complex), volk_get_alignment());
d_Prompt_data = (gr_complex*)volk_malloc(sizeof(gr_complex), volk_get_alignment()); //d_Prompt_data = (gr_complex*)volk_malloc(sizeof(gr_complex), volk_get_alignment());
d_Early = gr_complex(0, 0);
d_Prompt = gr_complex(0, 0);
d_Late = gr_complex(0, 0);
d_Prompt_data = gr_complex(0, 0);
//--- Perform initializations ------------------------------ //--- Perform initializations ------------------------------
// define initial code frequency basis of NCO // define initial code frequency basis of NCO
d_code_freq_chips = Galileo_E5a_CODE_CHIP_RATE_HZ; d_code_freq_chips = Galileo_E5a_CODE_CHIP_RATE_HZ;
@ -187,13 +190,8 @@ Galileo_E5a_Dll_Pll_Tracking_cc::~Galileo_E5a_Dll_Pll_Tracking_cc ()
volk_free(d_early_code); volk_free(d_early_code);
volk_free(d_carr_sign); volk_free(d_carr_sign);
volk_free(d_prompt_data_code); volk_free(d_prompt_data_code);
volk_free(d_Prompt_data); delete[] d_codeI;
volk_free(d_Early); delete[] d_codeQ;
volk_free(d_Prompt);
volk_free(d_Late);
volk_free(d_codeQ);
volk_free(d_codeI);
delete[] d_Prompt_buffer; delete[] d_Prompt_buffer;
} }
@ -315,9 +313,9 @@ void Galileo_E5a_Dll_Pll_Tracking_cc::acquire_secondary()
// 3. Serial search // 3. Serial search
int out_corr; int out_corr;
int current_best_ = 0; int current_best_ = 0;
for (unsigned int i=0; i<Galileo_E5a_Q_SECONDARY_CODE_LENGTH; i++) for (unsigned int i =0 ; i < Galileo_E5a_Q_SECONDARY_CODE_LENGTH; i++)
{ {
out_corr=0; out_corr = 0;
for (unsigned int j = 0; j < CN0_ESTIMATION_SAMPLES; j++) for (unsigned int j = 0; j < CN0_ESTIMATION_SAMPLES; j++)
{ {
//reverse replica sign since i*i=-1 (conjugated complex) //reverse replica sign since i*i=-1 (conjugated complex)
@ -424,10 +422,10 @@ int Galileo_E5a_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_
std::cout << tmp_str_stream.rdbuf() << std::flush; std::cout << tmp_str_stream.rdbuf() << std::flush;
} }
} }
*d_Early = gr_complex(0,0); d_Early = gr_complex(0,0);
*d_Prompt = gr_complex(0,0); d_Prompt = gr_complex(0,0);
*d_Late = gr_complex(0,0); d_Late = gr_complex(0,0);
*d_Prompt_data = gr_complex(0,0); d_Prompt_data = gr_complex(0,0);
*out[0] = *d_acquisition_gnss_synchro; *out[0] = *d_acquisition_gnss_synchro;
@ -488,9 +486,9 @@ int Galileo_E5a_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_
update_local_code(); update_local_code();
update_local_carrier(); update_local_carrier();
// Reset accumulated values // Reset accumulated values
*d_Early = gr_complex(0,0); d_Early = gr_complex(0,0);
*d_Prompt = gr_complex(0,0); d_Prompt = gr_complex(0,0);
*d_Late = gr_complex(0,0); d_Late = gr_complex(0,0);
} }
gr_complex single_early; gr_complex single_early;
gr_complex single_prompt; gr_complex single_prompt;
@ -508,17 +506,17 @@ int Galileo_E5a_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_
&single_early, &single_early,
&single_prompt, &single_prompt,
&single_late, &single_late,
d_Prompt_data); &d_Prompt_data);
// Accumulate results (coherent integration since there are no bit transitions in pilot signal) // Accumulate results (coherent integration since there are no bit transitions in pilot signal)
*d_Early += single_early * sec_sign_Q; d_Early += single_early * sec_sign_Q;
*d_Prompt += single_prompt * sec_sign_Q; d_Prompt += single_prompt * sec_sign_Q;
*d_Late += single_late * sec_sign_Q; d_Late += single_late * sec_sign_Q;
*d_Prompt_data *= sec_sign_I; d_Prompt_data *= sec_sign_I;
d_integration_counter++; d_integration_counter++;
// check for samples consistency (this should be done before in the receiver / here only if the source is a file) // check for samples consistency (this should be done before in the receiver / here only if the source is a file)
if (std::isnan((*d_Prompt).real()) == true or std::isnan((*d_Prompt).imag()) == true ) // or std::isinf(in[i].real())==true or std::isinf(in[i].imag())==true) if (std::isnan((d_Prompt).real()) == true or std::isnan((d_Prompt).imag()) == true ) // or std::isinf(in[i].real())==true or std::isinf(in[i].imag())==true)
{ {
const int samples_available = ninput_items[0]; const int samples_available = ninput_items[0];
d_sample_counter = d_sample_counter + samples_available; d_sample_counter = d_sample_counter + samples_available;
@ -544,11 +542,11 @@ int Galileo_E5a_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_
{ {
if (d_secondary_lock == true) if (d_secondary_lock == true)
{ {
carr_error_hz = pll_four_quadrant_atan(*d_Prompt) / (float)GALILEO_PI*2; carr_error_hz = pll_four_quadrant_atan(d_Prompt) / (float)GALILEO_PI*2;
} }
else else
{ {
carr_error_hz = pll_cloop_two_quadrant_atan(*d_Prompt) / (float)GALILEO_PI*2; carr_error_hz = pll_cloop_two_quadrant_atan(d_Prompt) / (float)GALILEO_PI*2;
} }
// Carrier discriminator filter // Carrier discriminator filter
@ -568,7 +566,7 @@ int Galileo_E5a_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_
if (d_integration_counter == d_current_ti_ms) if (d_integration_counter == d_current_ti_ms)
{ {
// DLL discriminator // DLL discriminator
code_error_chips = dll_nc_e_minus_l_normalized(*d_Early, *d_Late); //[chips/Ti] code_error_chips = dll_nc_e_minus_l_normalized(d_Early, d_Late); //[chips/Ti]
// Code discriminator filter // Code discriminator filter
code_error_filt_chips = d_code_loop_filter.get_code_nco(code_error_chips); //[chips/second] code_error_filt_chips = d_code_loop_filter.get_code_nco(code_error_chips); //[chips/second]
//Code phase accumulator //Code phase accumulator
@ -594,12 +592,12 @@ int Galileo_E5a_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_
if (d_cn0_estimation_counter < CN0_ESTIMATION_SAMPLES-1) if (d_cn0_estimation_counter < CN0_ESTIMATION_SAMPLES-1)
{ {
// fill buffer with prompt correlator output values // fill buffer with prompt correlator output values
d_Prompt_buffer[d_cn0_estimation_counter] = *d_Prompt; d_Prompt_buffer[d_cn0_estimation_counter] = d_Prompt;
d_cn0_estimation_counter++; d_cn0_estimation_counter++;
} }
else else
{ {
d_Prompt_buffer[d_cn0_estimation_counter] = *d_Prompt; d_Prompt_buffer[d_cn0_estimation_counter] = d_Prompt;
// ATTEMPT SECONDARY CODE ACQUISITION // ATTEMPT SECONDARY CODE ACQUISITION
if (d_secondary_lock == false) if (d_secondary_lock == false)
{ {
@ -622,12 +620,11 @@ int Galileo_E5a_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_
{ {
std::cout << "Loss of lock in channel " << d_channel << "!" << std::endl; std::cout << "Loss of lock in channel " << d_channel << "!" << std::endl;
LOG(INFO) << "Loss of lock in channel " << d_channel << "!"; LOG(INFO) << "Loss of lock in channel " << d_channel << "!";
ControlMessageFactory* cmf = new ControlMessageFactory(); std::shared_ptr<ControlMessageFactory> cmf = std::make_shared<ControlMessageFactory>();
if (d_queue != gr::msg_queue::sptr()) if (d_queue != gr::msg_queue::sptr())
{ {
d_queue->handle(cmf->GetQueueMessage(d_channel, 2)); d_queue->handle(cmf->GetQueueMessage(d_channel, 2));
} }
delete cmf;
d_carrier_lock_fail_counter = 0; d_carrier_lock_fail_counter = 0;
d_state = 0; // TODO: check if disabling tracking is consistent with the channel state machine d_state = 0; // TODO: check if disabling tracking is consistent with the channel state machine
} }
@ -652,12 +649,11 @@ int Galileo_E5a_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_
{ {
std::cout << "Loss of lock in channel " << d_channel << "!" << std::endl; std::cout << "Loss of lock in channel " << d_channel << "!" << std::endl;
LOG(INFO) << "Loss of lock in channel " << d_channel << "!"; LOG(INFO) << "Loss of lock in channel " << d_channel << "!";
ControlMessageFactory* cmf = new ControlMessageFactory(); std::shared_ptr<ControlMessageFactory> cmf = std::make_shared<ControlMessageFactory>();
if (d_queue != gr::msg_queue::sptr()) if (d_queue != gr::msg_queue::sptr())
{ {
d_queue->handle(cmf->GetQueueMessage(d_channel, 2)); d_queue->handle(cmf->GetQueueMessage(d_channel, 2));
} }
delete cmf;
d_carrier_lock_fail_counter = 0; d_carrier_lock_fail_counter = 0;
d_state = 0; d_state = 0;
} }
@ -665,7 +661,7 @@ int Galileo_E5a_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_
} }
d_cn0_estimation_counter = 0; d_cn0_estimation_counter = 0;
} }
if (d_secondary_lock && (d_secondary_delay%Galileo_E5a_I_SECONDARY_CODE_LENGTH)==0) if (d_secondary_lock && (d_secondary_delay % Galileo_E5a_I_SECONDARY_CODE_LENGTH) == 0)
{ {
d_first_transition = true; d_first_transition = true;
} }
@ -673,8 +669,8 @@ int Galileo_E5a_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_
// The first Prompt output not equal to 0 is synchronized with the transition of a navigation data bit. // The first Prompt output not equal to 0 is synchronized with the transition of a navigation data bit.
if (d_secondary_lock && d_first_transition) if (d_secondary_lock && d_first_transition)
{ {
current_synchro_data.Prompt_I = (double)((*d_Prompt_data).real()); current_synchro_data.Prompt_I = (double)((d_Prompt_data).real());
current_synchro_data.Prompt_Q = (double)((*d_Prompt_data).imag()); current_synchro_data.Prompt_Q = (double)((d_Prompt_data).imag());
// Tracking_timestamp_secs is aligned with the PRN start sample // Tracking_timestamp_secs is aligned with the PRN start sample
current_synchro_data.Tracking_timestamp_secs = ((double)d_sample_counter + (double)d_current_prn_length_samples + (double)d_rem_code_phase_samples)/(double)d_fs_in; current_synchro_data.Tracking_timestamp_secs = ((double)d_sample_counter + (double)d_current_prn_length_samples + (double)d_rem_code_phase_samples)/(double)d_fs_in;
// This tracking block aligns the Tracking_timestamp_secs with the start sample of the PRN, thus, Code_phase_secs=0 // This tracking block aligns the Tracking_timestamp_secs with the start sample of the PRN, thus, Code_phase_secs=0
@ -688,7 +684,7 @@ int Galileo_E5a_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_
// make an output to not stop the rest of the processing blocks // make an output to not stop the rest of the processing blocks
current_synchro_data.Prompt_I = 0.0; current_synchro_data.Prompt_I = 0.0;
current_synchro_data.Prompt_Q = 0.0; current_synchro_data.Prompt_Q = 0.0;
current_synchro_data.Tracking_timestamp_secs = (double)d_sample_counter/d_fs_in; current_synchro_data.Tracking_timestamp_secs = (double)d_sample_counter / d_fs_in;
current_synchro_data.Carrier_phase_rads = 0.0; current_synchro_data.Carrier_phase_rads = 0.0;
current_synchro_data.Code_phase_secs = 0.0; current_synchro_data.Code_phase_secs = 0.0;
current_synchro_data.CN0_dB_hz = 0.0; current_synchro_data.CN0_dB_hz = 0.0;
@ -705,13 +701,13 @@ int Galileo_E5a_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_
float prompt_Q; float prompt_Q;
float tmp_float; float tmp_float;
double tmp_double; double tmp_double;
prompt_I = (*d_Prompt_data).real(); prompt_I = (d_Prompt_data).real();
prompt_Q = (*d_Prompt_data).imag(); prompt_Q = (d_Prompt_data).imag();
if (d_integration_counter == d_current_ti_ms) if (d_integration_counter == d_current_ti_ms)
{ {
tmp_E = std::abs<float>(*d_Early); tmp_E = std::abs<float>(d_Early);
tmp_P = std::abs<float>(*d_Prompt); tmp_P = std::abs<float>(d_Prompt);
tmp_L = std::abs<float>(*d_Late); tmp_L = std::abs<float>(d_Late);
} }
try try
{ {
@ -746,7 +742,7 @@ int Galileo_E5a_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_
// AUX vars (for debug purposes) // AUX vars (for debug purposes)
tmp_float = d_rem_code_phase_samples; tmp_float = d_rem_code_phase_samples;
d_dump_file.write((char*)&tmp_float, sizeof(float)); d_dump_file.write((char*)&tmp_float, sizeof(float));
tmp_double=(double)(d_sample_counter+d_current_prn_length_samples); tmp_double = (double)(d_sample_counter + d_current_prn_length_samples);
d_dump_file.write((char*)&tmp_double, sizeof(double)); d_dump_file.write((char*)&tmp_double, sizeof(double));
} }
catch (std::ifstream::failure e) catch (std::ifstream::failure e)
@ -755,7 +751,7 @@ int Galileo_E5a_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_
} }
} }
d_secondary_delay = (d_secondary_delay + 1)%Galileo_E5a_Q_SECONDARY_CODE_LENGTH; d_secondary_delay = (d_secondary_delay + 1) % Galileo_E5a_Q_SECONDARY_CODE_LENGTH;
d_sample_counter += d_current_prn_length_samples; //count for the processed samples d_sample_counter += d_current_prn_length_samples; //count for the processed samples
consume_each(d_current_prn_length_samples); // this is necessary in gr::block derivates consume_each(d_current_prn_length_samples); // this is necessary in gr::block derivates
return 1; //output tracking result ALWAYS even in the case of d_enable_tracking==false return 1; //output tracking result ALWAYS even in the case of d_enable_tracking==false

View File

@ -151,10 +151,10 @@ private:
gr_complex* d_prompt_data_code; gr_complex* d_prompt_data_code;
gr_complex* d_carr_sign; gr_complex* d_carr_sign;
gr_complex *d_Early; gr_complex d_Early;
gr_complex *d_Prompt; gr_complex d_Prompt;
gr_complex *d_Late; gr_complex d_Late;
gr_complex *d_Prompt_data; gr_complex d_Prompt_data;
float tmp_E; float tmp_E;
float tmp_P; float tmp_P;

View File

@ -132,7 +132,7 @@ private:
void CN0_estimation_and_lock_detectors(); void CN0_estimation_and_lock_detectors();
// class private vars // class private vars
Gnss_Synchro *d_acquisition_gnss_synchro; Gnss_Synchro* d_acquisition_gnss_synchro;
boost::shared_ptr<gr::msg_queue> d_queue; boost::shared_ptr<gr::msg_queue> d_queue;
concurrent_queue<int> *d_channel_internal_queue; concurrent_queue<int> *d_channel_internal_queue;
unsigned int d_vector_length; unsigned int d_vector_length;

View File

@ -85,6 +85,7 @@ void GalileoE5aTrackingTest::init()
gnss_synchro.System = 'E'; gnss_synchro.System = 'E';
std::string signal = "5Q"; std::string signal = "5Q";
signal.copy(gnss_synchro.Signal, 2, 0); signal.copy(gnss_synchro.Signal, 2, 0);
gnss_synchro.PRN = 11;
config->set_property("GNSS-SDR.internal_fs_hz", "32000000"); config->set_property("GNSS-SDR.internal_fs_hz", "32000000");
config->set_property("Tracking_Galileo.item_type", "gr_complex"); config->set_property("Tracking_Galileo.item_type", "gr_complex");
@ -92,12 +93,12 @@ void GalileoE5aTrackingTest::init()
config->set_property("Tracking_Galileo.dump_filename", "../data/e5a_tracking_ch_"); config->set_property("Tracking_Galileo.dump_filename", "../data/e5a_tracking_ch_");
config->set_property("Tracking_Galileo.implementation", "Galileo_E5a_DLL_PLL_Tracking"); config->set_property("Tracking_Galileo.implementation", "Galileo_E5a_DLL_PLL_Tracking");
config->set_property("Tracking_Galileo.early_late_space_chips", "0.5"); config->set_property("Tracking_Galileo.early_late_space_chips", "0.5");
config->set_property("Tracking_Galileo.order", "2");
config->set_property("Tracking_Galileo.pll_bw_hz_init","20.0"); config->set_property("Tracking_Galileo.pll_bw_hz_init","20.0");
config->set_property("Tracking_Galileo.ti_ms", "1");
config->set_property("Tracking_Galileo.dll_bw_hz_init","2.0");
config->set_property("Tracking_Galileo.pll_bw_hz", "5"); config->set_property("Tracking_Galileo.pll_bw_hz", "5");
config->set_property("Tracking_Galileo.dll_bw_hz_init","2.0");
config->set_property("Tracking_Galileo.dll_bw_hz", "2"); config->set_property("Tracking_Galileo.dll_bw_hz", "2");
config->set_property("Tracking_Galileo.ti_ms", "1");
} }
TEST_F(GalileoE5aTrackingTest, ValidationOfResults) TEST_F(GalileoE5aTrackingTest, ValidationOfResults)