From 283784066e86b79024c347fc5300cb2b7e45c6ce Mon Sep 17 00:00:00 2001 From: sfn Date: Sun, 23 Jan 2022 23:48:38 +0100 Subject: [PATCH] implement and test foating point calc for zero forcing --- .../NR_UE_TRANSPORT/nr_dlsch_demodulation.c | 318 +++++++++++++----- 1 file changed, 226 insertions(+), 92 deletions(-) diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c index fe4338297b..7e95033a26 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c @@ -42,6 +42,7 @@ #include "PHY/NR_REFSIG/nr_refsig.h" #include "PHY/NR_REFSIG/dmrs_nr.h" #include "common/utils/nr/nr_common.h" +#include /* dynamic shift for LLR computation for TM3/4 * set as command line argument, see lte-softmodem.c @@ -2021,13 +2022,13 @@ void nr_determin(int32_t **a44,// nb_rb, ((rtx&1)==1?-1:1)*((ctx&1)==1?-1:1)*sign, shift0); - nr_a_mult_b(a44[ctx*size+rtx], - outtemp, - rtx==0? ad_bc:outtemp1, - nb_rb, - shift0); + nr_a_mult_b(a44[ctx*size+rtx], + outtemp, + rtx==0? ad_bc:outtemp1, + nb_rb, + shift0); - if (rtx != 0) nr_a_sum_b((__m128i *)ad_bc, + if (rtx != 0) nr_a_sum_b((__m128i *)ad_bc, (__m128i *)outtemp1, nb_rb); } @@ -2036,6 +2037,172 @@ void nr_determin(int32_t **a44,// _m_empty(); } +double complex nr_determin_cpx(double complex *a44_cpx,// + int32_t size,//size + int32_t sign){ + double complex outtemp, outtemp1; + //Allocate the submatrix elements + double complex sub_matrix[(size-1)*(size-1)]; + int16_t k,rr[size-1],cc[size-1]; + + if(size==1) { + return((double complex)a44_cpx[0]*sign); + }else { + outtemp1 = 0; + for (int rtx=0;rtx inv_H_h_H(%d,%d) = %d+j%d \n",rtx,ctx,((short *)a44[ctx*size+rtx])[0],((short *)a44[ctx*size+rtx])[1],ctx,rtx,((short *)inv_H_h_H[rtx*size+ctx])[0],((short *)inv_H_h_H[rtx*size+ctx])[1]); + } + } + _mm_empty(); + _m_empty(); + } + else {//floating point calc. + //Allocate the submatrix elements + double complex sub_matrix_cpx[(size-1)*(size-1)]; + //Convert the IQ samples (in Q15 format) to float complex + double complex a44_cpx[size*size]; + double complex inv_H_h_H_cpx[size*size]; + double complex determin_cpx; + for (int i=0; i<12*nb_rb; i++) { + + for (int rtx=0;rtx0)//determin of the symmetric matrix is real part only + ((short*) ad_bc)[i<<1] = (short) ((creal(determin_cpx)/(1<<(size-1)*shift0))+0.5);// + else + ((short*) ad_bc)[i<<1] = (short) ((creal(determin_cpx)/(1<<(size-1)*shift0))-0.5);// + ((short*) ad_bc)[(i<<1)+1] = (short) 0;//Imag=0 + + //Compute Inversion of the H^*H matrix + for (int rtx=0;rtx inv_H_h_H(%d,%d) = %lf+j%lf \n",rtx,ctx,creal(a44_cpx[ctx*size+rtx]),cimag(a44_cpx[ctx*size+rtx]),ctx,rtx,creal(inv_H_h_H_cpx[rtx*size+ctx])*(1<<15),cimag(inv_H_h_H_cpx[rtx*size+ctx])*(1<<15)); + + if (creal(inv_H_h_H_cpx[rtx*size+ctx])>0) + ((short *) inv_H_h_H[rtx*size+ctx])[i<<1] = (short) ((creal(inv_H_h_H_cpx[rtx*size+ctx])*(1<<15))+0.5);// + else + ((short *) inv_H_h_H[rtx*size+ctx])[i<<1] = (short) ((creal(inv_H_h_H_cpx[rtx*size+ctx])*(1<<15))-0.5);// + + if (cimag(inv_H_h_H_cpx[rtx*size+ctx])>0) + ((short *) inv_H_h_H[rtx*size+ctx])[(i<<1)+1] = (short) ((cimag(inv_H_h_H_cpx[rtx*size+ctx])*(1<<15))+0.5);// + else + ((short *) inv_H_h_H[rtx*size+ctx])[(i<<1)+1] = (short) ((cimag(inv_H_h_H_cpx[rtx*size+ctx])*(1<<15))-0.5);// + } + } + } + } + return(0); +} + /* Zero Forcing Rx function: nr_conjch0_mult_ch1() * * @@ -2101,11 +2268,9 @@ uint8_t nr_zero_forcing_rx(int **rxdataF_comp, int length) { int *ch0r, *ch0c; - int32_t determ_fin[12*nb_rb] __attribute__((aligned(32))); - int32_t *** conjH_H_elements; - uint32_t nb_rb_0 = length/12 + ((length%12)?1:0); + int32_t determ_fin[12*nb_rb_0] __attribute__((aligned(32))); ///Allocate H^*H matrix elements and sub elements conjH_H_elements = (int32_t ***)malloc16_clear( n_rx*sizeof(int32_t **) ); @@ -2113,94 +2278,55 @@ uint8_t nr_zero_forcing_rx(int **rxdataF_comp, conjH_H_elements[aarx] = (int32_t **)malloc16_clear( n_tx*n_tx*sizeof(int32_t) ); for (int rtx=0;rtx