From 26a25585354a7697d3048612408b59b275ae1ff3 Mon Sep 17 00:00:00 2001 From: Thomas Kolb Date: Sat, 8 Jun 2024 01:54:42 +0200 Subject: [PATCH] Add differential part to coarse frequency control --- impl/src/layer1/rx.c | 10 +++++++++- impl/src/layer1/rx.h | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/impl/src/layer1/rx.c b/impl/src/layer1/rx.c index f938bbd..8c9e81a 100644 --- a/impl/src/layer1/rx.c +++ b/impl/src/layer1/rx.c @@ -31,6 +31,9 @@ #define PLL_BW_HEADER 0.03f #define PLL_BW_DATA 0.01f +#define COARSE_FREQ_EST_P 0.05f +#define COARSE_FREQ_EST_D 0.01f + static void update_nco_pll(nco_crcf nco, float phase_error, float bw) { const float pll_alpha = bw; // phase adjustment factor @@ -136,7 +139,9 @@ static bool acquire_preamble(layer1_rx_t *rx, const float complex sample, bool d // this case. if(freq_est != 0.0f) { // apply the frequency adjustment - float freq_adjustment = freq_est / RRC_SPS / FREQ_EST_L; + float x = freq_est / RRC_SPS; + float freq_adjustment = COARSE_FREQ_EST_P * x + COARSE_FREQ_EST_D * (x - rx->freq_est_last); + rx->freq_est_last = x; nco_crcf_adjust_frequency(rx->carrier_coarse_nco, freq_adjustment); // limit the absolute frequency offset value @@ -543,6 +548,9 @@ result_t layer1_rx_init(layer1_rx_t *rx, rx_callback_t callback) // Correlator for preamble search correlator_init(&rx->preamble_correlator, preamble_get_symbols(), preamble_get_symbol_count()); + // initialize coarse frequency control + rx->freq_est_last = 0.0f; + // precalculate encoded header length in symbols unsigned int hdr_bps = modem_get_bps(rx->hdr_demod); rx->hdr_len_enc_bytes = fec_get_enc_msg_length(HEADER_CHANNEL_CODE, HEADER_SIZE_BYTES); diff --git a/impl/src/layer1/rx.h b/impl/src/layer1/rx.h index 44ea3d7..3856615 100644 --- a/impl/src/layer1/rx.h +++ b/impl/src/layer1/rx.h @@ -62,6 +62,9 @@ typedef struct layer1_rx_s // Callback function to notify user of certain events rx_callback_t callback; + // Frequency estimation PD control + float freq_est_last; + // Precalcuated header lengths unsigned int hdr_len_symbols; unsigned int hdr_len_enc_bytes;