From ca9b4d7ed9ac63ca88defa91a9656bd41c699a58 Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Thu, 7 Nov 2019 16:26:30 +0100 Subject: [PATCH 01/22] Improved channel estimates around DC Ignored 1 pilot before and after DC --- openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c | 20 +++++- openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h | 14 +++- .../nr_dl_channel_estimation.c | 65 +++++++++++++++++++ 3 files changed, 97 insertions(+), 2 deletions(-) diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c index 90ef3b0d44..2ecc184b37 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c +++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c @@ -123,6 +123,24 @@ short filt8_m0[8] = { short filt8_mm0[8]= { 0,0,0,8192,16384,8192,0,0}; +short filt8_dcma[8]= { +16384,12288,8192,4096,4096,0,0,0}; + +short filt8_dcmb[8]= { +0,4096,8192,4096,4096,0,0,0}; + +short filt8_dcmc[8]= { +0,0,0,4096,4096,8192,4096,0}; + +short filt8_dcmd[8]= { +0,0,0,4096,4096,8192,12288,16384}; + +short filt8_dcl[8]= { +0,8192,16384,12288,8192,4096,0,0}; + +short filt8_dcr[8]= { +0,0,0,4096,8192,12288,16384,0}; + short filt8_l1[8] = { 24576,16384,0,0,0,0,0,0}; @@ -136,4 +154,4 @@ short filt8_m1[8] = { 0,0,8192,16384,8192,0,0,0}; short filt8_mm1[8]= { -0,0,0,0,8192,16384,8192,0}; \ No newline at end of file +0,0,0,0,8192,16384,8192,0}; diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h index 9fcad87d7e..5310d43d5b 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h +++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h @@ -91,6 +91,18 @@ extern short filt8_m0[8]; extern short filt8_mm0[8]; +extern short filt8_dcma[8]; + +extern short filt8_dcmb[8]; + +extern short filt8_dcmc[8]; + +extern short filt8_dcmd[8]; + +extern short filt8_dcl[8]; + +extern short filt8_dcr[8]; + extern short filt8_l1[8]; extern short filt8_ml1[8]; @@ -101,4 +113,4 @@ extern short filt8_m1[8]; extern short filt8_mm1[8]; -#endif \ No newline at end of file +#endif diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index e9b93719c1..e09c22a164 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -884,7 +884,72 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, dl_ch, 8); //} + + // check if PRB crosses DC and improve estimates around DC + if ((bwp_start_subcarrier >= ue->frame_parms.ofdm_symbol_size/2) && (bwp_start_subcarrier+nb_rb_pdsch*12 >= ue->frame_parms.ofdm_symbol_size)) { + dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset]; + uint16_t idxDC = 2*(ue->frame_parms.ofdm_symbol_size - bwp_start_subcarrier); + uint16_t idxPil = idxDC/2; + printf("idxDC %d idxPil %d\n",idxDC,idxPil); + re_offset = k; + pil = (int16_t *)&pilot[rb_offset*((config_type==0) ? 6:4)]; + pil += (idxPil-4); + dl_ch += (idxDC-8); + dl_ch = memset(dl_ch, 0, sizeof(int16_t)*16); + + re_offset = (re_offset+idxDC/2-4)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); + + multadd_real_vector_complex_scalar(filt8_dcma, + ch, + dl_ch, + 8); + pil += 2; + re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); + + multadd_real_vector_complex_scalar(filt8_dcmb, + ch, + dl_ch, + 8); + + pil += 4; + re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); + + multadd_real_vector_complex_scalar(filt8_dcmc, + ch, + dl_ch, + 8); + + pil += 2; + re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); + + multadd_real_vector_complex_scalar(filt8_dcmd, + ch, + dl_ch, + 8); + } + +//#ifdef DEBUG_PDSCH + dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset]; + for(uint16_t idxP=0; idxP<(nb_rb_pdsch*12/8); idxP++) { + for(uint8_t idxI=0; idxI<16; idxI+=2) { + printf("%d\t%d\t",dl_ch[idxP*16+idxI],dl_ch[idxP*16+idxI+1]); + } + printf("\n"); + } +//#endif } return(0); From f5b0658a703ee4ab1b8c6b5a0b49d9b081239043 Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Thu, 7 Nov 2019 16:34:33 +0100 Subject: [PATCH 02/22] Improved channel estimates around DC; ignored only DC pilot --- .../NR_UE_ESTIMATION/nr_dl_channel_estimation.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index e09c22a164..ade2d1adec 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -895,14 +895,14 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, pil = (int16_t *)&pilot[rb_offset*((config_type==0) ? 6:4)]; pil += (idxPil-4); dl_ch += (idxDC-8); - dl_ch = memset(dl_ch, 0, sizeof(int16_t)*16); + dl_ch = memset(dl_ch, 0, sizeof(int16_t)*14); re_offset = (re_offset+idxDC/2-4)&(ue->frame_parms.ofdm_symbol_size-1); rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; 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); - multadd_real_vector_complex_scalar(filt8_dcma, + multadd_real_vector_complex_scalar(fl, ch, dl_ch, 8); @@ -913,7 +913,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, 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); - multadd_real_vector_complex_scalar(filt8_dcmb, + multadd_real_vector_complex_scalar(filt8_dcl, ch, dl_ch, 8); @@ -924,11 +924,12 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, 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); - multadd_real_vector_complex_scalar(filt8_dcmc, + multadd_real_vector_complex_scalar(filt8_dcr, ch, dl_ch, 8); +/* pil += 2; re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1); rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; @@ -939,9 +940,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, ch, dl_ch, 8); +*/ } -//#ifdef DEBUG_PDSCH +#ifdef DEBUG_PDSCH dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset]; for(uint16_t idxP=0; idxP<(nb_rb_pdsch*12/8); idxP++) { for(uint8_t idxI=0; idxI<16; idxI+=2) { @@ -949,7 +951,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, } printf("\n"); } -//#endif +#endif } return(0); From 9e7186c2cb9b76549fae48ccdaec1b442a8d0555 Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Thu, 7 Nov 2019 17:00:30 +0100 Subject: [PATCH 03/22] updated dlsim --- .../PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c | 1 - openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 4 ++-- openair1/SIMULATION/NR_PHY/dlsim.c | 12 ++---------- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index ade2d1adec..cb5b51bc20 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -890,7 +890,6 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset]; uint16_t idxDC = 2*(ue->frame_parms.ofdm_symbol_size - bwp_start_subcarrier); uint16_t idxPil = idxDC/2; - printf("idxDC %d idxPil %d\n",idxDC,idxPil); re_offset = k; pil = (int16_t *)&pilot[rb_offset*((config_type==0) ? 6:4)]; pil += (idxPil-4); diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index ce01ecbab6..53d481919e 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -564,13 +564,13 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, // Fixme: correct type is unsigned, but nrLDPC_decoder and all called behind use signed int if (check_crc((uint8_t*)llrProcBuf,length_dec,harq_process->F,crc_type)) { - printf("\x1B[34m" "Segment %d CRC OK\n",r); + printf("\x1B[34m" "Segment %d CRC OK\n\033[0m",r); //Temporary hack no_iteration_ldpc = dlsch->max_ldpc_iterations; ret = no_iteration_ldpc; } else { - printf("\x1B[33m" "CRC NOK\n"); + printf("\x1B[33m" "CRC NOK\n\033[0m"); ret = 1 + dlsch->max_ldpc_iterations; } diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index e3e8eef767..e1628fe3e7 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -879,25 +879,17 @@ int main(int argc, char **argv) printf("*****************************************\n"); printf("SNR %f, (false positive %f)\n", SNR, - (float) n_false_positive / (float) n_trials); + (float) n_errors / (float) n_trials); printf("*****************************************\n"); printf("\n"); - if (errors_bit == 0) { - printf("PDSCH test OK\n"); - printf("\n"); - } - printf("SNR %f : n_errors (negative CRC) = %d/%d\n", SNR, n_errors, n_trials); printf("\n"); if ((float)n_errors/(float)n_trials <= target_error_rate) { - printf("PDCCH test OK\n"); + printf("PDSCH test OK\n"); break; } - - if (n_trials == 1) - break; } // NSR From 497afe4f58afdb8acdeb36be6068ac25fa5c21ef Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Fri, 8 Nov 2019 10:27:06 +0100 Subject: [PATCH 04/22] UL improved channel estimation around DC --- .../NR_ESTIMATION/nr_ul_channel_estimation.c | 67 ++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c index 0656091c78..c5a47e6a22 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c @@ -256,6 +256,71 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, ul_ch, 8); + // check if PRB crosses DC and improve estimates around DC + if ((bwp_start_subcarrier >= gNB->frame_parms.ofdm_symbol_size/2) && (bwp_start_subcarrier+nb_rb_pusch*12 >= gNB->frame_parms.ofdm_symbol_size)) { + ul_ch = (int16_t *)&ul_ch_estimates[aarx][ch_offset]; + uint16_t idxDC = 2*(gNB->frame_parms.ofdm_symbol_size - bwp_start_subcarrier); + uint16_t idxPil = idxDC/2; + re_offset = k; + pil = (int16_t *)&pilot[0]; + pil += (idxPil-4); + ul_ch += (idxDC-8); + ul_ch = memset(ul_ch, 0, sizeof(int16_t)*14); + + re_offset = (re_offset+idxDC/2-4)&(gNB->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); + + multadd_real_vector_complex_scalar(fl, + ch, + ul_ch, + 8); + + pil += 2; + re_offset = (re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); + + multadd_real_vector_complex_scalar(filt8_dcl, + ch, + ul_ch, + 8); + + pil += 4; + re_offset = (re_offset+4)&(gNB->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); + + multadd_real_vector_complex_scalar(filt8_dcr, + ch, + ul_ch, + 8); +/* + pil += 2; + re_offset = (re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); + + multadd_real_vector_complex_scalar(filt8_dcmd, + ch, + ul_ch, + 8); +*/ + } + +#ifdef DEBUG_PDSCH + ul_ch = (int16_t *)&ul_ch_estimates[aarx][ch_offset]; + for(uint16_t idxP=0; idxP<(nb_rb_pusch*12/8); idxP++) { + for(uint8_t idxI=0; idxI<16; idxI+=2) { + printf("%d\t%d\t",ul_ch[idxP*16+idxI],ul_ch[idxP*16+idxI+1]); + } + printf("\n"); + } +#endif // 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)); @@ -322,4 +387,4 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, #endif return(0); -} \ No newline at end of file +} From 09b38541c871bc48637ada93ca45bdb31a4c3fd7 Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Tue, 12 Nov 2019 14:28:34 +0100 Subject: [PATCH 05/22] Included DC handling for odd number of RBs --- openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c | 6 + openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h | 4 + .../nr_dl_channel_estimation.c | 103 ++++++++++-------- 3 files changed, 69 insertions(+), 44 deletions(-) diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c index 2ecc184b37..75d304606b 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c +++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c @@ -141,6 +141,12 @@ short filt8_dcl[8]= { short filt8_dcr[8]= { 0,0,0,4096,8192,12288,16384,0}; +short filt8_dcl_h[8]= { +16384,12288,8192,4096,0,0,0,0}; + +short filt8_dcr_h[8]= { +0,4096,8192,1228,16384,0,0,0}; + short filt8_l1[8] = { 24576,16384,0,0,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 5310d43d5b..5b853be4b3 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h +++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h @@ -103,6 +103,10 @@ extern short filt8_dcl[8]; extern short filt8_dcr[8]; +extern short filt8_dcl_h[8]; + +extern short filt8_dcr_h[8]; + extern short filt8_l1[8]; extern short filt8_ml1[8]; diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index cb5b51bc20..fdaf0d27e9 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -892,54 +892,69 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, uint16_t idxPil = idxDC/2; re_offset = k; pil = (int16_t *)&pilot[rb_offset*((config_type==0) ? 6:4)]; - pil += (idxPil-4); - dl_ch += (idxDC-8); - dl_ch = memset(dl_ch, 0, sizeof(int16_t)*14); - re_offset = (re_offset+idxDC/2-4)&(ue->frame_parms.ofdm_symbol_size-1); - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - 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); - - multadd_real_vector_complex_scalar(fl, - ch, - dl_ch, - 8); + // for proper allignment of SIMD vectors + if((ue->frame_parms.N_RB_DL&1)==0) { + pil += (idxPil-4); + dl_ch += (idxDC-8); + dl_ch = memset(dl_ch, 0, sizeof(int16_t)*14); + re_offset = (re_offset+idxDC/2-4)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); + + multadd_real_vector_complex_scalar(fl, + ch, + dl_ch, + 8); - pil += 2; - re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1); - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - 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); + pil += 2; + re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); - multadd_real_vector_complex_scalar(filt8_dcl, - ch, - dl_ch, - 8); - - pil += 4; - re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - 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); - - multadd_real_vector_complex_scalar(filt8_dcr, - ch, - dl_ch, - 8); + multadd_real_vector_complex_scalar(filt8_dcl, + ch, + dl_ch, + 8); + + pil += 4; + re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); + + multadd_real_vector_complex_scalar(filt8_dcr, + ch, + dl_ch, + 8); + } else { + pil += (idxPil-2); + dl_ch += (idxDC-4); + dl_ch = memset(dl_ch, 0, sizeof(int16_t)*10); + re_offset = (re_offset+idxDC/2-2)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); + + multadd_real_vector_complex_scalar(filt8_dcl_h, + ch, + dl_ch, + 8); + + pil += 4; + re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); + + multadd_real_vector_complex_scalar(filt8_dcr_h, + ch, + dl_ch, + 8); + } -/* - pil += 2; - re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1); - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - 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); - - multadd_real_vector_complex_scalar(filt8_dcmd, - ch, - dl_ch, - 8); -*/ } #ifdef DEBUG_PDSCH From 2deda8df514ab48f592edbfd71cfe5426ea8f344 Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Tue, 12 Nov 2019 15:15:37 +0100 Subject: [PATCH 06/22] Improved channel estimates around DC for uplink --- .../NR_ESTIMATION/nr_ul_channel_estimation.c | 108 ++++++++++-------- 1 file changed, 62 insertions(+), 46 deletions(-) diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c index c5a47e6a22..ed1d3808e0 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c @@ -119,12 +119,12 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, 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_DL); + printf("ch est pilot addr %p RB_DL %d\n",&pilot[0], gNB->frame_parms.N_RB_UL); printf("k %d, first_carrier %d\n",k,gNB->frame_parms.first_carrier_offset); printf("rxF addr %p p %d\n", rxF,p); printf("ul_ch addr %p nushift %d\n",ul_ch,nushift); #endif - //if ((gNB->frame_parms.N_RB_DL&1)==0) { + //if ((gNB->frame_parms.N_RB_UL&1)==0) { // Treat first 2 pilots specially (left edge) ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); @@ -256,6 +256,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, ul_ch, 8); + // check if PRB crosses DC and improve estimates around DC if ((bwp_start_subcarrier >= gNB->frame_parms.ofdm_symbol_size/2) && (bwp_start_subcarrier+nb_rb_pusch*12 >= gNB->frame_parms.ofdm_symbol_size)) { ul_ch = (int16_t *)&ul_ch_estimates[aarx][ch_offset]; @@ -263,55 +264,70 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, uint16_t idxPil = idxDC/2; re_offset = k; pil = (int16_t *)&pilot[0]; - pil += (idxPil-4); - ul_ch += (idxDC-8); - ul_ch = memset(ul_ch, 0, sizeof(int16_t)*14); - re_offset = (re_offset+idxDC/2-4)&(gNB->frame_parms.ofdm_symbol_size-1); - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - 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); - - multadd_real_vector_complex_scalar(fl, - ch, - ul_ch, - 8); + // for proper allignment of SIMD vectors + if((gNB->frame_parms.N_RB_UL&1)==0) { + pil += (idxPil-4); + ul_ch += (idxDC-8); + ul_ch = memset(ul_ch, 0, sizeof(int16_t)*14); + re_offset = (re_offset+idxDC/2-4)&(gNB->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); + + multadd_real_vector_complex_scalar(fl, + ch, + ul_ch, + 8); - pil += 2; - re_offset = (re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1); - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - 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); + pil += 2; + re_offset = (re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); - multadd_real_vector_complex_scalar(filt8_dcl, - ch, - ul_ch, - 8); - - pil += 4; - re_offset = (re_offset+4)&(gNB->frame_parms.ofdm_symbol_size-1); - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - 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); - - multadd_real_vector_complex_scalar(filt8_dcr, - ch, - ul_ch, - 8); -/* - pil += 2; - re_offset = (re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1); - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - 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); + multadd_real_vector_complex_scalar(filt8_dcl, + ch, + ul_ch, + 8); + + pil += 4; + re_offset = (re_offset+4)&(gNB->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); + + multadd_real_vector_complex_scalar(filt8_dcr, + ch, + ul_ch, + 8); + } else { + pil += (idxPil-2); + ul_ch += (idxDC-4); + ul_ch = memset(ul_ch, 0, sizeof(int16_t)*10); + re_offset = (re_offset+idxDC/2-2)&(gNB->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); + + multadd_real_vector_complex_scalar(filt8_dcl_h, + ch, + ul_ch, + 8); + + pil += 4; + re_offset = (re_offset+4)&(gNB->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); + + multadd_real_vector_complex_scalar(filt8_dcr_h, + ch, + ul_ch, + 8); + } - multadd_real_vector_complex_scalar(filt8_dcmd, - ch, - ul_ch, - 8); -*/ } - #ifdef DEBUG_PDSCH ul_ch = (int16_t *)&ul_ch_estimates[aarx][ch_offset]; for(uint16_t idxP=0; idxP<(nb_rb_pusch*12/8); idxP++) { From c3fcee20a1dc841254a457ec076900d8fb087a38 Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Tue, 12 Nov 2019 16:53:22 +0100 Subject: [PATCH 07/22] Added dlsim more dlsim test cases --- cmake_targets/autotests/test_case_list.xml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 9cfaa2b21d..a18676d4c8 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1090,7 +1090,9 @@ (Test9: 217 PRB 80 PDSCH-Offset), (Test10: 217 PRB 100 PDSCH-PRBs 80 PDSCH-Offset), (Test6: 106 PRB 0 MCS),--> - (Test7: 273 PRB 28 MCS) + (Test7: 106 PRB 9 MCS) + (Test8: 217 PRB 9 MCS) + (Test9: 273 PRB 9 MCS) $OPENAIR_DIR/cmake_targets/build_oai --phy_simulators -c @@ -1108,8 +1110,11 @@ -n100 -R217 -a80 -n100 -R217 -a80 -b100 -n100 -R106 -e0--> - -n100 -R273 -e28 - nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 + -n100 -R106 -b106 -e9 + -n100 -R217 -b217 -e9 + -n100 -R273 -b273 -e9 + nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 + nr_dlsim.test8 nr_dlsim.test9 "PDCCH test OK" "PDSCH test OK" segmentation fault|assertion|exiting|fatal 3 From 3185728107e52d7281764b8f9a1557b076d20339 Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Wed, 13 Nov 2019 14:35:14 +0100 Subject: [PATCH 08/22] Some updates in uplink and downlink channel estimations --- .../NR_ESTIMATION/nr_ul_channel_estimation.c | 102 +++++++---------- openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c | 4 +- .../nr_dl_channel_estimation.c | 104 ++++++++---------- 3 files changed, 87 insertions(+), 123 deletions(-) diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c index ed1d3808e0..a2b9ad8092 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c @@ -37,7 +37,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, unsigned short bwp_start_subcarrier, unsigned short nb_rb_pusch) { - int pilot[1320] __attribute__((aligned(16))); + int pilot[3280] __attribute__((aligned(16))); unsigned char aarx; unsigned short k; unsigned int pilot_cnt; @@ -264,77 +264,59 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, uint16_t idxPil = idxDC/2; re_offset = k; pil = (int16_t *)&pilot[0]; + pil += (idxPil-2); + ul_ch += (idxDC-4); + ul_ch = memset(ul_ch, 0, sizeof(int16_t)*10); + re_offset = (re_offset+idxDC/2-2)&(gNB->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); // for proper allignment of SIMD vectors if((gNB->frame_parms.N_RB_UL&1)==0) { - pil += (idxPil-4); - ul_ch += (idxDC-8); - ul_ch = memset(ul_ch, 0, sizeof(int16_t)*14); - re_offset = (re_offset+idxDC/2-4)&(gNB->frame_parms.ofdm_symbol_size-1); - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - 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); - - multadd_real_vector_complex_scalar(fl, - ch, - ul_ch, - 8); - pil += 2; - re_offset = (re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1); - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - 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); - - multadd_real_vector_complex_scalar(filt8_dcl, - ch, - ul_ch, - 8); - - pil += 4; - re_offset = (re_offset+4)&(gNB->frame_parms.ofdm_symbol_size-1); - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - 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); - - multadd_real_vector_complex_scalar(filt8_dcr, - ch, - ul_ch, - 8); - } else { - pil += (idxPil-2); - ul_ch += (idxDC-4); - ul_ch = memset(ul_ch, 0, sizeof(int16_t)*10); - re_offset = (re_offset+idxDC/2-2)&(gNB->frame_parms.ofdm_symbol_size-1); - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - 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); - - multadd_real_vector_complex_scalar(filt8_dcl_h, - ch, - ul_ch, - 8); - - pil += 4; - re_offset = (re_offset+4)&(gNB->frame_parms.ofdm_symbol_size-1); - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - 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); - - multadd_real_vector_complex_scalar(filt8_dcr_h, - ch, - ul_ch, - 8); + multadd_real_vector_complex_scalar(filt8_dcl, + ch, + ul_ch-4, + 8); + + pil += 4; + re_offset = (re_offset+4)&(gNB->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); + + multadd_real_vector_complex_scalar(filt8_dcr, + ch, + ul_ch-4, + 8); + } else { + + multadd_real_vector_complex_scalar(filt8_dcl_h, + ch, + ul_ch, + 8); + + pil += 4; + re_offset = (re_offset+4)&(gNB->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); + + multadd_real_vector_complex_scalar(filt8_dcr_h, + ch, + ul_ch, + 8); } } #ifdef DEBUG_PDSCH ul_ch = (int16_t *)&ul_ch_estimates[aarx][ch_offset]; - for(uint16_t idxP=0; idxP<(nb_rb_pusch*12/8); idxP++) { + for(uint16_t idxP=0; idxP>15); + 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_PDSCH printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); @@ -892,78 +892,60 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, uint16_t idxPil = idxDC/2; re_offset = k; pil = (int16_t *)&pilot[rb_offset*((config_type==0) ? 6:4)]; + pil += (idxPil-2); + dl_ch += (idxDC-4); + dl_ch = memset(dl_ch, 0, sizeof(int16_t)*10); + re_offset = (re_offset+idxDC/2-2)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); // for proper allignment of SIMD vectors if((ue->frame_parms.N_RB_DL&1)==0) { - pil += (idxPil-4); - dl_ch += (idxDC-8); - dl_ch = memset(dl_ch, 0, sizeof(int16_t)*14); - re_offset = (re_offset+idxDC/2-4)&(ue->frame_parms.ofdm_symbol_size-1); - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - 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); - - multadd_real_vector_complex_scalar(fl, - ch, - dl_ch, - 8); + + multadd_real_vector_complex_scalar(filt8_dcl, + ch, + dl_ch-4, + 8); + + pil += 4; + re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); + + multadd_real_vector_complex_scalar(filt8_dcr, + ch, + dl_ch-4, + 8); + } else { - pil += 2; - re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1); - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - 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); - - multadd_real_vector_complex_scalar(filt8_dcl, - ch, - dl_ch, - 8); - - pil += 4; - re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - 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); - - multadd_real_vector_complex_scalar(filt8_dcr, - ch, - dl_ch, - 8); - } else { - pil += (idxPil-2); - dl_ch += (idxDC-4); - dl_ch = memset(dl_ch, 0, sizeof(int16_t)*10); - re_offset = (re_offset+idxDC/2-2)&(ue->frame_parms.ofdm_symbol_size-1); - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - 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); - - multadd_real_vector_complex_scalar(filt8_dcl_h, - ch, - dl_ch, - 8); - - pil += 4; - re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - 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); - - multadd_real_vector_complex_scalar(filt8_dcr_h, - ch, - dl_ch, - 8); + multadd_real_vector_complex_scalar(filt8_dcl_h, + ch, + dl_ch, + 8); + + pil += 4; + re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + 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); + + multadd_real_vector_complex_scalar(filt8_dcr_h, + ch, + dl_ch, + 8); } } #ifdef DEBUG_PDSCH dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset]; - for(uint16_t idxP=0; idxP<(nb_rb_pdsch*12/8); idxP++) { + for(uint16_t idxP=0; idxP Date: Wed, 13 Nov 2019 14:57:29 +0100 Subject: [PATCH 09/22] Fixed CRC fail in PDSCH for large PRBs --- openair1/PHY/NR_REFSIG/nr_gold_ue.c | 2 +- openair1/PHY/defs_nr_UE.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openair1/PHY/NR_REFSIG/nr_gold_ue.c b/openair1/PHY/NR_REFSIG/nr_gold_ue.c index ad26356abb..c0015d128d 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold_ue.c +++ b/openair1/PHY/NR_REFSIG/nr_gold_ue.c @@ -148,7 +148,7 @@ void nr_gold_pdsch(PHY_VARS_NR_UE* ue, //printf("x1 : %x, x2 : %x\n",x1,x2); } - for (n=0; n<52; n++) { + for (n=0; n<104; n++) { x1 = (x1>>1) ^ (x1>>4); x1 = x1 ^ (x1<<31) ^ (x1<<28); x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4); diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index 780825b88a..b13c093c63 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -994,7 +994,7 @@ typedef struct { uint32_t nr_gold_pbch[2][64][NR_PBCH_DMRS_LENGTH_DWORD]; /// PDSCH DMRS - uint32_t nr_gold_pdsch[2][20][2][52]; + uint32_t nr_gold_pdsch[2][20][2][104]; /// PDCCH DMRS uint32_t nr_gold_pdcch[7][20][3][52]; From 1aa2b3041b5926b38532ae571bd200cdbdd9665e Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Wed, 13 Nov 2019 15:05:19 +0100 Subject: [PATCH 10/22] update to last commit --- openair1/PHY/NR_REFSIG/nr_gold_ue.c | 2 +- openair1/PHY/defs_nr_UE.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openair1/PHY/NR_REFSIG/nr_gold_ue.c b/openair1/PHY/NR_REFSIG/nr_gold_ue.c index c0015d128d..9793899dd4 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold_ue.c +++ b/openair1/PHY/NR_REFSIG/nr_gold_ue.c @@ -148,7 +148,7 @@ void nr_gold_pdsch(PHY_VARS_NR_UE* ue, //printf("x1 : %x, x2 : %x\n",x1,x2); } - for (n=0; n<104; n++) { + for (n=0; n>1) ^ (x1>>4); x1 = x1 ^ (x1<<31) ^ (x1<<28); x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4); diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index b13c093c63..19f4365a29 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -994,7 +994,7 @@ typedef struct { uint32_t nr_gold_pbch[2][64][NR_PBCH_DMRS_LENGTH_DWORD]; /// PDSCH DMRS - uint32_t nr_gold_pdsch[2][20][2][104]; + uint32_t nr_gold_pdsch[2][20][2][NR_MAX_PDSCH_DMRS_INIT_LENGTH_DWORD]; /// PDCCH DMRS uint32_t nr_gold_pdcch[7][20][3][52]; From 95ef6bd9b70759af387c51339b15d5f4fa3f0213 Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Thu, 14 Nov 2019 13:48:15 +0100 Subject: [PATCH 11/22] Included previously commented tests --- cmake_targets/autotests/test_case_list.xml | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index a18676d4c8..f1e372bca7 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1084,35 +1084,27 @@ (Test3: 273 PRB), (Test4: 106 PRB 12 CSET-Offset), (Test5: 217 PRB 48 CSET-Offset), - - (Test7: 106 PRB 9 MCS) - (Test8: 217 PRB 9 MCS) - (Test9: 273 PRB 9 MCS) + (Test10: 217 PRB 100 PDSCH-PRBs 80 PDSCH-Offset) $OPENAIR_DIR/cmake_targets/build_oai --phy_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/targets/bin/nr_dlsim.Rel15 - -n100 -R106 - -n100 -R217 - -n100 -R273 + -n100 -R106 -b106 + -n100 -R217 -b217 + -n100 -R273 -b273 -n100 -R106 -o12 -n100 -R217 -o48 - - -n100 -R106 -b106 -e9 - -n100 -R217 -b217 -e9 - -n100 -R273 -b273 -e9 + -n100 -R217 -a80 -b100 nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 "PDCCH test OK" "PDSCH test OK" From eff0a870b72c469ec38e98aac13b9c84d3128847 Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Thu, 14 Nov 2019 15:06:23 +0100 Subject: [PATCH 12/22] PUSCH UE DMRS index with correct data type --- openair1/PHY/NR_REFSIG/dmrs_nr.h | 2 +- openair1/PHY/NR_UE_TRANSPORT/dmrs_nr.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openair1/PHY/NR_REFSIG/dmrs_nr.h b/openair1/PHY/NR_REFSIG/dmrs_nr.h index 9b02d2b1af..5c4f218512 100644 --- a/openair1/PHY/NR_REFSIG/dmrs_nr.h +++ b/openair1/PHY/NR_REFSIG/dmrs_nr.h @@ -55,7 +55,7 @@ int pseudo_random_sequence(int M_PN, uint32_t *c, uint32_t cinit); void lte_gold_new(LTE_DL_FRAME_PARMS *frame_parms, uint32_t lte_gold_table[20][2][14], uint16_t Nid_cell); void generate_dmrs_pbch(uint32_t dmrs_pbch_bitmap[DMRS_PBCH_I_SSB][DMRS_PBCH_N_HF][DMRS_BITMAP_SIZE], uint16_t Nid_cell); uint8_t get_l0_ul(uint8_t mapping_type, uint8_t dmrs_typeA_position); -uint16_t get_dmrs_freq_idx_ul(uint8_t n, uint8_t k_prime, uint8_t delta, uint8_t dmrs_type); +uint16_t get_dmrs_freq_idx_ul(uint16_t n, uint8_t k_prime, uint8_t delta, uint8_t dmrs_type); #undef EXTERN diff --git a/openair1/PHY/NR_UE_TRANSPORT/dmrs_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dmrs_nr.c index d976ec5a04..4d77854a70 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/dmrs_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/dmrs_nr.c @@ -258,7 +258,7 @@ uint8_t get_l0_ul(uint8_t mapping_type, uint8_t dmrs_typeA_position) { * *********************************************************************/ -uint16_t get_dmrs_freq_idx_ul(uint8_t n, uint8_t k_prime, uint8_t delta, uint8_t dmrs_type) { +uint16_t get_dmrs_freq_idx_ul(uint16_t n, uint8_t k_prime, uint8_t delta, uint8_t dmrs_type) { uint16_t dmrs_idx; From 348afdc17e427acf809eaef7f1693cb6ddc124fc Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Thu, 14 Nov 2019 15:18:37 +0100 Subject: [PATCH 13/22] Added more test cases for nr_ulsim --- cmake_targets/autotests/test_case_list.xml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index f1e372bca7..fb1eb89836 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1237,19 +1237,23 @@ execution - nr_ulsim Test cases. (Test1: MCS 9), - (Test2: MCS 16), - (Test3: MCS 28) + nr_ulsim Test cases. (Test1: MCS 9 106 PRBs), + (Test2: MCS 16 50 PRBs), + (Test3: MCS 28 50 PRBs) + (Test4: MCS 9 217 PRBs), + (Test5: MCS 9 273 PRBs) $OPENAIR_DIR/cmake_targets/build_oai --phy_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/targets/bin/nr_ulsim.Rel15 - -f100 -m9 -s10 + -f100 -m9 -r106 -s10 -f100 -m16 -s20 - -f100 -m28 -s30 - nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 + -f100 -m28 -s30 + -f100 -m9 -R217 -r217 -s10 + -f100 -m9 -R273 -r273 -s10 + nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 PUSCH test OK segmentation fault|assertion|exiting|fatal 3 From ebd3871827636ab620a107618a8210b7054fd3c2 Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Thu, 14 Nov 2019 17:16:25 +0100 Subject: [PATCH 14/22] Updated nr_dlsim test cases --- cmake_targets/autotests/test_case_list.xml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index fb1eb89836..b053b26c3a 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1088,7 +1088,8 @@ (Test7: 106 PRB 51 PDSCH-Offset), (Test8: 217 PRB 100 PDSCH-PRBs), (Test9: 217 PRB 80 PDSCH-Offset), - (Test10: 217 PRB 100 PDSCH-PRBs 80 PDSCH-Offset) + (Test10: 217 PRB 100 PDSCH-PRBs 80 PDSCH-Offset), + (Test11: 106 PRBs 50 PDSCH-PRBs MCS Index 28 $OPENAIR_DIR/cmake_targets/build_oai --phy_simulators -c @@ -1104,10 +1105,11 @@ -n100 -R106 -a51 -n100 -R217 -b100 -n100 -R217 -a80 - -n100 -R217 -a80 -b100 - nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 - nr_dlsim.test8 nr_dlsim.test9 - "PDCCH test OK" "PDSCH test OK" + -n100 -R217 -a80 -b100 + -n100 -e28 + nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 + nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 + PDSCH test OK segmentation fault|assertion|exiting|fatal 3 From ef3be740258e5bbfb373b3bd75c55daa5a58bd6f Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Thu, 14 Nov 2019 17:32:09 +0100 Subject: [PATCH 15/22] Fix channel estimation for 3/4 sampling In 3/4 sampling mode, the OFDM symbol size is _not_ a power of two (e.g. 1536 instead of 2048). In this case it is _not_ OK to calculate the modulus using a binary AND, it _must_ use either the actul modulus operator (%) using an integer division, or a _correct_ if statement or tertianary operator like this: re_offset = (re_offset + 4 >= ue->frame_parms.ofdm_symbol_size) ? (re_offset + 4 - ue->frame_parms.ofdm_symbol_size) : (re_offset + 4); But of course using the actual modulus operator is much more readable and surely not much slower: re_offset = (re_offset + 4) % ue->frame_parms.ofdm_symbol_size; --- .../NR_ESTIMATION/nr_ul_channel_estimation.c | 20 +++--- .../nr_dl_channel_estimation.c | 71 +++++++------------ 2 files changed, 35 insertions(+), 56 deletions(-) diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c index a2b9ad8092..d81669f69f 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c @@ -140,7 +140,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, ul_ch, 8); pil+=2; - re_offset = (re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1); + re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; //for (int i= 0; i<8; i++) //printf("ul_ch addr %p %d\n", ul_ch+i, *(ul_ch+i)); @@ -156,7 +156,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, ul_ch, 8); pil+=2; - re_offset = (re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1); + 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); @@ -175,7 +175,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, //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-1); + re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; ul_ch+=8; @@ -193,7 +193,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, 8); pil+=2; - re_offset = (re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1); + re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); @@ -206,7 +206,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, ul_ch, 8); pil+=2; - re_offset = (re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1); + re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; ul_ch+=8; @@ -227,7 +227,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, //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-1); + re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); @@ -242,7 +242,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, 8); pil+=2; - re_offset = (re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1); + re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; ul_ch+=8; @@ -267,7 +267,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, pil += (idxPil-2); ul_ch += (idxDC-4); ul_ch = memset(ul_ch, 0, sizeof(int16_t)*10); - re_offset = (re_offset+idxDC/2-2)&(gNB->frame_parms.ofdm_symbol_size-1); + re_offset = (re_offset+idxDC/2-2) % gNB->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; 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); @@ -281,7 +281,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, 8); pil += 4; - re_offset = (re_offset+4)&(gNB->frame_parms.ofdm_symbol_size-1); + re_offset = (re_offset+4) % gNB->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; 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); @@ -298,7 +298,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, 8); pil += 4; - re_offset = (re_offset+4)&(gNB->frame_parms.ofdm_symbol_size-1); + re_offset = (re_offset+4) % gNB->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; 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); diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index f7ae901a05..91394efb59 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -98,8 +98,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, #endif pil+=2; - //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); - re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4); + re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; @@ -114,8 +113,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, #endif pil+=2; - //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); - re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4); + re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; current_ssb->c_re +=ch[0]; @@ -126,8 +124,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, #endif pil+=2; - //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); - re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4); + re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; for (pilot_cnt=3; pilot_cnt<(3*20); pilot_cnt+=3) { @@ -138,8 +135,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, // in 2nd symbol, skip middle REs (48 with DMRS, 144 for SSS, and another 48 with DMRS) if (dmrss == 1 && pilot_cnt == 12) { pilot_cnt=48; - //re_offset = (re_offset+144)&(ue->frame_parms.ofdm_symbol_size-1); - re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 144) : (re_offset+144); + re_offset = (re_offset+144) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; } ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); @@ -153,8 +149,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, #endif pil+=2; - //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); - re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4); + re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; @@ -168,8 +163,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, printf("pilot %u : 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 pil+=2; - //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); - re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4); + re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; @@ -184,8 +178,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, #endif pil+=2; - //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); - re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4); + re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; } @@ -314,8 +307,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, dl_ch, 16); pil+=2; - //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); - re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4); + re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; //for (int i= 0; i<8; i++) @@ -333,8 +325,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, dl_ch, 16); pil+=2; - //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); - re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4); + re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); @@ -349,8 +340,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, dl_ch, 16); pil+=2; - //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); - re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4); + re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; dl_ch+=24; @@ -362,8 +352,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, // in 2nd symbol, skip middle REs (48 with DMRS, 144 for SSS, and another 48 with DMRS) if (dmrss == 1 && pilot_cnt == 12) { pilot_cnt=48; - //re_offset = (re_offset+144)&(ue->frame_parms.ofdm_symbol_size-1); - re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 144) : (re_offset+144); + re_offset = (re_offset+144) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; dl_ch += 288; } @@ -382,8 +371,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, // printf("pilot_cnt %d dl_ch %d %d\n", pilot_cnt, dl_ch+i, *(dl_ch+i)); pil+=2; - //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); - re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4); + re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; @@ -398,8 +386,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, dl_ch, 16); pil+=2; - //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); - re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4); + re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; @@ -415,8 +402,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, dl_ch, 16); pil+=2; - //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); - re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4); + re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; dl_ch+=24; @@ -731,7 +717,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { pil = (int16_t *)&pilot[rb_offset*((config_type==0) ? 6:4)]; - k = k&(ue->frame_parms.ofdm_symbol_size-1); + k = k % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+nushift)]; dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset]; @@ -761,8 +747,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, dl_ch, 8); pil+=2; - re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1); - //re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 2) : (re_offset+2); + re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; //for (int i= 0; i<8; i++) //printf("dl_ch addr %p %d\n", dl_ch+i, *(dl_ch+i)); @@ -777,8 +762,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, dl_ch, 8); pil+=2; - re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1); - //re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 2) : (re_offset+2); + re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; //printf("dl_ch addr %p\n",dl_ch); @@ -796,8 +780,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, //printf("dl_ch addr %p %d\n", dl_ch+i, *(dl_ch+i)); pil+=2; - re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1); - //re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 2) : (re_offset+2); + re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; dl_ch+=8; @@ -817,8 +800,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, 8); pil+=2; - re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1); - //re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 2) : (re_offset+2); + re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); @@ -831,8 +813,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, dl_ch, 8); pil+=2; - re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1); - //re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 2) : (re_offset+2); + re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; dl_ch+=8; @@ -853,8 +834,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, //printf("dl_ch addr %p %d\n", dl_ch+i, *(dl_ch+i)); pil+=2; - re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1); - //re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 2) : (re_offset+2); + re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); @@ -869,8 +849,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, 8); pil+=2; - re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1); - //re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 2) : (re_offset+2); + re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; dl_ch+=8; @@ -895,7 +874,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, pil += (idxPil-2); dl_ch += (idxDC-4); dl_ch = memset(dl_ch, 0, sizeof(int16_t)*10); - re_offset = (re_offset+idxDC/2-2)&(ue->frame_parms.ofdm_symbol_size-1); + re_offset = (re_offset+idxDC/2-2) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; 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); @@ -909,7 +888,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, 8); pil += 4; - re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); + re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; 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); @@ -926,7 +905,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, 8); pil += 4; - re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); + re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; 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); From 4815ff113d8e5c95b1628187395deb411ff3f882 Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Thu, 14 Nov 2019 18:21:11 +0100 Subject: [PATCH 16/22] Removed 273 PRB test (not supported by PUSCH for now) --- cmake_targets/autotests/test_case_list.xml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index b053b26c3a..454d551487 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1241,9 +1241,8 @@ execution nr_ulsim Test cases. (Test1: MCS 9 106 PRBs), (Test2: MCS 16 50 PRBs), - (Test3: MCS 28 50 PRBs) - (Test4: MCS 9 217 PRBs), - (Test5: MCS 9 273 PRBs) + (Test3: MCS 28 50 PRBs), + (Test4: MCS 9 217 PRBs) $OPENAIR_DIR/cmake_targets/build_oai --phy_simulators -c @@ -1253,9 +1252,8 @@ -f100 -m9 -r106 -s10 -f100 -m16 -s20 -f100 -m28 -s30 - -f100 -m9 -R217 -r217 -s10 - -f100 -m9 -R273 -r273 -s10 - nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 + -f100 -m9 -R217 -r217 -s10 + nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 PUSCH test OK segmentation fault|assertion|exiting|fatal 3 From e253a6f38096f57964679ea1cf3596f830f9d0c4 Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Fri, 15 Nov 2019 14:15:45 +0100 Subject: [PATCH 17/22] Added support for nushift --- .../NR_ESTIMATION/nr_ul_channel_estimation.c | 19 +++++++++++++----- openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c | 20 +++++++++++++++---- openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h | 15 ++++++++++---- .../nr_dl_channel_estimation.c | 19 +++++++++++++----- 4 files changed, 55 insertions(+), 18 deletions(-) diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c index d81669f69f..89321f637b 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c @@ -41,7 +41,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, unsigned char aarx; unsigned short k; unsigned int pilot_cnt; - int16_t ch[2],*pil,*rxF,*ul_ch,*fl,*fm,*fr,*fml,*fmr,*fmm; + int16_t ch[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(16))); @@ -82,6 +83,10 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, fmm = filt8_mm0; fml = filt8_m0; fmr = filt8_mr0; + fdcl = filt8_dcl0; + fdcr = filt8_dcr0; + fdclh = filt8_dcl0_h; + fdcrh = filt8_dcr0_h; break; case 1: @@ -91,6 +96,10 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, fmm = filt8_mm1; fml = filt8_ml1; fmr = filt8_m1; + fdcl = filt8_dcl1; + fdcr = filt8_dcr1; + fdclh = filt8_dcl1_h; + fdcrh = filt8_dcr1_h; break; default: @@ -275,7 +284,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, // for proper allignment of SIMD vectors if((gNB->frame_parms.N_RB_UL&1)==0) { - multadd_real_vector_complex_scalar(filt8_dcl, + multadd_real_vector_complex_scalar(fdcl, ch, ul_ch-4, 8); @@ -286,13 +295,13 @@ 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); - multadd_real_vector_complex_scalar(filt8_dcr, + multadd_real_vector_complex_scalar(fdcr, ch, ul_ch-4, 8); } else { - multadd_real_vector_complex_scalar(filt8_dcl_h, + multadd_real_vector_complex_scalar(fdclh, ch, ul_ch, 8); @@ -303,7 +312,7 @@ 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); - multadd_real_vector_complex_scalar(filt8_dcr_h, + multadd_real_vector_complex_scalar(fdcrh, ch, ul_ch, 8); diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c index c6870dd613..eeee55ea3f 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c +++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c @@ -135,16 +135,16 @@ short filt8_dcmc[8]= { short filt8_dcmd[8]= { 0,0,0,4096,4096,8192,12288,16384}; -short filt8_dcl[8]= { +short filt8_dcl0[8]= { 0,0,16384,12288,8192,4096,0,0}; -short filt8_dcr[8]= { +short filt8_dcr0[8]= { 0,0,0,4096,8192,12288,16384,0}; -short filt8_dcl_h[8]= { +short filt8_dcl0_h[8]= { 16384,12288,8192,4096,0,0,0,0}; -short filt8_dcr_h[8]= { +short filt8_dcr0_h[8]= { 0,4096,8192,12288,16384,0,0,0}; short filt8_l1[8] = { @@ -161,3 +161,15 @@ short filt8_m1[8] = { short filt8_mm1[8]= { 0,0,0,0,8192,16384,8192,0}; + +short filt8_dcl1[8]= { +0,0,0,16384,12288,8192,4096,0}; + +short filt8_dcr1[8]= { +0,0,0,0,4096,8192,12288,16384}; + +short filt8_dcl1_h[8]= { +0,16384,12288,8192,4096,0,0,0}; + +short filt8_dcr1_h[8]= { +0,0,4096,8192,12288,16384,0,0}; diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h index 5b853be4b3..f64aebeb52 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h +++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h @@ -99,13 +99,13 @@ extern short filt8_dcmc[8]; extern short filt8_dcmd[8]; -extern short filt8_dcl[8]; +extern short filt8_dcl0[8]; -extern short filt8_dcr[8]; +extern short filt8_dcr0[8]; -extern short filt8_dcl_h[8]; +extern short filt8_dcl0_h[8]; -extern short filt8_dcr_h[8]; +extern short filt8_dcr0_h[8]; extern short filt8_l1[8]; @@ -117,4 +117,11 @@ extern short filt8_m1[8]; extern short filt8_mm1[8]; +extern short filt8_dcl1[8]; + +extern short filt8_dcr1[8]; + +extern short filt8_dcl1_h[8]; + +extern short filt8_dcr1_h[8]; #endif diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index 91394efb59..752d06fb21 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -656,7 +656,8 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, unsigned char aarx; unsigned short k; unsigned int pilot_cnt; - int16_t ch[2],*pil,*rxF,*dl_ch,*fl,*fm,*fr,*fml,*fmr,*fmm; + int16_t ch[2],*pil,*rxF,*dl_ch; + int16_t *fl,*fm,*fr,*fml,*fmr,*fmm,*fdcl,*fdcr,*fdclh,*fdcrh; int ch_offset,symbol_offset; //uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1]; @@ -691,6 +692,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, fmm = filt8_mm0; fml = filt8_m0; fmr = filt8_mr0; + fdcl = filt8_dcl0; + fdcr = filt8_dcr0; + fdclh = filt8_dcl0_h; + fdcrh = filt8_dcr0_h; break; case 1: @@ -700,6 +705,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, fmm = filt8_mm1; fml = filt8_ml1; fmr = filt8_m1; + fdcl = filt8_dcl1; + fdcr = filt8_dcr1; + fdclh = filt8_dcl1_h; + fdcrh = filt8_dcr1_h; break; default: @@ -882,7 +891,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, // for proper allignment of SIMD vectors if((ue->frame_parms.N_RB_DL&1)==0) { - multadd_real_vector_complex_scalar(filt8_dcl, + multadd_real_vector_complex_scalar(fdcl, ch, dl_ch-4, 8); @@ -893,13 +902,13 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, 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); - multadd_real_vector_complex_scalar(filt8_dcr, + multadd_real_vector_complex_scalar(fdcr, ch, dl_ch-4, 8); } else { - multadd_real_vector_complex_scalar(filt8_dcl_h, + multadd_real_vector_complex_scalar(fdclh, ch, dl_ch, 8); @@ -910,7 +919,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, 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); - multadd_real_vector_complex_scalar(filt8_dcr_h, + multadd_real_vector_complex_scalar(fdcrh, ch, dl_ch, 8); From 0ea53f48b9ca9abf5838be3ea386d70b6734d8e8 Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Fri, 15 Nov 2019 17:21:37 +0100 Subject: [PATCH 18/22] Added back ulsim test case for 273 RB --- cmake_targets/autotests/test_case_list.xml | 8 +++++--- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 454d551487..a407171d01 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1242,7 +1242,8 @@ nr_ulsim Test cases. (Test1: MCS 9 106 PRBs), (Test2: MCS 16 50 PRBs), (Test3: MCS 28 50 PRBs), - (Test4: MCS 9 217 PRBs) + (Test4: MCS 9 217 PRBs), + (Test5: MCS 9 273 PRBs) $OPENAIR_DIR/cmake_targets/build_oai --phy_simulators -c @@ -1252,8 +1253,9 @@ -f100 -m9 -r106 -s10 -f100 -m16 -s20 -f100 -m28 -s30 - -f100 -m9 -R217 -r217 -s10 - nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 + -f100 -m9 -R217 -r217 -s10 + -f100 -m9 -R273 -r273 -s10 + nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 PUSCH test OK segmentation fault|assertion|exiting|fatal 3 diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 1689a627fc..6c74b87d61 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -299,6 +299,7 @@ void nr_fill_rx_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int UE_id, // case 75: timing_advance_update /= 12; break; case 106: timing_advance_update /= 16; break; case 217: timing_advance_update /= 32; break; + case 273: timing_advance_update /= 32; break; default: abort(); } From 72fc49ccf22a362f9ec0db6548ba601a7934a308 Mon Sep 17 00:00:00 2001 From: Raphael Defosseux Date: Thu, 21 Nov 2019 15:31:36 +0100 Subject: [PATCH 19/22] CI: putting back flexran-ctl in build/testing --> now on develop branch of this repo Signed-off-by: Raphael Defosseux --- ci-scripts/Jenkinsfile-gitlab | 2 +- ci-scripts/buildOnVM.sh | 6 +++++- ci-scripts/main.py | 4 ++-- ci-scripts/oai-ci-vm-tool | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/ci-scripts/Jenkinsfile-gitlab b/ci-scripts/Jenkinsfile-gitlab index 86e9cdf74b..4060a1f749 100644 --- a/ci-scripts/Jenkinsfile-gitlab +++ b/ci-scripts/Jenkinsfile-gitlab @@ -131,8 +131,8 @@ pipeline { [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.FlexRanRtcGitLabRepository_Credentials}", usernameVariable: 'git_username', passwordVariable: 'git_password'] ]) { sh "git clone https://${git_username}:${git_password}@gitlab.eurecom.fr/flexran/flexran-rtc.git . > ../git_clone.log 2>&1" + sh "git checkout develop >> ../git_clone.log 2>&1" } - sh "sed -i -e 's#add-apt-repository.*cleishm.*neo4j#add-apt-repository ppa:cleishm/neo4j -y#' -e 's#libneo4j-client-dev#libneo4j-client-dev -y#' tools/install_dependencies" sh "zip -r -qq flexran.zip ." } } diff --git a/ci-scripts/buildOnVM.sh b/ci-scripts/buildOnVM.sh index 858ddf6f6e..ef2637965f 100755 --- a/ci-scripts/buildOnVM.sh +++ b/ci-scripts/buildOnVM.sh @@ -179,8 +179,12 @@ function build_on_vm { echo "cp /home/ubuntu/zip-install.txt cmake_targets/log" >> $VM_CMDS echo "echo \"./tools/install_dependencies \"" >> $VM_CMDS echo "./tools/install_dependencies > cmake_targets/log/install-build.txt 2>&1" >> $VM_CMDS + echo "echo \"mkdir build\"" >> $VM_CMDS + echo "mkdir build" >> $VM_CMDS + echo "echo \"cd build\"" >> $VM_CMDS + echo "cd build" >> $VM_CMDS echo "echo \"$BUILD_OPTIONS \"" >> $VM_CMDS - echo "$BUILD_OPTIONS > cmake_targets/log/rt_controller.Rel15.txt 2>&1" >> $VM_CMDS + echo "$BUILD_OPTIONS > ../cmake_targets/log/rt_controller.Rel15.txt 2>&1" >> $VM_CMDS fi if [[ "$VM_NAME" != *"-cppcheck"* ]] && [[ "$VM_NAME" != *"-flexran-rtc"* ]] then diff --git a/ci-scripts/main.py b/ci-scripts/main.py index fc7d2090db..aaa7ede62a 100644 --- a/ci-scripts/main.py +++ b/ci-scripts/main.py @@ -372,7 +372,7 @@ class SSHConnection(): self.air_interface = 'lte' self.command('mkdir -p ' + lSourcePath, '\$', 5) self.command('cd ' + lSourcePath, '\$', 5) - self.command('if [ ! -e .git ]; then stdbuf -o0 git clone ' + self.ranRepository + ' .; else stdbuf -o0 git fetch; fi', '\$', 600) + self.command('if [ ! -e .git ]; then stdbuf -o0 git clone ' + self.ranRepository + ' .; else stdbuf -o0 git fetch --prune; fi', '\$', 600) # Raphael: here add a check if git clone or git fetch went smoothly self.command('git config user.email "jenkins@openairinterface.org"', '\$', 5) self.command('git config user.name "OAI Jenkins"', '\$', 5) @@ -537,7 +537,7 @@ class SSHConnection(): ue_prefix = '' self.command('mkdir -p ' + self.UESourceCodePath, '\$', 5) self.command('cd ' + self.UESourceCodePath, '\$', 5) - self.command('if [ ! -e .git ]; then stdbuf -o0 git clone ' + self.ranRepository + ' .; else stdbuf -o0 git fetch; fi', '\$', 600) + self.command('if [ ! -e .git ]; then stdbuf -o0 git clone ' + self.ranRepository + ' .; else stdbuf -o0 git fetch --prune; fi', '\$', 600) # here add a check if git clone or git fetch went smoothly self.command('git config user.email "jenkins@openairinterface.org"', '\$', 5) self.command('git config user.name "OAI Jenkins"', '\$', 5) diff --git a/ci-scripts/oai-ci-vm-tool b/ci-scripts/oai-ci-vm-tool index bbea199ca1..ce40134cec 100755 --- a/ci-scripts/oai-ci-vm-tool +++ b/ci-scripts/oai-ci-vm-tool @@ -222,7 +222,7 @@ function variant__v8__ue_ethernet { function variant__v10__flexran_rtc { ARCHIVES_LOC=flexran NB_PATTERN_FILES=1 - BUILD_OPTIONS="cmake . && make -j2" + BUILD_OPTIONS="cmake .. && make -j2" VARIANT_INFO="non-OSA" } From dfad6a91d7e334f9472b6df1d102b1179cf4f3f2 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 24 Sep 2019 17:14:00 +0200 Subject: [PATCH 20/22] removing duplicate and erroneous malloc --- targets/RT/USER/lte-ru.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c index f81626f929..dea8c7a2b5 100644 --- a/targets/RT/USER/lte-ru.c +++ b/targets/RT/USER/lte-ru.c @@ -2731,11 +2731,6 @@ void init_RU(char *rf_config_file, else ru->generate_dmrs_sync = 0; - if (ru->generate_dmrs_sync == 1) { - generate_ul_ref_sigs(); - ru->dmrssync = (int16_t *)malloc16_clear(ru->frame_parms->ofdm_symbol_size*2*sizeof(int16_t)); - } - ru->wakeup_L1_sleeptime = 2000; ru->wakeup_L1_sleep_cnt_max = 3; From 67a23b33860b4074524ca45db89c32db9d242585 Mon Sep 17 00:00:00 2001 From: Raphael Defosseux Date: Wed, 25 Sep 2019 17:02:11 +0200 Subject: [PATCH 21/22] CI: adding back the multi-RRU test in develop-nr Signed-off-by: Raphael Defosseux --- ci-scripts/Jenkinsfile-gitlab | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/ci-scripts/Jenkinsfile-gitlab b/ci-scripts/Jenkinsfile-gitlab index 86e9cdf74b..4c2bdf2814 100644 --- a/ci-scripts/Jenkinsfile-gitlab +++ b/ci-scripts/Jenkinsfile-gitlab @@ -44,7 +44,7 @@ pipeline { disableConcurrentBuilds() timestamps() gitLabConnection('OAI GitLab') - gitlabBuilds(builds: ["Build gNB-USRP", "Build nr-UE-USRP", "Build eNB-USRP", "Build basic-sim", "Build phy-sim", "Build eNB-ethernet", "Build UE-ethernet", "Analysis with cppcheck", "Test phy-sim", "Test basic-sim", "Test L2-sim", "Test-Mono-FDD-Band7", "Test-Mono-TDD-Band40", "Test-IF4p5-FDD-Band7", "Test-IF4p5-TDD-Band40", "Test-Mono-FDD-Band13", "Test-Mono-FDD-Band13-X2-HO", "Test-TDD-Band78-gNB-NR-UE"]) + gitlabBuilds(builds: ["Build gNB-USRP", "Build nr-UE-USRP", "Build eNB-USRP", "Build basic-sim", "Build phy-sim", "Build eNB-ethernet", "Build UE-ethernet", "Analysis with cppcheck", "Test phy-sim", "Test basic-sim", "Test L2-sim", "Test-Mono-FDD-Band7", "Test-Mono-TDD-Band40", "Test-IF4p5-FDD-Band7", "Test-IF4p5-TDD-Band40", "Test-Mono-FDD-Band13", "Test-IF4p5-TDD-Band38-Multi-RRU" , "Test-Mono-FDD-Band13-X2-HO", "Test-TDD-Band78-gNB-NR-UE"]) ansiColor('xterm') } @@ -578,6 +578,25 @@ pipeline { } } } + stage ("Test IF4p5 - TDD - Band 38 - B210 - MultiRRU") { + steps { + script { + triggerSlaveJob ('eNB-CI-IF4p5-TDD-Band38-MultiRRU-B210', 'Test-IF4p5-TDD-Band38-Multi-RRU') + } + } + post { + always { + script { + finalizeSlaveJob('eNB-CI-IF4p5-TDD-Band38-MultiRRU-B210') + } + } + failure { + script { + currentBuild.result = 'FAILURE' + } + } + } + } stage ("Test OAI UE - FDD - Band 20 - B200") { steps { script { From c4121a997f67c4b185d7d83ef24aaf00b1f3f3f8 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Mon, 25 Nov 2019 22:07:51 +0100 Subject: [PATCH 22/22] registering log components --- common/utils/LOG/log.c | 4 ++++ executables/nr-uesoftmodem.c | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/common/utils/LOG/log.c b/common/utils/LOG/log.c index 8d46f72f9c..6bad041641 100644 --- a/common/utils/LOG/log.c +++ b/common/utils/LOG/log.c @@ -434,6 +434,10 @@ int logInit (void) register_log_component("ASN","log",ASN); register_log_component("NFAPI_VNF","log",NFAPI_VNF); register_log_component("NFAPI_PNF","log",NFAPI_PNF); + register_log_component("GNB_APP","log",GNB_APP); + register_log_component("NR_RRC","log",NR_RRC); + register_log_component("NR_MAC","log",NR_MAC); + register_log_component("NR_PHY","log",NR_PHY); for (int i=0 ; log_level_names[i].name != NULL ; i++) g_log->level2string[i] = toupper(log_level_names[i].name[0]); // uppercased first letter of level name diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index 7881783651..9bfb76ddc8 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -671,7 +671,7 @@ int main( int argc, char **argv ) { logInit(); // get options and fill parameters from configuration file get_options (); //Command-line options, enb_properties - get_common_options(); + //get_common_options(); #if T_TRACER T_Config_Init(); #endif