Files
radio/synchronization.h
T
2022-06-16 08:37:30 +00:00

94 lines
2.6 KiB
C
Executable File

// --------------------------------------------------------------
#ifndef _RADIO_SYNCHRONIZATION_H_
#define _RADIO_SYNCHRONIZATION_H_
#include "radio_types.h"
#include "nco.h"
#define LEAD_LAG_SCALING ((radio_float_t)1024*1024)
// --------------------------------------------------------------
// Types
// --------------------------------------------------------------
typedef struct _sample_clock_t
{
uint32_t reload;
int32_t count;
} sample_clock_t;
typedef struct _lead_lag_filter_t
{
radio_float_t lag_state;
} lead_lag_filter_t;
typedef struct _lead_lag_coeff_t
{
radio_float_t lead;
radio_float_t lag;
} lead_lag_coeff_t;
typedef struct _str_t
{
cpx_t d[2];
} str_t;
typedef struct _pfd_t
{
uint32_t state_up;
uint32_t state_down;
} pfd_t;
typedef struct _timing_corrector_t
{
radio_float_t mu;
radio_float_t mu_filtered;
radio_float_t wrap_alpha;
radio_float_t wrap_beta;
uint32_t skip[2];
uint32_t stuff[2];
} timing_corrector_t;
// --------------------------------------------------------------
// Functions
// --------------------------------------------------------------
#ifdef __cplusplus
extern "C" {
#endif
void ClockInit(sample_clock_t *pObj, uint32_t divide);
uint32_t ClockIsTick(sample_clock_t *pObj, uint32_t do_advance);
void ClockAdvance(sample_clock_t *pObj);
void ClockSetPhase(sample_clock_t *pObj, int32_t phase);
void STRGardnerInit(str_t *pObj);
radio_float_t STRGardnerProcess(str_t *pObj, cpx_t x);
radio_float_t PhaseErrQPSK(cpx_t x);
radio_float_t PhaseErr(cpx_t x, radio_float_t pstep, radio_float_t poffset);
void PfdInit(pfd_t *pObj);
radio_float_t PfdProcess(pfd_t *pObj, radio_float_t x, radio_float_t k);
void LeadLagInit(lead_lag_filter_t *pObj, radio_float_t state);
void LeadLagSetCoeff(lead_lag_coeff_t *pCoeff, radio_float_t lead, radio_float_t lag);
radio_float_t LeadLagProcess(lead_lag_filter_t *pObj, lead_lag_coeff_t *pCoeff, radio_float_t x);
radio_float_t LeadLagGetState(lead_lag_filter_t *pObj);
void LeadLagSetState(lead_lag_filter_t *pObj, radio_float_t state);
void TimingCorrectorInit(timing_corrector_t *pObj, radio_float_t wrap_alpha);
radio_float_t TimingCorrectorProcess(timing_corrector_t *pObj, radio_float_t dMu);
radio_float_t TimingCorrectorGetMu(timing_corrector_t *pObj);
uint32_t TimingCorrectorIsSkip(timing_corrector_t *pObj);
uint32_t TimingCorrectorIsStuff(timing_corrector_t *pObj);
#ifdef __cplusplus
}
#endif // __cplusplus
// --------------------------------------------------------------
#endif // _RADIO_SYNCHRONIZATION_H_