From: drowe67 Date: Wed, 9 May 2018 02:46:18 +0000 (+0000) Subject: was getting bad interleaver 16 sync so changed sync metric to no errors. Cobined... X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=f3bf20b146a37c424df713f148905113d6fda25d;p=freetel-svn-tracking.git 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 --- 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;