From f3bf20b146a37c424df713f148905113d6fda25d Mon Sep 17 00:00:00 2001 From: drowe67 Date: Wed, 9 May 2018 02:46:18 +0000 Subject: [PATCH] was getting bad interleaver 16 sync so changed sync metric to no errors. Cobined with better modem freq est, this works well, and sounds gd with 16 stage interleaver git-svn-id: https://svn.code.sf.net/p/freetel/code@3588 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/src/freedv_api.c | 26 ++++++++++++++++++++++---- codec2-dev/src/freedv_api_internal.h | 3 ++- codec2-dev/src/interldpc.c | 2 +- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/codec2-dev/src/freedv_api.c b/codec2-dev/src/freedv_api.c index 2368d27f..f717b602 100644 --- a/codec2-dev/src/freedv_api.c +++ b/codec2-dev/src/freedv_api.c @@ -196,7 +196,7 @@ struct freedv *freedv_open_advanced(int mode, struct freedv_advanced *adv) { if (adv == NULL) { f->interleave_frames = 1; } else { - assert((adv->interleave_frames >= 0) && (adv->interleave_frames < 32)); + assert((adv->interleave_frames >= 0) && (adv->interleave_frames <= 16)); f->interleave_frames = adv->interleave_frames; } f->modem_frame_count_tx = f->modem_frame_count_rx = 0; @@ -370,8 +370,9 @@ struct freedv *freedv_open_advanced(int mode, struct freedv_advanced *adv) { nbit = codec2_bits_per_frame(f->codec2); nbyte = (nbit + 7) / 8; nbyte = nbyte*Ncodec2frames*f->interleave_frames; - //fprintf(stderr, "Ncodec2frames: %d n_speech_samples: %d n_codec_bits: %d nbit: %d nbyte: %d\n", - // Ncodec2frames, f->n_speech_samples, f->n_codec_bits, nbit, nbyte); + f->nbyte_packed_codec_bits = nbyte; + fprintf(stderr, "Ncodec2frames: %d n_speech_samples: %d n_codec_bits: %d nbit: %d nbyte: %d\n", + Ncodec2frames, f->n_speech_samples, f->n_codec_bits, nbit, nbyte); f->packed_codec_bits_tx = (unsigned char*)malloc(nbyte*sizeof(char)); f->codec_bits = NULL; } @@ -920,6 +921,8 @@ static void freedv_comptx_700d(struct freedv *f, COMP mod_out[]) { if (bit != 7) byte++; } + + assert(byte <= f->nbyte_packed_codec_bits); // Generate Varicode txt bits. Txt bits in OFDM frame come just // after Unique Word (UW). Txt bits aren't protected by FEC, and need to be @@ -1777,7 +1780,11 @@ static int freedv_comprx_700d(struct freedv *f, COMP demod_in_8kHz[], int *valid } } /* for interleave frames ... */ - + + /* make sure we don't overrun packed byte array */ + + assert(byte <= f->nbyte_packed_codec_bits); + nout = f->n_speech_samples; if (f->squelch_en && (f->stats.snr_est < f->snr_squelch_thresh)) { @@ -1796,6 +1803,17 @@ static int freedv_comprx_700d(struct freedv *f, COMP demod_in_8kHz[], int *valid } } + /* estimate uncoded BER from UW. Coded bit errors could + probably be estimated as half of all failed LDPC parity + checks */ + + for(i=0; itx_uw[i]) { + f->total_bit_errors++; + } + } + f->total_bits += OFDM_NUWBITS; + } /* if modem synced .... */ else { *valid = -1; } diff --git a/codec2-dev/src/freedv_api_internal.h b/codec2-dev/src/freedv_api_internal.h index f7686e1b..3ca48ee3 100644 --- a/codec2-dev/src/freedv_api_internal.h +++ b/codec2-dev/src/freedv_api_internal.h @@ -88,7 +88,8 @@ struct freedv { int clip; // non-zero for cohpsk modem output clipping for low PAPR unsigned char *packed_codec_bits; - unsigned char *packed_codec_bits_tx; // for 700D we separate packed bits to maintain state due to interleaving + unsigned char *packed_codec_bits_tx; // for 700D we separate packed bits to maintain state due to interleaving + int nbyte_packed_codec_bits; // keep track of size of above arrays in 700D int *codec_bits; int *tx_bits; int *fdmdv_bits; diff --git a/codec2-dev/src/interldpc.c b/codec2-dev/src/interldpc.c index 49322deb..0be87ec9 100644 --- a/codec2-dev/src/interldpc.c +++ b/codec2-dev/src/interldpc.c @@ -128,7 +128,7 @@ void interleaver_sync_state_machine(struct OFDM *ofdm, // fprintf(stderr,"%d ", out_char[i]); //fprintf(stderr,"\n"); //fprintf(stderr, " iter: %d pcc: %d Nerrs: %d\n", iter[0], parityCheckCount[0], Nerrs_coded[0]); - if ((Nerrs_coded[0] < 10) || (interleave_frames == 1)) { + if ((Nerrs_coded[0] == 0) || (interleave_frames == 1)) { /* sucessful decode! */ strcpy(next_sync_state_interleaver, "synced"); ofdm->frame_count_interleaver = interleave_frames; -- 2.25.1