From ef61c532a3004247ab10f507cf62dd4ef4e1a777 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niccol=C3=B2=20Izzo?= Date: Fri, 13 May 2022 12:59:53 +0200 Subject: [PATCH] Cleaned up quantization average Now average is computed over all the syncword symbols, for each syncword as a simple average. TG-81 --- .../include/protocols/M17/M17Demodulator.h | 2 +- openrtx/src/protocols/M17/M17Demodulator.cpp | 54 ++++++------------- 2 files changed, 17 insertions(+), 39 deletions(-) diff --git a/openrtx/include/protocols/M17/M17Demodulator.h b/openrtx/include/protocols/M17/M17Demodulator.h index 17beddbb..335a666c 100644 --- a/openrtx/include/protocols/M17/M17Demodulator.h +++ b/openrtx/include/protocols/M17/M17Demodulator.h @@ -220,7 +220,7 @@ private: * @param offset: index value to be added to the exponential moving * average/variance computation */ - void updateQuantizationStats(int32_t offset); + void updateQuantizationStats(int32_t frame_index, int32_t symbol_index); /** * Computes the convolution between a stride of samples starting from diff --git a/openrtx/src/protocols/M17/M17Demodulator.cpp b/openrtx/src/protocols/M17/M17Demodulator.cpp index 9a25f39c..d9b4043c 100644 --- a/openrtx/src/protocols/M17/M17Demodulator.cpp +++ b/openrtx/src/protocols/M17/M17Demodulator.cpp @@ -130,49 +130,27 @@ void M17Demodulator::resetQuantizationStats() qnt_neg_avg = 0.0f; } -void M17Demodulator::updateQuantizationStats(int32_t offset) +void M17Demodulator::updateQuantizationStats(int32_t frame_index, + int32_t symbol_index) { - // If offset is negative use bridge buffer - int16_t sample = 0; - if (offset < 0) // When we are at negative offsets use bridge buffer - sample = basebandBridge[M17_BRIDGE_SIZE + offset]; - else // Otherwise use regular data buffer - sample = baseband.data[offset]; + int16_t sample = baseband.data[symbol_index]; if (sample > 0) - { qnt_pos_fifo.push_front(sample); - // FIFO not full, compute traditional average - if (qnt_pos_fifo.size() <= QNT_SMA_WINDOW) - { + else + qnt_neg_fifo.push_front(sample); + // If we reached end of the syncword, compute average and reset queue + if(frame_index == M17_SYNCWORD_SYMBOLS - 1) + { int32_t acc = 0; for(auto e : qnt_pos_fifo) acc += e; qnt_pos_avg = acc / static_cast(qnt_pos_fifo.size()); - } - else - { - qnt_pos_avg += 1 / static_cast(QNT_SMA_WINDOW) * - (sample - qnt_pos_fifo.back()); - qnt_pos_fifo.pop_back(); - } - } - else - { - qnt_neg_fifo.push_front(sample); - // FIFO not full, compute traditional average - if (qnt_neg_fifo.size() <= QNT_SMA_WINDOW) - { - int32_t acc = 0; + acc = 0; for(auto e : qnt_neg_fifo) acc += e; qnt_neg_avg = acc / static_cast(qnt_neg_fifo.size()); - } - else - { - qnt_neg_avg += 1 / static_cast(QNT_SMA_WINDOW) * - (sample - qnt_neg_fifo.back()); - qnt_neg_fifo.pop_back(); - } + qnt_pos_fifo.clear(); + qnt_neg_fifo.clear(); } } @@ -243,9 +221,9 @@ int8_t M17Demodulator::quantize(int32_t offset) sample = basebandBridge[M17_BRIDGE_SIZE + offset]; else // Otherwise use regular data buffer sample = baseband.data[offset]; - if (sample > static_cast< int16_t >(qnt_pos_avg / 2.1)) + if (sample > static_cast< int16_t >(qnt_pos_avg / 2.0)) return +3; - else if (sample < static_cast< int16_t >(qnt_neg_avg / 2.1)) + else if (sample < static_cast< int16_t >(qnt_neg_avg / 2.0)) return -3; else if (sample > 0) return +1; @@ -337,7 +315,7 @@ bool M17Demodulator::update() + (M17_SAMPLES_PER_SYMBOL * decoded_syms); // Update quantization stats only on syncwords if (frame_index < M17_SYNCWORD_SYMBOLS) - updateQuantizationStats(symbol_index); + updateQuantizationStats(frame_index, symbol_index); int8_t symbol = quantize(symbol_index); // Log quantization @@ -349,8 +327,8 @@ bool M17Demodulator::update() demod_log log = { baseband.data[symbol_index + i], 0,0.0,symbol_index + i, - qnt_pos_avg / 2.1f, - qnt_neg_avg / 2.1f, + qnt_pos_avg / 2.0f, + qnt_neg_avg / 2.0f, symbol, frame_index}; appendLog(&log);