From 415ef93dfa40743b6a8844cebf77a10944a8184f Mon Sep 17 00:00:00 2001 From: drowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63> Date: Fri, 13 Apr 2018 06:29:39 +0000 Subject: [PATCH] tofdm working with ldpc decoder git-svn-id: https://svn.code.sf.net/p/freetel/code@3475 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/unittest/tofdm.c | 86 ++++++++++++++++++++++++++++++++++--- 1 file changed, 81 insertions(+), 5 deletions(-) diff --git a/codec2-dev/unittest/tofdm.c b/codec2-dev/unittest/tofdm.c index 13659868..b0890d96 100644 --- a/codec2-dev/unittest/tofdm.c +++ b/codec2-dev/unittest/tofdm.c @@ -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); -- 2.25.1