PDSCH decoder multi has been modified for future parallel decoding of codewords.

This commit is contained in:
Xavier Arteaga 2017-07-25 15:35:25 +02:00
parent 6142a5f9e5
commit 19bc98081a
3 changed files with 38 additions and 35 deletions

View File

@ -108,11 +108,12 @@ SRSLTE_API int srslte_dlsch_decode(srslte_sch_t *q,
int16_t *e_bits,
uint8_t *data);
SRSLTE_API int srslte_dlsch_decode_multi(srslte_sch_t *q,
SRSLTE_API int srslte_dlsch_decode2(srslte_sch_t *q,
srslte_pdsch_cfg_t *cfg,
srslte_softbuffer_rx_t softbuffers[SRSLTE_MAX_CODEWORDS],
int16_t *e_bits[SRSLTE_MAX_CODEWORDS],
uint8_t *data[SRSLTE_MAX_CODEWORDS]);
srslte_softbuffer_rx_t *softbuffer,
int16_t *e_bits,
uint8_t *data,
int codeword_idx);
SRSLTE_API int srslte_ulsch_encode(srslte_sch_t *q,
srslte_pusch_cfg_t *cfg,

View File

@ -33,6 +33,8 @@
#include <assert.h>
#include <math.h>
#include <srslte/phy/phch/pdsch.h>
#include <srslte/phy/phch/ra.h>
#include <srslte/phy/phch/pdsch_cfg.h>
#include "prb_dl.h"
#include "srslte/phy/phch/pdsch.h"
@ -488,7 +490,8 @@ int srslte_pdsch_decode_multi(srslte_pdsch_t *q,
/* Set pointers for layermapping & precoding */
uint32_t i, n;
cf_t *x[SRSLTE_MAX_LAYERS];
int ret = 0;
if (q != NULL &&
sf_symbols != NULL &&
data != NULL &&
@ -564,26 +567,14 @@ int srslte_pdsch_decode_multi(srslte_pdsch_t *q,
* The MAX-log-MAP algorithm used in turbo decoding is unsensitive to SNR estimation,
* thus we don't need tot set it in the LLRs normalization
*/
if (cfg->nbits.nof_re) {
if (cfg->nbits.nof_bits) {
INFO("Decoding CW 0 (%d bits)\n", cfg->nbits.nof_bits);
srslte_demod_soft_demodulate_s(cfg->grant.mcs.mod, q->d, q->e, cfg->nbits.nof_re);
}
if (cfg->nbits2.nof_re) {
srslte_demod_soft_demodulate_s(cfg->grant.mcs2.mod, q->d2, q->e2, cfg->nbits2.nof_re);
}
/* descramble */
if (q->users[rnti] && q->users[rnti]->sequence_generated) {
if (cfg->nbits.nof_bits) {
if (q->users[rnti] && q->users[rnti]->sequence_generated) {
srslte_scrambling_s_offset(&q->users[rnti]->seq[cfg->sf_idx], q->e, 0, cfg->nbits.nof_bits);
}
if (cfg->nbits2.nof_bits) {
srslte_scrambling_s_offset(&q->users[rnti]->seq2[cfg->sf_idx], q->e2, 0, cfg->nbits2.nof_bits);
}
} else {
srslte_sequence_t seq;
if (cfg->nbits.nof_bits) {
} else {
srslte_sequence_t seq;
if (srslte_sequence_pdsch(&seq, rnti, 0, 2 * cfg->sf_idx, q->cell.id, cfg->nbits.nof_bits)) {
return SRSLTE_ERROR;
}
@ -591,22 +582,34 @@ int srslte_pdsch_decode_multi(srslte_pdsch_t *q,
srslte_sequence_free(&seq);
}
if (cfg->nbits2.nof_bits) {
ret |= srslte_dlsch_decode2(&q->dl_sch, cfg, &softbuffers[0], q->e, data[0], 0);
}
if (cfg->nbits2.nof_bits) {
INFO("Decoding CW 1 (%d bits)\n", cfg->nbits2.nof_bits);
srslte_demod_soft_demodulate_s(cfg->grant.mcs2.mod, q->d2, q->e2, cfg->nbits2.nof_re);
if (q->users[rnti] && q->users[rnti]->sequence_generated) {
srslte_scrambling_s_offset(&q->users[rnti]->seq2[cfg->sf_idx], q->e2, 0, cfg->nbits2.nof_bits);
} else {
srslte_sequence_t seq;
if (srslte_sequence_pdsch(&seq, rnti, 1, 2 * cfg->sf_idx, q->cell.id, cfg->nbits2.nof_bits)) {
return SRSLTE_ERROR;
}
srslte_scrambling_s_offset(&seq, q->e2, 0, cfg->nbits2.nof_bits);
srslte_sequence_free(&seq);
}
ret |= srslte_dlsch_decode2(&q->dl_sch, cfg, &softbuffers[1], q->e2, data[1], 1);
}
if (SRSLTE_VERBOSE_ISDEBUG()) {
DEBUG("SAVED FILE llr.dat: LLR estimates after demodulation and descrambling\n",0);
srslte_vec_save_file("llr.dat", q->e, cfg->nbits.nof_bits*sizeof(int16_t));
}
return srslte_dlsch_decode_multi(&q->dl_sch, cfg, softbuffers, (int16_t *[SRSLTE_MAX_CODEWORDS]) {q->e, q->e2},
data);
return ret;
} else {
return SRSLTE_ERROR_INVALID_INPUTS;

View File

@ -524,29 +524,28 @@ int srslte_dlsch_decode(srslte_sch_t *q, srslte_pdsch_cfg_t *cfg, srslte_softbuf
}
int srslte_dlsch_decode_multi(srslte_sch_t *q, srslte_pdsch_cfg_t *cfg, srslte_softbuffer_rx_t softbuffers[SRSLTE_MAX_CODEWORDS],
int16_t *e_bits[SRSLTE_MAX_CODEWORDS], uint8_t *data[SRSLTE_MAX_CODEWORDS])
int srslte_dlsch_decode2(srslte_sch_t *q, srslte_pdsch_cfg_t *cfg, srslte_softbuffer_rx_t *softbuffer,
int16_t *e_bits, uint8_t *data, int codeword_idx)
{
int ret = SRSLTE_SUCCESS;
uint32_t Nl = 1;
if (cfg->nof_layers != cfg->grant.nof_tb) {
Nl = 2;
}
if (cfg->nbits.nof_bits) {
ret |= decode_tb(q, &softbuffers[0], &cfg->cb_segm,
if (codeword_idx == 0) {
return decode_tb(q, softbuffer, &cfg->cb_segm,
cfg->grant.Qm*Nl, cfg->rv, cfg->nbits.nof_bits,
e_bits[0], data[0]);
e_bits, data);
}
if (cfg->nbits2.nof_bits) {
ret |= decode_tb(q, &softbuffers[1], &cfg->cb_segm2,
if (codeword_idx == 1) {
return decode_tb(q, softbuffer, &cfg->cb_segm2,
cfg->grant.Qm2*Nl, cfg->rv2, cfg->nbits2.nof_bits,
e_bits[1], data[1]);
e_bits, data);
}
return ret;
return SRSLTE_ERROR;
}
/**