From 77aead675ac45112c66de49d77f0110589bf362c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niccol=C3=B2=20Izzo?= Date: Tue, 15 Feb 2022 18:59:25 +0100 Subject: [PATCH] Improve runtime performance of M17 Demodulator Tweaked the exponential moving average alpha factors to improve the reactivity of the M17 demodulator. TG-81 --- openrtx/include/protocols/M17/M17Demodulator.h | 2 +- openrtx/src/protocols/M17/M17Demodulator.cpp | 15 ++++++++------- tests/unit/M17_demodulator.cpp | 4 ++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/openrtx/include/protocols/M17/M17Demodulator.h b/openrtx/include/protocols/M17/M17Demodulator.h index 9ea5cce4..df232074 100644 --- a/openrtx/include/protocols/M17/M17Demodulator.h +++ b/openrtx/include/protocols/M17/M17Demodulator.h @@ -113,7 +113,7 @@ private: static constexpr size_t M17_INPUT_BUF_SIZE = 2 * M17_FRAME_SAMPLES_24K; static constexpr size_t M17_FRAME_BYTES = M17_FRAME_SYMBOLS / 4; static constexpr float conv_stats_alpha = 0.001f; - static constexpr float qnt_stats_alpha = 0.99995f; + static constexpr float qnt_stats_alpha = 0.9f; static constexpr float conv_threshold_factor = 3.40; static constexpr size_t M17_BRIDGE_SIZE = M17_SAMPLES_PER_SYMBOL * M17_SYNCWORD_SYMBOLS; diff --git a/openrtx/src/protocols/M17/M17Demodulator.cpp b/openrtx/src/protocols/M17/M17Demodulator.cpp index 4cf4ebe1..58fa3a7f 100644 --- a/openrtx/src/protocols/M17/M17Demodulator.cpp +++ b/openrtx/src/protocols/M17/M17Demodulator.cpp @@ -315,6 +315,7 @@ void M17Demodulator::update() locked = true; isLSF = syncword.lsf; offset = syncword.index + 1; + frameIndex = 0; } } // While we are locked, demodulate available samples @@ -330,7 +331,7 @@ void M17Demodulator::update() getQuantizationMax() / 2, getQuantizationMin() / 2, symbol * 666, - symbol_index); + frameIndex == 0 ? 2300 : symbol_index); #endif setSymbol(*activeFrame, frameIndex, symbol); decoded_syms++; @@ -341,12 +342,12 @@ void M17Demodulator::update() std::swap(activeFrame, idleFrame); frameIndex = 0; // DEBUG: print idleFrame bytes - //for(size_t i = 0; i < idleFrame->size(); i+=2) - //{ - // if (i % 16 == 14) - // printf("\r\n"); - // printf(" %02X%02X", (*idleFrame)[i], (*idleFrame)[i+1]); - //} + for(size_t i = 0; i < idleFrame->size(); i+=2) + { + if (i % 16 == 14) + printf("\r\n"); + printf(" %02X%02X", (*idleFrame)[i], (*idleFrame)[i+1]); + } } // If syncword is not valid, lock is lost, accept 2 bit errors if (frameIndex == M17_SYNCWORD_SYMBOLS && diff --git a/tests/unit/M17_demodulator.cpp b/tests/unit/M17_demodulator.cpp index 8b45ab89..391e3853 100644 --- a/tests/unit/M17_demodulator.cpp +++ b/tests/unit/M17_demodulator.cpp @@ -149,13 +149,13 @@ int main() syncword = m17Demodulator.nextFrameSync(offset); for(unsigned i = 0; i < baseband_samples - m17Demodulator.M17_SYNCWORD_SYMBOLS * m17Demodulator.M17_SAMPLES_PER_SYMBOL; i++) { - if ((int) i == syncword.index + 2) { + if ((int) i == (syncword.index + 1)) { if (syncword.lsf) detect = -4000; else detect = 4000; syncword = m17Demodulator.nextFrameSync(syncword.index + m17Demodulator.M17_SYNCWORD_SYMBOLS * m17Demodulator.M17_SAMPLES_PER_SYMBOL); - } else if (((int) i % 10) == ((syncword.index + 2) % 10)) { + } else if (((int) i % 10) == ((syncword.index + 1) % 10)) { m17Demodulator.updateQuantizationStats(i); symbol = m17Demodulator.quantize(i) * 1000; detect = 3000;