From 7a5aea88df35df2060061cca770e5cd97cfc0014 Mon Sep 17 00:00:00 2001 From: Kamal Mostafa Date: Fri, 8 Jul 2011 13:03:00 -0700 Subject: [PATCH] minimodem: rate analysis fixes ("rate perfect") adjust MIN_CONFIDENCE --- src/minimodem.c | 44 +++++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/src/minimodem.c b/src/minimodem.c index 9d8cdf1..926337a 100644 --- a/src/minimodem.c +++ b/src/minimodem.c @@ -138,21 +138,33 @@ static void report_no_carrier( fsk_plan *fskp, unsigned int sample_rate, float bfsk_data_rate, + float nsamples_per_bit, unsigned int nframes_decoded, size_t carrier_nsamples, float confidence_total ) { unsigned long long nbits_total = nframes_decoded * (fskp->n_data_bits+2); +#if 0 + fprintf(stderr, "nframes_decoded=%u\n", nframes_decoded); + fprintf(stderr, "nbits_total=%llu\n", nbits_total); + fprintf(stderr, "carrier_nsamples=%lu\n", carrier_nsamples); + fprintf(stderr, "nsamples_per_bit=%f\n", nsamples_per_bit); +#endif float throughput_rate = nbits_total * sample_rate / (float)carrier_nsamples; - float throughput_skew = (throughput_rate - bfsk_data_rate) - / bfsk_data_rate; - fprintf(stderr, "### NOCARRIER ndata=%u confidence=%.2f throughput=%.2f (%.1f%% %s) ###\n", + fprintf(stderr, "### NOCARRIER ndata=%u confidence=%.2f throughput=%.2f", nframes_decoded, confidence_total / nframes_decoded, - throughput_rate, - fabs(throughput_skew) * 100.0, - signbit(throughput_skew) ? "slow" : "fast" - ); + throughput_rate); + if ( (size_t)(nbits_total * nsamples_per_bit + 0.5) == carrier_nsamples ) { + fprintf(stderr, " (rate perfect) ###\n"); + } else { + float throughput_skew = (throughput_rate - bfsk_data_rate) + / bfsk_data_rate; + fprintf(stderr, " (%.1f%% %s) ###\n", + fabs(throughput_skew) * 100.0, + signbit(throughput_skew) ? "slow" : "fast" + ); + } } void @@ -577,7 +589,9 @@ main( int argc, char*argv[] ) break; unsigned int try_max_nsamples = nsamples_per_bit; -#define FSK_ANALYZE_NSTEPS 8 /* accuracy vs. performance */ +#define FSK_ANALYZE_NSTEPS 10 /* accuracy vs. performance */ + // Note: FSK_ANALYZE_NSTEPS has subtle effects on the + // "rate perfect" calculation. oh well. unsigned int try_step_nsamples = nsamples_per_bit / FSK_ANALYZE_NSTEPS; if ( try_step_nsamples == 0 ) try_step_nsamples = 1; @@ -601,9 +615,11 @@ main( int argc, char*argv[] ) else bits = ( bits >> 2 ) & 0xFF; -#define FSK_MIN_CONFIDENCE 0.50 +#define FSK_MIN_CONFIDENCE 0.60 #define FSK_MAX_NOCONFIDENCE_BITS 20 +#define FSK_SCAN_LAG 0.2 + if ( confidence <= FSK_MIN_CONFIDENCE ) { // FIXME: explain if ( ++noconfidence > FSK_MAX_NOCONFIDENCE_BITS ) @@ -613,7 +629,10 @@ main( int argc, char*argv[] ) #endif if ( carrier ) { carrier_nsamples -= noconfidence_nsamples; + if ( nframes_decoded > 0 ) + carrier_nsamples += nsamples_per_bit * FSK_SCAN_LAG; report_no_carrier(fskp, sample_rate, bfsk_data_rate, + nsamples_per_bit, nframes_decoded, carrier_nsamples, confidence_total); carrier = 0; carrier_nsamples = 0; @@ -640,6 +659,8 @@ main( int argc, char*argv[] ) bfsk_data_rate, fskp->b_mark * fskp->band_width); carrier = 1; + /* back up carrier_nsamples to account for the imminent advance */ + noconfidence_nsamples = frame_start_sample; bfsk_framebits_decode(0, 0, 0); /* reset the frame processor */ } @@ -647,7 +668,6 @@ main( int argc, char*argv[] ) confidence_total += confidence; nframes_decoded++; noconfidence = 0; - noconfidence_nsamples = 0; /* Advance the sample stream forward past the decoded frame * but not past the stop bit, since we want it to appear as @@ -658,7 +678,6 @@ main( int argc, char*argv[] ) * but actually advance just a bit less than that to allow * for clock skew, hence FSK_SCAN_LAG. */ -#define FSK_SCAN_LAG 0.2 advance = frame_start_sample + nsamples_per_bit * (float)(fskp->n_data_bits + 2 - FSK_SCAN_LAG); @@ -697,7 +716,10 @@ main( int argc, char*argv[] ) if ( carrier ) { carrier_nsamples -= noconfidence_nsamples; + if ( nframes_decoded > 0 ) + carrier_nsamples += nsamples_per_bit * FSK_SCAN_LAG; report_no_carrier(fskp, sample_rate, bfsk_data_rate, + nsamples_per_bit, nframes_decoded, carrier_nsamples, confidence_total); }