refactoring functions that can be reused in freedv_api
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 20 Apr 2018 21:25:07 +0000 (21:25 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 20 Apr 2018 21:25:07 +0000 (21:25 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@3515 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/src/interldpc.c
codec2-dev/src/interldpc.h
codec2-dev/src/ofdm_demod.c

index a7ff46c7851f728df482b7ed1ed44ce15736e9da..4c5c6904e6af83074e187d81879399028b35290e 100644 (file)
 
 #include "interldpc.h"
 #include "codec2_ofdm.h"
-#include "ofdm_internal.h"
 #include "mpdecode_core.h"
 #include "gp_interleaver.h"
 #include "HRA_112_112.h"
+#include "test_bits_ofdm.h"
 
 /* CRC type function, used to compare QPSK vectors when debugging */
 
@@ -104,3 +104,72 @@ void qpsk_modulate_frame(COMP tx_symbols[], int codeword[], int n) {
         tx_symbols[i].imag = cimagf(qpsk_symb);
     }    
 }
+
+void interleaver_sync_state_machine(struct OFDM *ofdm,
+                                    struct LDPC *ldpc,
+                                    COMP codeword_symbols_de[],
+                                    float codeword_amps_de[],
+                                    float EsNo, int interleave_frames,
+                                    int *iter, int *parityCheckCount, int *Nerrs_coded)
+{
+    int coded_syms_per_frame = ldpc->coded_syms_per_frame;
+    int coded_bits_per_frame = ldpc->coded_bits_per_frame;
+    int data_bits_per_frame = ldpc->data_bits_per_frame;
+    double llr[coded_bits_per_frame];
+    char out_char[coded_bits_per_frame];                    
+    char next_sync_state_interleaver[OFDM_STATE_STR];
+    
+    strcpy(next_sync_state_interleaver, ofdm->sync_state_interleaver);
+    if ((strcmp(ofdm->sync_state_interleaver,"search") == 0) && (ofdm->frame_count >= (interleave_frames-1))) {
+        symbols_to_llrs(llr, codeword_symbols_de, codeword_amps_de, EsNo, coded_syms_per_frame);               
+        iter[0] =  run_ldpc_decoder(ldpc, out_char, llr, parityCheckCount);
+        Nerrs_coded[0] = data_bits_per_frame - parityCheckCount[0];
+        //for(i=0; i<20; i++)
+        //    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] == 0) && (iter[0] <= 5)) {
+            /* sucessful decode! */
+            strcpy(next_sync_state_interleaver, "synced");
+            ofdm->frame_count_interleaver = interleave_frames;
+        }
+    }
+    strcpy(ofdm->sync_state_interleaver, next_sync_state_interleaver);
+}
+
+
+/* measure uncoded (raw) bit errors over interleaver frame */
+
+int count_uncoded_errors(struct LDPC *ldpc, int Nerrs_raw[], int interleave_frames, COMP codeword_symbols_de[])
+{
+    int i,j,Nerrs,Terrs;
+
+    int coded_syms_per_frame = ldpc->coded_syms_per_frame;
+    int coded_bits_per_frame = ldpc->coded_bits_per_frame;
+    int rx_bits_raw[coded_bits_per_frame];
+
+    assert(sizeof(test_codeword)/sizeof(int) == coded_bits_per_frame);
+
+    Terrs = 0;
+    for (j=0; j<interleave_frames; j++) {
+        for(i=0; i<coded_syms_per_frame; i++) {
+            int bits[2];
+            complex float s = codeword_symbols_de[j*coded_syms_per_frame+i].real + I*codeword_symbols_de[j*coded_syms_per_frame+i].imag;
+            qpsk_demod(s, bits);
+            rx_bits_raw[OFDM_BPS*i]   = bits[1];
+            rx_bits_raw[OFDM_BPS*i+1] = bits[0];
+        }
+        Nerrs = 0;
+        for(i=0; i<coded_bits_per_frame; i++) {
+            //fprintf(stderr, "%d %d %d\n", i, test_codeword[i], rx_bits_raw[i]);
+            if (test_codeword[i] != rx_bits_raw[i]) {
+                Nerrs++;
+            }
+        }
+                                
+        Nerrs_raw[j] = Nerrs;
+        Terrs += Nerrs;
+    }
+
+    return Terrs;
+}
index b14a3bc139b7502517dfcb7a2027117f45e688d3..2610e7b3c859707ea7c5d4d0fee0968775730900 100644 (file)
@@ -30,6 +30,7 @@
 
 #include "comp.h"
 #include "mpdecode_core.h"
