B-Netz: Use standard deviation to determine if an FSK frame is valid or not
This commit is contained in:
@@ -445,21 +445,23 @@ void bnetz_receive_tone(bnetz_t *bnetz, int bit)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* A digit was received. */
|
/* 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;
|
struct impulstelegramm *it;
|
||||||
int digit = 0;
|
int digit = 0;
|
||||||
|
|
||||||
/* drop any telegramm that is too bad */
|
/* drop any telegramm that is too bad */
|
||||||
if (quality < 0.2)
|
if (level_dev / level_avg > 0.2)
|
||||||
return;
|
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);
|
it = bnetz_telegramm2digit(telegramm);
|
||||||
if (it) {
|
if (it) {
|
||||||
digit = it->digit;
|
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 {
|
} 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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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_destroy(sender_t *sender);
|
||||||
void bnetz_loss_indication(bnetz_t *bnetz);
|
void bnetz_loss_indication(bnetz_t *bnetz);
|
||||||
void bnetz_receive_tone(bnetz_t *bnetz, int bit);
|
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);
|
const char *bnetz_get_telegramm(bnetz_t *bnetz);
|
||||||
|
|
||||||
|
@@ -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'. */
|
/* Collect 16 data bits (digit) and check for sync mark '01110'. */
|
||||||
static void fsk_receive_bit(void *inst, int bit, double quality, double level)
|
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;
|
bnetz_t *bnetz = (bnetz_t *)inst;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -187,15 +188,24 @@ static void fsk_receive_bit(void *inst, int bit, double quality, double level)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
/* average level and quality */
|
/* average level and quality */
|
||||||
level = quality = 0;
|
level_avg = level_dev = quality_avg = 0;
|
||||||
for (i = 0; i < 16; i++) {
|
for (i = 0; i < 16; i++) {
|
||||||
level += bnetz->rx_telegramm_level[i];
|
level_avg += bnetz->rx_telegramm_level[bnetz->rx_telegramm_qualidx];
|
||||||
quality += bnetz->rx_telegramm_quality[i];
|
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 */
|
/* 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. */
|
/* Process received audio stream from radio unit. */
|
||||||
|
Reference in New Issue
Block a user