diff --git a/openair1/SCHED_NR/nr_ru_procedures.c b/openair1/SCHED_NR/nr_ru_procedures.c index 700b3db5b4..89b2b4d136 100644 --- a/openair1/SCHED_NR/nr_ru_procedures.c +++ b/openair1/SCHED_NR/nr_ru_procedures.c @@ -74,11 +74,20 @@ void nr_feptx0(RU_t *ru,int slot) { LOG_D(PHY,"SFN/SF:RU:TX:%d/%d Generating slot %d\n",ru->proc.frame_tx, ru->proc.subframe_tx,slot); for (aa=0; aanb_tx; aa++) { + if (fp->Ncp == 1) { + PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot*slot_sizeF], + (int*)&ru->common.txdata[aa][slot_offset], + fp->ofdm_symbol_size, + 12, + fp->nb_prefix_samples, + CYCLIC_PREFIX); + } + else { nr_normal_prefix_mod(&ru->common.txdataF_BF[aa][slot*slot_sizeF], (int*)&ru->common.txdata[aa][slot_offset], fp->symbols_per_slot, fp); - + } } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM+slot , 0); } @@ -180,136 +189,41 @@ void nr_init_feptx_thread(RU_t *ru,pthread_attr_t *attr_feptx) { } - +// is this supposed to generate a slot or a subframe??? +// seems to be hardcoded to numerology 1 (2 slots=1 subframe) void nr_feptx_ofdm(RU_t *ru) { NR_DL_FRAME_PARMS *fp=ru->nr_frame_parms; nfapi_nr_config_request_t *cfg = &ru->gNB_list[0]->gNB_config; - unsigned int aa,slot_offset, slot_offset_F; - int dummy_tx_b[7680*4] __attribute__((aligned(32))); - int i,j, tx_offset; + unsigned int aa=0,slot=0; int slot_sizeF = (fp->ofdm_symbol_size)* ((cfg->subframe_config.dl_cyclic_prefix_type.value == 1) ? 12 : 14); - int len,len2; - int16_t *txdata; int subframe = ru->proc.subframe_tx; - -// int CC_id = ru->proc.CC_id; + int *txdata = &ru->common.txdata[aa][subframe*fp->samples_per_subframe]; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM , 1 ); + start_meas(&ru->ofdm_mod_stats); - slot_offset_F = 0; - - slot_offset = subframe*fp->samples_per_subframe; + // this copy should be done in the precoding thread (currently inactive) + for (int aa=0;aanb_tx;aa++) + memcpy((void*)ru->common.txdataF_BF[aa], + (void*)ru->gNB_list[0]->common_vars.txdataF[aa], fp->samples_per_subframe_wCP*sizeof(int32_t)); if ((nr_subframe_select(cfg,subframe)==SF_DL)|| ((nr_subframe_select(cfg,subframe)==SF_S))) { // LOG_D(HW,"Frame %d: Generating slot %d\n",frame,next_slot); - start_meas(&ru->ofdm_mod_stats); + for (slot=0; slotslots_per_subframe;slot++) + nr_feptx0(ru,slot); - for (aa=0; aanb_tx; aa++) { - if (cfg->subframe_config.dl_cyclic_prefix_type.value == 1) { - PHY_ofdm_mod(&ru->common.txdataF_BF[aa][0], - dummy_tx_b, - fp->ofdm_symbol_size, - 12, - fp->nb_prefix_samples, - CYCLIC_PREFIX); - PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot_sizeF], - dummy_tx_b+(fp->samples_per_subframe / fp->slots_per_subframe), - fp->ofdm_symbol_size, - 12, - fp->nb_prefix_samples, - CYCLIC_PREFIX); - } else { - nr_normal_prefix_mod(&ru->common.txdataF_BF[aa][slot_offset_F], - dummy_tx_b, - 14, - fp); - // if S-subframe generate first slot only - if (nr_subframe_select(cfg,subframe) == SF_DL) - nr_normal_prefix_mod(&ru->common.txdataF_BF[aa][slot_offset_F+slot_sizeF], - dummy_tx_b+(fp->samples_per_subframe / fp->slots_per_subframe), - 14, - fp); - } - - // if S-subframe generate first slot only - if (nr_subframe_select(cfg,subframe) == SF_S) - len = fp->samples_per_subframe / fp->slots_per_subframe; - else - len = fp->samples_per_subframe; - - if (slot_offset<0) { - txdata = (int16_t*)&ru->common.txdata[aa][(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*fp->samples_per_subframe)+tx_offset]; - len2 = -(slot_offset); - len2 = (len2>len) ? len : len2; - for (i=0; i<(len2<<1); i++) { - txdata[i] = ((int16_t*)dummy_tx_b)[i]; - } - if (len2common.txdata[aa][0]; - for (j=0; i<(len<<1); i++,j++) { - txdata[j++] = ((int16_t*)dummy_tx_b)[i]; - } - } - } - else if ((slot_offset+len)>(fp->samples_per_frame)) { - tx_offset = (int)slot_offset; - txdata = (int16_t*)&ru->common.txdata[aa][tx_offset]; - len2 = -tx_offset + fp->samples_per_frame; - for (i=0; i<(len2<<1); i++) { - txdata[i] = ((int16_t*)dummy_tx_b)[i]; - } - txdata = (int16_t*)&ru->common.txdata[aa][0]; - for (j=0; i<(len<<1); i++,j++) { - txdata[j++] = ((int16_t*)dummy_tx_b)[i]; - } - } - else { - //LOG_D(PHY,"feptx_ofdm: Writing to position %d\n",slot_offset); - tx_offset = (int)slot_offset; - txdata = (int16_t*)&ru->common.txdata[aa][tx_offset]; - - for (i=0; i<(len<<1); i++) { - txdata[i] = ((int16_t*)dummy_tx_b)[i]; - } - } - - // if S-subframe switch to RX in second subframe - /* - if (subframe_select(fp,subframe) == SF_S) { - for (i=0; icommon_vars.txdata[0][aa][tx_offset++] = 0x00010001; - } - } - */ - /*if ((fp->frame_type == TDD) && - ((fp->tdd_config==0) || - (fp->tdd_config==1) || - (fp->tdd_config==2) || - (fp->tdd_config==6)) && - ((subframe==0) || (subframe==5))) { - // turn on tx switch N_TA_offset before - //LOG_D(HW,"subframe %d, time to switch to tx (N_TA_offset %d, slot_offset %d) \n",subframe,ru->N_TA_offset,slot_offset); - for (i=0; iN_TA_offset; i++) { - tx_offset = (int)slot_offset+i-ru->N_TA_offset/2; - if (tx_offset<0) - tx_offset += fp->samples_per_frame; - - if (tx_offset>=(fp->samples_per_frame)) - tx_offset -= fp->samples_per_frame; - - ru->common.txdata[aa][tx_offset] = 0x00000000; - } - }*/ - stop_meas(&ru->ofdm_mod_stats); - LOG_D(PHY,"feptx_ofdm (TXPATH): frame %d, subframe %d: txp (time %p) %d dB, txp (freq) %d dB\n", - ru->proc.frame_tx,subframe,txdata,dB_fixed(signal_energy((int32_t*)txdata,fp->samples_per_subframe)), - dB_fixed(signal_energy_nodc(ru->common.txdataF_BF[aa],2*slot_sizeF))); - } } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM , 0 ); + stop_meas(&ru->ofdm_mod_stats); + + LOG_D(PHY,"feptx_ofdm (TXPATH): frame %d, subframe %d: txp (time %p) %d dB, txp (freq) %d dB\n", + ru->proc.frame_tx,subframe,txdata,dB_fixed(signal_energy((int32_t*)txdata,fp->samples_per_subframe)), + dB_fixed(signal_energy_nodc(ru->common.txdataF_BF[aa],2*slot_sizeF))); + } diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 5ba0ce2223..36c441db26 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -163,6 +163,8 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, NR_DL_FRAME_PARMS *fp=&gNB->frame_parms; nfapi_nr_config_request_t *cfg = &gNB->gNB_config; + int offset = gNB->CC_id; + if ((cfg->subframe_config.duplex_mode.value == TDD) && (nr_subframe_select(cfg,subframe)==SF_UL)) return; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+offset,1); diff --git a/targets/RT/USER/nr-ru.c b/targets/RT/USER/nr-ru.c index 1c39906d2b..04f2f3cdd4 100644 --- a/targets/RT/USER/nr-ru.c +++ b/targets/RT/USER/nr-ru.c @@ -719,7 +719,8 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) { if(emulate_rf){ wait_on_condition(&proc->mutex_emulateRF,&proc->cond_emulateRF,&proc->instance_cnt_emulateRF,"emulatedRF_thread"); release_thread(&proc->mutex_emulateRF,&proc->instance_cnt_emulateRF,"emulatedRF_thread"); - rxs = fp->samples_per_tti; + rxs = fp->samples_per_subframe; + ts = old_ts + rxs; } else{ rxs = ru->rfdevice.trx_read_func(&ru->rfdevice, @@ -794,7 +795,7 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) { if (rxs != fp->samples_per_subframe) { //exit_fun( "problem receiving samples" ); - LOG_E(PHY, "problem receiving samples"); + LOG_E(PHY, "problem receiving samples\n"); } } @@ -1543,6 +1544,18 @@ static void* ru_thread( void* param ) { { sprintf(filename,"tx%ddata_frame%d.m", i, print_frame); LOG_M(filename,"txdata_frame",&ru->common.txdata[i][0],fp->samples_per_frame, 1, 1); + sprintf(filename,"tx%ddata_frame%d.dat", i, print_frame); + FILE *output_fd = fopen(filename,"w"); + if (output_fd) { + fwrite(&ru->common.txdata[i][0], + sizeof(int32_t), + fp->samples_per_frame, + output_fd); + fclose(output_fd); + } + else { + LOG_E(PHY,"Cannot write to file %s\n",filename); + } } } }