diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 4647525a7f..531d648463 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -205,19 +205,13 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB) gNB->pusch_vars = (NR_gNB_PUSCH *)malloc16_clear(gNB->max_nb_pusch * sizeof(NR_gNB_PUSCH)); for (int ULSCH_id = 0; ULSCH_id < gNB->max_nb_pusch; ULSCH_id++) { NR_gNB_PUSCH *pusch = &gNB->pusch_vars[ULSCH_id]; - pusch->rxdataF_ext = (int32_t **)malloc16(Prx * sizeof(int32_t *)); pusch->ul_ch_estimates = (int32_t **)malloc16(n_buf * sizeof(int32_t *)); - pusch->ul_ch_estimates_ext = (int32_t **)malloc16(n_buf * sizeof(int32_t *)); pusch->ptrs_phase_per_slot = (int32_t **)malloc16(n_buf * sizeof(int32_t *)); pusch->ul_ch_estimates_time = (int32_t **)malloc16(n_buf * sizeof(int32_t *)); pusch->rxdataF_comp = (int32_t **)malloc16(n_buf * sizeof(int32_t *)); pusch->llr_layers = (int16_t **)malloc16(max_ul_mimo_layers * sizeof(int32_t *)); - for (i = 0; i < Prx; i++) { - pusch->rxdataF_ext[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * nb_re_pusch2 * fp->symbols_per_slot); - } for (i = 0; i < n_buf; i++) { pusch->ul_ch_estimates[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * fp->ofdm_symbol_size * fp->symbols_per_slot); - pusch->ul_ch_estimates_ext[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * nb_re_pusch2 * fp->symbols_per_slot); pusch->ul_ch_estimates_time[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * fp->ofdm_symbol_size); pusch->ptrs_phase_per_slot[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * fp->symbols_per_slot); // symbols per slot pusch->rxdataF_comp[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * nb_re_pusch2 * fp->symbols_per_slot); @@ -287,20 +281,14 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB) NR_gNB_PUSCH *pusch_vars = &gNB->pusch_vars[ULSCH_id]; for (int i=0; i< max_ul_mimo_layers; i++) free_and_zero(pusch_vars->llr_layers[i]); - for (int i = 0; i < Prx; i++) { - free_and_zero(pusch_vars->rxdataF_ext[i]); - } for (int i = 0; i < n_buf; i++) { free_and_zero(pusch_vars->ul_ch_estimates[i]); - free_and_zero(pusch_vars->ul_ch_estimates_ext[i]); free_and_zero(pusch_vars->ul_ch_estimates_time[i]); free_and_zero(pusch_vars->ptrs_phase_per_slot[i]); free_and_zero(pusch_vars->rxdataF_comp[i]); } free_and_zero(pusch_vars->llr_layers); - free_and_zero(pusch_vars->rxdataF_ext); free_and_zero(pusch_vars->ul_ch_estimates); - free_and_zero(pusch_vars->ul_ch_estimates_ext); free_and_zero(pusch_vars->ptrs_phase_per_slot); free_and_zero(pusch_vars->ul_ch_estimates_time); free_and_zero(pusch_vars->ul_valid_re_per_slot); diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c index b8f88125ee..e76638f7d7 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c @@ -288,14 +288,11 @@ static void nr_ulsch_extract_rbs(c16_t* const rxdataF, NR_DL_FRAME_PARMS *frame_parms) { uint8_t delta = 0; - int start_re = (frame_parms->first_carrier_offset + (pusch_pdu->rb_start + pusch_pdu->bwp_start) * NR_NB_SC_PER_RB)%frame_parms->ofdm_symbol_size; int nb_re_pusch = NR_NB_SC_PER_RB * pusch_pdu->rb_size; - - - c16_t *rxF = &rxdataF[rxoffset]; - c16_t *rxF_ext = &rxFext[0]; - c16_t *ul_ch0 = &chF[choffset]; + c16_t *rxF = &rxdataF[rxoffset]; + c16_t *rxF_ext = &rxFext[0]; + c16_t *ul_ch0 = &chF[choffset]; c16_t *ul_ch0_ext = &chFext[0]; if (is_dmrs_symbol == 0) { @@ -307,11 +304,11 @@ static void nr_ulsch_extract_rbs(c16_t* const rxdataF, memcpy(rxF_ext, &rxF[start_re], neg_length * sizeof(c16_t)); memcpy(&rxF_ext[neg_length], rxF, pos_length * sizeof(c16_t)); } - memcpy(ul_ch0_ext, ul_ch0, nb_re_pusch * sizeof(c16_t)); + memcpy(ul_ch0_ext, ul_ch0, nb_re_pusch * sizeof(c16_t)); } else if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1) { // 6 REs / PRB AssertFatal(delta == 0 || delta == 1, "Illegal delta %d\n",delta); - c16_t *rxF32 = &rxF[start_re]; + c16_t *rxF32 = &rxF[start_re]; if (start_re + nb_re_pusch < frame_parms->ofdm_symbol_size) { for (int idx = 1 - delta; idx < nb_re_pusch; idx += 2) { *rxF_ext++ = rxF32[idx]; @@ -367,7 +364,8 @@ static void nr_ulsch_extract_rbs(c16_t* const rxdataF, } } -static void nr_ulsch_scale_channel(int **ul_ch_estimates_ext, +static void nr_ulsch_scale_channel(int size_est, + int ul_ch_estimates_ext[][size_est], NR_DL_FRAME_PARMS *frame_parms, uint8_t symbol, uint8_t is_dmrs_symbol, @@ -419,7 +417,8 @@ static int get_nb_re_pusch (NR_DL_FRAME_PARMS *frame_parms, nfapi_nr_pusch_pdu_t } // compute average channel_level on each (TX,RX) antenna pair -static void nr_ulsch_channel_level(int **ul_ch_estimates_ext, +static void nr_ulsch_channel_level(int size_est, + int ul_ch_estimates_ext[][size_est], NR_DL_FRAME_PARMS *frame_parms, int32_t *avg, uint8_t symbol, @@ -436,7 +435,7 @@ static void nr_ulsch_channel_level(int **ul_ch_estimates_ext, //clear average level avg128U = simde_mm_setzero_si128(); - ul_ch128 = (simde__m128i *)&ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol * len]; + ul_ch128 = (simde__m128i *)&ul_ch_estimates_ext[aatx * frame_parms->nb_antennas_rx + aarx][symbol * len]; for (int i = 0; i < len >> 2; i++) { avg128U = simde_mm_add_epi32(avg128U, simde_mm_srai_epi32(simde_mm_madd_epi16(ul_ch128[i], ul_ch128[i]), x)); @@ -1505,9 +1504,9 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, pusch_vars->ulsch_power[aarx] = 0; pusch_vars->ulsch_noise_power[aarx] = 0; } - for (int aatx = 0; aatx < rel15_ul->nrOfLayers; aatx++) { + for (int nl = 0; nl < rel15_ul->nrOfLayers; nl++) { pusch_vars->ulsch_power[aarx] += signal_energy_nodc( - (c16_t*)&pusch_vars->ul_ch_estimates[aatx * gNB->frame_parms.nb_antennas_rx + aarx][symbol * frame_parms->ofdm_symbol_size], + (c16_t*)&pusch_vars->ul_ch_estimates[nl * gNB->frame_parms.nb_antennas_rx + aarx][symbol * frame_parms->ofdm_symbol_size], rel15_ul->rb_size * 12); } for (int rb = 0; rb < rel15_ul->rb_size; rb++) @@ -1592,17 +1591,21 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, 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); - + int size_est = nb_re_pusch * frame_parms->symbols_per_slot; + __attribute__((aligned(32))) int ul_ch_estimates_ext[rel15_ul->nrOfLayers * frame_parms->nb_antennas_rx][size_est]; + memset(ul_ch_estimates_ext, 0, sizeof(ul_ch_estimates_ext)); + int buffer_length = rel15_ul->rb_size * NR_NB_SC_PER_RB; + c16_t temp_rxFext[frame_parms->nb_antennas_rx][buffer_length] __attribute__((aligned(32))); for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) - for (int aatx = 0; aatx < rel15_ul->nrOfLayers; aatx++) + for (int nl = 0; nl < rel15_ul->nrOfLayers; nl++) nr_ulsch_extract_rbs(gNB->common_vars.rxdataF[aarx], - (c16_t*)pusch_vars->ul_ch_estimates[aatx * frame_parms->nb_antennas_rx + aarx], - (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], + (c16_t *)pusch_vars->ul_ch_estimates[nl * frame_parms->nb_antennas_rx + aarx], + temp_rxFext[aarx], + (c16_t*)&ul_ch_estimates_ext[nl * frame_parms->nb_antennas_rx + aarx][meas_symbol * nb_re_pusch], soffset + meas_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->ul_dmrs_symb_pos >> meas_symbol) & 0x01, rel15_ul, frame_parms); @@ -1613,7 +1616,8 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, //---------------------------------------------------------- //--------------------- Channel Scaling -------------------- //---------------------------------------------------------- - nr_ulsch_scale_channel(pusch_vars->ul_ch_estimates_ext, + nr_ulsch_scale_channel(size_est, + ul_ch_estimates_ext, frame_parms, meas_symbol, (rel15_ul->ul_dmrs_symb_pos >> meas_symbol) & 0x01, @@ -1622,16 +1626,17 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, rel15_ul->rb_size, shift_ch_ext); - nr_ulsch_channel_level(pusch_vars->ul_ch_estimates_ext, + nr_ulsch_channel_level(size_est, + ul_ch_estimates_ext, frame_parms, avg, meas_symbol, // index of the start symbol nb_re_pusch, // number of the re in pusch rel15_ul->nrOfLayers); - for (int aatx = 0; aatx < rel15_ul->nrOfLayers; aatx++) + for (int nl = 0; nl < rel15_ul->nrOfLayers; nl++) for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) - avgs = cmax(avgs, avg[aatx*frame_parms->nb_antennas_rx+aarx]); + avgs = cmax(avgs, avg[nl * frame_parms->nb_antennas_rx + aarx]); pusch_vars->log2_maxh = (log2_approx(avgs) >> 1); diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 629e8b2b66..fea27048de 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -286,10 +286,6 @@ typedef struct { typedef struct { - /// \brief Holds the received data in the frequency domain for the allocated RBs in repeated format. - /// - first index: rx antenna id [0..nb_antennas_rx[ - /// - second index: ? [0..2*ofdm_symbol_size[ - int32_t **rxdataF_ext; /// \brief Hold the channel estimates in time domain based on DRS. /// - first index: rx antenna id [0..nb_antennas_rx[ /// - second index: ? [0..4*ofdm_symbol_size[ @@ -298,10 +294,6 @@ typedef struct { /// - first index: rx antenna id [0..nb_antennas_rx[ /// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ int32_t **ul_ch_estimates; - /// \brief Uplink channel estimates extracted in PRBS. - /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx - /// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ - int32_t **ul_ch_estimates_ext; /// \brief Holds the compensated signal. /// - first index: rx antenna id [0..nb_antennas_rx[ /// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 3a30ae763f..06b9b7c46f 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -345,10 +345,7 @@ static void nr_postDecode(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req) ulsch_harq->ulsch_pdu.rb_size],ulsch_harq->ulsch_pdu.nr_of_symbols*(off+(NR_NB_SC_PER_RB * ulsch_harq->ulsch_pdu.rb_size)),1,1); LOG_M("chestF0.m","chF0", &gNB->pusch_vars[0].ul_ch_estimates[0][ulsch_harq->ulsch_pdu.start_symbol_index*gNB->frame_parms.ofdm_symbol_size],gNB->frame_parms.ofdm_symbol_size,1,1); - LOG_M("chestF0_ext.m","chF0_ext", - &gNB->pusch_vars[0]->ul_ch_estimates_ext[0][(ulsch_harq->ulsch_pdu.start_symbol_index+1)*(off+(NR_NB_SC_PER_RB * - ulsch_harq->ulsch_pdu.rb_size))], (ulsch_harq->ulsch_pdu.nr_of_symbols-1)*(off+(NR_NB_SC_PER_RB * - ulsch_harq->ulsch_pdu.rb_size)),1,1); LOG_M("rxsigF0_comp.m","rxsF0_comp", + LOG_M("rxsigF0_comp.m","rxsF0_comp", &gNB->pusch_vars[0].rxdataF_comp[0][ulsch_harq->ulsch_pdu.start_symbol_index*(off+(NR_NB_SC_PER_RB * ulsch_harq->ulsch_pdu.rb_size))],ulsch_harq->ulsch_pdu.nr_of_symbols*(off+(NR_NB_SC_PER_RB * ulsch_harq->ulsch_pdu.rb_size)),1,1); LOG_M("rxsigF0_llr.m","rxsF0_llr", @@ -360,10 +357,7 @@ static void nr_postDecode(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req) ulsch_harq->ulsch_pdu.rb_size],ulsch_harq->ulsch_pdu.nr_of_symbols*(off+(NR_NB_SC_PER_RB * ulsch_harq->ulsch_pdu.rb_size)),1,1); LOG_M("chestF1.m","chF1", &gNB->pusch_vars[0].ul_ch_estimates[1][ulsch_harq->ulsch_pdu.start_symbol_index*gNB->frame_parms.ofdm_symbol_size],gNB->frame_parms.ofdm_symbol_size,1,1); - LOG_M("chestF1_ext.m","chF1_ext", - &gNB->pusch_vars[0].ul_ch_estimates_ext[1][(ulsch_harq->ulsch_pdu.start_symbol_index+1)*(off+(NR_NB_SC_PER_RB * - ulsch_harq->ulsch_pdu.rb_size))], (ulsch_harq->ulsch_pdu.nr_of_symbols-1)*(off+(NR_NB_SC_PER_RB * - ulsch_harq->ulsch_pdu.rb_size)),1,1); LOG_M("rxsigF1_comp.m","rxsF1_comp", + LOG_M("rxsigF1_comp.m","rxsF1_comp", &gNB->pusch_vars[0].rxdataF_comp[1][ulsch_harq->ulsch_pdu.start_symbol_index*(off+(NR_NB_SC_PER_RB * ulsch_harq->ulsch_pdu.rb_size))],ulsch_harq->ulsch_pdu.nr_of_symbols*(off+(NR_NB_SC_PER_RB * ulsch_harq->ulsch_pdu.rb_size)),1,1); diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index bbcc5f0759..5403bedbf7 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -1266,30 +1266,20 @@ int main(int argc, char *argv[]) if (n_trials == 1 && round == 0) { __attribute__((unused)) int off = ((nb_rb & 1) == 1) ? 4 : 0; - LOG_M("rxsigF0_ext.m", - "rxsF0_ext", - &pusch_vars->rxdataF_ext[0][start_symbol * NR_NB_SC_PER_RB * pusch_pdu->rb_size], - nb_symb_sch * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size)), - 1, - 1); LOG_M("chestF0.m", "chF0", &pusch_vars->ul_ch_estimates[0][start_symbol * frame_parms->ofdm_symbol_size], frame_parms->ofdm_symbol_size, 1, 1); - LOG_M("chestF0_ext.m", - "chF0_ext", - &pusch_vars->ul_ch_estimates_ext[0][(start_symbol + 1) * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size))], - (nb_symb_sch - 1) * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size)), - 1, - 1); + LOG_M("rxsigF0_comp.m", "rxsF0_comp", &pusch_vars->rxdataF_comp[0][start_symbol * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size))], nb_symb_sch * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size)), 1, 1); + LOG_M("rxsigF0_llrlayers0.m", "rxsF0_llrlayers0", &pusch_vars->llr_layers[0][0], @@ -1298,12 +1288,6 @@ int main(int argc, char *argv[]) 0); if (precod_nbr_layers == 2) { - LOG_M("rxsigF1_ext.m", - "rxsF1_ext", - &pusch_vars->rxdataF_ext[1][start_symbol * NR_NB_SC_PER_RB * pusch_pdu->rb_size], - nb_symb_sch * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size)), - 1, - 1); LOG_M("chestF3.m", "chF3", @@ -1312,13 +1296,6 @@ int main(int argc, char *argv[]) 1, 1); - LOG_M("chestF3_ext.m", - "chF3_ext", - &pusch_vars->ul_ch_estimates_ext[3][(start_symbol + 1) * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size))], - (nb_symb_sch - 1) * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size)), - 1, - 1); - LOG_M("rxsigF2_comp.m", "rxsF2_comp", &pusch_vars->rxdataF_comp[2][start_symbol * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size))], @@ -1335,24 +1312,6 @@ int main(int argc, char *argv[]) } if (precod_nbr_layers == 4) { - LOG_M("rxsigF1_ext.m", - "rxsF1_ext", - &pusch_vars->rxdataF_ext[1][start_symbol * NR_NB_SC_PER_RB * pusch_pdu->rb_size], - nb_symb_sch * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size)), - 1, - 1); - LOG_M("rxsigF2_ext.m", - "rxsF2_ext", - &pusch_vars->rxdataF_ext[2][start_symbol * NR_NB_SC_PER_RB * pusch_pdu->rb_size], - nb_symb_sch * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size)), - 1, - 1); - LOG_M("rxsigF3_ext.m", - "rxsF3_ext", - &pusch_vars->rxdataF_ext[3][start_symbol * NR_NB_SC_PER_RB * pusch_pdu->rb_size], - nb_symb_sch * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size)), - 1, - 1); LOG_M("chestF5.m", "chF5", @@ -1373,25 +1332,6 @@ int main(int argc, char *argv[]) 1, 1); - LOG_M("chestF5_ext.m", - "chF5_ext", - &pusch_vars->ul_ch_estimates_ext[5][(start_symbol + 1) * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size))], - (nb_symb_sch - 1) * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size)), - 1, - 1); - LOG_M("chestF10_ext.m", - "chF10_ext", - &pusch_vars->ul_ch_estimates_ext[10][(start_symbol + 1) * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size))], - (nb_symb_sch - 1) * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size)), - 1, - 1); - LOG_M("chestF15_ext.m", - "chF15_ext", - &pusch_vars->ul_ch_estimates_ext[15][(start_symbol + 1) * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size))], - (nb_symb_sch - 1) * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size)), - 1, - 1); - LOG_M("rxsigF4_comp.m", "rxsF4_comp", &pusch_vars->rxdataF_comp[4][start_symbol * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size))],