was getting bad interleaver 16 sync so changed sync metric to no errors. Cobined...
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 9 May 2018 02:46:18 +0000 (02:46 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 9 May 2018 02:46:18 +0000 (02:46 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@3588 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/src/freedv_api.c
codec2-dev/src/freedv_api_internal.h
codec2-dev/src/interldpc.c

index 2368d27f01c11a94568105a5ec89a94a3ef6aba6..f717b602058be64ff1617eb9b21aaff39b8ee663 100644 (file)
@@ -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; i<OFDM_NUWBITS; i++) {         
+            if (rx_uw[i] != ofdm->tx_uw[i]) {
+                f->total_bit_errors++;
+            }
+        }
+        f->total_bits += OFDM_NUWBITS;          
+
     } /* if modem synced .... */ else {
         *valid = -1;
     }
index f7686e1b083e4d4492710bf776d7cf5255e20127..3ca48ee33d4aba1aaf0647e0ac6095afce592002 100644 (file)
@@ -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;
index 49322deb1e9e5049a9633850cbf71fc7f8e5d049..0be87ec976c846729e24a11ddb88ad0ef89a2d56 100644 (file)
@@ -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;