+#include "ofdm_internal.h"
 
 /* CRC type function, used to compare QPSK vectors when debugging */
 
@@ -38,5 +39,12 @@ void printf_n(COMP v[], int n);
 void set_up_hra_112_112(struct LDPC *ldpc);
 void ldpc_encode_frame(struct LDPC *ldpc, int codeword[], unsigned char tx_bits_char[]);
 void qpsk_modulate_frame(COMP tx_symbols[], int codeword[], int n);
+void interleaver_sync_state_machine(struct OFDM *ofdm,
+                                    struct LDPC *ldpc,
+                                    COMP codeword_symbols_de[],
+                                    float codeword_amps_de[],
+                                    float EsNo, int interleave_frames,
+                                    int *inter, int *parityCheckCount, int *Nerrs_coded);
+int count_uncoded_errors(struct LDPC *ldpc, int Nerrs_raw[], int interleave_frames, COMP codeword_symbols_de[]);
 
 #endif
index dc625e538e586eea2a035833948c74187059630b..e4c7a3b7ff83b43bceee04e3396bbb9748a753cb 100644 (file)
@@ -42,7 +42,6 @@
 #include "codec2_ofdm.h"
 #include "ofdm_internal.h"
 #include "octave.h"
-#include "test_bits_ofdm.h"
 #include "mpdecode_core.h"
 #include "gp_interleaver.h"
 #include "interldpc.h"
@@ -51,6 +50,9 @@
 #define NFRAMES  100               /* just log the first 100 frames          */
 #define NDISCARD 20                /* BER2measure disctrds first 20 frames   */
 
