24 #ifndef GNSS_SDR_TRACKING_DISCRIMINATORS_H 25 #define GNSS_SDR_TRACKING_DISCRIMINATORS_H 27 #include <gnuradio/gr_complex.h> 56 double fll_diff_atan(gr_complex prompt_s1, gr_complex prompt_s2,
double t1,
double t2);
95 double dll_nc_e_minus_l_normalized(gr_complex early_s1, gr_complex late_s1,
float spc = 0.5,
float slope = 1.0,
float y_intercept = 1.0);
108 double dll_nc_vemlp_normalized(gr_complex very_early_s1, gr_complex early_s1, gr_complex late_s1, gr_complex very_late_s1);
111 template <
typename Fun>
112 double CalculateSlope(Fun &&f,
double x)
114 static constexpr
double dx = 1e-6;
116 return (f(x + dx / 2.0) - f(x - dx / 2.0)) / dx;
119 template <
typename Fun>
120 double CalculateSlopeAbs(Fun &&f,
double x)
122 static constexpr
double dx = 1e-6;
124 return (std::abs(f(x + dx / 2.0)) - std::abs(f(x - dx / 2.0))) / dx;
127 template <
typename Fun>
128 double GetYIntercept(Fun &&f,
double x)
130 double slope = CalculateSlope(f, x);
133 return y1 - slope * x;
136 template <
typename Fun>
137 double GetYInterceptAbs(Fun &&f,
double x)
139 double slope = CalculateSlopeAbs(f, x);
140 double y1 = std::abs(f(x));
141 return y1 - slope * x;
149 template <
int M = 1,
int N = M>
150 double SinBocCorrelationFunction(
double offset_in_chips)
152 static constexpr
int TWO_P = 2 * M / N;
154 double abs_tau = std::abs(offset_in_chips);
161 int k =
static_cast<int>(std::ceil(TWO_P * abs_tau));
163 double sgn = ((k & 0x01) == 0 ? 1.0 : -1.0);
165 return sgn * (2.0 * (k * k - k * TWO_P - k) / TWO_P + 1.0 +
166 (2 * TWO_P - 2 * k + 1) * abs_tau);
170 template <
int M = 1,
int N = M>
171 double CosBocCorrelationFunction(
double offset_in_chips)
173 static constexpr
int TWO_P = 2 * M / N;
175 double abs_tau = std::abs(offset_in_chips);
182 int k =
static_cast<int>(std::floor(2.0 * TWO_P * abs_tau));
186 double sgn = ((k >> 1) & 0x01 ? -1.0 : 1.0);
188 return sgn * ((2 * k * TWO_P + 2 * TWO_P - k * k) / (2.0 * TWO_P) + (-2 * TWO_P + k - 1) * abs_tau);
192 double sgn = (((k + 1) >> 1) & 0x01 ? -1.0 : 1.0);
194 return sgn * ((k * k + 2 * k - 2 * k * TWO_P + 1) / (2.0 * TWO_P) + (2 * TWO_P - k - 2) * abs_tau);
201 #endif // GNSS_SDR_TRACKING_DISCRIMINATORS_H double fll_four_quadrant_atan(gr_complex prompt_s1, gr_complex prompt_s2, double t1, double t2)
double dll_nc_vemlp_normalized(gr_complex very_early_s1, gr_complex early_s1, gr_complex late_s1, gr_complex very_late_s1)
DLL Noncoherent Very Early Minus Late Power (VEMLP) normalized discriminator.
double pll_cloop_two_quadrant_atan(gr_complex prompt_s1)
PLL Costas loop two quadrant arctan discriminator.
double phase_unwrap(double phase_rad)
Phase unwrapping function, input is [rad].
double dll_nc_e_minus_l_normalized(gr_complex early_s1, gr_complex late_s1, float spc=0.5, float slope=1.0, float y_intercept=1.0)
DLL Noncoherent Early minus Late envelope normalized discriminator.
double pll_four_quadrant_atan(gr_complex prompt_s1)
PLL four quadrant arctan discriminator.