1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2024-12-15 12:40:35 +00:00

bds b1i: Adding geo satellites tracking and setting up structure for d2 nav decoding

This commit is contained in:
Damian Miralles 2018-12-24 15:14:10 -06:00
parent 0c4b8b25f1
commit 7cdd2ee477
4 changed files with 67 additions and 24 deletions

View File

@ -136,6 +136,8 @@ beidou_b1i_telemetry_decoder_cc::beidou_b1i_telemetry_decoder_cc(
d_channel = 0; d_channel = 0;
flag_SOW_set = false; flag_SOW_set = false;
} }
@ -265,6 +267,7 @@ void beidou_b1i_telemetry_decoder_cc::decode_subframe(double *frame_symbols, int
if (d_nav.have_new_ephemeris() == true) if (d_nav.have_new_ephemeris() == true)
{ {
// get object for this SV (mandatory) // get object for this SV (mandatory)
d_nav.i_satellite_PRN = d_satellite.get_PRN();
std::shared_ptr<Beidou_Dnav_Ephemeris> tmp_obj = std::make_shared<Beidou_Dnav_Ephemeris>(d_nav.get_ephemeris()); std::shared_ptr<Beidou_Dnav_Ephemeris> tmp_obj = std::make_shared<Beidou_Dnav_Ephemeris>(d_nav.get_ephemeris());
this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj));
LOG(INFO) << "BEIDOU DNAV Ephemeris have been received in channel" << d_channel << " from satellite " << d_satellite; LOG(INFO) << "BEIDOU DNAV Ephemeris have been received in channel" << d_channel << " from satellite " << d_satellite;

View File

@ -98,7 +98,7 @@ dll_pll_veml_tracking::dll_pll_veml_tracking(const Dll_Pll_Conf &conf_) : gr::bl
d_code_chip_rate = 0.0; d_code_chip_rate = 0.0;
d_secondary_code_length = 0U; d_secondary_code_length = 0U;
d_secondary_code_string = nullptr; d_secondary_code_string = nullptr;
d_gps_l1ca_preambles_symbols = nullptr; d_preambles_symbols = nullptr;
signal_type = std::string(trk_parameters.signal); signal_type = std::string(trk_parameters.signal);
std::map<std::string, std::string> map_signal_pretty_name; std::map<std::string, std::string> map_signal_pretty_name;
@ -134,7 +134,8 @@ dll_pll_veml_tracking::dll_pll_veml_tracking(const Dll_Pll_Conf &conf_) : gr::bl
uint16_t preambles_bits[GPS_CA_PREAMBLE_LENGTH_BITS] = GPS_PREAMBLE; uint16_t preambles_bits[GPS_CA_PREAMBLE_LENGTH_BITS] = GPS_PREAMBLE;
// preamble bits to sampled symbols // preamble bits to sampled symbols
d_gps_l1ca_preambles_symbols = static_cast<int32_t *>(volk_gnsssdr_malloc(GPS_CA_PREAMBLE_LENGTH_SYMBOLS * sizeof(int32_t), volk_gnsssdr_get_alignment())); d_preamble_length_symbols = GPS_CA_PREAMBLE_LENGTH_SYMBOLS;
d_preambles_symbols = static_cast<int32_t *>(volk_gnsssdr_malloc(GPS_CA_PREAMBLE_LENGTH_SYMBOLS * sizeof(int32_t), volk_gnsssdr_get_alignment()));
int32_t n = 0; int32_t n = 0;
for (uint16_t preambles_bit : preambles_bits) for (uint16_t preambles_bit : preambles_bits)
{ {
@ -142,11 +143,11 @@ dll_pll_veml_tracking::dll_pll_veml_tracking(const Dll_Pll_Conf &conf_) : gr::bl
{ {
if (preambles_bit == 1) if (preambles_bit == 1)
{ {
d_gps_l1ca_preambles_symbols[n] = 1; d_preambles_symbols[n] = 1;
} }
else else
{ {
d_gps_l1ca_preambles_symbols[n] = -1; d_preambles_symbols[n] = -1;
} }
n++; n++;
} }
@ -278,19 +279,19 @@ dll_pll_veml_tracking::dll_pll_veml_tracking(const Dll_Pll_Conf &conf_) : gr::bl
systemName = "Beidou"; systemName = "Beidou";
if (signal_type == "B1") if (signal_type == "B1")
{ {
d_signal_carrier_freq = BEIDOU_B1I_FREQ_HZ; // GEO Satellites use different secondary code
d_code_period = BEIDOU_B1I_CODE_PERIOD; d_signal_carrier_freq = BEIDOU_B1I_FREQ_HZ;
d_code_chip_rate = BEIDOU_B1I_CODE_RATE_HZ; d_code_period = BEIDOU_B1I_CODE_PERIOD;
d_code_length_chips = static_cast<unsigned int>(BEIDOU_B1I_CODE_LENGTH_CHIPS); d_code_chip_rate = BEIDOU_B1I_CODE_RATE_HZ;
d_symbols_per_bit = BEIDOU_B1I_TELEMETRY_SYMBOLS_PER_BIT; d_code_length_chips = static_cast<unsigned int>(BEIDOU_B1I_CODE_LENGTH_CHIPS);
d_correlation_length_ms = 1; d_symbols_per_bit = BEIDOU_B1I_TELEMETRY_SYMBOLS_PER_BIT;
d_code_samples_per_chip = 1; d_correlation_length_ms = 1;
d_secondary = true; d_code_samples_per_chip = 1;
trk_parameters.track_pilot = false; d_secondary = true;
interchange_iq = false; trk_parameters.track_pilot = false;
d_secondary_code_length = static_cast<unsigned int>(BEIDOU_B1I_SECONDARY_CODE_LENGTH); interchange_iq = false;
d_secondary_code_string = const_cast<std::string *>(&BEIDOU_B1I_SECONDARY_CODE_STR); d_secondary_code_length = static_cast<unsigned int>(BEIDOU_B1I_SECONDARY_CODE_LENGTH);
d_secondary_code_string = const_cast<std::string *>(&BEIDOU_B1I_SECONDARY_CODE_STR);
} }
else else
{ {
@ -573,6 +574,42 @@ void dll_pll_veml_tracking::start_tracking()
else if (systemName == "Beidou" and signal_type == "B1") else if (systemName == "Beidou" and signal_type == "B1")
{ {
beidou_b1i_code_gen_float(d_tracking_code, d_acquisition_gnss_synchro->PRN, 0); beidou_b1i_code_gen_float(d_tracking_code, d_acquisition_gnss_synchro->PRN, 0);
// Update secondary code settings for geo satellites
if(d_acquisition_gnss_synchro->PRN > 0 and d_acquisition_gnss_synchro->PRN < 6)
{
d_symbols_per_bit = 2;
d_correlation_length_ms = 1;
d_code_samples_per_chip = 1;
d_secondary = false;
trk_parameters.track_pilot = false;
interchange_iq = false;
d_secondary_code_length = 0;
d_secondary_code_string = const_cast<std::string *>(&BEIDOU_B1I_D2_SECONDARY_CODE_STR);
// preamble bits to sampled symbols
d_preamble_length_symbols = 22;
d_preambles_symbols = static_cast<int32_t *>(volk_gnsssdr_malloc(22 * sizeof(int32_t), volk_gnsssdr_get_alignment()));
int32_t n = 0;
uint16_t preambles_bits[BEIDOU_B1I_PREAMBLE_LENGTH_BITS] = {1,1,1,0,0,0,1,0,0,1,0};
for (uint16_t preambles_bit : preambles_bits)
{
for (uint32_t j = 0; j < d_symbols_per_bit; j++)
{
if (preambles_bit == 1)
{
d_preambles_symbols[n] = 1;
}
else
{
d_preambles_symbols[n] = -1;
}
n++;
}
}
d_symbol_history.resize(22); // Change fixed buffer size
d_symbol_history.clear();
}
} }
multicorrelator_cpu.set_local_code_and_taps(d_code_samples_per_chip * d_code_length_chips, d_tracking_code, d_local_code_shift_chips); multicorrelator_cpu.set_local_code_and_taps(d_code_samples_per_chip * d_code_length_chips, d_tracking_code, d_local_code_shift_chips);
@ -621,7 +658,7 @@ dll_pll_veml_tracking::~dll_pll_veml_tracking()
{ {
if (signal_type == "1C") if (signal_type == "1C")
{ {
volk_gnsssdr_free(d_gps_l1ca_preambles_symbols); volk_gnsssdr_free(d_preambles_symbols);
} }
if (d_dump_file.is_open()) if (d_dump_file.is_open())
@ -1470,21 +1507,21 @@ int dll_pll_veml_tracking::general_work(int noutput_items __attribute__((unused)
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() == d_preamble_length_symbols)) // and (d_make_correlation or !d_flag_frame_sync))
{ {
for (uint32_t i = 0; i < GPS_CA_PREAMBLE_LENGTH_SYMBOLS; i++) for (uint32_t i = 0; i < d_preamble_length_symbols; i++)
{ {
if (d_symbol_history.at(i) < 0) // symbols clipping if (d_symbol_history.at(i) < 0) // symbols clipping
{ {
corr_value -= d_gps_l1ca_preambles_symbols[i]; corr_value -= d_preambles_symbols[i];
} }
else else
{ {
corr_value += d_gps_l1ca_preambles_symbols[i]; corr_value += d_preambles_symbols[i];
} }
} }
} }
if (corr_value == GPS_CA_PREAMBLE_LENGTH_SYMBOLS) if (corr_value == d_preamble_length_symbols)
{ {
//std::cout << "Preamble detected at tracking!" << std::endl; //std::cout << "Preamble detected at tracking!" << std::endl;
next_state = true; next_state = true;
@ -1533,6 +1570,7 @@ int dll_pll_veml_tracking::general_work(int noutput_items __attribute__((unused)
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;

View File

@ -107,7 +107,8 @@ private:
std::string *d_secondary_code_string; std::string *d_secondary_code_string;
std::string signal_pretty_name; std::string signal_pretty_name;
int32_t *d_gps_l1ca_preambles_symbols; int32_t *d_preambles_symbols;
int32_t d_preamble_length_symbols;
boost::circular_buffer<float> d_symbol_history; boost::circular_buffer<float> d_symbol_history;
//tracking state machine //tracking state machine

View File

@ -56,6 +56,7 @@ const double BEIDOU_B1I_CHIP_PERIOD = 4.8875e-07; //!< beidou b1I c
const int BEIDOU_B1I_SECONDARY_CODE_LENGTH = 20; const int BEIDOU_B1I_SECONDARY_CODE_LENGTH = 20;
const std::string BEIDOU_B1I_SECONDARY_CODE = "00000100110101001110"; const std::string BEIDOU_B1I_SECONDARY_CODE = "00000100110101001110";
const std::string BEIDOU_B1I_SECONDARY_CODE_STR = "00000100110101001110"; const std::string BEIDOU_B1I_SECONDARY_CODE_STR = "00000100110101001110";
const std::string BEIDOU_B1I_D2_SECONDARY_CODE_STR = "00";
/*! /*!
* \brief Maximum Time-Of-Arrival (TOA) difference between satellites for a receiver operated on Earth surface is 20 ms * \brief Maximum Time-Of-Arrival (TOA) difference between satellites for a receiver operated on Earth surface is 20 ms