Improve runtime performance of M17 Demodulator

Tweaked the exponential moving average alpha factors to improve the
reactivity of the M17 demodulator.

TG-81
pull/68/head
Niccolò Izzo 2022-02-15 18:59:25 +01:00 zatwierdzone przez Silvano Seva
rodzic 5ef145cd39
commit 77aead675a
3 zmienionych plików z 11 dodań i 10 usunięć

Wyświetl plik

@ -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;

Wyświetl plik

@ -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<M17_FRAME_BYTES>(*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 &&

Wyświetl plik

@ -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;