From 357a90805c8ace3a760b919c72a4c3f63cec858f Mon Sep 17 00:00:00 2001 From: Ahmet Inan Date: Tue, 20 Jul 2021 21:47:49 +0200 Subject: [PATCH] use a simpler estimation for finer CFO --- decode.cc | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/decode.cc b/decode.cc index eac1533..04e51d4 100644 --- a/decode.cc +++ b/decode.cc @@ -195,7 +195,6 @@ struct Decoder uint16_t erasures[24]; cmplx head[symbol_len], tail[symbol_len], cons[cons_max]; cmplx fdom[symbol_len], tdom[buffer_len], resam[buffer_len]; - value phase[symbol_len/2]; value cfo_rad, sfo_rad; int symbol_pos; int oper_mode; @@ -236,23 +235,10 @@ struct Decoder } value frac_cfo(const cmplx *samples) { - value avg = 0; + cmplx sum; for (int i = 0; i < symbol_len/2; ++i) - avg += phase[i] = arg(samples[i] * conj(samples[i+symbol_len/2])); - avg /= value(symbol_len/2); - value var = 0; - for (int i = 0; i < symbol_len/2; ++i) - var += (phase[i] - avg) * (phase[i] - avg); - value std_dev = std::sqrt(var/(symbol_len/2-1)); - int count = 0; - value sum = 0; - for (int i = 0; i < symbol_len/2; ++i) { - if (std::abs(phase[i] - avg) <= std_dev) { - sum += phase[i]; - ++count; - } - } - return sum / (count * symbol_len/2); + sum += samples[i] * conj(samples[i+symbol_len/2]); + return arg(sum) / (symbol_len/2); } void deinterleave() {