diff --git a/src/bnetz/bnetz.c b/src/bnetz/bnetz.c index af3f82a..d9ccf3d 100644 --- a/src/bnetz/bnetz.c +++ b/src/bnetz/bnetz.c @@ -445,21 +445,23 @@ void bnetz_receive_tone(bnetz_t *bnetz, int bit) } /* A digit was received. */ -void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm, double level, double quality) +void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm, double level_avg, double level_dev, double quality_avg) { struct impulstelegramm *it; int digit = 0; /* drop any telegramm that is too bad */ - if (quality < 0.2) + if (level_dev / level_avg > 0.2) return; + PDEBUG_CHAN(DDSP, DEBUG_INFO, "RX Level: average=%.0f%% deviation=%.0f%% Quality: %.0f%%\n", level_avg * 100.0, level_dev / level_avg * 100.0, quality_avg * 100.0); + it = bnetz_telegramm2digit(telegramm); if (it) { digit = it->digit; - PDEBUG(DBNETZ, (bnetz->sender.loopback) ? DEBUG_NOTICE : DEBUG_INFO, "Received telegramm '%s' (RX Level: %.0f%% Quality=%.0f)\n", it->description, level * 100.0 + 0.5, quality * 100.0 + 0.5); + PDEBUG(DBNETZ, (bnetz->sender.loopback) ? DEBUG_NOTICE : DEBUG_INFO, "Received telegramm '%s'\n", it->description); } else { - PDEBUG(DBNETZ, DEBUG_DEBUG, "Received unknown telegramm digit '0x%04x' (RX Level: %.0f%% Quality=%.0f) (might be radio noise)\n", telegramm, level * 100.0 + 0.5, quality * 100.0 + 0.5); + PDEBUG(DBNETZ, DEBUG_DEBUG, "Received unknown telegramm digit '0x%04x' (might be radio noise)\n", telegramm); return; } diff --git a/src/bnetz/bnetz.h b/src/bnetz/bnetz.h index 39d979c..8f6cd64 100644 --- a/src/bnetz/bnetz.h +++ b/src/bnetz/bnetz.h @@ -103,6 +103,6 @@ int bnetz_create(int kanal, const char *audiodev, int use_sdr, int samplerate, d void bnetz_destroy(sender_t *sender); void bnetz_loss_indication(bnetz_t *bnetz); void bnetz_receive_tone(bnetz_t *bnetz, int bit); -void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm, double level, double quality); +void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm, double level_avg, double level_dev, double quality_avg); const char *bnetz_get_telegramm(bnetz_t *bnetz); diff --git a/src/bnetz/dsp.c b/src/bnetz/dsp.c index 59b618c..00a37ec 100644 --- a/src/bnetz/dsp.c +++ b/src/bnetz/dsp.c @@ -161,6 +161,7 @@ static void fsk_receive_tone(bnetz_t *bnetz, int bit, int goodtone, double level /* Collect 16 data bits (digit) and check for sync mark '01110'. */ static void fsk_receive_bit(void *inst, int bit, double quality, double level) { + double level_avg, level_dev, quality_avg; bnetz_t *bnetz = (bnetz_t *)inst; int i; @@ -187,15 +188,24 @@ static void fsk_receive_bit(void *inst, int bit, double quality, double level) return; /* average level and quality */ - level = quality = 0; + level_avg = level_dev = quality_avg = 0; for (i = 0; i < 16; i++) { - level += bnetz->rx_telegramm_level[i]; - quality += bnetz->rx_telegramm_quality[i]; + level_avg += bnetz->rx_telegramm_level[bnetz->rx_telegramm_qualidx]; + quality_avg += bnetz->rx_telegramm_quality[bnetz->rx_telegramm_qualidx]; + if (++bnetz->rx_telegramm_qualidx == 16) + bnetz->rx_telegramm_qualidx = 0; } - level /= 16.0; quality /= 16.0; + level_avg /= 16.0; quality_avg /= 16.0; + for (i = 0; i < 16; i++) { + level = bnetz->rx_telegramm_level[bnetz->rx_telegramm_qualidx]; + level_dev += (level - level_avg) * (level - level_avg); + if (++bnetz->rx_telegramm_qualidx == 16) + bnetz->rx_telegramm_qualidx = 0; + } + level_dev = sqrt(level_dev / 16.0); /* send telegramm */ - bnetz_receive_telegramm(bnetz, bnetz->rx_telegramm, level, quality); + bnetz_receive_telegramm(bnetz, bnetz->rx_telegramm, level_avg, level_dev, quality_avg); } /* Process received audio stream from radio unit. */