fsk cleanup
This commit is contained in:
parent
5f538ed54d
commit
71baa6f916
84
src/fsk.c
84
src/fsk.c
|
@ -162,7 +162,7 @@ fsk_frame_decode( fsk_plan *fskp, float *samples, unsigned int frame_nsamples,
|
||||||
unsigned int bit_nsamples = (float)(samples_per_bit + 0.5);
|
unsigned int bit_nsamples = (float)(samples_per_bit + 0.5);
|
||||||
|
|
||||||
// 0123456789A
|
// 0123456789A
|
||||||
// isddddddddp i == idle bit (a.k.a. previous stop bit)
|
// isddddddddp i == idle bit (a.k.a. prev_stop bit)
|
||||||
// s == start bit
|
// s == start bit
|
||||||
// d == data bits
|
// d == data bits
|
||||||
// p == stop bit
|
// p == stop bit
|
||||||
|
@ -251,6 +251,7 @@ fsk_find_frame( fsk_plan *fskp, float *samples, unsigned int frame_nsamples,
|
||||||
*bits_outp = best_bits;
|
*bits_outp = best_bits;
|
||||||
*frame_start_outp = best_t;
|
*frame_start_outp = best_t;
|
||||||
|
|
||||||
|
/* The confidence equation */
|
||||||
float confidence = best_v / fskp->n_frame_bits;
|
float confidence = best_v / fskp->n_frame_bits;
|
||||||
|
|
||||||
debug_log("FSK_FRAME datum='%c' (0x%02x) c=%f t=%d\n",
|
debug_log("FSK_FRAME datum='%c' (0x%02x) c=%f t=%d\n",
|
||||||
|
@ -273,9 +274,6 @@ fsk_find_frame( fsk_plan *fskp, float *samples, unsigned int frame_nsamples,
|
||||||
int
|
int
|
||||||
main( int argc, char*argv[] )
|
main( int argc, char*argv[] )
|
||||||
{
|
{
|
||||||
|
|
||||||
int ret = 1;
|
|
||||||
|
|
||||||
if ( argc < 2 ) {
|
if ( argc < 2 ) {
|
||||||
fprintf(stderr, "usage: fsk [filename] baud_rate [ mark_hz space_hz ]\n");
|
fprintf(stderr, "usage: fsk [filename] baud_rate [ mark_hz space_hz ]\n");
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -344,15 +342,9 @@ main( int argc, char*argv[] )
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Run the main loop
|
* Prepare the fsk plan
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ret = 0;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fsk_plan *fskp = fsk_plan_new(sample_rate,
|
fsk_plan *fskp = fsk_plan_new(sample_rate,
|
||||||
bfsk_mark_f, bfsk_space_f,
|
bfsk_mark_f, bfsk_space_f,
|
||||||
band_width, 8);
|
band_width, 8);
|
||||||
|
@ -362,6 +354,11 @@ main( int argc, char*argv[] )
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Run the main loop
|
||||||
|
*/
|
||||||
|
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
size_t fill_nsamples = nsamples_per_bit * 12;
|
size_t fill_nsamples = nsamples_per_bit * 12;
|
||||||
|
|
||||||
|
@ -375,6 +372,7 @@ main( int argc, char*argv[] )
|
||||||
unsigned int nbytes_decoded = 0;
|
unsigned int nbytes_decoded = 0;
|
||||||
|
|
||||||
int carrier = 0;
|
int carrier = 0;
|
||||||
|
unsigned int noconfidence = 0;
|
||||||
while ( 1 ) {
|
while ( 1 ) {
|
||||||
|
|
||||||
debug_log( "@read samples+%ld n=%lu\n",
|
debug_log( "@read samples+%ld n=%lu\n",
|
||||||
|
@ -385,43 +383,54 @@ main( int argc, char*argv[] )
|
||||||
// carrier_nsamples += read_nsamples;
|
// carrier_nsamples += read_nsamples;
|
||||||
|
|
||||||
|
|
||||||
|
debug_log( "--------------------------\n");
|
||||||
|
|
||||||
|
// FIXME: explain
|
||||||
unsigned int frame_nsamples = nsamples_per_bit * 11;
|
unsigned int frame_nsamples = nsamples_per_bit * 11;
|
||||||
|
|
||||||
unsigned int bits = 0;
|
// FIXME: explain
|
||||||
|
unsigned int try_max_nsamples = nsamples_per_bit;
|
||||||
|
|
||||||
|
// FIXME: explain
|
||||||
unsigned int try_step_nsamples = nsamples_per_bit / 4;
|
unsigned int try_step_nsamples = nsamples_per_bit / 4;
|
||||||
if ( try_step_nsamples == 0 )
|
if ( try_step_nsamples == 0 )
|
||||||
try_step_nsamples = 1;
|
try_step_nsamples = 1;
|
||||||
|
|
||||||
|
|
||||||
debug_log( "--------------------------\n");
|
|
||||||
|
|
||||||
|
|
||||||
unsigned int t = 0;
|
|
||||||
|
|
||||||
float confidence;
|
float confidence;
|
||||||
|
unsigned int bits = 0;
|
||||||
|
/* Note: frame_start_sample is actually the sample where the
|
||||||
|
* prev_stop bit begins (since the "frame" includes the prev_stop). */
|
||||||
|
unsigned int frame_start_sample = 0;
|
||||||
|
|
||||||
confidence = fsk_find_frame(fskp, samples, frame_nsamples,
|
confidence = fsk_find_frame(fskp, samples, frame_nsamples,
|
||||||
/*try_max_nsamples*/ nsamples_per_bit,
|
try_max_nsamples,
|
||||||
try_step_nsamples,
|
try_step_nsamples,
|
||||||
&bits,
|
&bits,
|
||||||
&t
|
&frame_start_sample
|
||||||
);
|
);
|
||||||
|
|
||||||
#define FSK_MIN_CONFIDENCE 0.41
|
#define FSK_MIN_CONFIDENCE 0.41
|
||||||
|
// #define FSK_MIN_CONFIDENCE 0.13
|
||||||
|
|
||||||
|
unsigned int advance;
|
||||||
|
|
||||||
if ( confidence <= FSK_MIN_CONFIDENCE ) {
|
if ( confidence <= FSK_MIN_CONFIDENCE ) {
|
||||||
|
|
||||||
if ( carrier ) {
|
if ( carrier ) {
|
||||||
|
if ( ++noconfidence > 3 ) // FIXME: explain
|
||||||
|
{
|
||||||
fprintf(stderr, "### NOCARRIER nbytes=%u confidence=%f ###\n",
|
fprintf(stderr, "### NOCARRIER nbytes=%u confidence=%f ###\n",
|
||||||
nbytes_decoded,
|
nbytes_decoded, confidence_total / nbytes_decoded );
|
||||||
confidence_total / nbytes_decoded );
|
|
||||||
carrier = 0;
|
carrier = 0;
|
||||||
confidence_total = 0;
|
confidence_total = 0;
|
||||||
nbytes_decoded = 0;
|
nbytes_decoded = 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
t = nsamples_per_bit;
|
/* Advance the sample stream forward by try_max_nsamples so the
|
||||||
|
* next time around the loop we continue searching from where
|
||||||
|
* we left off this time. */
|
||||||
|
advance = try_max_nsamples;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
@ -431,10 +440,21 @@ debug_log( "--------------------------\n");
|
||||||
}
|
}
|
||||||
confidence_total += confidence;
|
confidence_total += confidence;
|
||||||
nbytes_decoded++;
|
nbytes_decoded++;
|
||||||
|
noconfidence = 0;
|
||||||
|
|
||||||
// t += nsamples_per_bit * 10;
|
/* Advance the sample stream forward past the decoded frame
|
||||||
t += nsamples_per_bit * 9.5;
|
* but not past the stop bit, since we want it to appear as
|
||||||
debug_log( "@ t=%u\n", t);
|
* the prev_stop bit of the next frame, so ...
|
||||||
|
*
|
||||||
|
* advance = 1 prev_stop + 1 start + 8 data bits == 10 bits
|
||||||
|
*
|
||||||
|
* but actually advance just a bit less than that to allow
|
||||||
|
* for clock skew, so ...
|
||||||
|
*
|
||||||
|
* advance = 9.5 bits */
|
||||||
|
advance = frame_start_sample + nsamples_per_bit * 9.5;
|
||||||
|
|
||||||
|
debug_log( "@ frame_start=%u advance=%u\n", frame_start_sample, advance);
|
||||||
|
|
||||||
char the_byte = isprint(bits)||isspace(bits) ? bits : '.';
|
char the_byte = isprint(bits)||isspace(bits) ? bits : '.';
|
||||||
printf( "%c", the_byte );
|
printf( "%c", the_byte );
|
||||||
|
@ -442,9 +462,10 @@ debug_log( "--------------------------\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
memmove(samples, samples+t, (fill_nsamples-t)*sizeof(float));
|
memmove(samples, samples+advance,
|
||||||
read_bufptr = samples + (fill_nsamples-t);
|
(fill_nsamples-advance)*sizeof(float));
|
||||||
read_nsamples = t;
|
read_bufptr = samples + (fill_nsamples-advance);
|
||||||
|
read_nsamples = advance;
|
||||||
|
|
||||||
assert ( read_nsamples <= buf_nsamples );
|
assert ( read_nsamples <= buf_nsamples );
|
||||||
assert ( read_nsamples > 0 );
|
assert ( read_nsamples > 0 );
|
||||||
|
@ -454,6 +475,11 @@ debug_log( "--------------------------\n");
|
||||||
if ( ret != 0 )
|
if ( ret != 0 )
|
||||||
fprintf(stderr, "simpleaudio_read: error\n");
|
fprintf(stderr, "simpleaudio_read: error\n");
|
||||||
|
|
||||||
|
if ( carrier ) {
|
||||||
|
fprintf(stderr, "### NOCARRIER nbytes=%u confidence=%f ###\n",
|
||||||
|
nbytes_decoded, confidence_total / nbytes_decoded );
|
||||||
|
}
|
||||||
|
|
||||||
simpleaudio_close(sa);
|
simpleaudio_close(sa);
|
||||||
|
|
||||||
fsk_plan_destroy(fskp);
|
fsk_plan_destroy(fskp);
|
||||||
|
|
Loading…
Reference in New Issue