From 19324814e2c71764637afeaa327cfaaaa75a9dbc Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Mon, 27 Jan 2025 16:40:26 +0100 Subject: [PATCH] Avoid potential division by zero --- .../gnuradio_blocks/dll_pll_veml_tracking.cc | 5 ++- .../dll_pll_veml_tracking_fpga.cc | 5 ++- .../tracking/gnuradio_blocks/kf_tracking.cc | 16 +++++-- .../tracking/libs/lock_detectors.cc | 45 +++++++++++++++++-- 4 files changed, 62 insertions(+), 9 deletions(-) diff --git a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc index 803d1e7c6..1f87fcc8d 100644 --- a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc +++ b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc @@ -1256,7 +1256,10 @@ void dll_pll_veml_tracking::update_tracking_vars() } tmp_cp1 /= static_cast(d_trk_parameters.smoother_length); tmp_cp2 /= static_cast(d_trk_parameters.smoother_length); - d_code_phase_rate_step_chips = (tmp_cp2 - tmp_cp1) / tmp_samples; + if (tmp_samples >= 1.0) + { + d_code_phase_rate_step_chips = (tmp_cp2 - tmp_cp1) / tmp_samples; + } } } // remnant code phase [chips] diff --git a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.cc b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.cc index 96b28be18..275892172 100644 --- a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.cc +++ b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.cc @@ -879,7 +879,10 @@ void dll_pll_veml_tracking_fpga::update_tracking_vars() } tmp_cp1 /= static_cast(d_trk_parameters.smoother_length); tmp_cp2 /= static_cast(d_trk_parameters.smoother_length); - d_code_phase_rate_step_chips = (tmp_cp2 - tmp_cp1) / tmp_samples; + if (tmp_samples >= 1.0) + { + d_code_phase_rate_step_chips = (tmp_cp2 - tmp_cp1) / tmp_samples; + } } } // remnant code phase [chips] diff --git a/src/algorithms/tracking/gnuradio_blocks/kf_tracking.cc b/src/algorithms/tracking/gnuradio_blocks/kf_tracking.cc index 838dbab85..27a264096 100644 --- a/src/algorithms/tracking/gnuradio_blocks/kf_tracking.cc +++ b/src/algorithms/tracking/gnuradio_blocks/kf_tracking.cc @@ -453,9 +453,14 @@ kf_tracking::kf_tracking(const Kf_Conf &conf_) d_code_samples_per_chip = 0U; d_symbols_per_bit = 0; } - - d_beta = d_code_chip_rate / d_signal_carrier_freq; - + if (d_signal_carrier_freq > 1.0) + { + d_beta = d_code_chip_rate / d_signal_carrier_freq; + } + else + { + d_beta = 0.0; + } // Initialization of local code replica // Get space for a vector with the sinboc(1,1) replica sampled 2x/chip d_tracking_code.resize(2 * d_code_length_chips, 0.0); @@ -1280,7 +1285,10 @@ void kf_tracking::update_tracking_vars() } tmp_cp1 /= static_cast(d_trk_parameters.smoother_length); tmp_cp2 /= static_cast(d_trk_parameters.smoother_length); - d_carrier_phase_rate_step_rad = (tmp_cp2 - tmp_cp1) / tmp_samples; + if (tmp_samples >= 1.0) + { + d_carrier_phase_rate_step_rad = (tmp_cp2 - tmp_cp1) / tmp_samples; + } d_x_old_old(3) = d_carrier_phase_rate_step_rad * d_trk_parameters.fs_in / TWO_PI; } } diff --git a/src/algorithms/tracking/libs/lock_detectors.cc b/src/algorithms/tracking/libs/lock_detectors.cc index 7fa08690b..1fc080abe 100644 --- a/src/algorithms/tracking/libs/lock_detectors.cc +++ b/src/algorithms/tracking/libs/lock_detectors.cc @@ -34,6 +34,7 @@ #include "lock_detectors.h" #include +#include /* * Signal-to-Noise (SNR) (\f$\rho\f$) estimator using the Signal-to-Noise Variance (SNV) estimator: @@ -57,6 +58,11 @@ float cn0_svn_estimator(const gr_complex* Prompt_buffer, int length, float coh_i float SNR_dB_Hz = 0.0; float Psig = 0.0; float Ptot = 0.0; + const float epsilon = std::numeric_limits::epsilon(); + if (length == 0 || coh_integration_time_s <= epsilon) + { + return -100.0; + } for (int i = 0; i < length; i++) { Psig += std::abs(Prompt_buffer[i].real()); @@ -65,7 +71,15 @@ float cn0_svn_estimator(const gr_complex* Prompt_buffer, int length, float coh_i Psig /= static_cast(length); Psig = Psig * Psig; Ptot /= static_cast(length); - SNR = Psig / (Ptot - Psig); + float aux = Ptot - Psig; + if (aux > epsilon) + { + SNR = Psig / aux; + } + else + { + return -100.0; + } SNR_dB_Hz = 10.0F * std::log10(SNR) - 10.0F * std::log10(coh_integration_time_s); return SNR_dB_Hz; } @@ -96,6 +110,11 @@ float cn0_m2m4_estimator(const gr_complex* Prompt_buffer, int length, float coh_ float m_4 = 0.0; float aux; const auto n = static_cast(length); + const float epsilon = std::numeric_limits::epsilon(); + if (length == 0 || coh_integration_time_s <= epsilon) + { + return -100.0; + } for (int i = 0; i < length; i++) { Psig += std::abs(Prompt_buffer[i].real()); @@ -108,13 +127,29 @@ float cn0_m2m4_estimator(const gr_complex* Prompt_buffer, int length, float coh_ m_2 /= n; m_4 /= n; aux = std::sqrt(2.0F * m_2 * m_2 - m_4); + float denominator; if (std::isnan(aux)) { - SNR_aux = Psig / (m_2 - Psig); + denominator = m_2 - Psig; + if (std::abs(denominator) <= epsilon) + { + return -100.0; + } + SNR_aux = Psig / denominator; } else { - SNR_aux = aux / (m_2 - aux); + denominator = m_2 - aux; + if (std::abs(denominator) <= epsilon) + { + return -100.0; + } + SNR_aux = aux / denominator; + } + + if (SNR_aux <= epsilon) + { + return -100.0; } SNR_dB_Hz = 10.0F * std::log10(SNR_aux) - 10.0F * std::log10(coh_integration_time_s); @@ -144,5 +179,9 @@ float carrier_lock_detector(const gr_complex* Prompt_buffer, int length) } NBP = tmp_sum_I * tmp_sum_I + tmp_sum_Q * tmp_sum_Q; NBD = tmp_sum_I * tmp_sum_I - tmp_sum_Q * tmp_sum_Q; + if (NBP < std::numeric_limits::epsilon()) + { + return 0.0; + } return NBD / NBP; }