diff --git a/doc/SW_archi.md b/doc/SW_archi.md index 0a53bf3793..01d3c377d4 100644 --- a/doc/SW_archi.md +++ b/doc/SW_archi.md @@ -101,7 +101,6 @@ raw incoming data is in buffer called "rxdata" ## nr_fep_full() "front end processing" of uplink signal performs DFT on the signal -same function (duplicates): phy_procedures_gNB_common_RX() it computes the buffer rxdataF (for frequency) from rxdata (samples over time) rxdataF is the rxdata in frequency domain, phase aligned {: .func3} diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index 0bac9ce3eb..14eefa1e32 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -555,15 +555,9 @@ void init_eNB_afterRU(void) { gNB->RU_list[ru_id]->idx); for (i=0; iRU_list[ru_id]->nb_rx; aa++,i++) { - LOG_I(PHY,"Attaching RU %d antenna %d to gNB antenna %d\n",gNB->RU_list[ru_id]->idx,i,aa); - gNB->prach_vars.rxsigF[aa] = gNB->RU_list[ru_id]->prach_rxsigF[0][i]; -#if 0 -printf("before %p\n", gNB->common_vars.rxdataF[aa]); -#endif - gNB->common_vars.rxdataF[aa] = gNB->RU_list[ru_id]->common.rxdataF[i]; -#if 0 -printf("after %p\n", gNB->common_vars.rxdataF[aa]); -#endif + LOG_I(PHY,"Attaching RU %d antenna %d to gNB antenna %d\n",gNB->RU_list[ru_id]->idx,i,aa); + gNB->prach_vars.rxsigF[aa] = gNB->RU_list[ru_id]->prach_rxsigF[0][i]; + gNB->common_vars.rxdataF[aa] = gNB->RU_list[ru_id]->common.rxdataF[i]; } } diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index fec343ccfb..6b984f53db 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -627,6 +627,8 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, common_vars->txdataF = (int32_t **)malloc16(Ptx*sizeof(int32_t*)); common_vars->rxdataF = (int32_t **)malloc16(Prx*sizeof(int32_t*)); + /* Do NOT allocate per-antenna txdataF/rxdataF: the gNB gets a pointer to the + * RU to copy/recover freq-domain memory from there */ common_vars->beam_id = (uint8_t **)malloc16(Ptx*sizeof(uint8_t*)); for (i=0;ibeam_id[i] = (uint8_t*)malloc16_clear(fp->symbols_per_slot*fp->slots_per_frame*sizeof(uint8_t)); memset(common_vars->beam_id[i],255,fp->symbols_per_slot*fp->slots_per_frame); } - for (i=0;irxdataF[i] = (int32_t*)malloc16_clear(fp->samples_per_frame_wCP*sizeof(int32_t)); - } common_vars->debugBuff = (int32_t*)malloc16_clear(fp->samples_per_frame*sizeof(int32_t)*100); common_vars->debugBuff_sample_offset = 0; @@ -782,10 +781,8 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB) free_and_zero(common_vars->beam_id[i]); } - for (int i = 0; i < Prx; ++i) { - free_and_zero(common_vars->rxdataF[i]); - } - + /* Do NOT free per-antenna txdataF/rxdataF: the gNB gets a pointer to the + * RU's txdataF/rxdataF, and the RU will free that */ free_and_zero(common_vars->txdataF); free_and_zero(common_vars->rxdataF); free_and_zero(common_vars->beam_id); diff --git a/openair1/PHY/INIT/nr_init_ru.c b/openair1/PHY/INIT/nr_init_ru.c index d12834d620..0a357a5255 100644 --- a/openair1/PHY/INIT/nr_init_ru.c +++ b/openair1/PHY/INIT/nr_init_ru.c @@ -201,10 +201,8 @@ void nr_phy_free_RU(RU_t *ru) free_and_zero(ru->common.txdataF_BF); // free FFT output buffers (RX) - // HACK: cannot free here, or the gNB code in phy_free_nr_gNB() will - // segfault. The rxdataF memory between RU and gNB is not properly handled! - //for (i = 0; i < ru->nb_rx; i++) free_and_zero(ru->common.rxdataF[i]); - //free_and_zero(ru->common.rxdataF); + for (i = 0; i < ru->nb_rx; i++) free_and_zero(ru->common.rxdataF[i]); + free_and_zero(ru->common.rxdataF); for (j=0;jnb_rx; i++) diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 2235521bb1..ef66bf5fef 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -396,10 +396,6 @@ typedef struct { } NR_gNB_SRS_t; typedef struct { - /// \brief Pointers (dynamic) to the received data in the time domain. - /// - first index: rx antenna [0..nb_antennas_rx[ - /// - second index: ? [0..2*ofdm_symbol_size*frame_parms->symbols_per_tti[ - int32_t **rxdata; /// \brief Pointers (dynamic) to the received data in the frequency domain. /// - first index: rx antenna [0..nb_antennas_rx[ /// - second index: ? [0..2*ofdm_symbol_size*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 650af0bf34..7c6a2eb998 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -582,33 +582,6 @@ void fill_ul_rb_mask(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { } -void phy_procedures_gNB_common_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { - - uint8_t symbol; - unsigned char aa; - - for(symbol = 0; symbol < (gNB->frame_parms.Ncp==EXTENDED?12:14); symbol++) { - for (aa = 0; aa < gNB->frame_parms.nb_antennas_rx; aa++) { - nr_slot_fep_ul(&gNB->frame_parms, - gNB->common_vars.rxdata[aa], - gNB->common_vars.rxdataF[aa], - symbol, - slot_rx, - 0); - } - } - - for (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, - gNB->frame_parms.ofdm_symbol_size); - } - -} - int fill_srs_reported_symbol_list(nfapi_nr_srs_indication_reported_symbol_t *reported_symbol_list, const nfapi_nr_srs_pdu_t *srs_pdu, const int N_RB_UL, diff --git a/openair1/SCHED_NR/sched_nr.h b/openair1/SCHED_NR/sched_nr.h index 22b341623e..eff8a9fbcd 100644 --- a/openair1/SCHED_NR/sched_nr.h +++ b/openair1/SCHED_NR/sched_nr.h @@ -37,7 +37,6 @@ void fill_ul_rb_mask(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx); void nr_set_ssb_first_subcarrier(nfapi_nr_config_request_scf_t *cfg, NR_DL_FRAME_PARMS *fp); void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx, int frame_tx, int slot_tx, int do_meas); -void phy_procedures_gNB_common_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx); int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx); void L1_nr_prach_procedures(PHY_VARS_gNB *gNB,int frame,int slot); void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_dl_tti_ssb_pdu ssb_pdu); diff --git a/openair1/SIMULATION/NR_PHY/pucchsim.c b/openair1/SIMULATION/NR_PHY/pucchsim.c index df83a818c0..1d1d2f8fa5 100644 --- a/openair1/SIMULATION/NR_PHY/pucchsim.c +++ b/openair1/SIMULATION/NR_PHY/pucchsim.c @@ -390,6 +390,10 @@ int main(int argc, char **argv) cfg->carrier_config.num_rx_ant.value = n_rx; nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu,Nid_cell,SSB_positions); phy_init_nr_gNB(gNB,0,0); + /* RU handles rxdataF, and gNB just has a pointer. Here, we don't have an RU, + * so we need to allocate that memory as well. */ + for (i = 0; i < n_rx; i++) + gNB->common_vars.rxdataF[i] = malloc16_clear(gNB->frame_parms.samples_per_frame_wCP*sizeof(int32_t)); double fs,txbw,rxbw; uint32_t samples; @@ -702,6 +706,8 @@ int main(int argc, char **argv) free_channel_desc_scm(UE2gNB); term_freq_channel(); + for (i = 0; i < n_rx; i++) + free(gNB->common_vars.rxdataF[i]); phy_free_nr_gNB(gNB); free(RC.gNB[0]); free(RC.gNB); diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index 4bee028a6d..f4dece26ff 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -794,8 +794,17 @@ int main(int argc, char **argv) gNB->chest_freq = chest_type[0]; gNB->chest_time = chest_type[1]; phy_init_nr_gNB(gNB,0,1); + /* RU handles rxdataF, and gNB just has a pointer. Here, we don't have an RU, + * so we need to allocate that memory as well. */ + for (i = 0; i < n_rx; i++) + gNB->common_vars.rxdataF[i] = malloc16_clear(gNB->frame_parms.samples_per_frame_wCP*sizeof(int32_t)); N_RB_DL = gNB->frame_parms.N_RB_DL; + /* no RU: need to have rxdata */ + c16_t **rxdata; + rxdata = malloc(n_rx * sizeof(*rxdata)); + for (int i = 0; i < n_rx; ++i) + rxdata[i] = malloc(gNB->frame_parms.samples_per_frame * sizeof(**rxdata)); NR_BWP_Uplink_t *ubwp=secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]; @@ -1025,18 +1034,16 @@ int main(int argc, char **argv) fseek(input_fd,file_offset*sizeof(int16_t)*2,SEEK_SET); for (int irx=0; irxnb_antennas_rx; irx++) { fseek(input_fd,irx*(slot_length+15)*sizeof(int16_t)*2,SEEK_SET); // matlab adds samlples to the end to emulate channel delay - read_errors+=fread((void*)&gNB->common_vars.rxdata[irx][slot_offset-delay], - sizeof(int16_t), - slot_length<<1, - input_fd); + read_errors += fread((void *)&rxdata[irx][slot_offset-delay], sizeof(int16_t), slot_length<<1, input_fd); if (read_errors==0) { printf("error reading file\n"); exit(1); } - for (int i=0;i<16;i+=2) printf("slot_offset %d : %d,%d\n", - slot_offset, - ((int16_t*)&gNB->common_vars.rxdata[irx][slot_offset])[i], - ((int16_t*)&gNB->common_vars.rxdata[irx][slot_offset])[1+i]); + for (int i=0;i<16;i+=2) + printf("slot_offset %d : %d,%d\n", + slot_offset, + rxdata[irx][slot_offset].r, + rxdata[irx][slot_offset].i); } mod_order = nr_get_Qm_ul(Imcs, mcs_table); @@ -1325,12 +1332,11 @@ int main(int argc, char **argv) for (i=0; inb_antennas_rx; ap++) { - ((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i) + (delay*2)] = (int16_t)((r_re[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0))); // convert to fixed point - ((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i)+1 + (delay*2)] = (int16_t)((r_im[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0))); + rxdata[ap][slot_offset+i+delay].r = (int16_t)((r_re[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0))); // convert to fixed point + rxdata[ap][slot_offset+i+delay].i = (int16_t)((r_im[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0))); /* Add phase noise if enabled */ if (pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) { - phase_noise(ts, &((int16_t*)&gNB->common_vars.rxdata[ap][slot_offset])[(2*i)], - &((int16_t*)&gNB->common_vars.rxdata[ap][slot_offset])[(2*i)+1]); + phase_noise(ts, &rxdata[ap][slot_offset].r, &rxdata[ap][slot_offset].i); } } } @@ -1356,19 +1362,36 @@ int main(int argc, char **argv) gNB->UL_INFO.rx_ind.number_of_pdus = 0; gNB->UL_INFO.crc_ind.number_crcs = 0; - phy_procedures_gNB_common_RX(gNB, frame, slot); + for(uint8_t symbol = 0; symbol < (gNB->frame_parms.Ncp == EXTENDED ? 12 : 14); symbol++) { + for (int aa = 0; aa < gNB->frame_parms.nb_antennas_rx; aa++) + nr_slot_fep_ul(&gNB->frame_parms, + (int32_t*) rxdata[aa], + gNB->common_vars.rxdataF[aa], + symbol, + slot, + 0); + } + + 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, + 0, + gNB->frame_parms.Ncp == EXTENDED ? 12 : 14, + gNB->frame_parms.ofdm_symbol_size); + } ul_proc_error = phy_procedures_gNB_uespec_RX(gNB, frame, slot); if (n_trials==1 && round==0) { - LOG_M("rxsig0.m","rx0",&gNB->common_vars.rxdata[0][slot_offset],slot_length,1,1); + LOG_M("rxsig0.m","rx0",&rxdata[0][slot_offset],slot_length,1,1); LOG_M("rxsigF0.m","rxsF0",gNB->common_vars.rxdataF[0],14*frame_parms->ofdm_symbol_size,1,1); if (precod_nbr_layers > 1) { - LOG_M("rxsig1.m","rx1",&gNB->common_vars.rxdata[1][slot_offset],slot_length,1,1); + LOG_M("rxsig1.m","rx1",&rxdata[1][slot_offset],slot_length,1,1); LOG_M("rxsigF1.m","rxsF1",gNB->common_vars.rxdataF[1],14*frame_parms->ofdm_symbol_size,1,1); if (precod_nbr_layers==4) { - LOG_M("rxsig2.m","rx2",&gNB->common_vars.rxdata[2][slot_offset],slot_length,1,1); - LOG_M("rxsig3.m","rx3",&gNB->common_vars.rxdata[3][slot_offset],slot_length,1,1); + LOG_M("rxsig2.m","rx2",&rxdata[2][slot_offset],slot_length,1,1); + LOG_M("rxsig3.m","rx3",&rxdata[3][slot_offset],slot_length,1,1); LOG_M("rxsigF2.m","rxsF2",gNB->common_vars.rxdataF[2],14*frame_parms->ofdm_symbol_size,1,1); LOG_M("rxsigF3.m","rxsF3",gNB->common_vars.rxdataF[3],14*frame_parms->ofdm_symbol_size,1,1); }