tofdm working with ldpc decoder
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 13 Apr 2018 06:29:39 +0000 (06:29 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 13 Apr 2018 06:29:39 +0000 (06:29 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@3475 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/unittest/tofdm.c

index 13659868b2f280a91581a14d162521c6af8afafd..b0890d968adec02825f912bfdd899e615588f9c4 100644 (file)
@@ -42,6 +42,8 @@
 #include "comp_prim.h"
 #include "mpdecode_core.h"
 
+#include "HRA_112_112.h"          /* generated by ldpc_fsk_lib.m:ldpc_decode() */
+
 #define NFRAMES                   3
 #define SAMPLE_CLOCK_OFFSET_PPM 100
 #define FOFF_HZ                 0.5f
@@ -128,6 +130,7 @@ int main(int argc, char *argv[])
     int            max_samples_per_frame = ofdm_get_max_samples_per_frame();
 
     struct OFDM   *ofdm;
+    int            tx_bits[samples_per_frame];
     COMP           tx[samples_per_frame];         /* one frame of tx samples */
 
     int            rx_bits[OFDM_BITSPERFRAME];    /* one frame of rx bits    */
@@ -152,13 +155,37 @@ int main(int argc, char *argv[])
     int            sample_point_log[NFRAMES];
     float          symbol_likelihood_log[ (CODED_BITSPERFRAME/OFDM_BPS) * (1<<OFDM_BPS) * NFRAMES];
     float          bit_likelihood_log[CODED_BITSPERFRAME * NFRAMES];        
-        
+    int            detected_data_log[CODED_BITSPERFRAME * NFRAMES];
+    
     FILE          *fout;
     int            f,i,j;
 
     ofdm = ofdm_create(OFDM_CONFIG_700D);
     assert(ofdm != NULL);
+
+    /* set up LDPC code */
     
+    struct LDPC   ldpc;
+    ldpc.CodeLength = HRA_112_112_CODELENGTH;
+    ldpc.NumberParityBits = HRA_112_112_NUMBERPARITYBITS;
+    ldpc.NumberRowsHcols = HRA_112_112_NUMBERROWSHCOLS;
+    ldpc.max_row_weight = HRA_112_112_MAX_ROW_WEIGHT;
+    ldpc.max_col_weight = HRA_112_112_MAX_COL_WEIGHT;
+    ldpc.H_rows = HRA_112_112_H_rows;
+    ldpc.H_cols = HRA_112_112_H_cols;
+
+    ldpc.max_iter = HRA_112_112_MAX_ITER;
+    ldpc.dec_type = 0;
+    ldpc.q_scale_factor = 1;
+    ldpc.r_scale_factor = 1;
+    ldpc.CodeLength = HRA_112_112_CODELENGTH;
+    ldpc.NumberParityBits = HRA_112_112_NUMBERPARITYBITS;
+    ldpc.NumberRowsHcols = HRA_112_112_NUMBERROWSHCOLS;
+    ldpc.max_row_weight = HRA_112_112_MAX_ROW_WEIGHT;
+    ldpc.max_col_weight = HRA_112_112_MAX_COL_WEIGHT;
+    ldpc.H_rows = HRA_112_112_H_rows;
+    ldpc.H_cols = HRA_112_112_H_cols;
+
     /* Main Loop ---------------------------------------------------------------------*/
 
     for(f=0; f<NFRAMES; f++) {
@@ -167,14 +194,39 @@ int main(int argc, char *argv[])
                                  Mod
        \*---------------------------------------------------------*/
 
-        /* todo: add a longer sequence of test bits through
-           ofdm_get/put test bits functin similat to cohpsk/fdmdv */
+        /* See CML startup code in tofdm.m */
+
+        #define LDPC_ENABLE
+        #ifdef LDPC_ENABLE
+        unsigned char ibits[HRA_112_112_NUMBERROWSHCOLS];
+        unsigned char pbits[HRA_112_112_NUMBERPARITYBITS];
 
-        ofdm_mod(ofdm, (COMP*)tx, test_bits_ofdm);
+        assert(HRA_112_112_NUMBERROWSHCOLS == ldpc.CodeLength/2);
+        for(i=0; i<ldpc.CodeLength/2; i++) {
+            ibits[i] = test_bits_ofdm[i+OFDM_NUWBITS+OFDM_NTXTBITS];
+        }
+        encode(&ldpc, ibits, pbits);
+        for(i=0; i<OFDM_NUWBITS+OFDM_NTXTBITS; i++) {
+            tx_bits[i] = 0;
+        }
+        for(j=0; j<ldpc.CodeLength/2; i++,j++) {
+            tx_bits[i] = ibits[j];
+        }
+        for(j=0; j<ldpc.CodeLength/2; i++,j++) {
+            tx_bits[i] = pbits[j];
+        }
+        assert(i == OFDM_BITSPERFRAME);
+        #else
+        for(i=0; i<OFDM_BITSPERFRAME; i++) {
+            tx_bits = test_bits_ofdm[i];
+        }
+        #endif
 
+        ofdm_mod(ofdm, (COMP*)tx, tx_bits);
+        
         /* tx vector logging */
 
-       memcpy(&tx_bits_log[OFDM_BITSPERFRAME*f], test_bits_ofdm, sizeof(int)*OFDM_BITSPERFRAME);
+       memcpy(&tx_bits_log[OFDM_BITSPERFRAME*f], tx_bits, sizeof(int)*OFDM_BITSPERFRAME);
        memcpy(&tx_log[samples_per_frame*f], tx, sizeof(COMP)*samples_per_frame);
     }
 
@@ -298,6 +350,28 @@ int main(int argc, char *argv[])
         Demod2D(symbol_likelihood, ldpc_codeword_symbols, S_matrix, EsNo, ldpc_codeword_symbol_amps,  CODED_BITSPERFRAME/OFDM_BPS);
         Somap(bit_likelihood, symbol_likelihood, CODED_BITSPERFRAME/OFDM_BPS);
 
+        int    iter;
+        double llr[CODED_BITSPERFRAME];
+        char   out_char[CODED_BITSPERFRAME];
+        int    parityCheckCount;
+        
+        
+        // fprintf(stderr, "\n");
+        for(i=0; i<CODED_BITSPERFRAME; i++) {
+            llr[i] = -bit_likelihood[i];
+            // fprintf(stderr, "%f ", llr[i]);
+        }
+        
+        //fprintf(stderr, "\n");
+        
+        iter = run_ldpc_decoder(&ldpc, out_char, llr, &parityCheckCount);
+        /*
+          fprintf(stderr, "iter: %d parityCheckCount: %d\n", iter, parityCheckCount);
+        for(i=0; i<CODED_BITSPERFRAME; i++) {
+            fprintf(stderr, "%d ", out_char[i]);
+        }
+        */
+        
         /* rx vector logging -----------------------------------*/
 
         assert(nin_tot < samples_per_frame*NFRAMES);
@@ -346,6 +420,7 @@ int main(int argc, char *argv[])
         }
         for(i=0; i<CODED_BITSPERFRAME; i++) {
             bit_likelihood_log[CODED_BITSPERFRAME*f + i] =  bit_likelihood[i];
+            detected_data_log[CODED_BITSPERFRAME*f + i] = out_char[i];
         }
     }
 
@@ -377,6 +452,7 @@ int main(int argc, char *argv[])
     octave_save_int(fout, "rx_bits_log_c", rx_bits_log, 1, OFDM_BITSPERFRAME*NFRAMES);
     octave_save_float(fout, "symbol_likelihood_log_c", symbol_likelihood_log, (CODED_BITSPERFRAME/OFDM_BPS) * (1<<OFDM_BPS) * NFRAMES, 1, 1);
     octave_save_float(fout, "bit_likelihood_log_c", bit_likelihood_log, CODED_BITSPERFRAME * NFRAMES, 1, 1);
+    octave_save_int(fout, "detected_data_log_c", detected_data_log, 1, CODED_BITSPERFRAME*NFRAMES);
     fclose(fout);
 
     ofdm_destroy(ofdm);