From: drowe67 Date: Fri, 20 Apr 2018 21:25:07 +0000 (+0000) Subject: refactoring functions that can be reused in freedv_api X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=95b3c99fa29a6fb0ae078752f4860d1bf186d42e;p=freetel-svn-tracking.git refactoring functions that can be reused in freedv_api git-svn-id: https://svn.code.sf.net/p/freetel/code@3515 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/src/interldpc.c b/codec2-dev/src/interldpc.c index a7ff46c7..4c5c6904 100644 --- a/codec2-dev/src/interldpc.c +++ b/codec2-dev/src/interldpc.c @@ -33,10 +33,10 @@ #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; jsync_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