diff --git a/openair1/PHY/LTE_TRANSPORT/nsss_NB_IoT.c b/openair1/PHY/LTE_TRANSPORT/nsss_NB_IoT.c index bcc551f6bf132dfa95bad40e9678f7289e436d2d..913744c22238331c2a6bbe05ea8373659ff83ac8 100644 --- a/openair1/PHY/LTE_TRANSPORT/nsss_NB_IoT.c +++ b/openair1/PHY/LTE_TRANSPORT/nsss_NB_IoT.c @@ -135,11 +135,139 @@ int generate_sss_NB_IoT(int32_t **txdataF, return(0); } -// int rx_nsss_NB_IoT(PHY_VARS_UE_NB_IoT *ue) -// { -// uint8_t Nid2 = ue->common_vars.eNb_id; -// NB_IoT_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; +int rx_nsss_NB_IoT(PHY_VARS_UE_NB_IoT *ue,int32_t *tot_metric) +{ + + uint8_t Nid2,q_est,u_est; + NB_IoT_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + int l,k,m; + int16_t *d, *nsss_sf; + int32_t nsss_ext[2][132]; // up to 2 rx antennas ? + int32_t metric; // correlation metric + + // we suppose we are in NSSS subframe, after DFT + // this could be changed in further version + for (l=0;l<11;l++){ + nsss_extract_NB_IoT(ue,frame_parms,nsss_ext,l); + } + + // now do the Cell ID estimation based on the precomputed sequences in PHY/LTE_TRANSPORT/nsss_NB_IoT.h + + *tot_metric = -99999999; + nsss_sf = (int16_t*)&nsss_ext[0][0]; + + for (Nid2=0;Nid2<16;Nid2++){ + + switch (Nid2) { + case 0: + d = d0f0; + break; + case 1: + d = d0f1; + break; + case 2: + d = d0f2; + break; + case 3: + d = d0f3; + break; + case 4: + d = d1f0; + break; + case 5: + d = d1f1; + break; + case 6: + d = d1f2; + break; + case 7: + d = d1f3; + break; + case 8: + d = d2f0; + break; + case 9: + d = d2f1; + break; + case 10: + d = d2f2; + break; + case 11: + d = d2f3; + case 12: + d = d3f0; + break; + case 13: + d = d3f1; + break; + case 14: + d = d3f2; + break; + case 15: + d = d3f3; + break; + + default: + msg("[NSSS] ERROR\n"); + return(-1); + } + + for (k=0;k<126;k++){ + metric = 0; + + for (m=0;m<132;m++){ + + metric += (int32_t)d[(k*126+m)<<1] * (int32_t)nsss_sf[(k*126+m)<<1] + + (int32_t)d[((k*126+m)<<1)+1] * (int32_t)nsss_sf[((k*126+m)<<1)+1]; // real part of correlation + + } + + if (metric > *tot_metric){ + q_est = Nid2/4; + u_est = k; + ue->frame_parms.Nid_cell = q_est*126 + u_est; + } -// return(0); -// } + } + + } + + return(0); +} + +int nsss_extract_NB_IoT(PHY_VARS_UE_NB_IoT *ue, + NB_IoT_DL_FRAME_PARMS *frame_parms, + int32_t **nsss_ext, + int l) +{ + uint8_t i,aarx; + unsigned short UL_RB_ID_NB_IoT; // index of RB dedicated to NB-IoT + int32_t *nsss_rxF,*nsssF_ext; + int32_t **rxdataF; + int first_symbol_offset = 3; // NSSS starts at third symbol in subframe + + UL_RB_ID_NB_IoT = frame_parms->NB_IoT_RB_ID; + + for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { + + rxdataF = ue->common_vars.common_vars_rx_data_per_thread[0].rxdataF; // Note that + nsssF_ext = &nsss_ext[aarx][l*12]; + + if (UL_RB_ID_NB_IoT <= (frame_parms->N_RB_DL>>1)) { // NB-IoT RB is in the first half + nsss_rxF = &rxdataF[aarx][(UL_RB_ID_NB_IoT*12 + frame_parms->first_carrier_offset + ((l+first_symbol_offset)*(frame_parms->ofdm_symbol_size)))]; + }// For second half of RBs skip DC carrier + else{ // NB-IoT RB is in the second half + nsss_rxF = &rxdataF[aarx][(1 + 6*(2*UL_RB_ID_NB_IoT - frame_parms->N_RB_DL) + ((l+first_symbol_offset)*(frame_parms->ofdm_symbol_size)))]; + //dl_ch0++; + } + + for (i=0; i<12; i++) { + nsssF_ext[i]=nsss_rxF[i]; + } + + } + + return(0); + +} diff --git a/openair1/PHY/LTE_TRANSPORT/proto_NB_IoT.h b/openair1/PHY/LTE_TRANSPORT/proto_NB_IoT.h index 88d896f3c11e8eaead054dffc0b92aa9775aca12..5c45100dcf96512d9a101cd57b0d36d4660969fb 100644 --- a/openair1/PHY/LTE_TRANSPORT/proto_NB_IoT.h +++ b/openair1/PHY/LTE_TRANSPORT/proto_NB_IoT.h @@ -51,7 +51,16 @@ int generate_sss_NB_IoT(int32_t **txdataF, uint16_t symbol_offset, // symbol_offset = 3 for NB-IoT uint16_t slot_offset, unsigned short frame_number, // new attribute (Get value from higher layer), it does not exist for LTE - unsigned short RB_IoT_ID); // new attribute (values are between 0.. Max_RB_number-1), it does not exist for LTE + unsigned short RB_IoT_ID); // new attribute (values are between 0.. Max_RB_number-1), it does not exist for LTE + +//*****************Vincent part for Cell ID estimation from NSSS ******************// + +int rx_nsss_NB_IoT(PHY_VARS_UE_NB_IoT *ue,int32_t *tot_metric); + +int nsss_extract_NB_IoT(PHY_VARS_UE_NB_IoT *ue, + NB_IoT_DL_FRAME_PARMS *frame_parms, + int32_t **nsss_ext, + int l); //NRS