From ec4429c1710280fb9ca9f8871169447d8987007e Mon Sep 17 00:00:00 2001 From: "Wolfgang A. Mozart" Date: Fri, 2 Nov 2018 13:46:46 +0100 Subject: [PATCH] gNB: making n_ssb_crb a function of n_rb_dl (this should become a config paramerter later) nr-UE: bugfixes pbchsim: adding options to input/output signal files --- openair1/PHY/INIT/nr_init.c | 2 +- openair1/PHY/NR_UE_TRANSPORT/pss_nr.c | 24 +++++----- openair1/SIMULATION/NR_PHY/pbchsim.c | 64 +++++++++++++++++---------- targets/RT/USER/nr-ue.c | 22 ++++----- 4 files changed, 63 insertions(+), 49 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 6082cb757c..bce14e4f56 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -419,7 +419,7 @@ void nr_phy_config_request(NR_PHY_Config_t *phy_config) gNB_config->rf_config.ul_carrier_bandwidth.value = phy_config->cfg->rf_config.ul_carrier_bandwidth.value;//106; gNB_config->sch_config.half_frame_index.value = 0; gNB_config->sch_config.ssb_subcarrier_offset.value = phy_config->cfg->sch_config.ssb_subcarrier_offset.value;//0; - gNB_config->sch_config.n_ssb_crb.value = 86; + gNB_config->sch_config.n_ssb_crb.value = (phy_config->cfg->rf_config.dl_carrier_bandwidth.value-20)>>1; gNB_config->sch_config.physical_cell_id.value = phy_config->cfg->sch_config.physical_cell_id.value; if (phy_config->cfg->subframe_config.duplex_mode.value == 0) { diff --git a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c index de9b90f993..682d0233d8 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c @@ -838,14 +838,15 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain /* Search pss in the received buffer each 4 samples which ensures a memory alignment on 128 bits (32 bits x 4 ) */ /* This is required by SIMD (single instruction Multiple Data) Extensions of Intel processors. */ /* Correlation computation is based on a a dot product which is realized thank to SIMS extensions */ - for (int pss_index = 0; pss_index < NUMBER_PSS_SEQUENCE; pss_index++) avg[pss_index]=0; + for (int pss_index = 0; pss_index < NUMBER_PSS_SEQUENCE; pss_index++) { + avg[pss_index]=0; + memset(pss_corr_ue[pss_index],0,length*sizeof(int64_t)); + } - for (n=0; n < length; n+=4) { + for (n=0; n < length; n+=4) { // for (int pss_index = 0; pss_index < NUMBER_PSS_SEQUENCE; pss_index++) { - pss_corr_ue[pss_index][n] = 0; /* clean correlation for position n */ - if ( n < (length - frame_parms->ofdm_symbol_size)) { /* calculate dot product of primary_synchro_time_nr and rxdata[ar][n] (ar=0..nb_ant_rx) and store the sum in temp[n]; */ @@ -886,24 +887,19 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain LOG_I(PHY,"[UE] nr_synchro_time: Sync source = %d, Peak found at pos %d, val = %llu (%d dB) avg %d dB\n", pss_source, peak_position, (unsigned long long)peak_value, dB_fixed64(peak_value),dB_fixed64(avg[pss_source])); -//#ifdef DEBUG_PSS_NR - -#define PSS_DETECTION_FLOOR_NR (31) - if (peak_value < 5*avg[pss_source]) { //PSS_DETECTION_FLOOR_NR) - + if (peak_value < 5*avg[pss_source]) return(-1); - } -//#endif + #ifdef DBG_PSS_NR - static debug_cnt = 0; + static int debug_cnt = 0; if (debug_cnt == 0) { - /* LOG_M("pss_corr_ue0.m","pss_corr_ue0",pss_corr_ue[0],length,1,6); + LOG_M("pss_corr_ue0.m","pss_corr_ue0",pss_corr_ue[0],length,1,6); LOG_M("pss_corr_ue1.m","pss_corr_ue1",pss_corr_ue[1],length,1,6); LOG_M("pss_corr_ue2.m","pss_corr_ue2",pss_corr_ue[2],length,1,6); - LOG_M("rxdata0.m","rxd0",rxdata[0],length,1,1); */ + LOG_M("rxdata0.m","rxd0",rxdata[0],length,1,1); } else { debug_cnt++; } diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index a4424044c0..019ef25194 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -379,7 +379,7 @@ int main(int argc, char **argv) exit(-1); } - frame_length_complex_samples = frame_parms->samples_per_subframe; + frame_length_complex_samples = frame_parms->samples_per_subframe*NR_NUMBER_OF_SUBFRAMES_PER_FRAME; frame_length_complex_samples_no_prefix = frame_parms->samples_per_subframe_wCP; s_re = malloc(2*sizeof(double*)); @@ -432,34 +432,47 @@ int main(int argc, char **argv) gNB->pbch_configured = 1; for (int i=0;i<4;i++) gNB->pbch_pdu[i]=i+1; nr_common_signal_procedures (gNB,frame,subframe); - } - /* - LOG_M("txsigF0.m","txsF0", gNB->common_vars.txdataF[0],frame_length_complex_samples_no_prefix,1,1); - if (gNB->frame_parms.nb_antennas_tx>1) - LOG_M("txsigF1.m","txsF1", gNB->common_vars.txdataF[1],frame_length_complex_samples_no_prefix,1,1); - */ - //TODO: loop over slots - for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { - if (gNB_config->subframe_config.dl_cyclic_prefix_type.value == 1) { - PHY_ofdm_mod(gNB->common_vars.txdataF[aa], - txdata[aa], - frame_parms->ofdm_symbol_size, - 12, - frame_parms->nb_prefix_samples, - CYCLIC_PREFIX); - } else { - nr_normal_prefix_mod(gNB->common_vars.txdataF[aa], - txdata[aa], - 14, - frame_parms); + /* + LOG_M("txsigF0.m","txsF0", gNB->common_vars.txdataF[0],frame_length_complex_samples_no_prefix,1,1); + if (gNB->frame_parms.nb_antennas_tx>1) + LOG_M("txsigF1.m","txsF1", gNB->common_vars.txdataF[1],frame_length_complex_samples_no_prefix,1,1); + */ + //TODO: loop over slots + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { + if (gNB_config->subframe_config.dl_cyclic_prefix_type.value == 1) { + PHY_ofdm_mod(gNB->common_vars.txdataF[aa], + txdata[aa], + frame_parms->ofdm_symbol_size, + 12, + frame_parms->nb_prefix_samples, + CYCLIC_PREFIX); + } else { + nr_normal_prefix_mod(gNB->common_vars.txdataF[aa], + txdata[aa], + 14, + frame_parms); + } + } + } else { + printf("Reading %d samples from file to antenna buffer %d\n",frame_length_complex_samples,0); + + if (fread(txdata[0], + sizeof(int32_t), + frame_length_complex_samples, + input_fd) != frame_length_complex_samples) { + printf("error reading from file\n"); + exit(-1); } } - /* + LOG_M("txsig0.m","txs0", txdata[0],frame_length_complex_samples,1,1); if (gNB->frame_parms.nb_antennas_tx>1) LOG_M("txsig1.m","txs1", txdata[1],frame_length_complex_samples,1,1); - */ + + if (output_fd) + fwrite(txdata[0],sizeof(int32_t),frame_length_complex_samples,output_fd); + int txlev = signal_energy(&txdata[0][5*frame_parms->ofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0], frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples); @@ -568,9 +581,12 @@ int main(int argc, char **argv) free(r_im); free(txdata); - if (write_output_file) + if (output_fd) fclose(output_fd); + if (input_fd) + fclose(input_fd); + return(n_errors); } diff --git a/targets/RT/USER/nr-ue.c b/targets/RT/USER/nr-ue.c index 63d5150997..7f4739a18a 100644 --- a/targets/RT/USER/nr-ue.c +++ b/targets/RT/USER/nr-ue.c @@ -435,7 +435,7 @@ static void *UE_thread_synch(void *arg) { #endif if (nr_initial_sync( UE, UE->mode ) == 0) { - hw_slot_offset = (UE->rx_offset<<1) / UE->frame_parms.samples_per_tti; + hw_slot_offset = (UE->rx_offset<<1) / UE->frame_parms.samples_per_subframe; printf("Got synch: hw_slot_offset %d, carrier off %d Hz, rxgain %d (DL %u, UL %u), UE_scan_carrier %d\n", hw_slot_offset, freq_offset, @@ -488,15 +488,17 @@ static void *UE_thread_synch(void *arg) { break; } - UE->rfdevice.trx_set_freq_func(&UE->rfdevice,&openair0_cfg[0],0); - //UE->rfdevice.trx_set_gains_func(&openair0,&openair0_cfg[0]); - //UE->rfdevice.trx_stop_func(&UE->rfdevice); - // sleep(1); - //nr_init_frame_parms_ue(&UE->frame_parms); - /*if (UE->rfdevice.trx_start_func(&UE->rfdevice) != 0 ) { - LOG_E(HW,"Could not start the device\n"); - oai_exit=1; - }*/ + if (UE->mode != loop_through_memory) { + UE->rfdevice.trx_set_freq_func(&UE->rfdevice,&openair0_cfg[0],0); + //UE->rfdevice.trx_set_gains_func(&openair0,&openair0_cfg[0]); + //UE->rfdevice.trx_stop_func(&UE->rfdevice); + // sleep(1); + //nr_init_frame_parms_ue(&UE->frame_parms); + /*if (UE->rfdevice.trx_start_func(&UE->rfdevice) != 0 ) { + LOG_E(HW,"Could not start the device\n"); + oai_exit=1; + }*/ + } if (UE->UE_scan_carrier == 1) {