mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2024-11-17 23:34:56 +00:00
immediate call to state 2 (Wide tracking and symbol synchronization) removed from pull-in state.
This commit is contained in:
parent
91f509abf9
commit
824dcebec2
@ -33,7 +33,6 @@
|
|||||||
*
|
*
|
||||||
* -------------------------------------------------------------------------
|
* -------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "dll_pll_veml_tracking_fpga.h"
|
#include "dll_pll_veml_tracking_fpga.h"
|
||||||
#include "GPS_L1_CA.h"
|
#include "GPS_L1_CA.h"
|
||||||
#include "GPS_L2C.h"
|
#include "GPS_L2C.h"
|
||||||
@ -54,6 +53,7 @@
|
|||||||
#include <pmt/pmt_sugar.h> // for mp
|
#include <pmt/pmt_sugar.h> // for mp
|
||||||
#include <volk_gnsssdr/volk_gnsssdr.h>
|
#include <volk_gnsssdr/volk_gnsssdr.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
//#include <chrono>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <complex>
|
#include <complex>
|
||||||
#include <cstdlib> // for abs, size_t
|
#include <cstdlib> // for abs, size_t
|
||||||
@ -61,7 +61,6 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
|
|
||||||
dll_pll_veml_tracking_fpga_sptr dll_pll_veml_make_tracking_fpga(const Dll_Pll_Conf_Fpga &conf_)
|
dll_pll_veml_tracking_fpga_sptr dll_pll_veml_make_tracking_fpga(const Dll_Pll_Conf_Fpga &conf_)
|
||||||
{
|
{
|
||||||
return dll_pll_veml_tracking_fpga_sptr(new dll_pll_veml_tracking_fpga(conf_));
|
return dll_pll_veml_tracking_fpga_sptr(new dll_pll_veml_tracking_fpga(conf_));
|
||||||
@ -272,7 +271,7 @@ dll_pll_veml_tracking_fpga::dll_pll_veml_tracking_fpga(const Dll_Pll_Conf_Fpga &
|
|||||||
|
|
||||||
// Initialize tracking ==========================================
|
// Initialize tracking ==========================================
|
||||||
d_code_loop_filter = Tracking_loop_filter(d_code_period, trk_parameters.dll_bw_hz, trk_parameters.dll_filter_order, false);
|
d_code_loop_filter = Tracking_loop_filter(d_code_period, trk_parameters.dll_bw_hz, trk_parameters.dll_filter_order, false);
|
||||||
printf("trk_parameters.fll_bw_hz = %f trk_parameters.pll_bw_hz = %f trk_parameters.pll_filter_order = %d\n", trk_parameters.fll_bw_hz, trk_parameters.pll_bw_hz, trk_parameters.pll_filter_order);
|
//printf("trk_parameters.fll_bw_hz = %f trk_parameters.pll_bw_hz = %f trk_parameters.pll_filter_order = %d\n", trk_parameters.fll_bw_hz, trk_parameters.pll_bw_hz, trk_parameters.pll_filter_order);
|
||||||
d_carrier_loop_filter.set_params(trk_parameters.fll_bw_hz, trk_parameters.pll_bw_hz, trk_parameters.pll_filter_order);
|
d_carrier_loop_filter.set_params(trk_parameters.fll_bw_hz, trk_parameters.pll_bw_hz, trk_parameters.pll_filter_order);
|
||||||
|
|
||||||
if (d_veml)
|
if (d_veml)
|
||||||
@ -1382,7 +1381,7 @@ int dll_pll_veml_tracking_fpga::general_work(int noutput_items __attribute__((un
|
|||||||
*out[0] = *d_acquisition_gnss_synchro;
|
*out[0] = *d_acquisition_gnss_synchro;
|
||||||
usleep(1000);
|
usleep(1000);
|
||||||
return 1;
|
return 1;
|
||||||
break;
|
//break;
|
||||||
}
|
}
|
||||||
case 1: // Pull-in
|
case 1: // Pull-in
|
||||||
{
|
{
|
||||||
@ -1453,12 +1452,286 @@ int dll_pll_veml_tracking_fpga::general_work(int noutput_items __attribute__((un
|
|||||||
|
|
||||||
// don't leave the HW module blocking the signal path before the first sample arrives
|
// don't leave the HW module blocking the signal path before the first sample arrives
|
||||||
// start the first tracking process
|
// start the first tracking process
|
||||||
run_state_2(current_synchro_data);
|
//run_state_2(current_synchro_data);
|
||||||
break;
|
*out[0] = *d_acquisition_gnss_synchro;
|
||||||
|
return 1;
|
||||||
|
//break;
|
||||||
}
|
}
|
||||||
case 2: // Wide tracking and symbol synchronization
|
case 2: // Wide tracking and symbol synchronization
|
||||||
{
|
{
|
||||||
run_state_2(current_synchro_data);
|
d_sample_counter = d_sample_counter_next;
|
||||||
|
d_sample_counter_next = d_sample_counter + static_cast<uint64_t>(d_current_prn_length_samples);
|
||||||
|
|
||||||
|
// auto start = std::chrono::system_clock::now();
|
||||||
|
do_correlation_step();
|
||||||
|
// auto end = std::chrono::system_clock::now();
|
||||||
|
// std::chrono::duration<double> elapsed_seconds = end - start;
|
||||||
|
// std::cout << "elapsed time 0: " << elapsed_seconds.count() << "s\n";
|
||||||
|
|
||||||
|
// Save single correlation step variables
|
||||||
|
|
||||||
|
// start = std::chrono::system_clock::now();
|
||||||
|
|
||||||
|
if (d_veml)
|
||||||
|
{
|
||||||
|
d_VE_accu = *d_Very_Early;
|
||||||
|
d_VL_accu = *d_Very_Late;
|
||||||
|
}
|
||||||
|
d_E_accu = *d_Early;
|
||||||
|
d_P_accu = *d_Prompt;
|
||||||
|
d_L_accu = *d_Late;
|
||||||
|
|
||||||
|
// end = std::chrono::system_clock::now();
|
||||||
|
// elapsed_seconds = end - start;
|
||||||
|
// std::cout << "elapsed time 1: " << elapsed_seconds.count() << "s\n";
|
||||||
|
|
||||||
|
// Check lock status
|
||||||
|
|
||||||
|
// start = std::chrono::system_clock::now();
|
||||||
|
|
||||||
|
if (!cn0_and_tracking_lock_status(d_code_period))
|
||||||
|
{
|
||||||
|
clear_tracking_vars();
|
||||||
|
d_state = 0; // loss-of-lock detected
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// end = std::chrono::system_clock::now();
|
||||||
|
// elapsed_seconds = end - start;
|
||||||
|
// std::cout << "elapsed time 2: " << elapsed_seconds.count() << "s\n";
|
||||||
|
|
||||||
|
bool next_state = false;
|
||||||
|
// Perform DLL/PLL tracking loop computations. Costas Loop enabled
|
||||||
|
|
||||||
|
// start = std::chrono::system_clock::now();
|
||||||
|
|
||||||
|
run_dll_pll();
|
||||||
|
|
||||||
|
// end = std::chrono::system_clock::now();
|
||||||
|
// elapsed_seconds = end - start;
|
||||||
|
// std::cout << "elapsed time 3: " << elapsed_seconds.count() << "s\n";
|
||||||
|
|
||||||
|
// start = std::chrono::system_clock::now();
|
||||||
|
|
||||||
|
update_tracking_vars();
|
||||||
|
|
||||||
|
// end = std::chrono::system_clock::now();
|
||||||
|
// elapsed_seconds = end - start;
|
||||||
|
// std::cout << "elapsed time 4: " << elapsed_seconds.count() << "s\n";
|
||||||
|
|
||||||
|
// enable write dump file this cycle (valid DLL/PLL cycle)
|
||||||
|
|
||||||
|
// start = std::chrono::system_clock::now();
|
||||||
|
|
||||||
|
log_data(false);
|
||||||
|
|
||||||
|
// end = std::chrono::system_clock::now();
|
||||||
|
// elapsed_seconds = end - start;
|
||||||
|
// std::cout << "elapsed time 5: " << elapsed_seconds.count() << "s\n";
|
||||||
|
|
||||||
|
if (d_secondary)
|
||||||
|
{
|
||||||
|
// start = std::chrono::system_clock::now();
|
||||||
|
|
||||||
|
// ####### SECONDARY CODE LOCK #####
|
||||||
|
d_Prompt_circular_buffer.push_back(*d_Prompt);
|
||||||
|
|
||||||
|
// end = std::chrono::system_clock::now();
|
||||||
|
// elapsed_seconds = end - start;
|
||||||
|
// std::cout << "elapsed time 6: " << elapsed_seconds.count() << "s\n";
|
||||||
|
|
||||||
|
//d_Prompt_buffer_deque.push_back(*d_Prompt);
|
||||||
|
//if (d_Prompt_buffer_deque.size() == d_secondary_code_length)
|
||||||
|
if (d_Prompt_circular_buffer.size() == d_secondary_code_length)
|
||||||
|
{
|
||||||
|
// start = std::chrono::system_clock::now();
|
||||||
|
|
||||||
|
next_state = acquire_secondary();
|
||||||
|
|
||||||
|
// end = std::chrono::system_clock::now();
|
||||||
|
// elapsed_seconds = end - start;
|
||||||
|
// std::cout << "elapsed time 7: " << elapsed_seconds.count() << "s\n";
|
||||||
|
|
||||||
|
// start = std::chrono::system_clock::now();
|
||||||
|
|
||||||
|
if (next_state)
|
||||||
|
{
|
||||||
|
LOG(INFO) << systemName << " " << signal_pretty_name << " secondary code locked in channel " << d_channel
|
||||||
|
<< " for satellite " << Gnss_Satellite(systemName, d_acquisition_gnss_synchro->PRN) << std::endl;
|
||||||
|
std::cout << systemName << " " << signal_pretty_name << " secondary code locked in channel " << d_channel
|
||||||
|
<< " for satellite " << Gnss_Satellite(systemName, d_acquisition_gnss_synchro->PRN) << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// end = std::chrono::system_clock::now();
|
||||||
|
// elapsed_seconds = end - start;
|
||||||
|
// std::cout << "elapsed time 8: " << elapsed_seconds.count() << "s\n";
|
||||||
|
|
||||||
|
//d_Prompt_buffer_deque.pop_front();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (d_symbols_per_bit > 1) //Signal does not have secondary code. Search a bit transition by sign change
|
||||||
|
{
|
||||||
|
// start = std::chrono::system_clock::now();
|
||||||
|
|
||||||
|
float current_tracking_time_s = static_cast<float>(d_sample_counter - d_absolute_samples_offset) / trk_parameters.fs_in;
|
||||||
|
|
||||||
|
// end = std::chrono::system_clock::now();
|
||||||
|
// elapsed_seconds = end - start;
|
||||||
|
// std::cout << "elapsed time 6b: " << elapsed_seconds.count() << "s\n";
|
||||||
|
|
||||||
|
if (current_tracking_time_s > 10)
|
||||||
|
{
|
||||||
|
// start = std::chrono::system_clock::now();
|
||||||
|
|
||||||
|
d_symbol_history.push_back(d_Prompt->real());
|
||||||
|
|
||||||
|
// end = std::chrono::system_clock::now();
|
||||||
|
// elapsed_seconds = end - start;
|
||||||
|
// std::cout << "elapsed time 7b: " << elapsed_seconds.count() << "s\n";
|
||||||
|
|
||||||
|
//******* preamble correlation ********
|
||||||
|
|
||||||
|
// start = std::chrono::system_clock::now();
|
||||||
|
|
||||||
|
int32_t corr_value = 0;
|
||||||
|
if ((d_symbol_history.size() == d_preamble_length_symbols)) // and (d_make_correlation or !d_flag_frame_sync))
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
for (const auto &iter : d_symbol_history)
|
||||||
|
{
|
||||||
|
if (iter < 0.0) // symbols clipping
|
||||||
|
{
|
||||||
|
corr_value -= d_preambles_symbols[i];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
corr_value += d_preambles_symbols[i];
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// end = std::chrono::system_clock::now();
|
||||||
|
// elapsed_seconds = end - start;
|
||||||
|
// std::cout << "elapsed time 8b: " << elapsed_seconds.count() << "s\n";
|
||||||
|
|
||||||
|
// start = std::chrono::system_clock::now();
|
||||||
|
|
||||||
|
if (corr_value == GPS_CA_PREAMBLE_LENGTH_SYMBOLS)
|
||||||
|
{
|
||||||
|
LOG(INFO) << systemName << " " << signal_pretty_name << " tracking preamble detected in channel " << d_channel
|
||||||
|
<< " for satellite " << Gnss_Satellite(systemName, d_acquisition_gnss_synchro->PRN) << std::endl;
|
||||||
|
next_state = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
next_state = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// end = std::chrono::system_clock::now();
|
||||||
|
// elapsed_seconds = end - start;
|
||||||
|
// std::cout << "elapsed time 9b: " << elapsed_seconds.count() << "s\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
next_state = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
next_state = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// start = std::chrono::system_clock::now();
|
||||||
|
|
||||||
|
// ########### Output the tracking results to Telemetry block ##########
|
||||||
|
if (interchange_iq)
|
||||||
|
{
|
||||||
|
if (trk_parameters.track_pilot)
|
||||||
|
{
|
||||||
|
// Note that data and pilot components are in quadrature. I and Q are interchanged
|
||||||
|
current_synchro_data.Prompt_I = static_cast<double>((*d_Prompt_Data).imag());
|
||||||
|
current_synchro_data.Prompt_Q = static_cast<double>((*d_Prompt_Data).real());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
current_synchro_data.Prompt_I = static_cast<double>((*d_Prompt).imag());
|
||||||
|
current_synchro_data.Prompt_Q = static_cast<double>((*d_Prompt).real());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (trk_parameters.track_pilot)
|
||||||
|
{
|
||||||
|
// Note that data and pilot components are in quadrature. I and Q are interchanged
|
||||||
|
current_synchro_data.Prompt_I = static_cast<double>((*d_Prompt_Data).real());
|
||||||
|
current_synchro_data.Prompt_Q = static_cast<double>((*d_Prompt_Data).imag());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
current_synchro_data.Prompt_I = static_cast<double>((*d_Prompt).real());
|
||||||
|
current_synchro_data.Prompt_Q = static_cast<double>((*d_Prompt).imag());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
current_synchro_data.Code_phase_samples = d_rem_code_phase_samples;
|
||||||
|
current_synchro_data.Carrier_phase_rads = d_acc_carrier_phase_rad;
|
||||||
|
current_synchro_data.Carrier_Doppler_hz = d_carrier_doppler_hz;
|
||||||
|
current_synchro_data.CN0_dB_hz = d_CN0_SNV_dB_Hz;
|
||||||
|
current_synchro_data.Flag_valid_symbol_output = true;
|
||||||
|
current_synchro_data.correlation_length_ms = d_correlation_length_ms;
|
||||||
|
|
||||||
|
// end = std::chrono::system_clock::now();
|
||||||
|
// elapsed_seconds = end - start;
|
||||||
|
// std::cout << "elapsed time 10: " << elapsed_seconds.count() << "s\n";
|
||||||
|
|
||||||
|
if (next_state)
|
||||||
|
{ // reset extended correlator
|
||||||
|
d_VE_accu = gr_complex(0.0, 0.0);
|
||||||
|
d_E_accu = gr_complex(0.0, 0.0);
|
||||||
|
d_P_accu = gr_complex(0.0, 0.0);
|
||||||
|
d_L_accu = gr_complex(0.0, 0.0);
|
||||||
|
d_VL_accu = gr_complex(0.0, 0.0);
|
||||||
|
d_Prompt_circular_buffer.clear();
|
||||||
|
d_current_symbol = 0;
|
||||||
|
//d_Prompt_buffer_deque.clear();
|
||||||
|
|
||||||
|
if (d_enable_extended_integration)
|
||||||
|
{
|
||||||
|
// UPDATE INTEGRATION TIME
|
||||||
|
d_extend_correlation_symbols_count = 0;
|
||||||
|
d_current_correlation_time_s = static_cast<float>(trk_parameters.extend_correlation_symbols) * static_cast<float>(d_code_period);
|
||||||
|
|
||||||
|
d_state = 3; // next state is the extended correlator integrator
|
||||||
|
LOG(INFO) << "Enabled " << trk_parameters.extend_correlation_symbols * static_cast<int32_t>(d_code_period * 1000.0) << " ms extended correlator in channel "
|
||||||
|
<< d_channel
|
||||||
|
<< " for satellite " << Gnss_Satellite(systemName, d_acquisition_gnss_synchro->PRN);
|
||||||
|
std::cout << "Enabled " << trk_parameters.extend_correlation_symbols * static_cast<int32_t>(d_code_period * 1000.0) << " ms extended correlator in channel "
|
||||||
|
<< d_channel
|
||||||
|
<< " for satellite " << Gnss_Satellite(systemName, d_acquisition_gnss_synchro->PRN) << std::endl;
|
||||||
|
// Set narrow taps delay values [chips]
|
||||||
|
d_code_loop_filter.set_update_interval(d_current_correlation_time_s);
|
||||||
|
d_code_loop_filter.set_noise_bandwidth(trk_parameters.dll_bw_narrow_hz);
|
||||||
|
d_carrier_loop_filter.set_params(trk_parameters.fll_bw_hz, trk_parameters.pll_bw_narrow_hz, trk_parameters.pll_filter_order);
|
||||||
|
if (d_veml)
|
||||||
|
{
|
||||||
|
d_local_code_shift_chips[0] = -trk_parameters.very_early_late_space_narrow_chips * static_cast<float>(d_code_samples_per_chip);
|
||||||
|
d_local_code_shift_chips[1] = -trk_parameters.early_late_space_narrow_chips * static_cast<float>(d_code_samples_per_chip);
|
||||||
|
d_local_code_shift_chips[3] = trk_parameters.early_late_space_narrow_chips * static_cast<float>(d_code_samples_per_chip);
|
||||||
|
d_local_code_shift_chips[4] = trk_parameters.very_early_late_space_narrow_chips * static_cast<float>(d_code_samples_per_chip);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
d_local_code_shift_chips[0] = -trk_parameters.early_late_space_narrow_chips * static_cast<float>(d_code_samples_per_chip);
|
||||||
|
d_local_code_shift_chips[2] = trk_parameters.early_late_space_narrow_chips * static_cast<float>(d_code_samples_per_chip);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
d_state = 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 3: // coherent integration (correlation time extension)
|
case 3: // coherent integration (correlation time extension)
|
||||||
@ -1600,183 +1873,183 @@ int dll_pll_veml_tracking_fpga::general_work(int noutput_items __attribute__((un
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void dll_pll_veml_tracking_fpga::run_state_2(Gnss_Synchro ¤t_synchro_data)
|
//void dll_pll_veml_tracking_fpga::run_state_2(Gnss_Synchro ¤t_synchro_data)
|
||||||
{
|
//{
|
||||||
d_sample_counter = d_sample_counter_next;
|
// d_sample_counter = d_sample_counter_next;
|
||||||
d_sample_counter_next = d_sample_counter + static_cast<uint64_t>(d_current_prn_length_samples);
|
// d_sample_counter_next = d_sample_counter + static_cast<uint64_t>(d_current_prn_length_samples);
|
||||||
|
//
|
||||||
do_correlation_step();
|
// do_correlation_step();
|
||||||
// Save single correlation step variables
|
// // Save single correlation step variables
|
||||||
if (d_veml)
|
// if (d_veml)
|
||||||
{
|
// {
|
||||||
d_VE_accu = *d_Very_Early;
|
// d_VE_accu = *d_Very_Early;
|
||||||
d_VL_accu = *d_Very_Late;
|
// d_VL_accu = *d_Very_Late;
|
||||||
}
|
// }
|
||||||
d_E_accu = *d_Early;
|
// d_E_accu = *d_Early;
|
||||||
d_P_accu = *d_Prompt;
|
// d_P_accu = *d_Prompt;
|
||||||
d_L_accu = *d_Late;
|
// d_L_accu = *d_Late;
|
||||||
|
//
|
||||||
// Check lock status
|
// // Check lock status
|
||||||
if (!cn0_and_tracking_lock_status(d_code_period))
|
// if (!cn0_and_tracking_lock_status(d_code_period))
|
||||||
{
|
// {
|
||||||
clear_tracking_vars();
|
// clear_tracking_vars();
|
||||||
d_state = 0; // loss-of-lock detected
|
// d_state = 0; // loss-of-lock detected
|
||||||
}
|
// }
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
bool next_state = false;
|
// bool next_state = false;
|
||||||
// Perform DLL/PLL tracking loop computations. Costas Loop enabled
|
// // Perform DLL/PLL tracking loop computations. Costas Loop enabled
|
||||||
run_dll_pll();
|
// run_dll_pll();
|
||||||
update_tracking_vars();
|
// update_tracking_vars();
|
||||||
|
//
|
||||||
// enable write dump file this cycle (valid DLL/PLL cycle)
|
// // enable write dump file this cycle (valid DLL/PLL cycle)
|
||||||
log_data(false);
|
// log_data(false);
|
||||||
if (d_secondary)
|
// if (d_secondary)
|
||||||
{
|
// {
|
||||||
// ####### SECONDARY CODE LOCK #####
|
// // ####### SECONDARY CODE LOCK #####
|
||||||
d_Prompt_circular_buffer.push_back(*d_Prompt);
|
// d_Prompt_circular_buffer.push_back(*d_Prompt);
|
||||||
//d_Prompt_buffer_deque.push_back(*d_Prompt);
|
// //d_Prompt_buffer_deque.push_back(*d_Prompt);
|
||||||
//if (d_Prompt_buffer_deque.size() == d_secondary_code_length)
|
// //if (d_Prompt_buffer_deque.size() == d_secondary_code_length)
|
||||||
if (d_Prompt_circular_buffer.size() == d_secondary_code_length)
|
// if (d_Prompt_circular_buffer.size() == d_secondary_code_length)
|
||||||
{
|
// {
|
||||||
next_state = acquire_secondary();
|
// next_state = acquire_secondary();
|
||||||
if (next_state)
|
// if (next_state)
|
||||||
{
|
// {
|
||||||
LOG(INFO) << systemName << " " << signal_pretty_name << " secondary code locked in channel " << d_channel
|
// LOG(INFO) << systemName << " " << signal_pretty_name << " secondary code locked in channel " << d_channel
|
||||||
<< " for satellite " << Gnss_Satellite(systemName, d_acquisition_gnss_synchro->PRN) << std::endl;
|
// << " for satellite " << Gnss_Satellite(systemName, d_acquisition_gnss_synchro->PRN) << std::endl;
|
||||||
std::cout << systemName << " " << signal_pretty_name << " secondary code locked in channel " << d_channel
|
// std::cout << systemName << " " << signal_pretty_name << " secondary code locked in channel " << d_channel
|
||||||
<< " for satellite " << Gnss_Satellite(systemName, d_acquisition_gnss_synchro->PRN) << std::endl;
|
// << " for satellite " << Gnss_Satellite(systemName, d_acquisition_gnss_synchro->PRN) << std::endl;
|
||||||
}
|
// }
|
||||||
//d_Prompt_buffer_deque.pop_front();
|
// //d_Prompt_buffer_deque.pop_front();
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
else if (d_symbols_per_bit > 1) //Signal does not have secondary code. Search a bit transition by sign change
|
// else if (d_symbols_per_bit > 1) //Signal does not have secondary code. Search a bit transition by sign change
|
||||||
{
|
// {
|
||||||
float current_tracking_time_s = static_cast<float>(d_sample_counter - d_absolute_samples_offset) / trk_parameters.fs_in;
|
// float current_tracking_time_s = static_cast<float>(d_sample_counter - d_absolute_samples_offset) / trk_parameters.fs_in;
|
||||||
if (current_tracking_time_s > 10)
|
// if (current_tracking_time_s > 10)
|
||||||
{
|
// {
|
||||||
d_symbol_history.push_back(d_Prompt->real());
|
// d_symbol_history.push_back(d_Prompt->real());
|
||||||
//******* preamble correlation ********
|
// //******* preamble correlation ********
|
||||||
int32_t corr_value = 0;
|
// int32_t corr_value = 0;
|
||||||
if ((d_symbol_history.size() == GPS_CA_PREAMBLE_LENGTH_SYMBOLS)) // and (d_make_correlation or !d_flag_frame_sync))
|
// if ((d_symbol_history.size() == GPS_CA_PREAMBLE_LENGTH_SYMBOLS)) // and (d_make_correlation or !d_flag_frame_sync))
|
||||||
{
|
// {
|
||||||
int i = 0;
|
// int i = 0;
|
||||||
for (const auto &iter : d_symbol_history)
|
// for (const auto &iter : d_symbol_history)
|
||||||
{
|
// {
|
||||||
if (iter < 0.0) // symbols clipping
|
// if (iter < 0.0) // symbols clipping
|
||||||
{
|
// {
|
||||||
corr_value -= d_preambles_symbols[i];
|
// corr_value -= d_preambles_symbols[i];
|
||||||
}
|
// }
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
corr_value += d_preambles_symbols[i];
|
// corr_value += d_preambles_symbols[i];
|
||||||
}
|
// }
|
||||||
i++;
|
// i++;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
if (corr_value == GPS_CA_PREAMBLE_LENGTH_SYMBOLS)
|
// if (corr_value == GPS_CA_PREAMBLE_LENGTH_SYMBOLS)
|
||||||
{
|
// {
|
||||||
LOG(INFO) << systemName << " " << signal_pretty_name << " tracking preamble detected in channel " << d_channel
|
// LOG(INFO) << systemName << " " << signal_pretty_name << " tracking preamble detected in channel " << d_channel
|
||||||
<< " for satellite " << Gnss_Satellite(systemName, d_acquisition_gnss_synchro->PRN) << std::endl;
|
// << " for satellite " << Gnss_Satellite(systemName, d_acquisition_gnss_synchro->PRN) << std::endl;
|
||||||
next_state = true;
|
// next_state = true;
|
||||||
}
|
// }
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
next_state = false;
|
// next_state = false;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
next_state = false;
|
// next_state = false;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
next_state = true;
|
// next_state = true;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
// ########### Output the tracking results to Telemetry block ##########
|
// // ########### Output the tracking results to Telemetry block ##########
|
||||||
if (interchange_iq)
|
// if (interchange_iq)
|
||||||
{
|
// {
|
||||||
if (trk_parameters.track_pilot)
|
// if (trk_parameters.track_pilot)
|
||||||
{
|
// {
|
||||||
// Note that data and pilot components are in quadrature. I and Q are interchanged
|
// // Note that data and pilot components are in quadrature. I and Q are interchanged
|
||||||
current_synchro_data.Prompt_I = static_cast<double>((*d_Prompt_Data).imag());
|
// current_synchro_data.Prompt_I = static_cast<double>((*d_Prompt_Data).imag());
|
||||||
current_synchro_data.Prompt_Q = static_cast<double>((*d_Prompt_Data).real());
|
// current_synchro_data.Prompt_Q = static_cast<double>((*d_Prompt_Data).real());
|
||||||
}
|
// }
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
current_synchro_data.Prompt_I = static_cast<double>((*d_Prompt).imag());
|
// current_synchro_data.Prompt_I = static_cast<double>((*d_Prompt).imag());
|
||||||
current_synchro_data.Prompt_Q = static_cast<double>((*d_Prompt).real());
|
// current_synchro_data.Prompt_Q = static_cast<double>((*d_Prompt).real());
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
if (trk_parameters.track_pilot)
|
// if (trk_parameters.track_pilot)
|
||||||
{
|
// {
|
||||||
// Note that data and pilot components are in quadrature. I and Q are interchanged
|
// // Note that data and pilot components are in quadrature. I and Q are interchanged
|
||||||
current_synchro_data.Prompt_I = static_cast<double>((*d_Prompt_Data).real());
|
// current_synchro_data.Prompt_I = static_cast<double>((*d_Prompt_Data).real());
|
||||||
current_synchro_data.Prompt_Q = static_cast<double>((*d_Prompt_Data).imag());
|
// current_synchro_data.Prompt_Q = static_cast<double>((*d_Prompt_Data).imag());
|
||||||
}
|
// }
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
current_synchro_data.Prompt_I = static_cast<double>((*d_Prompt).real());
|
// current_synchro_data.Prompt_I = static_cast<double>((*d_Prompt).real());
|
||||||
current_synchro_data.Prompt_Q = static_cast<double>((*d_Prompt).imag());
|
// current_synchro_data.Prompt_Q = static_cast<double>((*d_Prompt).imag());
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
current_synchro_data.Code_phase_samples = d_rem_code_phase_samples;
|
// current_synchro_data.Code_phase_samples = d_rem_code_phase_samples;
|
||||||
current_synchro_data.Carrier_phase_rads = d_acc_carrier_phase_rad;
|
// current_synchro_data.Carrier_phase_rads = d_acc_carrier_phase_rad;
|
||||||
current_synchro_data.Carrier_Doppler_hz = d_carrier_doppler_hz;
|
// current_synchro_data.Carrier_Doppler_hz = d_carrier_doppler_hz;
|
||||||
current_synchro_data.CN0_dB_hz = d_CN0_SNV_dB_Hz;
|
// current_synchro_data.CN0_dB_hz = d_CN0_SNV_dB_Hz;
|
||||||
current_synchro_data.Flag_valid_symbol_output = true;
|
// current_synchro_data.Flag_valid_symbol_output = true;
|
||||||
current_synchro_data.correlation_length_ms = d_correlation_length_ms;
|
// current_synchro_data.correlation_length_ms = d_correlation_length_ms;
|
||||||
|
//
|
||||||
if (next_state)
|
// if (next_state)
|
||||||
{ // reset extended correlator
|
// { // reset extended correlator
|
||||||
d_VE_accu = gr_complex(0.0, 0.0);
|
// d_VE_accu = gr_complex(0.0, 0.0);
|
||||||
d_E_accu = gr_complex(0.0, 0.0);
|
// d_E_accu = gr_complex(0.0, 0.0);
|
||||||
d_P_accu = gr_complex(0.0, 0.0);
|
// d_P_accu = gr_complex(0.0, 0.0);
|
||||||
d_L_accu = gr_complex(0.0, 0.0);
|
// d_L_accu = gr_complex(0.0, 0.0);
|
||||||
d_VL_accu = gr_complex(0.0, 0.0);
|
// d_VL_accu = gr_complex(0.0, 0.0);
|
||||||
d_Prompt_circular_buffer.clear();
|
// d_Prompt_circular_buffer.clear();
|
||||||
d_current_symbol = 0;
|
// d_current_symbol = 0;
|
||||||
//d_Prompt_buffer_deque.clear();
|
// //d_Prompt_buffer_deque.clear();
|
||||||
|
//
|
||||||
if (d_enable_extended_integration)
|
// if (d_enable_extended_integration)
|
||||||
{
|
// {
|
||||||
// UPDATE INTEGRATION TIME
|
// // UPDATE INTEGRATION TIME
|
||||||
d_extend_correlation_symbols_count = 0;
|
// d_extend_correlation_symbols_count = 0;
|
||||||
d_current_correlation_time_s = static_cast<float>(trk_parameters.extend_correlation_symbols) * static_cast<float>(d_code_period);
|
// d_current_correlation_time_s = static_cast<float>(trk_parameters.extend_correlation_symbols) * static_cast<float>(d_code_period);
|
||||||
|
//
|
||||||
d_state = 3; // next state is the extended correlator integrator
|
// d_state = 3; // next state is the extended correlator integrator
|
||||||
LOG(INFO) << "Enabled " << trk_parameters.extend_correlation_symbols * static_cast<int32_t>(d_code_period * 1000.0) << " ms extended correlator in channel "
|
// LOG(INFO) << "Enabled " << trk_parameters.extend_correlation_symbols * static_cast<int32_t>(d_code_period * 1000.0) << " ms extended correlator in channel "
|
||||||
<< d_channel
|
// << d_channel
|
||||||
<< " for satellite " << Gnss_Satellite(systemName, d_acquisition_gnss_synchro->PRN);
|
// << " for satellite " << Gnss_Satellite(systemName, d_acquisition_gnss_synchro->PRN);
|
||||||
std::cout << "Enabled " << trk_parameters.extend_correlation_symbols * static_cast<int32_t>(d_code_period * 1000.0) << " ms extended correlator in channel "
|
// std::cout << "Enabled " << trk_parameters.extend_correlation_symbols * static_cast<int32_t>(d_code_period * 1000.0) << " ms extended correlator in channel "
|
||||||
<< d_channel
|
// << d_channel
|
||||||
<< " for satellite " << Gnss_Satellite(systemName, d_acquisition_gnss_synchro->PRN) << std::endl;
|
// << " for satellite " << Gnss_Satellite(systemName, d_acquisition_gnss_synchro->PRN) << std::endl;
|
||||||
// Set narrow taps delay values [chips]
|
// // Set narrow taps delay values [chips]
|
||||||
d_code_loop_filter.set_update_interval(d_current_correlation_time_s);
|
// d_code_loop_filter.set_update_interval(d_current_correlation_time_s);
|
||||||
d_code_loop_filter.set_noise_bandwidth(trk_parameters.dll_bw_narrow_hz);
|
// d_code_loop_filter.set_noise_bandwidth(trk_parameters.dll_bw_narrow_hz);
|
||||||
d_carrier_loop_filter.set_params(trk_parameters.fll_bw_hz, trk_parameters.pll_bw_narrow_hz, trk_parameters.pll_filter_order);
|
// d_carrier_loop_filter.set_params(trk_parameters.fll_bw_hz, trk_parameters.pll_bw_narrow_hz, trk_parameters.pll_filter_order);
|
||||||
if (d_veml)
|
// if (d_veml)
|
||||||
{
|
// {
|
||||||
d_local_code_shift_chips[0] = -trk_parameters.very_early_late_space_narrow_chips * static_cast<float>(d_code_samples_per_chip);
|
// d_local_code_shift_chips[0] = -trk_parameters.very_early_late_space_narrow_chips * static_cast<float>(d_code_samples_per_chip);
|
||||||
d_local_code_shift_chips[1] = -trk_parameters.early_late_space_narrow_chips * static_cast<float>(d_code_samples_per_chip);
|
// d_local_code_shift_chips[1] = -trk_parameters.early_late_space_narrow_chips * static_cast<float>(d_code_samples_per_chip);
|
||||||
d_local_code_shift_chips[3] = trk_parameters.early_late_space_narrow_chips * static_cast<float>(d_code_samples_per_chip);
|
// d_local_code_shift_chips[3] = trk_parameters.early_late_space_narrow_chips * static_cast<float>(d_code_samples_per_chip);
|
||||||
d_local_code_shift_chips[4] = trk_parameters.very_early_late_space_narrow_chips * static_cast<float>(d_code_samples_per_chip);
|
// d_local_code_shift_chips[4] = trk_parameters.very_early_late_space_narrow_chips * static_cast<float>(d_code_samples_per_chip);
|
||||||
}
|
// }
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
d_local_code_shift_chips[0] = -trk_parameters.early_late_space_narrow_chips * static_cast<float>(d_code_samples_per_chip);
|
// d_local_code_shift_chips[0] = -trk_parameters.early_late_space_narrow_chips * static_cast<float>(d_code_samples_per_chip);
|
||||||
d_local_code_shift_chips[2] = trk_parameters.early_late_space_narrow_chips * static_cast<float>(d_code_samples_per_chip);
|
// d_local_code_shift_chips[2] = trk_parameters.early_late_space_narrow_chips * static_cast<float>(d_code_samples_per_chip);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
d_state = 4;
|
// d_state = 4;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
@ -91,7 +91,7 @@ private:
|
|||||||
void log_data(bool integrating);
|
void log_data(bool integrating);
|
||||||
int32_t save_matfile();
|
int32_t save_matfile();
|
||||||
|
|
||||||
void run_state_2(Gnss_Synchro ¤t_synchro_data);
|
//void run_state_2(Gnss_Synchro ¤t_synchro_data);
|
||||||
|
|
||||||
// tracking configuration vars
|
// tracking configuration vars
|
||||||
Dll_Pll_Conf_Fpga trk_parameters;
|
Dll_Pll_Conf_Fpga trk_parameters;
|
||||||
|
Loading…
Reference in New Issue
Block a user