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

Improved find_closest algorithm in observables

This commit is contained in:
Antonio Ramos 2018-02-21 12:56:44 +01:00
parent 5da7a83eeb
commit 98cde65832
2 changed files with 25 additions and 21 deletions

View File

@ -352,22 +352,39 @@ void hybrid_observables_cc::clean_history(std::deque<Gnss_Synchro>& data)
} }
} }
unsigned int hybrid_observables_cc::find_closest(std::deque<Gnss_Synchro>& data) std::pair<Gnss_Synchro, Gnss_Synchro> hybrid_observables_cc::find_closest(std::deque<Gnss_Synchro>& data)
{ {
unsigned int result = 0; std::pair<Gnss_Synchro, Gnss_Synchro> result;
unsigned int index = 0;
double delta_t = std::numeric_limits<double>::max(); double delta_t = std::numeric_limits<double>::max();
std::deque<Gnss_Synchro>::iterator it; std::deque<Gnss_Synchro>::iterator it;
unsigned int aux = 0; unsigned int aux = 0;
for(it = data.begin(); it != data.end(); it++) for(it = data.begin(); it != data.end(); it++)
{ {
double instant_delta = T_rx_s - it->RX_time; double instant_delta = std::fabs(T_rx_s - it->RX_time);
if((instant_delta > 0) and (instant_delta < delta_t)) if(instant_delta < delta_t)
{ {
delta_t = instant_delta; delta_t = instant_delta;
result = aux; index = aux;
} }
aux++; aux++;
} }
delta_t = T_rx_s - data.at(index).RX_time;
if((index == (data.size() - 1)) or (delta_t < 0.0))
{
result.first = data.at(index);
result.second = data.at(index - 1);
}
else if(index == 0)
{
result.first = data.at(1);
result.second = data.at(0);
}
else
{
result.first = data.at(index + 1);
result.second = data.at(index);
}
return result; return result;
} }
@ -495,21 +512,8 @@ int hybrid_observables_cc::general_work(int noutput_items __attribute__((unused)
{ {
if(valid_channels[i]) if(valid_channels[i])
{ {
unsigned int index_closest = find_closest(*it); std::pair<Gnss_Synchro, Gnss_Synchro> gnss_pair = find_closest(*it);
unsigned int index1; Gnss_Synchro interpolated_gnss_synchro = gnss_pair.second;
unsigned int index2;
if(index_closest > 0)
{
index1 = index_closest - 1;
index2 = index_closest;
}
else
{
index1 = 0;
index2 = 1;
}
Gnss_Synchro interpolated_gnss_synchro = it->at(index1);
std::pair<Gnss_Synchro, Gnss_Synchro> gnss_pair(it->at(index2), it->at(index1));
interpolated_gnss_synchro.Carrier_Doppler_hz = interpolate_data(gnss_pair, T_rx_s, 0); interpolated_gnss_synchro.Carrier_Doppler_hz = interpolate_data(gnss_pair, T_rx_s, 0);
interpolated_gnss_synchro.Carrier_phase_rads = interpolate_data(gnss_pair, T_rx_s, 1); interpolated_gnss_synchro.Carrier_phase_rads = interpolate_data(gnss_pair, T_rx_s, 1);

View File

@ -69,7 +69,7 @@ private:
double compute_T_rx_s(const Gnss_Synchro& a); double compute_T_rx_s(const Gnss_Synchro& a);
double interpolate_data(const std::pair<Gnss_Synchro, Gnss_Synchro>& a, const double& ti, int parameter); double interpolate_data(const std::pair<Gnss_Synchro, Gnss_Synchro>& a, const double& ti, int parameter);
double find_min_RX_time(); double find_min_RX_time();
unsigned int find_closest(std::deque<Gnss_Synchro>& data); std::pair<Gnss_Synchro, Gnss_Synchro> find_closest(std::deque<Gnss_Synchro>& data);
void correct_TOW_and_compute_prange(std::vector<Gnss_Synchro>& data); void correct_TOW_and_compute_prange(std::vector<Gnss_Synchro>& data);
//Tracking observable history //Tracking observable history