diff options
Diffstat (limited to 'src/cnetz/fsk_demod.c')
-rw-r--r-- | src/cnetz/fsk_demod.c | 90 |
1 files changed, 47 insertions, 43 deletions
diff --git a/src/cnetz/fsk_demod.c b/src/cnetz/fsk_demod.c index 6362d9e..42865df 100644 --- a/src/cnetz/fsk_demod.c +++ b/src/cnetz/fsk_demod.c @@ -584,55 +584,58 @@ void fsk_fm_demod(fsk_fm_demod_t *fsk, sample_t *samples, int length) /* process signaling block, sample by sample */ for (i = 0; i < length; i++) { - fsk->bit_buffer_spl[fsk->bit_buffer_pos++] = samples[i]; - if (fsk->bit_buffer_pos == fsk->bit_buffer_len) - fsk->bit_buffer_pos = 0; + /* samples == NULL, if no processing is wanted, then just count bit time */ + if (samples) { + fsk->bit_buffer_spl[fsk->bit_buffer_pos++] = samples[i]; + if (fsk->bit_buffer_pos == fsk->bit_buffer_len) + fsk->bit_buffer_pos = 0; - /* for each sample process buffer */ - if (fsk->cnetz->dsp_mode != DSP_MODE_SPK_V) { - if (fsk->demod_type == FSK_DEMOD_SLOPE) - find_change_slope(fsk); - else - find_change_level(fsk); - } else { -#ifdef DEBUG_DECODER - /* start debugging */ - debug = 1; -#endif - /* in distributed signaling, measure over 5 bits, but ignore 5th bit. - * also reset next_bit, as soon as we reach the window */ - /* note that we start from 0.5, because we detect change 0.5 bits later, - * because the detector of the change is in the middle of the 1 bit - * search window */ - t = fmod(fsk->bit_time, BITS_PER_SPK_BLOCK); - if (t < 0.5) { - fsk->next_bit = 1.0 - fsk->bits_per_sample; -#ifdef DEBUG_DECODER - if (debug && fsk->bit_count) - fprintf(fsk->debug_fp, "---- SPK(V) BLOCK START ----\n"); -#endif - fsk->bit_count = 0; - } else - if (t >= 0.5 && t < 5.5) { + /* for each sample process buffer */ + if (fsk->cnetz->dsp_mode != DSP_MODE_SPK_V) { if (fsk->demod_type == FSK_DEMOD_SLOPE) find_change_slope(fsk); else find_change_level(fsk); - } else - if (t >= 5.5 && t < 65.5) { - /* get audio for the duration of 60 bits */ - /* prevent overflow, if speech_size != 0 and SPK_V - * has been restarted. */ - if (fsk->speech_count < fsk->speech_size) - fsk->speech_buffer[fsk->speech_count++] = samples[i]; - } else - if (t >= 65.5) { - if (fsk->speech_count) { - unshrink_speech(fsk->cnetz, fsk->speech_buffer, fsk->speech_count); - fsk->speech_count = 0; + } else { +#ifdef DEBUG_DECODER + /* start debugging */ + debug = 1; +#endif + /* in distributed signaling, measure over 5 bits, but ignore 5th bit. + * also reset next_bit, as soon as we reach the window */ + /* note that we start from 0.5, because we detect change 0.5 bits later, + * because the detector of the change is in the middle of the 1 bit + * search window */ + t = fmod(fsk->bit_time, BITS_PER_SPK_BLOCK); + if (t < 0.5) { + fsk->next_bit = 1.0 - fsk->bits_per_sample; +#ifdef DEBUG_DECODER + if (debug && fsk->bit_count) + fprintf(fsk->debug_fp, "---- SPK(V) BLOCK START ----\n"); +#endif + fsk->bit_count = 0; + } else + if (t >= 0.5 && t < 5.5) { + if (fsk->demod_type == FSK_DEMOD_SLOPE) + find_change_slope(fsk); + else + find_change_level(fsk); + } else + if (t >= 5.5 && t < 65.5) { + /* get audio for the duration of 60 bits */ + /* prevent overflow, if speech_size != 0 and SPK_V + * has been restarted. */ + if (fsk->speech_count < fsk->speech_size) + fsk->speech_buffer[fsk->speech_count++] = samples[i]; + } else + if (t >= 65.5) { + if (fsk->speech_count) { + unshrink_speech(fsk->cnetz, fsk->speech_buffer, fsk->speech_count); + fsk->speech_count = 0; + } } - } + } } fsk->bit_time += fsk->bits_per_sample; if (fsk->bit_time >= BITS_PER_SUPERFRAME) { @@ -652,10 +655,11 @@ void fsk_correct_sync(fsk_fm_demod_t *fsk, double offset) fsk->bit_time = fmod(fsk->bit_time - offset + BITS_PER_SUPERFRAME, BITS_PER_SUPERFRAME); } -/* copy sync from one instance to another (used to sync RX of SpK to OgK */ +/* copy sync from one instance to another (used to sync RX of SpK to OgK) */ void fsk_copy_sync(fsk_fm_demod_t *fsk_to, fsk_fm_demod_t *fsk_from) { fsk_to->bit_time = fsk_from->bit_time; + fsk_demod_reset(fsk_to); } void fsk_demod_reset(fsk_fm_demod_t *fsk) |