diff options
| author | drowe67 <[email protected]> | 2024-04-05 19:33:46 +1030 |
|---|---|---|
| committer | David Rowe <[email protected]> | 2024-04-05 19:33:46 +1030 |
| commit | c0821c86e7a0f6923e1f3c72631371c3296c94bc (patch) | |
| tree | bde93e416e2fa5233d8a03a6ab2952e4f112af64 | |
| parent | 73482ea69de469986a23172509624a2e450bc273 (diff) | |
refactoring to support QAM16 LDPC decode
| -rw-r--r-- | src/freedv_2020.c | 2 | ||||
| -rw-r--r-- | src/freedv_700.c | 2 | ||||
| -rw-r--r-- | src/mpdecode_core.c | 35 | ||||
| -rw-r--r-- | src/mpdecode_core.h | 6 | ||||
| -rw-r--r-- | src/ofdm_demod.c | 2 | ||||
| -rw-r--r-- | src/reliable_text.c | 3 | ||||
| -rw-r--r-- | unittest/tofdm.c | 4 |
7 files changed, 24 insertions, 30 deletions
diff --git a/src/freedv_2020.c b/src/freedv_2020.c index 9963819..83e1f54 100644 --- a/src/freedv_2020.c +++ b/src/freedv_2020.c @@ -286,7 +286,7 @@ int freedv_comprx_2020(struct freedv *f, COMP demod_in[]) { } symbols_to_llrs(llr, codeword_symbols_de, codeword_amps_de, EsNo, - ofdm->mean_amp, coded_syms_per_frame); + ofdm->mean_amp, ofdm->bps, coded_syms_per_frame); ldpc_decode_frame(ldpc, &parityCheckCount, &iter, out_char, llr); if (parityCheckCount != ldpc->NumberParityBits) rx_status |= FREEDV_RX_BIT_ERRORS; diff --git a/src/freedv_700.c b/src/freedv_700.c index 257b80f..40aa2c0 100644 --- a/src/freedv_700.c +++ b/src/freedv_700.c @@ -504,7 +504,7 @@ int freedv_comp_short_rx_ofdm(struct freedv *f, void *demod_in_8kHz, float llr[Npayloadbitsperpacket]; uint8_t decoded_codeword[Npayloadbitsperpacket]; symbols_to_llrs(llr, payload_syms_de, payload_amps_de, EsNo, - ofdm->mean_amp, Npayloadsymsperpacket); + ofdm->mean_amp, ofdm->bps, Npayloadsymsperpacket); ldpc_decode_frame(ldpc, &parityCheckCount, &iter, decoded_codeword, llr); // iter = run_ldpc_decoder(ldpc, decoded_codeword, llr, // &parityCheckCount); diff --git a/src/mpdecode_core.c b/src/mpdecode_core.c index 5374255..65b2be6 100644 --- a/src/mpdecode_core.c +++ b/src/mpdecode_core.c @@ -565,17 +565,14 @@ void sd_to_llr(float llr[], float sd[], int n) { */ void Demod2D(float symbol_likelihood[], /* output, M*number_symbols */ - COMP r[], /* received QPSK symbols, number_symbols */ - COMP S_matrix[], /* constellation of size M */ - float EsNo, - float fading[], /* real fading values, number_symbols */ + COMP r[], /* received PSK symbols, number_symbols */ + COMP S_matrix[], /* constellation of size M */ + int M, float EsNo, + float fading[], /* real fading values, number_symbols */ float mean_amp, int number_symbols) { - int M = QPSK_CONSTELLATION_SIZE; int i, j; float tempsr, tempsi, Er, Ei; - /* determine output */ - for (i = 0; i < number_symbols; i++) { /* go through each received symbol */ for (j = 0; j < M; j++) { /* each postulated symbol */ tempsr = fading[i] * S_matrix[j].real / mean_amp; @@ -583,10 +580,7 @@ void Demod2D(float symbol_likelihood[], /* output, M*number_symbols */ Er = r[i].real / mean_amp - tempsr; Ei = r[i].imag / mean_amp - tempsi; symbol_likelihood[i * M + j] = -EsNo * (Er * Er + Ei * Ei); - // printf("symbol_likelihood[%d][%d] = %f\n", - // i,j,symbol_likelihood[i*M+j]); } - // exit(0); } } @@ -633,18 +627,17 @@ void Somap(float bit_likelihood[], /* number_bits, bps*number_symbols */ } } -void symbols_to_llrs(float llr[], COMP rx_qpsk_symbols[], float rx_amps[], - float EsNo, float mean_amp, int nsyms) { +void symbols_to_llrs(float llr[], COMP rx_psk_symbols[], float rx_amps[], + float EsNo, float mean_amp, int bps, int nsyms) { int i; - - float symbol_likelihood[nsyms * QPSK_CONSTELLATION_SIZE]; - float bit_likelihood[nsyms * QPSK_BITS_PER_SYMBOL]; - - Demod2D(symbol_likelihood, rx_qpsk_symbols, S_matrix, EsNo, rx_amps, mean_amp, - nsyms); - Somap(bit_likelihood, symbol_likelihood, QPSK_CONSTELLATION_SIZE, - QPSK_BITS_PER_SYMBOL, nsyms); - for (i = 0; i < nsyms * QPSK_BITS_PER_SYMBOL; i++) { + int constellation_points = 1 << bps; + float symbol_likelihood[nsyms * constellation_points]; + float bit_likelihood[nsyms * bps]; + + Demod2D(symbol_likelihood, rx_psk_symbols, S_matrix, constellation_points, + EsNo, rx_amps, mean_amp, nsyms); + Somap(bit_likelihood, symbol_likelihood, constellation_points, bps, nsyms); + for (i = 0; i < nsyms * bps; i++) { llr[i] = -bit_likelihood[i]; } } diff --git a/src/mpdecode_core.h b/src/mpdecode_core.h index 95ead46..d36a1f0 100644 --- a/src/mpdecode_core.h +++ b/src/mpdecode_core.h @@ -47,12 +47,12 @@ int run_ldpc_decoder(struct LDPC *ldpc, uint8_t out_char[], float input[], int *parityCheckCount); void sd_to_llr(float llr[], float sd[], int n); -void Demod2D(float symbol_likelihood[], COMP r[], COMP S_matrix[], float EsNo, - float fading[], float mean_amp, int number_symbols); +void Demod2D(float symbol_likelihood[], COMP r[], COMP S_matrix[], int M, + float EsNo, float fading[], float mean_amp, int number_symbols); void Somap(float bit_likelihood[], float symbol_likelihood[], int M, int bps, int number_symbols); void symbols_to_llrs(float llr[], COMP rx_qpsk_symbols[], float rx_amps[], - float EsNo, float mean_amp, int nsyms); + float EsNo, float mean_amp, int bps, int nsyms); void fsk_rx_filt_to_llrs(float llr[], float rx_filt[], float v_est, float SNRest, int M, int nsyms); diff --git a/src/ofdm_demod.c b/src/ofdm_demod.c index f8dc7a5..e855e5e 100644 --- a/src/ofdm_demod.c +++ b/src/ofdm_demod.c @@ -500,7 +500,7 @@ int main(int argc, char *argv[]) { } symbols_to_llrs(llr, payload_syms_de, payload_amps_de, EsNo, - ofdm->mean_amp, Npayloadsymsperpacket); + ofdm->mean_amp, ofdm->bps, Npayloadsymsperpacket); assert(Ndatabitsperpacket == ldpc.data_bits_per_frame); ldpc_decode_frame(&ldpc, &parityCheckCount, &iter, out_char, llr); diff --git a/src/reliable_text.c b/src/reliable_text.c index 8a5ba21..ff7c5c0 100644 --- a/src/reliable_text.c +++ b/src/reliable_text.c @@ -182,7 +182,8 @@ static int reliable_text_ldpc_decode(reliable_text_impl_t* obj, char* dest) { float EsNo = 3.0; // note: constant from freedv_700.c symbols_to_llrs(llr, (COMP*)deinterleavedSyms, deinterleavedAmps, EsNo, - obj->fdv->ofdm->mean_amp, Npayloadsymsperpacket); + obj->fdv->ofdm->mean_amp, obj->fdv->ofdm->bps, + Npayloadsymsperpacket); } else { // Deinterlace the received bits. gp_deinterleave_bits(deinterleavedBits, src, LDPC_TOTAL_SIZE_BITS / 2); diff --git a/unittest/tofdm.c b/unittest/tofdm.c index 0efcc60..a6b139f 100644 --- a/unittest/tofdm.c +++ b/unittest/tofdm.c @@ -475,8 +475,8 @@ int main(int argc, char *argv[]) { float *ldpc_codeword_symbol_amps = &ofdm->rx_amp[(ofdm_nuwbits + ofdm_ntxtbits) / ofdm_bps]; - Demod2D(symbol_likelihood, ldpc_codeword_symbols, S_matrix, EsNo, - ldpc_codeword_symbol_amps, ofdm->mean_amp, + Demod2D(symbol_likelihood, ldpc_codeword_symbols, S_matrix, 1 << ofdm_bps, + EsNo, ldpc_codeword_symbol_amps, ofdm->mean_amp, CODED_BITSPERFRAME / ofdm_bps); Somap(bit_likelihood, symbol_likelihood, 1 << ofdm_bps, ofdm_bps, CODED_BITSPERFRAME / ofdm_bps); |
