1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2025-04-12 22:03:20 +00:00

Avoid potential division by zero

This commit is contained in:
Carles Fernandez 2025-01-27 16:40:26 +01:00
parent e1fc5b49df
commit 19324814e2
No known key found for this signature in database
GPG Key ID: 4C583C52B0C3877D
4 changed files with 62 additions and 9 deletions

View File

@ -1256,7 +1256,10 @@ void dll_pll_veml_tracking::update_tracking_vars()
}
tmp_cp1 /= static_cast<double>(d_trk_parameters.smoother_length);
tmp_cp2 /= static_cast<double>(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]

View File

@ -879,7 +879,10 @@ void dll_pll_veml_tracking_fpga::update_tracking_vars()
}
tmp_cp1 /= static_cast<double>(d_trk_parameters.smoother_length);
tmp_cp2 /= static_cast<double>(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]

View File

@ -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<double>(d_trk_parameters.smoother_length);
tmp_cp2 /= static_cast<double>(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;
}
}

View File

@ -34,6 +34,7 @@
#include "lock_detectors.h"
#include <cmath>
#include <limits>
/*
* 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<float>::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<float>(length);
Psig = Psig * Psig;
Ptot /= static_cast<float>(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<float>(length);
const float epsilon = std::numeric_limits<float>::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<float>::epsilon())
{
return 0.0;
}
return NBD / NBP;
}