Fixed PDSCH test with OFDM

This commit is contained in:
Xavier Arteaga 2018-05-25 12:24:40 +02:00
parent 31496ab44c
commit 63df8d4c19
1 changed files with 58 additions and 27 deletions

View File

@ -142,6 +142,7 @@ void parse_args(int argc, char **argv) {
static uint8_t *data_tx[SRSLTE_MAX_CODEWORDS] = {NULL};
static uint8_t *data_rx[SRSLTE_MAX_CODEWORDS] = {NULL};
cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS];
cf_t *ce_dummy[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS];
srslte_softbuffer_rx_t *softbuffers_rx[SRSLTE_MAX_CODEWORDS];
srslte_ra_dl_grant_t grant;
srslte_pdsch_cfg_t pdsch_cfg;
@ -152,7 +153,8 @@ cf_t *rx_sf_symbols[SRSLTE_MAX_PORTS];
cf_t *tx_slot_symbols[SRSLTE_MAX_PORTS];
cf_t *rx_slot_symbols[SRSLTE_MAX_PORTS];
srslte_pdsch_t pdsch_tx, pdsch_rx;
srslte_ofdm_t ofdm_tx, ofdm_rx;
srslte_ofdm_t ofdm_tx[SRSLTE_MAX_PORTS], ofdm_rx[SRSLTE_MAX_PORTS];
srslte_chest_dl_t chest_dl;
int main(int argc, char **argv) {
uint32_t i, j, k;
@ -169,6 +171,7 @@ int main(int argc, char **argv) {
bzero(&pdsch_rx, sizeof(srslte_pdsch_t));
bzero(&pdsch_cfg, sizeof(srslte_pdsch_cfg_t));
bzero(ce, sizeof(cf_t*)*SRSLTE_MAX_PORTS);
bzero(ce_dummy, sizeof(cf_t*)*SRSLTE_MAX_PORTS);
bzero(tx_slot_symbols, sizeof(cf_t*)*SRSLTE_MAX_PORTS);
bzero(rx_slot_symbols, sizeof(cf_t*)*SRSLTE_MAX_PORTS);
@ -213,22 +216,6 @@ int main(int argc, char **argv) {
return ret;
}
#ifdef DO_OFDM
srslte_ofdm_tx_init(&ofdm_tx, cell.cp, cell.nof_prb);
srslte_ofdm_rx_init(&ofdm_rx, cell.cp, cell.nof_prb);
srslte_ofdm_set_normalize(&ofdm_tx, true);
srslte_ofdm_set_normalize(&ofdm_rx, true);
for (i = 0; i < cell.nof_ports; i++) {
tx_sf_symbols[i] = srslte_vec_malloc(sizeof(cf_t) * SRSLTE_SF_LEN_PRB(cell.nof_prb));
}
for (i = 0; i < nof_rx_antennas; i++) {
rx_sf_symbols[i] = srslte_vec_malloc(sizeof(cf_t) * SRSLTE_SF_LEN_PRB(cell.nof_prb));
}
#endif /* DO_OFDM */
/* Configure PDSCH */
if (srslte_pdsch_cfg_mimo(&pdsch_cfg, cell, &grant, cfi, subframe, rv_idx, mimo_type, pmi)) {
fprintf(stderr, "Error configuring PDSCH\n");
@ -243,6 +230,11 @@ int main(int argc, char **argv) {
perror("srslte_vec_malloc");
goto quit;
}
ce_dummy[i][j] = srslte_vec_malloc(sizeof(cf_t) * NOF_CE_SYMBOLS);
if (!ce_dummy[i][j]) {
perror("srslte_vec_malloc");
goto quit;
}
for (k = 0; k < NOF_CE_SYMBOLS; k++) {
ce[i][j][k] = (i == j) ? 1.0f : 0.0f;
}
@ -254,6 +246,42 @@ int main(int argc, char **argv) {
}
}
for (i = 0; i < cell.nof_ports; i++) {
tx_slot_symbols[i] = calloc(SRSLTE_SF_LEN_RE(cell.nof_prb, cell.cp), sizeof(cf_t));
if (!tx_slot_symbols[i]) {
perror("srslte_vec_malloc");
goto quit;
}
}
#ifdef DO_OFDM
for (i = 0; i < cell.nof_ports; i++) {
tx_sf_symbols[i] = srslte_vec_malloc(sizeof(cf_t) * SRSLTE_SF_LEN_PRB(cell.nof_prb));
}
for (i = 0; i < nof_rx_antennas; i++) {
rx_sf_symbols[i] = srslte_vec_malloc(sizeof(cf_t) * SRSLTE_SF_LEN_PRB(cell.nof_prb));
}
for (k = 0; k < cell.nof_ports; k++) {
srslte_ofdm_tx_init(&ofdm_tx[k], cell.cp, tx_slot_symbols[k], tx_sf_symbols[k], cell.nof_prb);
srslte_ofdm_set_normalize(&ofdm_tx[k], true);
}
for (k = 0; k < nof_rx_antennas; k++) {
srslte_ofdm_rx_init(&ofdm_rx[k], cell.cp, rx_sf_symbols[k], rx_slot_symbols[k], cell.nof_prb);
srslte_ofdm_set_normalize(&ofdm_rx[k], true);
}
if (srslte_chest_dl_init(&chest_dl, cell.nof_prb)) {
goto quit;
}
srslte_chest_dl_set_cell(&chest_dl, cell);
srslte_chest_dl_set_smooth_filter_gauss(&chest_dl, 4, 1.0f);
srslte_chest_dl_average_subframe(&chest_dl, true);
#endif /* DO_OFDM */
for (i = 0; i < SRSLTE_MAX_TB; i++) {
if (grant.tb_en[i]) {
@ -376,14 +404,6 @@ int main(int argc, char **argv) {
}
}
for (i = 0; i < cell.nof_ports; i++) {
tx_slot_symbols[i] = calloc(SRSLTE_SF_LEN_RE(cell.nof_prb, cell.cp), sizeof(cf_t));
if (!tx_slot_symbols[i]) {
perror("srslte_vec_malloc");
goto quit;
}
}
for (int tb = 0; tb < SRSLTE_MAX_CODEWORDS; tb++) {
if (grant.tb_en[tb]) {
for (int byte = 0; byte < grant.mcs[tb].tbs / 8; byte++) {
@ -421,7 +441,7 @@ int main(int argc, char **argv) {
#ifdef DO_OFDM
for (i = 0; i < cell.nof_ports; i++) {
/* For each Tx antenna modulate OFDM */
srslte_ofdm_tx_sf(&ofdm_tx, tx_slot_symbols[i], tx_sf_symbols[i]);
srslte_ofdm_tx_sf(&ofdm_tx[i]);
}
/* combine outputs */
@ -455,8 +475,9 @@ int main(int argc, char **argv) {
#ifdef DO_OFDM
/* For each Rx antenna demodulate OFDM */
for (i = 0; i < nof_rx_antennas; i++) {
srslte_ofdm_rx_sf(&ofdm_rx, tx_sf_symbols[i], rx_slot_symbols[i]);
srslte_ofdm_rx_sf(&ofdm_rx[i]);
}
srslte_chest_dl_estimate_multi(&chest_dl, rx_slot_symbols, ce_dummy, subframe, nof_rx_antennas);
#endif
for (i = 0; i < SRSLTE_MAX_CODEWORDS; i++) {
if (grant.tb_en[i]) {
@ -506,6 +527,13 @@ int main(int argc, char **argv) {
ret = SRSLTE_SUCCESS;
quit:
for (i = 0; i < cell.nof_ports; i++) {
srslte_ofdm_tx_free(&ofdm_tx[i]);
}
for (i = 0; i < nof_rx_antennas; i++) {
srslte_ofdm_rx_free(&ofdm_rx[i]);
}
srslte_chest_dl_free(&chest_dl);
srslte_pdsch_free(&pdsch_tx);
srslte_pdsch_free(&pdsch_rx);
for (i = 0; i < SRSLTE_MAX_CODEWORDS; i++) {
@ -533,6 +561,9 @@ quit:
if (ce[i][j]) {
free(ce[i][j]);
}
if (ce_dummy[i][j]) {
free(ce_dummy[i][j]);
}
}
if (tx_slot_symbols[i]) {
free(tx_slot_symbols[i]);