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:
parent
e1fc5b49df
commit
19324814e2
@ -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]
|
||||
|
@ -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]
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user