From 7f54410168d72b10da857b2bf3e7bb405564118a Mon Sep 17 00:00:00 2001 From: drowe67 Date: Thu, 3 May 2018 21:00:19 +0000 Subject: [PATCH] make SNR est more robust, no more 0.0 ests of noise variance git-svn-id: https://svn.code.sf.net/p/freetel/code@3568 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/src/ofdm.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/codec2-dev/src/ofdm.c b/codec2-dev/src/ofdm.c index 624ebe11..ec84ee91 100644 --- a/codec2-dev/src/ofdm.c +++ b/codec2-dev/src/ofdm.c @@ -991,12 +991,16 @@ void ofdm_demod(struct OFDM *ofdm, int *rx_bits, COMP *rxbuf_in) { } } - float noise_var = 0; + /* with large interfering carriers this alg can break down - in + that case set a benign value for noise_var that will produce a + sensible (probably low) SNR est */ + + float noise_var = 1.0; if (n > 1) { noise_var = (n*sum_xx - sum_x*sum_x)/(n*(n-1)); } - ofdm->sig_var = sig_var; ofdm->noise_var = 2*noise_var; + ofdm->sig_var = sig_var; } @@ -1156,6 +1160,7 @@ void ofdm_get_demod_stats(struct OFDM *ofdm, struct MODEM_STATS *stats) assert(stats->Nc <= MODEM_STATS_NC_MAX); float snr_est = 10*log10((ofdm->sig_var/ofdm->noise_var)*OFDM_NC*OFDM_RS/3000); + //fprintf(stderr, "sig: %f var: %f snr: %f\n", ofdm->sig_var, ofdm->noise_var, snr_est); stats->snr_est = 0.9*stats->snr_est + 0.1*snr_est; stats->sync = !strcmp(ofdm->sync_state, "synced") || !strcmp(ofdm->sync_state, "trial"); //fprintf(stderr, "sync: %d %s\n", stats->sync, ofdm->sync_state); -- 2.25.1