mirror of https://github.com/PentHertz/srsLTE.git
PDSCH decoder multi has been modified for future parallel decoding of codewords.
This commit is contained in:
parent
6142a5f9e5
commit
19bc98081a
|
@ -108,11 +108,12 @@ SRSLTE_API int srslte_dlsch_decode(srslte_sch_t *q,
|
||||||
int16_t *e_bits,
|
int16_t *e_bits,
|
||||||
uint8_t *data);
|
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_pdsch_cfg_t *cfg,
|
||||||
srslte_softbuffer_rx_t softbuffers[SRSLTE_MAX_CODEWORDS],
|
srslte_softbuffer_rx_t *softbuffer,
|
||||||
int16_t *e_bits[SRSLTE_MAX_CODEWORDS],
|
int16_t *e_bits,
|
||||||
uint8_t *data[SRSLTE_MAX_CODEWORDS]);
|
uint8_t *data,
|
||||||
|
int codeword_idx);
|
||||||
|
|
||||||
SRSLTE_API int srslte_ulsch_encode(srslte_sch_t *q,
|
SRSLTE_API int srslte_ulsch_encode(srslte_sch_t *q,
|
||||||
srslte_pusch_cfg_t *cfg,
|
srslte_pusch_cfg_t *cfg,
|
||||||
|
|
|
@ -33,6 +33,8 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <srslte/phy/phch/pdsch.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 "prb_dl.h"
|
||||||
#include "srslte/phy/phch/pdsch.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 */
|
/* Set pointers for layermapping & precoding */
|
||||||
uint32_t i, n;
|
uint32_t i, n;
|
||||||
cf_t *x[SRSLTE_MAX_LAYERS];
|
cf_t *x[SRSLTE_MAX_LAYERS];
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
if (q != NULL &&
|
if (q != NULL &&
|
||||||
sf_symbols != NULL &&
|
sf_symbols != NULL &&
|
||||||
data != 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,
|
* 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
|
* 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);
|
srslte_demod_soft_demodulate_s(cfg->grant.mcs.mod, q->d, q->e, cfg->nbits.nof_re);
|
||||||
}
|
|
||||||
|
|
||||||
if (cfg->nbits2.nof_re) {
|
if (q->users[rnti] && q->users[rnti]->sequence_generated) {
|
||||||
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) {
|
|
||||||
srslte_scrambling_s_offset(&q->users[rnti]->seq[cfg->sf_idx], q->e, 0, cfg->nbits.nof_bits);
|
srslte_scrambling_s_offset(&q->users[rnti]->seq[cfg->sf_idx], q->e, 0, cfg->nbits.nof_bits);
|
||||||
}
|
} else {
|
||||||
|
srslte_sequence_t seq;
|
||||||
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) {
|
|
||||||
if (srslte_sequence_pdsch(&seq, rnti, 0, 2 * cfg->sf_idx, q->cell.id, cfg->nbits.nof_bits)) {
|
if (srslte_sequence_pdsch(&seq, rnti, 0, 2 * cfg->sf_idx, q->cell.id, cfg->nbits.nof_bits)) {
|
||||||
return SRSLTE_ERROR;
|
return SRSLTE_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -591,22 +582,34 @@ int srslte_pdsch_decode_multi(srslte_pdsch_t *q,
|
||||||
srslte_sequence_free(&seq);
|
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)) {
|
if (srslte_sequence_pdsch(&seq, rnti, 1, 2 * cfg->sf_idx, q->cell.id, cfg->nbits2.nof_bits)) {
|
||||||
return SRSLTE_ERROR;
|
return SRSLTE_ERROR;
|
||||||
}
|
}
|
||||||
srslte_scrambling_s_offset(&seq, q->e2, 0, cfg->nbits2.nof_bits);
|
srslte_scrambling_s_offset(&seq, q->e2, 0, cfg->nbits2.nof_bits);
|
||||||
srslte_sequence_free(&seq);
|
srslte_sequence_free(&seq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret |= srslte_dlsch_decode2(&q->dl_sch, cfg, &softbuffers[1], q->e2, data[1], 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (SRSLTE_VERBOSE_ISDEBUG()) {
|
if (SRSLTE_VERBOSE_ISDEBUG()) {
|
||||||
DEBUG("SAVED FILE llr.dat: LLR estimates after demodulation and descrambling\n",0);
|
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));
|
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},
|
return ret;
|
||||||
data);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
return SRSLTE_ERROR_INVALID_INPUTS;
|
return SRSLTE_ERROR_INVALID_INPUTS;
|
||||||
|
|
|
@ -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],
|
int srslte_dlsch_decode2(srslte_sch_t *q, srslte_pdsch_cfg_t *cfg, srslte_softbuffer_rx_t *softbuffer,
|
||||||
int16_t *e_bits[SRSLTE_MAX_CODEWORDS], uint8_t *data[SRSLTE_MAX_CODEWORDS])
|
int16_t *e_bits, uint8_t *data, int codeword_idx)
|
||||||
{
|
{
|
||||||
int ret = SRSLTE_SUCCESS;
|
|
||||||
uint32_t Nl = 1;
|
uint32_t Nl = 1;
|
||||||
|
|
||||||
if (cfg->nof_layers != cfg->grant.nof_tb) {
|
if (cfg->nof_layers != cfg->grant.nof_tb) {
|
||||||
Nl = 2;
|
Nl = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cfg->nbits.nof_bits) {
|
if (codeword_idx == 0) {
|
||||||
ret |= decode_tb(q, &softbuffers[0], &cfg->cb_segm,
|
return decode_tb(q, softbuffer, &cfg->cb_segm,
|
||||||
cfg->grant.Qm*Nl, cfg->rv, cfg->nbits.nof_bits,
|
cfg->grant.Qm*Nl, cfg->rv, cfg->nbits.nof_bits,
|
||||||
e_bits[0], data[0]);
|
e_bits, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cfg->nbits2.nof_bits) {
|
if (codeword_idx == 1) {
|
||||||
ret |= decode_tb(q, &softbuffers[1], &cfg->cb_segm2,
|
return decode_tb(q, softbuffer, &cfg->cb_segm2,
|
||||||
cfg->grant.Qm2*Nl, cfg->rv2, cfg->nbits2.nof_bits,
|
cfg->grant.Qm2*Nl, cfg->rv2, cfg->nbits2.nof_bits,
|
||||||
e_bits[1], data[1]);
|
e_bits, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return SRSLTE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue