minimodem: fsk_frame_overscan replaces FSK_SCAN_LAG
This commit is contained in:
parent
6ee10626c9
commit
df80c98e22
|
@ -690,7 +690,8 @@ main( int argc, char*argv[] )
|
||||||
// FIXME I should be able to reduce this to * 9 for 5-bit data, but
|
// FIXME I should be able to reduce this to * 9 for 5-bit data, but
|
||||||
// it SOMETIMES crashes -- probably due to non-integer nsamples_per_bit
|
// it SOMETIMES crashes -- probably due to non-integer nsamples_per_bit
|
||||||
// FIXME by passing it down into the fsk code?
|
// FIXME by passing it down into the fsk code?
|
||||||
size_t samplebuf_size = ceilf(nsamples_per_bit) * 12;
|
// FIXME EXPLAIN +1 goes with extra bit when scanning
|
||||||
|
size_t samplebuf_size = ceilf(nsamples_per_bit) * (12+1);
|
||||||
float *samplebuf = malloc(samplebuf_size * sizeof(float));
|
float *samplebuf = malloc(samplebuf_size * sizeof(float));
|
||||||
float *samples_readptr = samplebuf;
|
float *samples_readptr = samplebuf;
|
||||||
size_t read_nsamples = samplebuf_size;
|
size_t read_nsamples = samplebuf_size;
|
||||||
|
@ -712,6 +713,25 @@ main( int argc, char*argv[] )
|
||||||
size_t noconfidence_nsamples = 0;
|
size_t noconfidence_nsamples = 0;
|
||||||
unsigned int advance = 0;
|
unsigned int advance = 0;
|
||||||
|
|
||||||
|
// Fraction of nsamples_per_bit that we will "overscan"; range (0.0 .. 1.0)
|
||||||
|
float fsk_frame_overscan = 0.5;
|
||||||
|
// should be != 0.0 (only the nyquist edge cases actually require this?)
|
||||||
|
// for handling of slightly faster-than-us rates:
|
||||||
|
// should be >> 0.0 to allow us to lag back for faster-than-us rates
|
||||||
|
// should be << 1.0 or we may lag backwards over whole bits
|
||||||
|
// for optimal analysis:
|
||||||
|
// should be >= 0.5 (half a bit width) or we may not find the optimal bit
|
||||||
|
// should be < 1.0 (a full bit width) or we may skip over whole bits
|
||||||
|
assert( fsk_frame_overscan >= 0.0 && fsk_frame_overscan < 1.0 );
|
||||||
|
|
||||||
|
// ensure that we overscan at least a single sample
|
||||||
|
unsigned int nsamples_overscan
|
||||||
|
= nsamples_per_bit * fsk_frame_overscan + 0.5;
|
||||||
|
if ( fsk_frame_overscan > 0.0 && nsamples_overscan == 0 )
|
||||||
|
nsamples_overscan = 1;
|
||||||
|
debug_log("fsk_frame_overscan=%f nsamples_overscan=%u\n",
|
||||||
|
fsk_frame_overscan, nsamples_overscan);
|
||||||
|
|
||||||
while ( 1 ) {
|
while ( 1 ) {
|
||||||
|
|
||||||
debug_log("advance=%u\n", advance);
|
debug_log("advance=%u\n", advance);
|
||||||
|
@ -807,7 +827,12 @@ main( int argc, char*argv[] )
|
||||||
if ( samples_nvalid < frame_nsamples )
|
if ( samples_nvalid < frame_nsamples )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
unsigned int try_max_nsamples = nsamples_per_bit;
|
// try_max_nsamples = nsamples_per_bit + nsamples_overscan;
|
||||||
|
// serves two purposes
|
||||||
|
// 1. avoids finding a non-optimal first frame
|
||||||
|
// 2. allows us to track slightly slow signals
|
||||||
|
unsigned int try_max_nsamples = nsamples_per_bit + nsamples_overscan;
|
||||||
|
|
||||||
#define FSK_ANALYZE_NSTEPS 10 /* accuracy vs. performance */
|
#define FSK_ANALYZE_NSTEPS 10 /* accuracy vs. performance */
|
||||||
// Note: FSK_ANALYZE_NSTEPS has subtle effects on the
|
// Note: FSK_ANALYZE_NSTEPS has subtle effects on the
|
||||||
// "rate perfect" calculation. oh well.
|
// "rate perfect" calculation. oh well.
|
||||||
|
@ -836,8 +861,6 @@ main( int argc, char*argv[] )
|
||||||
|
|
||||||
#define FSK_MAX_NOCONFIDENCE_BITS 20
|
#define FSK_MAX_NOCONFIDENCE_BITS 20
|
||||||
|
|
||||||
#define FSK_SCAN_LAG 0.2
|
|
||||||
|
|
||||||
if ( confidence <= bfsk_confidence_threshold ) {
|
if ( confidence <= bfsk_confidence_threshold ) {
|
||||||
// FIXME: explain
|
// FIXME: explain
|
||||||
if ( ++noconfidence > FSK_MAX_NOCONFIDENCE_BITS )
|
if ( ++noconfidence > FSK_MAX_NOCONFIDENCE_BITS )
|
||||||
|
@ -846,7 +869,7 @@ main( int argc, char*argv[] )
|
||||||
if ( carrier ) {
|
if ( carrier ) {
|
||||||
carrier_nsamples -= noconfidence_nsamples;
|
carrier_nsamples -= noconfidence_nsamples;
|
||||||
if ( nframes_decoded > 0 )
|
if ( nframes_decoded > 0 )
|
||||||
carrier_nsamples += nsamples_per_bit * FSK_SCAN_LAG;
|
carrier_nsamples += nsamples_overscan;
|
||||||
if ( !quiet_mode )
|
if ( !quiet_mode )
|
||||||
report_no_carrier(fskp, sample_rate, bfsk_data_rate,
|
report_no_carrier(fskp, sample_rate, bfsk_data_rate,
|
||||||
nsamples_per_bit, nframes_decoded,
|
nsamples_per_bit, nframes_decoded,
|
||||||
|
@ -895,10 +918,11 @@ main( int argc, char*argv[] )
|
||||||
* advance = 1 prev_stop + 1 start + N data bits == n_data_bits+2
|
* advance = 1 prev_stop + 1 start + N data bits == n_data_bits+2
|
||||||
*
|
*
|
||||||
* but actually advance just a bit less than that to allow
|
* but actually advance just a bit less than that to allow
|
||||||
* for clock skew, hence FSK_SCAN_LAG.
|
* for tracking slightly fast signals, hence - nsamples_overscan.
|
||||||
*/
|
*/
|
||||||
advance = frame_start_sample +
|
advance = frame_start_sample
|
||||||
nsamples_per_bit * (float)(fskp->n_data_bits + 2 - FSK_SCAN_LAG);
|
+ nsamples_per_bit * (float)(fskp->n_data_bits + 2)
|
||||||
|
- nsamples_overscan;
|
||||||
|
|
||||||
debug_log("@ nsamples_per_bit=%.3f n_data_bits=%u "
|
debug_log("@ nsamples_per_bit=%.3f n_data_bits=%u "
|
||||||
" frame_start=%u advance=%u\n",
|
" frame_start=%u advance=%u\n",
|
||||||
|
@ -936,7 +960,7 @@ main( int argc, char*argv[] )
|
||||||
if ( carrier ) {
|
if ( carrier ) {
|
||||||
carrier_nsamples -= noconfidence_nsamples;
|
carrier_nsamples -= noconfidence_nsamples;
|
||||||
if ( nframes_decoded > 0 )
|
if ( nframes_decoded > 0 )
|
||||||
carrier_nsamples += nsamples_per_bit * FSK_SCAN_LAG;
|
carrier_nsamples += nsamples_overscan;
|
||||||
if ( !quiet_mode )
|
if ( !quiet_mode )
|
||||||
report_no_carrier(fskp, sample_rate, bfsk_data_rate,
|
report_no_carrier(fskp, sample_rate, bfsk_data_rate,
|
||||||
nsamples_per_bit, nframes_decoded,
|
nsamples_per_bit, nframes_decoded,
|
||||||
|
|
Loading…
Reference in New Issue