#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
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 */
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++) {
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);
}
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);
}
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];
}
}
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);