diff --git a/doc/SW-archi-graph.md b/doc/SW-archi-graph.md index d397d07f43d052c7128025621d9ec9feffa9784d..a3397ed297234285fbf9d6c4f8da8954bdf6ad82 100644 --- a/doc/SW-archi-graph.md +++ b/doc/SW-archi-graph.md @@ -14,7 +14,7 @@ rx_func_implem[rx_func] handle_nr_slot_ind --> rnti_to_remove-mgmt --> L1_nr_prach_procedures - --> apply_nr_rotation_ul + --> apply_nr_rotation_RX end subgraph phy_procedures_gNB_uespec_RX fill_ul_rb_mask @@ -58,7 +58,7 @@ subgraph tx_func subgraph phy_procedures_gNB_TX dcitop[nr_generate dci top] --> nr_generate_csi_rs - --> apply_nr_rotation + --> apply_nr_rotation_TX -- send_msg --> end_tx_func((L1_tx_out)) end subgraph tx_reorder_thread diff --git a/doc/SW_archi.md b/doc/SW_archi.md index cccead370bfad2da919f9f31062c78b7e3f04835..7facfcb5955669091dc12c2c9afe3c4b5e132b6c 100644 --- a/doc/SW_archi.md +++ b/doc/SW_archi.md @@ -33,7 +33,7 @@ rx_func_implem[rx_func] handle_nr_slot_ind --> rnti_to_remove-mgmt --> L1_nr_prach_procedures - --> apply_nr_rotation_ul + --> apply_nr_rotation_RX end subgraph phy_procedures_gNB_uespec_RX fill_ul_rb_mask @@ -67,7 +67,7 @@ subgraph tx phy_procedures_gNB_TX --> dcitop[nr_generate dci top] --> nr_generate_csi_rs - --> apply_nr_rotation + --> apply_nr_rotation_TX -- send_msg --> end_tx_func((L1_tx_out)) end subgraph tx_reorder_thread diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index f0da3db24113f3219cf91b8c20723ec6fdb057bb..fd5439ce74d42a6fcafdc0387ae42ddd70031547 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -231,13 +231,16 @@ void rx_func(void *param) //WA: comment rotation in tx/rx if((gNB->num_RU == 1) && (gNB->RU_list[0]->if_south != REMOTE_IF4p5)) { //apply the rx signal rotation here + int soffset = (slot_rx & 3) * gNB->frame_parms.symbols_per_slot * gNB->frame_parms.ofdm_symbol_size; for (int aa = 0; aa < gNB->frame_parms.nb_antennas_rx; aa++) { - apply_nr_rotation_ul(&gNB->frame_parms, - gNB->common_vars.rxdataF[aa], - slot_rx, - 0, - gNB->frame_parms.Ncp == EXTENDED ? 12 : 14, - link_type_ul); + apply_nr_rotation_RX(&gNB->frame_parms, + gNB->common_vars.rxdataF[aa], + gNB->frame_parms.symbol_rotation[1], + slot_rx, + gNB->frame_parms.N_RB_UL, + soffset, + 0, + gNB->frame_parms.Ncp == EXTENDED ? 12 : 14); } } phy_procedures_gNB_uespec_RX(gNB, frame_rx, slot_rx); diff --git a/openair1/PHY/MODULATION/nr_modulation.h b/openair1/PHY/MODULATION/nr_modulation.h index 09f6c94d2c0499db007f91aa087d5369030b43ae..8c530676cdab47d91afa43d79d76a2b91d4e02f1 100644 --- a/openair1/PHY/MODULATION/nr_modulation.h +++ b/openair1/PHY/MODULATION/nr_modulation.h @@ -108,23 +108,26 @@ int nr_beam_precoding(c16_t **txdataF, int offset ); -void apply_nr_rotation(NR_DL_FRAME_PARMS *fp, - c16_t* txdata, - int slot, - int first_symbol, - int nsymb, - int link_type); +void apply_nr_rotation_TX(NR_DL_FRAME_PARMS *fp, + c16_t *txdataF, + c16_t *symbol_rotation, + int slot, + int nb_rb, + int first_symbol, + int nsymb); void init_symbol_rotation(NR_DL_FRAME_PARMS *fp); void init_timeshift_rotation(NR_DL_FRAME_PARMS *fp); -void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms, +void apply_nr_rotation_RX(NR_DL_FRAME_PARMS *frame_parms, c16_t *rxdataF, + c16_t *rot, int slot, + int nb_rb, + int soffset, int first_symbol, - int nsymb, - int link_type); + int nsymb); /*! \brief Perform NR precoding. TS 38.211 V15.4.0 subclause 6.3.1.5 @param[in] datatx_F_precoding, Pointer to n_layers*re data array diff --git a/openair1/PHY/MODULATION/ofdm_mod.c b/openair1/PHY/MODULATION/ofdm_mod.c index 16238257d16acfbaef858514904739ff7f955f3a..45261b1fdbe895f5f96d631df01a3f02db333707 100644 --- a/openair1/PHY/MODULATION/ofdm_mod.c +++ b/openair1/PHY/MODULATION/ofdm_mod.c @@ -334,17 +334,17 @@ void do_OFDM_mod(c16_t **txdataF, c16_t **txdata, uint32_t frame,uint16_t next_s } -void apply_nr_rotation(NR_DL_FRAME_PARMS *fp, - c16_t *txdataF, - int slot, - int first_symbol, - int nsymb, - int link_type) +void apply_nr_rotation_TX(NR_DL_FRAME_PARMS *fp, + c16_t *txdataF, + c16_t *symbol_rotation, + int slot, + int nb_rb, + int first_symbol, + int nsymb) { - int symb_offset = (slot%fp->slots_per_subframe)*fp->symbols_per_slot; + int symb_offset = (slot % fp->slots_per_subframe) * fp->symbols_per_slot; - c16_t *symbol_rotation = fp->symbol_rotation[link_type] + symb_offset; - int N_RB = (link_type == link_type_sl) ? fp->N_RB_SL : fp->N_RB_DL; + symbol_rotation += symb_offset; for (int sidx = first_symbol; sidx < first_symbol + nsymb; sidx++) { c16_t *this_rotation = symbol_rotation + sidx; @@ -357,20 +357,20 @@ void apply_nr_rotation(NR_DL_FRAME_PARMS *fp, this_rotation->r, this_rotation->i); - if (N_RB & 1) { + if (nb_rb & 1) { rotate_cpx_vector(this_symbol, this_rotation, this_symbol, - (N_RB + 1) * 6, 15); + (nb_rb + 1) * 6, 15); rotate_cpx_vector(this_symbol + fp->first_carrier_offset - 6, this_rotation, this_symbol + fp->first_carrier_offset - 6, - (N_RB + 1) * 6, 15); + (nb_rb + 1) * 6, 15); } else { rotate_cpx_vector(this_symbol, this_rotation, this_symbol, - N_RB * 6, 15); + nb_rb * 6, 15); rotate_cpx_vector(this_symbol + fp->first_carrier_offset, this_rotation, this_symbol + fp->first_carrier_offset, - N_RB * 6, 15); + nb_rb * 6, 15); } } } diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c index a3224944ac98cf172e37c2a8171493f0de8d8b01..6a598582b028fb644462fada13a4d274b6e411f5 100644 --- a/openair1/PHY/MODULATION/slot_fep_nr.c +++ b/openair1/PHY/MODULATION/slot_fep_nr.c @@ -96,46 +96,14 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, stop_meas(&ue->rx_dft_stats); - int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot; - c16_t rot2 = frame_parms->symbol_rotation[0][symbol+symb_offset]; - rot2.i=-rot2.i; - -#ifdef DEBUG_FEP - // if (ue->frame <100) - printf("slot_fep: slot %d, symbol %d rx_offset %u, rotation symbol %d %d.%d\n", Ns,symbol, rx_offset, - symbol+symb_offset,rot2.r,rot2.i); -#endif - - c16_t *shift_rot = frame_parms->timeshift_symbol_rotation; - c16_t *this_symbol = &rxdataF[aa][frame_parms->ofdm_symbol_size*symbol]; - - if (frame_parms->N_RB_DL & 1) { - rotate_cpx_vector(this_symbol, &rot2, this_symbol, - (frame_parms->N_RB_DL + 1) * 6, 15); - rotate_cpx_vector(this_symbol + frame_parms->first_carrier_offset - 6, - &rot2, - this_symbol + frame_parms->first_carrier_offset - 6, - (frame_parms->N_RB_DL + 1) * 6, 15); - multadd_cpx_vector((int16_t *)this_symbol, (int16_t *)shift_rot, (int16_t *)this_symbol, - 1, (frame_parms->N_RB_DL + 1) * 6, 15); - multadd_cpx_vector((int16_t *)(this_symbol + frame_parms->first_carrier_offset - 6), - (int16_t *)(shift_rot + frame_parms->first_carrier_offset - 6), - (int16_t *)(this_symbol + frame_parms->first_carrier_offset - 6), - 1, (frame_parms->N_RB_DL + 1) * 6, 15); - } else { - rotate_cpx_vector(this_symbol, &rot2, this_symbol, - frame_parms->N_RB_DL * 6, 15); - rotate_cpx_vector(this_symbol + frame_parms->first_carrier_offset, - &rot2, - this_symbol + frame_parms->first_carrier_offset, - frame_parms->N_RB_DL * 6, 15); - multadd_cpx_vector((int16_t *)this_symbol, (int16_t *)shift_rot, (int16_t *)this_symbol, - 1, frame_parms->N_RB_DL * 6, 15); - multadd_cpx_vector((int16_t *)(this_symbol + frame_parms->first_carrier_offset), - (int16_t *)(shift_rot + frame_parms->first_carrier_offset), - (int16_t *)(this_symbol + frame_parms->first_carrier_offset), - 1, frame_parms->N_RB_DL * 6, 15); - } + apply_nr_rotation_RX(frame_parms, + rxdataF[aa], + frame_parms->symbol_rotation[0], + Ns, + frame_parms->N_RB_DL, + 0, + symbol, + 1); } #ifdef DEBUG_FEP @@ -311,50 +279,51 @@ int nr_slot_fep_ul(NR_DL_FRAME_PARMS *frame_parms, return 0; } -void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms, +void apply_nr_rotation_RX(NR_DL_FRAME_PARMS *frame_parms, c16_t *rxdataF, + c16_t *rot, int slot, + int nb_rb, + int soffset, int first_symbol, - int nsymb, - int link_type) + int nsymb) { int symb_offset = (slot % frame_parms->slots_per_subframe) * frame_parms->symbols_per_slot; - int soffset = (slot & 3) * frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size; for (int symbol = first_symbol; symbol < first_symbol + nsymb; symbol++) { - c16_t rot2 = frame_parms->symbol_rotation[link_type][symbol + symb_offset]; + c16_t rot2 = rot[symbol + symb_offset]; rot2.i = -rot2.i; LOG_D(PHY,"slot %d, symb_offset %d rotating by %d.%d\n", slot, symb_offset, rot2.r, rot2.i); c16_t *shift_rot = frame_parms->timeshift_symbol_rotation; c16_t *this_symbol = &rxdataF[soffset + (frame_parms->ofdm_symbol_size * symbol)]; - if (frame_parms->N_RB_UL & 1) { + if (nb_rb & 1) { rotate_cpx_vector(this_symbol, &rot2, this_symbol, - (frame_parms->N_RB_UL + 1) * 6, 15); + (nb_rb + 1) * 6, 15); rotate_cpx_vector(this_symbol + frame_parms->first_carrier_offset - 6, &rot2, this_symbol + frame_parms->first_carrier_offset - 6, - (frame_parms->N_RB_UL + 1) * 6, 15); + (nb_rb + 1) * 6, 15); multadd_cpx_vector((int16_t *)this_symbol, (int16_t *)shift_rot, (int16_t *)this_symbol, - 1, (frame_parms->N_RB_UL+1) * 6, 15); + 1, (nb_rb + 1) * 6, 15); multadd_cpx_vector((int16_t *)(this_symbol + frame_parms->first_carrier_offset - 6), (int16_t *)(shift_rot + frame_parms->first_carrier_offset - 6), (int16_t *)(this_symbol + frame_parms->first_carrier_offset - 6), - 1, (frame_parms->N_RB_UL+1) * 6, 15); + 1, (nb_rb + 1) * 6, 15); } else { rotate_cpx_vector(this_symbol, &rot2, this_symbol, - frame_parms->N_RB_UL * 6, 15); + nb_rb * 6, 15); rotate_cpx_vector(this_symbol + frame_parms->first_carrier_offset, &rot2, this_symbol + frame_parms->first_carrier_offset, - frame_parms->N_RB_UL * 6, 15); + nb_rb * 6, 15); multadd_cpx_vector((int16_t *)this_symbol, (int16_t *)shift_rot, (int16_t *)this_symbol, - 1, frame_parms->N_RB_UL * 6, 15); + 1, nb_rb * 6, 15); multadd_cpx_vector((int16_t *)(this_symbol + frame_parms->first_carrier_offset), (int16_t *)(shift_rot + frame_parms->first_carrier_offset), (int16_t *)(this_symbol + frame_parms->first_carrier_offset), - 1, frame_parms->N_RB_UL * 6, 15); + 1, nb_rb * 6, 15); } } } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c index 186ec58d4d54262a7f65f8c41b04e951abf1f6d6..b27b7385239af2f109fa415c532dc6e66291c77e 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c @@ -592,16 +592,12 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE, uint8_t slot, NR_DL_FRAME_PARMS *frame_parms, - uint8_t n_antenna_ports) { - - int tx_offset, ap; - c16_t **txdata; - c16_t **txdataF; - + uint8_t n_antenna_ports) +{ /////////////////////////IFFT/////////////////////// /////////// - tx_offset = frame_parms->get_samples_slot_timestamp(slot, frame_parms, 0); + int tx_offset = frame_parms->get_samples_slot_timestamp(slot, frame_parms, 0); // clear the transmit data array for the current subframe /*for (int aa=0; aa<UE->frame_parms.nb_antennas_tx; aa++) { @@ -610,38 +606,20 @@ uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE, }*/ - txdata = UE->common_vars.txdata; - txdataF = UE->common_vars.txdataF; - - int symb_offset = (slot%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot; - for(ap = 0; ap < n_antenna_ports; ap++) { - for (int s=0;s<NR_NUMBER_OF_SYMBOLS_PER_SLOT;s++){ - c16_t *this_symbol = &txdataF[ap][frame_parms->ofdm_symbol_size * s]; - c16_t rot=frame_parms->symbol_rotation[link_type_ul][s + symb_offset]; - LOG_D(PHY,"rotating txdataF symbol %d (%d) => (%d.%d)\n", - s, - s + symb_offset, - rot.r, rot.i); - - if (frame_parms->N_RB_UL & 1) { - rotate_cpx_vector(this_symbol, &rot, this_symbol, - (frame_parms->N_RB_UL + 1) * 6, 15); - rotate_cpx_vector(this_symbol + frame_parms->first_carrier_offset - 6, - &rot, - this_symbol + frame_parms->first_carrier_offset - 6, - (frame_parms->N_RB_UL + 1) * 6, 15); - } else { - rotate_cpx_vector(this_symbol, &rot, this_symbol, - frame_parms->N_RB_UL * 6, 15); - rotate_cpx_vector(this_symbol + frame_parms->first_carrier_offset, - &rot, - this_symbol + frame_parms->first_carrier_offset, - frame_parms->N_RB_UL * 6, 15); - } - } + c16_t **txdata = UE->common_vars.txdata; + c16_t **txdataF = UE->common_vars.txdataF; + + for(int ap = 0; ap < n_antenna_ports; ap++) { + apply_nr_rotation_TX(frame_parms, + txdataF[ap], + frame_parms->symbol_rotation[1], + slot, + frame_parms->N_RB_UL, + 0, + NR_NUMBER_OF_SYMBOLS_PER_SLOT); } - for (ap = 0; ap < n_antenna_ports; ap++) { + for (int ap = 0; ap < n_antenna_ports; ap++) { if (frame_parms->Ncp == 1) { // extended cyclic prefix PHY_ofdm_mod((int *)txdataF[ap], (int *)&txdata[ap][tx_offset], diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index d7e99690657933ec5045895269640775cadb8075..d92c0124f172000e343026cc742e04cea8f3e3a1 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -222,7 +222,13 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx, //apply the OFDM symbol rotation here for (aa=0; aa<cfg->carrier_config.num_tx_ant.value; aa++) { - apply_nr_rotation(fp, &gNB->common_vars.txdataF[aa][txdataF_offset], slot, 0, fp->Ncp == EXTENDED ? 12 : 14, link_type_dl); + apply_nr_rotation_TX(fp, + &gNB->common_vars.txdataF[aa][txdataF_offset], + fp->symbol_rotation[0], + slot, + fp->N_RB_DL, + 0, + fp->Ncp == EXTENDED ? 12 : 14); T(T_GNB_PHY_DL_OUTPUT_SIGNAL, T_INT(0), T_INT(frame), T_INT(slot), diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index d5930c0c23f19475ab11a59d0088fd1a533bd628..9299cd407348e16a9fcee095d1df582e5855dffe 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -648,12 +648,13 @@ int main(int argc, char **argv) for (aa=0; aa<gNB->frame_parms.nb_antennas_tx; aa++) { if (cyclic_prefix_type == 1) { - apply_nr_rotation(frame_parms, - gNB->common_vars.txdataF[aa], - slot, - 0, - 12, - link_type_dl); + apply_nr_rotation_TX(frame_parms, + gNB->common_vars.txdataF[aa], + frame_parms->symbol_rotation[0], + slot, + frame_parms->N_RB_DL, + 0, + 12); PHY_ofdm_mod((int *)gNB->common_vars.txdataF[aa], (int *)&txdata[aa][frame_parms->get_samples_slot_timestamp(slot,frame_parms,0)], @@ -662,12 +663,13 @@ int main(int argc, char **argv) frame_parms->nb_prefix_samples, CYCLIC_PREFIX); } else { - apply_nr_rotation(frame_parms, - gNB->common_vars.txdataF[aa], - slot, - 0, - 14, - link_type_dl); + apply_nr_rotation_TX(frame_parms, + gNB->common_vars.txdataF[aa], + frame_parms->symbol_rotation[0], + slot, + frame_parms->N_RB_DL, + 0, + 14); /*nr_normal_prefix_mod(gNB->common_vars.txdataF[aa], &txdata[aa][frame_parms->get_samples_slot_timestamp(slot,frame_parms,0)], diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index f686ce8201b98d29c2c937541dcfed21269e9828..41e80cc7d4f82edc57f950756daebf60d5a65085 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -1259,11 +1259,14 @@ int main(int argc, char **argv) slot, 0); } - + int offset = (slot & 3) * gNB->frame_parms.symbols_per_slot * gNB->frame_parms.ofdm_symbol_size; for (int aa = 0; aa < gNB->frame_parms.nb_antennas_rx; aa++) { - apply_nr_rotation_ul(&gNB->frame_parms, + apply_nr_rotation_RX(&gNB->frame_parms, gNB->common_vars.rxdataF[aa], + gNB->frame_parms.symbol_rotation[1], slot, + gNB->frame_parms.N_RB_UL, + offset, 0, gNB->frame_parms.Ncp == EXTENDED ? 12 : 14, link_type_ul);