From 1d765027fe211ba0165af2d391649fc05f5d1031 Mon Sep 17 00:00:00 2001 From: Elena Lukashova <elena.lukashova@eurecom.fr> Date: Fri, 6 Jul 2018 18:38:13 +0200 Subject: [PATCH] Extracting SISO llr computations in separate fucntions qpsk_llr, qam16_llr, qam64_llqam64. --- .../LTE_UE_TRANSPORT/dlsch_llr_computation.c | 262 ++++++++++-------- .../PHY/LTE_UE_TRANSPORT/transport_proto_ue.h | 16 ++ 2 files changed, 165 insertions(+), 113 deletions(-) diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation.c b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation.c index a3ad9b05ca..07774ed3fb 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation.c +++ b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation.c @@ -681,19 +681,28 @@ int dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms, dlsch_llr, llr32); */ - //printf("ll32p=%p , dlsch_llr=%p, symbol=%d, flag=%d \n", llr32, dlsch_llr, symbol, first_symbol_flag); - for (i=0; i<len; i++) { - *llr32 = *rxF; - //printf("llr %d : (%d,%d)\n",i,((int16_t*)llr32)[0],((int16_t*)llr32)[1]); - rxF++; - llr32++; - } - //*llr32p = (int16_t *)llr32; + qpsk_llr((short *)rxF, + (short *)llr32, + len); return(0); } +void qpsk_llr(int16_t *stream0_in, + int16_t *stream0_out, + int length) +{ + int i; + for (i=0; i<2*length; i++) { + *stream0_out = *stream0_in; + //printf("llr %d : (%d,%d)\n",i,((int16_t*)stream0_out)[0],((int16_t*)stream0_out)[1]); + stream0_in++; + stream0_out++; + } + +} + int32_t dlsch_qpsk_llr_SIC(LTE_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp, int32_t **sic_buffer, //Q15 @@ -817,45 +826,21 @@ void dlsch_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms, int16_t **llr32p, uint8_t beamforming_mode) { + int32_t *rxF = (int32_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; + int32_t *ch_mag = (int32_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; + int32_t *llr32; -#if defined(__x86_64__) || defined(__i386__) - __m128i *rxF = (__m128i*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; - __m128i *ch_mag; - __m128i llr128[2]; - uint32_t *llr32; -#elif defined(__arm__) - int16x8_t *rxF = (int16x8_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; - int16x8_t *ch_mag; - int16x8_t xmm0; - int16_t *llr16; -#endif - - - int i,len; + int len; unsigned char symbol_mod,len_mod4=0; - -#if defined(__x86_64__) || defined(__i386__) if (first_symbol_flag==1) { - llr32 = (uint32_t*)dlsch_llr; - } else { - llr32 = (uint32_t*)*llr32p; - } -#elif defined(__arm__) - if (first_symbol_flag==1) { - llr16 = (int16_t*)dlsch_llr; + llr32 = (int32_t*)dlsch_llr; } else { - llr16 = (int16_t*)*llr32p; + llr32 = (int32_t*)*llr32p; } -#endif symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; -#if defined(__x86_64__) || defined(__i386__) - ch_mag = (__m128i*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; -#elif defined(__arm__) - ch_mag = (int16x8_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; -#endif if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { if (frame_parms->nb_antenna_ports_eNB!=1) len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); @@ -881,18 +866,45 @@ void dlsch_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms, len>>=2; // length in quad words (4 REs) // printf("len>>=2=%d\n", len); len+=(len_mod4==0 ? 0 : 1); - // printf("len+=%d\n", len); - for (i=0; i<len; i++) { + qam16_llr((short *)rxF, + (short *)ch_mag, + (short *)llr32, + len); + // printf ("This line in qam16_llr is %d.\n", __LINE__); + +} + +void qam16_llr(int16_t *stream0_in, + int16_t *chan_magn, + int16_t *llr, + int length) +{ + int i; + #if defined(__x86_64__) || defined(__i386__) + __m128i *rxF_128 = (__m128i*)stream0_in; + __m128i *ch_mag_128 = (__m128i*)chan_magn; + __m128i llr128[2]; + int32_t *llr32 = (int32_t*) llr; +#elif defined(__arm__) + int16x8_t *rxF_128 = (int16x8_t*)stream0_in; + int16x8_t *ch_mag_128 = (int16x8_t*)chan_magn; + int16x8_t xmm0; + int16_t *llr16 = (int16_t*)llr; +#endif + + // printf ("This line in qam16_llr is %d.\n", __LINE__); + + for (i=0; i<length; i++) { #if defined(__x86_64__) || defined(__i386) - xmm0 = _mm_abs_epi16(rxF[i]); - xmm0 = _mm_subs_epi16(ch_mag[i],xmm0); + xmm0 = _mm_abs_epi16(rxF_128[i]); + xmm0 = _mm_subs_epi16(ch_mag_128[i],xmm0); // lambda_1=y_R, lambda_2=|y_R|-|h|^2, lamda_3=y_I, lambda_4=|y_I|-|h|^2 - llr128[0] = _mm_unpacklo_epi32(rxF[i],xmm0); - llr128[1] = _mm_unpackhi_epi32(rxF[i],xmm0); + llr128[0] = _mm_unpacklo_epi32(rxF_128[i],xmm0); + llr128[1] = _mm_unpackhi_epi32(rxF_128[i],xmm0); llr32[0] = _mm_extract_epi32(llr128[0],0); //((uint32_t *)&llr128[0])[0]; - llr32[1] = _mm_extract_epi32(llr128[0],1); //((uint32_t *)&llr128[0])[1]; + llr32[1] = _mm_extract_epi32(llr128[0],1); //((uint32_t *)&llr128[0])[0]; llr32[2] = _mm_extract_epi32(llr128[0],2); //((uint32_t *)&llr128[0])[2]; llr32[3] = _mm_extract_epi32(llr128[0],3); //((uint32_t *)&llr128[0])[3]; llr32[4] = _mm_extract_epi32(llr128[1],0); //((uint32_t *)&llr128[1])[0]; @@ -922,14 +934,17 @@ void dlsch_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms, llr16[14] = vgetq_lane_s16(xmm0,7); llr16[15] = vgetq_lane_s16(xmm0,7); llr16+=16; + #endif } -#if defined(__x86_64__) || defined(__i386__) +#if defined(__x86_64__) || defined(__i386) _mm_empty(); _m_empty(); #endif + + } void dlsch_16qam_llr_SIC (LTE_DL_FRAME_PARMS *frame_parms, @@ -1036,6 +1051,7 @@ void dlsch_16qam_llr_SIC (LTE_DL_FRAME_PARMS *frame_parms, } } + //---------------------------------------------------------------------------------------------- // 64-QAM //---------------------------------------------------------------------------------------------- @@ -1053,14 +1069,10 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, uint32_t llr_offset, uint8_t beamforming_mode) { -#if defined(__x86_64__) || defined(__i386__) - __m128i *rxF = (__m128i*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; - __m128i *ch_mag,*ch_magb; -#elif defined(__arm__) - int16x8_t *rxF = (int16x8_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; - int16x8_t *ch_mag,*ch_magb,xmm1,xmm2; -#endif - int i,len,len2; + int32_t *rxF = (int32_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; + int32_t *ch_mag = (int32_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; + int32_t *ch_magb = (int32_t*)&dl_ch_magb[0][(symbol*frame_parms->N_RB_DL*12)]; + int len,len2; unsigned char symbol_mod,len_mod4; short *llr; int16_t *llr2; @@ -1079,13 +1091,6 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; -#if defined(__x86_64__) || defined(__i386__) - ch_mag = (__m128i*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; - ch_magb = (__m128i*)&dl_ch_magb[0][(symbol*frame_parms->N_RB_DL*12)]; -#elif defined(__arm__) - ch_mag = (int16x8_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; - ch_magb = (int16x8_t*)&dl_ch_magb[0][(symbol*frame_parms->N_RB_DL*12)]; -#endif if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { if (frame_parms->nb_antenna_ports_eNB!=1) len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); @@ -1115,18 +1120,49 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, len2=len>>2; // length in quad words (4 REs) len2+=((len_mod4==0)?0:1); - for (i=0; i<len2; i++) { + qam64_llr((short *)rxF, + (short *)ch_mag, + (short *)ch_magb, + llr2, + len2); +} + + +void qam64_llr(int16_t *stream0_in, + int16_t *chan_magn, + int16_t *chan_magn_b, + int16_t *llr, + int length) +{ #if defined(__x86_64__) || defined(__i386__) - xmm1 = _mm_abs_epi16(rxF[i]); - xmm1 = _mm_subs_epi16(ch_mag[i],xmm1); + __m128i *rxF_128 = (__m128i*)stream0_in; + __m128i *ch_mag_128 = (__m128i*)chan_magn; + __m128i *ch_magb_128 = (__m128i*)chan_magn_b; +#elif defined(__arm__) + int16x8_t *rxF_128 = (int16x8_t*)stream0_in; + int16x8_t *ch_mag_128 = (int16x8_t*)chan_magn; + int16x8_t *ch_magb_128 = (int16x8_t*)chan_magn_b; + int16x8_t xmm1,xmm2; +#endif + + + int i; + //int16_t *llr2; + //llr2 = llr; + + for (i=0; i<length; i++) { + +#if defined(__x86_64__) || defined(__i386__) + xmm1 = _mm_abs_epi16(rxF_128[i]); + xmm1 = _mm_subs_epi16(ch_mag_128[i],xmm1); xmm2 = _mm_abs_epi16(xmm1); - xmm2 = _mm_subs_epi16(ch_magb[i],xmm2); + xmm2 = _mm_subs_epi16(ch_magb_128[i],xmm2); #elif defined(__arm__) - xmm1 = vabsq_s16(rxF[i]); - xmm1 = vsubq_s16(ch_mag[i],xmm1); + xmm1 = vabsq_s16(rxF_128[i]); + xmm1 = vsubq_s16(ch_mag_128[i],xmm1); xmm2 = vabsq_s16(xmm1); - xmm2 = vsubq_s16(ch_magb[i],xmm2); + xmm2 = vsubq_s16(ch_magb_128[i],xmm2); #endif // loop over all LLRs in quad word (24 coded bits) /* @@ -1141,64 +1177,64 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, llr2+=6; } */ - llr2[0] = ((short *)&rxF[i])[0]; - llr2[1] = ((short *)&rxF[i])[1]; + llr[0] = ((short *)&rxF_128[i])[0]; + llr[1] = ((short *)&rxF_128[i])[1]; #if defined(__x86_64__) || defined(__i386__) - llr2[2] = _mm_extract_epi16(xmm1,0); - llr2[3] = _mm_extract_epi16(xmm1,1);//((short *)&xmm1)[j+1]; - llr2[4] = _mm_extract_epi16(xmm2,0);//((short *)&xmm2)[j]; - llr2[5] = _mm_extract_epi16(xmm2,1);//((short *)&xmm2)[j+1]; + llr[2] = _mm_extract_epi16(xmm1,0); + llr[3] = _mm_extract_epi16(xmm1,1);//((short *)&xmm1)[j+1]; + llr[4] = _mm_extract_epi16(xmm2,0);//((short *)&xmm2)[j]; + llr[5] = _mm_extract_epi16(xmm2,1);//((short *)&xmm2)[j+1]; #elif defined(__arm__) - llr2[2] = vgetq_lane_s16(xmm1,0); - llr2[3] = vgetq_lane_s16(xmm1,1);//((short *)&xmm1)[j+1]; - llr2[4] = vgetq_lane_s16(xmm2,0);//((short *)&xmm2)[j]; - llr2[5] = vgetq_lane_s16(xmm2,1);//((short *)&xmm2)[j+1]; + llr[2] = vgetq_lane_s16(xmm1,0); + llr[3] = vgetq_lane_s16(xmm1,1);//((short *)&xmm1)[j+1]; + llr[4] = vgetq_lane_s16(xmm2,0);//((short *)&xmm2)[j]; + llr[5] = vgetq_lane_s16(xmm2,1);//((short *)&xmm2)[j+1]; #endif - llr2+=6; - llr2[0] = ((short *)&rxF[i])[2]; - llr2[1] = ((short *)&rxF[i])[3]; + llr+=6; + llr[0] = ((short *)&rxF_128[i])[2]; + llr[1] = ((short *)&rxF_128[i])[3]; #if defined(__x86_64__) || defined(__i386__) - llr2[2] = _mm_extract_epi16(xmm1,2); - llr2[3] = _mm_extract_epi16(xmm1,3);//((short *)&xmm1)[j+1]; - llr2[4] = _mm_extract_epi16(xmm2,2);//((short *)&xmm2)[j]; - llr2[5] = _mm_extract_epi16(xmm2,3);//((short *)&xmm2)[j+1]; + llr[2] = _mm_extract_epi16(xmm1,2); + llr[3] = _mm_extract_epi16(xmm1,3);//((short *)&xmm1)[j+1]; + llr[4] = _mm_extract_epi16(xmm2,2);//((short *)&xmm2)[j]; + llr[5] = _mm_extract_epi16(xmm2,3);//((short *)&xmm2)[j+1]; #elif defined(__arm__) - llr2[2] = vgetq_lane_s16(xmm1,2); - llr2[3] = vgetq_lane_s16(xmm1,3);//((short *)&xmm1)[j+1]; - llr2[4] = vgetq_lane_s16(xmm2,2);//((short *)&xmm2)[j]; - llr2[5] = vgetq_lane_s16(xmm2,3);//((short *)&xmm2)[j+1]; + llr[2] = vgetq_lane_s16(xmm1,2); + llr[3] = vgetq_lane_s16(xmm1,3);//((short *)&xmm1)[j+1]; + llr[4] = vgetq_lane_s16(xmm2,2);//((short *)&xmm2)[j]; + llr[5] = vgetq_lane_s16(xmm2,3);//((short *)&xmm2)[j+1]; #endif - llr2+=6; - llr2[0] = ((short *)&rxF[i])[4]; - llr2[1] = ((short *)&rxF[i])[5]; + llr+=6; + llr[0] = ((short *)&rxF_128[i])[4]; + llr[1] = ((short *)&rxF_128[i])[5]; #if defined(__x86_64__) || defined(__i386__) - llr2[2] = _mm_extract_epi16(xmm1,4); - llr2[3] = _mm_extract_epi16(xmm1,5);//((short *)&xmm1)[j+1]; - llr2[4] = _mm_extract_epi16(xmm2,4);//((short *)&xmm2)[j]; - llr2[5] = _mm_extract_epi16(xmm2,5);//((short *)&xmm2)[j+1]; + llr[2] = _mm_extract_epi16(xmm1,4); + llr[3] = _mm_extract_epi16(xmm1,5);//((short *)&xmm1)[j+1]; + llr[4] = _mm_extract_epi16(xmm2,4);//((short *)&xmm2)[j]; + llr[5] = _mm_extract_epi16(xmm2,5);//((short *)&xmm2)[j+1]; #elif defined(__arm__) - llr2[2] = vgetq_lane_s16(xmm1,4); - llr2[3] = vgetq_lane_s16(xmm1,5);//((short *)&xmm1)[j+1]; - llr2[4] = vgetq_lane_s16(xmm2,4);//((short *)&xmm2)[j]; - llr2[5] = vgetq_lane_s16(xmm2,5);//((short *)&xmm2)[j+1]; + llr[2] = vgetq_lane_s16(xmm1,4); + llr[3] = vgetq_lane_s16(xmm1,5);//((short *)&xmm1)[j+1]; + llr[4] = vgetq_lane_s16(xmm2,4);//((short *)&xmm2)[j]; + llr[5] = vgetq_lane_s16(xmm2,5);//((short *)&xmm2)[j+1]; #endif - llr2+=6; - llr2[0] = ((short *)&rxF[i])[6]; - llr2[1] = ((short *)&rxF[i])[7]; + llr+=6; + llr[0] = ((short *)&rxF_128[i])[6]; + llr[1] = ((short *)&rxF_128[i])[7]; #if defined(__x86_64__) || defined(__i386__) - llr2[2] = _mm_extract_epi16(xmm1,6); - llr2[3] = _mm_extract_epi16(xmm1,7);//((short *)&xmm1)[j+1]; - llr2[4] = _mm_extract_epi16(xmm2,6);//((short *)&xmm2)[j]; - llr2[5] = _mm_extract_epi16(xmm2,7);//((short *)&xmm2)[j+1]; + llr[2] = _mm_extract_epi16(xmm1,6); + llr[3] = _mm_extract_epi16(xmm1,7);//((short *)&xmm1)[j+1]; + llr[4] = _mm_extract_epi16(xmm2,6);//((short *)&xmm2)[j]; + llr[5] = _mm_extract_epi16(xmm2,7);//((short *)&xmm2)[j+1]; #elif defined(__arm__) - llr2[2] = vgetq_lane_s16(xmm1,6); - llr2[3] = vgetq_lane_s16(xmm1,7);//((short *)&xmm1)[j+1]; - llr2[4] = vgetq_lane_s16(xmm2,6);//((short *)&xmm2)[j]; - llr2[5] = vgetq_lane_s16(xmm2,7);//((short *)&xmm2)[j+1]; + llr[2] = vgetq_lane_s16(xmm1,6); + llr[3] = vgetq_lane_s16(xmm1,7);//((short *)&xmm1)[j+1]; + llr[4] = vgetq_lane_s16(xmm2,6);//((short *)&xmm2)[j]; + llr[5] = vgetq_lane_s16(xmm2,7);//((short *)&xmm2)[j+1]; #endif - llr2+=6; + llr+=6; } @@ -8865,7 +8901,7 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, (int16_t *)llr16, (int32_t *) rho_256i, len); - + free16(rxF_256i, sizeof(rxF_256i)); free16(rxF_i_256i, sizeof(rxF_i_256i)); free16(ch_mag_256i, sizeof(ch_mag_256i)); diff --git a/openair1/PHY/LTE_UE_TRANSPORT/transport_proto_ue.h b/openair1/PHY/LTE_UE_TRANSPORT/transport_proto_ue.h index 53f593fe29..814816a885 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/transport_proto_ue.h +++ b/openair1/PHY/LTE_UE_TRANSPORT/transport_proto_ue.h @@ -106,6 +106,22 @@ void qpsk_qpsk(int16_t *stream0_in, @param nb_rb number of RBs for this allocation @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS @param llr128p pointer to pointer to symbol in dlsch_llr*/ + +void qpsk_llr(int16_t *stream0_in, + int16_t *stream0_out, + int length); + +void qam16_llr(int16_t *stream0_in, + int16_t *chan_magn, + int16_t *llr, + int length); + +void qam64_llr(int16_t *stream0_in, + int16_t *chan_magn, + int16_t *chan_magn_b, + int16_t *llr, + int length); + int32_t dlsch_qpsk_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp, int32_t **rxdataF_comp_i, -- GitLab