diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c index 2d33e0f55b..bc33592b3a 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c @@ -1282,6 +1282,13 @@ static void inner_rx(PHY_VARS_gNB *gNB, memset(rxFext, 0, sizeof(c16_t) * nb_rx_ant * buffer_length); memset(chFext, 0, sizeof(c16_t) * nb_layer * nb_rx_ant* buffer_length); + int dmrs_symbol; + if (gNB->chest_time == 0) + dmrs_symbol = dmrs_symbol_flag ? symbol : get_valid_dmrs_idx_for_channel_est(rel15_ul->ul_dmrs_symb_pos, symbol); + else { // average of channel estimates stored in first symbol + int end_symbol = rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols; + dmrs_symbol = get_next_dmrs_symbol_in_slot(rel15_ul->ul_dmrs_symb_pos, rel15_ul->start_symbol_index, end_symbol); + } for (int aarx = 0; aarx < nb_rx_ant; aarx++) { for (int aatx = 0; aatx < nb_layer; aatx++) { @@ -1290,7 +1297,7 @@ static void inner_rx(PHY_VARS_gNB *gNB, rxFext[aarx], chFext[aatx][aarx], soffset+(symbol * frame_parms->ofdm_symbol_size), - pusch_vars->dmrs_symbol * frame_parms->ofdm_symbol_size, + dmrs_symbol * frame_parms->ofdm_symbol_size, aarx, dmrs_symbol_flag, rel15_ul, @@ -1412,15 +1419,7 @@ static void nr_pusch_symbol_processing(void *arg) int ulsch_id = rdata->ulsch_id; int slot = rdata->slot; NR_gNB_PUSCH *pusch_vars = &gNB->pusch_vars[ulsch_id]; - for (int symbol = rdata->startSymbol; symbol < rdata->startSymbol+rdata->numSymbols; symbol++) { - int dmrs_symbol_flag = (rel15_ul->ul_dmrs_symb_pos >> symbol) & 0x01; - if (dmrs_symbol_flag == 1) - { - if ((rel15_ul->ul_dmrs_symb_pos >> ((symbol + 1) % frame_parms->symbols_per_slot)) & 0x01) - AssertFatal(1==0,"Double DMRS configuration is not yet supported\n"); - gNB->pusch_vars[ulsch_id].dmrs_symbol = symbol; - } - + for (int symbol = rdata->startSymbol; symbol < rdata->startSymbol + rdata->numSymbols; symbol++) { if (gNB->pusch_vars[ulsch_id].ul_valid_re_per_slot[symbol] == 0) continue; int soffset = (slot % RU_RX_SLOT_DEPTH) * frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size; @@ -1469,7 +1468,6 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, nfapi_nr_pusch_pdu_t *rel15_ul = &gNB->ulsch[ulsch_id].harq_process->ulsch_pdu; NR_gNB_PUSCH *pusch_vars = &gNB->pusch_vars[ulsch_id]; - pusch_vars->dmrs_symbol = INVALID_VALUE; int nbSymb = 0; uint32_t bwp_start_subcarrier = ((rel15_ul->rb_start + rel15_ul->bwp_start) * NR_NB_SC_PER_RB + frame_parms->first_carrier_offset) % frame_parms->ofdm_symbol_size; LOG_D(PHY,"pusch %d.%d : bwp_start_subcarrier %d, rb_start %d, first_carrier_offset %d\n", frame,slot,bwp_start_subcarrier, rel15_ul->rb_start, frame_parms->first_carrier_offset); @@ -1481,13 +1479,12 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, start_meas(&gNB->ulsch_channel_estimation_stats); int max_ch = 0; uint32_t nvar = 0; - for(uint8_t symbol = rel15_ul->start_symbol_index; symbol < (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols); symbol++) { + int end_symbol = rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols; + for(uint8_t symbol = rel15_ul->start_symbol_index; symbol < end_symbol; symbol++) { uint8_t dmrs_symbol_flag = (rel15_ul->ul_dmrs_symb_pos >> symbol) & 0x01; LOG_D(PHY, "symbol %d, dmrs_symbol_flag :%d\n", symbol, dmrs_symbol_flag); if (dmrs_symbol_flag == 1) { - if (pusch_vars->dmrs_symbol == INVALID_VALUE) - pusch_vars->dmrs_symbol = symbol; for (int nl = 0; nl < rel15_ul->nrOfLayers; nl++) { uint32_t nvar_tmp = 0; @@ -1535,18 +1532,13 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, nvar /= (rel15_ul->nr_of_symbols * rel15_ul->nrOfLayers * frame_parms->nb_antennas_rx); // averaging time domain channel estimates - if (gNB->chest_time == 1) - { + if (gNB->chest_time == 1) nr_chest_time_domain_avg(frame_parms, pusch_vars->ul_ch_estimates, rel15_ul->nr_of_symbols, rel15_ul->start_symbol_index, rel15_ul->ul_dmrs_symb_pos, rel15_ul->rb_size); - pusch_vars->dmrs_symbol = get_next_dmrs_symbol_in_slot(rel15_ul->ul_dmrs_symb_pos, - rel15_ul->start_symbol_index, - rel15_ul->nr_of_symbols); - } stop_meas(&gNB->ulsch_channel_estimation_stats); @@ -1554,7 +1546,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, // Scrambling initialization int number_dmrs_symbols = 0; - for (int l = rel15_ul->start_symbol_index; l < rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols; l++) + for (int l = rel15_ul->start_symbol_index; l < end_symbol; l++) number_dmrs_symbols += ((rel15_ul->ul_dmrs_symb_pos)>>l) & 0x01; int nb_re_dmrs; if (rel15_ul->dmrs_config_type == pusch_dmrs_type1) @@ -1593,9 +1585,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, // first the computation of channel levels int nb_re_pusch = 0, meas_symbol = -1; - for(meas_symbol = rel15_ul->start_symbol_index; - meas_symbol < (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols); - meas_symbol++) + for(meas_symbol = rel15_ul->start_symbol_index; meas_symbol < end_symbol; meas_symbol++) if ((nb_re_pusch = get_nb_re_pusch(frame_parms,rel15_ul,meas_symbol)) > 0) break; @@ -1606,6 +1596,11 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, int soffset = (slot % RU_RX_SLOT_DEPTH) * frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size; nb_re_pusch = (nb_re_pusch + 15) & ~15; + int dmrs_symbol; + if (gNB->chest_time == 0) + dmrs_symbol = get_valid_dmrs_idx_for_channel_est(rel15_ul->ul_dmrs_symb_pos, meas_symbol); + else // average of channel estimates stored in first symbol + dmrs_symbol = get_next_dmrs_symbol_in_slot(rel15_ul->ul_dmrs_symb_pos, rel15_ul->start_symbol_index, end_symbol); for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) for (int aatx = 0; aatx < rel15_ul->nrOfLayers; aatx++) @@ -1614,7 +1609,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, (c16_t*)&pusch_vars->rxdataF_ext[aarx][meas_symbol * nb_re_pusch], (c16_t*)&pusch_vars->ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][meas_symbol * nb_re_pusch], soffset + meas_symbol * frame_parms->ofdm_symbol_size, - pusch_vars->dmrs_symbol * frame_parms->ofdm_symbol_size, + dmrs_symbol * frame_parms->ofdm_symbol_size, aarx, (rel15_ul->ul_dmrs_symb_pos >> meas_symbol) & 0x01, rel15_ul, @@ -1662,9 +1657,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, start_meas(&gNB->rx_pusch_symbol_processing_stats); int numSymbols = gNB->num_pusch_symbols_per_thread; - for(uint8_t symbol = rel15_ul->start_symbol_index; - symbol < (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols); - symbol += numSymbols) + for(uint8_t symbol = rel15_ul->start_symbol_index; symbol < end_symbol; symbol += numSymbols) { int total_res = 0; for (int s = 0; s < numSymbols;s++) { diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 1cb7d256fd..abab53fb4b 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -357,8 +357,6 @@ typedef struct { /// - first index: ? [0..3] (hard coded) /// - first index: ? [0..1179743] (hard coded) int16_t **llr_layers; - /// DMRS symbol index, to be updated every DMRS symbol within a slot. - uint8_t dmrs_symbol; // PTRS symbol index, to be updated every PTRS symbol within a slot. uint8_t ptrs_symbol_index; /// bit mask of PT-RS ofdm symbol indicies