#include "TimingGeneratorGardner.hpp" namespace Radio { TimingGeneratorGardner::TimingGeneratorGardner() : Interpolation::TimingGenerator() , filter(nullptr) , coeff(nullptr) , is_time(true) { STRGardnerInit(&m_SymbolTimingRevovery); SlidingVarInit(&sl_var, 12000, 12000); } void TimingGeneratorGardner::reset() { LeadLagInit(filter, 0.00); } void TimingGeneratorGardner::loopFilterSetup(lead_lag_filter_t *pFilter, lead_lag_coeff_t *pCoeff) { filter = pFilter; coeff = pCoeff; } bool TimingGeneratorGardner::process(ComplexScalar const &iq) { // @2 x symbolrate // Symbol timing recovery radio_float_t vd = STRGardnerProcess(&m_SymbolTimingRevovery, toCpx(iq)); if (is_time) { // @1 x symbolrate m_omega = LeadLagProcess(filter, coeff, vd); SlidingVarProcess(&sl_var, getMu()); } is_time = not is_time; update(m_omega); return not is_time; } radio_float_t TimingGeneratorGardner::getMuVar() { return SlidingVarGet(&sl_var); } } // Radio