diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index eb06b151cb..e2cd462386 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1297,7 +1297,7 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold.c ${OPENAIR1_DIR}/PHY/TOOLS/file_output.c ${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c - ${OPENAIR1_DIR}/PHY/TOOLS/lte_dfts.c + #${OPENAIR1_DIR}/PHY/TOOLS/lte_dfts.c ${OPENAIR1_DIR}/PHY/TOOLS/log2_approx.c ${OPENAIR1_DIR}/PHY/TOOLS/cmult_sv.c ${OPENAIR1_DIR}/PHY/TOOLS/cmult_vv.c @@ -1334,7 +1334,7 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c ${OPENAIR1_DIR}/PHY/TOOLS/file_output.c ${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c - ${OPENAIR1_DIR}/PHY/TOOLS/lte_dfts.c + # ${OPENAIR1_DIR}/PHY/TOOLS/lte_dfts.c ${OPENAIR1_DIR}/PHY/TOOLS/log2_approx.c ${OPENAIR1_DIR}/PHY/TOOLS/cmult_sv.c ${OPENAIR1_DIR}/PHY/TOOLS/cmult_vv.c diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 94486c48e9..4cd2f62ae3 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -100,6 +100,8 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, gNB->check_for_MUMIMO_transmissions=0; while(gNB->configured == 0) usleep(10000); + + init_dfts(); /* LOG_I(PHY,"[gNB %"PRIu8"] Initializing DL_FRAME_PARMS : N_RB_DL %"PRIu8", PHICH Resource %d, PHICH Duration %d nb_antennas_tx:%u nb_antennas_rx:%u PRACH[rootSequenceIndex:%u prach_Config_enabled:%u configIndex:%u highSpeed:%u zeroCorrelationZoneConfig:%u freqOffset:%u]\n", gNB->Mod_id, diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index b70c90791f..75b3b8bf42 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -655,6 +655,8 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, fp->nb_antennas_tx = 1; fp->nb_antennas_rx=1; + init_dfts(); + printf("Initializing UE vars (abstraction %"PRIu8") for eNB TXant %"PRIu8", UE RXant %"PRIu8"\n",abstraction_flag,fp->nb_antennas_tx,fp->nb_antennas_rx); //LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_UE][MOD %02u][]\n", ue->Mod_id+NB_eNB_INST); diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c index c3e49a42df..5ad1648490 100644 --- a/openair1/PHY/MODULATION/slot_fep_nr.c +++ b/openair1/PHY/MODULATION/slot_fep_nr.c @@ -25,17 +25,17 @@ #include "PHY/LTE_ESTIMATION/lte_estimation.h" #include "PHY/NR_UE_ESTIMATION/nr_estimation.h" -//#define DEBUG_FEP +#define DEBUG_FEP #define SOFFSET 0 int nr_slot_fep(PHY_VARS_NR_UE *ue, - unsigned char l, - unsigned char Ns, - int sample_offset, - int no_prefix, - int reset_freq_est, - NR_CHANNEL_EST_t channel) + unsigned char l, + unsigned char Ns, + int sample_offset, + int no_prefix, + int reset_freq_est, + NR_CHANNEL_EST_t channel) { NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; NR_UE_COMMON *common_vars = &ue->common_vars; @@ -143,7 +143,6 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, #if UE_TIMING_TRACE stop_meas(&ue->rx_dft_stats); #endif - } } else { rx_offset += (frame_parms->ofdm_symbol_size+nb_prefix_samples)*l;// + diff --git a/openair1/PHY/NR_REFSIG/sss_nr.h b/openair1/PHY/NR_REFSIG/sss_nr.h index 64200deb31..c260abd071 100644 --- a/openair1/PHY/NR_REFSIG/sss_nr.h +++ b/openair1/PHY/NR_REFSIG/sss_nr.h @@ -51,7 +51,7 @@ #define NUMBER_SSS_SEQUENCE (336) #define INVALID_SSS_SEQUENCE (NUMBER_SSS_SEQUENCE) #define LENGTH_SSS_NR (127) -#define SCALING_METRIC_SSS_NR (19) +#define SCALING_METRIC_SSS_NR (15)//(19) #define N_ID_2_NUMBER (NUMBER_PSS_SEQUENCE) #define N_ID_1_NUMBER (NUMBER_SSS_SEQUENCE) diff --git a/openair1/PHY/NR_TRANSPORT/nr_sss.c b/openair1/PHY/NR_TRANSPORT/nr_sss.c index 9b318d74ef..865e14465e 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_sss.c +++ b/openair1/PHY/NR_TRANSPORT/nr_sss.c @@ -21,7 +21,7 @@ #include "PHY/NR_TRANSPORT/nr_transport.h" -//#define NR_SSS_DEBUG +#define NR_SSS_DEBUG int nr_generate_sss( int16_t *d_sss, int32_t **txdataF, @@ -76,6 +76,7 @@ int nr_generate_sss( int16_t *d_sss, for (int m = 0; m < NR_SSS_LENGTH; m++) { ((int16_t*)txdataF[aa])[2*(l*frame_parms->ofdm_symbol_size + k)] = (a * d_sss[m]) >> 15; + printf("sss %d: %d\n",m,((int16_t*)txdataF[aa])[2*(l*frame_parms->ofdm_symbol_size + k)]); k++; if (k >= frame_parms->ofdm_symbol_size) @@ -83,7 +84,7 @@ int nr_generate_sss( int16_t *d_sss, } } #ifdef NR_SSS_DEBUG - write_output("sss_0.m", "sss_0", (void*)txdataF[0][2*l*frame_parms->ofdm_symbol_size], frame_parms->ofdm_symbol_size, 1, 1); + // write_output("sss_0.m", "sss_0", (void*)txdataF[0][l*frame_parms->ofdm_symbol_size], frame_parms->ofdm_symbol_size, 1, 1); #endif return 0; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c index 3d86947a7a..4608f3dc28 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c @@ -567,7 +567,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, #ifdef DEBUG_PBCH //printf("address dataf %p",nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].rxdataF); - write_output("rxdataF0_pbch.m","rxF0pbch",nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].rxdataF,frame_parms->ofdm_symbol_size*4,2,1); + write_output("rxdataF0_pbch.m","rxF0pbch",nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].rxdataF,frame_parms->ofdm_symbol_size*4,1,1); #endif nr_pbch_extract(nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].rxdataF, @@ -718,6 +718,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, printf("[PBCH] decoder payload[%d] = %x\n",i,decoded_output[i]); } //#endif + ue->dl_indication.rx_ind = &ue->rx_ind; // hang on rx_ind instance //ue->rx_ind.sfn_slot = 0; //should be set by higher-1-layer, i.e. clean_and_set_if_instance() ue->rx_ind.number_pdus = ue->rx_ind.number_pdus + 1; @@ -729,7 +730,8 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, ue->rx_ind.rx_indication_body->mib_pdu.ssb_length = Lmax; // confirm with TCL ue->rx_ind.rx_indication_body->mib_pdu.cell_id = frame_parms->Nid_cell; // confirm with TCL - ue->if_inst->dl_indication(&ue->dl_indication); + if (ue->if_inst && ue->if_inst->dl_indication) + ue->if_inst->dl_indication(&ue->dl_indication); return 0; } diff --git a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c index 969fe1b1e5..8c1f96b6ee 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c @@ -269,6 +269,8 @@ void generate_pss_nr(int N_ID_2, int ofdm_symbol_size) #ifdef DBG_PSS_NR if (N_ID_2 == 0) { + for (int i=0;i<16;i++) printf("f %d: %d,%d\n",i,synchroF_tmp[i<<1],synchroF_tmp[1+(i<<1)]); + for (int i=0;i<16;i++) printf("t %d: %d,%d\n",i,primary_synchro_time[i<<1],primary_synchro_time[1+(i<<1)]); char output_file[255]; char sequence_name[255]; sprintf(output_file, "%s%d_%d%s","pss_seq_t_", N_ID_2, length, ".m"); @@ -277,6 +279,9 @@ void generate_pss_nr(int N_ID_2, int ofdm_symbol_size) printf("file %s sequence %s\n", output_file, sequence_name); write_output(output_file, sequence_name, primary_synchro_time, length, 1, 1); + sprintf(output_file, "%s%d_%d%s","pss_seq_f_", N_ID_2, length, ".m"); + sprintf(sequence_name, "%s%d_%d","pss_seq_f_", N_ID_2, length); + write_output(output_file, sequence_name, synchroF_tmp, length, 1, 1); } #endif diff --git a/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c index 3231e82035..a29b676330 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c @@ -96,7 +96,8 @@ void init_context_sss_nr(int amp) /* Modulation of SSS is a BPSK TS 36.211 chapter 5.1.2 BPSK */ #if 1 - d_sss[N_ID_2][N_ID_1][n] = dss_current * amp; + d_sss[N_ID_2][N_ID_1][n] = dss_current;// * amp; + (void) amp; #else (void) amp; d_sss[N_ID_2][N_ID_1][n] = (dss_current * SHRT_MAX)>>SCALING_PSS_NR; @@ -126,6 +127,8 @@ void init_context_sss_nr(int amp) * *********************************************************************/ +#define DEBUG_SSS_NR +#define DEBUG_PLOT_SSS void insert_sss_nr(int16_t *sss_time, NR_DL_FRAME_PARMS *frame_parms) { @@ -425,21 +428,21 @@ int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric,uint8_t *phase_max) // Do FFTs for SSS/PSS // SSS nr_slot_fep(ue, - SSS_SYMBOL_NB, // symbol number - 0, // Ns slot number - ue->rx_offset, // sample_offset of int16_t - 0, // no_prefix - 1, // reset frequency estimation - NR_SSS_EST); + SSS_SYMBOL_NB, // symbol number + 0, // Ns slot number + ue->rx_offset, // sample_offset of int16_t + 0, // no_prefix + 1, // reset frequency estimation + NR_SSS_EST); // PSS nr_slot_fep(ue, - PSS_SYMBOL_NB, - 0, - ue->rx_offset, - 0, - 1, - NR_SSS_EST); + PSS_SYMBOL_NB, + 0, + ue->rx_offset, + 0, + 1, + NR_SSS_EST); frame_parms->nb_prefix_samples0 = nb_prefix_samples0; @@ -452,17 +455,11 @@ int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric,uint8_t *phase_max) #ifdef DEBUG_PLOT_SSS write_output("rxsig0.m","rxs0",&ue->common_vars.rxdata[0][0],ue->frame_parms.samples_per_tti,1,1); - write_output("rxdataF0.m","rxF0",&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[0]].rxdataF[0],frame_parms->ofdm_symbol_size,2,1); + write_output("rxdataF0.m","rxF0",&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[0]].rxdataF[0][frame_parms->ofdm_symbol_size*SSS_SYMBOL_NB],frame_parms->ofdm_symbol_size,2,1); write_output("pss_ext.m","pss_ext",pss_ext,LENGTH_PSS_NR,1,1); #endif -#if 0 - - write_output("sss_ext.m","sss_ext",sss_ext,LENGTH_SSS_NR,1,1); - write_output("sss_ref.m","sss_ref", d_sss,LENGTH_SSS_NR,1,1); - -#endif #if 0 int16_t *p = (int16_t *)sss_ext[0]; @@ -489,6 +486,14 @@ int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric,uint8_t *phase_max) sss = (int16_t*)&sss_ext[0][0]; +#ifdef DEBUG_PLOT_SSS + + write_output("sss_ext.m","sss_ext",sss_ext[0],LENGTH_SSS_NR,1,1); + write_output("sss_ref.m","sss_ref", d_sss,LENGTH_SSS_NR,1,1); + +#endif + + #if 0 /* simulate of a phase shift on the signal */ @@ -499,11 +504,11 @@ int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric,uint8_t *phase_max) #endif -#if 0 +#if 1 int16_t *ps = (int16_t *)pss_ext; for (int i = 0; i < LENGTH_SSS_NR; i++) { - printf("sss ref [%i] : %d %d \n", i, d_sss[0][0][i], d_sss[0][0][i]); + printf("sss ref [%i] : %d \n", i, d_sss[0][0][i]); printf("sss ext [%i] : %d %d \n", i, sss[2*i], sss[2*i+1]); printf("pss ref [%i] : %d %d \n", i, primary_synchro_nr[0][2*i], primary_synchro_nr[0][2*i+1]); @@ -528,8 +533,11 @@ int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric,uint8_t *phase_max) // This is the inner product using one particular value of each unknown parameter for (i=0; i < LENGTH_SSS_NR; i++) { + metric_re += d[i]*(((phase_re_nr[phase]*sss[2*i])>>SCALING_METRIC_SSS_NR) - ((phase_im_nr[phase]*sss[2*i+1])>>SCALING_METRIC_SSS_NR)) + d[i]*(((phase_im_nr[phase]*sss[2*i])>>SCALING_METRIC_SSS_NR) + ((phase_re_nr[phase]*sss[2*i+1])>>SCALING_METRIC_SSS_NR)); + if (Nid1 ==0 && phase==3) + printf("i %d, phase %d/%d: metric %d, phase (%d,%d) sss (%d,%d) d %d\n",i,phase,PHASE_HYPOTHESIS_NUMBER,metric_re,phase_re_nr[phase],phase_im_nr[phase],sss[2*i],sss[1+(2*i)],d[i]); } metric = metric_re; @@ -550,14 +558,14 @@ int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric,uint8_t *phase_max) } //#ifdef DEBUG_SSS_NR - + #define SSS_METRIC_FLOOR_NR (30000) -if (*tot_metric > SSS_METRIC_FLOOR_NR) { + if (*tot_metric > SSS_METRIC_FLOOR_NR) { Nid2 = GET_NID2(frame_parms->Nid_cell); Nid1 = GET_NID1(frame_parms->Nid_cell); printf("Nid2 %d Nid1 %d tot_metric %d, phase_max %d \n", Nid2, Nid1, *tot_metric, *phase_max); -} -//#endif - + } + //#endif + return(0); } diff --git a/openair1/PHY/TOOLS/lte_dfts.c b/openair1/PHY/TOOLS/lte_dfts.c index 0c6bab6557..1a04a3774a 100644 --- a/openair1/PHY/TOOLS/lte_dfts.c +++ b/openair1/PHY/TOOLS/lte_dfts.c @@ -74,7 +74,7 @@ static inline void cmac(__m128i a,__m128i b, __m128i *re32, __m128i *im32) cmac_tmp = _mm_sign_epi16(b,*(__m128i*)reflip); cmac_tmp_re32 = _mm_madd_epi16(a,cmac_tmp); - + // cmac_tmp = _mm_shufflelo_epi16(b,_MM_SHUFFLE(2,3,0,1)); // cmac_tmp = _mm_shufflehi_epi16(cmac_tmp,_MM_SHUFFLE(2,3,0,1)); cmac_tmp = _mm_shuffle_epi8(b,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); @@ -4464,6 +4464,7 @@ void dft2048(int16_t *x,int16_t *y,int scale) _mm_empty(); _m_empty(); + } void idft2048(int16_t *x,int16_t *y,int scale) @@ -4567,6 +4568,8 @@ void dft2048(int16_t *x,int16_t *y,int scale) int i; simd256_q15_t ONE_OVER_SQRT2_Q15_128 = set1_int16_simd256(ONE_OVER_SQRT2_Q15); + write_output("dftin.m","dftin",x,2048,1,1); + xtmpp = xtmp; for (i=0; i<4; i++) { @@ -4645,7 +4648,7 @@ void dft2048(int16_t *x,int16_t *y,int scale) _mm_empty(); _m_empty(); - + write_output("dftout.m","dftout",y,2048,1,1); } void idft2048(int16_t *x,int16_t *y,int scale) @@ -4658,7 +4661,7 @@ void idft2048(int16_t *x,int16_t *y,int scale) simd256_q15_t ONE_OVER_SQRT2_Q15_128 = set1_int16_simd256(ONE_OVER_SQRT2_Q15); xtmpp = xtmp; - + for (i=0; i<4; i++) { transpose4_ooff_simd256(x256 ,xtmpp,128); transpose4_ooff_simd256(x256+2,xtmpp+1,128);