From 40f1d50cbd175d45a6ae720d9d3111598554d19d Mon Sep 17 00:00:00 2001 From: Kamal Mostafa Date: Sun, 16 Nov 2014 10:26:28 -0800 Subject: [PATCH] fsk: calc separate divergences for mark and space bits Calculate and consider separate signal-strength divergence values for mark and space bits, so that imbalanced (but consistent) mark/space strengths do not drive down confidence. Note: This change makes all existing test cases yield very slightly higher confidence values. --- src/fsk.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/fsk.c b/src/fsk.c index a6cc926..d491218 100644 --- a/src/fsk.c +++ b/src/fsk.c @@ -269,6 +269,8 @@ fsk_frame_analyze( fsk_plan *fskp, float *samples, float samples_per_bit, #if CONFIDENCE_ALGO == 5 || CONFIDENCE_ALGO == 6 float total_bit_sig = 0.0, total_bit_noise = 0.0; + float avg_mark_sig = 0.0, avg_space_sig = 0.0; + unsigned int n_mark = 0, n_space = 0; for ( bitnum=0; bitnum FLT_EPSILON ) total_bit_noise += bit_noise_mags[bitnum]; + + if ( bit_values[bitnum] == 1 ) { + avg_mark_sig += bit_sig_mags[bitnum]; + n_mark++; + } else { + avg_space_sig += bit_sig_mags[bitnum]; + n_space++; + } } // Compute the "frame SNR" @@ -284,12 +294,18 @@ fsk_frame_analyze( fsk_plan *fskp, float *samples, float samples_per_bit, // Compute avg bit sig and noise magnitudes float avg_bit_sig = total_bit_sig / n_bits; + // Compute separate avg bit sig for mark and space + if ( n_mark ) + avg_mark_sig /= n_mark; + if ( n_space ) + avg_space_sig /= n_space; + #if CONFIDENCE_ALGO == 6 // Compute average "divergence": bit_mag_divergence / other_bits_mag float divergence = 0.0; for ( bitnum=0; bitnum