24#ifndef GNSS_SDR_TRACKING_DISCRIMINATORS_H
25#define GNSS_SDR_TRACKING_DISCRIMINATORS_H
27#include <gnuradio/gr_complex.h>
56double fll_diff_atan(gr_complex prompt_s1, gr_complex prompt_s2,
double t1,
double t2);
111template <
typename Fun>
112double 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;
119template <
typename Fun>
120double 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;
127template <
typename Fun>
128double GetYIntercept(Fun &&f,
double x)
130 double slope = CalculateSlope(f, x);
133 return y1 - slope * x;
136template <
typename Fun>
137double GetYInterceptAbs(Fun &&f,
double x)
139 double slope = CalculateSlopeAbs(f, x);
140 double y1 = std::abs(f(x));
141 return y1 - slope * x;
149template <
int M = 1,
int N = M>
150double 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);
170template <
int M = 1,
int N = M>
171double 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);
double pll_four_quadrant_atan(gr_complex prompt_s1)
PLL four quadrant arctan discriminator.
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 phase_unwrap(double phase_rad)
Phase unwrapping function, input is [rad].
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.