support for extracting bit erro rpatterns
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 8 Mar 2013 07:23:45 +0000 (07:23 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 8 Mar 2013 07:23:45 +0000 (07:23 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@1200 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/src/codec2_fdmdv.h
codec2-dev/src/fdmdv.c
codec2-dev/src/fdmdv_put_test_bits.c

index 0e9ddb3d8e61ae49b23fefd4b51088cf51307e3c..f9f73fb0281164d69eefd4b7896e0dbb220a17b9 100644 (file)
@@ -59,7 +59,7 @@ extern "C" {
 
 #define FDMDV_NC                      14  /* default number of data carriers                                */                               
 #define FDMDV_NC_MAX                  20  /* maximum number of data carriers                                */                               
-#define FDMDV_BITS_PER_FRAME          28  /* 20ms frames, 1400 bit/s                                        */
+#define FDMDV_BITS_PER_FRAME          28  /* 20ms frames, for nominal 1400 bit/s                            */
 #define FDMDV_NOM_SAMPLES_PER_FRAME  160  /* modulator output samples/frame and nominal demod samples/frame */
                                           /* at 8000 Hz sample rate                                         */
 #define FDMDV_MAX_SAMPLES_PER_FRAME  200  /* max demod samples/frame, use this to allocate storage          */
@@ -99,7 +99,8 @@ void           CODEC2_WIN32SUPPORT fdmdv_mod(struct FDMDV *fdmdv_state, COMP tx_
 void           CODEC2_WIN32SUPPORT fdmdv_demod(struct FDMDV *fdmdv_state, int rx_bits[], int *sync_bit, COMP rx_fdm[], int *nin);
     
 void           CODEC2_WIN32SUPPORT fdmdv_get_test_bits(struct FDMDV *fdmdv_state, int tx_bits[]);
-void           CODEC2_WIN32SUPPORT fdmdv_put_test_bits(struct FDMDV *f, int *sync, int *bit_errors, int *ntest_bits, int rx_bits[]);
+int            CODEC2_WIN32SUPPORT fdmdv_error_pattern_size(struct FDMDV *fdmdv_state);
+void           CODEC2_WIN32SUPPORT fdmdv_put_test_bits(struct FDMDV *f, int *sync, short error_pattern[], int *bit_errors, int *ntest_bits, int rx_bits[]);
     
 void           CODEC2_WIN32SUPPORT fdmdv_get_demod_stats(struct FDMDV *fdmdv_state, struct FDMDV_STATS *fdmdv_stats);
 void           CODEC2_WIN32SUPPORT fdmdv_get_rx_spectrum(struct FDMDV *fdmdv_state, float mag_dB[], COMP rx_fdm[], int nin);
index 9e6799c33de5fe8386a71b0945693e6d57e5794c..509a02ae5b20c9d1d5bfb97a787a8e7aaa90290c 100644 (file)
@@ -1102,6 +1102,12 @@ void snr_update(float sig_est[], float noise_est[], int Nc, COMP phase_differenc
        noise_est[c] = SNR_COEFF*noise_est[c] + (1 - SNR_COEFF)*n[c];
 }
 
+// returns number of shorts in error_pattern[], one short per error
+
+int CODEC2_WIN32SUPPORT fdmdv_error_pattern_size(struct FDMDV *f) {
+    return f->ntest_bits;
+}
+
 /*---------------------------------------------------------------------------*\
                                                        
   FUNCTION....: fdmdv_put_test_bits()       
@@ -1113,7 +1119,7 @@ void snr_update(float sig_est[], float noise_est[], int Nc, COMP phase_differenc
 
 \*---------------------------------------------------------------------------*/
 
-void CODEC2_WIN32SUPPORT fdmdv_put_test_bits(struct FDMDV *f, int *sync, 
+void CODEC2_WIN32SUPPORT fdmdv_put_test_bits(struct FDMDV *f, int *sync, short error_pattern[],
                                             int *bit_errors, int *ntest_bits, 
                                             int rx_bits[])
 {
@@ -1132,7 +1138,8 @@ void CODEC2_WIN32SUPPORT fdmdv_put_test_bits(struct FDMDV *f, int *sync,
        
     *bit_errors = 0;
     for(i=0; i<f->ntest_bits; i++) {
-       *bit_errors += test_bits[i] ^ f->rx_test_bits_mem[i];
+        error_pattern[i] = test_bits[i] ^ f->rx_test_bits_mem[i];
+       *bit_errors += error_pattern[i];
        //printf("%d %d %d %d\n", i, test_bits[i], f->rx_test_bits_mem[i], test_bits[i] ^ f->rx_test_bits_mem[i]);
     }
 
index d99273c3cd399010cf8550f5cf2971ed70501283..b1b3ee6fbcb923e954920f01c99d317750a23120 100644 (file)
@@ -48,6 +48,7 @@ int main(int argc, char *argv[])
     int           bits_per_codec_frame;
     int           bytes_per_codec_frame;
     int           Nc;
+    int          *error_pattern;
 
     if (argc < 2) {
        printf("usage: %s InputBitFile [Nc]\n", argv[0]);
@@ -90,6 +91,9 @@ int main(int argc, char *argv[])
     rx_bits = (int*)malloc(sizeof(int)*bits_per_codec_frame);
     assert(rx_bits != NULL);
 
+    error_pattern = (int*)malloc(fdmdv_error_pattern_size(fdmdv)*sizeof(int));
+    assert(error_pattern != NULL);
+
     total_bit_errors = 0;
     total_bits = 0;
 
@@ -108,7 +112,7 @@ int main(int argc, char *argv[])
        }
        assert(byte == bytes_per_codec_frame);
 
-       fdmdv_put_test_bits(fdmdv, &test_frame_sync, &bit_errors, &ntest_bits, rx_bits);
+       fdmdv_put_test_bits(fdmdv, &test_frame_sync, error_pattern, &bit_errors, &ntest_bits, rx_bits);
        if (test_frame_sync == 1) {
            total_bit_errors += bit_errors;
            total_bits = total_bits + ntest_bits;
@@ -116,7 +120,7 @@ int main(int argc, char *argv[])
        }
        else
            printf("-");
-       fdmdv_put_test_bits(fdmdv, &test_frame_sync, &bit_errors, &ntest_bits, &rx_bits[bits_per_fdmdv_frame]);
+       fdmdv_put_test_bits(fdmdv, &test_frame_sync,  error_pattern, &bit_errors, &ntest_bits, &rx_bits[bits_per_fdmdv_frame]);
        if (test_frame_sync == 1) {
            total_bit_errors += bit_errors;
            total_bits = total_bits + ntest_bits;
@@ -132,6 +136,7 @@ int main(int argc, char *argv[])
     }
 
     fclose(fin);
+    free(error_pattern);
     fdmdv_destroy(fdmdv);
 
     printf("\nbits %d  errors %d  BER %1.4f\n", total_bits, total_bit_errors, (float)total_bit_errors/(1E-6+total_bits) );