+extern int payload_data_bits[];
+extern int test_bits_ofdm[];
+               
 int opt_exists(char *argv[], int argc, char opt[]) {
     int i;
     for (i=0; i<argc; i++) {
@@ -184,8 +186,6 @@ int main(int argc, char *argv[])
 
     COMP  codeword_symbols[interleave_frames*coded_syms_per_frame];
     float codeword_amps[interleave_frames*coded_syms_per_frame];
-    COMP  codeword_symbols_de[interleave_frames*coded_syms_per_frame];
-    float codeword_amps_de[interleave_frames*coded_syms_per_frame];
 
     nin_frame = ofdm_get_nin(ofdm);
     while(fread(rx_scaled, sizeof(short), nin_frame, fin) == nin_frame) {
@@ -231,6 +231,8 @@ int main(int argc, char *argv[])
                
                 /* run de-interleaver */
                 
+                COMP  codeword_symbols_de[interleave_frames*coded_syms_per_frame];
+                float codeword_amps_de[interleave_frames*coded_syms_per_frame];
                 gp_deinterleave_comp (codeword_symbols_de, codeword_symbols, interleave_frames*coded_syms_per_frame);
                 gp_deinterleave_float(codeword_amps_de   , codeword_amps   , interleave_frames*coded_syms_per_frame);
 
@@ -239,61 +241,16 @@ int main(int argc, char *argv[])
                 if (ldpc_en) {
                     char out_char[coded_bits_per_frame];
 
-                    /* 
-                       Interleaver Sync:
-                         Needs to work on any data
-                         Use indication of LDPC convergence, may need to patch CML code for that
-                         Attempt a decode on every frame, when it converges we have sync
-                    */
-                    
-                    char next_sync_state_interleaver[OFDM_STATE_STR];
-                    strcpy(next_sync_state_interleaver, ofdm->sync_state_interleaver);
-                    if ((strcmp(ofdm->sync_state_interleaver,"search") == 0) && (ofdm->frame_count >= (interleave_frames-1))) {
-                        symbols_to_llrs(llr, codeword_symbols_de, codeword_amps_de, EsNo, coded_syms_per_frame);               
-                        iter[0] =  run_ldpc_decoder(&ldpc, out_char, llr, &parityCheckCount[0]);
-                        Nerrs_coded[0] = data_bits_per_frame - parityCheckCount[0];
-                        //for(i=0; i<20; i++)
-                        //    fprintf(stderr,"%d ", out_char[i]);
-                        //fprintf(stderr,"\n");
-                        //fprintf(stderr, "     iter: %d pcc: %d Nerrs: %d\n", iter, parityCheckCount, Nerrs);
-                        if ((Nerrs_coded[0] == 0) && (iter[0] <= 5)) {
-                            /* sucessful decode! */
-                            strcpy(next_sync_state_interleaver, "synced");
-                            ofdm->frame_count_interleaver = interleave_frames;
-                        }
-                    }
-                    strcpy(ofdm->sync_state_interleaver, next_sync_state_interleaver);
-                     
+                    interleaver_sync_state_machine(ofdm, &ldpc, codeword_symbols_de, codeword_amps_de, EsNo,
+                                                   interleave_frames, iter, parityCheckCount, Nerrs_coded);
+                                         
                     if (!strcmp(ofdm->sync_state_interleaver,"synced") && (ofdm->frame_count_interleaver == interleave_frames)) {
                         ofdm->frame_count_interleaver = 0;
                         // printf("decode!\n");
 
                         if (testframes) {
-                            
-                            /* measure uncoded (raw) bit errors over interleaver frame */
-
-                            int rx_bits_raw[coded_bits_per_frame];
-                            for (j=0; j<interleave_frames; j++) {
-                                for(i=0; i<coded_syms_per_frame; i++) {
-                                    int bits[2];
-                                    complex float s = codeword_symbols_de[j*coded_syms_per_frame+i].real + I*codeword_symbols_de[j*coded_syms_per_frame+i].imag;
-                                    qpsk_demod(s, bits);
-                                    rx_bits_raw[OFDM_BPS*i]   = bits[1];
-                                    rx_bits_raw[OFDM_BPS*i+1] = bits[0];
-                                }
-                                Nerrs = 0;
-                                assert(sizeof(test_codeword)/sizeof(int) == coded_bits_per_frame);
-                                for(i=0; i<coded_bits_per_frame; i++) {
-                                    //fprintf(stderr, "%d %d %d\n", i, test_codeword[i], rx_bits_raw[i]);
-                                    if (test_codeword[i] != rx_bits_raw[i]) {
-                                        Nerrs++;
-                                    }
-                                }
-                                
-                                Nerrs_raw[j] = Nerrs;
-                                Terrs += Nerrs;
-                                Tbits += Nbitsperframe;
-                            }
+                            Terrs += count_uncoded_errors(&ldpc, Nerrs_raw, interleave_frames, codeword_symbols_de);
+                            Tbits += Nbitsperframe*interleave_frames;
                         }
 
                         for (j=0; j<interleave_frames; j++) {
@@ -320,7 +277,7 @@ int main(int argc, char *argv[])
                 } else {
                     /* lpdc_en == 0,  external LDPC decoder, so output LLRs */
                     symbols_to_llrs(llr, codeword_symbols_de, codeword_amps_de, EsNo, coded_syms_per_frame);
-                        fwrite(llr, sizeof(double), coded_bits_per_frame, fout);
+                    fwrite(llr, sizeof(double), coded_bits_per_frame, fout);
                 }
             } else {
                 /* simple hard decision output for uncoded testing, all bits in frame dumped inlcuding UW and txt */