From 556346dd1987b23abe676c1620ee841c4e8d4ee3 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Tue, 27 May 2014 13:34:26 +0000 Subject: [PATCH] git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5351 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- openair1/PHY/CODING/TESTBENCH/Makefile | 5 +- openair1/PHY/CODING/TESTBENCH/ltetest.c | 129 ++++++---------- openair1/PHY/CODING/lte_rate_matching.c | 5 +- openair1/PHY/LTE_REFSIG/defs.h | 23 +++ openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c | 68 +-------- openair1/PHY/LTE_REFSIG/lte_gold.c | 46 ++++++ openair1/PHY/LTE_TRANSPORT/dci.c | 8 +- openair1/PHY/LTE_TRANSPORT/defs.h | 7 + openair1/PHY/LTE_TRANSPORT/dlsch_coding.c | 4 +- openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c | 2 +- .../PHY/LTE_TRANSPORT/dlsch_demodulation.c | 42 +++--- .../PHY/LTE_TRANSPORT/dlsch_llr_computation.c | 7 +- openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c | 142 ++++++++++++++---- openair1/PHY/LTE_TRANSPORT/initial_sync.c | 16 +- openair1/PHY/LTE_TRANSPORT/lte_mcs.c | 16 +- openair1/PHY/LTE_TRANSPORT/pbch.c | 2 + openair1/PHY/LTE_TRANSPORT/pmch.c | 2 +- openair1/PHY/LTE_TRANSPORT/proto.h | 40 ++--- openair1/PHY/LTE_TRANSPORT/pss.c | 2 +- openair1/PHY/LTE_TRANSPORT/sss.c | 12 +- openair1/PHY/LTE_TRANSPORT/ulsch_coding.c | 2 +- openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c | 2 +- .../PHY/LTE_TRANSPORT/ulsch_demodulation.c | 68 +-------- openair1/PHY/Makefile.inc | 1 + openair1/PHY/TOOLS/Makefile | 2 +- openair1/PHY/TOOLS/lte_dfts.c | 105 +++++++------ openair1/PHY/defs.h | 58 +++---- openair1/PHY/impl_defs_lte.h | 4 +- openair1/SCHED/phy_procedures_lte_eNb.c | 4 + openair1/SCHED/phy_procedures_lte_ue.c | 13 +- openair1/SIMULATION/LTE_PHY/dlsim.c | 6 +- openair1/SIMULATION/LTE_PHY/mbmssim.c | 2 +- 32 files changed, 449 insertions(+), 396 deletions(-) diff --git a/openair1/PHY/CODING/TESTBENCH/Makefile b/openair1/PHY/CODING/TESTBENCH/Makefile index 0e6aa83348..ac9905ed23 100644 --- a/openair1/PHY/CODING/TESTBENCH/Makefile +++ b/openair1/PHY/CODING/TESTBENCH/Makefile @@ -6,7 +6,7 @@ CPUFLAGS = -mmmx -msse -msse2 -mssse3 -msse4 #CPUFLAGS += $(shell if [ -z $(SSE3PROC)]; then echo "" ; else echo "-mssse3"; fi) #CPUFLAGS += $(shell if [ -z $(SSE4PROC)]; then echo "" ; else echo "-msse4"; fi) - +COMMON_UTILS_DIR = $(OPENAIR_HOME)/common/utils TOP_DIR = $(OPENAIR1_DIR) OPENAIR1_TOP = $(OPENAIR1_DIR) OPENAIR2_TOP = $(OPENAIR2_DIR) @@ -40,6 +40,7 @@ ifeq "$(GCCVERSION)" "4.6.1" CFLAGS += -Wno-packed-bitfield-compat endif +include $(COMMON_UTILS_DIR)/Makefile.inc include $(TOP_DIR)/PHY/Makefile.inc #include $(TOP_DIR)/SCHED/Makefile.inc SCHED_OBJS = $(TOP_DIR)/SCHED/phy_procedures_lte_common.o @@ -53,7 +54,7 @@ LAYER2_OBJ = $(OPENAIR2_DIR)/LAYER2/MAC/lte_transport_init.o OBJ = $(PHY_OBJS) $(SIMULATION_OBJS) $(TOOLS_OBJS) $(SCHED_OBJS) $(LAYER2_OBJ) $(LOG_OBJS) #$(ASN1_MSG_OBJS) -CFLAGS += -I$(TOP_DIR) $(L2_incl) -I$(ASN1_MSG_INC) -I$(OPENAIR3) $(UTIL_incl) +CFLAGS += -I$(TOP_DIR) $(L2_incl) -I$(ASN1_MSG_INC) -I$(OPENAIR3) $(UTIL_incl) $(UTILS_incl) CFLAGS += -DNO_RRM all: ltetest diff --git a/openair1/PHY/CODING/TESTBENCH/ltetest.c b/openair1/PHY/CODING/TESTBENCH/ltetest.c index 4d3e88d81b..18a6334b96 100644 --- a/openair1/PHY/CODING/TESTBENCH/ltetest.c +++ b/openair1/PHY/CODING/TESTBENCH/ltetest.c @@ -143,8 +143,6 @@ char quantize(double D,double x,unsigned char B) { } #define MAX_BLOCK_LENGTH 6000 -static char channel_output[2*MAX_BLOCK_LENGTH]__attribute__ ((aligned(16))); -static unsigned char decoded_output[MAX_BLOCK_LENGTH/8]; int test_logmap8(LTE_eNB_DLSCH_t *dlsch_eNB, LTE_UE_DLSCH_t *dlsch_ue, @@ -163,8 +161,6 @@ int test_logmap8(LTE_eNB_DLSCH_t *dlsch_eNB, unsigned int subframe) { unsigned char test_input[block_length+1]; - //_declspec(align(16)) char channel_output[512]; - //_declspec(align(16)) unsigned char output[512],decoded_output[16], *inPtr, *outPtr; short *channel_output; @@ -186,7 +182,7 @@ int test_logmap8(LTE_eNB_DLSCH_t *dlsch_eNB, - // printf("dlsch_eNB->TBS= %d\n",dlsch_eNB->harq_processes[0]->TBS); + // printf("dlsch_eNB->TBS= %d, block_length %d\n",dlsch_eNB->harq_processes[0]->TBS,block_length); while (trial++ < ntrials) { @@ -201,6 +197,7 @@ int test_logmap8(LTE_eNB_DLSCH_t *dlsch_eNB, &PHY_vars_eNB->lte_frame_parms, num_pdcch_symbols, PHY_vars_eNB->dlsch_eNB[0][0], + 0, subframe, &PHY_vars_eNB->dlsch_rate_matching_stats, &PHY_vars_eNB->dlsch_turbo_encoding_stats, @@ -216,6 +213,8 @@ int test_logmap8(LTE_eNB_DLSCH_t *dlsch_eNB, printf("%d.",PHY_vars_eNB->dlsch_eNB[0][0]->e[i]); #endif channel_output[i] = (short)quantize(sigma/4.0,(2.0*PHY_vars_eNB->dlsch_eNB[0][0]->e[i]) - 1.0 + sigma*gaussdouble(0.0,1.0),qbits); + // printf("input %d, output %f\n",(2*PHY_vars_eNB->dlsch_eNB[0][0]->e[i]) - 1, + // (2.0*PHY_vars_eNB->dlsch_eNB[0][0]->e[i]) - 1.0 + sigma*gaussdouble(0.0,1.0)); } #ifdef DEBUG_CODER printf("\n"); @@ -223,13 +222,15 @@ int test_logmap8(LTE_eNB_DLSCH_t *dlsch_eNB, #endif - // memset(decoded_output,0,16); - // printf("decoding %d\n",trial); + + PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->G = coded_bits; ret = dlsch_decoding(PHY_vars_UE, channel_output, &PHY_vars_UE->lte_frame_parms, PHY_vars_UE->dlsch_ue[0][0], + PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid], subframe, + PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid, num_pdcch_symbols,1); /* int diffs = 0,puncts=0; @@ -246,15 +247,15 @@ int test_logmap8(LTE_eNB_DLSCH_t *dlsch_eNB, printf("%d same (%d,%d)\n",i,dlsch_ue->harq_processes[0]->d[0][96+i],dlsch_eNb->harq_processes[0]->d[0][96+i]); } printf("diffs %d puncts %d(%d,%d,%d,%d,%d)\n",diffs,puncts,dlsch_ue->harq_processes[0]->F,coded_bits,3*(block_length<<3),3*dlsch_ue->harq_processes[0]->Kplus,3*dlsch_ue->harq_processes[0]->F+3*(block_length<<3)-coded_bits); + + + printf("ret %d (max %d)\n",ret,dlsch_ue->max_turbo_iterations); + printf("trial %d : i %d/%d : Input %x, Output %x (%x, F %d)\n",trial,0,block_length,test_input[0], + dlsch_ue->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->b[0], + dlsch_ue->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->c[0][0], + (dlsch_ue->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->F>>3)); */ - - // printf("ret %d\n",ret); - // printf("trial %d : i %d/%d : Input %x, Output %x (%x, F %d)\n",trial,0,block_length,test_input[0], - // dlsch_ue->harq_processes[0]->b[0], - // dlsch_ue->harq_processes[0]->c[0][0], - // (dlsch_ue->harq_processes[0]->F>>3)); - - if (ret < MAX_TURBO_ITERATIONS+1) { + if (ret < dlsch_ue->max_turbo_iterations+1) { *iterations = (*iterations) + ret; // if (ret>1) // printf("ret %d\n",ret); @@ -267,20 +268,21 @@ int test_logmap8(LTE_eNB_DLSCH_t *dlsch_eNB, for (i=0;iharq_processes[0]->b[i] != test_input[i]) { -/* + if (dlsch_ue->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->c[0][i] != test_input[i]) { + /* printf("i %d/%d : Input %x, Output %x (%x, F %d)\n",i,block_length,test_input[i], - dlsch_ue->harq_processes[0]->b[i], - dlsch_ue->harq_processes[0]->c[0][i], - (dlsch_ue->harq_processes[0]->F>>3)); -*/ + dlsch_ue->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->b[i], + dlsch_ue->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->c[0][i], + (dlsch_ue->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->F>>3)); + */ *errors = (*errors) + 1; // printf("*%d, ret %d\n",*errors,ret); - if (ret < MAX_TURBO_ITERATIONS+1) + if (ret < dlsch_ue->max_turbo_iterations+1) *crc_misses = (*crc_misses)+1; + break; } @@ -288,10 +290,12 @@ int test_logmap8(LTE_eNB_DLSCH_t *dlsch_eNB, } - if (ret == MAX_TURBO_ITERATIONS+1) { + if (ret == dlsch_ue->max_turbo_iterations+1) { // exit(-1); } - /* + /* + else { + for (i=0;iharq_processes[0]->b[i] != test_input[i]) { @@ -303,10 +307,10 @@ int test_logmap8(LTE_eNB_DLSCH_t *dlsch_eNB, } } - } - */ + }*/ + if (*errors == 100) { - //printf("\n"); + printf("trials %d\n",trial); break; } } @@ -316,7 +320,7 @@ int test_logmap8(LTE_eNB_DLSCH_t *dlsch_eNB, return(0); } -#define NTRIALS 1000 +#define NTRIALS 10000 #define DLSCH_RB_ALLOC 0x1fff//0x1fbf // igore DC component,RB13 int main(int argc, char *argv[]) { @@ -340,10 +344,10 @@ int main(int argc, char *argv[]) { logInit(); lte_param_init(1,1,1,0,0,3); - PHY_vars_eNB->dlsch_eNB[0][0] = new_eNB_dlsch(1,8,0); - PHY_vars_UE->dlsch_ue[0][0] = new_ue_dlsch(1,8,0); - PHY_vars_eNB->dlsch_eNB[0][1] = new_eNB_dlsch(1,8,0); - PHY_vars_UE->dlsch_ue[0][1] = new_ue_dlsch(1,8,0); + PHY_vars_eNB->dlsch_eNB[0][0] = new_eNB_dlsch(1,8,NB_RB,0); + PHY_vars_UE->dlsch_ue[0][0] = new_ue_dlsch(1,8,4,NB_RB,0); + PHY_vars_eNB->dlsch_eNB[0][1] = new_eNB_dlsch(1,8,NB_RB,0); + PHY_vars_UE->dlsch_ue[0][1] = new_ue_dlsch(1,8,4,NB_RB,0); if (argc>1) mcs = atoi(argv[1]); @@ -390,8 +394,14 @@ int main(int argc, char *argv[]) { 0, P_RNTI); - coded_bits = get_G(&PHY_vars_eNB->lte_frame_parms,NB_RB,PHY_vars_eNB->dlsch_eNB[0][0]->rb_alloc, - get_Qm(mcs),num_pdcch_symbols,subframe); + coded_bits = get_G(&PHY_vars_eNB->lte_frame_parms, + PHY_vars_eNB->dlsch_eNB[0][0]->nb_rb, + PHY_vars_eNB->dlsch_eNB[0][0]->rb_alloc, + get_Qm(mcs), + 1, + num_pdcch_symbols, + 0, + subframe); printf("Coded_bits (G) = %d\n",coded_bits); @@ -400,22 +410,13 @@ int main(int argc, char *argv[]) { dlsch_tbs25[get_I_TBS(mcs)][NB_RB-1],(double)dlsch_tbs25[get_I_TBS(mcs)][NB_RB-1]/coded_bits, mcs,get_I_TBS(mcs),PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->F,NB_RB); - // Test Openair0 3GPP encoder -/* - test_encoder(block_length, - f1f2mat[(block_length-5)*2], // f1 (see 36121-820, page 14) - f1f2mat[((block_length-5)*2)+1], // f2 (see 36121-820, page 14) - 3); - */ // exit(0); - - - for (SNR=-5;SNR<5;SNR+=.1) { - // printf("\n\nSNR %f dB\n",SNR); + sigma = pow(10.0,-.05*SNR); + printf("\n\nSNR %f dB => sigma %f\n",SNR,sigma); errors=0; crc_misses=0; @@ -445,49 +446,11 @@ int main(int argc, char *argv[]) { subframe); if (ret>=0) - // printf("ref: Errors %d (%f), Uerrors %d (%f), CRC Misses %d (%f), Avg iterations %f\n",errors,(double)errors/trials,uerrors,(double)uerrors/trials,crc_misses,(double)crc_misses/trials,(double)iterations/trials); printf("%f,%f,%f,%f\n",SNR,(double)errors/trials,(double)crc_misses/trials,(double)iterations/trials); if (((double)errors/trials) < 1e-2) done0=1; } - /* - if (done1 == 0) { - printf("exmimo\n"); - ret = test_logmapexmimo(rate, // code rate - sigma, // noise standard deviation - qbits, - block_length, // block length bytes - f1f2mat[iind*2], // f1 (see 36121-820, page 14) - f1f2mat[(iind*2)+1], // f2 (see 36121-820, page 14) - 3, - NTRIALS, - &errors3, - &trials3); - - if (ret>=0) - printf("exmimo : Errors %d (%f)\n",errors3,(double)errors3/trials3); - if (((double)errors3/trials3) < 1e-3) - done1=1; - } - - - if (done2 == 0) { - - printf("Viterbi ...\n"); - ret2 = test_viterbi(sigma, - 8*block_length, - NTRIALS, - &errors2, - &trials2, - rate); - - if (ret2>=0) - printf("viterbi : Errors %d (%f)\n",errors2,(double)errors2/trials2); - if (((double)errors2/trials2) < 1e-3) - done2=1; - } - */ if ((done0==1) && (done1==1) && (done2==1)) { printf("done\n"); break; diff --git a/openair1/PHY/CODING/lte_rate_matching.c b/openair1/PHY/CODING/lte_rate_matching.c index 123af99b70..73bebe557a 100644 --- a/openair1/PHY/CODING/lte_rate_matching.c +++ b/openair1/PHY/CODING/lte_rate_matching.c @@ -691,8 +691,7 @@ int lte_rate_matching_turbo_rx(uint32_t RTC, if (clear==1) memset(w,0,Ncb*sizeof(int16_t)); - //soft_input2 = soft_input + (r*E); - soft_input2 = soft_input; // navid + soft_input2 = soft_input;// + (r*E); k=0; for (;(ind>15; ((short *)&qpsk[0])[0] = a; ((short *)&qpsk[0])[1] = a; - // new mod table ((short *)&qpsk[1])[0] = -a; ((short *)&qpsk[1])[1] = a; ((short *)&qpsk[2])[0] = a; ((short *)&qpsk[2])[1] = -a; - /* old mod table - ((short *)&qpsk[1])[0] = a; - ((short *)&qpsk[1])[1] = -a; - ((short *)&qpsk[2])[0] = -a; - ((short *)&qpsk[2])[1] = a; - */ ((short *)&qpsk[3])[0] = -a; ((short *)&qpsk[3])[1] = -a; -#endif + if ((p==0) && (l==0) ) nu = 0; @@ -73,12 +53,9 @@ int lte_dl_cell_spec_SS(PHY_VARS_eNB *phy_vars_eNB, if (k > 6)//b k -=6;//b -#ifdef IFFT_FPGA - k+=phy_vars_eNB->lte_frame_parms.N_RB_DL*6; -#else k+=phy_vars_eNB->lte_frame_parms.first_carrier_offset; -#endif - for (m=0;mlte_frame_parms.N_RB_DL<<1;m++) { + + for (m=0;mlte_frame_parms.N_RB_DL<<1;m++) { // loop over pilots in one slot/symbol, 2*N_RB_DL pilots mprime_dword = mprime>>4; mprime_qpsk_symb = mprime&0xf; @@ -98,16 +75,10 @@ int lte_dl_cell_spec_SS(PHY_VARS_eNB *phy_vars_eNB, printf("Ns %d, l %d output[%d] = (%d,%d)\n",Ns,l,k,((short *)&output[k])[0],((short *)&output[k])[1]); #endif k+=6;//b -#ifdef IFFT_FPGA - if (k >= phy_vars_eNB->lte_frame_parms.N_RB_DL*12) { - k-=phy_vars_eNB->lte_frame_parms.N_RB_DL*12; - } -#else if (k >= phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) { k++; // skip DC carrier k-=phy_vars_eNB->lte_frame_parms.ofdm_symbol_size; } -#endif // printf("** k %d\n",k); } return(0); @@ -125,36 +96,15 @@ int lte_dl_cell_spec(PHY_VARS_eNB *phy_vars_eNB, unsigned short k,a; mod_sym_t qpsk[4]; -#ifdef IFFT_FPGA - // new mod table - qpsk[0] = 1; - qpsk[1] = 3; - qpsk[2] = 2; - qpsk[3] = 4; - /* old mod table - qpsk[0] = 4; - qpsk[1] = 2; - qpsk[2] = 3; - qpsk[3] = 1; - */ -#else a = (amp*ONE_OVER_SQRT2_Q15)>>15; ((short *)&qpsk[0])[0] = a; ((short *)&qpsk[0])[1] = a; - // new mod table ((short *)&qpsk[1])[0] = -a; ((short *)&qpsk[1])[1] = a; ((short *)&qpsk[2])[0] = a; ((short *)&qpsk[2])[1] = -a; - /* old mod table - ((short *)&qpsk[1])[0] = a; - ((short *)&qpsk[1])[1] = -a; - ((short *)&qpsk[2])[0] = -a; - ((short *)&qpsk[2])[1] = a; - */ ((short *)&qpsk[3])[0] = -a; ((short *)&qpsk[3])[1] = -a; -#endif if ((p==0) && (l==0) ) nu = 0; @@ -175,11 +125,8 @@ int lte_dl_cell_spec(PHY_VARS_eNB *phy_vars_eNB, if (k > 5) k -=6; -#ifdef IFFT_FPGA - k+=phy_vars_eNB->lte_frame_parms.N_RB_DL*6; -#else k+=phy_vars_eNB->lte_frame_parms.first_carrier_offset; -#endif + for (m=0;mlte_frame_parms.N_RB_DL<<1;m++) { mprime_dword = mprime>>4; @@ -200,16 +147,11 @@ int lte_dl_cell_spec(PHY_VARS_eNB *phy_vars_eNB, printf("Ns %d, l %d output[%d] = (%d,%d)\n",Ns,l,k,((short *)&output[k])[0],((short *)&output[k])[1]); #endif k+=6; -#ifdef IFFT_FPGA - if (k >= phy_vars_eNB->lte_frame_parms.N_RB_DL*12) { - k-=phy_vars_eNB->lte_frame_parms.N_RB_DL*12; - } -#else if (k >= phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) { k++; // skip DC carrier k-=phy_vars_eNB->lte_frame_parms.ofdm_symbol_size; } -#endif + // printf("** k %d\n",k); } return(0); diff --git a/openair1/PHY/LTE_REFSIG/lte_gold.c b/openair1/PHY/LTE_REFSIG/lte_gold.c index ee32b02dd6..d447bdf1d2 100644 --- a/openair1/PHY/LTE_REFSIG/lte_gold.c +++ b/openair1/PHY/LTE_REFSIG/lte_gold.c @@ -61,6 +61,52 @@ void lte_gold(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_table[20][2][14] } } +void lte_gold_ue_spec(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_uespec_table[2][20][2][21],uint16_t Nid_cell, uint16_t *n_idDMRS) { + + unsigned char ns,l; + unsigned int n,x1,x2;//,x1tmp,x2tmp; + int nscid; + int nid; + for (nscid=0;nscid<2;nscid++) { + if (n_idDMRS) + nid = n_idDMRS[nscid]; + else + nid = Nid_cell; + for (ns=0;ns<20;ns++) { + + for (l=0;l<2;l++) { + + + x2 = ((((ns>>1)+1)*((nid<<1)+1))<<16) + nscid; + //x2 = frame_parms->Ncp + (Nid_cell<<1) + (1+(Nid_cell<<1))*(1 + (3*l) + (7*(1+ns))); //cinit + //n = 0 + // printf("cinit (ns %d, l %d) => %d\n",ns,l,x2); + x1 = 1+ (1<<31); + x2=x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31); + // skip first 50 double words (1600 bits) + //printf("n=0 : x1 %x, x2 %x\n",x1,x2); + for (n=1;n<50;n++) { + x1 = (x1>>1) ^ (x1>>4); + x1 = x1 ^ (x1<<31) ^ (x1<<28); + x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4); + x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28); + // printf("x1 : %x, x2 : %x\n",x1,x2); + } + + for (n=0;n<14;n++) { + x1 = (x1>>1) ^ (x1>>4); + x1 = x1 ^ (x1<<31) ^ (x1<<28); + x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4); + x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28); + lte_gold_uespec_table[nscid][ns][l][n] = x1^x2; + // printf("n=%d : c %x\n",n,x1^x2); + } + + } + } + } +} + /*! \brief gold sequenquence generator \param x1 \param x2 this should be set to c_init if reset=1 diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c index c951518c46..aa21cf6d8f 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci.c +++ b/openair1/PHY/LTE_TRANSPORT/dci.c @@ -1954,7 +1954,7 @@ uint8_t get_num_pdcch_symbols(uint8_t num_dci, // check pdcch duration imposed by PHICH duration (Section 6.9 of 36-211) if (frame_parms->Ncp==1) { // extended prefix - if ((frame_parms->frame_type == 1) && + if ((frame_parms->frame_type == TDD) && ((frame_parms->tdd_config<3)||(frame_parms->tdd_config==6)) && ((subframe==1) || (subframe==6))) // subframes 1 and 6 (S-subframes) for 5ms switching periodicity are 2 symbols nCCEmin = 2; @@ -2726,6 +2726,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, } break; case 25: + default: if (frame_type == TDD) { format1A_size_bits = sizeof_DCI1A_5MHz_TDD_1_6_t; format1A_size_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t); @@ -2780,11 +2781,6 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, format1_size_bytes = sizeof(DCI1_20MHz_FDD_t); } break; - default: - format1_size_bits = 0; - format1_size_bytes = 0; - DevParam(frame_parms->N_RB_DL, frame_type, 0); - break; } if (do_common == 1) { diff --git a/openair1/PHY/LTE_TRANSPORT/defs.h b/openair1/PHY/LTE_TRANSPORT/defs.h index 90cf49ad27..5f4b37cfc4 100644 --- a/openair1/PHY/LTE_TRANSPORT/defs.h +++ b/openair1/PHY/LTE_TRANSPORT/defs.h @@ -109,6 +109,10 @@ typedef struct { uint8_t rvidx; /// MIMO mode for this DLSCH MIMO_mode_t mimo_mode; + /// Number of layers for this PDSCH transmission + uint8_t Nlayers; + /// First layer for this PSCH transmission + uint8_t first_layer; /// Turbo-code outputs (36-212 V8.6 2009-03, p.12 uint8_t d[MAX_NUM_DLSCH_SEGMENTS][(96+3+(3*6144))]; /// Sub-block interleaver outputs (36-212 V8.6 2009-03, p.16-17) @@ -199,6 +203,8 @@ typedef struct { } LTE_UL_UE_HARQ_t; typedef struct { + /// TX buffers for UE-spec transmission (antenna ports 5 or 7..14, prior to precoding) + uint32_t *txdataF[8]; /// Allocated RNTI (0 means DLSCH_t is not currently used) uint16_t rnti; /// Active flag for baseband transmitter processing @@ -247,6 +253,7 @@ typedef struct { int16_t sqrt_rho_a; /// amplitude of PDSCH (compared to RS) in symbols containing pilots int16_t sqrt_rho_b; + } LTE_eNB_DLSCH_t; #define PUSCH_x 2 diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c index 14972080ce..4908b26b1e 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c @@ -243,7 +243,7 @@ int dlsch_encoding(unsigned char *a, // printf("Encoder: A: %d\n",A); mod_order = get_Qm(dlsch->harq_processes[harq_pid]->mcs); - G = get_G(frame_parms,nb_rb,dlsch->rb_alloc,mod_order,num_pdcch_symbols,frame,subframe); + G = get_G(frame_parms,nb_rb,dlsch->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe); // if (dlsch->harq_processes[harq_pid]->Ndi == 1) { // this is a new packet @@ -353,7 +353,7 @@ int dlsch_encoding(unsigned char *a, r_offset += lte_rate_matching_turbo(dlsch->harq_processes[harq_pid]->RTC[r], G, //G dlsch->harq_processes[harq_pid]->w[r], - &dlsch->e[r_offset], + dlsch->e+r_offset, dlsch->harq_processes[harq_pid]->C, // C NSOFT, // Nsoft, dlsch->Mdlharq, diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c index e5799a075a..8c378e1f1d 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c @@ -304,7 +304,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, G, harq_process->w[r], (uint8_t*)&dummy_w[r][0], - dlsch_llr, + dlsch_llr+r_offset, harq_process->C, NSOFT, dlsch->Mdlharq, diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c index 35aaf3c29a..a809a4e579 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c @@ -247,14 +247,14 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, msg("dlsch_demodulation.c: nb_rb=0\n"); return(-1); } - + /* // DL power control: Scaling of Channel estimates for PDSCH dlsch_scale_channel(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, frame_parms, dlsch_ue, symbol, nb_rb); - + */ if (first_symbol_flag==1) { dlsch_channel_level(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, frame_parms, @@ -1353,7 +1353,7 @@ void dlsch_scale_channel(int **dl_ch_estimates_ext, // Determine scaling amplitude based the symbol ch_amp = ((pilots) ? (dlsch_ue[0]->sqrt_rho_b) : (dlsch_ue[0]->sqrt_rho_a)); - // msg("Scaling PDSCH Chest in OFDM symbol %d by %d\n",symbol_mod,ch_amp); + // msg("Scaling PDSCH Chest in OFDM symbol %d by %d\n",symbol_mod,ch_amp); ch_amp128 = _mm_set1_epi16(ch_amp); // Q3.13 @@ -1657,9 +1657,9 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; pilots = ((symbol_mod==0)||(symbol_mod==(4-frame_parms->Ncp))) ? 1 : 0; l=symbol; - nsymb = (frame_parms->Ncp==0) ? 14:12; + nsymb = (frame_parms->Ncp==NORMAL) ? 14:12; - if (frame_parms->frame_type == 1) { // TDD + if (frame_parms->frame_type == TDD) { // TDD sss_symb = nsymb-1; pss_symb = 2; } @@ -1803,7 +1803,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, skip_half=2; //PSS in subframe 0/5 if FDD - if (frame_parms->frame_type == 0) { //FDD + if (frame_parms->frame_type == FDD) { //FDD if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { rb_alloc_ind = 0; } @@ -1813,7 +1813,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, skip_half=2; } - if ((frame_parms->frame_type == 1) && + if ((frame_parms->frame_type == TDD) && (subframe==6)){ //TDD Subframe 6 if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { rb_alloc_ind = 0; @@ -1951,14 +1951,14 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) { rb_alloc_ind = 0; } - if (frame_parms->frame_type == 0) { + if (frame_parms->frame_type == FDD) { //PSS if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { rb_alloc_ind = 0; } } - if ((frame_parms->frame_type == 1) && + if ((frame_parms->frame_type == TDD) && (subframe==6)){ //PSS if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { @@ -2078,7 +2078,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb)) skip_half=2; - if (frame_parms->frame_type == 0) { + if (frame_parms->frame_type == FDD) { //PSS if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { rb_alloc_ind = 0; @@ -2090,7 +2090,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, skip_half=2; } - if ((frame_parms->frame_type == 1) && + if ((frame_parms->frame_type == TDD) && (subframe==6)){ //TDD Subframe 6 if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { rb_alloc_ind = 0; @@ -2238,10 +2238,10 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) pilots=1; - nsymb = (frame_parms->Ncp==0) ? 14:12; + nsymb = (frame_parms->Ncp==NORMAL) ? 14:12; l=symbol; - if (frame_parms->frame_type == 1) { // TDD + if (frame_parms->frame_type == TDD) { // TDD sss_symb = nsymb-1; pss_symb = 2; } @@ -2320,7 +2320,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, skip_half=2; //PSS in subframe 0/5 if FDD - if (frame_parms->frame_type == 0) { //FDD + if (frame_parms->frame_type == FDD) { //FDD if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { rb_alloc_ind = 0; } @@ -2330,7 +2330,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, skip_half=2; } - if ((frame_parms->frame_type == 1) && + if ((frame_parms->frame_type == TDD) && (subframe==6)){ //TDD Subframe 6 if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { rb_alloc_ind = 0; @@ -2451,7 +2451,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, skip_half=2; //PSS in subframe 0/5 if FDD - if (frame_parms->frame_type == 0) { //FDD + if (frame_parms->frame_type == FDD) { //FDD if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { rb_alloc_ind = 0; } @@ -2461,7 +2461,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, skip_half=2; } - if ((frame_parms->frame_type == 1) && + if ((frame_parms->frame_type == TDD) && (subframe==6)){ //TDD Subframe 6 if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { rb_alloc_ind = 0; @@ -2621,14 +2621,14 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) { rb_alloc_ind = 0; } - if (frame_parms->frame_type == 0) { + if (frame_parms->frame_type == FDD) { //PSS if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { rb_alloc_ind = 0; } } - if ((frame_parms->frame_type == 1) && + if ((frame_parms->frame_type == TDD) && (subframe==6)){ //PSS if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { @@ -2770,7 +2770,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, (l==sss_symb)) skip_half=2; - if (frame_parms->frame_type == 0) { + if (frame_parms->frame_type == FDD) { //PSS if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { rb_alloc_ind = 0; @@ -2782,7 +2782,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, skip_half=2; } - if ((frame_parms->frame_type == 1) && + if ((frame_parms->frame_type == TDD) && (subframe==6)){ //PSS if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c index 9bfc35ce4e..b8e29b5d9f 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c @@ -56,7 +56,7 @@ #ifndef __SSE3__ //#define _mm_abs_epi16(xmmx) _mm_xor_si128((xmmx),_mm_cmpgt_epi16(zero,(xmmx))) -#define _mm_abs_epi16(xmmx) _mm_add_epi16(_mm_xor_si128((xmmx),_mm_cmpgt_epi16((*(__m128i*)&zero[0]),(xmmx))),_mm_srli_epi16(_mm_cmpgt_epi16((*(__m128i*)&zero[0]),(xmmx)),15)) +//abs_#define _mm_abs_epi16(xmmx) _mm_add_epi16(_mm_xor_si128((xmmx),_mm_cmpgt_epi16((*(__m128i*)&zero[0]),(xmmx))),_mm_srli_epi16(_mm_cmpgt_epi16((*(__m128i*)&zero[0]),(xmmx)),15)) //#define _mm_sign_epi16(xmmx,xmmy) _mm_xor_si128((xmmx),_mm_cmpgt_epi16(zero,(xmmy))) #endif @@ -720,7 +720,8 @@ void dlsch_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms, int i,len; unsigned char symbol_mod,len_mod4=0; uint32_t *llr32; - + + if (first_symbol_flag==1) { llr32 = (uint32_t*)dlsch_llr; } @@ -826,7 +827,7 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, for (i=0;inushift,use2ndpilots)==1) { // printf("re %d (jj %d)\n",re,*jj); - *re_allocated = *re_allocated + 1; + if (mimo_mode == SISO) { //SISO mapping - + *re_allocated = *re_allocated + 1; switch (mod_order) { case 2: //QPSK - // printf("%d : %d,%d => ",tti_offset,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); - for (aa=0; aanb_antennas_tx; aa++) + // printf("%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + for (aa=0; aanb_antennas_tx; aa++) { ((int16_t*)&txdataF[aa][tti_offset])[0] += (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i + } *jj = *jj + 1; - for (aa=0; aanb_antennas_tx; aa++) + for (aa=0; aanb_antennas_tx; aa++) { ((int16_t*)&txdataF[aa][tti_offset])[1] += (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1} + } *jj = *jj + 1; - - // printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + + // printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); break; case 4: //16QAM @@ -250,7 +260,7 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, qam64_table_offset_re = 0; qam64_table_offset_im = 0; - + if (output[*jj] == 1) qam64_table_offset_re+=4; *jj=*jj+1; @@ -280,16 +290,16 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, } else if (mimo_mode == ALAMOUTI){ - + *re_allocated = *re_allocated + 1; // normalization for 2 tx antennas - amp = (int16_t)(((int32_t)tmp_amp*ONE_OVER_SQRT2_Q15)>>15); + amp = (int16_t)(((int32_t)tmp_amp*ONE_OVER_SQRT2_Q15)>>15); switch (mod_order) { case 2: //QPSK // first antenna position n -> x0 - ((int16_t*)&tmp_sample1)[0] = (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; + ((int16_t*)&tmp_sample1)[0] = (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; *jj=*jj+1; ((int16_t*)&tmp_sample1)[1] = (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; *jj=*jj+1; @@ -428,6 +438,7 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, } } else if (mimo_mode == ANTCYCLING ) { + *re_allocated = *re_allocated + 1; switch (mod_order) { case 2: //QPSK @@ -495,8 +506,8 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, else if ((mimo_mode >= UNIFORM_PRECODING11)&&(mimo_mode <= PUSCH_PRECODING1)) { // this is for transmission modes 4-6 (1 layer) - - amp = (int16_t)(((int32_t)tmp_amp*ONE_OVER_SQRT2_Q15)>>15); + *re_allocated = *re_allocated + 1; + amp = (int16_t)(((int32_t)tmp_amp*ONE_OVER_SQRT2_Q15)>>15); switch (mod_order) { case 2: //QPSK @@ -592,14 +603,6 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, } } - - else { - msg("allocate_REs_in_RB() [dlsch.c] : ERROR, unknown mimo_mode %d\n",mimo_mode); - return(-1); - } - - - if (mimo_mode == ALAMOUTI) { re++; // adjacent carriers are taken care of by precoding *re_allocated = *re_allocated + 1; @@ -608,8 +611,92 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, *re_allocated = *re_allocated + 1; } } + + if (mimo_mode >= TM8) { //TM8,TM9,TM10 + + if (is_not_UEspecRS(first_layer,re)) { + switch (mod_order) { + case 2: //QPSK + // printf("%d : %d,%d => ",tti_offset,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + for (layer=first_layer;layer<=(first_layer+Nlayers);layer++) { + + ((int16_t*)&txdataF[layer][tti_offset])[0] = (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i + *jj = *jj + 1; + ((int16_t*)&txdataF[layer][tti_offset])[1] = (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1} + *jj = *jj + 1; + } + break; + + case 4: //16QAM + if (is_not_UEspecRS(layer,re)) { + qam16_table_offset_re = 0; + qam16_table_offset_im = 0; + if (output[*jj] == 1) + qam16_table_offset_re+=2; + *jj=*jj+1; + if (output[*jj] == 1) + qam16_table_offset_im+=2; + *jj=*jj+1; + + + if (output[*jj] == 1) + qam16_table_offset_re+=1; + *jj=*jj+1; + if (output[*jj] == 1) + qam16_table_offset_im+=1; + *jj=*jj+1; + + + for (layer=first_layer;layer<=(first_layer+Nlayers);layer++) { + ((int16_t*)&txdataF[layer][tti_offset])[0] = qam_table_s[qam16_table_offset_re]; + ((int16_t*)&txdataF[layer][tti_offset])[1] = qam_table_s[qam16_table_offset_im]; + } + } + break; + + case 6: //64QAM + + + qam64_table_offset_re = 0; + qam64_table_offset_im = 0; + + if (output[*jj] == 1) + qam64_table_offset_re+=4; + *jj=*jj+1; + if (output[*jj] == 1) + qam64_table_offset_im+=4; + *jj=*jj+1; + if (output[*jj] == 1) + qam64_table_offset_re+=2; + *jj=*jj+1; + if (output[*jj] == 1) + qam64_table_offset_im+=2; + *jj=*jj+1; + if (output[*jj] == 1) + qam64_table_offset_re+=1; + *jj=*jj+1; + if (output[*jj] == 1) + qam64_table_offset_im+=1; + *jj=*jj+1; + + for (layer=first_layer;layer<=(first_layer+Nlayers);layer++) { + ((int16_t*)&txdataF[layer][tti_offset])[0] = qam_table_s[qam64_table_offset_re]; + ((int16_t*)&txdataF[layer][tti_offset])[1] = qam_table_s[qam64_table_offset_im]; + } + break; + + } + } + } + else if (mimo_mode>=TM9_10) { + msg("allocate_REs_in_RB() [dlsch.c] : ERROR, unknown mimo_mode %d\n",mimo_mode); + return(-1); + } } + + } + return(0); } @@ -768,6 +855,7 @@ int dlsch_modulation(mod_sym_t **txdataF, int16_t amp_rho_a, amp_rho_b; int16_t qam16_table_a[4],qam64_table_a[8],qam16_table_b[4],qam64_table_b[8]; int16_t *qam_table_s; + uint8_t Nl = dlsch->harq_processes[harq_pid]->Nl; vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_MODULATION, VCD_FUNCTION_IN); @@ -959,7 +1047,7 @@ int dlsch_modulation(mod_sym_t **txdataF, if (rb_alloc_ind > 0) { - //printf("Allocated rb %d, subframe_offset %d, symbol_offset %d, re_offset %d\n",rb,subframe_offset,symbol_offset,re_offset); + // printf("Allocated rb %d, subframe_offset %d, symbol_offset %d, re_offset %d\n",rb,subframe_offset,symbol_offset,re_offset); allocate_REs_in_RB(txdataF, &jj, re_offset, @@ -976,6 +1064,8 @@ int dlsch_modulation(mod_sym_t **txdataF, skip_dc, skip_half, (frame_parms->mode1_flag==1)?1:0, + dlsch->harq_processes[harq_pid]->Nlayers, + dlsch->harq_processes[harq_pid]->first_layer, frame_parms); } re_offset+=12; // go to next RB @@ -995,7 +1085,7 @@ int dlsch_modulation(mod_sym_t **txdataF, #ifdef DEBUG_DLSCH_MODULATION - msg("generate_dlsch : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch->nb_rb,dlsch->rb_alloc,mod_order,2,0,subframe_offset)); + msg("generate_dlsch : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch->nb_rb,dlsch->rb_alloc,mod_order,Nl,2,0,subframe_offset)); #endif vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_MODULATION, VCD_FUNCTION_OUT); @@ -1092,7 +1182,7 @@ int mch_modulation(mod_sym_t **txdataF, #ifdef DEBUG_DLSCH_MODULATION - msg("generate_dlsch(MCH) : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch->nb_rb,dlsch->rb_alloc,mod_order,2,0,subframe_offset)); + msg("generate_dlsch(MCH) : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch->nb_rb,dlsch->rb_alloc,mod_order,1,2,0,subframe_offset)); #endif return (re_allocated); diff --git a/openair1/PHY/LTE_TRANSPORT/initial_sync.c b/openair1/PHY/LTE_TRANSPORT/initial_sync.c index c427cf27de..8611cb9f1d 100644 --- a/openair1/PHY/LTE_TRANSPORT/initial_sync.c +++ b/openair1/PHY/LTE_TRANSPORT/initial_sync.c @@ -244,8 +244,8 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) { // LOG_I(PHY,"**************************************************************\n"); // First try FDD normal prefix - frame_parms->Ncp=0; - frame_parms->frame_type=0; + frame_parms->Ncp=NORMAL; + frame_parms->frame_type=FDD; init_frame_parms(frame_parms,1); sync_pos = lte_sync_time(phy_vars_ue->lte_ue_common_vars.rxdata, @@ -316,8 +316,8 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) { if (ret==-1) { // Now FDD extended prefix - frame_parms->Ncp=1; - frame_parms->frame_type=0; + frame_parms->Ncp=EXTENDED; + frame_parms->frame_type=FDD; init_frame_parms(frame_parms,1); if (sync_pos < frame_parms->nb_prefix_samples) sync_pos2 = sync_pos + FRAME_LENGTH_COMPLEX_SAMPLES - frame_parms->nb_prefix_samples; @@ -357,8 +357,8 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) { if (ret==-1) { // Now TDD normal prefix - frame_parms->Ncp=0; - frame_parms->frame_type=1; + frame_parms->Ncp=NORMAL; + frame_parms->frame_type=TDD; init_frame_parms(frame_parms,1); if (sync_pos >= frame_parms->nb_prefix_samples) @@ -405,8 +405,8 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) { if (ret==-1) { // Now TDD extended prefix - frame_parms->Ncp=1; - frame_parms->frame_type=1; + frame_parms->Ncp=EXTENDED; + frame_parms->frame_type=TDD; init_frame_parms(frame_parms,1); sync_pos2 = sync_pos - frame_parms->nb_prefix_samples; if (sync_pos >= frame_parms->nb_prefix_samples) diff --git a/openair1/PHY/LTE_TRANSPORT/lte_mcs.c b/openair1/PHY/LTE_TRANSPORT/lte_mcs.c index 3d79f9ead5..9de315de6b 100644 --- a/openair1/PHY/LTE_TRANSPORT/lte_mcs.c +++ b/openair1/PHY/LTE_TRANSPORT/lte_mcs.c @@ -150,7 +150,7 @@ int adjust_G2(LTE_DL_FRAME_PARMS *frame_parms,uint32_t *rb_alloc,uint8_t mod_ord int rb,re_pbch_sss=0; int rb_alloc_ind,nsymb; - nsymb = (frame_parms->Ncp==0) ? 14 : 12; + nsymb = (frame_parms->Ncp==NORMAL) ? 14 : 12; // printf("adjust_G2 : symbol %d, subframe %d\n",symbol,subframe); if ((subframe!=0) && (subframe!=5) && (subframe!=6)) // if not PBCH/SSS or SSS @@ -296,7 +296,7 @@ int adjust_G(LTE_DL_FRAME_PARMS *frame_parms,uint32_t *rb_alloc,uint8_t mod_orde } // printf("re_pbch_sss %d\n",re_pbch_sss); if (subframe==0) { //PBCH+SSS+PSS - if (frame_parms->frame_type == 1) { // TDD + if (frame_parms->frame_type == TDD) { // TDD if (frame_parms->mode1_flag==0) //2ant so PBCH 3+2/3 symbols, SSS 1 symbol * REs => (14/3)*re_pbch_sss for normal CP, // 2+4/3 symbols, SSS 1 symbol => (13/3)*re_pbch_sss for ext. CP @@ -319,14 +319,14 @@ int adjust_G(LTE_DL_FRAME_PARMS *frame_parms,uint32_t *rb_alloc,uint8_t mod_orde } } else if (subframe == 5) // SSS+PSS for FDD, SSS for TDD - return(((frame_parms->frame_type==0)?2:1)*re_pbch_sss * 1 * mod_order); - else if ((subframe == 6)&&(frame_parms->frame_type == 1)) // PSS for TDD + return(((frame_parms->frame_type==FDD)?2:1)*re_pbch_sss * 1 * mod_order); + else if ((subframe == 6)&&(frame_parms->frame_type == TDD)) // PSS for TDD return(re_pbch_sss * 1 * mod_order); return(0); } -int get_G(LTE_DL_FRAME_PARMS *frame_parms,uint16_t nb_rb,uint32_t *rb_alloc,uint8_t mod_order,uint8_t num_pdcch_symbols,int frame,uint8_t subframe) { +int get_G(LTE_DL_FRAME_PARMS *frame_parms,uint16_t nb_rb,uint32_t *rb_alloc,uint8_t mod_order,uint8_t Nl,uint8_t num_pdcch_symbols,int frame,uint8_t subframe) { @@ -336,12 +336,12 @@ int get_G(LTE_DL_FRAME_PARMS *frame_parms,uint16_t nb_rb,uint32_t *rb_alloc,uint G_adj= adjust_G(frame_parms,rb_alloc,mod_order,subframe); // printf("get_G subframe %d mod_order %d, nb_rb %d: rb_alloc %x,%x,%x,%x, G_adj %d\n",subframe,mod_order,nb_rb,rb_alloc[3],rb_alloc[2],rb_alloc[1],rb_alloc[0], G_adj); - if (frame_parms->Ncp==0) { // normal prefix + if (frame_parms->Ncp==NORMAL) { // normal prefix // PDDDPDD PDDDPDD - 13 PDSCH symbols, 10 full, 3 w/ pilots = 10*12 + 3*8 // PCDDPDD PDDDPDD - 12 PDSCH symbols, 9 full, 3 w/ pilots = 9*12 + 3*8 // PCCDPDD PDDDPDD - 11 PDSCH symbols, 8 full, 3 w/pilots = 8*12 + 3*8 if (frame_parms->mode1_flag==0) // SISO - return(((int)nb_rb * mod_order * ((11-num_pdcch_symbols)*12 + 3*8)) - G_adj); + return((((int)nb_rb * mod_order * ((11-num_pdcch_symbols)*12 + 3*8)) - G_adj)*Nl); else return(((int)nb_rb * mod_order * ((11-num_pdcch_symbols)*12 + 3*10)) - G_adj); } @@ -350,7 +350,7 @@ int get_G(LTE_DL_FRAME_PARMS *frame_parms,uint16_t nb_rb,uint32_t *rb_alloc,uint // PCDPDD PDDPDD - 10 PDSCH symbols, 7 full, 3 w/ pilots = 7*12 + 3*8 // PCCPDD PDDPDD - 9 PDSCH symbols, 6 full, 3 w/pilots = 6*12 + 3*8 if (frame_parms->mode1_flag==0) - return(((int)nb_rb * mod_order * ((9-num_pdcch_symbols)*12 + 3*8)) - G_adj); + return((((int)nb_rb * mod_order * ((9-num_pdcch_symbols)*12 + 3*8)) - G_adj)*Nl); else return(((int)nb_rb * mod_order * ((9-num_pdcch_symbols)*12 + 3*10)) - G_adj); } diff --git a/openair1/PHY/LTE_TRANSPORT/pbch.c b/openair1/PHY/LTE_TRANSPORT/pbch.c index 6197605154..ed9edec8c3 100755 --- a/openair1/PHY/LTE_TRANSPORT/pbch.c +++ b/openair1/PHY/LTE_TRANSPORT/pbch.c @@ -293,6 +293,8 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch, 0, 0, 0, + 1, + 0, frame_parms); re_offset+=12; // go to next RB diff --git a/openair1/PHY/LTE_TRANSPORT/pmch.c b/openair1/PHY/LTE_TRANSPORT/pmch.c index 9a7f75cd94..e243421329 100644 --- a/openair1/PHY/LTE_TRANSPORT/pmch.c +++ b/openair1/PHY/LTE_TRANSPORT/pmch.c @@ -245,7 +245,7 @@ void fill_UE_dlsch_MCH(PHY_VARS_UE *phy_vars_ue,int mcs,int ndi,int rvidx,int eN G = get_G(&phy_vars_eNB->lte_frame_parms, phy_vars_eNB->lte_frame_parms.N_RB_DL, phy_vars_eNB->dlsch_eNB_MCH->rb_alloc, - get_Qm(phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->mcs), + get_Qm(phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->mcs),1, 2,phy_vars_eNB->frame,subframe); generate_mbsfn_pilot(phy_vars_eNB, diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h index b5d0e46d30..1dc5182ed6 100644 --- a/openair1/PHY/LTE_TRANSPORT/proto.h +++ b/openair1/PHY/LTE_TRANSPORT/proto.h @@ -142,6 +142,8 @@ void dlsch_encoding_emul(PHY_VARS_eNB *phy_vars_eNB, uint8_t skip_dc, uint8_t skip_half, uint8_t use2ndpilots, + uint8_t Nlayers, + uint8_t firstlayer, LTE_DL_FRAME_PARMS *frame_parms); \brief Fills RB with data @@ -161,26 +163,30 @@ void dlsch_encoding_emul(PHY_VARS_eNB *phy_vars_eNB, \param skip_dc offset for positive RBs \param skip_half indicate that first or second half of RB must be skipped for PBCH/PSS/SSS \param use2ndpilots Set to use the pilots from antenna port 1 for PDSCH + \param Nlayers Number of layers for this codeword + \param firstlayer Index of first layer (minus 7, i.e. 0..7 <-> p=7,...,14 \param frame_parms Frame parameter descriptor */ int32_t allocate_REs_in_RB(mod_sym_t **txdataF, - uint32_t *jj, - uint16_t re_offset, - uint32_t symbol_offset, - uint8_t *output, - MIMO_mode_t mimo_mode, - uint8_t nu, - uint8_t pilots, - uint8_t mod_order, - uint8_t precoder_index, - int16_t amp, - int16_t *qam_table_s, - uint32_t *re_allocated, - uint8_t skip_dc, - uint8_t skip_half, - uint8_t use2ndpilots, - LTE_DL_FRAME_PARMS *frame_parms); + uint32_t *jj, + uint16_t re_offset, + uint32_t symbol_offset, + uint8_t *output, + MIMO_mode_t mimo_mode, + uint8_t nu, + uint8_t pilots, + uint8_t mod_order, + uint8_t precoder_index, + int16_t amp, + int16_t *qam_table_s, + uint32_t *re_allocated, + uint8_t skip_dc, + uint8_t skip_half, + uint8_t use2ndpilots, + uint8_t Nlayers, + uint8_t firstlayer, + LTE_DL_FRAME_PARMS *frame_parms); /** \fn int32_t dlsch_modulation(mod_sym_t **txdataF, int16_t amp, @@ -1225,7 +1231,7 @@ uint8_t get_transmission_mode(uint16_t Mod_id, uint16_t rnti); */ uint32_t conv_nprb(uint8_t ra_header,uint32_t rb_alloc,int N_RB_DL); -int get_G(LTE_DL_FRAME_PARMS *frame_parms,uint16_t nb_rb,uint32_t *rb_alloc,uint8_t mod_order,uint8_t num_pdcch_symbols,int frame,uint8_t subframe); +int get_G(LTE_DL_FRAME_PARMS *frame_parms,uint16_t nb_rb,uint32_t *rb_alloc,uint8_t mod_order,uint8_t Nl,uint8_t num_pdcch_symbols,int frame,uint8_t subframe); int adjust_G(LTE_DL_FRAME_PARMS *frame_parms,uint32_t *rb_alloc,uint8_t mod_order,uint8_t subframe); int adjust_G2(LTE_DL_FRAME_PARMS *frame_parms,uint32_t *rb_alloc,uint8_t mod_order,uint8_t subframe,uint8_t symbol); diff --git a/openair1/PHY/LTE_TRANSPORT/pss.c b/openair1/PHY/LTE_TRANSPORT/pss.c index 2e92da3691..6b162b017c 100644 --- a/openair1/PHY/LTE_TRANSPORT/pss.c +++ b/openair1/PHY/LTE_TRANSPORT/pss.c @@ -94,7 +94,7 @@ int generate_pss(mod_sym_t **txdataF, //a = (amp*ONE_OVER_SQRT2_Q15)>>15; //printf("[PSS] amp=%d, a=%d\n",amp,a); - Nsymb = (frame_parms->Ncp==0)?14:12; + Nsymb = (frame_parms->Ncp==NORMAL)?14:12; //for (aa=0;aanb_antennas_tx;aa++) { aa = 0; diff --git a/openair1/PHY/LTE_TRANSPORT/sss.c b/openair1/PHY/LTE_TRANSPORT/sss.c index 5b5f98b6ad..597cbf2777 100644 --- a/openair1/PHY/LTE_TRANSPORT/sss.c +++ b/openair1/PHY/LTE_TRANSPORT/sss.c @@ -64,7 +64,7 @@ int generate_sss(mod_sym_t **txdataF, else d = &d5_sss[62*(Nid2 + (Nid1*3))]; - Nsymb = (frame_parms->Ncp==0)?14:12; + Nsymb = (frame_parms->Ncp==NORMAL)?14:12; k = frame_parms->ofdm_symbol_size-3*12+5; for (i=0;i<62;i++) { //for (aa=0;aanb_antennas_tx;aa++) { @@ -166,7 +166,7 @@ int pss_sss_extract(PHY_VARS_UE *phy_vars_ue, int32_t **rxdataF = phy_vars_ue->lte_ue_common_vars.rxdataF; - if (frame_parms->frame_type == 0) { + if (frame_parms->frame_type == FDD) { pss_symb = 6-frame_parms->Ncp; sss_symb = pss_symb-1; } @@ -247,9 +247,9 @@ int rx_sss(PHY_VARS_UE *phy_vars_ue,int32_t *tot_metric,uint8_t *flip_max,uint8_ int32_t metric; int16_t *d0,*d5; - if (phy_vars_ue->lte_frame_parms.frame_type == 0) { // FDD + if (phy_vars_ue->lte_frame_parms.frame_type == FDD) { #ifdef DEBUG_SSS - if (phy_vars_ue->lte_frame_parms.Ncp == 0) + if (phy_vars_ue->lte_frame_parms.Ncp == NORMAL) msg("[PHY][UE%d] Doing SSS for FDD Normal Prefix\n",phy_vars_ue->Mod_id); else msg("[PHY][UE%d] Doing SSS for FDD Extended Prefix\n",phy_vars_ue->Mod_id); @@ -270,7 +270,7 @@ int rx_sss(PHY_VARS_UE *phy_vars_ue,int32_t *tot_metric,uint8_t *flip_max,uint8_ } else { // TDD #ifdef DEBUG_SSS - if (phy_vars_ue->lte_frame_parms.Ncp == 0) + if (phy_vars_ue->lte_frame_parms.Ncp == NORMAL) msg("[PHY][UE%d] Doing SSS for TDD Normal Prefix\n",phy_vars_ue->Mod_id); else msg("[PHY][UE%d] Doing SSS for TDD Extended Prefix\n",phy_vars_ue->Mod_id); @@ -308,7 +308,7 @@ int rx_sss(PHY_VARS_UE *phy_vars_ue,int32_t *tot_metric,uint8_t *flip_max,uint8_ // write_output("sss0_comp0.m","sss0comp0",sss0_ext,72,1,1); - if (phy_vars_ue->lte_frame_parms.frame_type == 0) { // FDD + if (phy_vars_ue->lte_frame_parms.frame_type == FDD) { // FDD // SSS slot_fep(phy_vars_ue, diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c index 596a39eb28..e1b3078a30 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c @@ -510,7 +510,7 @@ uint32_t ulsch_encoding(uint8_t *a, r_offset += lte_rate_matching_turbo(ulsch->harq_processes[harq_pid]->RTC[r], G, ulsch->harq_processes[harq_pid]->w[r], - &ulsch->e[0], + ulsch->e+r_offset, ulsch->harq_processes[harq_pid]->C, // C NSOFT, // Nsoft, ulsch->Mdlharq, diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c index 8bb3a91139..e345121b07 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c @@ -1161,7 +1161,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, G, ulsch->harq_processes[harq_pid]->w[r], (uint8_t*) &dummy_w[r][0], - ulsch->e, + ulsch->e+r_offset, ulsch->harq_processes[harq_pid]->C, NSOFT, ulsch->Mdlharq, diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c index ade4091a19..2707f8e206 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c @@ -588,53 +588,30 @@ void ulsch_extract_rbs_single(int32_t **rxdataF, msg("ulsch_extract_rbs_single: 2*nb_rb1 = %d, 2*nb_rb2 = %d\n",nb_rb1,nb_rb2); #endif -#ifndef NEW_FFT - rxF_ext = &rxdataF_ext[aarx][(symbol*frame_parms->N_RB_UL*12)*2]; -#else rxF_ext = &rxdataF_ext[aarx][(symbol*frame_parms->N_RB_UL*12)]; -#endif if (nb_rb1) { -#ifndef NEW_FFT - rxF = &rxdataF[aarx][(first_rb*12 + frame_parms->first_carrier_offset + symbol*frame_parms->ofdm_symbol_size)*2]; - memcpy(rxF_ext, rxF, nb_rb1*12*sizeof(int)); - rxF_ext += nb_rb1*12; -#else rxF = &rxdataF[aarx][(first_rb*12 + frame_parms->first_carrier_offset + symbol*frame_parms->ofdm_symbol_size)]; memcpy(rxF_ext, rxF, nb_rb1*6*sizeof(int)); rxF_ext += nb_rb1*6; -#endif + if (nb_rb2) { //#ifdef OFDMA_ULSCH // rxF = &rxdataF[aarx][(1 + symbol*frame_parms->ofdm_symbol_size)*2]; //#else -#ifndef NEW_FFT - rxF = &rxdataF[aarx][(symbol*frame_parms->ofdm_symbol_size)*2]; - //#endif - memcpy(rxF_ext, rxF, nb_rb2*12*sizeof(int)); - rxF_ext += nb_rb2*12; -#else rxF = &rxdataF[aarx][(symbol*frame_parms->ofdm_symbol_size)]; //#endif memcpy(rxF_ext, rxF, nb_rb2*6*sizeof(int)); rxF_ext += nb_rb2*6; -#endif } } else { //there is only data in the second half //#ifdef OFDMA_ULSCH // rxF = &rxdataF[aarx][(1 + 6*(2*first_rb - frame_parms->N_RB_UL) + symbol*frame_parms->ofdm_symbol_size)*2]; //#else -#ifndef NEW_FFT - rxF = &rxdataF[aarx][(6*(2*first_rb - frame_parms->N_RB_UL) + symbol*frame_parms->ofdm_symbol_size)*2]; - //#endif - memcpy(rxF_ext, rxF, nb_rb2*12*sizeof(int)); - rxF_ext += nb_rb2*12; -#else rxF = &rxdataF[aarx][(6*(2*first_rb - frame_parms->N_RB_UL) + symbol*frame_parms->ofdm_symbol_size)]; //#endif memcpy(rxF_ext, rxF, nb_rb2*6*sizeof(int)); rxF_ext += nb_rb2*6; -#endif } } @@ -773,7 +750,7 @@ void ulsch_channel_compensation(int32_t **rxdataF_ext, mmtmpU1 = _mm_packs_epi32(mmtmpU0,mmtmpU0); ul_ch_mag128[2] = _mm_unpacklo_epi16(mmtmpU1,mmtmpU1); - // printf("comp: symbol %d rb %d => %d,%d,%d (output_shift %d)\n",symbol,rb,*((int16_t*)&ul_ch_mag128[0]),*((int16_t*)&ul_ch_mag128[1]),*((int16_t*)&ul_ch_mag128[2]),output_shift); + // printf("comp: symbol %d rb %d => %d,%d,%d (output_shift %d)\n",symbol,rb,*((int16_t*)&ul_ch_mag128[0]),*((int16_t*)&ul_ch_mag128[1]),*((int16_t*)&ul_ch_mag128[2]),output_shift); #endif // multiply by conjugated channel @@ -1311,15 +1288,7 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, msg("rx_ulsch: eNB_id %d, harq_pid %d, nb_rb %d first_rb %d, cooperation %d\n",eNB_id,harq_pid,ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,ulsch[UE_id]->harq_processes[harq_pid]->first_rb, cooperation_flag); #endif //DEBUG_ULSCH -#ifndef NEW_FFT - if ( (frame_parms->ofdm_symbol_size == 128) || - (frame_parms->ofdm_symbol_size == 512) ) - rx_power_correction = 2; - else - rx_power_correction = 1; -#else - rx_power_correction = 1; -#endif + rx_power_correction = 1; for (l=0;l<(frame_parms->symbols_per_tti-ulsch[UE_id]->srs_active);l++) { @@ -1347,14 +1316,6 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, l/(frame_parms->symbols_per_tti/2), cooperation_flag); -#ifndef NEW_FFT - ulsch_correct_ext(eNB_pusch_vars->rxdataF_ext[eNB_id], - eNB_pusch_vars->rxdataF_ext2[eNB_id], - l, - frame_parms, - ulsch[UE_id]->harq_processes[harq_pid]->nb_rb); -#endif - if(cooperation_flag == 2) { for (i=0;inb_antennas_rx;i++){ @@ -1425,11 +1386,9 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, avgs = cmax(avgs,avgU[(aarx<<1)]); // log2_maxh = 4+(log2_approx(avgs)/2); -#ifdef NEW_FFT + log2_maxh = (log2_approx(avgs)/2)+ log2_approx(frame_parms->nb_antennas_rx-1)+4; -#else - log2_maxh = (log2_approx(avgs)/2)+ log2_approx(frame_parms->nb_antennas_rx-1)+3; -#endif + #ifdef DEBUG_ULSCH msg("[ULSCH] log2_maxh = %d (%d,%d)\n",log2_maxh,avgU[0],avgs); #endif @@ -1446,11 +1405,7 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, { ulsch_channel_compensation_alamouti( -#ifndef NEW_FFT - eNB_pusch_vars->rxdataF_ext2[eNB_id], -#else eNB_pusch_vars->rxdataF_ext[eNB_id], -#endif eNB_pusch_vars->drs_ch_estimates_0[eNB_id], eNB_pusch_vars->drs_ch_estimates_1[eNB_id], eNB_pusch_vars->ul_ch_mag_0[eNB_id], @@ -1481,11 +1436,7 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, else { ulsch_channel_compensation( -#ifndef NEW_FFT - eNB_pusch_vars->rxdataF_ext2[eNB_id], -#else eNB_pusch_vars->rxdataF_ext[eNB_id], -#endif eNB_pusch_vars->drs_ch_estimates[eNB_id], eNB_pusch_vars->ul_ch_mag[eNB_id], eNB_pusch_vars->ul_ch_magb[eNB_id], @@ -1613,14 +1564,6 @@ void dump_ulsch(PHY_VARS_eNB *PHY_vars_eNB,uint8_t subframe, uint8_t UE_id) { write_output("/tmp/rxsig0.m","rxs0", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][0],PHY_vars_eNB->lte_frame_parms.samples_per_tti*10,1,1); if (PHY_vars_eNB->lte_frame_parms.nb_antennas_rx>1) write_output("/tmp/rxsig1.m","rxs1", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][1][0],PHY_vars_eNB->lte_frame_parms.samples_per_tti*10,1,1); -#ifndef NEW_FFT - write_output("/tmp/rxsigF0.m","rxsF0", &PHY_vars_eNB->lte_eNB_common_vars.rxdataF[0][0][0],PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size*nsymb*2,2,1); - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_rx>1) - write_output("/tmp/rxsigF1.m","rxsF1", &PHY_vars_eNB->lte_eNB_common_vars.rxdataF[0][1][0],PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size*nsymb*2,2,1); - write_output("/tmp/rxsigF0_ext.m","rxsF0_ext", &PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->rxdataF_ext[0][0][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb*2,2,1); - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_rx>1) - write_output("/tmp/rxsigF1_ext.m","rxsF1_ext", &PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->rxdataF_ext[1][0][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb*2,2,1); -#else write_output("/tmp/rxsigF0.m","rxsF0", &PHY_vars_eNB->lte_eNB_common_vars.rxdataF[0][0][0],PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size*nsymb,1,1); if (PHY_vars_eNB->lte_frame_parms.nb_antennas_rx>1) write_output("/tmp/rxsigF1.m","rxsF1", &PHY_vars_eNB->lte_eNB_common_vars.rxdataF[0][1][0],PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size*nsymb,1,1); @@ -1641,6 +1584,5 @@ void dump_ulsch(PHY_VARS_eNB *PHY_vars_eNB,uint8_t subframe, uint8_t UE_id) { write_output("/tmp/ulsch_ch_mag.m","ulsch_ch_mag",&PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->ul_ch_mag[0][0][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1); // write_output("ulsch_ch_mag1.m","ulsch_ch_mag1",&PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->ul_ch_mag[0][1][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1); #endif -#endif } diff --git a/openair1/PHY/Makefile.inc b/openair1/PHY/Makefile.inc index b924b02f6d..e16c244688 100644 --- a/openair1/PHY/Makefile.inc +++ b/openair1/PHY/Makefile.inc @@ -46,6 +46,7 @@ PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/lte_ue_measurements.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/lte_eNB_measurements.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/adjust_gain.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_REFSIG/lte_dl_cell_spec.o +PHY_OBJS += $(TOP_DIR)/PHY/LTE_REFSIG/lte_dl_uespec.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_REFSIG/lte_gold.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_REFSIG/lte_gold_mbsfn.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_REFSIG/lte_dl_mbsfn.o diff --git a/openair1/PHY/TOOLS/Makefile b/openair1/PHY/TOOLS/Makefile index d7ea1bf76f..a4ce7dbdc5 100644 --- a/openair1/PHY/TOOLS/Makefile +++ b/openair1/PHY/TOOLS/Makefile @@ -1,5 +1,5 @@ lte_dfts: lte_dfts.c - gcc -O3 -msse4.1 -o lte_dfts lte_dfts.c fft.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -DUSER_MODE -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS + gcc -O3 -msse4.1 -o lte_dfts lte_dfts.c fft.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DUSER_MODE -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS dft_cycles: lte_dfts ./lte_dfts | egrep cycles diff --git a/openair1/PHY/TOOLS/lte_dfts.c b/openair1/PHY/TOOLS/lte_dfts.c index 20250f50ec..8f0d6e2981 100644 --- a/openair1/PHY/TOOLS/lte_dfts.c +++ b/openair1/PHY/TOOLS/lte_dfts.c @@ -51,9 +51,9 @@ static inline void cmac(__m128i a,__m128i b, __m128i *re32, __m128i *im32) { cmac_tmp_re32 = _mm_madd_epi16(a,cmac_tmp); - cmac_tmp = _mm_shufflelo_epi16(b,_MM_SHUFFLE(2,3,0,1)); - cmac_tmp = _mm_shufflehi_epi16(cmac_tmp,_MM_SHUFFLE(2,3,0,1)); - + // cmac_tmp = _mm_shufflelo_epi16(b,_MM_SHUFFLE(2,3,0,1)); + // cmac_tmp = _mm_shufflehi_epi16(cmac_tmp,_MM_SHUFFLE(2,3,0,1)); + cmac_tmp = _mm_shuffle_epi8(b,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); cmac_tmp_im32 = _mm_madd_epi16(cmac_tmp,a); *re32 = _mm_add_epi32(*re32,cmac_tmp_re32); @@ -71,8 +71,9 @@ static inline void cmult(__m128i a,__m128i b, __m128i *re32, __m128i *im32) { mmtmpb = _mm_sign_epi16(b,*(__m128i*)reflip); *re32 = _mm_madd_epi16(a,mmtmpb); - mmtmpb = _mm_shufflelo_epi16(b,_MM_SHUFFLE(2,3,0,1)); - mmtmpb = _mm_shufflehi_epi16(mmtmpb,_MM_SHUFFLE(2,3,0,1)); + // mmtmpb = _mm_shufflelo_epi16(b,_MM_SHUFFLE(2,3,0,1)); + // mmtmpb = _mm_shufflehi_epi16(mmtmpb,_MM_SHUFFLE(2,3,0,1)); + mmtmpb = _mm_shuffle_epi8(b,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); *im32 = _mm_madd_epi16(a,mmtmpb); } @@ -85,8 +86,9 @@ static inline void cmultc(__m128i a,__m128i b, __m128i *re32, __m128i *im32) { *re32 = _mm_madd_epi16(a,b); mmtmpb = _mm_sign_epi16(b,*(__m128i*)reflip); - mmtmpb = _mm_shufflelo_epi16(mmtmpb,_MM_SHUFFLE(2,3,0,1)); - mmtmpb = _mm_shufflehi_epi16(mmtmpb,_MM_SHUFFLE(2,3,0,1)); + // mmtmpb = _mm_shufflelo_epi16(mmtmpb,_MM_SHUFFLE(2,3,0,1)); + // mmtmpb = _mm_shufflehi_epi16(mmtmpb,_MM_SHUFFLE(2,3,0,1)); + mmtmpb = _mm_shuffle_epi8(mmtmpb,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); *im32 = _mm_madd_epi16(a,mmtmpb); } @@ -414,11 +416,13 @@ static inline void bfly4_tw1(__m128i *x0,__m128i *x1,__m128i *x2,__m128i *x3, *(y0) = _mm_adds_epi16(*(x0),_mm_adds_epi16(*(x1),_mm_adds_epi16(*(x2),*(x3)))); x1_flip = _mm_sign_epi16(*(x1),*(__m128i*)conjugatedft); - x1_flip = _mm_shufflelo_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); - x1_flip = _mm_shufflehi_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + // x1_flip = _mm_shufflelo_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + // x1_flip = _mm_shufflehi_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + x1_flip = _mm_shuffle_epi8(x1_flip,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); x3_flip = _mm_sign_epi16(*(x3),*(__m128i*)conjugatedft); - x3_flip = _mm_shufflelo_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); - x3_flip = _mm_shufflehi_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); + // x3_flip = _mm_shufflelo_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); + // x3_flip = _mm_shufflehi_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); + x3_flip = _mm_shuffle_epi8(x3_flip,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); *(y1) = _mm_adds_epi16(*(x0),_mm_subs_epi16(x1_flip,_mm_adds_epi16(*(x2),x3_flip))); *(y2) = _mm_subs_epi16(*(x0),_mm_subs_epi16(*(x1),_mm_subs_epi16(*(x2),*(x3)))); *(y3) = _mm_subs_epi16(*(x0),_mm_adds_epi16(x1_flip,_mm_subs_epi16(*(x2),x3_flip))); @@ -435,11 +439,13 @@ static inline void ibfly4_tw1(__m128i *x0,__m128i *x1,__m128i *x2,__m128i *x3, *(y0) = _mm_adds_epi16(*(x0),_mm_adds_epi16(*(x1),_mm_adds_epi16(*(x2),*(x3)))); x1_flip = _mm_sign_epi16(*(x1),*(__m128i*)conjugatedft); - x1_flip = _mm_shufflelo_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); - x1_flip = _mm_shufflehi_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + // x1_flip = _mm_shufflelo_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + // x1_flip = _mm_shufflehi_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + x1_flip = _mm_shuffle_epi8(x1_flip,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); x3_flip = _mm_sign_epi16(*(x3),*(__m128i*)conjugatedft); - x3_flip = _mm_shufflelo_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); - x3_flip = _mm_shufflehi_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); + // x3_flip = _mm_shufflelo_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); + // x3_flip = _mm_shufflehi_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); + x3_flip = _mm_shuffle_epi8(x3_flip,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); *(y1) = _mm_subs_epi16(*(x0),_mm_adds_epi16(x1_flip,_mm_subs_epi16(*(x2),x3_flip))); *(y2) = _mm_subs_epi16(*(x0),_mm_subs_epi16(*(x1),_mm_subs_epi16(*(x2),*(x3)))); *(y3) = _mm_adds_epi16(*(x0),_mm_subs_epi16(x1_flip,_mm_adds_epi16(*(x2),x3_flip))); @@ -474,12 +480,13 @@ static inline void bfly4_16(__m128i *x0,__m128i *x1,__m128i *x2,__m128i *x3, *(y2) = _mm_subs_epi16(x02t,x13t); x1_flip = _mm_sign_epi16(x1t,*(__m128i*)conjugatedft); - x1_flip = _mm_shufflelo_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); - x1_flip = _mm_shufflehi_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + // x1_flip = _mm_shufflelo_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + // x1_flip = _mm_shufflehi_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + x1_flip = _mm_shuffle_epi8(x1_flip,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); x3_flip = _mm_sign_epi16(x3t,*(__m128i*)conjugatedft); - x3_flip = _mm_shufflelo_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); - x3_flip = _mm_shufflehi_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); - + // x3_flip = _mm_shufflelo_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); + // x3_flip = _mm_shufflehi_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); + x3_flip = _mm_shuffle_epi8(x3_flip,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); x02t = _mm_subs_epi16(*(x0),x2t); x13t = _mm_subs_epi16(x1_flip,x3_flip); /* @@ -520,12 +527,13 @@ static inline void ibfly4_16(__m128i *x0,__m128i *x1,__m128i *x2,__m128i *x3, *(y2) = _mm_subs_epi16(x02t,x13t); x1_flip = _mm_sign_epi16(x1t,*(__m128i*)conjugatedft); - x1_flip = _mm_shufflelo_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); - x1_flip = _mm_shufflehi_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + // x1_flip = _mm_shufflelo_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + // x1_flip = _mm_shufflehi_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + x1_flip = _mm_shuffle_epi8(x1_flip,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); x3_flip = _mm_sign_epi16(x3t,*(__m128i*)conjugatedft); - x3_flip = _mm_shufflelo_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); - x3_flip = _mm_shufflehi_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); - + // x3_flip = _mm_shufflelo_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); + // x3_flip = _mm_shufflehi_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); + x3_flip = _mm_shuffle_epi8(x3_flip,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); x02t = _mm_subs_epi16(*(x0),x2t); x13t = _mm_subs_epi16(x1_flip,x3_flip); /* @@ -713,12 +721,13 @@ static inline void dft16(int16_t *x,int16_t *y) { xtmp2 = _mm_subs_epi16(x128[0],_mm_subs_epi16(x128[1],_mm_subs_epi16(x128[2],x128[3]))); */ x1_flip = _mm_sign_epi16(x128[1],*(__m128i*)conjugatedft); - x1_flip = _mm_shufflelo_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); - x1_flip = _mm_shufflehi_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + // x1_flip = _mm_shufflelo_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + // x1_flip = _mm_shufflehi_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + x1_flip = _mm_shuffle_epi8(x1_flip,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); x3_flip = _mm_sign_epi16(x128[3],*(__m128i*)conjugatedft); - x3_flip = _mm_shufflelo_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); - x3_flip = _mm_shufflehi_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); - + // x3_flip = _mm_shufflelo_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); + // x3_flip = _mm_shufflehi_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); + x3_flip = _mm_shuffle_epi8(x3_flip,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); x02t = _mm_subs_epi16(x128[0],x128[2]); x13t = _mm_subs_epi16(x1_flip,x3_flip); xtmp1 = _mm_adds_epi16(x02t,x13t); // x0 + x1f - x2 - x3f @@ -753,12 +762,13 @@ static inline void dft16(int16_t *x,int16_t *y) { */ x1_flip = _mm_sign_epi16(xtmp1,*(__m128i*)conjugatedft); - x1_flip = _mm_shufflelo_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); - x1_flip = _mm_shufflehi_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + // x1_flip = _mm_shufflelo_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + // x1_flip = _mm_shufflehi_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + x1_flip = _mm_shuffle_epi8(x1_flip,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); x3_flip = _mm_sign_epi16(xtmp3,*(__m128i*)conjugatedft); - x3_flip = _mm_shufflelo_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); - x3_flip = _mm_shufflehi_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); - + // x3_flip = _mm_shufflelo_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); + // x3_flip = _mm_shufflehi_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); + x3_flip = _mm_shuffle_epi8(x3_flip,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); x02t = _mm_subs_epi16(xtmp0,xtmp2); x13t = _mm_subs_epi16(x1_flip,x3_flip); y128[1] = _mm_adds_epi16(x02t,x13t); // x0 + x1f - x2 - x3f @@ -801,12 +811,13 @@ static inline void idft16(int16_t *x,int16_t *y) { xtmp2 = _mm_subs_epi16(x128[0],_mm_subs_epi16(x128[1],_mm_subs_epi16(x128[2],x128[3]))); */ x1_flip = _mm_sign_epi16(x128[1],*(__m128i*)conjugatedft); - x1_flip = _mm_shufflelo_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); - x1_flip = _mm_shufflehi_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + // x1_flip = _mm_shufflelo_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + // x1_flip = _mm_shufflehi_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + x1_flip = _mm_shuffle_epi8(x1_flip,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); x3_flip = _mm_sign_epi16(x128[3],*(__m128i*)conjugatedft); - x3_flip = _mm_shufflelo_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); - x3_flip = _mm_shufflehi_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); - + // x3_flip = _mm_shufflelo_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); + // x3_flip = _mm_shufflehi_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); + x3_flip = _mm_shuffle_epi8(x3_flip,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); x02t = _mm_subs_epi16(x128[0],x128[2]); x13t = _mm_subs_epi16(x1_flip,x3_flip); xtmp3 = _mm_adds_epi16(x02t,x13t); // x0 + x1f - x2 - x3f @@ -841,12 +852,13 @@ static inline void idft16(int16_t *x,int16_t *y) { */ x1_flip = _mm_sign_epi16(xtmp1,*(__m128i*)conjugatedft); - x1_flip = _mm_shufflelo_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); - x1_flip = _mm_shufflehi_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + // x1_flip = _mm_shufflelo_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + // x1_flip = _mm_shufflehi_epi16(x1_flip,_MM_SHUFFLE(2,3,0,1)); + x1_flip = _mm_shuffle_epi8(x1_flip,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); x3_flip = _mm_sign_epi16(xtmp3,*(__m128i*)conjugatedft); - x3_flip = _mm_shufflelo_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); - x3_flip = _mm_shufflehi_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); - + // x3_flip = _mm_shufflelo_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); + // x3_flip = _mm_shufflehi_epi16(x3_flip,_MM_SHUFFLE(2,3,0,1)); + x3_flip = _mm_shuffle_epi8(x3_flip,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); x02t = _mm_subs_epi16(xtmp0,xtmp2); x13t = _mm_subs_epi16(x1_flip,x3_flip); y128[3] = _mm_adds_epi16(x02t,x13t); // x0 + x1f - x2 - x3f @@ -14851,6 +14863,7 @@ void dft1200(int16_t *x,int16_t *y,unsigned char scale_flag){ #ifdef MR_MAIN +int opp_enabled=1; int main(int argc, char**argv) { @@ -15188,7 +15201,7 @@ int main(int argc, char**argv) { dft64((int16_t *)x,(int16_t *)y,1); dft64((int16_t *)x,(int16_t *)y,1); reset_meas(&ts); - for (i=0;i<1000;i++) { + for (i=0;i<10000000;i++) { start_meas(&ts); dft64((int16_t *)x,(int16_t *)y,1); stop_meas(&ts); diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index fa1f154829..4ac5b6f867 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -118,9 +118,9 @@ #ifdef CBMIMO1 -#define openair_get_mbox() (*(unsigned int *)mbox) +#define openair_get_mbox() (*(uint32_t *)mbox) #else //CBMIMO1 -#define openair_get_mbox() (*(unsigned int *)PHY_vars->mbox>>1) +#define openair_get_mbox() (*(uint32_t *)PHY_vars->mbox>>1) #endif //CBMIMO1 #endif // USERMODE @@ -183,7 +183,7 @@ typedef struct PHY_VARS_eNB_s{ /// Module ID indicator for this instance module_id_t Mod_id; uint8_t local_flag; - unsigned int rx_total_gain_eNB_dB; + uint32_t rx_total_gain_eNB_dB; frame_t frame; LTE_DL_FRAME_PARMS lte_frame_parms; PHY_MEASUREMENTS_eNB PHY_measurements_eNB[NUMBER_OF_eNB_SECTORS_MAX]; /// Measurement variables @@ -201,10 +201,13 @@ typedef struct PHY_VARS_eNB_s{ LTE_eNB_UE_stats *eNB_UE_stats_ptr[NUMBER_OF_UE_MAX]; /// cell-specific reference symbols - unsigned int lte_gold_table[20][2][14]; + uint32_t lte_gold_table[20][2][14]; + + /// UE-specific reference symbols (p=7...14), TM 8/9/10 + uint32_t lte_gold_uespec_table[2][20][2][21]; /// mbsfn reference symbols - unsigned int lte_gold_mbsfn_table[10][3][42]; + uint32_t lte_gold_mbsfn_table[10][3][42]; uint32_t X_u[64][839]; @@ -214,7 +217,7 @@ typedef struct PHY_VARS_eNB_s{ /// Indicator set to 0 after first SR uint8_t first_sr[NUMBER_OF_UE_MAX]; - unsigned int max_peak_val; + uint32_t max_peak_val; int max_eNB_id, max_sync_pos; @@ -286,21 +289,21 @@ typedef struct PHY_VARS_eNB_s{ ///check for Total Transmissions - unsigned int check_for_total_transmissions; + uint32_t check_for_total_transmissions; ///check for MU-MIMO Transmissions - unsigned int check_for_MUMIMO_transmissions; + uint32_t check_for_MUMIMO_transmissions; ///check for SU-MIMO Transmissions - unsigned int check_for_SUMIMO_transmissions; + uint32_t check_for_SUMIMO_transmissions; ///check for FULL MU-MIMO Transmissions - unsigned int FULL_MUMIMO_transmissions; + uint32_t FULL_MUMIMO_transmissions; /// Counter for total bitrate, bits and throughput in downlink - unsigned int total_dlsch_bitrate; - unsigned int total_transmitted_bits; - unsigned int total_system_throughput; + uint32_t total_dlsch_bitrate; + uint32_t total_transmitted_bits; + uint32_t total_system_throughput; time_stats_t phy_proc; time_stats_t phy_proc_tx; @@ -356,12 +359,12 @@ typedef struct /// Module ID indicator for this instance uint8_t Mod_id; uint8_t local_flag; - unsigned int tx_total_gain_dB; - unsigned int rx_total_gain_dB; ///this is a function of rx_gain_mode (and the corresponding gain) and the rx_gain of the card + uint32_t tx_total_gain_dB; + uint32_t rx_total_gain_dB; ///this is a function of rx_gain_mode (and the corresponding gain) and the rx_gain of the card rx_gain_t rx_gain_mode[4]; - unsigned int rx_gain_max[4]; - unsigned int rx_gain_med[4]; - unsigned int rx_gain_byp[4]; + uint32_t rx_gain_max[4]; + uint32_t rx_gain_med[4]; + uint32_t rx_gain_byp[4]; int8_t tx_power_dBm; int8_t tx_power_max_dBm; uint32_t frame; @@ -395,26 +398,29 @@ typedef struct UE_MODE_t UE_mode[NUMBER_OF_CONNECTED_eNB_MAX]; int8_t g_pucch[NUMBER_OF_CONNECTED_eNB_MAX]; /// cell-specific reference symbols - unsigned int lte_gold_table[7][20][2][14]; + uint32_t lte_gold_table[7][20][2][14]; -/// mbsfn reference symbols - unsigned int lte_gold_mbsfn_table[10][3][42]; + /// ue-specific reference symbols + uint32_t lte_gold_uespec_table[2][20][2][21]; + + /// mbsfn reference symbols + uint32_t lte_gold_mbsfn_table[10][3][42]; uint32_t X_u[64][839]; char ulsch_no_allocation_counter[NUMBER_OF_CONNECTED_eNB_MAX]; unsigned char ulsch_ue_Msg3_active[NUMBER_OF_CONNECTED_eNB_MAX]; - unsigned int ulsch_ue_Msg3_frame[NUMBER_OF_CONNECTED_eNB_MAX]; + uint32_t ulsch_ue_Msg3_frame[NUMBER_OF_CONNECTED_eNB_MAX]; unsigned char ulsch_ue_Msg3_subframe[NUMBER_OF_CONNECTED_eNB_MAX]; // unsigned char Msg3_timer[NUMBER_OF_CONNECTED_eNB_MAX]; //unsigned char *Msg3_ptr[NUMBER_OF_CONNECTED_eNB_MAX]; PRACH_RESOURCES_t *prach_resources[NUMBER_OF_CONNECTED_eNB_MAX]; int turbo_iterations, turbo_cntl_iterations; - unsigned int total_TBS[NUMBER_OF_CONNECTED_eNB_MAX]; - unsigned int total_TBS_last[NUMBER_OF_CONNECTED_eNB_MAX]; - unsigned int bitrate[NUMBER_OF_CONNECTED_eNB_MAX]; - unsigned int total_received_bits[NUMBER_OF_CONNECTED_eNB_MAX]; + uint32_t total_TBS[NUMBER_OF_CONNECTED_eNB_MAX]; + uint32_t total_TBS_last[NUMBER_OF_CONNECTED_eNB_MAX]; + uint32_t bitrate[NUMBER_OF_CONNECTED_eNB_MAX]; + uint32_t total_received_bits[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_errors[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_errors_last[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_received[NUMBER_OF_CONNECTED_eNB_MAX]; diff --git a/openair1/PHY/impl_defs_lte.h b/openair1/PHY/impl_defs_lte.h index 7138d2890c..18707c54b6 100644 --- a/openair1/PHY/impl_defs_lte.h +++ b/openair1/PHY/impl_defs_lte.h @@ -534,7 +534,9 @@ typedef enum { PUSCH_PRECODING1=8, DUALSTREAM_UNIFORM_PRECODING1=9, DUALSTREAM_UNIFORM_PRECODINGj=10, - DUALSTREAM_PUSCH_PRECODING=11 + DUALSTREAM_PUSCH_PRECODING=11, + TM8=12, + TM9_10=13 } MIMO_mode_t; typedef struct{ diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index c18ff68cb1..02c5a0ab28 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1791,6 +1791,7 @@ void phy_procedures_eNB_TX(unsigned char next_slot,PHY_VARS_eNB *phy_vars_eNB,ui phy_vars_eNB->dlsch_eNB_SI->nb_rb, phy_vars_eNB->dlsch_eNB_SI->rb_alloc, get_Qm(phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->mcs), + 1, num_pdcch_symbols,phy_vars_eNB->frame,next_slot>>1), 0, next_slot); @@ -1909,6 +1910,7 @@ void phy_procedures_eNB_TX(unsigned char next_slot,PHY_VARS_eNB *phy_vars_eNB,ui phy_vars_eNB->dlsch_eNB_ra->nb_rb, phy_vars_eNB->dlsch_eNB_ra->rb_alloc, get_Qm(phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->mcs), + 1, num_pdcch_symbols,phy_vars_eNB->frame,next_slot>>1), 0, next_slot); @@ -1958,6 +1960,7 @@ void phy_procedures_eNB_TX(unsigned char next_slot,PHY_VARS_eNB *phy_vars_eNB,ui phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nb_rb, phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rb_alloc, get_Qm(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs), + phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->Nl, num_pdcch_symbols,phy_vars_eNB->frame,next_slot>>1), phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nb_rb, phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs, @@ -2031,6 +2034,7 @@ void phy_procedures_eNB_TX(unsigned char next_slot,PHY_VARS_eNB *phy_vars_eNB,ui phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nb_rb, phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rb_alloc, get_Qm(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs), + phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->Nl, num_pdcch_symbols,phy_vars_eNB->frame,next_slot>>1), 0, next_slot); diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 9ba21bf93f..fc75549179 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -149,7 +149,8 @@ void dump_dlsch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,uint8_t coded_bits_per_codeword = get_G(&phy_vars_ue->lte_frame_parms, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc, - get_Qm(phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs), + get_Qm(phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs), + phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Nl, phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, phy_vars_ue->frame,subframe); @@ -176,7 +177,8 @@ void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) { coded_bits_per_codeword = get_G(&phy_vars_ue->lte_frame_parms, phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb, phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc, - get_Qm(phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->mcs), + get_Qm(phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->mcs), + 1, phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, phy_vars_ue->frame,subframe); LOG_D(PHY,"[UE %d] Dumping dlsch_SI : nb_rb %d, mcs %d, nb_rb %d, num_pdcch_symbols %d,G %d\n", @@ -230,6 +232,7 @@ void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) { phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->nb_rb, phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->rb_alloc, get_Qm(phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->mcs), + 1, phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, phy_vars_ue->frame,subframe); LOG_D(PHY,"[UE %d] Dumping dlsch_ra : nb_rb %d, mcs %d, nb_rb %d, num_pdcch_symbols %d,G %d\n", @@ -2465,6 +2468,7 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,uint8_t last_slot, PHY_VARS_UE *phy_v phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc, get_Qm(phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs), + phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Nl, phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, phy_vars_ue->frame,(((last_slot>>1)==0) ? 9 : ((last_slot>>1)-1))); start_meas(&phy_vars_ue->dlsch_unscrambling_stats); @@ -2614,7 +2618,7 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,uint8_t last_slot, PHY_VARS_UE *phy_v get_G(&phy_vars_ue->lte_frame_parms, phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb, phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc, - get_Qm(phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->mcs), + get_Qm(phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->mcs),1, phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, phy_vars_ue->frame,(((last_slot>>1)==0) ? 9 : ((last_slot>>1)-1))); @@ -2749,7 +2753,7 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,uint8_t last_slot, PHY_VARS_UE *phy_v phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->G = get_G(&phy_vars_ue->lte_frame_parms, phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->nb_rb, phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->rb_alloc, - get_Qm(phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->mcs), + get_Qm(phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->mcs),1, phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, phy_vars_ue->frame, (((last_slot>>1)==0) ? 9 : ((last_slot>>1)-1))); @@ -3097,6 +3101,7 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,uint8_t last_slot, PHY_VARS_UE *phy_v phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->nb_rb, phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->rb_alloc, get_Qm(phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->mcs), + 1, 2, ((last_slot>>1)==9?-1:0)+phy_vars_ue->frame,last_slot>>1); diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index 1cb4fc8492..6f29c6eac1 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -1264,6 +1264,7 @@ int main(int argc, char **argv) { PHY_vars_eNB->dlsch_eNB[0][0]->nb_rb, PHY_vars_eNB->dlsch_eNB[0][0]->rb_alloc, get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs), + PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->Nl, num_pdcch_symbols, 0,subframe); @@ -1528,6 +1529,7 @@ int main(int argc, char **argv) { PHY_vars_eNB->dlsch_eNB[k][0]->nb_rb, PHY_vars_eNB->dlsch_eNB[k][0]->rb_alloc, get_Qm(PHY_vars_eNB->dlsch_eNB[k][0]->harq_processes[0]->mcs), + PHY_vars_eNB->dlsch_eNB[k][0]->harq_processes[0]->Nl, num_pdcch_symbols, 0,subframe); @@ -1995,7 +1997,8 @@ int main(int argc, char **argv) { PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->nb_rb, PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->rb_alloc, get_Qm(PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->mcs), - PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols, + PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->Nl, +PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols, 0,subframe); /* rate = (double)dlsch_tbs25[get_I_TBS(PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->mcs)][PHY_vars_UE->dlsch_ue[0][0]->nb_rb-1]/(coded_bits_per_codeword); @@ -2210,6 +2213,7 @@ int main(int argc, char **argv) { PHY_vars_eNB->dlsch_eNB[0][0]->nb_rb, PHY_vars_eNB->dlsch_eNB[0][0]->rb_alloc, get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs), + PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->Nl, num_pdcch_symbols, 0,subframe); diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c index 6befae9516..e175d9f74e 100644 --- a/openair1/SIMULATION/LTE_PHY/mbmssim.c +++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c @@ -498,7 +498,7 @@ int main(int argc, char **argv) { PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->nb_rb, PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->rb_alloc, get_Qm(PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->mcs), - 2, + 1,2, PHY_vars_UE->frame,subframe); dlsch_unscrambling(&PHY_vars_UE->lte_frame_parms,1,PHY_vars_UE->dlsch_ue_MCH[0], PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->G,