From b19377138737ac4f0543c7ea1abe648791e81b84 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 17 Feb 2021 15:34:49 +0100 Subject: [PATCH] 12-bit frequency-domain equalizer LUT. fix for log2_maxh in ULSCH receiver --- openair1/PHY/INIT/lte_init.c | 1 + .../PHY/LTE_ESTIMATION/freq_equalization.c | 20 +++++++++++-------- openair1/PHY/LTE_ESTIMATION/lte_estimation.h | 1 + .../PHY/LTE_TRANSPORT/ulsch_demodulation.c | 4 +--- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index 178e9ef302..606cd0407d 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -425,6 +425,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, generate_phich_reg_mapping (fp); init_sss(); + init_fde(); for (UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) { eNB->first_run_timing_advance[UE_id] = 1; ///This flag used to be static. With multiple eNBs this does no longer work, hence we put it in the structure. However it has to be initialized with 1, which is performed here. diff --git a/openair1/PHY/LTE_ESTIMATION/freq_equalization.c b/openair1/PHY/LTE_ESTIMATION/freq_equalization.c index cbf987623c..4f561238c6 100644 --- a/openair1/PHY/LTE_ESTIMATION/freq_equalization.c +++ b/openair1/PHY/LTE_ESTIMATION/freq_equalization.c @@ -22,8 +22,8 @@ #include "PHY/defs_eNB.h" #include "PHY/sse_intrin.h" -// This is 512/(1:256) in __m128i format -int16_t inv_ch[256*8] = {512,512,512,512,512,512,512,512, +// This is 4096/(1:4096) in __m128i format +__m128i inv_ch[4096];/* = {512,512,512,512,512,512,512,512, 256,256,256,256,256,256,256,256, 170,170,170,170,170,170,170,170, 128,128,128,128,128,128,128,128, @@ -279,7 +279,11 @@ int16_t inv_ch[256*8] = {512,512,512,512,512,512,512,512, 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, - }; + };*/ + +void init_fde() { + for (int i=1;i<4096;i++) inv_ch[i] = _mm_set1_epi16(4096/i); +} void freq_equalization(LTE_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp, @@ -312,12 +316,12 @@ void freq_equalization(LTE_DL_FRAME_PARMS *frame_parms, amp=(*((int16_t*)&ul_ch_mag128[re])); - if (amp>255) - amp=255; + if (amp>4095) + amp=4095; - // printf("freq_eq: symbol %d re %d => %d,%d,%d, (%d) (%d,%d) => ",symbol,re,*((int16_t*)(&ul_ch_mag128[re])),amp,inv_ch[8*amp],*((int16_t*)(&ul_ch_mag128[re]))*inv_ch[8*amp],*(int16_t*)&(rxdataF_comp128[re]),*(1+(int16_t*)&(rxdataF_comp128[re]))); + //printf("freq_eq: symbol %d re %d => mag %d,amp %d,inv %d, prod %d (%d,%d)\n",symbol,re,*((int16_t*)(&ul_ch_mag128[re])),amp,_mm_extract_epi16(inv_ch[amp],0),(*((int16_t*)(&ul_ch_mag128[re]))*_mm_extract_epi16(inv_ch[amp],0))>>3,*(int16_t*)&(rxdataF_comp128[re]),*(1+(int16_t*)&(rxdataF_comp128[re]))); #if defined(__x86_64__) || defined(__i386__) - rxdataF_comp128[re] = _mm_mullo_epi16(rxdataF_comp128[re],*((__m128i *)&inv_ch[8*amp])); + rxdataF_comp128[re] = _mm_srai_epi16(_mm_mullo_epi16(rxdataF_comp128[re],inv_ch[amp]),3); if (Qm==4) ul_ch_mag128[re] = _mm_set1_epi16(324); // this is 512*2/sqrt(10) @@ -326,7 +330,7 @@ void freq_equalization(LTE_DL_FRAME_PARMS *frame_parms, ul_ch_magb128[re] = _mm_set1_epi16(158); // this is 512*2/sqrt(42) } #elif defined(__arm__) - rxdataF_comp128[re] = vmulq_s16(rxdataF_comp128[re],*((int16x8_t *)&inv_ch[8*amp])); + rxdataF_comp128[re] = vmulq_s16(rxdataF_comp128[re],inv_ch[amp]); if (Qm==4) ul_ch_mag128[re] = vdupq_n_s16(324); // this is 512*2/sqrt(10) diff --git a/openair1/PHY/LTE_ESTIMATION/lte_estimation.h b/openair1/PHY/LTE_ESTIMATION/lte_estimation.h index 4b28ffc466..6ba901e29f 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_estimation.h +++ b/openair1/PHY/LTE_ESTIMATION/lte_estimation.h @@ -288,6 +288,7 @@ void freq_equalization(LTE_DL_FRAME_PARMS *frame_parms, unsigned short Msc_RS, unsigned char Qm); +void init_fde(void); void dump_I0_stats(FILE *fd,PHY_VARS_eNB *eNB); /** @} */ diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c index ecc792b15f..3529df8e44 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c @@ -514,7 +514,6 @@ void ulsch_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms, for (i=0; i<(nb_rb*3); i++) { #if defined(__x86_64__) || defined(__i386__) mmtmpU0 = _mm_abs_epi16(rxF[i]); - // print_shorts("tmp0",&tmp0); mmtmpU0 = _mm_subs_epi16(ch_mag[i],mmtmpU0); (*llrp128)[0] = _mm_unpacklo_epi32(rxF[i],mmtmpU0); (*llrp128)[1] = _mm_unpackhi_epi32(rxF[i],mmtmpU0); @@ -1160,8 +1159,7 @@ void rx_ulsch(PHY_VARS_eNB *eNB, for (aarx=0; aarxnb_antennas_rx; aarx++) avgs = cmax(avgs,avgU[aarx]); - // log2_maxh = 4+(log2_approx(avgs)/2); - log2_maxh = (log2_approx(avgs)/2); //+ log2_approx(frame_parms->nb_antennas_rx-1)+4; + log2_maxh = 4+(log2_approx(avgs)/2); LOG_D(PHY,"[ULSCH] log2_maxh = %d (%d,%d)\n",log2_maxh,avgU[0],avgs); for (l=0; l<(frame_parms->symbols_per_tti-ulsch[UE_id]->harq_processes[harq_pid]->srs_active); l++) {