diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c index 9c061f587296bd1e820c5221cfd7940a4931783f..e1055e3e2424758f40d638605d768ed50c909499 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c @@ -23,6 +23,7 @@ #include <string.h> #include "nr_ul_estimation.h" +#include "PHY/sse_intrin.h" #include "PHY/NR_REFSIG/nr_refsig.h" #include "PHY/NR_UE_ESTIMATION/filt16a_32.h" @@ -35,18 +36,19 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, unsigned short p, unsigned char symbol, unsigned short bwp_start_subcarrier, - unsigned short nb_rb_pusch) + unsigned short nb_rb_pusch, + dmrs_UplinkConfig_t *dmrs_UplinkConfig) { int pilot[3280] __attribute__((aligned(16))); unsigned char aarx; unsigned short k; - unsigned int pilot_cnt; - int16_t ch[2],*pil,*rxF,*ul_ch; + unsigned int pilot_cnt,re_cnt; + int16_t ch[2],ch_r[2],ch_l[2],*pil,*rxF,*ul_ch; int16_t *fl,*fm,*fr,*fml,*fmr,*fmm,*fdcl,*fdcr,*fdclh,*fdcrh; int ch_offset,symbol_offset, length_dmrs, UE_id = 0; unsigned short n_idDMRS[2] = {0,1}; //to update from pusch config - int32_t temp_in_ifft_0[8192*2] __attribute__((aligned(32))); int32_t **ul_ch_estimates_time = gNB->pusch_vars[UE_id]->ul_ch_estimates_time; + __m128i *ul_ch_128; #ifdef DEBUG_CH FILE *debug_ch_est; @@ -115,17 +117,17 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, nr_gold_pusch(gNB, symbol, n_idDMRS, length_dmrs); - nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch[gNB_offset][Ns][0], &pilot[0], 1000, 0, nb_rb_pusch); + nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch[gNB_offset][Ns][0], &pilot[0], 1000, 0, nb_rb_pusch, dmrs_UplinkConfig->pusch_dmrs_type); //------------------------------------------------// for (aarx=0; aarx<gNB->frame_parms.nb_antennas_rx; aarx++) { - pil = (int16_t *)&pilot[0]; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+nushift)]; - ul_ch = (int16_t *)&ul_ch_estimates[aarx][ch_offset]; + pil = (int16_t *)&pilot[0]; + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+nushift)]; + ul_ch = (int16_t *)&ul_ch_estimates[aarx][ch_offset]; - memset(ul_ch,0,4*(gNB->frame_parms.ofdm_symbol_size)); + memset(ul_ch,0,4*(gNB->frame_parms.ofdm_symbol_size)); #ifdef DEBUG_PUSCH printf("ch est pilot addr %p RB_DL %d\n",&pilot[0], gNB->frame_parms.N_RB_UL); @@ -135,6 +137,9 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, #endif //if ((gNB->frame_parms.N_RB_UL&1)==0) { + + if (dmrs_UplinkConfig->pusch_dmrs_type == pusch_dmrs_type1){ + // Treat first 2 pilots specially (left edge) ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); @@ -144,6 +149,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, printf("pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); printf("data 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[2],rxF[3],&rxF[2],ch[0],ch[1],pil[0],pil[1]); #endif + multadd_real_vector_complex_scalar(fl, ch, ul_ch, @@ -192,28 +198,33 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -#ifdef DEBUG_CH - fprintf(debug_ch_est, "pilot %d : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); - //printf("pilot %d : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); -#endif - multadd_real_vector_complex_scalar(fm, + + #ifdef DEBUG_PUSCH + printf("pilot 1 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); + #endif + multadd_real_vector_complex_scalar(fml, ch, ul_ch, 8); - pil+=2; re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - + //printf("ul_ch addr %p\n",ul_ch); + ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -#ifdef DEBUG_PUSCH - printf("pilot %d : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); -#endif + + #ifdef DEBUG_PUSCH + printf("pilot 2 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); + #endif multadd_real_vector_complex_scalar(fmm, ch, ul_ch, 8); + + //for (int i= 0; i<16; i++) + //printf("ul_ch addr %p %d\n", ul_ch+i, *(ul_ch+i)); + pil+=2; re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; @@ -328,65 +339,153 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, printf("%d\n",idxP); } #endif + + } else { //pusch_dmrs_type2 |p_r,p_l,d,d,d,d,p_r,p_l,d,d,d,d| + + // Treat first DMRS specially (left edge) + + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + + ul_ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); + ul_ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); + + pil+=2; + ul_ch+=2; + re_offset = (re_offset + 1)%gNB->frame_parms.ofdm_symbol_size; + ch_offset++; + + for (re_cnt = 1; re_cnt < (nb_rb_pusch*NR_NB_SC_PER_RB) - 5; re_cnt+=6){ + + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + + ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); + ch_l[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); + + ul_ch[0] = ch_l[0]; + ul_ch[1] = ch_l[1]; + + pil+=2; + ul_ch+=2; + ch_offset++; + + multadd_real_four_symbols_vector_complex_scalar(filt8_ml2, + ch_l, + ul_ch); + + re_offset = (re_offset+5)%gNB->frame_parms.ofdm_symbol_size; + + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + + ch_r[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); + ch_r[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); + + + multadd_real_four_symbols_vector_complex_scalar(filt8_mr2, + ch_r, + ul_ch); + + //for (int re_idx = 0; re_idx < 8; re_idx+=2) + //printf("ul_ch = %d + j*%d\n", ul_ch[re_idx], ul_ch[re_idx+1]); + + ul_ch+=8; + ch_offset+=4; + + ul_ch[0] = ch_r[0]; + ul_ch[1] = ch_r[1]; + + pil+=2; + ul_ch+=2; + ch_offset++; + re_offset = (re_offset + 1)%gNB->frame_parms.ofdm_symbol_size; + + } + + // Treat last pilot specially (right edge) + + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + + ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); + ch_l[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); + + ul_ch[0] = ch_l[0]; + ul_ch[1] = ch_l[1]; + + ul_ch+=2; + ch_offset++; + + multadd_real_four_symbols_vector_complex_scalar(filt8_rr1, + ch_l, + ul_ch); + + multadd_real_four_symbols_vector_complex_scalar(filt8_rr2, + ch_r, + ul_ch); + + ul_ch_128 = (__m128i *)&ul_ch_estimates[aarx][ch_offset]; + + ul_ch_128[0] = _mm_slli_epi16 (ul_ch_128[0], 2); + } + + + // Convert to time domain - memset(temp_in_ifft_0, 0, gNB->frame_parms.ofdm_symbol_size*sizeof(int32_t)); - memcpy(temp_in_ifft_0, &ul_ch_estimates[aarx][symbol_offset], nb_rb_pusch * NR_NB_SC_PER_RB * sizeof(int32_t)); - - switch (gNB->frame_parms.ofdm_symbol_size) { - case 128: - idft128((int16_t*) temp_in_ifft_0, - (int16_t*) ul_ch_estimates_time[aarx], - 1); - break; - - case 256: - idft256((int16_t*) temp_in_ifft_0, - (int16_t*) ul_ch_estimates_time[aarx], - 1); - break; - - case 512: - idft512((int16_t*) temp_in_ifft_0, - (int16_t*) ul_ch_estimates_time[aarx], - 1); - break; - - case 1024: - idft1024((int16_t*) temp_in_ifft_0, - (int16_t*) ul_ch_estimates_time[aarx], - 1); - break; - - case 1536: - idft1536((int16_t*) temp_in_ifft_0, - (int16_t*) ul_ch_estimates_time[aarx], - 1); - break; - - case 2048: - idft2048((int16_t*) temp_in_ifft_0, - (int16_t*) ul_ch_estimates_time[aarx], - 1); - break; - - case 4096: - idft4096((int16_t*) temp_in_ifft_0, - (int16_t*) ul_ch_estimates_time[aarx], - 1); - break; - - case 8192: - idft8192((int16_t*) temp_in_ifft_0, - (int16_t*) ul_ch_estimates_time[aarx], - 1); - break; - - default: - idft512((int16_t*) temp_in_ifft_0, - (int16_t*) ul_ch_estimates_time[aarx], - 1); - break; - } + + switch (gNB->frame_parms.ofdm_symbol_size) { + case 128: + idft128((int16_t*) &ul_ch_estimates[aarx][symbol_offset], + (int16_t*) ul_ch_estimates_time[aarx], + 1); + break; + + case 256: + idft256((int16_t*) &ul_ch_estimates[aarx][symbol_offset], + (int16_t*) ul_ch_estimates_time[aarx], + 1); + break; + + case 512: + idft512((int16_t*) &ul_ch_estimates[aarx][symbol_offset], + (int16_t*) ul_ch_estimates_time[aarx], + 1); + break; + + case 1024: + idft1024((int16_t*) &ul_ch_estimates[aarx][symbol_offset], + (int16_t*) ul_ch_estimates_time[aarx], + 1); + break; + + case 1536: + idft1536((int16_t*) &ul_ch_estimates[aarx][symbol_offset], + (int16_t*) ul_ch_estimates_time[aarx], + 1); + break; + + case 2048: + idft2048((int16_t*) &ul_ch_estimates[aarx][symbol_offset], + (int16_t*) ul_ch_estimates_time[aarx], + 1); + break; + + case 4096: + idft4096((int16_t*) &ul_ch_estimates[aarx][symbol_offset], + (int16_t*) ul_ch_estimates_time[aarx], + 1); + break; + + case 8192: + idft8192((int16_t*) &ul_ch_estimates[aarx][symbol_offset], + (int16_t*) ul_ch_estimates_time[aarx], + 1); + break; + + default: + idft512((int16_t*) &ul_ch_estimates[aarx][symbol_offset], + (int16_t*) ul_ch_estimates_time[aarx], + 1); + break; + } + } #ifdef DEBUG_CH diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h index 125c166f7d3f4c4441fd5993ca53efa54d273ffd..cc84f2292c6b681457931bb9c8a1db709f30fab3 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h @@ -45,7 +45,8 @@ unsigned short p, unsigned char symbol, unsigned short bwp_start_subcarrier, - unsigned short nb_rb_pusch); + unsigned short nb_rb_pusch, + dmrs_UplinkConfig_t *dmrs_UplinkConfig); int nr_est_timing_advance_pusch(PHY_VARS_gNB* phy_vars_gNB, int UE_id); diff --git a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c index 182f8b6215c8c847ce850b3653b0abcc64c11bd6..f933a8c7ab322a8295f83d9e314209a2e7d56200 100644 --- a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c +++ b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c @@ -56,9 +56,10 @@ int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB, int32_t *output, unsigned short p, unsigned char lp, - unsigned short nb_pusch_rb) + unsigned short nb_pusch_rb, + uint8_t dmrs_type) { - int8_t w,config_type; + int8_t w; short *mod_table; unsigned char idx=0; @@ -66,18 +67,16 @@ int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB, array_of_w *wf; array_of_w *wt; - config_type = 0; //to be updated by higher layer + wf = (dmrs_type==pusch_dmrs_type1) ? wf1 : wf2; + wt = (dmrs_type==pusch_dmrs_type1) ? wt1 : wt2; - wf = (config_type==0) ? wf1 : wf2; - wt = (config_type==0) ? wt1 : wt2; + if (dmrs_type > 2) + LOG_E(PHY,"Bad PUSCH DMRS config type %d\n", dmrs_type); - if (config_type > 1) - LOG_E(PHY,"Bad PUSCH DMRS config type %d\n", config_type); - - if ((p>=1000) && (p<((config_type==0) ? 1008 : 1012))) { + if ((p>=1000) && (p<((dmrs_type==pusch_dmrs_type1) ? 1008 : 1012))) { if (gNB->frame_parms.Ncp == NORMAL) { - for (int i=0; i<nb_pusch_rb*((config_type==0) ? 6:4); i++) { + for (int i=0; i<nb_pusch_rb*((dmrs_type==pusch_dmrs_type1) ? 6:4); i++) { w = (wf[p-1000][i&1])*(wt[p-1000][lp]); mod_table = (w==1) ? nr_rx_mod_table : nr_rx_nmod_table; @@ -86,7 +85,7 @@ int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB, ((int16_t*)output)[i<<1] = mod_table[(NR_MOD_TABLE_QPSK_OFFSET + idx)<<1]; ((int16_t*)output)[(i<<1)+1] = mod_table[((NR_MOD_TABLE_QPSK_OFFSET + idx)<<1) + 1]; #ifdef DEBUG_PUSCH - printf("nr_pusch_dmrs_rx dmrs config type %d port %d nb_pusch_rb %d\n", config_type, p, nb_pusch_rb); + printf("nr_pusch_dmrs_rx dmrs config type %d port %d nb_pusch_rb %d\n", dmrs_type, p, nb_pusch_rb); printf("wf[%d] = %d wt[%d]= %d\n", i&1, wf[p-1000][i&1], lp, wt[p-1000][lp]); printf("i %d idx %d pusch gold %u b0-b1 %d-%d mod_dmrs %d %d\n", i, idx, nr_gold_pusch[(i<<1)>>5], (((nr_gold_pusch[(i<<1)>>5])>>((i<<1)&0x1f))&1), (((nr_gold_pusch[((i<<1)+1)>>5])>>(((i<<1)+1)&0x1f))&1), ((int16_t*)output)[i<<1], ((int16_t*)output)[(i<<1)+1]); diff --git a/openair1/PHY/NR_REFSIG/nr_refsig.h b/openair1/PHY/NR_REFSIG/nr_refsig.h index e1bfa1420dfb8670fe8ab24a861f17fd81bc8b54..754edfef64c69e516a748a5074302706d82fc7fa 100644 --- a/openair1/PHY/NR_REFSIG/nr_refsig.h +++ b/openair1/PHY/NR_REFSIG/nr_refsig.h @@ -47,5 +47,6 @@ int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB, int32_t *output, unsigned short p, unsigned char lp, - unsigned short nb_pusch_rb); + unsigned short nb_pusch_rb, + uint8_t dmrs_type); #endif diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h index d74db96e4e04887ab62723e085b145a3876b34e5..4c8d8650e3adee0c425825455a150ff7db05291c 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h +++ b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h @@ -75,15 +75,18 @@ void nr_ulsch_extract_rbs_single(int **rxdataF, unsigned short start_rb, unsigned short nb_rb_pusch, NR_DL_FRAME_PARMS *frame_parms, - uint8_t is_dmrs_symbol, - uint8_t dmrs_symbol); + uint8_t dmrs_symbol, + uint16_t number_symbols, + uint8_t mapping_type, + dmrs_UplinkConfig_t *dmrs_UplinkConfig); void nr_ulsch_scale_channel(int32_t **ul_ch_estimates_ext, NR_DL_FRAME_PARMS *frame_parms, NR_gNB_ULSCH_t **ulsch_gNB, uint8_t symbol, uint8_t start_symbol, - uint16_t nb_rb); + uint16_t nb_rb, + pusch_dmrs_type_t pusch_dmrs_type); /** \brief This function computes the average channel level over all allocated RBs and antennas (TX/RX) in order to compute output shift for compensated signal diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c index f74c32e0c7f31f312a9e69094963543c92fc804d..eb35fd7dc6a2e6d949c1cc8834ede11dd133bd3b 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c @@ -231,21 +231,25 @@ void nr_ulsch_extract_rbs_single(int **rxdataF, unsigned short start_rb, unsigned short nb_rb_pusch, NR_DL_FRAME_PARMS *frame_parms, - uint8_t is_dmrs_symbol, - uint8_t dmrs_symbol) + uint8_t dmrs_symbol, + uint16_t number_symbols, + uint8_t mapping_type, + dmrs_UplinkConfig_t *dmrs_UplinkConfig) { unsigned short start_re, re, nb_re_pusch; unsigned char aarx; uint32_t rxF_ext_index = 0; uint32_t ul_ch0_ext_index = 0; uint32_t ul_ch0_index = 0; + uint8_t is_dmrs_symbol_flag, k_prime; + uint16_t n=0; int16_t *rxF,*rxF_ext; int *ul_ch0,*ul_ch0_ext; #ifdef DEBUG_RB_EXT - printf("--------------------symbol = %d, is_dmrs_symbol = %u-----------------------\n", symbol, is_dmrs_symbol); + printf("--------------------symbol = %d-----------------------\n", symbol); printf("--------------------ch_ext_index = %d-----------------------\n", symbol*NR_NB_SC_PER_RB * nb_rb_pusch); #endif @@ -253,6 +257,7 @@ void nr_ulsch_extract_rbs_single(int **rxdataF, start_re = (frame_parms->first_carrier_offset + (start_rb * NR_NB_SC_PER_RB))%frame_parms->ofdm_symbol_size; nb_re_pusch = NR_NB_SC_PER_RB * nb_rb_pusch; + is_dmrs_symbol_flag = 0; for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) { @@ -263,26 +268,44 @@ void nr_ulsch_extract_rbs_single(int **rxdataF, ul_ch0_ext = &ul_ch_estimates_ext[aarx][symbol*nb_re_pusch]; + n = 0; + k_prime = 0; + for (re = 0; re < nb_re_pusch; re++) { - if ( (is_dmrs_symbol && ((re&1) != 0)) || (is_dmrs_symbol == 0) ) { // [hna] (re&1) != frame_parms->nushift) assuming only dmrs type 1 and mapping type A - // frame_parms->nushift should be initialized with 0 + is_dmrs_symbol_flag = is_dmrs_symbol(symbol, + (start_re + re)%frame_parms->ofdm_symbol_size, + start_re, + k_prime, + n, + 0, + number_symbols, + dmrs_UplinkConfig, + mapping_type, + frame_parms->ofdm_symbol_size); + #ifdef DEBUG_RB_EXT + printf("re = %d, is_dmrs_symbol_flag = %d, symbol = %d\n", re, is_dmrs_symbol_flag, symbol); + #endif + + if ( is_dmrs_symbol_flag == 0 ) { + rxF_ext[rxF_ext_index] = (rxF[ ((start_re + re)*2) % (frame_parms->ofdm_symbol_size*2)]); rxF_ext[rxF_ext_index + 1] = (rxF[(((start_re + re)*2) + 1) % (frame_parms->ofdm_symbol_size*2)]); ul_ch0_ext[ul_ch0_ext_index] = ul_ch0[ul_ch0_index]; - ul_ch0_ext_index++; - rxF_ext_index = rxF_ext_index + 2; - } - - ul_ch0_index++; - #ifdef DEBUG_RB_EXT printf("rxF_ext[%d] = %d\n", rxF_ext_index, rxF_ext[rxF_ext_index]); printf("rxF_ext[%d] = %d\n", rxF_ext_index+1, rxF_ext[rxF_ext_index+1]); - printf("ul_ch0_ext[%d] = %d\n", 2*rxF_ext_index, ((int16_t *)ul_ch0_ext)[2*rxF_ext_index]); - printf("ul_ch0_ext[%d] = %d\n", 2*rxF_ext_index + 1, ((int16_t *)ul_ch0_ext)[2*rxF_ext_index + 1]); #endif + + ul_ch0_ext_index++; + rxF_ext_index +=2; + } else { + k_prime++; + k_prime&=1; + n+=(k_prime)?0:1; + } + ul_ch0_index++; } } } @@ -292,7 +315,8 @@ void nr_ulsch_scale_channel(int **ul_ch_estimates_ext, NR_gNB_ULSCH_t **ulsch_gNB, uint8_t symbol, uint8_t is_dmrs_symbol, - unsigned short nb_rb) + unsigned short nb_rb, + pusch_dmrs_type_t pusch_dmrs_type) { #if defined(__x86_64__)||defined(__i386__) @@ -316,7 +340,10 @@ void nr_ulsch_scale_channel(int **ul_ch_estimates_ext, ul_ch128 = (__m128i *)&ul_ch_estimates_ext[aarx][symbol*nb_rb*NR_NB_SC_PER_RB]; if (is_dmrs_symbol==1){ - nb_rb = nb_rb>>1; + if (pusch_dmrs_type == pusch_dmrs_type1) + nb_rb = nb_rb>>1; + else + nb_rb = (2*nb_rb)/3; } @@ -367,7 +394,7 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext, ul_ch128=(__m128i *)&ul_ch_estimates_ext[(aatx<<1)+aarx][symbol*nb_rb*12]; - for (rb = 0; rb < nb_rb; rb++) { + for (rb = 0; rb < len/12; rb++) { avg128U = _mm_add_epi32(avg128U, _mm_srai_epi32(_mm_madd_epi16(ul_ch128[0], ul_ch128[0]), x)); avg128U = _mm_add_epi32(avg128U, _mm_srai_epi32(_mm_madd_epi16(ul_ch128[1], ul_ch128[1]), x)); avg128U = _mm_add_epi32(avg128U, _mm_srai_epi32(_mm_madd_epi16(ul_ch128[2], ul_ch128[2]), x)); @@ -997,18 +1024,18 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB, bwp_start_subcarrier = (rel15_ul->start_rb*NR_NB_SC_PER_RB + frame_parms->first_carrier_offset) % frame_parms->ofdm_symbol_size; dmrs_symbol_flag = is_dmrs_symbol(symbol, - 0, - 0, - 0, - 0, - 0, - rel15_ul->number_symbols, - &gNB->dmrs_UplinkConfig, - mapping_type, - frame_parms->ofdm_symbol_size); + 0, + 0, + 0, + 0, + 0, + rel15_ul->number_symbols, + &gNB->dmrs_UplinkConfig, + mapping_type, + frame_parms->ofdm_symbol_size); if (dmrs_symbol_flag == 1){ - nb_re_pusch = rel15_ul->number_rbs * 6; + nb_re_pusch = rel15_ul->number_rbs * ((gNB->dmrs_UplinkConfig.pusch_dmrs_type==pusch_dmrs_type1)?6:8); gNB->pusch_vars[UE_id]->dmrs_symbol = symbol; } else { nb_re_pusch = rel15_ul->number_rbs * NR_NB_SC_PER_RB; @@ -1026,7 +1053,8 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB, 0, // p symbol, bwp_start_subcarrier, - rel15_ul->number_rbs); + rel15_ul->number_rbs, + &gNB->dmrs_UplinkConfig); //---------------------------------------------------------- //--------------------- RBs extraction --------------------- @@ -1042,15 +1070,18 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB, rel15_ul->start_rb, rel15_ul->number_rbs, frame_parms, - dmrs_symbol_flag, - gNB->pusch_vars[UE_id]->dmrs_symbol); + gNB->pusch_vars[UE_id]->dmrs_symbol, + rel15_ul->number_symbols, + mapping_type, + &gNB->dmrs_UplinkConfig); nr_ulsch_scale_channel(gNB->pusch_vars[UE_id]->ul_ch_estimates_ext, frame_parms, gNB->ulsch[UE_id], symbol, dmrs_symbol_flag, - rel15_ul->number_rbs); + rel15_ul->number_rbs, + gNB->dmrs_UplinkConfig.pusch_dmrs_type); if (first_symbol_flag==1) { diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c index eeee55ea3fc3fe744436e497187c20233b0bd47d..dec3d7cc2d8215406cd67f9b77ba8e669135a929 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c +++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c @@ -173,3 +173,15 @@ short filt8_dcl1_h[8]= { short filt8_dcr1_h[8]= { 0,0,4096,8192,12288,16384,0,0}; + +short filt8_ml2[8] = { +13107,9830,6554,3277,0,0,0,0}; + +short filt8_mr2[8] = { +3277,6554,9830,13107,0,0,0,0}; + +short filt8_rr1[8] = { +8192,12288,16384,20480,0,0,0,0}; + +short filt8_rr2[8] = { +-4096,-8192,-12288,-16384,0,0,0,0}; diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h index f64aebeb52b64df6efbffefed35939d404e781f1..e350985b0a851bd0e6ea2cee17857bfc5e66eaa6 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h +++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h @@ -124,4 +124,13 @@ extern short filt8_dcr1[8]; extern short filt8_dcl1_h[8]; extern short filt8_dcr1_h[8]; -#endif + +extern short filt8_ml2[8]; + +extern short filt8_mr2[8]; + +extern short filt8_rr1[8]; + +extern short filt8_rr2[8]; + +#endif \ No newline at end of file diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c index e1e44e137ffefaa7e41837a4caed55aa18d530b3..b07d9c31f2846aad01a2245f47ca0c31ab9b835f 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c @@ -91,13 +91,13 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, int gNB_id) { uint32_t available_bits; - uint8_t mod_order, cwd_index, num_of_codewords; + uint8_t mod_order, cwd_index, num_of_codewords, l; uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>5]; uint32_t ***pusch_dmrs; int16_t **tx_layers; int32_t **txdataF; uint16_t start_sc, start_rb; - int8_t Wf[2], Wt[2], l0, l_prime[2], delta; + int8_t Wf[2], Wt[2], l_prime[2], delta; uint16_t n_dmrs, code_rate, number_dmrs_symbols; uint8_t dmrs_type; uint8_t mapping_type; @@ -135,8 +135,6 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, mapping_type, frame_parms->ofdm_symbol_size); - printf("number_dmrs_symbols = %u\n", number_dmrs_symbols); - ulsch_ue->length_dmrs = UE->dmrs_UplinkConfig.pusch_maxLength; ulsch_ue->rnti = n_rnti; ulsch_ue->Nid_cell = Nid_cell; @@ -229,8 +227,6 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, n_dmrs = (harq_process_ul_ue->nb_rb*ulsch_ue->nb_re_dmrs); int16_t mod_dmrs[n_dmrs<<1]; dmrs_type = UE->dmrs_UplinkConfig.pusch_dmrs_type; - - l0 = get_l0_ul(mapping_type, 2); /////////// //////////////////////////////////////////////////////////////////////// @@ -252,7 +248,6 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, /////////// l_prime[0] = 0; // single symbol ap 0 - uint8_t dmrs_symbol = l0+l_prime[0], l; // Assuming dmrs-AdditionalPosition = 0 #ifdef NR_SC_FDMA uint32_t nb_re_pusch, nb_re_dmrs_per_rb; @@ -260,8 +255,19 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, for (l = start_symbol; l < start_symbol + harq_process_ul_ue->number_of_symbols; l++) { - if(l == dmrs_symbol) - nb_re_dmrs_per_rb = ulsch_ue->nb_re_dmrs; // [hna] ulsch_ue->nb_re_dmrs = 6 in this configuration + is_dmrs = is_dmrs_symbol(l, + 0, + 0, + 0, + 0, + 0, + harq_process_ul_ue->number_of_symbols, + &UE->dmrs_UplinkConfig, + mapping_type, + frame_parms->ofdm_symbol_size); + + if (is_dmrs == 1) + nb_re_dmrs_per_rb = ulsch_ue->nb_re_dmrs; else nb_re_dmrs_per_rb = 0; @@ -328,8 +334,6 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, if (is_dmrs == 1) { - printf("DMRS l = %u\n", l); - nr_modulation(pusch_dmrs[l][0], n_dmrs*2, DMRS_MOD_ORDER, mod_dmrs); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*mod_dmrs[dmrs_idx<<1]) >> 15; diff --git a/openair1/PHY/TOOLS/cmult_sv.c b/openair1/PHY/TOOLS/cmult_sv.c index 013fedc6e9204ed042a7f1025434301532b93656..dc57964ca52a60ff699ff0d0066c5376512ce5ec 100644 --- a/openair1/PHY/TOOLS/cmult_sv.c +++ b/openair1/PHY/TOOLS/cmult_sv.c @@ -119,6 +119,32 @@ void multadd_real_vector_complex_scalar(int16_t *x, } +void multadd_real_four_symbols_vector_complex_scalar(int16_t *x, + int16_t *alpha, + int16_t *y) +{ + + // do 8 multiplications at a time + simd_q15_t alpha_r_128,alpha_i_128,yr,yi,*x_128=(simd_q15_t*)x; + simd_q15_t y_128; + y_128 = _mm_loadu_si128((simd_q15_t*)y); + + alpha_r_128 = set1_int16(alpha[0]); + alpha_i_128 = set1_int16(alpha[1]); + + + yr = mulhi_s1_int16(alpha_r_128,x_128[0]); + yi = mulhi_s1_int16(alpha_i_128,x_128[0]); + y_128 = _mm_adds_epi16(y_128,_mm_unpacklo_epi16(yr,yi)); + y_128 = _mm_adds_epi16(y_128,_mm_unpackhi_epi16(yr,yi)); + + _mm_storeu_si128((simd_q15_t*)y, y_128); + + _mm_empty(); + _m_empty(); + +} + /* int rotate_cpx_vector(int16_t *x, int16_t *alpha, diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h index 5e5d5054b17d0b9564e6417c5d3dfc26bfd95ef2..57f5a782de8474e66ec1ba6d4a2e6fbe2fec715c 100644 --- a/openair1/PHY/TOOLS/tools_defs.h +++ b/openair1/PHY/TOOLS/tools_defs.h @@ -71,6 +71,10 @@ void multadd_real_vector_complex_scalar(int16_t *x, int16_t *y, uint32_t N); +void multadd_real_four_symbols_vector_complex_scalar(int16_t *x, + int16_t *alpha, + int16_t *y); + /*!\fn void multadd_complex_vector_real_scalar(int16_t *x,int16_t alpha,int16_t *y,uint8_t zero_flag,uint32_t N) This function performs componentwise multiplication and accumulation of a real scalar and a complex vector. @param x Vector input (Q1.15) in the format |Re0 Im0|Re1 Im 1| ... diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 3652801bc366042c2d79ad4c0bcb557efc06e9cd..c9bd24de7661f17ed2246df3fc8ec70d953dbf89 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -22,6 +22,7 @@ #include "PHY/phy_extern.h" #include "PHY/defs_gNB.h" #include "sched_nr.h" +#include "PHY/NR_REFSIG/dmrs_nr.h" #include "PHY/NR_TRANSPORT/nr_transport.h" #include "PHY/NR_TRANSPORT/nr_transport_proto.h" #include "PHY/NR_TRANSPORT/nr_dlsch.h" diff --git a/openair1/SIMULATION/NR_PHY/ulschsim.c b/openair1/SIMULATION/NR_PHY/ulschsim.c index 07105e6e1f28f6bbb5b6af79d68f7508f3256fb7..5e1a8d215829d2f745f1e326b7190a570c23cc0f 100644 --- a/openair1/SIMULATION/NR_PHY/ulschsim.c +++ b/openair1/SIMULATION/NR_PHY/ulschsim.c @@ -400,7 +400,6 @@ int main(int argc, char **argv) rel15_ul->mcs = Imcs; rel15_ul->rv = rvidx; rel15_ul->n_layers = Nl; - rel15_ul->nb_re_dmrs = nb_re_dmrs; rel15_ul->length_dmrs = length_dmrs; rel15_ul->R = code_rate; /////////////////////////////////////////////////// diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index 724faf1d7f86806a34524944420c34595347f3c6..767c90e7e2c14a24898fe0acba8c17939220dbff 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -150,8 +150,8 @@ int main(int argc, char **argv) NR_DL_FRAME_PARMS *frame_parms; int loglvl = OAILOG_WARNING; uint64_t SSB_positions=0x01; - uint16_t nb_symb_sch = 12; - int start_symbol = NR_SYMBOLS_PER_SLOT - nb_symb_sch; + uint16_t nb_symb_sch = 14; + int start_symbol = 0; uint16_t nb_rb = 50; uint8_t Imcs = 9; uint8_t precod_nbr_layers = 1; @@ -453,13 +453,14 @@ int main(int argc, char **argv) available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, 1); TBS = nr_compute_tbs(mod_order, code_rate, nb_rb, nb_symb_sch, nb_re_dmrs*length_dmrs, 0, precod_nbr_layers); + NR_gNB_ULSCH_t *ulsch_gNB = gNB->ulsch[UE_id][0]; //nfapi_nr_ul_config_ulsch_pdu *rel15_ul = &ulsch_gNB->harq_processes[harq_pid]->ulsch_pdu; nfapi_nr_ul_tti_request_t *UL_tti_req = &gNB->UL_tti_req; nfapi_nr_pusch_pdu_t *pusch_pdu = &UL_tti_req->pdus_list[0].pusch_pdu; NR_UE_ULSCH_t **ulsch_ue = UE->ulsch[0][0]; - + unsigned char *estimated_output_bit; unsigned char *test_input_bit; uint32_t errors_decoding = 0; @@ -471,7 +472,33 @@ int main(int argc, char **argv) nr_scheduled_response_t scheduled_response; fapi_nr_ul_config_request_t ul_config; - + + unsigned int TBS; + uint16_t number_dmrs_symbols = 0; + unsigned int available_bits; + uint8_t nb_re_dmrs; + uint8_t length_dmrs = UE->dmrs_UplinkConfig.pusch_maxLength; + unsigned char mod_order; + uint16_t code_rate; + + for (i = 0; i < NR_SYMBOLS_PER_SLOT; i++) + number_dmrs_symbols += is_dmrs_symbol(i, + 0, + 0, + 0, + 0, + 0, + nb_symb_sch, + &UE->dmrs_UplinkConfig, + UE->pusch_config.pusch_TimeDomainResourceAllocation[0]->mappingType, + frame_parms->ofdm_symbol_size); + + mod_order = nr_get_Qm_ul(Imcs, 0); + nb_re_dmrs = ((UE->dmrs_UplinkConfig.pusch_dmrs_type == pusch_dmrs_type1) ? 6 : 4) * number_dmrs_symbols; + code_rate = nr_get_code_rate_ul(Imcs, 0); + available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, 1); + TBS = nr_compute_tbs(mod_order, code_rate, nb_rb, nb_symb_sch, nb_re_dmrs*length_dmrs, 0, precod_nbr_layers); + printf("\n"); for (SNR = snr0; SNR < snr1; SNR += snr_step) { @@ -493,7 +520,6 @@ int main(int argc, char **argv) rel15_ul->ulsch_pdu_rel15.number_rbs = nb_rb; rel15_ul->ulsch_pdu_rel15.start_symbol = start_symbol; rel15_ul->ulsch_pdu_rel15.number_symbols = nb_symb_sch; - rel15_ul->ulsch_pdu_rel15.nb_re_dmrs = nb_re_dmrs; rel15_ul->ulsch_pdu_rel15.length_dmrs = length_dmrs; rel15_ul->ulsch_pdu_rel15.Qm = mod_order; rel15_ul->ulsch_pdu_rel15.mcs = Imcs; diff --git a/ubl b/ubl new file mode 100644 index 0000000000000000000000000000000000000000..c03ed2e987e617676dbb8192467f3c9a7e9140cf --- /dev/null +++ b/ubl @@ -0,0 +1,575 @@ +[1mdiff --git a/cmake_targets/build_oai b/cmake_targets/build_oai[m +[1mindex 227e8d8..6cd7151 100755[m +[1m--- a/cmake_targets/build_oai[m +[1m+++ b/cmake_targets/build_oai[m +[36m@@ -661,7 +661,8 @@[m [mfunction main() {[m + if [ "$SIMUS_PHY" = "1" ] ; then[m + echo_info "Compiling physical unitary tests simulators"[m + # TODO: fix: dlsim_tm4 pucchsim prachsim pdcchsim pbchsim mbmssim[m +[31m- simlist="dlsim ulsim ldpctest polartest smallblocktest nr_pbchsim nr_dlschsim nr_ulschsim nr_dlsim nr_ulsim nr_pucchsim"[m +[32m+[m[32m #simlist="dlsim ulsim ldpctest polartest smallblocktest nr_pbchsim nr_dlschsim nr_ulschsim nr_dlsim nr_ulsim nr_pucchsim"[m +[32m+[m[32m simlist="nr_ulsim nr_dlsim"[m + for f in $simlist ; do[m + compilations \[m + phy_simulators $f \[m +[1mdiff --git a/executables/nr-ru.c b/executables/nr-ru.c[m +[1mindex b96fc9e..4ab9fce 100644[m +[1m--- a/executables/nr-ru.c[m +[1m+++ b/executables/nr-ru.c[m +[36m@@ -2330,7 +2330,7 @@[m [mvoid RCconfig_RU(void)[m + RC.ru[j]->nb_tx = *(RUParamList.paramarray[j][RU_NB_TX_IDX].uptr);[m + RC.ru[j]->nb_rx = *(RUParamList.paramarray[j][RU_NB_RX_IDX].uptr);[m + RC.ru[j]->att_tx = *(RUParamList.paramarray[j][RU_ATT_TX_IDX].uptr);[m +[31m- RC.ru[j]->att_rx = *(RUParamList.paramarray[j][RU_ATT_RX_IDX].uptr);[m +[32m+[m[32m RC.ru[j]->att_rx = 4;//*(RUParamList.paramarray[j][RU_ATT_RX_IDX].uptr);[m + }// j=0..num_rus[m + } else {[m + RC.nb_RU = 0;[m +[1mdiff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c[m +[1mindex fff1245..66d6e09 100644[m +[1m--- a/openair1/PHY/INIT/nr_init.c[m +[1m+++ b/openair1/PHY/INIT/nr_init.c[m +[36m@@ -403,12 +403,47 @@[m [mvoid nr_phy_config_request_sim(PHY_VARS_gNB *gNB,[m + gNB->mac_enabled = 1;[m + fp->dl_CarrierFreq = 3500000000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value);[m + fp->ul_CarrierFreq = 3500000000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000);[m +[31m- fp->threequarter_fs= 0;[m +[32m+[m[32m fp->threequarter_fs= 1;[m + nr_init_frame_parms(gNB_config, fp);[m + gNB->configured = 1;[m + LOG_I(PHY,"gNB configured\n");[m + }[m + [m +[32m+[m[32mvoid nr_phy_config_request_sim_ulsim(PHY_VARS_gNB *gNB,[m +[32m+[m[32m int N_RB_DL,[m +[32m+[m[32m int N_RB_UL,[m +[32m+[m[32m int mu,[m +[32m+[m[32m int Nid_cell,[m +[32m+[m[32m uint64_t position_in_burst,[m +[32m+[m[32m uint8_t threequarter_fs)[m +[32m+[m[32m{[m +[32m+[m[32m NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;[m +[32m+[m[32m nfapi_nr_config_request_t *gNB_config = &gNB->gNB_config;[m +[32m+[m[32m //overwrite for new NR parameters[m +[32m+[m[32m gNB_config->nfapi_config.rf_bands.rf_band[0] = 78;[m +[32m+[m[32m gNB_config->nfapi_config.nrarfcn.value = 620000;[m +[32m+[m[32m gNB_config->subframe_config.numerology_index_mu.value = mu;[m +[32m+[m[32m gNB_config->subframe_config.duplex_mode.value = TDD;[m +[32m+[m[32m gNB_config->rf_config.dl_carrier_bandwidth.value = N_RB_DL;[m +[32m+[m[32m gNB_config->rf_config.ul_carrier_bandwidth.value = N_RB_UL;[m +[32m+[m[32m gNB_config->sch_config.half_frame_index.value = 0;[m +[32m+[m[32m gNB_config->sch_config.ssb_subcarrier_offset.value = 0;[m +[32m+[m[32m gNB_config->sch_config.n_ssb_crb.value = (N_RB_DL-20);[m +[32m+[m[32m gNB_config->sch_config.ssb_subcarrier_offset.value = 0;[m +[32m+[m[32m gNB_config->sch_config.physical_cell_id.value = Nid_cell;[m +[32m+[m[32m gNB_config->sch_config.ssb_scg_position_in_burst.value = position_in_burst;[m +[32m+[m[32m gNB_config->subframe_config.dl_cyclic_prefix_type.value = (fp->Ncp == NORMAL) ? NFAPI_CP_NORMAL : NFAPI_CP_EXTENDED;[m +[32m+[m +[32m+[m[32m gNB->mac_enabled = 1;[m +[32m+[m[32m fp->dl_CarrierFreq = 3500000000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value);[m +[32m+[m[32m fp->ul_CarrierFreq = 3500000000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000);[m +[32m+[m[32m fp->threequarter_fs= threequarter_fs;[m +[32m+[m[32m nr_init_frame_parms(gNB_config, fp);[m +[32m+[m[32m nr_dump_frame_parms(fp);[m +[32m+[m[32m gNB->configured = 1;[m +[32m+[m[32m LOG_I(PHY,"gNB configured\n");[m +[32m+[m[32m}[m +[32m+[m + [m + void nr_phy_config_request(NR_PHY_Config_t *phy_config)[m + {[m +[1mdiff --git a/openair1/PHY/INIT/phy_init.h b/openair1/PHY/INIT/phy_init.h[m +[1mindex 7e0500b..4209413 100644[m +[1m--- a/openair1/PHY/INIT/phy_init.h[m +[1m+++ b/openair1/PHY/INIT/phy_init.h[m +[36m@@ -387,6 +387,7 @@[m [mvoid nr_dump_frame_parms(NR_DL_FRAME_PARMS *frame_parms);[m + int phy_init_nr_gNB(PHY_VARS_gNB *gNB, unsigned char is_secondary_gNB, unsigned char abstraction_flag);[m + void nr_phy_config_request(NR_PHY_Config_t *gNB);[m + void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,int N_RB_DL,int N_RB_UL,int mu,int Nid_cell,uint64_t position_in_burst);[m +[32m+[m[32mvoid nr_phy_config_request_sim_ulsim(PHY_VARS_gNB *gNB,int N_RB_DL,int N_RB_UL,int mu,int Nid_cell,uint64_t position_in_burst, uint8_t threequarter_fs);[m + void phy_free_nr_gNB(PHY_VARS_gNB *gNB);[m + int l1_north_init_gNB(void);[m + void init_nr_transport(PHY_VARS_gNB *gNB);[m +[1mdiff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c[m +[1mindex 0656091..9e5fcb1 100644[m +[1m--- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c[m +[1m+++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c[m +[36m@@ -140,7 +140,7 @@[m [mint nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,[m + ul_ch,[m + 8);[m + pil+=2;[m +[31m- re_offset = (re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1);[m +[32m+[m[32m re_offset = (re_offset+2)%gNB->frame_parms.ofdm_symbol_size;//(re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1);[m + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];[m + //for (int i= 0; i<8; i++)[m + //printf("ul_ch addr %p %d\n", ul_ch+i, *(ul_ch+i));[m +[36m@@ -156,7 +156,7 @@[m [mint nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,[m + ul_ch,[m + 8);[m + pil+=2;[m +[31m- re_offset = (re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1);[m +[32m+[m[32m re_offset = (re_offset+2)%gNB->frame_parms.ofdm_symbol_size;//(re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1);[m + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];[m + //printf("ul_ch addr %p\n",ul_ch);[m + [m +[36m@@ -175,7 +175,7 @@[m [mint nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,[m + //printf("ul_ch addr %p %d\n", ul_ch+i, *(ul_ch+i));[m + [m + pil+=2;[m +[31m- re_offset = (re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1);[m +[32m+[m[32m re_offset = (re_offset+2)%gNB->frame_parms.ofdm_symbol_size;//(re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1);[m + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];[m + ul_ch+=8;[m + [m +[36m@@ -193,7 +193,7 @@[m [mint nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,[m + 8);[m + [m + pil+=2;[m +[31m- re_offset = (re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1);[m +[32m+[m[32m re_offset = (re_offset+2)%gNB->frame_parms.ofdm_symbol_size;//(re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1);[m + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];[m + [m + ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);[m +[36m@@ -206,7 +206,7 @@[m [mint nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,[m + ul_ch,[m + 8);[m + pil+=2;[m +[31m- re_offset = (re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1);[m +[32m+[m[32m re_offset = (re_offset+2)%gNB->frame_parms.ofdm_symbol_size;//(re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1);[m + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];[m + ul_ch+=8;[m + [m +[36m@@ -227,7 +227,7 @@[m [mint nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,[m + //printf("ul_ch addr %p %d\n", ul_ch+i, *(ul_ch+i));[m + [m + pil+=2;[m +[31m- re_offset = (re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1);[m +[32m+[m[32m re_offset = (re_offset+2)%gNB->frame_parms.ofdm_symbol_size;//(re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1);[m + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];[m + [m + ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);[m +[36m@@ -242,7 +242,7 @@[m [mint nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,[m + 8);[m + [m + pil+=2;[m +[31m- re_offset = (re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1);[m +[32m+[m[32m re_offset = (re_offset+2)%gNB->frame_parms.ofdm_symbol_size;//(re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1);[m + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];[m + ul_ch+=8;[m + [m +[1mdiff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch.c[m +[1mindex 2bc623a..e78842d 100644[m +[1m--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch.c[m +[1m+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch.c[m +[36m@@ -54,5 +54,8 @@[m [mvoid nr_ulsch_unscrambling(int16_t* llr,[m + }[m + if (((s>>(i&0x1f))&1)==1)[m + llr[i] = -llr[i];[m +[32m+[m +[32m+[m[32m //if (i<10)[m +[32m+[m[32m //printf("llr[%d] = %d\n", i, llr[i]);[m + }[m + }[m +[1mdiff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c[m +[1mindex 19ca123..68a54b3 100644[m +[1m--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c[m +[1m+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c[m +[36m@@ -346,7 +346,7 @@[m [muint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,[m + [m + G = nr_get_G(nb_rb, number_symbols, nb_re_dmrs, length_dmrs, Qm, n_layers);[m + [m +[31m- LOG_D(PHY,"ULSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",harq_pid,A,G, mcs, n_layers, nb_symb_sch,nb_rb);[m +[32m+[m[32m LOG_I(PHY,"ULSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",harq_pid,A,G, mcs, n_layers, nb_symb_sch,nb_rb);[m + [m + if (harq_process->round == 0) {[m + [m +[1mdiff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c[m +[1mindex e1b3c5c..0369e73 100644[m +[1m--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c[m +[1m+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c[m +[36m@@ -365,9 +365,9 @@[m [mvoid nr_ulsch_channel_level(int **ul_ch_estimates_ext,[m + ul_ch128=(__m128i *)&ul_ch_estimates_ext[(aatx<<1)+aarx][symbol*nb_rb*12];[m + [m + for (rb = 0; rb < nb_rb; rb++) {[m +[31m- avg128U = _mm_add_epi32(avg128U, _mm_srai_epi32(_mm_madd_epi16(ul_ch128[0], ul_ch128[0]), x));[m +[31m- avg128U = _mm_add_epi32(avg128U, _mm_srai_epi32(_mm_madd_epi16(ul_ch128[1], ul_ch128[1]), x));[m +[31m- avg128U = _mm_add_epi32(avg128U, _mm_srai_epi32(_mm_madd_epi16(ul_ch128[2], ul_ch128[2]), x));[m +[32m+[m[32m avg128U = _mm_add_epi32(avg128U, _mm_srai_epi16(_mm_madd_epi16(ul_ch128[0], ul_ch128[0]), x));[m +[32m+[m[32m avg128U = _mm_add_epi32(avg128U, _mm_srai_epi16(_mm_madd_epi16(ul_ch128[1], ul_ch128[1]), x));[m +[32m+[m[32m avg128U = _mm_add_epi32(avg128U, _mm_srai_epi16(_mm_madd_epi16(ul_ch128[2], ul_ch128[2]), x));[m + ul_ch128+=3;[m + }[m + [m +[36m@@ -977,6 +977,7 @@[m [mvoid nr_rx_pusch(PHY_VARS_gNB *gNB,[m + uint32_t nb_re_pusch, bwp_start_subcarrier;[m + int avgs;[m + int avg[4];[m +[32m+[m[32m char filename[40];[m + [m + pilots = 0;[m + first_symbol_flag = 0;[m +[36m@@ -1062,6 +1063,16 @@[m [mvoid nr_rx_pusch(PHY_VARS_gNB *gNB,[m + rel15_ul->number_rbs,[m + gNB->pusch_vars[UE_id]->log2_maxh);[m + [m +[32m+[m[32m if (symbol == 3){[m +[32m+[m[32m printf("log2_maxh = %d\n", gNB->pusch_vars[UE_id]->log2_maxh);[m +[32m+[m[32m sprintf(filename,"rxdataF_gnb_ext.m");[m +[32m+[m[32m LOG_M(filename,"rxdataF_gnb_v",&gNB->pusch_vars[UE_id]->rxdataF_ext[0][symbol*NR_NB_SC_PER_RB*rel15_ul->number_rbs],NR_NB_SC_PER_RB*rel15_ul->number_rbs, 1, 1);[m +[32m+[m[32m sprintf(filename,"rxdataF_comp_gnb.m");[m +[32m+[m[32m LOG_M(filename,"rxdataF_comp_gnb_v",&gNB->pusch_vars[UE_id]->rxdataF_comp[0][symbol*NR_NB_SC_PER_RB*rel15_ul->number_rbs],NR_NB_SC_PER_RB*rel15_ul->number_rbs, 1, 1);[m +[32m+[m[32m sprintf(filename,"ul_ch_est_ext_gnb.m");[m +[32m+[m[32m LOG_M(filename,"ul_ch_est_ext_gnb_v",&gNB->pusch_vars[UE_id]->ul_ch_estimates_ext[0][symbol*NR_NB_SC_PER_RB*rel15_ul->number_rbs], NR_NB_SC_PER_RB*rel15_ul->number_rbs, 1, 1);[m +[32m+[m[32m }[m +[32m+[m + #ifdef NR_SC_FDMA[m + nr_idft(&((uint32_t*)gNB->pusch_vars[UE_id]->rxdataF_ext[0])[symbol * rel15_ul->number_rbs * NR_NB_SC_PER_RB], nb_re_pusch);[m + #endif[m +[1mdiff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c[m +[1mindex 79b5c8d..c96a9a6 100644[m +[1m--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c[m +[1m+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c[m +[36m@@ -155,6 +155,7 @@[m [mint nr_rx_pdsch(PHY_VARS_NR_UE *ue,[m + uint16_t n_tx=1, n_rx=1;[m + int32_t median[16];[m + uint32_t len;[m +[32m+[m[32m char filename[40];[m + [m + switch (type) {[m + case SI_PDSCH:[m +[36m@@ -592,6 +593,17 @@[m [mint nr_rx_pdsch(PHY_VARS_NR_UE *ue,[m + [m + }[m + [m +[32m+[m[32m if (symbol == 3){[m +[32m+[m[32m printf("log2_maxh = %d\n", pdsch_vars[eNB_id]->log2_maxh);[m +[32m+[m[32m sprintf(filename,"rxdataF_ue_ext.m");[m +[32m+[m[32m LOG_M(filename,"rxdataF_ue_ext_v",&pdsch_vars[eNB_id]->rxdataF_ext[0][symbol*NR_NB_SC_PER_RB*nb_rb],NR_NB_SC_PER_RB*nb_rb, 1, 1);[m +[32m+[m[32m sprintf(filename,"rxdataF_comp_ue.m");[m +[32m+[m[32m LOG_M(filename,"rxdataF_comp_ue_v",&pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*NR_NB_SC_PER_RB*nb_rb],NR_NB_SC_PER_RB*nb_rb, 1, 1);[m +[32m+[m[32m sprintf(filename,"dl_ch_est_ext_ue.m");[m +[32m+[m[32m LOG_M(filename,"dl_ch_est_ext_ue",&pdsch_vars[eNB_id]->dl_ch_estimates_ext[0][symbol*NR_NB_SC_PER_RB*nb_rb], NR_NB_SC_PER_RB*nb_rb, 1, 1);[m +[32m+[m[32m }[m +[32m+[m +[32m+[m + #if UE_TIMING_TRACE[m + stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);[m + #if DISABLE_LOG_X[m +[36m@@ -636,6 +648,15 @@[m [mint nr_rx_pdsch(PHY_VARS_NR_UE *ue,[m + dl_ch_mag_ptr = pdsch_vars[eNB_id_i]->dl_ch_mag0;[m + //i_mod should have been passed as a parameter[m + }[m +[32m+[m +[32m+[m +[32m+[m[32m if (symbol == 3){[m +[32m+[m[32m printf("log2_maxh = %d\n", pdsch_vars[eNB_id]->log2_maxh);[m +[32m+[m[32m sprintf(filename,"rxdataF_comp_ue.m");[m +[32m+[m[32m LOG_M(filename,"rxdataF_comp_ue_v",&pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*NR_NB_SC_PER_RB*nb_rb],NR_NB_SC_PER_RB*nb_rb, 1, 1);[m +[32m+[m[32m sprintf(filename,"dl_ch_est_ext_ue.m");[m +[32m+[m[32m LOG_M(filename,"dl_ch_est_ext_ue",&pdsch_vars[eNB_id]->dl_ch_estimates_ext[0][symbol*NR_NB_SC_PER_RB*nb_rb], NR_NB_SC_PER_RB*nb_rb, 1, 1);[m +[32m+[m[32m }[m + [m + #if UE_TIMING_TRACE[m + stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);[m +[1mdiff --git a/openair1/SCHED_NR/nr_ru_procedures.c b/openair1/SCHED_NR/nr_ru_procedures.c[m +[1mindex 3ac808f..9ab539a 100644[m +[1m--- a/openair1/SCHED_NR/nr_ru_procedures.c[m +[1m+++ b/openair1/SCHED_NR/nr_ru_procedures.c[m +[36m@@ -395,6 +395,7 @@[m [mvoid nr_fep_full(RU_t *ru, int slot) {[m + RU_proc_t *proc = &ru->proc;[m + int l, aa;[m + NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms;[m +[32m+[m[32m char filename[40];[m + [m + // if ((fp->frame_type == TDD) && [m + // (subframe_select(fp,proc->tti_rx) != SF_UL)) return;[m +[36m@@ -405,6 +406,9 @@[m [mvoid nr_fep_full(RU_t *ru, int slot) {[m + // remove_7_5_kHz(ru,proc->tti_rx<<1);[m + // remove_7_5_kHz(ru,1+(proc->tti_rx<<1));[m + [m +[32m+[m[32m //sprintf(filename,"rxdata_gnb.m");[m +[32m+[m[32m //LOG_M(filename,"rxdata_gnb_v",&ru->common.rxdata[0][proc->tti_rx*fp->samples_per_slot], 2*fp->samples_per_slot, 1, 0);[m +[32m+[m + for (l = 0; l < fp->symbols_per_slot; l++) {[m + for (aa = 0; aa < fp->nb_antennas_rx; aa++) {[m + nr_slot_fep_ul(fp,[m +[1mdiff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c[m +[1mindex ccf5343..bbd0c65 100644[m +[1m--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c[m +[1m+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c[m +[36m@@ -4143,6 +4143,8 @@[m [mint phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,[m + uint8_t ssb_periodicity = 10;// ue->ssb_periodicity; // initialized to 5ms in nr_init_ue for scenarios where UE is not configured (otherwise acquired by cell configuration from gNB or LTE)[m + uint8_t dci_cnt = 0;[m + fapi_nr_pbch_config_t *pbch_config = &ue->nrUE_config.pbch_config;[m +[32m+[m +[32m+[m[32m char filename[40];[m + [m + LOG_D(PHY," ****** start RX-Chain for Frame.Slot %d.%d ****** \n", frame_rx%1024, nr_tti_rx);[m + [m +[36m@@ -4200,6 +4202,7 @@[m [mint phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,[m + }[m + [m + dci_cnt = nr_ue_pdcch_procedures(eNB_id, ue, proc);[m +[32m+[m[32m dci_cnt = 1;[m + [m + if (dci_cnt > 0) {[m + [m +[36m@@ -4215,17 +4218,32 @@[m [mint phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,[m + 16384);[m + }[m + } else {[m +[31m- LOG_D(PHY,"[UE %d] Frame %d, nr_tti_rx %d: No DCIs found\n",ue->Mod_id,frame_rx,nr_tti_rx);[m +[32m+[m[32m LOG_I(PHY,"[UE %d] Frame %d, nr_tti_rx %d: No DCIs found\n",ue->Mod_id,frame_rx,nr_tti_rx);[m + }[m + #endif //NR_PDCCH_SCHED[m + [m + [m + if (dci_cnt > 0){[m +[31m- LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR Frame.slot %d.%d ------ \n", frame_rx%1024, nr_tti_rx);[m +[32m+[m +[32m+[m[32m ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active = 1;[m +[32m+[m[32m dlsch0_harq->nb_rb = 50;[m +[32m+[m[32m dlsch0_harq->start_rb = 0;[m +[32m+[m[32m dlsch0_harq->nb_symbols = 12;//dlsch_config_pdu->number_symbols;[m +[32m+[m[32m dlsch0_harq->start_symbol = 2;//dlsch_config_pdu->start_symbol;[m +[32m+[m[32m dlsch0_harq->mcs = 9;[m +[32m+[m[32m dlsch0_harq->DCINdi = 1;[m +[32m+[m[32m dlsch0_harq->rvidx = 0;[m +[32m+[m[32m dlsch0_harq->Nl=1;[m +[32m+[m[32m dlsch0_harq->status = ACTIVE;[m +[32m+[m +[32m+[m[32m LOG_I(PHY," ------ --> PDSCH ChannelComp/LLR Frame.slot %d.%d ------ \n", frame_rx%1024, nr_tti_rx);[m + //to update from pdsch config[m + nr_gold_pdsch(ue,nb_symb_pdcch,0, 1);[m + [m + nb_symb_sch = dlsch0_harq->nb_symbols;[m +[32m+[m +[32m+[m[32m sprintf(filename,"rxdata_ue_test.m");[m +[32m+[m[32m LOG_M(filename,"rxdata_ue_test_v",&ue->common_vars.rxdata[0][nr_tti_rx*ue->frame_parms.samples_per_slot],ue->frame_parms.samples_per_slot, 1, 1);[m + [m + for (uint16_t m=nb_symb_pdcch;m<=(nb_symb_sch+nb_symb_pdcch-1) ; m++){[m + nr_slot_fep(ue,[m +[36m@@ -4237,7 +4255,7 @@[m [mint phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,[m + [m + }[m + //set active for testing, to be removed[m +[31m- ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active = 1;[m +[32m+[m[41m [m + }[m + else[m + ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active = 0;[m +[1mdiff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c[m +[1mindex a471062..cd64e53 100644[m +[1m--- a/openair1/SIMULATION/NR_PHY/dlsim.c[m +[1m+++ b/openair1/SIMULATION/NR_PHY/dlsim.c[m +[36m@@ -173,7 +173,7 @@[m [mint main(int argc, char **argv)[m + //unsigned char frame_type = 0;[m + unsigned char pbch_phase = 0;[m + [m +[31m- int frame=0,slot=1;[m +[32m+[m[32m int frame=0,slot=2;[m + int frame_length_complex_samples;[m + int frame_length_complex_samples_no_prefix;[m + int slot_length_complex_samples_no_prefix;[m +[36m@@ -188,7 +188,7 @@[m [mint main(int argc, char **argv)[m + int run_initial_sync=0;[m + int do_pdcch_flag=1;[m + [m +[31m- int loglvl=OAILOG_WARNING;[m +[32m+[m[32m int loglvl=OAILOG_INFO;[m + [m + float target_error_rate = 0.01;[m + [m +[36m@@ -398,6 +398,7 @@[m [mint main(int argc, char **argv)[m + logInit();[m + set_glog(loglvl);[m + T_stdout = 1;[m +[32m+[m[32m FILE *in_file;[m + [m + if (snr1set==0)[m + snr1 = snr0+10;[m +[36m@@ -695,8 +696,13 @@[m [mint main(int argc, char **argv)[m + [m + nr_ue_phy_config_request(&UE_mac->phy_config);[m + [m +[32m+[m[32m int16_t *rxdata_ue;[m +[32m+[m[32m rxdata_ue = &((short*) UE->common_vars.rxdata[0])[2*slot*frame_parms->samples_per_slot];[m +[32m+[m + for (SNR = snr0; SNR < snr1; SNR += .2) {[m + [m +[32m+[m[32m in_file = fopen("rxdata_gnb.m", "r");[m +[32m+[m + n_errors = 0;[m + //n_errors2 = 0;[m + //n_alamouti = 0;[m +[36m@@ -710,14 +716,22 @@[m [mint main(int argc, char **argv)[m + sigma2_dB = 10 * log10((double)txlev) - SNR;[m + sigma2 = pow(10, sigma2_dB/10);[m + // printf("sigma2 %f (%f dB)\n",sigma2,sigma2_dB);[m +[31m-[m +[32m+[m[32m/*[m + for (i=0; i<frame_length_complex_samples; i++) {[m + for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {[m + ((short*) UE->common_vars.rxdata[aa])[2*i] = (short) ((r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));[m + ((short*) UE->common_vars.rxdata[aa])[2*i+1] = (short) ((r_im[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));[m + }[m + }[m +[31m-[m +[32m+[m[32m*/[m +[32m+[m[32m for (i = 0; i < 2*frame_parms->samples_per_slot; i++){[m +[32m+[m[32m fscanf(in_file, "%d", &rxdata_ue[i]);[m +[32m+[m[32m }[m +[32m+[m[32m/*[m +[32m+[m[32m char filename[40];[m +[32m+[m[32m sprintf(filename,"rxdata_ue_test.m");[m +[32m+[m[32m LOG_M(filename,"rxdata_ue_test_v",&UE->common_vars.rxdata[0][slot*frame_parms->samples_per_slot],frame_parms->samples_per_slot, 1, 1);[m +[32m+[m[32m*/[m + if (n_trials == 1) {[m + [m + LOG_M("rxsig0.m","rxs0", UE->common_vars.rxdata[0], frame_length_complex_samples, 1, 1);[m +[1mdiff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c[m +[1mindex 00ba0bb..3e31fa0 100644[m +[1m--- a/openair1/SIMULATION/NR_PHY/ulsim.c[m +[1m+++ b/openair1/SIMULATION/NR_PHY/ulsim.c[m +[36m@@ -99,7 +99,7 @@[m [mint main(int argc, char **argv)[m + double sigma, sigma_dB;[m + double snr_step = 0.1;[m + uint8_t snr1set = 0;[m +[31m- int slot = 0;[m +[32m+[m[32m int slot = 1;[m + FILE *output_fd = NULL;[m + //uint8_t write_output_file = 0;[m + int trial, n_trials = 1, n_errors = 0, n_false_positive = 0, delay = 0;[m +[36m@@ -116,10 +116,10 @@[m [mint main(int argc, char **argv)[m + int number_of_frames = 1;[m + int frame_length_complex_samples;[m + NR_DL_FRAME_PARMS *frame_parms;[m +[31m- int loglvl = OAILOG_WARNING;[m +[32m+[m[32m int loglvl = OAILOG_INFO;[m + uint64_t SSB_positions=0x01;[m +[31m- uint16_t nb_symb_sch = 12;[m +[31m- int start_symbol = NR_SYMBOLS_PER_SLOT - nb_symb_sch;[m +[32m+[m[32m uint16_t nb_symb_sch = 9;[m +[32m+[m[32m int start_symbol = 2;[m + uint16_t nb_rb = 50;[m + uint8_t Imcs = 9;[m + uint8_t precod_nbr_layers = 1;[m +[36m@@ -130,6 +130,7 @@[m [mint main(int argc, char **argv)[m + int32_t txlev;[m + int start_rb = 0;[m + int UE_id =0; // [hna] only works for UE_id = 0 because NUMBER_OF_NR_UE_MAX is set to 1 (phy_init_nr_gNB causes segmentation fault)[m +[32m+[m[32m uint8_t threequarter_fs = 0;[m + [m + cpuf = get_cpu_freq_GHz();[m + [m +[36m@@ -144,7 +145,7 @@[m [mint main(int argc, char **argv)[m + //logInit();[m + randominit(0);[m + [m +[31m- while ((c = getopt(argc, argv, "d:f:g:h:i:j:l:m:n:p:r:s:y:z:F:M:N:P:R:S:")) != -1) {[m +[32m+[m[32m while ((c = getopt(argc, argv, "d:f:g:h:i:j:l:m:n:pr:s:y:z:F:M:N:P:R:S:E")) != -1) {[m + switch (c) {[m + [m + /*case 'd':[m +[36m@@ -303,6 +304,10 @@[m [mint main(int argc, char **argv)[m + printf("Setting SNR1 to %f\n", snr1);[m + break;[m + [m +[32m+[m[32m case 'E':[m +[32m+[m[32m threequarter_fs = 1;[m +[32m+[m[32m break;[m +[32m+[m + default:[m + case 'h':[m + printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n", argv[0]);[m +[36m@@ -330,6 +335,7 @@[m [mint main(int argc, char **argv)[m + printf("-O oversampling factor (1,2,4,8,16)\n");[m + printf("-R N_RB_DL\n");[m + printf("-S Ending SNR, runs from SNR0 to SNR1\n");[m +[32m+[m[32m printf("-E enable threequarter sampling\n");[m + exit(-1);[m + break;[m + }[m +[36m@@ -338,6 +344,7 @@[m [mint main(int argc, char **argv)[m + logInit();[m + set_glog(loglvl);[m + T_stdout = 1;[m +[32m+[m[32m FILE *in_file;[m + [m + if (snr1set == 0)[m + snr1 = snr0 + 10;[m +[36m@@ -367,7 +374,7 @@[m [mint main(int argc, char **argv)[m + [m + crcTableInit();[m + [m +[31m- nr_phy_config_request_sim(gNB, N_RB_DL, N_RB_UL, mu, Nid_cell, SSB_positions);[m +[32m+[m[32m nr_phy_config_request_sim_ulsim(gNB, N_RB_DL, N_RB_UL, mu, Nid_cell, SSB_positions, threequarter_fs);[m + [m + phy_init_nr_gNB(gNB, 0, 0);[m + //init_eNB_afterRU();[m +[36m@@ -511,20 +518,42 @@[m [mint main(int argc, char **argv)[m + sigma_dB = 10*log10(txlev_float)-SNR;[m + sigma = pow(10,sigma_dB/10);[m + [m +[32m+[m[32m int16_t *rxdata_gnb;[m +[32m+[m[32m rxdata_gnb = &((short*) gNB->common_vars.rxdata[0])[2*slot*frame_parms->samples_per_slot];[m +[32m+[m + for (trial = 0; trial < n_trials; trial++) {[m + [m + errors_scrambling = 0;[m + errors_decoding = 0;[m + [m +[32m+[m[32m in_file = fopen("rxdata_ue.m", "r");[m +[32m+[m +[32m+[m[32m if (in_file == NULL)[m +[32m+[m[32m {[m +[32m+[m[32m printf("Can't open file for reading.\n");[m +[32m+[m[32m return -1;[m +[32m+[m[32m }[m +[32m+[m + //----------------------------------------------------------[m + //------------------------ add noise -----------------------[m + //----------------------------------------------------------[m +[32m+[m[32m /*[m + for (i=0; i<frame_length_complex_samples; i++) {[m + for (ap=0; ap<frame_parms->nb_antennas_rx; ap++) {[m +[31m- ((short*) gNB->common_vars.rxdata[ap])[(2*i) + (delay*2)] = (((int16_t *)UE->common_vars.txdata[ap])[(i<<1)]) + (int16_t)(sqrt(sigma/2)*gaussdouble(0.0,1.0)*(double)AMP); // convert to fixed point[m +[31m- ((short*) gNB->common_vars.rxdata[ap])[2*i+1 + (delay*2)] = (((int16_t *)UE->common_vars.txdata[ap])[(i<<1)+1]) + (int16_t)(sqrt(sigma/2)*gaussdouble(0.0,1.0)*(double)AMP);[m +[32m+[m[32m ((short*) gNB->common_vars.rxdata[ap])[(2*i) + (delay*2)] = 0.5*((((int16_t *)UE->common_vars.txdata[ap])[(i<<1)]) + (int16_t)(sqrt(sigma/2)*gaussdouble(0.0,1.0)*(double)AMP)); // convert to fixed point[m +[32m+[m[32m ((short*) gNB->common_vars.rxdata[ap])[2*i+1 + (delay*2)] = 0.5*((((int16_t *)UE->common_vars.txdata[ap])[(i<<1)+1]) + (int16_t)(sqrt(sigma/2)*gaussdouble(0.0,1.0)*(double)AMP));[m + }[m + }[m +[32m+[m[32m */[m +[32m+[m +[32m+[m[32m for (i = 0; i < 2*frame_parms->samples_per_slot; i++){[m +[32m+[m[32m fscanf(in_file, "%d", &rxdata_gnb[i]);[m +[32m+[m[32m }[m +[32m+[m +[32m+[m[32m char filename[40];[m +[32m+[m[32m sprintf(filename,"rxdata_ue_ulsim.m");[m +[32m+[m[32m LOG_M(filename,"rxdata_ue_v",&gNB->common_vars.rxdata[0][slot*frame_parms->samples_per_slot], frame_parms->samples_per_slot, 1, 1);[m +[32m+[m[41m [m + ////////////////////////////////////////////////////////////[m + [m + //----------------------------------------------------------[m +[36m@@ -628,5 +657,8 @@[m [mint main(int argc, char **argv)[m + if (input_fd)[m + fclose(input_fd);[m + [m +[32m+[m[32m if (in_file)[m +[32m+[m[32m fclose(in_file);[m +[32m+[m + return (n_errors);[m + }[m +[1mdiff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf[m +[1mindex a11bf9d..86dc080 100644[m +[1m--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf[m +[1m+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf[m +[36m@@ -255,7 +255,6 @@[m [mRUs = ([m + max_rxgain = 114;[m + eNB_instances = [0];[m + sdr_addrs = "type=x300";[m +[31m-[m + }[m + ); [m + [m