diff --git a/openair1/PHY/CODING/lte_rate_matching.c b/openair1/PHY/CODING/lte_rate_matching.c index 9a0e93d939d64bf61b8f35e6cb9e8886372f0b1b..3c537d08a0fb2d39c791aec4952bb287e66738c7 100644 --- a/openair1/PHY/CODING/lte_rate_matching.c +++ b/openair1/PHY/CODING/lte_rate_matching.c @@ -661,7 +661,8 @@ int lte_rate_matching_turbo_rx(uint32_t RTC, int nulled=0; #endif if (Kmimo==0 || Mdlharq==0 || C==0 || Qm==0 || Nl==0) { - msg("lte_rate_matching.c: invalid paramters\n"); + msg("lte_rate_matching.c: invalid parameters (Kmimo %d, Mdlharq %d, C %d, Qm %d, Nl %d\n", + Kmimo,Mdlharq,C,Qm,Nl); return(-1); } diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index 9699226e9e259f6a48388994ee9c07589bdd9b1b..c2d47d3d68fa6067c957be7d6b40db9da1793f09 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -1098,10 +1098,13 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue, for (j=0; j<4; j++) //frame_parms->nb_antennas_tx; j++) ue_pdsch_vars[eNB_id]->rxdataF_ext[(j<<1)+i] = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14)); - ue_pdsch_vars[eNB_id]->rxdataF_comp = (int **)malloc16(8*sizeof(int*)); + ue_pdsch_vars[eNB_id]->rxdataF_comp0 = (int **)malloc16(8*sizeof(int*)); + ue_pdsch_vars[eNB_id]->rxdataF_comp1 = (int **)malloc16(8*sizeof(int*)); for (i=0; i<frame_parms->nb_antennas_rx; i++) - for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) - ue_pdsch_vars[eNB_id]->rxdataF_comp[(j<<1)+i] = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14)); + for (j=0; j<4;j++){ + ue_pdsch_vars[eNB_id]->rxdataF_comp0[(j<<1)+i] = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14)); + ue_pdsch_vars[eNB_id]->rxdataF_comp1[(j<<1)+i] = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14)); + } // printf("rxdataF_comp[0] %p\n",ue_pdsch_vars[eNB_id]->rxdataF_comp[0]); ue_pdcch_vars[eNB_id]->rxdataF_comp = (int **)malloc16(8*sizeof(int*)); @@ -1130,15 +1133,21 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue, ue_pdsch_vars[eNB_id]->pmi_ext = (unsigned char *)malloc16(frame_parms->N_RB_DL); - ue_pdsch_vars[eNB_id]->dl_ch_mag = (int **)malloc16(8*sizeof(short*)); + ue_pdsch_vars[eNB_id]->dl_ch_mag0 = (int **)malloc16(8*sizeof(short*)); + ue_pdsch_vars[eNB_id]->dl_ch_mag1 = (int **)malloc16(8*sizeof(short*)); for (i=0; i<frame_parms->nb_antennas_rx; i++) - for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) - ue_pdsch_vars[eNB_id]->dl_ch_mag[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); + for (j=0; j<4;j++) { + ue_pdsch_vars[eNB_id]->dl_ch_mag0[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); + ue_pdsch_vars[eNB_id]->dl_ch_mag1[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); + } - ue_pdsch_vars[eNB_id]->dl_ch_magb = (int **)malloc16(8*sizeof(short*)); + ue_pdsch_vars[eNB_id]->dl_ch_magb0 = (int **)malloc16(8*sizeof(short*)); + ue_pdsch_vars[eNB_id]->dl_ch_magb1 = (int **)malloc16(8*sizeof(short*)); for (i=0; i<frame_parms->nb_antennas_rx; i++) - for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) - ue_pdsch_vars[eNB_id]->dl_ch_magb[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); + for (j=0; j<4;j++) { + ue_pdsch_vars[eNB_id]->dl_ch_magb0[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); + ue_pdsch_vars[eNB_id]->dl_ch_magb1[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); + } ue_pdsch_vars[eNB_id]->rho = (int **)malloc16(frame_parms->nb_antennas_rx*sizeof(int*)); for (i=0;i<frame_parms->nb_antennas_rx;i++) @@ -1206,13 +1215,13 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue, for (j=0; j<4; j++) //frame_parms->nb_antennas_tx; j++) ue_pdsch_vars_SI[eNB_id]->rxdataF_ext[(j<<1)+i] = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14)); - ue_pdsch_vars_SI[eNB_id]->rxdataF_comp = (int **)malloc16(8*sizeof(int*)); + ue_pdsch_vars_SI[eNB_id]->rxdataF_comp0 = (int **)malloc16(8*sizeof(int*)); ue_pdsch_vars_SI[eNB_id]->pmi_ext = (unsigned char *)malloc16(frame_parms->N_RB_DL); for (i=0; i<frame_parms->nb_antennas_rx; i++) for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) - ue_pdsch_vars_SI[eNB_id]->rxdataF_comp[(j<<1)+i] = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14)); + ue_pdsch_vars_SI[eNB_id]->rxdataF_comp0[(j<<1)+i] = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14)); ue_pdsch_vars_SI[eNB_id]->rho = (int **)malloc16(frame_parms->nb_antennas_rx*sizeof(int*)); for (i=0;i<frame_parms->nb_antennas_rx;i++) @@ -1228,10 +1237,10 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue, for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) ue_pdsch_vars_ra[eNB_id]->rxdataF_ext[(j<<1)+i] = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14)); - ue_pdsch_vars_ra[eNB_id]->rxdataF_comp = (int **)malloc16(8*sizeof(int*)); + ue_pdsch_vars_ra[eNB_id]->rxdataF_comp0 = (int **)malloc16(8*sizeof(int*)); for (i=0; i<frame_parms->nb_antennas_rx; i++) for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) - ue_pdsch_vars_ra[eNB_id]->rxdataF_comp[(j<<1)+i] = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14)); + ue_pdsch_vars_ra[eNB_id]->rxdataF_comp0[(j<<1)+i] = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14)); ue_pdsch_vars_ra[eNB_id]->rho = (int **)malloc16(frame_parms->nb_antennas_rx*sizeof(int*)); @@ -1250,10 +1259,10 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue, for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) ue_pdsch_vars_mch[eNB_id]->rxdataF_ext[(j<<1)+i] = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14)); - ue_pdsch_vars_mch[eNB_id]->rxdataF_comp = (int **)malloc16(8*sizeof(int*)); + ue_pdsch_vars_mch[eNB_id]->rxdataF_comp0 = (int **)malloc16(8*sizeof(int*)); for (i=0; i<frame_parms->nb_antennas_rx; i++) for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) - ue_pdsch_vars_mch[eNB_id]->rxdataF_comp[(j<<1)+i] = (int *)malloc16(sizeof(int)*(2+frame_parms->N_RB_DL*12*14)); + ue_pdsch_vars_mch[eNB_id]->rxdataF_comp0[(j<<1)+i] = (int *)malloc16(sizeof(int)*(2+frame_parms->N_RB_DL*12*14)); ue_pdsch_vars_mch[eNB_id]->rho = (int **)malloc16(frame_parms->nb_antennas_rx*sizeof(int*)); @@ -1282,15 +1291,15 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue, for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) ue_pdsch_vars_SI[eNB_id]->dl_ch_rho_ext[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); - ue_pdsch_vars_SI[eNB_id]->dl_ch_mag = (int **)malloc16(8*sizeof(short*)); + ue_pdsch_vars_SI[eNB_id]->dl_ch_mag0 = (int **)malloc16(8*sizeof(short*)); for (i=0; i<frame_parms->nb_antennas_rx; i++) for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) - ue_pdsch_vars_SI[eNB_id]->dl_ch_mag[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); + ue_pdsch_vars_SI[eNB_id]->dl_ch_mag0[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); - ue_pdsch_vars_SI[eNB_id]->dl_ch_magb = (int **)malloc16(8*sizeof(short*)); + ue_pdsch_vars_SI[eNB_id]->dl_ch_magb0 = (int **)malloc16(8*sizeof(short*)); for (i=0; i<frame_parms->nb_antennas_rx; i++) for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) - ue_pdsch_vars_SI[eNB_id]->dl_ch_magb[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); + ue_pdsch_vars_SI[eNB_id]->dl_ch_magb0[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); ue_pdsch_vars_SI[eNB_id]->llr[0] = (short *)malloc16((8*((3*8*6144)+12))*sizeof(short)); /***/ @@ -1307,15 +1316,15 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue, for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) ue_pdsch_vars_ra[eNB_id]->dl_ch_rho_ext[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); - ue_pdsch_vars_ra[eNB_id]->dl_ch_mag = (int **)malloc16(8*sizeof(short*)); + ue_pdsch_vars_ra[eNB_id]->dl_ch_mag0 = (int **)malloc16(8*sizeof(short*)); for (i=0; i<frame_parms->nb_antennas_rx; i++) for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) - ue_pdsch_vars_ra[eNB_id]->dl_ch_mag[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); + ue_pdsch_vars_ra[eNB_id]->dl_ch_mag0[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); - ue_pdsch_vars_ra[eNB_id]->dl_ch_magb = (int **)malloc16(8*sizeof(short*)); + ue_pdsch_vars_ra[eNB_id]->dl_ch_magb0 = (int **)malloc16(8*sizeof(short*)); for (i=0; i<frame_parms->nb_antennas_rx; i++) for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) - ue_pdsch_vars_ra[eNB_id]->dl_ch_magb[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); + ue_pdsch_vars_ra[eNB_id]->dl_ch_magb0[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); // ue_pdsch_vars_ra[eNB_id]->llr[0] = (short *)malloc16((8*((3*8*6144)+12))*sizeof(short)); ue_pdsch_vars_ra[eNB_id]->llr128 = (short **)malloc16(sizeof(short **)); @@ -1332,15 +1341,15 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue, for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) ue_pdsch_vars_mch[eNB_id]->dl_ch_rho_ext[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); - ue_pdsch_vars_mch[eNB_id]->dl_ch_mag = (int **)malloc16(8*sizeof(short*)); + ue_pdsch_vars_mch[eNB_id]->dl_ch_mag0 = (int **)malloc16(8*sizeof(short*)); for (i=0; i<frame_parms->nb_antennas_rx; i++) for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) - ue_pdsch_vars_mch[eNB_id]->dl_ch_mag[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); + ue_pdsch_vars_mch[eNB_id]->dl_ch_mag0[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); - ue_pdsch_vars_mch[eNB_id]->dl_ch_magb = (int **)malloc16(8*sizeof(short*)); + ue_pdsch_vars_mch[eNB_id]->dl_ch_magb0 = (int **)malloc16(8*sizeof(short*)); for (i=0; i<frame_parms->nb_antennas_rx; i++) for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) - ue_pdsch_vars_mch[eNB_id]->dl_ch_magb[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); + ue_pdsch_vars_mch[eNB_id]->dl_ch_magb0[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); // ue_pdsch_vars_mch[eNB_id]->llr[0] = (short *)malloc16((8*((3*8*6144)+12))*sizeof(short)); ue_pdsch_vars_mch[eNB_id]->llr128 = (short **)malloc16(sizeof(short **)); @@ -1419,13 +1428,13 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue, } } - ue_pdsch_vars[eNB_id]->rxdataF_comp = (int **)malloc16(8*sizeof(int*)); + ue_pdsch_vars[eNB_id]->rxdataF_comp0 = (int **)malloc16(8*sizeof(int*)); ue_pdsch_vars_flp[eNB_id]->rxdataF_comp = (double **)malloc16(8*sizeof(int*)); for (i=0; i<frame_parms->nb_antennas_rx; i++) { for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) { - ue_pdsch_vars[eNB_id]->rxdataF_comp[(j<<1)+i] = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14)); + ue_pdsch_vars[eNB_id]->rxdataF_comp0[(j<<1)+i] = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14)); ue_pdsch_vars_flp[eNB_id]->rxdataF_comp[(j<<1)+i] = (double *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14)); } } @@ -1456,23 +1465,23 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue, ue_pdsch_vars[eNB_id]->pmi_ext = (unsigned char *)malloc16(frame_parms->N_RB_DL); ue_pdsch_vars_flp[eNB_id]->pmi_ext = (unsigned char *)malloc16(frame_parms->N_RB_DL); - ue_pdsch_vars[eNB_id]->dl_ch_mag = (int **)malloc16(8*sizeof(short*)); + ue_pdsch_vars[eNB_id]->dl_ch_mag0 = (int **)malloc16(8*sizeof(short*)); ue_pdsch_vars_flp[eNB_id]->dl_ch_mag = (double **)malloc16(8*sizeof(double*)); for (i=0; i<frame_parms->nb_antennas_rx; i++) { for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) { - ue_pdsch_vars[eNB_id]->dl_ch_mag[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); + ue_pdsch_vars[eNB_id]->dl_ch_mag0[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); ue_pdsch_vars_flp[eNB_id]->dl_ch_mag[(j<<1)+i] = (double *)malloc16(7*2*sizeof(double)*(frame_parms->N_RB_DL*12)); } } - ue_pdsch_vars[eNB_id]->dl_ch_magb = (int **)malloc16(8*sizeof(short*)); + ue_pdsch_vars[eNB_id]->dl_ch_magb0 = (int **)malloc16(8*sizeof(short*)); ue_pdsch_vars_flp[eNB_id]->dl_ch_magb = (double **)malloc16(8*sizeof(double*)); for (i=0; i<frame_parms->nb_antennas_rx; i++) { for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) { - ue_pdsch_vars[eNB_id]->dl_ch_magb[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); + ue_pdsch_vars[eNB_id]->dl_ch_magb0[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12)); ue_pdsch_vars_flp[eNB_id]->dl_ch_magb[(j<<1)+i] = (double *)malloc16(7*2*sizeof(double)*(frame_parms->N_RB_DL*12)); } } @@ -1504,6 +1513,10 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue, phy_vars_ue->pdsch_config_dedicated->p_a = PDSCH_ConfigDedicated__p_a_dB0; //defaul value until overwritten by RRCConnectionReconfiguration + // set channel estimation to do linear interpolation in time + phy_vars_ue->high_speed_flag = 1; + phy_vars_ue->ch_est_alpha = 24576; + init_prach_tables(839); return(0); diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c index 0afc66f4872a7afccf8d4b6c23db0e71a80ce4d9..2fcec9c2565d667d195cdbc3d27529e2aed44553 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c @@ -45,7 +45,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, int pilot[2][200] __attribute__((aligned(16))); - unsigned char nu,aarx,aa; + unsigned char nu,aarx; unsigned short k; unsigned int rb,pilot_cnt; short ch[2],*pil,*rxF,*dl_ch,*dl_ch_prev,*f,*f2,*fl,*f2l2,*fr,*f2r2,*f2_dc,*f_dc; @@ -88,7 +88,10 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, //ch_offset = (l*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)); - ch_offset = phy_vars_ue->lte_frame_parms.ofdm_symbol_size*symbol; + if (phy_vars_ue->high_speed_flag == 0) // use second channel estimate position for temporary storage + ch_offset = phy_vars_ue->lte_frame_parms.ofdm_symbol_size ; + else + ch_offset = phy_vars_ue->lte_frame_parms.ofdm_symbol_size*symbol; symbol_offset = phy_vars_ue->lte_frame_parms.ofdm_symbol_size*symbol; k = (nu + nushift)%6; @@ -185,9 +188,15 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, rxF = (short *)&rxdataF[aarx][((symbol_offset+k+phy_vars_ue->lte_frame_parms.first_carrier_offset))]; dl_ch = (short *)&dl_ch_estimates[(p<<1)+aarx][ch_offset]; + // if (eNb_id==0) memset(dl_ch,0,4*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)); + if (phy_vars_ue->high_speed_flag==0) // multiply previous channel estimate by ch_est_alpha + multadd_complex_vector_real_scalar(dl_ch-(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<1), + phy_vars_ue->ch_est_alpha,dl_ch-(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<1), + 1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + if ((phy_vars_ue->lte_frame_parms.N_RB_DL==6) || (phy_vars_ue->lte_frame_parms.N_RB_DL==50) || (phy_vars_ue->lte_frame_parms.N_RB_DL==100)) { @@ -610,75 +619,83 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, #ifndef PERFECT_CE // Temporal Interpolation // printf("ch_offset %d\n",ch_offset); - + dl_ch = (short *)&dl_ch_estimates[(p<<1)+aarx][ch_offset]; - if (symbol == 0) { - // printf("Interpolating %d->0\n",4-phy_vars_ue->lte_frame_parms.Ncp); - // dl_ch_prev = (short *)&dl_ch_estimates[(p<<1)+aarx][(4-phy_vars_ue->lte_frame_parms.Ncp)*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - dl_ch_prev = (short *)&dl_ch_estimates[(p<<1)+aarx][pilot3*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - - multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + + if (phy_vars_ue->high_speed_flag == 0) { + multadd_complex_vector_real_scalar(dl_ch, + 32767-phy_vars_ue->ch_est_alpha, + dl_ch-(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<1),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + } + else { // high_speed_flag == 1 + if (symbol == 0) { + // printf("Interpolating %d->0\n",4-phy_vars_ue->lte_frame_parms.Ncp); + // dl_ch_prev = (short *)&dl_ch_estimates[(p<<1)+aarx][(4-phy_vars_ue->lte_frame_parms.Ncp)*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; + dl_ch_prev = (short *)&dl_ch_estimates[(p<<1)+aarx][pilot3*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; + + multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - } // this is 1/3,2/3 combination for pilots spaced by 3 symbols - else if (symbol == pilot1) { - dl_ch_prev = (short *)&dl_ch_estimates[(p<<1)+aarx][0]; - if (phy_vars_ue->lte_frame_parms.Ncp==0) {// pilot spacing 4 symbols (1/4,1/2,3/4 combination) - multadd_complex_vector_real_scalar(dl_ch_prev,24576,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,8192,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - - multadd_complex_vector_real_scalar(dl_ch_prev,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - - multadd_complex_vector_real_scalar(dl_ch_prev,8192,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,24576,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + } // this is 1/3,2/3 combination for pilots spaced by 3 symbols + else if (symbol == pilot1) { + dl_ch_prev = (short *)&dl_ch_estimates[(p<<1)+aarx][0]; + if (phy_vars_ue->lte_frame_parms.Ncp==0) {// pilot spacing 4 symbols (1/4,1/2,3/4 combination) + multadd_complex_vector_real_scalar(dl_ch_prev,24576,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,8192,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + + multadd_complex_vector_real_scalar(dl_ch_prev,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + + multadd_complex_vector_real_scalar(dl_ch_prev,8192,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,24576,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + } + else { + multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + + multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + } // pilot spacing 3 symbols (1/3,2/3 combination) } - else { - multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - - multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - } // pilot spacing 3 symbols (1/3,2/3 combination) - } - else if (symbol == pilot2) { - dl_ch_prev = (short *)&dl_ch_estimates[(p<<1)+aarx][pilot1*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - - multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + else if (symbol == pilot2) { + dl_ch_prev = (short *)&dl_ch_estimates[(p<<1)+aarx][pilot1*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - } - else { // symbol == pilot3 - // printf("Interpolating 0->%d\n",4-phy_vars_ue->lte_frame_parms.Ncp); - dl_ch_prev = (short *)&dl_ch_estimates[(p<<1)+aarx][pilot2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - if (phy_vars_ue->lte_frame_parms.Ncp==0) {// pilot spacing 4 symbols (1/4,1/2,3/4 combination) - multadd_complex_vector_real_scalar(dl_ch_prev,24576,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,8192,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - - multadd_complex_vector_real_scalar(dl_ch_prev,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch_prev,8192,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,24576,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); } - else { - multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - - multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - } // pilot spacing 3 symbols (1/3,2/3 combination) + else { // symbol == pilot3 + // printf("Interpolating 0->%d\n",4-phy_vars_ue->lte_frame_parms.Ncp); + dl_ch_prev = (short *)&dl_ch_estimates[(p<<1)+aarx][pilot2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; + if (phy_vars_ue->lte_frame_parms.Ncp==0) {// pilot spacing 4 symbols (1/4,1/2,3/4 combination) + multadd_complex_vector_real_scalar(dl_ch_prev,24576,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,8192,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + + multadd_complex_vector_real_scalar(dl_ch_prev,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + + multadd_complex_vector_real_scalar(dl_ch_prev,8192,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,24576,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + } + else { + multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + + multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + } // pilot spacing 3 symbols (1/3,2/3 combination) + } + } #endif - } void (*idft)(int16_t *,int16_t *, int); - + switch (phy_vars_ue->lte_frame_parms.log2_symbol_size) { case 7: idft = idft128; @@ -705,7 +722,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, if (phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][(p<<1)+aarx]) idft((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][(p<<1)+aarx][8], (int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][(p<<1)+aarx],1); - } + } return(0); } diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c index 58c780698244fca7556f57102c64b8cb3344fe3a..1996ad77fe51067ae99811df4bc0ee287e6e1ad2 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci.c +++ b/openair1/PHY/LTE_TRANSPORT/dci.c @@ -254,6 +254,11 @@ uint8_t *generate_dci0(uint8_t *dci, dci_flip[5] = dci[2]; dci_flip[6] = dci[1]; dci_flip[7] = dci[0]; +#ifdef DEBUG_DCI_ENCODING + msg("DCI => %x,%x,%x,%x,%x,%x,%x,%x\n", + dci_flip[0],dci_flip[1],dci_flip[2],dci_flip[3], + dci_flip[4],dci_flip[5],dci_flip[6],dci_flip[7]); +#endif } dci_encoding(dci_flip,DCI_LENGTH,coded_bits,e,rnti); @@ -812,6 +817,7 @@ void pdcch_extract_rbs_single(int32_t **rxdataF, int32_t **rxdataF_ext, int32_t **dl_ch_estimates_ext, uint8_t symbol, + uint32_t high_speed_flag, LTE_DL_FRAME_PARMS *frame_parms) { @@ -828,8 +834,11 @@ void pdcch_extract_rbs_single(int32_t **rxdataF, msg("[PHY] extract_rbs_single: symbol_mod %d\n",symbol_mod); #endif for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++) { - - dl_ch0 = &dl_ch_estimates[aarx][5+(symbol*(frame_parms->ofdm_symbol_size))]; + + if (high_speed_flag == 1) + dl_ch0 = &dl_ch_estimates[aarx][5+(symbol*(frame_parms->ofdm_symbol_size))]; + else + dl_ch0 = &dl_ch_estimates[aarx][5]; dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*(frame_parms->N_RB_DL*12)]; rxF_ext = &rxdataF_ext[aarx][symbol*(frame_parms->N_RB_DL*12)]; @@ -1013,6 +1022,7 @@ void pdcch_extract_rbs_dual(int32_t **rxdataF, int32_t **rxdataF_ext, int32_t **dl_ch_estimates_ext, uint8_t symbol, + uint32_t high_speed_flag, LTE_DL_FRAME_PARMS *frame_parms) { @@ -1025,10 +1035,16 @@ void pdcch_extract_rbs_dual(int32_t **rxdataF, symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++) { - - dl_ch0 = &dl_ch_estimates[aarx][5+(symbol*(frame_parms->ofdm_symbol_size))]; + + if (high_speed_flag==1) { + dl_ch0 = &dl_ch_estimates[aarx][5+(symbol*(frame_parms->ofdm_symbol_size))]; + dl_ch1 = &dl_ch_estimates[2+aarx][5+(symbol*(frame_parms->ofdm_symbol_size))]; + } + else { + dl_ch0 = &dl_ch_estimates[aarx][5]; + dl_ch1 = &dl_ch_estimates[2+aarx][5]; + } dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*(frame_parms->N_RB_DL*12)]; - dl_ch1 = &dl_ch_estimates[2+aarx][5+(symbol*(frame_parms->ofdm_symbol_size))]; dl_ch1_ext = &dl_ch_estimates_ext[2+aarx][symbol*(frame_parms->N_RB_DL*12)]; // msg("pdcch extract_rbs: rxF_ext pos %d\n",symbol*(frame_parms->N_RB_DL*12)); @@ -1524,6 +1540,7 @@ int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars, uint8_t subframe, uint8_t eNB_id, MIMO_mode_t mimo_mode, + uint32_t high_speed_flag, uint8_t is_secondary_ue) { uint8_t log2_maxh,aatx,aarx; @@ -1543,6 +1560,7 @@ int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars, lte_ue_pdcch_vars[eNB_id]->rxdataF_ext, lte_ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext, s, + high_speed_flag, frame_parms); #ifdef MU_RECEIVER pdcch_extract_rbs_single(lte_ue_common_vars->rxdataF, @@ -1550,6 +1568,7 @@ int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars, lte_ue_pdcch_vars[eNB_id_i]->rxdataF_ext,//shift by two to simulate transmission from a second antenna lte_ue_pdcch_vars[eNB_id_i]->dl_ch_estimates_ext,//shift by two to simulate transmission from a second antenna s, + high_speed_flag, frame_parms); #endif //MU_RECEIVER } else if (frame_parms->nb_antennas_tx_eNB>1) { @@ -1558,6 +1577,7 @@ int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars, lte_ue_pdcch_vars[eNB_id]->rxdataF_ext, lte_ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext, s, + high_speed_flag, frame_parms); } else { pdcch_extract_rbs_single(lte_ue_common_vars->rxdataF, @@ -1565,6 +1585,7 @@ int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars, lte_ue_pdcch_vars[eNB_id]->rxdataF_ext, lte_ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext, s, + high_speed_flag, frame_parms); } } @@ -1832,13 +1853,13 @@ uint8_t get_num_pdcch_symbols(uint8_t num_dci, } uint8_t generate_dci_top(uint8_t num_ue_spec_dci, - uint8_t num_common_dci, - DCI_ALLOC_t *dci_alloc, - uint32_t n_rnti, - int16_t amp, - LTE_DL_FRAME_PARMS *frame_parms, - mod_sym_t **txdataF, - uint32_t subframe) { + uint8_t num_common_dci, + DCI_ALLOC_t *dci_alloc, + uint32_t n_rnti, + int16_t amp, + LTE_DL_FRAME_PARMS *frame_parms, + mod_sym_t **txdataF, + uint32_t subframe) { uint8_t *e_ptr,num_pdcch_symbols; int8_t L; @@ -2451,6 +2472,11 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **lte_ue_pdcch_vars,int do_common,uint dci_alloc[*dci_cnt].dci_pdu[2] = dci_decoded_output[5]; dci_alloc[*dci_cnt].dci_pdu[1] = dci_decoded_output[6]; dci_alloc[*dci_cnt].dci_pdu[0] = dci_decoded_output[7]; +#ifdef DEBUG_DCI_DECODING + msg("DCI => %x,%x,%x,%x,%x,%x,%x,%x\n", + dci_decoded_output[0],dci_decoded_output[1],dci_decoded_output[2],dci_decoded_output[3], + dci_decoded_output[4],dci_decoded_output[5],dci_decoded_output[6],dci_decoded_output[7]); +#endif } if (crc==si_rnti) { @@ -2540,6 +2566,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, uint8_t format0_size_bits,format0_size_bytes; uint8_t format1_size_bits,format1_size_bytes; uint8_t format2_size_bits,format2_size_bytes; + uint8_t format2A_size_bits,format2A_size_bytes; switch (frame_parms->N_RB_DL) { case 6: @@ -2550,13 +2577,17 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, format0_size_bytes = sizeof(DCI0_1_5MHz_TDD_1_6_t); format1_size_bits = sizeof_DCI1_1_5MHz_TDD_t; format1_size_bytes = sizeof(DCI1_1_5MHz_TDD_t); - if (frame_parms->nb_antennas_tx == 2) { + if (frame_parms->nb_antennas_tx_eNB == 2) { format2_size_bits = sizeof_DCI2_1_5MHz_2A_TDD_t; format2_size_bytes = sizeof(DCI2_1_5MHz_2A_TDD_t); + format2A_size_bits = sizeof_DCI2A_1_5MHz_2A_TDD_t; + format2A_size_bytes = sizeof(DCI2A_1_5MHz_2A_TDD_t); } - else if (frame_parms->nb_antennas_tx == 4) { + else if (frame_parms->nb_antennas_tx_eNB == 4) { format2_size_bits = sizeof_DCI2_1_5MHz_4A_TDD_t; format2_size_bytes = sizeof(DCI2_1_5MHz_4A_TDD_t); + format2A_size_bits = sizeof_DCI2A_1_5MHz_4A_TDD_t; + format2A_size_bytes = sizeof(DCI2A_1_5MHz_4A_TDD_t); } } else { @@ -2566,13 +2597,17 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, format0_size_bytes = sizeof(DCI0_1_5MHz_FDD_t); format1_size_bits = sizeof_DCI1_1_5MHz_FDD_t; format1_size_bytes = sizeof(DCI1_1_5MHz_FDD_t); - if (frame_parms->nb_antennas_tx == 2) { + if (frame_parms->nb_antennas_tx_eNB == 2) { format2_size_bits = sizeof_DCI2_1_5MHz_2A_FDD_t; format2_size_bytes = sizeof(DCI2_1_5MHz_2A_FDD_t); + format2A_size_bits = sizeof_DCI2A_1_5MHz_2A_FDD_t; + format2A_size_bytes = sizeof(DCI2A_1_5MHz_2A_FDD_t); } - else if (frame_parms->nb_antennas_tx == 4) { + else if (frame_parms->nb_antennas_tx_eNB == 4) { format2_size_bits = sizeof_DCI2_1_5MHz_4A_FDD_t; format2_size_bytes = sizeof(DCI2_1_5MHz_4A_FDD_t); + format2A_size_bits = sizeof_DCI2A_1_5MHz_4A_FDD_t; + format2A_size_bytes = sizeof(DCI2A_1_5MHz_4A_FDD_t); } } break; @@ -2585,13 +2620,17 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, format0_size_bytes = sizeof(DCI0_5MHz_TDD_1_6_t); format1_size_bits = sizeof_DCI1_5MHz_TDD_t; format1_size_bytes = sizeof(DCI1_5MHz_TDD_t); - if (frame_parms->nb_antennas_tx == 2) { + if (frame_parms->nb_antennas_tx_eNB == 2) { format2_size_bits = sizeof_DCI2_5MHz_2A_TDD_t; format2_size_bytes = sizeof(DCI2_5MHz_2A_TDD_t); + format2A_size_bits = sizeof_DCI2A_5MHz_2A_TDD_t; + format2A_size_bytes = sizeof(DCI2A_5MHz_2A_TDD_t); } - else if (frame_parms->nb_antennas_tx == 4) { + else if (frame_parms->nb_antennas_tx_eNB == 4) { format2_size_bits = sizeof_DCI2_5MHz_4A_TDD_t; format2_size_bytes = sizeof(DCI2_5MHz_4A_TDD_t); + format2A_size_bits = sizeof_DCI2A_5MHz_4A_TDD_t; + format2A_size_bytes = sizeof(DCI2A_5MHz_4A_TDD_t); } } else { @@ -2601,13 +2640,17 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, format0_size_bytes = sizeof(DCI0_5MHz_FDD_t); format1_size_bits = sizeof_DCI1_5MHz_FDD_t; format1_size_bytes = sizeof(DCI1_5MHz_FDD_t); - if (frame_parms->nb_antennas_tx == 2) { + if (frame_parms->nb_antennas_tx_eNB == 2) { format2_size_bits = sizeof_DCI2_5MHz_2A_FDD_t; format2_size_bytes = sizeof(DCI2_5MHz_2A_FDD_t); + format2A_size_bits = sizeof_DCI2A_5MHz_2A_FDD_t; + format2A_size_bytes = sizeof(DCI2A_5MHz_2A_FDD_t); } - else if (frame_parms->nb_antennas_tx == 4) { + else if (frame_parms->nb_antennas_tx_eNB == 4) { format2_size_bits = sizeof_DCI2_5MHz_4A_FDD_t; format2_size_bytes = sizeof(DCI2_5MHz_4A_FDD_t); + format2A_size_bits = sizeof_DCI2A_5MHz_4A_FDD_t; + format2A_size_bytes = sizeof(DCI2A_5MHz_4A_FDD_t); } } break; @@ -2619,13 +2662,17 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, format0_size_bytes = sizeof(DCI0_10MHz_TDD_1_6_t); format1_size_bits = sizeof_DCI1_10MHz_TDD_t; format1_size_bytes = sizeof(DCI1_10MHz_TDD_t); - if (frame_parms->nb_antennas_tx == 2) { + if (frame_parms->nb_antennas_tx_eNB == 2) { format2_size_bits = sizeof_DCI2_10MHz_2A_TDD_t; format2_size_bytes = sizeof(DCI2_10MHz_2A_TDD_t); + format2A_size_bits = sizeof_DCI2A_10MHz_2A_TDD_t; + format2A_size_bytes = sizeof(DCI2A_10MHz_2A_TDD_t); } - else if (frame_parms->nb_antennas_tx == 4) { + else if (frame_parms->nb_antennas_tx_eNB == 4) { format2_size_bits = sizeof_DCI2_10MHz_4A_TDD_t; format2_size_bytes = sizeof(DCI2_10MHz_4A_TDD_t); + format2A_size_bits = sizeof_DCI2A_10MHz_4A_TDD_t; + format2A_size_bytes = sizeof(DCI2A_10MHz_4A_TDD_t); } } else { @@ -2635,13 +2682,17 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, format0_size_bytes = sizeof(DCI0_10MHz_FDD_t); format1_size_bits = sizeof_DCI1_10MHz_FDD_t; format1_size_bytes = sizeof(DCI1_10MHz_FDD_t); - if (frame_parms->nb_antennas_tx == 2) { + if (frame_parms->nb_antennas_tx_eNB == 2) { format2_size_bits = sizeof_DCI2_10MHz_2A_FDD_t; format2_size_bytes = sizeof(DCI2_10MHz_2A_FDD_t); + format2A_size_bits = sizeof_DCI2A_10MHz_2A_FDD_t; + format2A_size_bytes = sizeof(DCI2A_10MHz_2A_FDD_t); } - else if (frame_parms->nb_antennas_tx == 4) { + else if (frame_parms->nb_antennas_tx_eNB == 4) { format2_size_bits = sizeof_DCI2_10MHz_4A_FDD_t; format2_size_bytes = sizeof(DCI2_10MHz_4A_FDD_t); + format2A_size_bits = sizeof_DCI2A_10MHz_4A_FDD_t; + format2A_size_bytes = sizeof(DCI2A_10MHz_4A_FDD_t); } } break; @@ -2654,13 +2705,17 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, format0_size_bytes = sizeof(DCI0_20MHz_TDD_1_6_t); format1_size_bits = sizeof_DCI1_20MHz_TDD_t; format1_size_bytes = sizeof(DCI1_20MHz_TDD_t); - if (frame_parms->nb_antennas_tx == 2) { + if (frame_parms->nb_antennas_tx_eNB == 2) { format2_size_bits = sizeof_DCI2_20MHz_2A_TDD_t; format2_size_bytes = sizeof(DCI2_20MHz_2A_TDD_t); + format2A_size_bits = sizeof_DCI2A_20MHz_2A_TDD_t; + format2A_size_bytes = sizeof(DCI2A_20MHz_2A_TDD_t); } - else if (frame_parms->nb_antennas_tx == 4) { + else if (frame_parms->nb_antennas_tx_eNB == 4) { format2_size_bits = sizeof_DCI2_20MHz_4A_TDD_t; format2_size_bytes = sizeof(DCI2_20MHz_4A_TDD_t); + format2A_size_bits = sizeof_DCI2A_20MHz_4A_TDD_t; + format2A_size_bytes = sizeof(DCI2A_20MHz_4A_TDD_t); } } else { @@ -2670,13 +2725,17 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, format0_size_bytes = sizeof(DCI0_20MHz_FDD_t); format1_size_bits = sizeof_DCI1_20MHz_FDD_t; format1_size_bytes = sizeof(DCI1_20MHz_FDD_t); - if (frame_parms->nb_antennas_tx == 2) { + if (frame_parms->nb_antennas_tx_eNB == 2) { format2_size_bits = sizeof_DCI2_20MHz_2A_FDD_t; format2_size_bytes = sizeof(DCI2_20MHz_2A_FDD_t); + format2A_size_bits = sizeof_DCI2A_20MHz_2A_FDD_t; + format2A_size_bytes = sizeof(DCI2A_20MHz_2A_FDD_t); } - else if (frame_parms->nb_antennas_tx == 4) { + else if (frame_parms->nb_antennas_tx_eNB == 4) { format2_size_bits = sizeof_DCI2_20MHz_4A_FDD_t; format2_size_bytes = sizeof(DCI2_20MHz_4A_FDD_t); + format2A_size_bits = sizeof_DCI2A_20MHz_4A_FDD_t; + format2A_size_bytes = sizeof(DCI2A_20MHz_4A_FDD_t); } } break; @@ -2981,9 +3040,117 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, //#endif //ALL_AGGREGATION } + else if (tmode == 3) { + + + // Now check UE_SPEC format 2A_2A search spaces at aggregation 1 + dci_decoding_procedure0(lte_ue_pdcch_vars,0, + subframe, + dci_alloc, + eNB_id, + frame_parms, + mi, + SI_RNTI, + ra_rnti, + 0, + format1A, + format1A, + format2A, + format2A_size_bits, + format2A_size_bytes, + &dci_cnt, + &format0_found, + &format_c_found, + &CCEmap0, + &CCEmap1, + &CCEmap2); + if ((CCEmap0==0xffff)|| + ((format0_found==1)&&(format_c_found==1))) + return(dci_cnt); + if (dci_cnt>old_dci_cnt) + return(dci_cnt); + + // Now check UE_SPEC format 2 search spaces at aggregation 2 + dci_decoding_procedure0(lte_ue_pdcch_vars,0, + subframe, + dci_alloc, + eNB_id, + frame_parms, + mi, + SI_RNTI, + ra_rnti, + 1, + format1A, + format1A, + format2A, + format2A_size_bits, + format2A_size_bytes, + &dci_cnt, + &format0_found, + &format_c_found, + &CCEmap0, + &CCEmap1, + &CCEmap2); + if ((CCEmap0==0xffff)|| + ((format0_found==1)&&(format_c_found==1))) + return(dci_cnt); + if (dci_cnt>old_dci_cnt) + return(dci_cnt); + + // Now check UE_SPEC format 2_2A search spaces at aggregation 4 + dci_decoding_procedure0(lte_ue_pdcch_vars,0, + subframe, + dci_alloc, + eNB_id, + frame_parms, + mi, + SI_RNTI, + ra_rnti, + 2, + format1A, + format1A, + format2A, + format2A_size_bits, + format2A_size_bytes, + &dci_cnt, + &format0_found, + &format_c_found, + &CCEmap0, + &CCEmap1, + &CCEmap2); + if ((CCEmap0==0xffff)|| + ((format0_found==1)&&(format_c_found==1))) + return(dci_cnt); + if (dci_cnt>old_dci_cnt) + return(dci_cnt); + + //#ifdef ALL_AGGREGATION + // Now check UE_SPEC format 2_2A search spaces at aggregation 8 + dci_decoding_procedure0(lte_ue_pdcch_vars,0, + subframe, + dci_alloc, + eNB_id, + frame_parms, + mi, + SI_RNTI, + ra_rnti, + 3, + format1A, + format1A, + format2A, + format2A_size_bits, + format2A_size_bytes, + &dci_cnt, + &format0_found, + &format_c_found, + &CCEmap0, + &CCEmap1, + &CCEmap2); + //#endif + } else if (tmode == 4) { - // Now check UE_SPEC format 2_2A_M10PRB search spaces at aggregation 1 + // Now check UE_SPEC format 2_2A search spaces at aggregation 1 dci_decoding_procedure0(lte_ue_pdcch_vars,0, subframe, dci_alloc, @@ -3037,7 +3204,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, if (dci_cnt>old_dci_cnt) return(dci_cnt); - // Now check UE_SPEC format 2_2A_M10PRB search spaces at aggregation 4 + // Now check UE_SPEC format 2_2A search spaces at aggregation 4 dci_decoding_procedure0(lte_ue_pdcch_vars,0, subframe, dci_alloc, @@ -3065,7 +3232,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, return(dci_cnt); //#ifdef ALL_AGGREGATION - // Now check UE_SPEC format 2_2A_M10PRB search spaces at aggregation 8 + // Now check UE_SPEC format 2_2A search spaces at aggregation 8 dci_decoding_procedure0(lte_ue_pdcch_vars,0, subframe, dci_alloc, diff --git a/openair1/PHY/LTE_TRANSPORT/dci.h b/openair1/PHY/LTE_TRANSPORT/dci.h index c542b5e28a65346f66cbd096f0d76b097f37f8c7..255e7f7e8743a537c6aa4f82d29c12b6046ac3f4 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci.h +++ b/openair1/PHY/LTE_TRANSPORT/dci.h @@ -1532,122 +1532,501 @@ typedef struct DCI2_20MHz_4A_FDD DCI2_20MHz_4A_FDD_t; // ********************FORMAT 2A DCIs********************************* // ******************************************************************* -/// DCI Format Type 2A (5 MHz, TDD, 2 Antenna Ports, 39 bits) -struct __attribute__ ((__packed__)){ - /// Resource Allocation Header - uint32_t rah:1; - /// RB Assignment (ceil(log2(N_RB_DL/P)) bits) - uint32_t rballoc:13; - /// Power Control - uint32_t TPC:2; - /// Downlink Assignment Index - uint32_t dai:2; - /// HARQ Process - uint32_t harq_pid:4; - /// TB swap - uint32_t tb_swap:1; - /// Modulation and Coding Scheme and Redundancy Version 1 - uint32_t mcs1:5; - /// New Data Indicator 1 - uint32_t ndi1:1; - /// Redundancy version 1 - uint32_t rv1:2; - /// Modulation and Coding Scheme and Redundancy Version 2 - uint32_t mcs2:5; - /// New Data Indicator 2 - uint32_t ndi2:1; +/// DCI Format Type 2A (1.5 MHz, TDD, 2 Antenna Ports, 32 bits) +struct DCI2A_1_5MHz_2A_TDD { /// Redundancy version 2 uint32_t rv2:2; -} DCI2A_5MHz_2A_TDD; -#define sizeof_DCI2A_5MHz_2A_TDD_t 39 - -/// DCI Format Type 2A (5 MHz, TDD, 4 Antenna Ports, 45 bits) -typedef struct __attribute__ ((__packed__)){ - /// Resource Allocation Header - uint32_t rah:1; - /// RB Assignment (ceil(log2(N_RB_DL/P)) bits) - uint32_t rballoc:13; - /// Power Control - uint32_t TPC:2; - /// Downlink Assignment Index - uint32_t dai:2; - /// HARQ Process - uint32_t harq_pid:4; - /// TB swap - uint32_t tb_swap:1; - /// Modulation and Coding Scheme and Redundancy Version 1 - uint32_t mcs1:5; - /// New Data Indicator 1 - uint32_t ndi1:1; - /// Redundancy version 1 - uint32_t rv1:2; - /// Modulation and Coding Scheme and Redundancy Version 2 - uint32_t mcs2:5; /// New Data Indicator 2 uint32_t ndi2:1; - /// Redundancy version 2 - uint32_t rv2:2; - /// TPMI information for precoding - uint32_t tpmi:2; -} DCI2A_5MHz_4A_TDD_t; -#define sizeof_DCI2A_5MHz_4A_TDD_t 45 - -/// DCI Format Type 2A (5 MHz, FDD, 2 Antenna Ports, 36 bits) -struct __attribute__ ((__packed__)){ - /// Resource Allocation Header - uint32_t rah:1; - /// RB Assignment (ceil(log2(N_RB_DL/P)) bits) - uint32_t rballoc:13; - /// Power Control - uint32_t TPC:2; - /// HARQ Process - uint32_t harq_pid:3; + /// Modulation and Coding Scheme and Redundancy Version 2 + uint32_t mcs2:5; + /// Redundancy version 1 + uint32_t rv1:2; + /// New Data Indicator 1 + uint32_t ndi1:1; + /// Modulation and Coding Scheme and Redundancy Version 1 + uint32_t mcs1:5; /// TB swap uint32_t tb_swap:1; + /// HARQ Process + uint32_t harq_pid:4; + /// Downlink Assignment Index + uint32_t dai:2; + /// Power Control + uint32_t TPC:2; + /// RB Assignment (ceil(log2(N_RB_DL/P)) bits) + uint32_t rballoc:6; + /// Resource Allocation Header + uint32_t rah:1; +} __attribute__ ((__packed__)); + +#define sizeof_DCI2A_1_5MHz_2A_TDD_t 32 +typedef struct DCI2A_1_5MHz_2A_TDD DCI2A_1_5MHz_2A_TDD_t; + +/// DCI Format Type 2A (1.5 MHz, TDD, 4 Antenna Ports, 34 bits) +struct DCI2A_1_5MHz_4A_TDD { + uint64_t padding:30; + /// TPMI information for precoding + uint64_t tpmi:2; + /// Redundancy version 2 + uint64_t rv2:2; + /// New Data Indicator 2 + uint64_t ndi2:1; + /// Modulation and Coding Scheme and Redundancy Version 2 + uint64_t mcs2:5; + /// Redundancy version 1 + uint64_t rv1:2; + /// New Data Indicator 1 + uint64_t ndi1:1; /// Modulation and Coding Scheme and Redundancy Version 1 - uint32_t mcs1:5; + uint64_t mcs1:5; + /// TB swap + uint64_t tb_swap:1; + /// HARQ Process + uint64_t harq_pid:4; + /// Downlink Assignment Index + uint64_t dai:2; + /// Power Control + uint64_t TPC:2; + /// RB Assignment (ceil(log2(N_RB_DL/P)) bits) + uint64_t rballoc:6; + /// Resource Allocation Header + uint64_t rah:1; +} __attribute__ ((__packed__)); +#define sizeof_DCI2A_1_5MHz_4A_TDD_t 34 +typedef struct DCI2A_1_5MHz_4A_TDD DCI2A_1_5MHz_4A_TDD_t; + +/// DCI Format Type 2A (1.5 MHz, FDD, 2 Antenna Ports, 29 bits) +struct DCI2A_1_5MHz_2A_FDD { + uint32_t padding:18; + /// Redundancy version 2 + uint32_t rv2:2; + /// New Data Indicator 2 + uint32_t ndi2:1; + /// Modulation and Coding Scheme and Redundancy Version 2 + uint32_t mcs2:5; + /// Redundancy version 1 + uint32_t rv1:2; /// New Data Indicator 1 uint32_t ndi1:1; + /// Modulation and Coding Scheme and Redundancy Version 1 + uint32_t mcs1:5; + /// TB swap + uint32_t tb_swap:1; + /// HARQ Process + uint32_t harq_pid:3; + /// Power Control + uint32_t TPC:2; + /// RB Assignment (ceil(log2(N_RB_DL/P)) bits) + uint32_t rballoc:6; + /// Resource Allocation Header + uint32_t rah:1; +} __attribute__ ((__packed__)); +#define sizeof_DCI2A_1_5MHz_2A_FDD_t 29 +typedef struct DCI2A_1_5MHz_2A_FDD DCI2A_1_5MHz_2A_FDD_t; + +/// DCI Format Type 2A (1.5 MHz, FDD, 4 Antenna Ports, 31 bits) +struct DCI2A_1_5MHz_4A_FDD{ + uint32_t padding:1; + /// TPMI information for precoding + uint32_t tpmi:2; + /// Redundancy version 2 + uint32_t rv2:2; + /// New Data Indicator 2 + uint32_t ndi2:1; + /// Modulation and Coding Scheme and Redundancy Version 2 + uint32_t mcs2:5; /// Redundancy version 1 uint32_t rv1:2; + /// New Data Indicator 1 + uint32_t ndi1:1; + /// Modulation and Coding Scheme and Redundancy Version 1 + uint32_t mcs1:5; + /// TB swap + uint32_t tb_swap:1; + /// HARQ Process + uint32_t harq_pid:3; + /// Power Control + uint32_t TPC:2; + /// RB Assignment (ceil(log2(N_RB_DL/P)) bits) + uint32_t rballoc:6; + /// Resource Allocation Header + uint32_t rah:1; +} __attribute__ ((__packed__)); +#define sizeof_DCI2A_1_5MHz_4A_FDD_t 38 +typedef struct DCI2A_1_5MHz_4A_FDD DCI2A_1_5MHz_4A_FDD_t; + +/// DCI Format Type 2A (5 MHz, TDD, 2 Antenna Ports, 39 bits) +struct DCI2A_5MHz_2A_TDD { + uint64_t padding:25; + /// Redundancy version 2 + uint64_t rv2:2; + /// New Data Indicator 2 + uint64_t ndi2:1; /// Modulation and Coding Scheme and Redundancy Version 2 - uint32_t mcs2:5; + uint64_t mcs2:5; + /// Redundancy version 1 + uint64_t rv1:2; + /// New Data Indicator 1 + uint64_t ndi1:1; + /// Modulation and Coding Scheme and Redundancy Version 1 + uint64_t mcs1:5; + /// TB swap + uint64_t tb_swap:1; + /// HARQ Process + uint64_t harq_pid:4; + /// Downlink Assignment Index + uint64_t dai:2; + /// Power Control + uint64_t TPC:2; + /// RB Assignment (ceil(log2(N_RB_DL/P)) bits) + uint64_t rballoc:13; + /// Resource Allocation Header + uint64_t rah:1; +} __attribute__ ((__packed__)); +#define sizeof_DCI2A_5MHz_2A_TDD_t 39 +typedef struct DCI2A_5MHz_2A_TDD DCI2A_5MHz_2A_TDD_t; + +/// DCI Format Type 2A (5 MHz, TDD, 4 Antenna Ports, 41 bits) +struct DCI2A_5MHz_4A_TDD { + uint64_t padding:23; + /// TPMI information for precoding + uint64_t tpmi:2; + /// Redundancy version 2 + uint64_t rv2:2; /// New Data Indicator 2 - uint32_t ndi2:1; + uint64_t ndi2:1; + /// Modulation and Coding Scheme and Redundancy Version 2 + uint64_t mcs2:5; + /// Redundancy version 1 + uint64_t rv1:2; + /// New Data Indicator 1 + uint64_t ndi1:1; + /// Modulation and Coding Scheme and Redundancy Version 1 + uint64_t mcs1:5; + /// TB swap + uint64_t tb_swap:1; + /// HARQ Process + uint64_t harq_pid:4; + /// Downlink Assignment Index + uint64_t dai:2; + /// Power Control + uint64_t TPC:2; + /// RB Assignment (ceil(log2(N_RB_DL/P)) bits) + uint64_t rballoc:13; + /// Resource Allocation Header + uint64_t rah:1; +} __attribute__ ((__packed__)); +#define sizeof_DCI2A_5MHz_4A_TDD_t 41 +typedef struct DCI2A_5MHz_4A_TDD DCI2A_5MHz_4A_TDD_t; + +/// DCI Format Type 2A (5 MHz, FDD, 2 Antenna Ports, 36 bits) +struct DCI2A_5MHz_2A_FDD { + uint64_t padding:28; /// Redundancy version 2 - uint32_t rv2:2; -} DCI2A_5MHz_2A_M10PRB_FDD; + uint64_t rv2:2; + /// New Data Indicator 2 + uint64_t ndi2:1; + /// Modulation and Coding Scheme and Redundancy Version 2 + uint64_t mcs2:5; + /// Redundancy version 1 + uint64_t rv1:2; + /// New Data Indicator 1 + uint64_t ndi1:1; + /// Modulation and Coding Scheme and Redundancy Version 1 + uint64_t mcs1:5; + /// TB swap + uint64_t tb_swap:1; + /// HARQ Process + uint64_t harq_pid:3; + /// Power Control + uint64_t TPC:2; + /// RB Assignment (ceil(log2(N_RB_DL/P)) bits) + uint64_t rballoc:13; + /// Resource Allocation Header + uint64_t rah:1; +} __attribute__ ((__packed__)); #define sizeof_DCI2A_5MHz_2A_FDD_t 36 +typedef struct DCI2A_5MHz_2A_FDD DCI2A_5MHz_2A_FDD_t; -/// DCI Format Type 2A (5 MHz, TDD, 4 Antenna Ports, 38 bits) -struct __attribute__ ((__packed__)){ - /// Resource Allocation Header - uint32_t rah:1; - /// RB Assignment (ceil(log2(N_RB_DL/P)) bits) - uint32_t rballoc:13; - /// Power Control - uint32_t TPC:2; +/// DCI Format Type 2A (5 MHz, FDD, 4 Antenna Ports, 38 bits) +struct DCI2A_5MHz_4A_FDD { + uint64_t padding:26; + /// TPMI information for precoding + uint64_t tpmi:2; + /// Redundancy version 2 + uint64_t rv2:2; + /// New Data Indicator 2 + uint64_t ndi2:1; + /// Modulation and Coding Scheme and Redundancy Version 2 + uint64_t mcs2:5; + /// Redundancy version 1 + uint64_t rv1:2; + /// New Data Indicator 1 + uint64_t ndi1:1; + /// Modulation and Coding Scheme and Redundancy Version 1 + uint64_t mcs1:5; + /// TB swap + uint64_t tb_swap:1; /// HARQ Process - uint32_t harq_pid:3; + uint64_t harq_pid:3; + /// Power Control + uint64_t TPC:2; + /// RB Assignment (ceil(log2(N_RB_DL/P)) bits) + uint64_t rballoc:13; + /// Resource Allocation Header + uint64_t rah:1; +} __attribute__ ((__packed__)); +#define sizeof_DCI2A_5MHz_4A_FDD_t 38 +typedef struct DCI2A_5MHz_4A_FDD DCI2A_5MHz_4A_FDD_t; + +/// DCI Format Type 2A (10 MHz, TDD, 2 Antenna Ports, 39 bits) +struct DCI2A_10MHz_2A_TDD { + uint64_t padding:25; + /// Redundancy version 2 + uint64_t rv2:2; + /// New Data Indicator 2 + uint64_t ndi2:1; + /// Modulation and Coding Scheme and Redundancy Version 2 + uint64_t mcs2:5; + /// Redundancy version 1 + uint64_t rv1:2; + /// New Data Indicator 1 + uint64_t ndi1:1; + /// Modulation and Coding Scheme and Redundancy Version 1 + uint64_t mcs1:5; /// TB swap - uint32_t tb_swap:1; + uint64_t tb_swap:1; + /// HARQ Process + uint64_t harq_pid:4; + /// Downlink Assignment Index + uint64_t dai:2; + /// Power Control + uint64_t TPC:2; + /// RB Assignment (ceil(log2(N_RB_DL/P)) bits) + uint64_t rballoc:17; + /// Resource Allocation Header + uint64_t rah:1; +} __attribute__ ((__packed__)); +#define sizeof_DCI2A_10MHz_2A_TDD_t 39 +typedef struct DCI2A_10MHz_2A_TDD DCI2A_10MHz_2A_TDD_t; + +/// DCI Format Type 2A (10 MHz, TDD, 4 Antenna Ports, 41 bits) +struct DCI2A_10MHz_4A_TDD{ + uint64_t padding:23; + /// TPMI information for precoding + uint64_t tpmi:2; + /// Redundancy version 2 + uint64_t rv2:2; + /// New Data Indicator 2 + uint64_t ndi2:1; + /// Modulation and Coding Scheme and Redundancy Version 2 + uint64_t mcs2:5; + /// Redundancy version 1 + uint64_t rv1:2; + /// New Data Indicator 1 + uint64_t ndi1:1; /// Modulation and Coding Scheme and Redundancy Version 1 - uint32_t mcs1:5; + uint64_t mcs1:5; + /// TB swap + uint64_t tb_swap:1; + /// HARQ Process + uint64_t harq_pid:4; + /// Downlink Assignment Index + uint64_t dai:2; + /// Power Control + uint64_t TPC:2; + /// RB Assignment (ceil(log2(N_RB_DL/P)) bits) + uint64_t rballoc:17; + /// Resource Allocation Header + uint64_t rah:1; +} __attribute__ ((__packed__)); +#define sizeof_DCI2A_10MHz_4A_TDD_t 41 +typedef struct DCI2A_10MHz_4A_TDD DCI2A_10MHz_4A_TDD_t; + +/// DCI Format Type 2A (10 MHz, FDD, 2 Antenna Ports, 36 bits) +struct DCI2A_10MHz_2A_FDD { + uint64_t padding:28; + /// Redundancy version 2 + uint64_t rv2:2; + /// New Data Indicator 2 + uint64_t ndi2:1; + /// Modulation and Coding Scheme and Redundancy Version 2 + uint64_t mcs2:5; + /// Redundancy version 1 + uint64_t rv1:2; /// New Data Indicator 1 - uint32_t ndi1:1; + uint64_t ndi1:1; + /// Modulation and Coding Scheme and Redundancy Version 1 + uint64_t mcs1:5; + /// TB swap + uint64_t tb_swap:1; + /// HARQ Process + uint64_t harq_pid:3; + /// Power Control + uint64_t TPC:2; + /// RB Assignment (ceil(log2(N_RB_DL/P)) bits) + uint64_t rballoc:17; + /// Resource Allocation Header + uint64_t rah:1; +} __attribute__ ((__packed__)); +#define sizeof_DCI2A_10MHz_2A_FDD_t 36 +typedef struct DCI2A_10MHz_2A_FDD DCI2A_10MHz_2A_FDD_t; + +/// DCI Format Type 2A (10 MHz, FDD, 4 Antenna Ports, 38 bits) +struct DCI2A_10MHz_4A_FDD{ + uint64_t padding:26; + /// TPMI information for precoding + uint64_t tpmi:2; + /// Redundancy version 2 + uint64_t rv2:2; + /// New Data Indicator 2 + uint64_t ndi2:1; + /// Modulation and Coding Scheme and Redundancy Version 2 + uint64_t mcs2:5; /// Redundancy version 1 - uint32_t rv1:2; + uint64_t rv1:2; + /// New Data Indicator 1 + uint64_t ndi1:1; + /// Modulation and Coding Scheme and Redundancy Version 1 + uint64_t mcs1:5; + /// TB swap + uint64_t tb_swap:1; + /// HARQ Process + uint64_t harq_pid:3; + /// Power Control + uint64_t TPC:2; + /// RB Assignment (ceil(log2(N_RB_DL/P)) bits) + uint64_t rballoc:17; + /// Resource Allocation Header + uint64_t rah:1; +} __attribute__ ((__packed__)); +#define sizeof_DCI2A_10MHz_4A_FDD_t 38 +typedef struct DCI2A_10MHz_4A_FDD DCI2A_10MHz_4A_FDD_t; + +/// DCI Format Type 2A (20 MHz, TDD, 2 Antenna Ports, 51 bits) +struct DCI2A_20MHz_2A_TDD{ + uint64_t padding:13; + /// Redundancy version 2 + uint64_t rv2:2; + /// New Data Indicator 2 + uint64_t ndi2:1; /// Modulation and Coding Scheme and Redundancy Version 2 - uint32_t mcs2:5; + uint64_t mcs2:5; + /// Redundancy version 1 + uint64_t rv1:2; + /// New Data Indicator 1 + uint64_t ndi1:1; + /// Modulation and Coding Scheme and Redundancy Version 1 + uint64_t mcs1:5; + /// TB swap + uint64_t tb_swap:1; + /// HARQ Process + uint64_t harq_pid:4; + /// Downlink Assignment Index + uint64_t dai:2; + /// Power Control + uint64_t TPC:2; + /// RB Assignment (ceil(log2(N_RB_DL/P)) bits) + uint64_t rballoc:25; + /// Resource Allocation Header + uint64_t rah:1; +} __attribute__ ((__packed__)); +#define sizeof_DCI2A_20MHz_2A_TDD_t 51 +typedef struct DCI2A_20MHz_2A_TDD DCI2A_20MHz_2A_TDD_t; + +/// DCI Format Type 2A (20 MHz, TDD, 4 Antenna Ports, 53 bits) +struct DCI2A_20MHz_4A_TDD{ + uint64_t padding:11; + /// TPMI information for precoding + uint64_t tpmi:2; + /// Redundancy version 2 + uint64_t rv2:2; /// New Data Indicator 2 - uint32_t ndi2:1; + uint64_t ndi2:1; + /// Modulation and Coding Scheme and Redundancy Version 2 + uint64_t mcs2:5; + /// Redundancy version 1 + uint64_t rv1:2; + /// New Data Indicator 1 + uint64_t ndi1:1; + /// Modulation and Coding Scheme and Redundancy Version 1 + uint64_t mcs1:5; + /// TB swap + uint64_t tb_swap:1; + /// HARQ Process + uint64_t harq_pid:4; + /// Downlink Assignment Index + uint64_t dai:2; + /// Power Control + uint64_t TPC:2; + /// RB Assignment (ceil(log2(N_RB_DL/P)) bits) + uint64_t rballoc:25; + /// Resource Allocation Header + uint64_t rah:1; +} __attribute__ ((__packed__)); +#define sizeof_DCI2A_20MHz_4A_TDD_t 53 +typedef struct DCI2A_20MHz_4A_TDD DCI2A_20MHz_4A_TDD_t; + +/// DCI Format Type 2A (20 MHz, FDD, 2 Antenna Ports, 48 bits) +struct DCI2A_20MHz_2A_FDD { + uint64_t padding:16; /// Redundancy version 2 - uint32_t rv2:2; - /// TPMI information for precoding - uint32_t tpmi:2; -} DCI2A_5MHz_4A_FDD; -#define sizeof_DCI2A_5MHz_4A_FDD_t 38 + uint64_t rv2:2; + /// New Data Indicator 2 + uint64_t ndi2:1; + /// Modulation and Coding Scheme and Redundancy Version 2 + uint64_t mcs2:5; + /// Redundancy version 1 + uint64_t rv1:2; + /// New Data Indicator 1 + uint64_t ndi1:1; + /// Modulation and Coding Scheme and Redundancy Version 1 + uint64_t mcs1:5; + /// TB swap + uint64_t tb_swap:1; + /// HARQ Process + uint64_t harq_pid:3; + /// Power Control + uint64_t TPC:2; + /// RB Assignment (ceil(log2(N_RB_DL/P)) bits) + uint64_t rballoc:25; + /// Resource Allocation Header + uint64_t rah:1; +} __attribute__ ((__packed__)); +#define sizeof_DCI2A_20MHz_2A_FDD_t 48 +typedef struct DCI2A_20MHz_2A_FDD DCI2A_20MHz_2A_FDD_t; +/// DCI Format Type 2A (20 MHz, FDD, 4 Antenna Ports, 50 bits) +struct DCI2A_20MHz_4A_FDD { + uint64_t padding:14; + /// TPMI information for precoding + uint64_t tpmi:2; + /// Redundancy version 2 + uint64_t rv2:2; + /// New Data Indicator 2 + uint64_t ndi2:1; + /// Modulation and Coding Scheme and Redundancy Version 2 + uint64_t mcs2:5; + /// Redundancy version 1 + uint64_t rv1:2; + /// New Data Indicator 1 + uint64_t ndi1:1; + /// Modulation and Coding Scheme and Redundancy Version 1 + uint64_t mcs1:5; + /// TB swap + uint64_t tb_swap:1; + /// HARQ Process + uint64_t harq_pid:3; + /// Power Control + uint64_t TPC:2; + /// RB Assignment (ceil(log2(N_RB_DL/P)) bits) + uint64_t rballoc:25; + /// Resource Allocation Header + uint64_t rah:1; +} __attribute__ ((__packed__)); +#define sizeof_DCI2A_20MHz_4A_FDD_t 50 +typedef struct DCI2A_20MHz_4A_FDD DCI2A_20MHz_4A_FDD_t; // ******************************************************************* // ********************FORMAT 2B DCIs********************************* diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index 6ddc45dec2d7493a91270a2564a63ff56ebe5fe0..f8f51daaa22fc7c85d7e4b994bf1612cec9b560e 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -557,6 +557,7 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, uint8_t rv=0,rv1=0,rv2=0; uint8_t rah=0; uint8_t TPC=0; + LTE_DL_eNB_HARQ_t *dlsch0_harq,*dlsch1_harq; // printf("Generate eNB DCI, format %d, rnti %x (pdu %p)\n",dci_format,rnti,dci_pdu); @@ -571,6 +572,7 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, dlsch[0]->subframe_tx[subframe] = 1; + switch (frame_parms->N_RB_DL) { case 6: if (frame_type == TDD) { @@ -593,13 +595,15 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, // printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } - + + + dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; if (vrb_type == 0) - dlsch[0]->rb_alloc[0] = localRIV2alloc_LUT6[rballoc]; + dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT6[rballoc]; else - dlsch[0]->rb_alloc[0] = distRIV2alloc_LUT6[rballoc]; + dlsch0_harq->rb_alloc[0] = distRIV2alloc_LUT6[rballoc]; - dlsch[0]->nb_rb = RIV2nb_rb_LUT6[rballoc];//NPRB; + dlsch0_harq->nb_rb = RIV2nb_rb_LUT6[rballoc];//NPRB; RIV_max = RIV_max6; @@ -626,12 +630,13 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, // printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } + dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; if (vrb_type == 0) - dlsch[0]->rb_alloc[0] = localRIV2alloc_LUT25[rballoc]; + dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT25[rballoc]; else - dlsch[0]->rb_alloc[0] = distRIV2alloc_LUT25[rballoc]; + dlsch0_harq->rb_alloc[0] = distRIV2alloc_LUT25[rballoc]; - dlsch[0]->nb_rb = RIV2nb_rb_LUT25[rballoc];//NPRB; + dlsch0_harq->nb_rb = RIV2nb_rb_LUT25[rballoc];//NPRB; RIV_max = RIV_max25; break; case 50: @@ -655,15 +660,16 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, // printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } + dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; if (vrb_type == 0) { - dlsch[0]->rb_alloc[0] = localRIV2alloc_LUT50_0[rballoc]; - dlsch[0]->rb_alloc[1] = localRIV2alloc_LUT50_1[rballoc]; + dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT50_0[rballoc]; + dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT50_1[rballoc]; } else { - dlsch[0]->rb_alloc[0] = distRIV2alloc_LUT50_0[rballoc]; - dlsch[0]->rb_alloc[1] = distRIV2alloc_LUT50_1[rballoc]; + dlsch0_harq->rb_alloc[0] = distRIV2alloc_LUT50_0[rballoc]; + dlsch0_harq->rb_alloc[1] = distRIV2alloc_LUT50_1[rballoc]; } - dlsch[0]->nb_rb = RIV2nb_rb_LUT50[rballoc];//NPRB; + dlsch0_harq->nb_rb = RIV2nb_rb_LUT50[rballoc];//NPRB; RIV_max = RIV_max50; break; case 100: @@ -687,18 +693,18 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, } if (vrb_type == 0) { - dlsch[0]->rb_alloc[0] = localRIV2alloc_LUT100_0[rballoc]; - dlsch[0]->rb_alloc[1] = localRIV2alloc_LUT100_1[rballoc]; - dlsch[0]->rb_alloc[2] = localRIV2alloc_LUT100_2[rballoc]; - dlsch[0]->rb_alloc[3] = localRIV2alloc_LUT100_3[rballoc]; + dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT100_0[rballoc]; + dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT100_1[rballoc]; + dlsch0_harq->rb_alloc[2] = localRIV2alloc_LUT100_2[rballoc]; + dlsch0_harq->rb_alloc[3] = localRIV2alloc_LUT100_3[rballoc]; } else { - dlsch[0]->rb_alloc[0] = distRIV2alloc_LUT100_0[rballoc]; - dlsch[0]->rb_alloc[1] = distRIV2alloc_LUT100_1[rballoc]; - dlsch[0]->rb_alloc[2] = distRIV2alloc_LUT100_2[rballoc]; - dlsch[0]->rb_alloc[3] = distRIV2alloc_LUT100_3[rballoc]; + dlsch0_harq->rb_alloc[0] = distRIV2alloc_LUT100_0[rballoc]; + dlsch0_harq->rb_alloc[1] = distRIV2alloc_LUT100_1[rballoc]; + dlsch0_harq->rb_alloc[2] = distRIV2alloc_LUT100_2[rballoc]; + dlsch0_harq->rb_alloc[3] = distRIV2alloc_LUT100_3[rballoc]; } - dlsch[0]->nb_rb = RIV2nb_rb_LUT100[rballoc];//NPRB; + dlsch0_harq->nb_rb = RIV2nb_rb_LUT100[rballoc];//NPRB; RIV_max = RIV_max100; break; @@ -725,48 +731,48 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, LOG_E(PHY,"ERROR: Format 1A: rb_alloc (%x) > RIV_max (%x)\n",rballoc,RIV_max); return(-1); } - NPRB = dlsch[0]->nb_rb; + NPRB = dlsch0_harq->nb_rb; I_mcs = get_I_TBS(mcs); } if (NPRB==0) return(-1); - // printf("NPRB %d, nb_rb %d, ndi %d\n",NPRB,dlsch[0]->nb_rb,ndi); - dlsch[0]->harq_processes[harq_pid]->rvidx = rv; + // printf("NPRB %d, nb_rb %d, ndi %d\n",NPRB,dlsch0_harq->nb_rb,ndi); + dlsch0_harq->rvidx = rv; - dlsch[0]->harq_processes[harq_pid]->Nl = 1; - dlsch[0]->layer_index = 0; - dlsch[0]->harq_processes[harq_pid]->mimo_mode = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI; + dlsch0_harq->Nl = 1; + //dlsch0_harq->layer_index = 0; + dlsch0_harq->mimo_mode = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI; /* if ((rnti!=si_rnti)&&(rnti!=ra_rnti)&&(rnti!=p_rnti)) { //handle toggling for C-RNTI - if (dlsch[0]->harq_processes[harq_pid]->first_tx == 1) { + if (dlsch0_harq->first_tx == 1) { LOG_D(PHY,"First TX for TC-RNTI %x, clearing first_tx flag\n",rnti); - dlsch[0]->harq_processes[harq_pid]->first_tx=0; - dlsch[0]->harq_processes[harq_pid]->Ndi = 1; + dlsch0_harq->first_tx=0; + dlsch0_harq->Ndi = 1; } else { - if (ndi == dlsch[0]->harq_processes[harq_pid]->DCINdi) - dlsch[0]->harq_processes[harq_pid]->Ndi = 0; + if (ndi == dlsch0_harq->DCINdi) + dlsch0_harq->Ndi = 0; else - dlsch[0]->harq_processes[harq_pid]->Ndi = 1; + dlsch0_harq->Ndi = 1; } - dlsch[0]->harq_processes[harq_pid]->DCINdi=ndi; + dlsch0_harq->DCINdi=ndi; } else { - dlsch[0]->harq_processes[harq_pid]->Ndi = 1; + dlsch0_harq->Ndi = 1; } */ - dlsch[0]->dl_power_off = 1; + dlsch0_harq->dl_power_off = 1; - dlsch[0]->harq_processes[harq_pid]->mcs = mcs; - dlsch[0]->harq_processes[harq_pid]->TBS = TBStable[I_mcs][NPRB-1]; + dlsch0_harq->mcs = mcs; + dlsch0_harq->TBS = TBStable[I_mcs][NPRB-1]; - dlsch[0]->current_harq_pid = harq_pid; + dlsch[0]->current_harq_pid = harq_pid; dlsch[0]->harq_ids[subframe] = harq_pid; dlsch[0]->active = 1; @@ -775,8 +781,8 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, dlsch[0]->rnti = rnti; dlsch[0]->harq_ids[subframe] = harq_pid; - if (dlsch[0]->harq_processes[harq_pid]->round == 0) - dlsch[0]->harq_processes[harq_pid]->status = ACTIVE; + if (dlsch0_harq->round == 0) + dlsch0_harq->status = ACTIVE; break; case format1: @@ -860,30 +866,32 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, return(-1); } + dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; + // msg("DCI: Setting subframe_tx for subframe %d\n",subframe); dlsch[0]->subframe_tx[subframe] = 1; conv_rballoc(rah, rballoc,frame_parms->N_RB_DL, - dlsch[0]->rb_alloc); + dlsch0_harq->rb_alloc); - dlsch[0]->nb_rb = conv_nprb(rah, + dlsch0_harq->nb_rb = conv_nprb(rah, rballoc, frame_parms->N_RB_DL); - NPRB = dlsch[0]->nb_rb; + NPRB = dlsch0_harq->nb_rb; if (NPRB==0) return(-1); - dlsch[0]->harq_processes[harq_pid]->rvidx = rv; + dlsch0_harq->rvidx = rv; - dlsch[0]->harq_processes[harq_pid]->Nl = 1; - dlsch[0]->layer_index = 0; - dlsch[0]->harq_processes[harq_pid]->mimo_mode = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI; - dlsch[0]->dl_power_off = 1; + dlsch0_harq->Nl = 1; + // dlsch[0]->layer_index = 0; + dlsch0_harq->mimo_mode = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI; + dlsch0_harq->dl_power_off = 1; /* if (dlsch[0]->harq_processes[harq_pid]->first_tx == 1) { LOG_D(PHY,"First TX for C-RNTI %x, clearing first_tx flag, shouldn't happen!\n",rnti); @@ -904,12 +912,12 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, - if (dlsch[0]->harq_processes[harq_pid]->round == 0) { - dlsch[0]->harq_processes[harq_pid]->status = ACTIVE; + if (dlsch0_harq->round == 0) { + dlsch0_harq->status = ACTIVE; // printf("Setting DLSCH process %d to ACTIVE\n",harq_pid); // MCS and TBS don't change across HARQ rounds - dlsch[0]->harq_processes[harq_pid]->mcs = mcs; - dlsch[0]->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS(dlsch[0]->harq_processes[harq_pid]->mcs)][NPRB-1]; + dlsch0_harq->mcs = mcs; + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][NPRB-1]; } @@ -1159,6 +1167,9 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, dlsch1 = dlsch[0]; } + dlsch0_harq = dlsch0->harq_processes[harq_pid]; + dlsch1_harq = dlsch1->harq_processes[harq_pid]; + dlsch0->subframe_tx[subframe] = 1; dlsch0->current_harq_pid = harq_pid; @@ -1171,97 +1182,97 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, conv_rballoc(rah, rballoc, frame_parms->N_RB_DL, - dlsch0->rb_alloc); + dlsch0_harq->rb_alloc); - dlsch1->rb_alloc[0] = dlsch0->rb_alloc[0]; - dlsch0->nb_rb = conv_nprb(rah, - rballoc, - frame_parms->N_RB_DL); - dlsch1->nb_rb = dlsch0->nb_rb; + dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0]; + dlsch0_harq->nb_rb = conv_nprb(rah, + rballoc, + frame_parms->N_RB_DL); + dlsch1_harq->nb_rb = dlsch0_harq->nb_rb; - if (dlsch0->nb_rb == 0) + if (dlsch0_harq->nb_rb == 0) return(-1); - dlsch0->harq_processes[harq_pid]->mcs = mcs1; - dlsch1->harq_processes[harq_pid]->mcs = mcs2; - dlsch0->harq_processes[harq_pid]->rvidx = rv1; - dlsch1->harq_processes[harq_pid]->rvidx = rv2; + dlsch0_harq->mcs = mcs1; + dlsch1_harq->mcs = mcs2; + dlsch0_harq->rvidx = rv1; + dlsch1_harq->rvidx = rv2; // assume both TBs are active - dlsch0->harq_processes[harq_pid]->Nl = 1; - dlsch1->harq_processes[harq_pid]->Nl = 1; + dlsch0_harq->Nl = 1; + dlsch1_harq->Nl = 1; dlsch0->active = 1; dlsch1->active = 1; // check if either TB is disabled (see 36-213 V11.3 Section ) - if ((dlsch0->harq_processes[harq_pid]->rvidx == 1) && (dlsch0->harq_processes[harq_pid]->mcs == 0)) { + if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) { dlsch0->active = 0; } - if ((dlsch1->harq_processes[harq_pid]->rvidx == 1) && (dlsch1->harq_processes[harq_pid]->mcs == 0)) { + if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) { dlsch1->active = 0; } if (frame_parms->nb_antennas_tx == 2) { if (dlsch1->active == 1) { // both TBs are active - dlsch0->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS(dlsch0->harq_processes[harq_pid]->mcs)][dlsch0->nb_rb-1]; - dlsch1->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS(dlsch1->harq_processes[harq_pid]->mcs)][dlsch0->nb_rb-1]; + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; + dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch0_harq->nb_rb-1]; switch (tpmi) { case 0: - dlsch0->harq_processes[harq_pid]->mimo_mode = UNIFORM_PRECODING11; - dlsch1->harq_processes[harq_pid]->mimo_mode = UNIFORM_PRECODING1m1; - dlsch0->pmi_alloc = pmi_extend(frame_parms,0); - dlsch1->pmi_alloc = pmi_extend(frame_parms,1); + dlsch0_harq->mimo_mode = UNIFORM_PRECODING11; + dlsch1_harq->mimo_mode = UNIFORM_PRECODING1m1; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,0); + dlsch1_harq->pmi_alloc = pmi_extend(frame_parms,1); break; case 1: - dlsch0->harq_processes[harq_pid]->mimo_mode = UNIFORM_PRECODING1j; - dlsch1->harq_processes[harq_pid]->mimo_mode = UNIFORM_PRECODING1mj; - dlsch0->pmi_alloc = pmi_extend(frame_parms,2); - dlsch0->pmi_alloc = pmi_extend(frame_parms,3); + dlsch0_harq->mimo_mode = UNIFORM_PRECODING1j; + dlsch1_harq->mimo_mode = UNIFORM_PRECODING1mj; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,2); + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,3); break; case 2: // PUSCH precoding - dlsch0->harq_processes[harq_pid]->mimo_mode = DUALSTREAM_PUSCH_PRECODING; - dlsch0->pmi_alloc = DL_pmi_single; - dlsch1->harq_processes[harq_pid]->mimo_mode = DUALSTREAM_PUSCH_PRECODING; - dlsch1->pmi_alloc = DL_pmi_single; + dlsch0_harq->mimo_mode = DUALSTREAM_PUSCH_PRECODING; + dlsch0_harq->pmi_alloc = DL_pmi_single; + dlsch1_harq->mimo_mode = DUALSTREAM_PUSCH_PRECODING; + dlsch1_harq->pmi_alloc = DL_pmi_single; break; default: break; } - dlsch0->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS(dlsch0->harq_processes[harq_pid]->mcs)][dlsch0->nb_rb-1]; - dlsch1->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS(dlsch1->harq_processes[harq_pid]->mcs)][dlsch1->nb_rb-1]; + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; + dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1]; } else { // only one is active switch (tpmi) { case 0 : - dlsch0->harq_processes[harq_pid]->mimo_mode = ALAMOUTI; + dlsch0_harq->mimo_mode = ALAMOUTI; break; case 1: - dlsch0->harq_processes[harq_pid]->mimo_mode = UNIFORM_PRECODING11; - dlsch0->pmi_alloc = pmi_extend(frame_parms,0); + dlsch0_harq->mimo_mode = UNIFORM_PRECODING11; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,0); break; case 2: - dlsch0->harq_processes[harq_pid]->mimo_mode = UNIFORM_PRECODING1m1; - dlsch0->pmi_alloc = pmi_extend(frame_parms,1); + dlsch0_harq->mimo_mode = UNIFORM_PRECODING1m1; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,1); break; case 3: - dlsch0->harq_processes[harq_pid]->mimo_mode = UNIFORM_PRECODING1j; - dlsch0->pmi_alloc = pmi_extend(frame_parms,2); + dlsch0_harq->mimo_mode = UNIFORM_PRECODING1j; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,2); break; case 4: - dlsch0->harq_processes[harq_pid]->mimo_mode = UNIFORM_PRECODING1mj; - dlsch0->pmi_alloc = pmi_extend(frame_parms,3); + dlsch0_harq->mimo_mode = UNIFORM_PRECODING1mj; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,3); break; case 5: - dlsch0->harq_processes[harq_pid]->mimo_mode = PUSCH_PRECODING0; - dlsch0->pmi_alloc = DL_pmi_single; + dlsch0_harq->mimo_mode = PUSCH_PRECODING0; + dlsch0_harq->pmi_alloc = DL_pmi_single; break; case 6: - dlsch0->harq_processes[harq_pid]->mimo_mode = PUSCH_PRECODING1; - dlsch0->pmi_alloc = DL_pmi_single; + dlsch0_harq->mimo_mode = PUSCH_PRECODING1; + dlsch0_harq->pmi_alloc = DL_pmi_single; break; } - dlsch0->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS(dlsch0->harq_processes[harq_pid]->mcs)][dlsch0->nb_rb-1]; + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; } } else if (frame_parms->nb_antennas_tx == 4) { @@ -1269,18 +1280,404 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, } // reset HARQ process if this is the first transmission - if (dlsch0->harq_processes[harq_pid]->round == 0) { - dlsch0->harq_processes[harq_pid]->status = ACTIVE; + if (dlsch0_harq->round == 0) { + dlsch0_harq->status = ACTIVE; } - if (dlsch1->harq_processes[harq_pid]->round == 0) { - dlsch1->harq_processes[harq_pid]->status = ACTIVE; + if (dlsch1_harq->round == 0) { + dlsch1_harq->status = ACTIVE; } dlsch0->rnti = rnti; dlsch1->rnti = rnti; - dlsch0->dl_power_off = 0; - dlsch1->dl_power_off = 0; + dlsch0_harq->dl_power_off = 0; + dlsch1_harq->dl_power_off = 0; + + break; + + case format2A: + + switch (frame_parms->N_RB_DL) { + + case 6: + if (frame_parms->nb_antennas_tx == 2) { + if (frame_type == TDD) { + mcs1 = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->tb_swap; + } + else { + mcs1 = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->tb_swap; + } + } + else if (frame_parms->nb_antennas_tx == 4) { + if (frame_type == TDD) { + mcs1 = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->tpmi; + } + else { + mcs1 = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->tpmi; + } + } + else { + LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx); + } + break; + case 25: + if (frame_parms->nb_antennas_tx == 2) { + if (frame_type == TDD) { + mcs1 = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->tb_swap; + } + else { + mcs1 = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->tb_swap; + } + } + else if (frame_parms->nb_antennas_tx == 4) { + if (frame_type == TDD) { + mcs1 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->tpmi; + } + else { + mcs1 = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->tpmi; + } + } + else { + LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx); + } + break; + case 50: + if (frame_parms->nb_antennas_tx == 2) { + if (frame_type == TDD) { + mcs1 = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->tb_swap; + } + else { + mcs1 = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->tb_swap; + } + } + else if (frame_parms->nb_antennas_tx == 4) { + if (frame_type == TDD) { + mcs1 = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->tpmi; + } + else { + mcs1 = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->tpmi; + } + } + else { + LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx); + } + break; + + case 100: + if (frame_parms->nb_antennas_tx == 2) { + if (frame_type == TDD) { + mcs1 = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->tb_swap; + } + else { + mcs1 = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->tb_swap; + } + } + else if (frame_parms->nb_antennas_tx == 4) { + if (frame_type == TDD) { + mcs1 = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->tpmi; + } + else { + mcs1 = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->tpmi; + } + } + else { + LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx); + } + break; + } + + + if (harq_pid>=8) { + LOG_E(PHY,"ERROR: Format 2_2A: harq_pid >= 8\n"); + return(-1); + } + + + // Flip the TB to codeword mapping as described in 5.3.3.1.5 of 36-212 V11.3.0 + // note that we must set tbswap=0 in eNB scheduler if one TB is deactivated + if (tbswap == 0) { + dlsch0 = dlsch[0]; + dlsch1 = dlsch[1]; + } + else{ + dlsch0 = dlsch[1]; + dlsch1 = dlsch[0]; + } + + dlsch0_harq = dlsch0->harq_processes[harq_pid]; + dlsch1_harq = dlsch1->harq_processes[harq_pid]; + + dlsch0->subframe_tx[subframe] = 1; + + dlsch0->current_harq_pid = harq_pid; + dlsch1->current_harq_pid = harq_pid; + dlsch0->harq_ids[subframe] = harq_pid; + dlsch1->harq_ids[subframe] = harq_pid; + // printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe); + + + conv_rballoc(rah, + rballoc, + frame_parms->N_RB_DL, + dlsch0_harq->rb_alloc); + + dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0]; + dlsch0_harq->nb_rb = conv_nprb(rah, + rballoc, + frame_parms->N_RB_DL); + dlsch1_harq->nb_rb = dlsch0_harq->nb_rb; + + if (dlsch0_harq->nb_rb == 0) + return(-1); + + dlsch0_harq->mcs = mcs1; + dlsch1_harq->mcs = mcs2; + dlsch0_harq->rvidx = rv1; + dlsch1_harq->rvidx = rv2; + + // assume both TBs are active + dlsch0_harq->Nl = 1; + dlsch1_harq->Nl = 1; + dlsch0->active = 1; + dlsch1->active = 1; + + + // check if either TB is disabled (see 36-213 V11.3 Section ) + if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) { + dlsch0->active = 0; + } + if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) { + dlsch1->active = 0; + } + + dlsch0_harq->dl_power_off = 0; + dlsch1_harq->dl_power_off = 0; + + + if (frame_parms->nb_antennas_tx == 2) { + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; + dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch0_harq->nb_rb-1]; + if ((dlsch0->active==1) && (dlsch1->active==1)) { + dlsch0_harq->mimo_mode = LARGE_CDD; + dlsch1_harq->mimo_mode = LARGE_CDD; + dlsch0_harq->dl_power_off = 1; + dlsch1_harq->dl_power_off = 1; + } + else { + dlsch0_harq->mimo_mode = ALAMOUTI; + dlsch1_harq->mimo_mode = ALAMOUTI; + } + } + else if (frame_parms->nb_antennas_tx == 4) { // 4 antenna case + if ((dlsch0->active==1) && (dlsch1->active==1)) { + switch (tpmi) { + case 0: // one layer per transport block + dlsch0_harq->mimo_mode = LARGE_CDD; + dlsch1_harq->mimo_mode = LARGE_CDD; + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; + dlsch0_harq->dl_power_off = 1; + dlsch1_harq->dl_power_off = 1; + break; + case 1: // one-layers on TB 0, two on TB 1 + dlsch0_harq->mimo_mode = LARGE_CDD; + dlsch1_harq->mimo_mode = LARGE_CDD; + dlsch1_harq->Nl = 2; + dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1]; + dlsch0_harq->dl_power_off = 1; + dlsch1_harq->dl_power_off = 1; + break; + case 2: // two-layers on TB 0, two on TB 1 + dlsch0_harq->mimo_mode = LARGE_CDD; + dlsch1_harq->mimo_mode = LARGE_CDD; + dlsch0_harq->Nl = 2; + dlsch0_harq->dl_power_off = 1; + dlsch1_harq->dl_power_off = 1; + if (frame_parms->N_RB_DL <= 56) { + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][(dlsch0_harq->nb_rb<<1)-1]; + dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1]; + } + else { + LOG_E(PHY,"Add implementation of Table 7.1.7.2.2-1 for two-layer TBS conversion with N_RB_DL > 56\n"); + } + break; + case 3: // + LOG_E(PHY,"Illegal value (3) for TPMI in Format 2A DCI\n"); + break; + } + } + else if (dlsch0->active == 1) { + switch (tpmi) { + case 0: // one layer per transport block + dlsch0_harq->mimo_mode = ALAMOUTI; + dlsch1_harq->mimo_mode = ALAMOUTI; + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; + break; + case 1: // two-layers on TB 0 + dlsch0_harq->mimo_mode = LARGE_CDD; + dlsch0_harq->Nl = 2; + dlsch0_harq->dl_power_off = 1; + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][(dlsch0_harq->nb_rb<<1)-1]; + break; + case 2: // two-layers on TB 0, two on TB 1 + case 3: // + LOG_E(PHY,"Illegal value %d for TPMI in Format 2A DCI with one transport block enabled\n",tpmi); + break; + } + } + else if (dlsch1->active == 1) { + switch (tpmi) { + case 0: // one layer per transport block + dlsch0_harq->mimo_mode = ALAMOUTI; + dlsch1_harq->mimo_mode = ALAMOUTI; + dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1]; + break; + case 1: // two-layers on TB 0 + dlsch1_harq->mimo_mode = LARGE_CDD; + dlsch1_harq->Nl = 2; + dlsch1_harq->dl_power_off = 1; + dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1]; + break; + case 2: // two-layers on TB 0, two on TB 1 + case 3: // + LOG_E(PHY,"Illegal value %d for TPMI in Format 2A DCI with one transport block enabled\n",tpmi); + break; + } + } + } + else { + LOG_E(PHY,"Illegal number of antennas for eNB %d\n",frame_parms->nb_antennas_tx); + } + + // reset HARQ process if this is the first transmission + if ((dlsch0->active==1) && (dlsch0_harq->round == 0)) { + dlsch0_harq->status = ACTIVE; + } + if ((dlsch1->active==1) && (dlsch1_harq->round == 0)) { + dlsch1_harq->status = ACTIVE; + } + + dlsch0->rnti = rnti; + dlsch1->rnti = rnti; + + + // printf("eNB: Format 2A TBS0 %d, TBS1 %d\n",dlsch0_harq->TBS,dlsch1_harq->TBS); break; @@ -1380,6 +1777,7 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, dlsch0 = dlsch[0]; dlsch1 = dlsch[1]; + dlsch0->subframe_tx[subframe] = 1; dlsch0->current_harq_pid = harq_pid; @@ -1389,45 +1787,48 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, // printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe); + dlsch0_harq = dlsch0->harq_processes[harq_pid]; + dlsch1_harq = dlsch1->harq_processes[harq_pid]; + conv_rballoc(rah, rballoc, frame_parms->N_RB_DL, - dlsch0->rb_alloc); - dlsch1->rb_alloc[0] = dlsch0->rb_alloc[0]; + dlsch0_harq->rb_alloc); + dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0]; - dlsch0->nb_rb = conv_nprb(rah, + dlsch0_harq->nb_rb = conv_nprb(rah, rballoc, frame_parms->N_RB_DL); - dlsch1->nb_rb = dlsch0->nb_rb; + dlsch1_harq->nb_rb = dlsch0_harq->nb_rb; - dlsch0->harq_processes[harq_pid]->mcs = mcs1; - dlsch1->harq_processes[harq_pid]->mcs = mcs2; - dlsch0->harq_processes[harq_pid]->rvidx = rv1; - dlsch1->harq_processes[harq_pid]->rvidx = rv2; + dlsch0_harq->mcs = mcs1; + dlsch1_harq->mcs = mcs2; + dlsch0_harq->rvidx = rv1; + dlsch1_harq->rvidx = rv2; // check if either TB is disabled (see 36-213 V8.6 p. 26) - if ((dlsch0->harq_processes[harq_pid]->rvidx == 1) && (dlsch0->harq_processes[harq_pid]->mcs == 0)) - dlsch0->harq_processes[harq_pid]->status = DISABLED; + if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) + dlsch0_harq->status = DISABLED; - if ((dlsch1->harq_processes[harq_pid]->rvidx == 1) && (dlsch1->harq_processes[harq_pid]->mcs == 0)) - dlsch1->harq_processes[harq_pid]->status = DISABLED; + if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) + dlsch1_harq->status = DISABLED; - dlsch0->harq_processes[harq_pid]->Nl = 1; + dlsch0_harq->Nl = 1; - if (dlsch0->harq_processes[harq_pid]->round == 0) { - dlsch0->harq_processes[harq_pid]->status = ACTIVE; + if (dlsch0_harq->round == 0) { + dlsch0_harq->status = ACTIVE; // printf("Setting DLSCH process %d to ACTIVE\n",harq_pid); } - dlsch0->harq_processes[harq_pid]->mcs = mcs1; - if (dlsch0->nb_rb > 0) { - dlsch0->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS(dlsch0->harq_processes[harq_pid]->mcs)][dlsch0->nb_rb-1]; + dlsch0_harq->mcs = mcs1; + if (dlsch0_harq->nb_rb > 0) { + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; } else { - dlsch0->harq_processes[harq_pid]->TBS = 0; + dlsch0_harq->TBS = 0; } dlsch0->active = 1; @@ -1435,8 +1836,8 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, dlsch0->rnti = rnti; dlsch1->rnti = rnti; - dlsch0->dl_power_off = 1; - dlsch1->dl_power_off = 1; + dlsch0_harq->dl_power_off = 1; + dlsch1_harq->dl_power_off = 1; break; @@ -1544,56 +1945,58 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, dlsch1->harq_ids[subframe] = harq_pid; // printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe); + dlsch0_harq = dlsch0->harq_processes[harq_pid]; + dlsch1_harq = dlsch1->harq_processes[harq_pid]; conv_rballoc(rah, rballoc, frame_parms->N_RB_DL, - dlsch0->rb_alloc); - dlsch1->rb_alloc[0] = dlsch0->rb_alloc[0]; + dlsch0_harq->rb_alloc); + dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0]; - dlsch0->nb_rb = conv_nprb(rah, + dlsch0_harq->nb_rb = conv_nprb(rah, rballoc, frame_parms->N_RB_DL); - dlsch1->nb_rb = dlsch0->nb_rb; + dlsch1_harq->nb_rb = dlsch0_harq->nb_rb; - if (dlsch0->nb_rb == 0) + if (dlsch0_harq->nb_rb == 0) return(-1); - dlsch0->harq_processes[harq_pid]->mcs = mcs1; - dlsch1->harq_processes[harq_pid]->mcs = mcs2; - dlsch0->harq_processes[harq_pid]->rvidx = rv1; - dlsch1->harq_processes[harq_pid]->rvidx = rv2; + dlsch0_harq->mcs = mcs1; + dlsch1_harq->mcs = mcs2; + dlsch0_harq->rvidx = rv1; + dlsch1_harq->rvidx = rv2; // check if either TB is disabled (see 36-213 V8.6 p. 26) - if ((dlsch0->harq_processes[harq_pid]->rvidx == 1) && (dlsch0->harq_processes[harq_pid]->mcs == 0)) { + if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) { dlsch0->active = 0; } - if ((dlsch1->harq_processes[harq_pid]->rvidx == 1) && (dlsch1->harq_processes[harq_pid]->mcs == 0)) { + if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) { dlsch1->active = 0; } - if ((dlsch0->harq_processes[harq_pid]->round == 0) && (dlsch0->active == 1) ) { - dlsch0->harq_processes[harq_pid]->status = ACTIVE; - dlsch0->harq_processes[harq_pid]->mcs = mcs1; + if ((dlsch0_harq->round == 0) && (dlsch0->active == 1) ) { + dlsch0_harq->status = ACTIVE; + dlsch0_harq->mcs = mcs1; } - if ((dlsch1->harq_processes[harq_pid]->round == 0) && (dlsch1->active == 1) ) { - dlsch1->harq_processes[harq_pid]->status = ACTIVE; - dlsch1->harq_processes[harq_pid]->mcs = mcs2; + if ((dlsch1_harq->round == 0) && (dlsch1->active == 1) ) { + dlsch1_harq->status = ACTIVE; + dlsch1_harq->mcs = mcs2; } // check TPMI information to compute TBS if (frame_parms->nb_antennas_tx == 2) { if (dlsch1->active == 1) { // both TBs are active - dlsch0->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS(dlsch0->harq_processes[harq_pid]->mcs)][dlsch0->nb_rb-1]; - dlsch1->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS(dlsch1->harq_processes[harq_pid]->mcs)][dlsch0->nb_rb-1]; + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; + dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch0_harq->nb_rb-1]; } else { - dlsch0->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS(dlsch0->harq_processes[harq_pid]->mcs)][dlsch0->nb_rb-1]; + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; } } else if (frame_parms->nb_antennas_tx == 4) { @@ -1603,8 +2006,8 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, dlsch0->rnti = rnti; dlsch1->rnti = rnti; - dlsch0->dl_power_off = 1; - dlsch1->dl_power_off = 1; + dlsch0_harq->dl_power_off = 1; + dlsch1_harq->dl_power_off = 1; break; @@ -1713,45 +2116,48 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, // printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe); + dlsch0_harq = dlsch0->harq_processes[harq_pid]; + dlsch1_harq = dlsch1->harq_processes[harq_pid]; + conv_rballoc(rah, rballoc, frame_parms->N_RB_DL, - dlsch0->rb_alloc); - dlsch1->rb_alloc[0] = dlsch0->rb_alloc[0]; + dlsch0_harq->rb_alloc); + dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0]; - dlsch0->nb_rb = conv_nprb(rah, + dlsch0_harq->nb_rb = conv_nprb(rah, rballoc, frame_parms->N_RB_DL); - dlsch1->nb_rb = dlsch0->nb_rb; + dlsch1_harq->nb_rb = dlsch0_harq->nb_rb; - dlsch0->harq_processes[harq_pid]->mcs = mcs1; - dlsch1->harq_processes[harq_pid]->mcs = mcs2; - dlsch0->harq_processes[harq_pid]->rvidx = rv1; - dlsch1->harq_processes[harq_pid]->rvidx = rv2; + dlsch0_harq->mcs = mcs1; + dlsch1_harq->mcs = mcs2; + dlsch0_harq->rvidx = rv1; + dlsch1_harq->rvidx = rv2; // check if either TB is disabled (see 36-213 V8.6 p. 26) - if ((dlsch0->harq_processes[harq_pid]->rvidx == 1) && (dlsch0->harq_processes[harq_pid]->mcs == 0)) - dlsch0->harq_processes[harq_pid]->status = DISABLED; + if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) + dlsch0_harq->status = DISABLED; - if ((dlsch1->harq_processes[harq_pid]->rvidx == 1) && (dlsch1->harq_processes[harq_pid]->mcs == 0)) - dlsch1->harq_processes[harq_pid]->status = DISABLED; + if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) + dlsch1_harq->status = DISABLED; - dlsch0->harq_processes[harq_pid]->Nl = 1; + dlsch0_harq->Nl = 1; - if (dlsch0->harq_processes[harq_pid]->round == 0) { - dlsch0->harq_processes[harq_pid]->status = ACTIVE; + if (dlsch0_harq->round == 0) { + dlsch0_harq->status = ACTIVE; // printf("Setting DLSCH process %d to ACTIVE\n",harq_pid); } - dlsch0->harq_processes[harq_pid]->mcs = mcs1; - if (dlsch0->nb_rb > 0) { - dlsch0->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS(dlsch0->harq_processes[harq_pid]->mcs)][dlsch0->nb_rb-1]; + dlsch0_harq->mcs = mcs1; + if (dlsch0_harq->nb_rb > 0) { + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; } else { - dlsch0->harq_processes[harq_pid]->TBS = 0; + dlsch0_harq->TBS = 0; } dlsch0->active = 1; @@ -1759,8 +2165,8 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, dlsch0->rnti = rnti; dlsch1->rnti = rnti; - dlsch0->dl_power_off = 1; - dlsch1->dl_power_off = 1; + dlsch0_harq->dl_power_off = 1; + dlsch1_harq->dl_power_off = 1; break; @@ -1792,32 +2198,33 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, dlsch0->harq_ids[subframe] = harq_pid; //dlsch1->harq_ids[subframe] = harq_pid; // printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe); + dlsch0_harq = dlsch0->harq_processes[harq_pid]; conv_rballoc(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah, ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc,frame_parms->N_RB_DL, - dlsch0->rb_alloc); + dlsch0_harq->rb_alloc); //dlsch1->rb_alloc[0] = dlsch0->rb_alloc[0]; - dlsch0->nb_rb = conv_nprb(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah, + dlsch0_harq->nb_rb = conv_nprb(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah, ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc, frame_parms->N_RB_DL); //dlsch1->nb_rb = dlsch0->nb_rb; - dlsch0->harq_processes[harq_pid]->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs; - //dlsch1->harq_processes[harq_pid]->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs2; - dlsch0->harq_processes[harq_pid]->rvidx = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv; - //dlsch1->harq_processes[harq_pid]->rvidx = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv2; + dlsch0_harq->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs; + //dlsch1_harq->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs2; + dlsch0_harq->rvidx = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv; + //dlsch1_harq->rvidx = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv2; // check if either TB is disabled (see 36-213 V8.6 p. 26) --> only for format 2 and 2A - //if ((dlsch0->harq_processes[harq_pid]->rvidx == 1) && (dlsch0->harq_processes[harq_pid]->mcs == 0)) - // dlsch0->harq_processes[harq_pid]->status = DISABLED; + //if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) + // dlsch0_harq->status = DISABLED; - //if ((dlsch1->harq_processes[harq_pid]->rvidx == 1) && (dlsch1->harq_processes[harq_pid]->mcs == 0)) - // dlsch1->harq_processes[harq_pid]->status = DISABLED; + //if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) + // dlsch1_harq->status = DISABLED; - dlsch0->harq_processes[harq_pid]->Nl = 1; + dlsch0_harq->Nl = 1; //dlsch0->layer_index = tbswap; //dlsch1->layer_index = 1-tbswap; @@ -1827,30 +2234,30 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, switch (tpmi) { case 0 : - dlsch0->harq_processes[harq_pid]->mimo_mode = ALAMOUTI; + dlsch0_harq->mimo_mode = ALAMOUTI; break; case 1: - dlsch0->harq_processes[harq_pid]->mimo_mode = UNIFORM_PRECODING11; - dlsch0->pmi_alloc = pmi_extend(frame_parms,0); + dlsch0_harq->mimo_mode = UNIFORM_PRECODING11; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,0); break; case 2: - dlsch0->harq_processes[harq_pid]->mimo_mode = UNIFORM_PRECODING1m1; - dlsch0->pmi_alloc = pmi_extend(frame_parms,1); + dlsch0_harq->mimo_mode = UNIFORM_PRECODING1m1; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,1); break; case 3: - dlsch0->harq_processes[harq_pid]->mimo_mode = UNIFORM_PRECODING1j; - dlsch0->pmi_alloc = pmi_extend(frame_parms,2); + dlsch0_harq->mimo_mode = UNIFORM_PRECODING1j; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,2); break; case 4: - dlsch0->harq_processes[harq_pid]->mimo_mode = UNIFORM_PRECODING1mj; - dlsch0->pmi_alloc = pmi_extend(frame_parms,3); + dlsch0_harq->mimo_mode = UNIFORM_PRECODING1mj; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,3); break; case 5: - dlsch0->harq_processes[harq_pid]->mimo_mode = PUSCH_PRECODING0; - dlsch0->pmi_alloc = DL_pmi_single; + dlsch0_harq->mimo_mode = PUSCH_PRECODING0; + dlsch0_harq->pmi_alloc = DL_pmi_single; break; case 6: - dlsch0->harq_processes[harq_pid]->mimo_mode = PUSCH_PRECODING1; + dlsch0_harq->mimo_mode = PUSCH_PRECODING1; return(-1); break; } @@ -1859,20 +2266,20 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, if (frame_parms->mode1_flag == 1) - dlsch0->harq_processes[harq_pid]->mimo_mode = SISO; + dlsch0_harq->mimo_mode = SISO; - // dlsch0->harq_processes[harq_pid]->Ndi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi; - if (dlsch0->harq_processes[harq_pid]->round == 0) { - dlsch0->harq_processes[harq_pid]->status = ACTIVE; + // dlsch0_harq->Ndi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi; + if (dlsch0_harq->round == 0) { + dlsch0_harq->status = ACTIVE; // printf("Setting DLSCH process %d to ACTIVE\n",harq_pid); } - dlsch0->harq_processes[harq_pid]->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs; - if (dlsch0->nb_rb > 0) { - dlsch0->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS(dlsch0->harq_processes[harq_pid]->mcs)][dlsch0->nb_rb-1]; + dlsch0_harq->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs; + if (dlsch0_harq->nb_rb > 0) { + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; } else { - dlsch0->harq_processes[harq_pid]->TBS = 0; + dlsch0_harq->TBS = 0; } dlsch0->active = 1; @@ -1881,7 +2288,7 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, //dlsch1->rnti = rnti; // dlsch0->dl_power_off = 1; - dlsch0->dl_power_off = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->dl_power_off; + dlsch0_harq->dl_power_off = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->dl_power_off; //dlsch1->dl_power_off = 1; break; @@ -1894,22 +2301,22 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, if (dlsch0) { msg("dlsch0 eNB: dlsch0 %p\n",dlsch0); msg("dlsch0 eNB: rnti %x\n",dlsch0->rnti); - msg("dlsch0 eNB: NBRB %d\n",dlsch0->nb_rb); - msg("dlsch0 eNB: rballoc %x\n",dlsch0->rb_alloc[0]); + msg("dlsch0 eNB: NBRB %d\n",dlsch0_harq->nb_rb); + msg("dlsch0 eNB: rballoc %x\n",dlsch0_harq->rb_alloc[0]); msg("dlsch0 eNB: harq_pid %d\n",harq_pid); - msg("dlsch0 eNB: round %d\n",dlsch0->harq_processes[harq_pid]->round); - msg("dlsch0 eNB: rvidx %d\n",dlsch0->harq_processes[harq_pid]->rvidx); - msg("dlsch0 eNB: TBS %d (NPRB %d)\n",dlsch0->harq_processes[harq_pid]->TBS,NPRB); - msg("dlsch0 eNB: mcs %d\n",dlsch0->harq_processes[harq_pid]->mcs); + msg("dlsch0 eNB: round %d\n",dlsch0_harq->round); + msg("dlsch0 eNB: rvidx %d\n",dlsch0_harq->rvidx); + msg("dlsch0 eNB: TBS %d (NPRB %d)\n",dlsch0_harq->TBS,NPRB); + msg("dlsch0 eNB: mcs %d\n",dlsch0_harq->mcs); msg("dlsch0 eNB: tpmi %d\n",tpmi); - msg("dlsch0 eNB: mimo_mode %d\n",dlsch0->harq_processes[harq_pid]->mimo_mode); + msg("dlsch0 eNB: mimo_mode %d\n",dlsch0_harq->mimo_mode); } #endif // compute DL power control parameters - computeRhoA_eNB(pdsch_config_dedicated, dlsch[0]); + computeRhoA_eNB(pdsch_config_dedicated, dlsch[0],dlsch0_harq->dl_power_off); - computeRhoB_eNB(pdsch_config_dedicated,&(frame_parms->pdsch_config_common),frame_parms->nb_antennas_tx_eNB,dlsch[0]); + computeRhoB_eNB(pdsch_config_dedicated,&(frame_parms->pdsch_config_common),frame_parms->nb_antennas_tx_eNB,dlsch[0],dlsch0_harq->dl_power_off); return(0); } @@ -1917,6 +2324,7 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) { + switch (dci->format) { case format0: // This is an UL SCH allocation so nothing here, inform MAC @@ -2584,6 +2992,320 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) { } } + else + LOG_E(PHY,"Don't know how to handle TDD format 0 yet\n"); + break; + case format2A: + + if ((frame_parms->frame_type == TDD) && + (frame_parms->tdd_config>0)) { + if (frame_parms->nb_antennas_tx_eNB == 2) { + switch(frame_parms->N_RB_DL) { + case 6: + LOG_D(PHY,"DCI format2A 2 antennas (FDD 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n", + dci->rnti, + ((uint32_t*)&dci->dci_pdu)[0], + ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1, + ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2, + ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1, + ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2, + ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1, + ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2, + ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC, + ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai, + ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap + ); + break; + case 25: + LOG_D(PHY,"DCI format2A 2 antennas (FDD 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n", + dci->rnti, + ((uint64_t*)&dci->dci_pdu)[0], + ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah, + ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1, + ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2, + ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1, + ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2, + ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1, + ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2, + ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC, + ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai, + ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap); + break; + case 50: + LOG_D(PHY,"DCI format2A 2 antennas (FDD 10 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n", + dci->rnti, + ((uint64_t*)&dci->dci_pdu)[0], + ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah, + ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1, + ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2, + ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1, + ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2, + ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1, + ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2, + ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC, + ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai, + ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap); + break; + case 100: + LOG_D(PHY,"DCI format2A 2 antennas (FDD 20 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n", + dci->rnti, + ((uint64_t*)&dci->dci_pdu)[0], + ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah, + ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1, + ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2, + ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1, + ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2, + ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1, + ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2, + ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC, + ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai, + ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap); + break; + default: + LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL); + DevParam (frame_parms->N_RB_DL, 0, 0); + break; + } + } + else if (frame_parms->nb_antennas_tx_eNB == 4) { + switch(frame_parms->N_RB_DL) { + case 6: + LOG_D(PHY,"DCI format2A 4 antennas (TDD 1.5 MHz), rnti %x (%llx): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", + dci->rnti, + ((uint64_t*)&dci->dci_pdu)[0], + ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1, + ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2, + ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1, + ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2, + ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1, + ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2, + ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC, + ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai, + ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap, + ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi + ); + break; + case 25: + LOG_D(PHY,"DCI format2A 4 antennas (TDD 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", + dci->rnti, + ((uint64_t*)&dci->dci_pdu)[0], + ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah, + ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1, + ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2, + ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1, + ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2, + ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1, + ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2, + ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC, + ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai, + ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap, + ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi); + break; + case 50: + LOG_D(PHY,"DCI format2A 4 antennas (TDD 10 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", + dci->rnti, + ((uint64_t*)&dci->dci_pdu)[0], + ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah, + ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1, + ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2, + ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1, + ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2, + ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1, + ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2, + ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC, + ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai, + ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap, + ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi); + break; + case 100: + LOG_D(PHY,"DCI format2A 4 antennas (TDD 20 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", + dci->rnti, + ((uint64_t*)&dci->dci_pdu)[0], + ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah, + ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1, + ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2, + ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1, + ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2, + ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1, + ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2, + ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC, + ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai, + ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap, + ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi); + break; + default: + LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL); + DevParam (frame_parms->N_RB_DL, 0, 0); + break; + } + } + } + else if (frame_parms->frame_type == FDD) { + if (frame_parms->nb_antennas_tx_eNB == 2) { + switch(frame_parms->N_RB_DL) { + case 6: + LOG_D(PHY,"DCI format2A 2 antennas (FDD, 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n", + dci->rnti, + ((uint32_t*)&dci->dci_pdu)[0], + ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1, + ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2, + ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1, + ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2, + ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1, + ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2, + ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap, + ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC); + break; + case 25: + LOG_D(PHY,"DCI format2A 2 antennas (FDD, 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n", + dci->rnti, + ((uint64_t*)&dci->dci_pdu)[0], + ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah, + ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1, + ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2, + ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1, + ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2, + ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1, + ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2, + ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap, + ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC); + break; + case 50: + LOG_D(PHY,"DCI format2A 2 antennas (FDD, 10 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n", + dci->rnti, + ((uint64_t*)&dci->dci_pdu)[0], + ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah, + ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1, + ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2, + ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1, + ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2, + ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1, + ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2, + ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap, + ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC); + break; + case 100: + LOG_D(PHY,"DCI format2A 2 antennas (FDD, 20 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n", + dci->rnti, + ((uint64_t*)&dci->dci_pdu)[0], + ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah, + ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1, + ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2, + ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1, + ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2, + ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1, + ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2, + ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap, + ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC); + break; + default: + LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL); + DevParam (frame_parms->N_RB_DL, 0, 0); + break; + } + } + else if (frame_parms->nb_antennas_tx_eNB == 4) { + switch(frame_parms->N_RB_DL) { + + case 6: + LOG_D(PHY,"DCI format2A 4 antennas (FDD, 1.5 MHz), rnti %x (%llx): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n", + dci->rnti, + ((uint64_t*)&dci->dci_pdu)[0], + ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1, + ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2, + ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1, + ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2, + ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1, + ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2, + ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap, + ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi, + ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC); + break; + case 25: + LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n", + dci->rnti, + ((uint64_t*)&dci->dci_pdu)[0], + ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah, + ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1, + ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2, + ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1, + ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2, + ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1, + ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2, + ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap, + ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi, + ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC); + break; + case 50: + LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n", + dci->rnti, + ((uint64_t*)&dci->dci_pdu)[0], + ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah, + ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1, + ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2, + ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1, + ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2, + ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1, + ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2, + ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap, + ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi, + ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC); + break; + case 100: + LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n", + dci->rnti, + ((uint64_t*)&dci->dci_pdu)[0], + ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah, + ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1, + ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2, + ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1, + ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2, + ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1, + ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2, + ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap, + ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi, + ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC); + break; + default: + LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL); + DevParam (frame_parms->N_RB_DL, 0, 0); + break; + } + } + } + else LOG_E(PHY,"Don't know how to handle TDD format 0 yet\n"); break; @@ -2635,6 +3357,7 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, uint8_t TPC=0; uint8_t NPRB=0,tbswap=0,tpmi=0; LTE_UE_DLSCH_t *dlsch0=NULL,*dlsch1=NULL; + LTE_DL_UE_HARQ_t *dlsch0_harq,*dlsch1_harq; #ifdef DEBUG_DCI msg("dci_tools.c: Filling ue dlsch params -> rnti %x, dci_format %d\n",rnti,dci_format); @@ -2673,6 +3396,7 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)){ // harq_pid = 0; + dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; // see 36-212 V8.6.0 p. 45 NPRB = (TPC&1) + 2; } @@ -2682,17 +3406,17 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, LOG_E(PHY,"Format 1A: harq_pid > 1\n"); return(-1); } - + dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; NPRB = RIV2nb_rb_LUT6[rballoc]; - dlsch[0]->harq_processes[harq_pid]->delta_PUCCH = delta_PUCCH_lut[TPC&3]; + dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3]; } if (vrb_type == 0) - dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = localRIV2alloc_LUT6[rballoc]; + dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT6[rballoc]; else - dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = distRIV2alloc_LUT6[rballoc]; + dlsch0_harq->rb_alloc[0] = distRIV2alloc_LUT6[rballoc]; - dlsch[0]->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT6[rballoc];//NPRB; + dlsch0_harq->nb_rb = RIV2nb_rb_LUT6[rballoc];//NPRB; RIV_max = RIV_max6; break; @@ -2723,6 +3447,7 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, harq_pid = 0; // see 36-212 V8.6.0 p. 45 NPRB = (TPC&1) + 2; + dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; } else { @@ -2730,17 +3455,17 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, LOG_E(PHY,"Format 1A: harq_pid > 1\n"); return(-1); } - + dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; NPRB = RIV2nb_rb_LUT25[rballoc]; - dlsch[0]->harq_processes[harq_pid]->delta_PUCCH = delta_PUCCH_lut[TPC&3]; + dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3]; } if (vrb_type == 0) - dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = localRIV2alloc_LUT25[rballoc]; + dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT25[rballoc]; else - dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = distRIV2alloc_LUT25[rballoc]; + dlsch0_harq->rb_alloc[0] = distRIV2alloc_LUT25[rballoc]; - dlsch[0]->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT25[rballoc];//NPRB; + dlsch0_harq->nb_rb = RIV2nb_rb_LUT25[rballoc];//NPRB; RIV_max = RIV_max25; break; @@ -2768,6 +3493,7 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)){ // harq_pid = 0; + dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; // see 36-212 V8.6.0 p. 45 NPRB = (TPC&1) + 2; } @@ -2777,20 +3503,20 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, LOG_E(PHY,"Format 1A: harq_pid > 1\n"); return(-1); } - + dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; NPRB = RIV2nb_rb_LUT50[rballoc]; - dlsch[0]->harq_processes[harq_pid]->delta_PUCCH = delta_PUCCH_lut[TPC&3]; + dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3]; } if (vrb_type == 0) { - dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = localRIV2alloc_LUT50_0[rballoc]; - dlsch[0]->harq_processes[harq_pid]->rb_alloc[1] = localRIV2alloc_LUT50_1[rballoc]; + dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT50_0[rballoc]; + dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT50_1[rballoc]; } else { - dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = distRIV2alloc_LUT50_0[rballoc]; - dlsch[0]->harq_processes[harq_pid]->rb_alloc[1] = distRIV2alloc_LUT50_1[rballoc]; + dlsch0_harq->rb_alloc[0] = distRIV2alloc_LUT50_0[rballoc]; + dlsch0_harq->rb_alloc[1] = distRIV2alloc_LUT50_1[rballoc]; } - dlsch[0]->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT50[rballoc];//NPRB; + dlsch0_harq->nb_rb = RIV2nb_rb_LUT50[rballoc];//NPRB; RIV_max = RIV_max50; break; case 100: @@ -2817,6 +3543,7 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)){ // harq_pid = 0; + dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; // see 36-212 V8.6.0 p. 45 NPRB = (TPC&1) + 2; // toggle the ndi @@ -2827,24 +3554,24 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, LOG_E(PHY,"Format 1A: harq_pid > 1\n"); return(-1); } - + dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; NPRB = RIV2nb_rb_LUT100[rballoc]; - dlsch[0]->harq_processes[harq_pid]->delta_PUCCH = delta_PUCCH_lut[TPC&3]; + dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3]; } if (vrb_type == 0) { - dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = localRIV2alloc_LUT100_0[rballoc]; - dlsch[0]->harq_processes[harq_pid]->rb_alloc[1] = localRIV2alloc_LUT100_1[rballoc]; - dlsch[0]->harq_processes[harq_pid]->rb_alloc[2] = localRIV2alloc_LUT100_2[rballoc]; - dlsch[0]->harq_processes[harq_pid]->rb_alloc[3] = localRIV2alloc_LUT100_3[rballoc]; + dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT100_0[rballoc]; + dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT100_1[rballoc]; + dlsch0_harq->rb_alloc[2] = localRIV2alloc_LUT100_2[rballoc]; + dlsch0_harq->rb_alloc[3] = localRIV2alloc_LUT100_3[rballoc]; } else { - dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = distRIV2alloc_LUT100_0[rballoc]; - dlsch[0]->harq_processes[harq_pid]->rb_alloc[1] = distRIV2alloc_LUT100_1[rballoc]; - dlsch[0]->harq_processes[harq_pid]->rb_alloc[2] = distRIV2alloc_LUT100_2[rballoc]; - dlsch[0]->harq_processes[harq_pid]->rb_alloc[3] = distRIV2alloc_LUT100_3[rballoc]; + dlsch0_harq->rb_alloc[0] = distRIV2alloc_LUT100_0[rballoc]; + dlsch0_harq->rb_alloc[1] = distRIV2alloc_LUT100_1[rballoc]; + dlsch0_harq->rb_alloc[2] = distRIV2alloc_LUT100_2[rballoc]; + dlsch0_harq->rb_alloc[3] = distRIV2alloc_LUT100_3[rballoc]; } - dlsch[0]->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT100[rballoc];//NPRB; + dlsch0_harq->nb_rb = RIV2nb_rb_LUT100[rballoc];//NPRB; RIV_max = RIV_max100; break; } @@ -2866,31 +3593,31 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)){ // // toggle the ndi, always toggled for si,p and ra - ndi = 1-dlsch[0]->harq_processes[harq_pid]->DCINdi; + ndi = 1-dlsch0_harq->DCINdi; } dlsch[0]->current_harq_pid = harq_pid; // msg("Format 1A: harq_pid %d\n",harq_pid); - dlsch[0]->harq_processes[harq_pid]->rvidx = rv; - dlsch[0]->harq_processes[harq_pid]->Nl = 1; - dlsch[0]->layer_index = 0; - dlsch[0]->harq_processes[harq_pid]->mimo_mode = frame_parms->mode1_flag == 1 ?SISO : ALAMOUTI; - dlsch[0]->harq_processes[harq_pid]->dl_power_off = 1; //no power offset - - LOG_D(PHY,"UE (%x/%d): Subframe %d Format1A DCI: ndi %d, old_ndi %d (first tx %d) harq_status %d\n",dlsch[0]->rnti,harq_pid,subframe,ndi,dlsch[0]->harq_processes[harq_pid]->DCINdi, - dlsch[0]->harq_processes[harq_pid]->first_tx,dlsch[0]->harq_processes[harq_pid]->status); - - if ((ndi!=dlsch[0]->harq_processes[harq_pid]->DCINdi)|| // DCI has been toggled or this is the first transmission - (dlsch[0]->harq_processes[harq_pid]->first_tx==1)) { - dlsch[0]->harq_processes[harq_pid]->round = 0; - if (dlsch[0]->harq_processes[harq_pid]->first_tx==1) + dlsch0_harq->rvidx = rv; + dlsch0_harq->Nl = 1; + // dlsch[0]->layer_index = 0; + dlsch0_harq->mimo_mode = frame_parms->mode1_flag == 1 ?SISO : ALAMOUTI; + dlsch0_harq->dl_power_off = 1; //no power offset + + LOG_D(PHY,"UE (%x/%d): Subframe %d Format1A DCI: ndi %d, old_ndi %d (first tx %d) harq_status %d\n",dlsch[0]->rnti,harq_pid,subframe,ndi,dlsch0_harq->DCINdi, + dlsch0_harq->first_tx,dlsch0_harq->status); + + if ((ndi!=dlsch0_harq->DCINdi)|| // DCI has been toggled or this is the first transmission + (dlsch0_harq->first_tx==1)) { + dlsch0_harq->round = 0; + if (dlsch0_harq->first_tx==1) LOG_D(PHY,"[PDSCH %x/%d] Format 1A DCI First TX: Clearing flag\n"); - dlsch[0]->harq_processes[harq_pid]->first_tx = 0; + dlsch0_harq->first_tx = 0; } - dlsch[0]->harq_processes[harq_pid]->DCINdi = ndi; + dlsch0_harq->DCINdi = ndi; - dlsch[0]->harq_processes[harq_pid]->mcs = mcs; - dlsch[0]->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS(mcs)][NPRB-1]; + dlsch0_harq->mcs = mcs; + dlsch0_harq->TBS = TBStable[get_I_TBS(mcs)][NPRB-1]; dlsch[0]->rnti = rnti; dlsch0 = dlsch[0]; break; @@ -2975,18 +3702,19 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, LOG_E(PHY,"Format 1: harq_pid >= 8\n"); return(-1); } + dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; dlsch[0]->current_harq_pid = harq_pid; dlsch[0]->harq_ack[subframe].harq_id = harq_pid; - conv_rballoc(rah,rballoc,frame_parms->N_RB_DL,dlsch[0]->harq_processes[harq_pid]->rb_alloc); + conv_rballoc(rah,rballoc,frame_parms->N_RB_DL,dlsch0_harq->rb_alloc); - dlsch[0]->harq_processes[harq_pid]->nb_rb = conv_nprb(rah, + dlsch0_harq->nb_rb = conv_nprb(rah, rballoc, frame_parms->N_RB_DL); - NPRB = dlsch[0]->harq_processes[harq_pid]->nb_rb; + NPRB = dlsch0_harq->nb_rb; - // printf("test PDSCH NPRB %d, rah %d, rballoc %x, rballoc2 %x\n",NPRB,rah,rballoc,dlsch[0]->harq_processes[harq_pid]->rb_alloc[0]); + // printf("test PDSCH NPRB %d, rah %d, rballoc %x, rballoc2 %x\n",NPRB,rah,rballoc,dlsch0_harq->rb_alloc[0]); if (NPRB==0) { LOG_E(PHY,"Format 1: NPRB=0 (rballoc %x,mcs %d, frame_type %d N_RB_DL %d)\n",rballoc,mcs,frame_parms->frame_type,frame_parms->N_RB_DL); @@ -2994,31 +3722,31 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, } // printf("NPRB %d\n",NPRB); - dlsch[0]->harq_processes[harq_pid]->delta_PUCCH = delta_PUCCH_lut[TPC&3]; + dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3]; - dlsch[0]->harq_processes[harq_pid]->rvidx = rv; + dlsch0_harq->rvidx = rv; - dlsch[0]->harq_processes[harq_pid]->Nl = 1; - dlsch[0]->layer_index = 0; - dlsch[0]->harq_processes[harq_pid]->mimo_mode = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI; - dlsch[0]->harq_processes[harq_pid]->dl_power_off = 1; //no power offset + dlsch0_harq->Nl = 1; + // dlsch[0]->layer_index = 0; - LOG_D(PHY,"UE (%x/%d): Subframe %d Format1 DCI: ndi %d, old_ndi %d (first tx %d) harq_status %d\n",dlsch[0]->rnti,harq_pid,subframe,ndi,dlsch[0]->harq_processes[harq_pid]->DCINdi, - dlsch[0]->harq_processes[harq_pid]->first_tx,dlsch[0]->harq_processes[harq_pid]->status); + dlsch0_harq->dl_power_off = 1; //no power offset - // printf("Format1 DCI (UE, hard pid %d): ndi %d, old_ndi %d (first tx %d)\n",harq_pid,ndi,dlsch[0]->harq_processes[harq_pid]->DCINdi, - // dlsch[0]->harq_processes[harq_pid]->first_tx); + LOG_D(PHY,"UE (%x/%d): Subframe %d Format2 DCI: ndi %d, old_ndi %d (first tx %d) harq_status %d\n",dlsch[0]->rnti,harq_pid,subframe,ndi,dlsch0_harq->DCINdi, + dlsch0_harq->first_tx,dlsch0_harq->status); + + // printf("Format2 DCI (UE, hard pid %d): ndi %d, old_ndi %d (first tx %d)\n",harq_pid,ndi,dlsch0_harq->DCINdi, + // dlsch0_harq->first_tx); - if ((ndi!=dlsch[0]->harq_processes[harq_pid]->DCINdi)|| - (dlsch[0]->harq_processes[harq_pid]->first_tx==1)) { - dlsch[0]->harq_processes[harq_pid]->round=0; - dlsch[0]->harq_processes[harq_pid]->status = ACTIVE; - dlsch[0]->harq_processes[harq_pid]->DCINdi = ndi; - if (dlsch[0]->harq_processes[harq_pid]->first_tx==1) + if ((ndi!=dlsch0_harq->DCINdi)|| + (dlsch0_harq->first_tx==1)) { + dlsch0_harq->round=0; + dlsch0_harq->status = ACTIVE; + dlsch0_harq->DCINdi = ndi; + if (dlsch0_harq->first_tx==1) LOG_D(PHY,"[PDSCH %x/%d] Format 1 DCI First TX: Clearing flag\n"); - dlsch[0]->harq_processes[harq_pid]->first_tx = 0; + dlsch0_harq->first_tx = 0; } - else if (dlsch[0]->harq_processes[harq_pid]->status == SCH_IDLE) { // we got an Ndi = 0 for a previously decoded process, + else if (dlsch0_harq->status == SCH_IDLE) { // we got an Ndi = 0 for a previously decoded process, // this happens if either another harq process in the same // is NAK or an ACK was not received @@ -3029,16 +3757,18 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, // printf("Got NDI=0 for correctly decoded SDU (harq_pid %d) subframe %d\n",harq_pid,subframe); return(0); } - dlsch[0]->harq_processes[harq_pid]->mcs = mcs; + dlsch0_harq->mcs = mcs; - dlsch[0]->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS(mcs)][NPRB-1]; - // msg("test: MCS %d, NPRB %d, TBS %d\n",mcs,NPRB,dlsch[0]->harq_processes[harq_pid]->TBS); + dlsch0_harq->TBS = TBStable[get_I_TBS(mcs)][NPRB-1]; + // msg("test: MCS %d, NPRB %d, TBS %d\n",mcs,NPRB,dlsch0_harq->TBS); dlsch[0]->current_harq_pid = harq_pid; dlsch[0]->active = 1; dlsch[0]->rnti = rnti; + dlsch0_harq->mimo_mode = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI; + dlsch0 = dlsch[0]; break; @@ -3047,7 +3777,7 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, switch (frame_parms->N_RB_DL) { case 6: - if (frame_parms->nb_antennas_tx == 2) { + if (frame_parms->nb_antennas_tx_eNB == 2) { if (frame_type == TDD) { mcs1 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->mcs2; @@ -3069,7 +3799,7 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, tpmi = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->tpmi; } } - else if (frame_parms->nb_antennas_tx == 4) { + else if (frame_parms->nb_antennas_tx_eNB == 4) { if (frame_type == TDD) { mcs1 = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->mcs2; @@ -3092,11 +3822,11 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, } } else { - LOG_E(PHY,"UE: subframe %d Format2 DCI: unsupported number of TX antennas %d\n",subframe,frame_parms->nb_antennas_tx); + LOG_E(PHY,"UE: subframe %d Format2 DCI: unsupported number of TX antennas %d\n",subframe,frame_parms->nb_antennas_tx_eNB); } break; case 25: - if (frame_parms->nb_antennas_tx == 2) { + if (frame_parms->nb_antennas_tx_eNB == 2) { if (frame_type == TDD) { mcs1 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs2; @@ -3120,7 +3850,7 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, tpmi = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tpmi; } } - else if (frame_parms->nb_antennas_tx == 4) { + else if (frame_parms->nb_antennas_tx_eNB == 4) { if (frame_type == TDD) { mcs1 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->mcs2; @@ -3145,11 +3875,11 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, } } else { - LOG_E(PHY,"UE: Format2 DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx); + LOG_E(PHY,"UE: Format2 DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx_eNB); } break; case 50: - if (frame_parms->nb_antennas_tx == 2) { + if (frame_parms->nb_antennas_tx_eNB == 2) { if (frame_type == TDD) { mcs1 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->mcs2; @@ -3173,7 +3903,7 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, tpmi = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->tpmi; } } - else if (frame_parms->nb_antennas_tx == 4) { + else if (frame_parms->nb_antennas_tx_eNB == 4) { if (frame_type == TDD) { mcs1 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->mcs2; @@ -3198,12 +3928,12 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, } } else { - LOG_E(PHY,"UE: Format2 DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx); + LOG_E(PHY,"UE: Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx_eNB); } break; case 100: - if (frame_parms->nb_antennas_tx == 2) { + if (frame_parms->nb_antennas_tx_eNB == 2) { if (frame_type == TDD) { mcs1 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->mcs2; @@ -3227,7 +3957,7 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, tpmi = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->tpmi; } } - else if (frame_parms->nb_antennas_tx == 4) { + else if (frame_parms->nb_antennas_tx_eNB == 4) { if (frame_type == TDD) { mcs1 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->mcs2; @@ -3252,15 +3982,17 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, } } else { - LOG_E(PHY,"UE: Format2 DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx); + LOG_E(PHY,"UE: Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx_eNB); } break; } if (harq_pid>=8) { - LOG_E(PHY,"Format 2_2A_M10PRB: harq_pid >= 8\n"); + LOG_E(PHY,"Format 2_2A: harq_pid >= 8\n"); return(-1); } + + dlsch[0]->current_harq_pid = harq_pid; dlsch[0]->harq_ack[subframe].harq_id = harq_pid; @@ -3274,72 +4006,74 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, dlsch1 = dlsch[0]; } + dlsch0_harq = dlsch0->harq_processes[harq_pid]; + dlsch1_harq = dlsch1->harq_processes[harq_pid]; conv_rballoc(rah, rballoc, frame_parms->N_RB_DL, - dlsch0->harq_processes[harq_pid]->rb_alloc); - dlsch1->harq_processes[harq_pid]->rb_alloc[0] = dlsch0->harq_processes[harq_pid]->rb_alloc[0]; + dlsch0_harq->rb_alloc); + dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0]; - dlsch0->harq_processes[harq_pid]->nb_rb = conv_nprb(rah, + dlsch0_harq->nb_rb = conv_nprb(rah, rballoc, frame_parms->N_RB_DL); - dlsch1->harq_processes[harq_pid]->nb_rb = dlsch0->harq_processes[harq_pid]->nb_rb; + dlsch1_harq->nb_rb = dlsch0_harq->nb_rb; - dlsch0->harq_processes[harq_pid]->mcs = mcs1; + dlsch0_harq->mcs = mcs1; - dlsch0->harq_processes[harq_pid]->delta_PUCCH = delta_PUCCH_lut[TPC&3]; + dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3]; /* - if (dlsch0->harq_processes[harq_pid]->mcs>20) { - msg("dci_tools.c: mcs > 20 disabled for now (asked %d)\n",dlsch0->harq_processes[harq_pid]->mcs); + if (dlsch0_harq->mcs>20) { + msg("dci_tools.c: mcs > 20 disabled for now (asked %d)\n",dlsch0_harq->mcs); return(-1); } */ - dlsch1->harq_processes[harq_pid]->mcs = mcs2; - dlsch0->harq_processes[harq_pid]->rvidx = rv1; - dlsch1->harq_processes[harq_pid]->rvidx = rv2; + dlsch1_harq->mcs = mcs2; + dlsch0_harq->rvidx = rv1; + dlsch1_harq->rvidx = rv2; // check if either TB is disabled (see 36-213 V8.6 p. 26) - if ((dlsch0->harq_processes[harq_pid]->rvidx == 1) && (dlsch0->harq_processes[harq_pid]->mcs == 0)) { - dlsch0->harq_processes[harq_pid]->status = DISABLED; + if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) { + dlsch0_harq->status = DISABLED; } - if ((dlsch1->harq_processes[harq_pid]->rvidx == 1) && (dlsch1->harq_processes[harq_pid]->mcs == 0)) { - dlsch1->harq_processes[harq_pid]->status = DISABLED; + if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) { + dlsch1_harq->status = DISABLED; } - dlsch0->harq_processes[harq_pid]->Nl = 1; + dlsch0_harq->Nl = 1; - dlsch0->layer_index = tbswap; - dlsch1->layer_index = 1-tbswap; + // dlsch0->layer_index = tbswap; + // dlsch1->layer_index = 1-tbswap; switch (tpmi) { case 0 : - dlsch0->harq_processes[harq_pid]->mimo_mode = ALAMOUTI; + dlsch0_harq->mimo_mode = ALAMOUTI; break; case 1: - dlsch0->harq_processes[harq_pid]->mimo_mode = UNIFORM_PRECODING11; - dlsch0->harq_processes[harq_pid]->pmi_alloc = pmi_extend(frame_parms,0); + dlsch0_harq->mimo_mode = UNIFORM_PRECODING11; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,0); break; case 2: - dlsch0->harq_processes[harq_pid]->mimo_mode = UNIFORM_PRECODING1m1; - dlsch0->harq_processes[harq_pid]->pmi_alloc = pmi_extend(frame_parms,1); + dlsch0_harq->mimo_mode = UNIFORM_PRECODING1m1; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,1); break; case 3: - dlsch0->harq_processes[harq_pid]->mimo_mode = UNIFORM_PRECODING1j; - dlsch0->harq_processes[harq_pid]->pmi_alloc = pmi_extend(frame_parms,2); + dlsch0_harq->mimo_mode = UNIFORM_PRECODING1j; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,2); break; case 4: - dlsch0->harq_processes[harq_pid]->mimo_mode = UNIFORM_PRECODING1mj; - dlsch0->harq_processes[harq_pid]->pmi_alloc = pmi_extend(frame_parms,3); + dlsch0_harq->mimo_mode = UNIFORM_PRECODING1mj; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,3); break; case 5: - dlsch0->harq_processes[harq_pid]->mimo_mode = PUSCH_PRECODING0; + dlsch0_harq->mimo_mode = PUSCH_PRECODING0; // pmi stored from ulsch allocation routine - dlsch0->harq_processes[harq_pid]->pmi_alloc = dlsch0->pmi_alloc; - //LOG_I(PHY,"XXX using PMI %x\n",pmi2hex_2Ar1(dlsch0->harq_processes[harq_pid]->pmi_alloc)); + dlsch0_harq->pmi_alloc = dlsch0->pmi_alloc; + //LOG_I(PHY,"XXX using PMI %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc)); break; case 6: - dlsch0->harq_processes[harq_pid]->mimo_mode = PUSCH_PRECODING1; + dlsch0_harq->mimo_mode = PUSCH_PRECODING1; LOG_E(PHY,"Unsupported TPMI\n"); return(-1); break; @@ -3347,13 +4081,13 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, if (frame_parms->mode1_flag == 1) - dlsch0->harq_processes[harq_pid]->mimo_mode = SISO; - if (ndi1!=dlsch0->harq_processes[harq_pid]->DCINdi) { - dlsch0->harq_processes[harq_pid]->round = 0; - dlsch0->harq_processes[harq_pid]->status = ACTIVE; - dlsch0->harq_processes[harq_pid]->DCINdi = ndi1; + dlsch0_harq->mimo_mode = SISO; + if (ndi1!=dlsch0_harq->DCINdi) { + dlsch0_harq->round = 0; + dlsch0_harq->status = ACTIVE; + dlsch0_harq->DCINdi = ndi1; } - else if (dlsch0->harq_processes[harq_pid]->status == SCH_IDLE) { // we got an Ndi = 0 for a previously decoded process, + else if (dlsch0_harq->status == SCH_IDLE) { // we got an Ndi = 0 for a previously decoded process, // this happens if either another harq process in the same // is NAK or an ACK was not received @@ -3363,39 +4097,500 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, dlsch0->active = 0; return(0); } - dlsch0->harq_processes[harq_pid]->mcs = mcs1; - if (dlsch0->harq_processes[harq_pid]->nb_rb>1) { - dlsch0->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS(dlsch0->harq_processes[harq_pid]->mcs)][dlsch0->harq_processes[harq_pid]->nb_rb-1]; + dlsch0_harq->mcs = mcs1; + if (dlsch0_harq->nb_rb>1) { + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; } else - dlsch0->harq_processes[harq_pid]->TBS =0; + dlsch0_harq->TBS =0; /* - if (dlsch0->harq_processes[harq_pid]->mcs > 18) - printf("mcs %d, TBS %d\n",dlsch0->harq_processes[harq_pid]->mcs,dlsch0->harq_processes[harq_pid]->TBS); + if (dlsch0_harq->mcs > 18) + printf("mcs %d, TBS %d\n",dlsch0_harq->mcs,dlsch0_harq->TBS); */ - if (dlsch1->harq_processes[harq_pid]->DCINdi != ndi2) { - dlsch1->harq_processes[harq_pid]->round=0; - dlsch1->harq_processes[harq_pid]->status = ACTIVE; + if (dlsch1_harq->DCINdi != ndi2) { + dlsch1_harq->round=0; + dlsch1_harq->status = ACTIVE; } - dlsch1->harq_processes[harq_pid]->DCINdi = ndi2; - dlsch1->harq_processes[harq_pid]->mcs = mcs2; - if (dlsch1->harq_processes[harq_pid]->nb_rb>1) { - dlsch1->harq_processes[harq_pid]->TBS = TBStable[dlsch1->harq_processes[harq_pid]->mcs][dlsch1->harq_processes[harq_pid]->nb_rb-1]; + dlsch1_harq->DCINdi = ndi2; + dlsch1_harq->mcs = mcs2; + if (dlsch1_harq->nb_rb>1) { + dlsch1_harq->TBS = TBStable[dlsch1_harq->mcs][dlsch1_harq->nb_rb-1]; } else - dlsch1->harq_processes[harq_pid]->TBS = 0; + dlsch1_harq->TBS = 0; dlsch0->rnti = rnti; dlsch1->rnti = rnti; - dlsch0->harq_processes[harq_pid]->dl_power_off = 1; //no power offset - dlsch1->harq_processes[harq_pid]->dl_power_off = 1; //no power offset + dlsch0_harq->dl_power_off = 1; //no power offset + dlsch1_harq->dl_power_off = 1; //no power offset dlsch0->active = 1; dlsch1->active = 1; break; + + case format2A: + + switch (frame_parms->N_RB_DL) { + + case 6: + if (frame_parms->nb_antennas_tx_eNB == 2) { + if (frame_type == TDD) { + mcs1 = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rv2; + ndi1 = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->ndi2; + harq_pid = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->tb_swap; + } + else { + mcs1 = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rv2; + ndi1 = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->ndi2; + harq_pid = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->tb_swap; + } + } + else if (frame_parms->nb_antennas_tx_eNB == 4) { + if (frame_type == TDD) { + mcs1 = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->rv2; + ndi1 = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->ndi2; + harq_pid = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->tpmi; + } + else { + mcs1 = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->rv2; + ndi1 = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->ndi2; + harq_pid = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->tpmi; + } + } + else { + LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx_eNB); + } + break; + case 25: + if (frame_parms->nb_antennas_tx_eNB == 2) { + if (frame_type == TDD) { + mcs1 = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rv2; + ndi1 = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->ndi2; + harq_pid = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->tb_swap; + } + else { + mcs1 = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rv2; + ndi1 = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->ndi2; + harq_pid = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->tb_swap; + } + } + else if (frame_parms->nb_antennas_tx_eNB == 4) { + if (frame_type == TDD) { + mcs1 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rv2; + ndi1 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->ndi2; + harq_pid = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->tpmi; + } + else { + mcs1 = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rv2; + ndi1 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->ndi2; + harq_pid = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->tpmi; + } + } + else { + LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx_eNB); + } + break; + case 50: + if (frame_parms->nb_antennas_tx_eNB == 2) { + if (frame_type == TDD) { + mcs1 = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rv2; + ndi1 = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->ndi2; + harq_pid = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->tb_swap; + } + else { + mcs1 = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rv2; + ndi1 = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->ndi2; + harq_pid = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->tb_swap; + } + } + else if (frame_parms->nb_antennas_tx_eNB == 4) { + if (frame_type == TDD) { + mcs1 = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rv2; + ndi1 = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->ndi2; + harq_pid = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->tpmi; + } + else { + mcs1 = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rv2; + ndi1 = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->ndi2; + harq_pid = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->tpmi; + } + } + else { + LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx_eNB); + } + break; + + case 100: + if (frame_parms->nb_antennas_tx_eNB == 2) { + if (frame_type == TDD) { + mcs1 = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rv2; + ndi1 = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->ndi2; + harq_pid = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->tb_swap; + } + else { + mcs1 = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rv2; + ndi1 = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->ndi2; + harq_pid = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->tb_swap; + } + } + else if (frame_parms->nb_antennas_tx_eNB == 4) { + if (frame_type == TDD) { + mcs1 = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rv2; + ndi1 = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->ndi2; + harq_pid = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->tpmi; + } + else { + mcs1 = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rballoc; + rah = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rah; + rv1 = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rv2; + ndi1 = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->ndi2; + harq_pid = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->tpmi; + } + } + else { + LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx_eNB); + } + break; + } + + + if (harq_pid>=8) { + LOG_E(PHY,"ERROR: Format 2_2A: harq_pid >= 8\n"); + return(-1); + } + + // printf("UE: format 2A, rballoc=%x, harq_pid= %d, mcs1=%d,mcs2=%d, rv1=%d, rv2=%d, ndi1=%d, ndi2=%d\n",rballoc, harq_pid, mcs1,mcs2,rv1,rv2,ndi1,ndi2); + + // Flip the TB to codeword mapping as described in 5.3.3.1.5 of 36-212 V11.3.0 + // note that we must set tbswap=0 in eNB scheduler if one TB is deactivated + if (tbswap == 0) { + dlsch0 = dlsch[0]; + dlsch1 = dlsch[1]; + } + else{ + dlsch0 = dlsch[1]; + dlsch1 = dlsch[0]; + } + + dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; + dlsch1_harq = dlsch[1]->harq_processes[harq_pid]; + dlsch0->current_harq_pid = harq_pid; + dlsch1->current_harq_pid = harq_pid; + dlsch0->harq_ack[subframe].harq_id = harq_pid; + dlsch1->harq_ack[subframe].harq_id = harq_pid; + + conv_rballoc(rah,rballoc,frame_parms->N_RB_DL,dlsch0_harq->rb_alloc); + + dlsch0_harq->nb_rb = conv_nprb(rah, + rballoc, + frame_parms->N_RB_DL); + + dlsch1_harq->nb_rb = dlsch0_harq->nb_rb; + + NPRB = dlsch0_harq->nb_rb; + + + if (NPRB==0) { + LOG_E(PHY,"Format 2A: NPRB=0 (rballoc %x,mcs %d, frame_type %d N_RB_DL %d)\n",rballoc,mcs,frame_parms->frame_type,frame_parms->N_RB_DL); + return(-1); + } + + // printf("NPRB %d\n",NPRB); + dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3]; + dlsch1_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3]; + + dlsch0_harq->mcs = mcs1; + dlsch1_harq->mcs = mcs2; + + dlsch0_harq->rvidx = rv1; + dlsch1_harq->rvidx = rv2; + + + + dlsch0_harq->Nl = 1; + dlsch1_harq->Nl = 1; + // dlsch[0]->layer_index = 0; + + dlsch0_harq->dl_power_off = 1; //no power offset + dlsch1_harq->dl_power_off = 1; //no power offset + + dlsch0->active = dlsch1->active = 1; + + // check if either TB is disabled (see 36-213 V11.3 Section ) + if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) { + dlsch0->active = 0; + } + if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) { + dlsch1->active = 0; + } + + + // printf("Format2A DCI (UE, hard pid %d): ndi %d, old_ndi %d (first tx %d)\n",harq_pid,ndi,dlsch0_harq->DCINdi, + // dlsch0_harq->first_tx); + + if (dlsch0->active == 1) { + if ((ndi1!=dlsch0_harq->DCINdi)|| + (dlsch0_harq->first_tx==1)) { + dlsch0_harq->round=0; + dlsch0_harq->status = ACTIVE; + dlsch0_harq->DCINdi = ndi1; + if (dlsch0_harq->first_tx==1) + LOG_D(PHY,"[PDSCH %x/%d] Format 2A DCI First TX0: Clearing flag\n"); + } + else if (dlsch0_harq->status == SCH_IDLE) { // we got an Ndi = 0 for a previously decoded process, + // this happens if either another harq process in the same + // is NAK or an ACK was not received + + dlsch0->harq_ack[subframe].ack = 1; + dlsch0->harq_ack[subframe].harq_id = harq_pid; + dlsch0->harq_ack[subframe].send_harq_status = 1; + dlsch0->active = 0; + // printf("Got NDI=0 for correctly decoded SDU (harq_pid %d) subframe %d\n",harq_pid,subframe); + } + } + + if (dlsch1->active == 1) { + if ((ndi2!=dlsch1_harq->DCINdi)|| + (dlsch1_harq->first_tx==1)) { + dlsch1_harq->round=0; + dlsch1_harq->status = ACTIVE; + dlsch1_harq->DCINdi = ndi2; + + if (dlsch1_harq->first_tx==1) + LOG_D(PHY,"[PDSCH %x/%d] Format 2A DCI First TX1: Clearing flag\n",rnti,harq_pid); + } + else if (dlsch1_harq->status == SCH_IDLE) { // we got an Ndi = 0 for a previously decoded process, + // this happens if either another harq process in the same + // is NAK or an ACK was not received + + dlsch1->harq_ack[subframe].ack = 1; + dlsch1->harq_ack[subframe].harq_id = harq_pid; + dlsch1->harq_ack[subframe].send_harq_status = 1; + dlsch1->active = 0; + // printf("Got NDI=0 for correctly decoded SDU (harq_pid %d) subframe %d\n",harq_pid,subframe); + } + } + + if (frame_parms->nb_antennas_tx_eNB == 2) { + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; + dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch0_harq->nb_rb-1]; + if ((dlsch0->active==1) && (dlsch1->active==1)) { + dlsch0_harq->mimo_mode = LARGE_CDD; + dlsch1_harq->mimo_mode = LARGE_CDD; + dlsch0_harq->dl_power_off = 0; //apply power offset + dlsch1_harq->dl_power_off = 0; //apply power offset + } + else { + dlsch0_harq->mimo_mode = ALAMOUTI; + dlsch1_harq->mimo_mode = ALAMOUTI; + } + } + else if (frame_parms->nb_antennas_tx_eNB == 4) { // 4 antenna case + if ((dlsch0->active==1) && (dlsch1->active==1)) { + switch (tpmi) { + case 0: // one layer per transport block + dlsch0_harq->mimo_mode = LARGE_CDD; + dlsch1_harq->mimo_mode = LARGE_CDD; + dlsch0_harq->dl_power_off = 0; //apply power offset + dlsch1_harq->dl_power_off = 0; //apply power offset + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; + break; + case 1: // one-layers on TB 0, two on TB 1 + dlsch0_harq->mimo_mode = LARGE_CDD; + dlsch1_harq->mimo_mode = LARGE_CDD; + dlsch0_harq->dl_power_off = 0; //apply power offset + dlsch1_harq->dl_power_off = 0; //apply power offset + dlsch1_harq->Nl = 2; + dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1]; + break; + case 2: // two-layers on TB 0, two on TB 1 + dlsch0_harq->mimo_mode = LARGE_CDD; + dlsch1_harq->mimo_mode = LARGE_CDD; + dlsch0_harq->Nl = 2; + dlsch0_harq->dl_power_off = 0; //apply power offset + dlsch1_harq->dl_power_off = 0; //apply power offset + if (frame_parms->N_RB_DL <= 56) { + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][(dlsch0_harq->nb_rb<<1)-1]; + dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1]; + } + else { + LOG_E(PHY,"Add implementation of Table 7.1.7.2.2-1 for two-layer TBS conversion with N_RB_DL > 56\n"); + } + break; + case 3: // + LOG_E(PHY,"Illegal value (3) for TPMI in Format 2A DCI\n"); + break; + } + } + else if (dlsch0->active == 1) { + switch (tpmi) { + case 0: // one layer per transport block + dlsch0_harq->mimo_mode = ALAMOUTI; + dlsch1_harq->mimo_mode = ALAMOUTI; + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; + break; + case 1: // two-layers on TB 0 + dlsch0_harq->mimo_mode = LARGE_CDD; + dlsch0_harq->Nl = 2; + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][(dlsch0_harq->nb_rb<<1)-1]; + break; + case 2: // two-layers on TB 0, two on TB 1 + case 3: // + LOG_E(PHY,"Illegal value %d for TPMI in Format 2A DCI with one transport block enabled\n",tpmi); + break; + } + } + else if (dlsch1->active == 1) { + switch (tpmi) { + case 0: // one layer per transport block + dlsch0_harq->mimo_mode = ALAMOUTI; + dlsch1_harq->mimo_mode = ALAMOUTI; + dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1]; + break; + case 1: // two-layers on TB 0 + dlsch1_harq->mimo_mode = LARGE_CDD; + dlsch1_harq->Nl = 2; + dlsch0_harq->dl_power_off = 1; //apply power offset + dlsch1_harq->dl_power_off = 0; //apply power offset + dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1]; + break; + case 2: // two-layers on TB 0, two on TB 1 + case 3: // + LOG_E(PHY,"Illegal value %d for TPMI in Format 2A DCI with one transport block enabled\n",tpmi); + break; + } + } + } + else { + LOG_E(PHY,"Illegal number of antennas for eNB %d\n",frame_parms->nb_antennas_tx_eNB); + } + + // printf("Format 2A: NPRB=%d (rballoc %x,mcs1 %d, mcs2 %d, frame_type %d N_RB_DL %d,active %d/%d)\n",NPRB,rballoc,mcs1,mcs2,frame_parms->frame_type,frame_parms->N_RB_DL,dlsch0->active,dlsch1->active); + //printf("UE (%x/%d): Subframe %d Format2A DCI: ndi1 %d, old_ndi1 %d, ndi2 %d, old_ndi2 %d (first tx1 %d, first tx2 %d) harq_status1 %d, harq_status2 %d\n",dlsch0->rnti,harq_pid,subframe,ndi,dlsch0_harq->DCINdi, + // dlsch0_harq->first_tx,dlsch1_harq->first_tx,dlsch0_harq->status,dlsch1_harq->status); + //printf("TBS0 %d, TBS1 %d\n",dlsch0_harq->TBS,dlsch1_harq->TBS); + + + break; + case format1E_2A_M10PRB: harq_pid = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->harq_pid; @@ -3419,41 +4614,42 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, */ dlsch0 = dlsch[0]; + dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; conv_rballoc(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah, ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc,frame_parms->N_RB_DL, - dlsch0->harq_processes[harq_pid]->rb_alloc); - //dlsch1->harq_processes[harq_pid]->rb_alloc[0] = dlsch0->harq_processes[harq_pid]->rb_alloc[0]; + dlsch0_harq->rb_alloc); + //dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0]; - dlsch0->harq_processes[harq_pid]->nb_rb = conv_nprb(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah, + dlsch0_harq->nb_rb = conv_nprb(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah, ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc, frame_parms->N_RB_DL); - //dlsch1->harq_processes[harq_pid]->nb_rb = dlsch0->harq_processes[harq_pid]->nb_rb; + //dlsch1_harq->nb_rb = dlsch0_harq->nb_rb; - dlsch0->harq_processes[harq_pid]->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs; - dlsch0->harq_processes[harq_pid]->delta_PUCCH = delta_PUCCH_lut[((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->TPC&3]; + dlsch0_harq->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs; + dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->TPC&3]; /* - if (dlsch0->harq_processes[harq_pid]->mcs>20) { - msg("dci_tools.c: mcs > 20 disabled for now (asked %d)\n",dlsch0->harq_processes[harq_pid]->mcs); + if (dlsch0_harq->mcs>20) { + msg("dci_tools.c: mcs > 20 disabled for now (asked %d)\n",dlsch0_harq->mcs); return(-1); } */ - //dlsch1->harq_processes[harq_pid]->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs2; - dlsch0->harq_processes[harq_pid]->rvidx = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv; - //dlsch1->harq_processes[harq_pid]->rvidx = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv2; + //dlsch1_harq->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs2; + dlsch0_harq->rvidx = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv; + //dlsch1_harq->rvidx = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv2; // check if either TB is disabled (see 36-213 V8.6 p. 26) - if ((dlsch0->harq_processes[harq_pid]->rvidx == 1) && (dlsch0->harq_processes[harq_pid]->mcs == 0)) { - dlsch0->harq_processes[harq_pid]->status = DISABLED; + if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) { + dlsch0_harq->status = DISABLED; } - //if ((dlsch1->harq_processes[harq_pid]->rvidx == 1) && (dlsch1->harq_processes[harq_pid]->mcs == 0)) { - //dlsch1->harq_processes[harq_pid]->status = DISABLED; + //if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) { + //dlsch1_harq->status = DISABLED; //} - dlsch0->harq_processes[harq_pid]->Nl = 1; + dlsch0_harq->Nl = 1; //dlsch0->layer_index = tbswap; //dlsch1->layer_index = 1-tbswap; @@ -3465,32 +4661,32 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, switch (tpmi) { case 0 : - dlsch0->harq_processes[harq_pid]->mimo_mode = ALAMOUTI; + dlsch0_harq->mimo_mode = ALAMOUTI; break; case 1: - dlsch0->harq_processes[harq_pid]->mimo_mode = UNIFORM_PRECODING11; - dlsch0->harq_processes[harq_pid]->pmi_alloc = pmi_extend(frame_parms,0); + dlsch0_harq->mimo_mode = UNIFORM_PRECODING11; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,0); break; case 2: - dlsch0->harq_processes[harq_pid]->mimo_mode = UNIFORM_PRECODING1m1; - dlsch0->harq_processes[harq_pid]->pmi_alloc = pmi_extend(frame_parms,1); + dlsch0_harq->mimo_mode = UNIFORM_PRECODING1m1; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,1); break; case 3: - dlsch0->harq_processes[harq_pid]->mimo_mode = UNIFORM_PRECODING1j; - dlsch0->harq_processes[harq_pid]->pmi_alloc = pmi_extend(frame_parms,2); + dlsch0_harq->mimo_mode = UNIFORM_PRECODING1j; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,2); break; case 4: - dlsch0->harq_processes[harq_pid]->mimo_mode = UNIFORM_PRECODING1mj; - dlsch0->harq_processes[harq_pid]->pmi_alloc = pmi_extend(frame_parms,3); + dlsch0_harq->mimo_mode = UNIFORM_PRECODING1mj; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,3); break; case 5: - dlsch0->harq_processes[harq_pid]->mimo_mode = PUSCH_PRECODING0; + dlsch0_harq->mimo_mode = PUSCH_PRECODING0; // pmi stored from ulsch allocation routine - dlsch0->harq_processes[harq_pid]->pmi_alloc = dlsch0->pmi_alloc; - //LOG_I(PHY,"XXX using PMI %x\n",pmi2hex_2Ar1(dlsch0->harq_processes[harq_pid]->pmi_alloc)); + dlsch0_harq->pmi_alloc = dlsch0->pmi_alloc; + //LOG_I(PHY,"XXX using PMI %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc)); break; case 6: - dlsch0->harq_processes[harq_pid]->mimo_mode = PUSCH_PRECODING1; + dlsch0_harq->mimo_mode = PUSCH_PRECODING1; LOG_E(PHY,"Unsupported TPMI\n"); return(-1); break; @@ -3498,15 +4694,15 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, if (frame_parms->mode1_flag == 1) - dlsch0->harq_processes[harq_pid]->mimo_mode = SISO; + dlsch0_harq->mimo_mode = SISO; - if (dlsch0->harq_processes[harq_pid]->DCINdi != ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi) { + if (dlsch0_harq->DCINdi != ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi) { - dlsch0->harq_processes[harq_pid]->round = 0; - dlsch0->harq_processes[harq_pid]->status = ACTIVE; + dlsch0_harq->round = 0; + dlsch0_harq->status = ACTIVE; } - else if (dlsch0->harq_processes[harq_pid]->status == SCH_IDLE) { // we got an Ndi = 0 for a previously decoded process, + else if (dlsch0_harq->status == SCH_IDLE) { // we got an Ndi = 0 for a previously decoded process, // this happens if either another harq process in the same // is NAK or an ACK was not received @@ -3517,21 +4713,21 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, return(0); } - dlsch0->harq_processes[harq_pid]->DCINdi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi; - dlsch0->harq_processes[harq_pid]->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs; - if (dlsch0->harq_processes[harq_pid]->nb_rb>1) { - dlsch0->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS(dlsch0->harq_processes[harq_pid]->mcs)][dlsch0->harq_processes[harq_pid]->nb_rb-1]; + dlsch0_harq->DCINdi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi; + dlsch0_harq->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs; + if (dlsch0_harq->nb_rb>1) { + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; } else - dlsch0->harq_processes[harq_pid]->TBS =0; + dlsch0_harq->TBS =0; dlsch0->rnti = rnti; //dlsch1->rnti = rnti; dlsch0->active = 1; //dlsch1->active = 1; - dlsch0->harq_processes[harq_pid]->dl_power_off = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->dl_power_off; - //dlsch1->harq_processes[harq_pid]->dl_power_off = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->dl_power_off; + dlsch0_harq->dl_power_off = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->dl_power_off; + //dlsch1_harq->dl_power_off = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->dl_power_off; break; @@ -3545,22 +4741,22 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, #ifdef DEBUG_DCI if (dlsch[0]) { msg("PDSCH dlsch0 UE: rnti %x\n",dlsch[0]->rnti); - msg("PDSCH dlsch0 UE: NBRB %d\n",dlsch[0]->harq_processes[harq_pid]->nb_rb); - msg("PDSCH dlsch0 UE: rballoc %x\n",dlsch[0]->harq_processes[harq_pid]->rb_alloc[0]); + msg("PDSCH dlsch0 UE: NBRB %d\n",dlsch0_harq->nb_rb); + msg("PDSCH dlsch0 UE: rballoc %x\n",dlsch0_harq->rb_alloc[0]); msg("PDSCH dlsch0 UE: harq_pid %d\n",harq_pid); - msg("PDSCH dlsch0 UE: DCINdi %d\n",dlsch[0]->harq_processes[harq_pid]->DCINdi); - msg("PDSCH dlsch0 UE: rvidx %d\n",dlsch[0]->harq_processes[harq_pid]->rvidx); - msg("PDSCH dlsch0 UE: TBS %d\n",dlsch[0]->harq_processes[harq_pid]->TBS); - msg("PDSCH dlsch0 UE: mcs %d\n",dlsch[0]->harq_processes[harq_pid]->mcs); - msg("PDSCH dlsch0 UE: pwr_off %d\n",dlsch[0]->harq_processes[harq_pid]->dl_power_off); + msg("PDSCH dlsch0 UE: DCINdi %d\n",dlsch0_harq->DCINdi); + msg("PDSCH dlsch0 UE: rvidx %d\n",dlsch0_harq->rvidx); + msg("PDSCH dlsch0 UE: TBS %d\n",dlsch0_harq->TBS); + msg("PDSCH dlsch0 UE: mcs %d\n",dlsch0_harq->mcs); + msg("PDSCH dlsch0 UE: pwr_off %d\n",dlsch0_harq->dl_power_off); } #endif dlsch[0]->active=1; // compute DL power control parameters - computeRhoA_UE(pdsch_config_dedicated, dlsch[0],dlsch[0]->harq_processes[harq_pid]->dl_power_off); + computeRhoA_UE(pdsch_config_dedicated, dlsch[0],dlsch0_harq->dl_power_off); - computeRhoB_UE(pdsch_config_dedicated,&(frame_parms->pdsch_config_common),frame_parms->nb_antennas_tx_eNB,dlsch[0],dlsch[0]->harq_processes[harq_pid]->dl_power_off); + computeRhoB_UE(pdsch_config_dedicated,&(frame_parms->pdsch_config_common),frame_parms->nb_antennas_tx_eNB,dlsch[0],dlsch0_harq->dl_power_off); return(0); } diff --git a/openair1/PHY/LTE_TRANSPORT/defs.h b/openair1/PHY/LTE_TRANSPORT/defs.h index c18364686ef7922feeef6a5873ac2e5ed92934ce..ff137b7f16656f4efaf079edfe6130e1057776b8 100644 --- a/openair1/PHY/LTE_TRANSPORT/defs.h +++ b/openair1/PHY/LTE_TRANSPORT/defs.h @@ -109,10 +109,22 @@ 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; + /// Current RB allocation + uint32_t rb_alloc[4]; + /// Current subband PMI allocation + uint16_t pmi_alloc; + /// Current subband RI allocation + uint32_t ri_alloc; + /// Current subband CQI1 allocation + uint32_t cqi_alloc1; + /// Current subband CQI2 allocation + uint32_t cqi_alloc2; + /// Current Number of RBs + uint16_t nb_rb; + /// downlink power offset field + uint8_t dl_power_off; + /// Concatenated "e"-sequences (for definition see 36-212 V8.6 2009-03, p.17-18) + uint8_t e[MAX_NUM_CHANNEL_BITS]; /// 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) @@ -129,8 +141,12 @@ typedef struct { uint32_t Kplus; /// Number of "Filler" bits (for definition see 36-212 V8.6 2009-03, p.10) uint32_t F; - /// Number of MIMO layers (streams) (for definition see 36-212 V8.6 2009-03, p.17) + /// Number of MIMO layers (streams) (for definition see 36-212 V8.6 2009-03, p.17, TM3-4) uint8_t Nl; + /// Number of layers for this PDSCH transmission (TM8-10) + uint8_t Nlayers; + /// First layer for this PSCH transmission + uint8_t first_layer; } LTE_DL_eNB_HARQ_t; typedef struct { @@ -221,34 +237,16 @@ typedef struct { uint8_t ra_window_size; /// First-round error threshold for fine-grain rate adaptation uint8_t error_threshold; - /// Current RB allocation - uint32_t rb_alloc[4]; - /// Current subband PMI allocation - uint16_t pmi_alloc; - /// Current subband RI allocation - uint32_t ri_alloc; - /// Current subband CQI1 allocation - uint32_t cqi_alloc1; - /// Current subband CQI2 allocation - uint32_t cqi_alloc2; - /// Current Number of RBs - uint16_t nb_rb; /// Pointers to 8 HARQ processes for the DLSCH LTE_DL_eNB_HARQ_t *harq_processes[8]; /// Number of soft channel bits uint32_t G; - /// Layer index for this dlsch (0,1) - uint8_t layer_index; /// Codebook index for this dlsch (0,1,2,3) uint8_t codebook_index; - /// Concatenated "e"-sequences (for definition see 36-212 V8.6 2009-03, p.17-18) - uint8_t e[MAX_NUM_CHANNEL_BITS]; /// Maximum number of HARQ rounds (for definition see 36-212 V8.6 2009-03, p.17) uint8_t Mdlharq; /// MIMO transmission mode indicator for this sub-frame (for definition see 36-212 V8.6 2009-03, p.17) uint8_t Kmimo; - /// downlink power offset field - uint8_t dl_power_off; /// amplitude of PDSCH (compared to RS) in symbols without pilots int16_t sqrt_rho_a; /// amplitude of PDSCH (compared to RS) in symbols containing pilots @@ -637,8 +635,6 @@ typedef struct { harq_status_t harq_ack[10]; /// Pointers to up to 8 HARQ processes LTE_DL_UE_HARQ_t *harq_processes[8]; - /// Layer index for this DLSCH - uint8_t layer_index; /// Maximum number of HARQ rounds (for definition see 36-212 V8.6 2009-03, p.17 uint8_t Mdlharq; /// MIMO transmission mode indicator for this sub-frame (for definition see 36-212 V8.6 2009-03, p.17) @@ -650,7 +646,6 @@ typedef struct { typedef enum {format0, format1, format1A, - format1A_RA, format1B, format1C, format1D, diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c index ee57e3d659545df2d9ae08e257c81226b3faaed9..895506e53fe44d0f6391e2cb0b33b814f34d3e69 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c @@ -230,8 +230,9 @@ int dlsch_encoding(unsigned char *a, unsigned int G; unsigned int crc=1; unsigned short iind; - unsigned short nb_rb = dlsch->nb_rb; + unsigned char harq_pid = dlsch->current_harq_pid; + unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb; unsigned int A; unsigned char mod_order; unsigned int Kr=0,Kr_bytes,r,r_offset=0; @@ -243,7 +244,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,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe); + G = get_G(frame_parms,nb_rb,dlsch->harq_processes[harq_pid]->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 +354,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->harq_processes[harq_pid]->e+r_offset, dlsch->harq_processes[harq_pid]->C, // C NSOFT, // Nsoft, dlsch->Mdlharq, @@ -367,7 +368,7 @@ int dlsch_encoding(unsigned char *a, stop_meas(rm_stats); #ifdef DEBUG_DLSCH_CODING if (r==dlsch->harq_processes[harq_pid]->C-1) - write_output("enc_output.m","enc",dlsch->e,r_offset,1,4); + write_output("enc_output.m","enc",dlsch->harq_processes[harq_pid]->e,r_offset,1,4); #endif } vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT); diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c index 60088809827e5829e76af0c085b25147de57b9bd..9142f2e2943ecaa4824bebe0745e40879825d368 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c @@ -291,12 +291,13 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, (r==0) ? harq_process->F : 0); #ifdef DEBUG_DLSCH_DECODING - msg("HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, mod_order %d, nb_rb %d, Nl %d)...\n", + msg("HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d)...\n", harq_pid,r, G, - Kr*3, - get_Qm(harq_process->mcs), - harq_process->nb_rb, - harq_process->Nl); + Kr*3, + harq_process->TBS, + get_Qm(harq_process->mcs), + harq_process->nb_rb, + harq_process->Nl); #endif @@ -675,7 +676,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue, if (dlsch_abstraction_MIESM(phy_vars_ue->sinr_dB, phy_vars_ue->transmission_mode[eNB_id], - dlsch_eNB->rb_alloc, + dlsch_eNB->harq_processes[harq_pid]->rb_alloc, dlsch_eNB->harq_processes[harq_pid]->mcs, PHY_vars_eNB_g[eNB_id][CC_id]->mu_mimo_mode[ue_id].dl_pow_off) == 1) { // reset HARQ diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c index bb22990d5948b279e0b735d7445d6abf7b301216..20e83ec8a41c2ec3365bdf930af1decec9b5d72c 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c @@ -25,13 +25,13 @@ Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - *******************************************************************************/ +*******************************************************************************/ /*! \file PHY/LTE_TRANSPORT/dlsch_demodulation.c * \brief Top-level routines for demodulating the PDSCH physical channel from 36-211, V8.6 2009-03 * \author R. Knopp, F. Kaltenberger,A. Bhamri, S. Aubert * \date 2011 - * \version 0.1 + DEBUG * \version 0.1 * \company Eurecom * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,ankit.bhamri@eurecom.fr,sebastien.aubert@eurecom.fr * \note @@ -66,7 +66,7 @@ __m128i zero;//,tmp_over_sqrt_10,tmp_sum_4_over_sqrt_10,tmp_sign,tmp_sign_3_over #endif //#define DEBUG_PHY 1 -__m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b,avg128D; + int avg[4]; // [MCS][i_mod (0,1,2) = (2,4,6)] @@ -74,20 +74,22 @@ unsigned char offset_mumimo_llr_drange_fix=0; /* //original values from sebastion + same hand tuning unsigned char offset_mumimo_llr_drange[29][3]={{8,8,8},{7,7,7},{7,7,7},{7,7,7},{6,6,6},{6,6,6},{6,6,6},{5,5,5},{4,4,4},{1,2,4}, // QPSK - {5,5,4},{5,5,5},{5,5,5},{3,3,3},{2,2,2},{2,2,2},{2,2,2}, // 16-QAM - {2,2,1},{3,3,3},{3,3,3},{3,3,1},{2,2,2},{2,2,2},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; //64-QAM -*/ -/* -//first optimization try -unsigned char offset_mumimo_llr_drange[29][3]={{7, 8, 7},{6, 6, 7},{6, 6, 7},{6, 6, 6},{5, 6, 6},{5, 5, 6},{5, 5, 6},{4, 5, 4},{4, 3, 4},{3, 2, 2},{6, 5, 5},{5, 4, 4},{5, 5, 4},{3, 3, 2},{2, 2, 1},{2, 1, 1},{2, 2, 2},{3, 3, 3},{3, 3, 2},{3, 3, 2},{3, 2, 1},{2, 2, 2},{2, 2, 2},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}}; -*/ -//second optimization try -/* -unsigned char offset_mumimo_llr_drange[29][3]={{5, 8, 7},{4, 6, 8},{3, 6, 7},{7, 7, 6},{4, 7, 8},{4, 7, 4},{6, 6, 6},{3, 6, 6},{3, 6, 6},{1, 3, 4},{1, 1, 0},{3, 3, 2},{3, 4, 1},{4, 0, 1},{4, 2, 2},{3, 1, 2},{2, 1, 0},{2, 1, 1},{1, 0, 1},{1, 0, 1},{0, 0, 0},{1, 0, 0},{0, 0, 0},{0, 1, 0},{1, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}}; w +{5,5,4},{5,5,5},{5,5,5},{3,3,3},{2,2,2},{2,2,2},{2,2,2}, // 16-QAM +{2,2,1},{3,3,3},{3,3,3},{3,3,1},{2,2,2},{2,2,2},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; //64-QAM */ + /* + //first optimization try + unsigned char offset_mumimo_llr_drange[29][3]={{7, 8, 7},{6, 6, 7},{6, 6, 7},{6, 6, 6},{5, 6, 6},{5, 5, 6},{5, 5, 6},{4, 5, 4},{4, 3, 4},{3, 2, 2},{6, 5, 5},{5, 4, 4},{5, 5, 4},{3, 3, 2},{2, 2, 1},{2, 1, 1},{2, 2, 2},{3, 3, 3},{3, 3, 2},{3, 3, 2},{3, 2, 1},{2, 2, 2},{2, 2, 2},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}}; + */ + //second optimization try + /* + unsigned char offset_mumimo_llr_drange[29][3]={{5, 8, 7},{4, 6, 8},{3, 6, 7},{7, 7, 6},{4, 7, 8},{4, 7, 4},{6, 6, 6},{3, 6, 6},{3, 6, 6},{1, 3, 4},{1, 1, 0},{3, 3, 2},{3, 4, 1},{4, 0, 1},{4, 2, 2},{3, 1, 2},{2, 1, 0},{2, 1, 1},{1, 0, 1},{1, 0, 1},{0, 0, 0},{1, 0, 0},{0, 0, 0},{0, 1, 0},{1, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}}; w + */ unsigned char offset_mumimo_llr_drange[29][3]={{0, 6, 5},{0, 4, 5},{0, 4, 5},{0, 5, 4},{0, 5, 6},{0, 5, 3},{0, 4, 4},{0, 4, 4},{0, 3, 3},{0, 1, 2},{1, 1, 0},{1, 3, 2},{3, 4, 1},{2, 0, 0},{2, 2, 2},{1, 1, 1},{2, 1, 0},{2, 1, 1},{1, 0, 1},{1, 0, 1},{0, 0, 0},{1, 0, 0},{0, 0, 0},{0, 1, 0},{1, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}}; +extern void print_shorts(char *s,__m128i *x); + int rx_pdsch(PHY_VARS_UE *phy_vars_ue, PDSCH_t type, unsigned char eNB_id, @@ -108,19 +110,24 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, unsigned char aatx,aarx; unsigned short nb_rb; int avgs, rb; - + LTE_DL_UE_HARQ_t *dlsch0_harq,*dlsch1_harq; + switch (type) { case SI_PDSCH: lte_ue_pdsch_vars = &phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id]; dlsch_ue = &phy_vars_ue->dlsch_ue_SI[eNB_id]; + dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid]; break; case RA_PDSCH: lte_ue_pdsch_vars = &phy_vars_ue->lte_ue_pdsch_vars_ra[eNB_id]; dlsch_ue = &phy_vars_ue->dlsch_ue_ra[eNB_id]; + dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid]; break; case PDSCH: lte_ue_pdsch_vars = &phy_vars_ue->lte_ue_pdsch_vars[eNB_id]; dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id]; + dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid]; + dlsch1_harq = dlsch_ue[1]->harq_processes[harq_pid]; break; default: @@ -129,7 +136,8 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, return(-1); break; } - + + if (eNB_id > 2) { msg("dlsch_demodulation.c: Illegal eNB_id %d\n",eNB_id); return(-1); @@ -166,17 +174,18 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, if (frame_parms->nb_antennas_tx_eNB>1) { #ifdef DEBUG_DLSCH_MOD - LOG_I(PHY,"dlsch: using pmi %x (%p), rb_alloc %x\n",pmi2hex_2Ar1(dlsch_ue[0]->harq_processes[harq_pid]->pmi_alloc),dlsch_ue[0],dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc[0]); + LOG_I(PHY,"dlsch: using pmi %x (%p), rb_alloc %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),dlsch_ue[0],dlsch0_harq->rb_alloc[0]); #endif nb_rb = dlsch_extract_rbs_dual(lte_ue_common_vars->rxdataF, lte_ue_common_vars->dl_ch_estimates[eNB_id], lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - dlsch_ue[0]->harq_processes[harq_pid]->pmi_alloc, + dlsch0_harq->pmi_alloc, lte_ue_pdsch_vars[eNB_id]->pmi_ext, - dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc, + dlsch0_harq->rb_alloc, symbol, subframe, + phy_vars_ue->high_speed_flag, frame_parms); if (dual_stream_flag==1) { @@ -185,22 +194,24 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, lte_ue_common_vars->dl_ch_estimates[eNB_id_i], lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext, lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, - dlsch_ue[0]->harq_processes[harq_pid]->pmi_alloc, + dlsch0_harq->pmi_alloc, lte_ue_pdsch_vars[eNB_id_i]->pmi_ext, - dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc, + dlsch0_harq->rb_alloc, symbol, subframe, + phy_vars_ue->high_speed_flag, frame_parms); else nb_rb = dlsch_extract_rbs_dual(lte_ue_common_vars->rxdataF, lte_ue_common_vars->dl_ch_estimates[eNB_id], lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext, lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, - dlsch_ue[0]->harq_processes[harq_pid]->pmi_alloc, + dlsch0_harq->pmi_alloc, lte_ue_pdsch_vars[eNB_id_i]->pmi_ext, - dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc, + dlsch0_harq->rb_alloc, symbol, subframe, + phy_vars_ue->high_speed_flag, frame_parms); } } // if n_tx>1 @@ -209,11 +220,12 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, lte_ue_common_vars->dl_ch_estimates[eNB_id], lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - dlsch_ue[0]->harq_processes[harq_pid]->pmi_alloc, + dlsch0_harq->pmi_alloc, lte_ue_pdsch_vars[eNB_id]->pmi_ext, - dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc, + dlsch0_harq->rb_alloc, symbol, subframe, + phy_vars_ue->high_speed_flag, frame_parms); if (dual_stream_flag==1) { @@ -222,22 +234,24 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, lte_ue_common_vars->dl_ch_estimates[eNB_id_i], lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext, lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, - dlsch_ue[0]->harq_processes[harq_pid]->pmi_alloc, + dlsch0_harq->pmi_alloc, lte_ue_pdsch_vars[eNB_id_i]->pmi_ext, - dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc, + dlsch0_harq->rb_alloc, symbol, subframe, + phy_vars_ue->high_speed_flag, frame_parms); else nb_rb = dlsch_extract_rbs_single(lte_ue_common_vars->rxdataF, lte_ue_common_vars->dl_ch_estimates[eNB_id], lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext, lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, - dlsch_ue[0]->harq_processes[harq_pid]->pmi_alloc, + dlsch0_harq->pmi_alloc, lte_ue_pdsch_vars[eNB_id_i]->pmi_ext, - dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc, + dlsch0_harq->rb_alloc, symbol, subframe, + phy_vars_ue->high_speed_flag, frame_parms); } } //else n_tx>1 @@ -250,10 +264,10 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, /* // 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); + 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, @@ -276,12 +290,12 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, lte_ue_pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2); - // + log2_approx(frame_parms->nb_antennas_tx_eNB-1) //-1 because log2_approx counts the number of bits - // + log2_approx(frame_parms->nb_antennas_rx-1); + // + log2_approx(frame_parms->nb_antennas_tx_eNB-1) //-1 because log2_approx counts the number of bits + // + log2_approx(frame_parms->nb_antennas_rx-1); - if ((dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode>=UNIFORM_PRECODING11) && - (dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode< DUALSTREAM_UNIFORM_PRECODING1) && - (dlsch_ue[0]->harq_processes[harq_pid]->dl_power_off==1)) // we are in TM 6 + if ((dlsch0_harq->mimo_mode>=UNIFORM_PRECODING11) && + (dlsch0_harq->mimo_mode< DUALSTREAM_UNIFORM_PRECODING1) && + (dlsch0_harq->dl_power_off==1)) // we are in TM 6 lte_ue_pdsch_vars[eNB_id]->log2_maxh++; // this version here applies the factor .5 also to the extra terms. however, it does not work so well as the one above @@ -290,9 +304,9 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, Nb_tx^2*Nb_rx in TM6 */ /* K = frame_parms->nb_antennas_rx*frame_parms->nb_antennas_tx_eNB; //that also covers TM1 since Nb_tx=1 - if ((dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode>=UNIFORM_PRECODING11) && - (dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode< DUALSTREAM_UNIFORM_PRECODING1) && - (dlsch_ue[0]->harq_processes[harq_pid]->dl_power_off==1)) // we are in TM 6 + if ((dlsch0_harq->mimo_mode>=UNIFORM_PRECODING11) && + (dlsch0_harq->mimo_mode< DUALSTREAM_UNIFORM_PRECODING1) && + (dlsch0_harq->dl_power_off==1)) // we are in TM 6 K *= frame_parms->nb_antennas_tx_eNB; lte_ue_pdsch_vars[eNB_id]->log2_maxh = (log2_approx(K*avgs)/2); @@ -300,30 +314,30 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, #ifdef DEBUG_PHY msg("[DLSCH] log2_maxh = %d (%d,%d)\n",lte_ue_pdsch_vars[eNB_id]->log2_maxh,avg[0],avgs); - msg("[DLSCH] mimo_mode = %d\n", dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode); + msg("[DLSCH] mimo_mode = %d\n", dlsch0_harq->mimo_mode); #endif } aatx = frame_parms->nb_antennas_tx_eNB; aarx = frame_parms->nb_antennas_rx; - if (dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode<UNIFORM_PRECODING11) {// no precoding + if (dlsch0_harq->mimo_mode<LARGE_CDD) {// SISO or ALAMOUTI dlsch_channel_compensation(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, + lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, (aatx>1) ? lte_ue_pdsch_vars[eNB_id]->rho : NULL, frame_parms, symbol, first_symbol_flag, - get_Qm(dlsch_ue[0]->harq_processes[harq_pid]->mcs), + get_Qm(dlsch0_harq->mcs), nb_rb, lte_ue_pdsch_vars[eNB_id]->log2_maxh, phy_measurements); // log2_maxh+I0_shift #ifdef DEBUG_PHY if (symbol==5) - write_output("rxF_comp_d.m","rxF_c_d",<e_ue_pdsch_vars[eNB_id]->rxdataF_comp[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + write_output("rxF_comp_d.m","rxF_c_d",<e_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); #endif if ((dual_stream_flag==1) && @@ -331,9 +345,9 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, // get MF output for interfering stream dlsch_channel_compensation(lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext, lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_magb, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp, + lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id_i]->dl_ch_magb0, + lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, (aatx>1) ? lte_ue_pdsch_vars[eNB_id_i]->rho : NULL, frame_parms, symbol, @@ -344,8 +358,8 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, phy_measurements); // log2_maxh+I0_shift #ifdef DEBUG_PHY if (symbol == 5) { - write_output("rxF_comp_d.m","rxF_c_d",<e_ue_pdsch_vars[eNB_id]->rxdataF_comp[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); - write_output("rxF_comp_i.m","rxF_c_i",<e_ue_pdsch_vars[eNB_id_i]->rxdataF_comp[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + write_output("rxF_comp_d.m","rxF_c_d",<e_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + write_output("rxF_comp_i.m","rxF_c_i",<e_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); } #endif @@ -359,10 +373,49 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, lte_ue_pdsch_vars[eNB_id]->log2_maxh); } } - else if (dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode<DUALSTREAM_UNIFORM_PRECODING1) {// single-layer precoding + else if (dlsch0_harq->mimo_mode == LARGE_CDD) { // TM3 + // LOG_I(PHY,"Running PDSCH RX for TM3\n"); + if (frame_parms->nb_antennas_tx_eNB == 2) { + if (first_symbol_flag==1) { + // effective channel of desired user is always stronger than interfering eff. channel + dlsch_channel_level_TM3(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, + frame_parms, + avg, symbol, nb_rb); + + // msg("llr_offset = %d\n",offset_mumimo_llr_drange[dlsch0_harq->mcs][(dlsch1_harq->mcs>>1)-1]); + avg[0] = log2_approx(avg[0]) - 13 + offset_mumimo_llr_drange[dlsch0_harq->mcs][(get_Qm(dlsch1_harq->mcs)>>1)-1]; + + lte_ue_pdsch_vars[eNB_id]->log2_maxh = cmax(avg[0],0); + // printf("log2_maxh =%d\n",lte_ue_pdsch_vars[eNB_id]->log2_maxh); + } + dlsch_channel_compensation_TM3(frame_parms, + lte_ue_pdsch_vars[eNB_id], + phy_measurements, + eNB_id, + symbol, + get_Qm(dlsch0_harq->mcs), + get_Qm(dlsch1_harq->mcs), + nb_rb, + lte_ue_pdsch_vars[eNB_id]->log2_maxh); + // compute correlation between signal and interference channels + dlsch_dual_stream_correlation(frame_parms, + symbol, + nb_rb, + lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, + NULL, + lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, + lte_ue_pdsch_vars[eNB_id]->log2_maxh); + //printf("TM3 log2_maxh : %d\n",lte_ue_pdsch_vars[eNB_id]->log2_maxh); + + } + else { + + } + } + else if (dlsch0_harq->mimo_mode<DUALSTREAM_UNIFORM_PRECODING1) {// single-layer precoding, TM4 (Single-codeword)/5 (single or 2 user)/6 // printf("Channel compensation for precoding\n"); // if ((dual_stream_flag==1) && (eNB_id_i==NUMBER_OF_CONNECTED_eNB_MAX)) { - if ((dual_stream_flag==1) && (eNB_id_i==phy_vars_ue->n_connected_eNB)) { + if ((dual_stream_flag==1) && (eNB_id_i==phy_vars_ue->n_connected_eNB)) { // TM5 two-user // Scale the channel estimates for interfering stream @@ -375,16 +428,29 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, /* compute new log2_maxh for effective channel */ if (first_symbol_flag==1) { // effective channel of desired user is always stronger than interfering eff. channel - dlsch_channel_level_prec(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, frame_parms, lte_ue_pdsch_vars[eNB_id]->pmi_ext, avg, symbol, nb_rb); + dlsch_channel_level_TM56(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, frame_parms, lte_ue_pdsch_vars[eNB_id]->pmi_ext, avg, symbol, nb_rb); - // msg("llr_offset = %d\n",offset_mumimo_llr_drange[dlsch_ue[0]->harq_processes[harq_pid]->mcs][(i_mod>>1)-1]); - avg[0] = log2_approx(avg[0]) - 13 + offset_mumimo_llr_drange[dlsch_ue[0]->harq_processes[harq_pid]->mcs][(i_mod>>1)-1]; + // msg("llr_offset = %d\n",offset_mumimo_llr_drange[dlsch0_harq->mcs][(i_mod>>1)-1]); + avg[0] = log2_approx(avg[0]) - 13 + offset_mumimo_llr_drange[dlsch0_harq->mcs][(i_mod>>1)-1]; lte_ue_pdsch_vars[eNB_id]->log2_maxh = cmax(avg[0],0); //printf("log1_maxh =%d\n",lte_ue_pdsch_vars[eNB_id]->log2_maxh); } - dlsch_channel_compensation_prec(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, lte_ue_pdsch_vars[eNB_id]->dl_ch_mag, lte_ue_pdsch_vars[eNB_id]->dl_ch_magb, lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, lte_ue_pdsch_vars[eNB_id]->pmi_ext, frame_parms, phy_measurements, eNB_id, symbol, get_Qm(dlsch_ue[0]->harq_processes[harq_pid]->mcs), nb_rb, lte_ue_pdsch_vars[eNB_id]->log2_maxh, dlsch_ue[0]->harq_processes[harq_pid]->dl_power_off); + dlsch_channel_compensation_TM56(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, + lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, + lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id]->pmi_ext, + frame_parms, + phy_measurements, + eNB_id, + symbol, + get_Qm(dlsch0_harq->mcs), + nb_rb, + lte_ue_pdsch_vars[eNB_id]->log2_maxh, + dlsch0_harq->dl_power_off); // if interference source is MU interference, assume opposite precoder was used at eNB @@ -409,12 +475,25 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, } - dlsch_channel_compensation_prec(lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext, lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag, lte_ue_pdsch_vars[eNB_id_i]->dl_ch_magb, lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp, lte_ue_pdsch_vars[eNB_id_i]->pmi_ext, frame_parms, phy_measurements, eNB_id_i, symbol, i_mod, nb_rb, lte_ue_pdsch_vars[eNB_id]->log2_maxh, dlsch_ue[0]->harq_processes[harq_pid]->dl_power_off); + dlsch_channel_compensation_TM56(lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext, + lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, + lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id_i]->dl_ch_magb0, + lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id_i]->pmi_ext, + frame_parms, + phy_measurements, + eNB_id_i, + symbol, + i_mod, + nb_rb, + lte_ue_pdsch_vars[eNB_id]->log2_maxh, + dlsch0_harq->dl_power_off); #ifdef DEBUG_PHY if (symbol==5) { - write_output("rxF_comp_d.m","rxF_c_d",<e_ue_pdsch_vars[eNB_id]->rxdataF_comp[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); - write_output("rxF_comp_i.m","rxF_c_i",<e_ue_pdsch_vars[eNB_id_i]->rxdataF_comp[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + write_output("rxF_comp_d.m","rxF_c_d",<e_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + write_output("rxF_comp_i.m","rxF_c_i",<e_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); } #endif @@ -422,17 +501,17 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, } else { - dlsch_channel_compensation_prec(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, + dlsch_channel_compensation_TM56(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, + lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, lte_ue_pdsch_vars[eNB_id]->pmi_ext, frame_parms, phy_measurements, eNB_id, symbol, - get_Qm(dlsch_ue[0]->harq_processes[harq_pid]->mcs), + get_Qm(dlsch0_harq->mcs), nb_rb, lte_ue_pdsch_vars[eNB_id]->log2_maxh, 1); @@ -440,206 +519,258 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, } // printf("MRC\n"); - if (frame_parms->nb_antennas_rx > 1) - dlsch_detection_mrc(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id]->rho, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_magb, - symbol, - nb_rb, - dual_stream_flag); - - // printf("Combining"); - // Single-layer transmission formats - if (dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode<DUALSTREAM_UNIFORM_PRECODING1) { + if (frame_parms->nb_antennas_rx > 1) { + if (dlsch0_harq->mimo_mode == LARGE_CDD) { + if (frame_parms->nb_antennas_tx_eNB == 2) { + dlsch_detection_mrc(frame_parms, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1, + lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, + lte_ue_pdsch_vars[eNB_id]->rho, + lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_mag1, + lte_ue_pdsch_vars[eNB_id]->dl_ch_magb1, + symbol, + nb_rb, + dual_stream_flag); + } + } + else { - if ((dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode == SISO) || - ((dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode >= UNIFORM_PRECODING11) && - (dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode <= PUSCH_PRECODING0))) { - /* - dlsch_siso(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp, - symbol, - nb_rb); - */ - } else if (dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode == ALAMOUTI) { - - dlsch_alamouti(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb, - symbol, - nb_rb); - - } else if (dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode == ANTCYCLING) { + dlsch_detection_mrc(frame_parms, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id]->rho, + lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, + lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, + lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id_i]->dl_ch_magb0, + symbol, + nb_rb, + dual_stream_flag); + } + } + // printf("Combining"); + if ((dlsch0_harq->mimo_mode == SISO) || + ((dlsch0_harq->mimo_mode >= UNIFORM_PRECODING11) && + (dlsch0_harq->mimo_mode <= PUSCH_PRECODING0))) { + + /* + dlsch_siso(frame_parms, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, + lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp, + symbol, + nb_rb); + */ + } else if (dlsch0_harq->mimo_mode == ALAMOUTI) { + + dlsch_alamouti(frame_parms, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, + symbol, + nb_rb); - dlsch_antcyc(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb, - symbol, - nb_rb); + } - } else { - msg("dlsch_rx: Unknown MIMO mode\n"); - return (-1); - } + else if (dlsch0_harq->mimo_mode == LARGE_CDD) { + + } + else { + msg("dlsch_rx: Unknown MIMO mode\n"); + return (-1); + } - // printf("LLR"); - - switch (get_Qm(dlsch_ue[0]->harq_processes[harq_pid]->mcs)) { - case 2 : - if (dual_stream_flag == 0) - dlsch_qpsk_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - else if (i_mod == 2) { - dlsch_qpsk_qpsk_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - } - else if (i_mod == 4) { - dlsch_qpsk_16qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - } - else { - dlsch_qpsk_64qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - - } - break; - case 4 : - if (dual_stream_flag == 0) { - dlsch_16qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id]->llr[0], - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag, - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,4,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - } - else if (i_mod == 2) { - dlsch_16qam_qpsk_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - } - else if (i_mod == 4) { - dlsch_16qam_16qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - } else { - dlsch_16qam_64qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - } - break; - case 6 : - if (dual_stream_flag == 0) { - dlsch_64qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id]->llr[0], - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb, - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,6,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - } - else if (i_mod == 2) { - dlsch_64qam_qpsk_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - } - else if (i_mod == 4) { - dlsch_64qam_16qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - - } - else { - dlsch_64qam_64qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - } - break; - default: - msg("rx_dlsch.c : Unknown mod_order!!!!\n"); - return(-1); - break; + // printf("LLR"); + + switch (get_Qm(dlsch0_harq->mcs)) { + case 2 : + if (dlsch0_harq->mimo_mode != LARGE_CDD) { + if (dual_stream_flag == 0) + dlsch_qpsk_llr(frame_parms, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id]->llr[0], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol), + lte_ue_pdsch_vars[eNB_id]->llr128); + else if (i_mod == 2) { + dlsch_qpsk_qpsk_llr(frame_parms, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, + lte_ue_pdsch_vars[eNB_id]->llr[0], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol), + lte_ue_pdsch_vars[eNB_id]->llr128); } - } // single-layer transmission - else { - msg("rx_dlsch.c : Dualstream not yet implemented\n"); + else if (i_mod == 4) { + dlsch_qpsk_16qam_llr(frame_parms, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, + lte_ue_pdsch_vars[eNB_id]->llr[0], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol), + lte_ue_pdsch_vars[eNB_id]->llr128); + } + else { + dlsch_qpsk_64qam_llr(frame_parms, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, + lte_ue_pdsch_vars[eNB_id]->llr[0], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol), + lte_ue_pdsch_vars[eNB_id]->llr128); + + } + } + else { // TM3 + if (get_Qm(dlsch1_harq->mcs) == 2) { + /* dlsch_qpsk_llr(frame_parms, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id]->llr[0], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol), + lte_ue_pdsch_vars[eNB_id]->llr128); + */ + dlsch_qpsk_qpsk_llr(frame_parms, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1, + lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, + lte_ue_pdsch_vars[eNB_id]->llr[0], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol), + lte_ue_pdsch_vars[eNB_id]->llr128); + } + else if (get_Qm(dlsch1_harq->mcs) == 4) { + dlsch_qpsk_16qam_llr(frame_parms, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1, + lte_ue_pdsch_vars[eNB_id]->dl_ch_mag1, + lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, + lte_ue_pdsch_vars[eNB_id]->llr[0], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol), + lte_ue_pdsch_vars[eNB_id]->llr128); + } + else { + dlsch_qpsk_64qam_llr(frame_parms, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1, + lte_ue_pdsch_vars[eNB_id]->dl_ch_mag1, + lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, + lte_ue_pdsch_vars[eNB_id]->llr[0], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol), + lte_ue_pdsch_vars[eNB_id]->llr128); + + } + } + break; + case 4 : + if (dual_stream_flag == 0) { + dlsch_16qam_llr(frame_parms, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id]->llr[0], + lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc,4,subframe,symbol), + lte_ue_pdsch_vars[eNB_id]->llr128); + } + else if (i_mod == 2) { + dlsch_16qam_qpsk_llr(frame_parms, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, + lte_ue_pdsch_vars[eNB_id]->llr[0], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol), + lte_ue_pdsch_vars[eNB_id]->llr128); + } + else if (i_mod == 4) { + dlsch_16qam_16qam_llr(frame_parms, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, + lte_ue_pdsch_vars[eNB_id]->llr[0], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol), + lte_ue_pdsch_vars[eNB_id]->llr128); + } else { + dlsch_16qam_64qam_llr(frame_parms, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, + lte_ue_pdsch_vars[eNB_id]->llr[0], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol), + lte_ue_pdsch_vars[eNB_id]->llr128); + } + break; + case 6 : + if (dual_stream_flag == 0) { + dlsch_64qam_llr(frame_parms, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id]->llr[0], + lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc,6,subframe,symbol), + lte_ue_pdsch_vars[eNB_id]->llr128); + } + else if (i_mod == 2) { + dlsch_64qam_qpsk_llr(frame_parms, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, + lte_ue_pdsch_vars[eNB_id]->llr[0], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol), + lte_ue_pdsch_vars[eNB_id]->llr128); + } + else if (i_mod == 4) { + dlsch_64qam_16qam_llr(frame_parms, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, + lte_ue_pdsch_vars[eNB_id]->llr[0], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol), + lte_ue_pdsch_vars[eNB_id]->llr128); + + } + else { + dlsch_64qam_64qam_llr(frame_parms, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, + lte_ue_pdsch_vars[eNB_id]->llr[0], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol), + lte_ue_pdsch_vars[eNB_id]->llr128); + } + break; + default: + msg("rx_dlsch.c : Unknown mod_order!!!!\n"); return(-1); + break; } - + return(0); } @@ -664,6 +795,7 @@ void dlsch_channel_compensation(int **rxdataF_ext, unsigned short rb; unsigned char aatx,aarx,symbol_mod,pilots=0; __m128i *dl_ch128,*dl_ch128_2,*dl_ch_mag128,*dl_ch_mag128b,*rxdataF128,*rxdataF_comp128,*rho128; + __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b; symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; @@ -914,7 +1046,7 @@ void dlsch_channel_compensation(int **rxdataF_ext, _m_empty(); } -void prec2A_128(unsigned char pmi,__m128i *ch0,__m128i *ch1) { +void prec2A_TM56_128(unsigned char pmi,__m128i *ch0,__m128i *ch1) { __m128i amp; amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15); @@ -954,7 +1086,72 @@ void prec2A_128(unsigned char pmi,__m128i *ch0,__m128i *ch1) { _m_empty(); } -void dlsch_channel_compensation_prec(int **rxdataF_ext, +// precoding is stream 0 .5(1,1) .5(1,-1) .5(1,1) .5(1,-1) +// stream 1 .5(1,-1) .5(1,1) .5(1,-1) .5(1,1) +// store "precoded" channel for stream 0 in ch0, stream 1 in ch1 + +short TM3_prec[8]__attribute__((aligned(16))) = {1,1,-1,-1,1,1,-1,-1} ; + +void prec2A_TM3_128(__m128i *ch0,__m128i *ch1) { + + // __m128i amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15); + + __m128i tmp0,tmp1; + + + // print_shorts("prec2A_TM3 ch0 (before):",ch0); + // print_shorts("prec2A_TM3 ch1 (before):",ch1); + + tmp0 = ch0[0]; + tmp1 = _mm_sign_epi16(ch1[0],((__m128i*)&TM3_prec)[0]); + // print_shorts("prec2A_TM3 ch1*s (mid):",(__m128i*)TM3_prec); + + ch0[0] = _mm_adds_epi16(ch0[0],tmp1); + ch1[0] = _mm_subs_epi16(tmp0,tmp1); + + + // print_shorts("prec2A_TM3 ch0 (mid):",&tmp0); + // print_shorts("prec2A_TM3 ch1 (mid):",ch1); + + + ch0[0] = _mm_srai_epi16(ch0[0],1); + ch1[0] = _mm_srai_epi16(ch1[0],1); + + // print_shorts("prec2A_TM3 ch0 (after):",ch0); + // print_shorts("prec2A_TM3 ch1 (after):",ch1); + + _mm_empty(); + _m_empty(); +} + +// pmi = 0 => stream 0 (1,1), stream 1 (1,-1) +// pmi = 1 => stream 0 (1,j), stream 2 (1,-j) + +void prec2A_TM4_128(int pmi,__m128i *ch0,__m128i *ch1) { + + __m128i amp; + amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15); + __m128i tmp1; + + if (pmi == 0) { + ch0[0] = _mm_adds_epi16(ch0[0],ch1[0]); + ch1[0] = _mm_subs_epi16(ch0[0],ch1[0]); + } + else { + tmp1 = _mm_sign_epi16(ch1[0],*(__m128i*)&conjugate[0]); + tmp1 = _mm_shufflelo_epi16(tmp1,_MM_SHUFFLE(2,3,0,1)); + tmp1 = _mm_shufflehi_epi16(tmp1,_MM_SHUFFLE(2,3,0,1)); + ch0[0] = _mm_subs_epi16(ch0[0],tmp1); + ch1[0] = _mm_subs_epi16(ch0[0],tmp1); + } + ch0[0] = _mm_mulhi_epi16(ch0[0],amp); + ch0[0] = _mm_slli_epi16(ch0[0],1); + ch1[0] = _mm_mulhi_epi16(ch1[0],amp); + ch1[0] = _mm_slli_epi16(ch1[0],1); + +} + +void dlsch_channel_compensation_TM56(int **rxdataF_ext, int **dl_ch_estimates_ext, int **dl_ch_mag, int **dl_ch_magb, @@ -970,24 +1167,17 @@ void dlsch_channel_compensation_prec(int **rxdataF_ext, unsigned char dl_power_off) { unsigned short rb,Nre; - __m128i *dl_ch128_0,*dl_ch128_1,*dl_ch_mag128,*dl_ch_mag128b,*rxdataF128,*rxdataF_comp128; + __m128i *dl_ch0_128,*dl_ch1_128,*dl_ch_mag128,*dl_ch_mag128b,*rxdataF128,*rxdataF_comp128; unsigned char aarx=0,symbol_mod,pilots=0; int precoded_signal_strength=0,rx_power_correction; + __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b; symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) pilots=1; -#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 #ifndef __SSE3__ zero = _mm_xor_si128(zero,zero); @@ -1006,8 +1196,8 @@ void dlsch_channel_compensation_prec(int **rxdataF_ext, for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++) { - dl_ch128_0 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch128_1 = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; + dl_ch0_128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; + dl_ch1_128 = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; dl_ch_mag128 = (__m128i *)&dl_ch_mag[aarx][symbol*frame_parms->N_RB_DL*12]; @@ -1021,20 +1211,20 @@ void dlsch_channel_compensation_prec(int **rxdataF_ext, #ifdef DEBUG_DLSCH_DEMOD printf("mode 6 prec: rb %d, pmi->%d\n",rb,pmi_ext[rb]); #endif - prec2A_128(pmi_ext[rb],&dl_ch128_0[0],&dl_ch128_1[0]); - prec2A_128(pmi_ext[rb],&dl_ch128_0[1],&dl_ch128_1[1]); + prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128[0],&dl_ch1_128[0]); + prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128[1],&dl_ch1_128[1]); if (pilots==0) { - prec2A_128(pmi_ext[rb],&dl_ch128_0[2],&dl_ch128_1[2]); + prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128[2],&dl_ch1_128[2]); } if (mod_order>2) { // get channel amplitude if not QPSK - mmtmpD0 = _mm_madd_epi16(dl_ch128_0[0],dl_ch128_0[0]); + mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],dl_ch0_128[0]); mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); - mmtmpD1 = _mm_madd_epi16(dl_ch128_0[1],dl_ch128_0[1]); + mmtmpD1 = _mm_madd_epi16(dl_ch0_128[1],dl_ch0_128[1]); mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); mmtmpD0 = _mm_packs_epi32(mmtmpD0,mmtmpD1); @@ -1052,7 +1242,7 @@ void dlsch_channel_compensation_prec(int **rxdataF_ext, dl_ch_mag128[1] = _mm_slli_epi16(dl_ch_mag128[1],1); if (pilots==0) { - mmtmpD0 = _mm_madd_epi16(dl_ch128_0[2],dl_ch128_0[2]); + mmtmpD0 = _mm_madd_epi16(dl_ch0_128[2],dl_ch0_128[2]); mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0); @@ -1079,11 +1269,355 @@ void dlsch_channel_compensation_prec(int **rxdataF_ext, } // MF multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(dl_ch128_0[0],rxdataF128[0]); + mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],rxdataF128[0]); + // print_ints("re",&mmtmpD0); + + // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) + mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[0],_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]); + // print_ints("im",&mmtmpD1); + mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[0]); + // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); + // print_ints("re(shift)",&mmtmpD0); + mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); + // print_ints("im(shift)",&mmtmpD1); + mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); + mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); + // print_ints("c0",&mmtmpD2); + // print_ints("c1",&mmtmpD3); + rxdataF_comp128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3); + // print_shorts("rx:",rxdataF128); + // print_shorts("ch:",dl_ch128); + // print_shorts("pack:",rxdataF_comp128); + + // multiply by conjugated channel + mmtmpD0 = _mm_madd_epi16(dl_ch0_128[1],rxdataF128[1]); + // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) + mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[1],_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate); + mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[1]); + // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); + mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); + mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); + mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); + + rxdataF_comp128[1] = _mm_packs_epi32(mmtmpD2,mmtmpD3); + // print_shorts("rx:",rxdataF128+1); + // print_shorts("ch:",dl_ch128+1); + // print_shorts("pack:",rxdataF_comp128+1); + + if (pilots==0) { + // multiply by conjugated channel + mmtmpD0 = _mm_madd_epi16(dl_ch0_128[2],rxdataF128[2]); + // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) + mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[2],_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate); + mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[2]); + // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); + mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); + mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); + mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); + + rxdataF_comp128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3); + // print_shorts("rx:",rxdataF128+2); + // print_shorts("ch:",dl_ch128+2); + // print_shorts("pack:",rxdataF_comp128+2); + + dl_ch0_128+=3; + dl_ch1_128+=3; + dl_ch_mag128+=3; + dl_ch_mag128b+=3; + rxdataF128+=3; + rxdataF_comp128+=3; + } + else { + dl_ch0_128+=2; + dl_ch1_128+=2; + dl_ch_mag128+=2; + dl_ch_mag128b+=2; + rxdataF128+=2; + rxdataF_comp128+=2; + } + } + + Nre = (pilots==0) ? 12 : 8; + + precoded_signal_strength += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre], + (nb_rb*Nre))*rx_power_correction) - (phy_measurements->n0_power[aarx])); + } // rx_antennas + + phy_measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength,phy_measurements->n0_power_tot); + + //printf("eNB_id %d, symbol %d: precoded CQI %d dB\n",eNB_id,symbol, + // phy_measurements->precoded_cqi_dB[eNB_id][0]); + + _mm_empty(); + _m_empty(); +} + +void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, + LTE_UE_PDSCH *lte_ue_pdsch_vars, + PHY_MEASUREMENTS *phy_measurements, + int eNB_id, + unsigned char symbol, + unsigned char mod_order0, + unsigned char mod_order1, + unsigned short nb_rb, + unsigned char output_shift) { + + unsigned short rb,Nre; + __m128i *dl_ch0_128,*dl_ch1_128,*dl_ch_mag0_128,*dl_ch_mag1_128,*dl_ch_mag0_128b,*dl_ch_mag1_128b,*rxdataF128,*rxdataF_comp0_128,*rxdataF_comp1_128; + unsigned char aarx=0,symbol_mod,pilots=0; + int precoded_signal_strength0=0,precoded_signal_strength1=0,rx_power_correction; + + int **rxdataF_ext = lte_ue_pdsch_vars->rxdataF_ext; + int **dl_ch_estimates_ext = lte_ue_pdsch_vars->dl_ch_estimates_ext; + int **dl_ch_mag0 = lte_ue_pdsch_vars->dl_ch_mag0; + int **dl_ch_mag1 = lte_ue_pdsch_vars->dl_ch_mag1; + int **dl_ch_magb0 = lte_ue_pdsch_vars->dl_ch_magb0; + int **dl_ch_magb1 = lte_ue_pdsch_vars->dl_ch_magb1; + int **rxdataF_comp0 = lte_ue_pdsch_vars->rxdataF_comp0; + int **rxdataF_comp1 = lte_ue_pdsch_vars->rxdataF_comp1; + __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp0_128,QAM_amp0_128b,QAM_amp1_128,QAM_amp1_128b; + + + symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; + + if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) + pilots=1; + + rx_power_correction = 1; + +#ifndef __SSE3__ + zero = _mm_xor_si128(zero,zero); +#endif + + //printf("comp prec: symbol %d, pilots %d\n",symbol, pilots); + + if (mod_order0 == 4) { + QAM_amp0_128 = _mm_set1_epi16(QAM16_n1); + QAM_amp0_128b = _mm_xor_si128(QAM_amp0_128b,QAM_amp0_128b); + } + else if (mod_order0 == 6) { + QAM_amp0_128 = _mm_set1_epi16(QAM64_n1); + QAM_amp0_128b = _mm_set1_epi16(QAM64_n2); + } + if (mod_order1 == 4) { + QAM_amp1_128 = _mm_set1_epi16(QAM16_n1); + QAM_amp1_128b = _mm_xor_si128(QAM_amp1_128b,QAM_amp1_128b); + } + else if (mod_order1 == 6) { + QAM_amp1_128 = _mm_set1_epi16(QAM64_n1); + QAM_amp1_128b = _mm_set1_epi16(QAM64_n2); + } + + for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++) { + + dl_ch0_128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; + dl_ch1_128 = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; + + + dl_ch_mag0_128 = (__m128i *)&dl_ch_mag0[aarx][symbol*frame_parms->N_RB_DL*12]; + dl_ch_mag0_128b = (__m128i *)&dl_ch_magb0[aarx][symbol*frame_parms->N_RB_DL*12]; + dl_ch_mag1_128 = (__m128i *)&dl_ch_mag1[aarx][symbol*frame_parms->N_RB_DL*12]; + dl_ch_mag1_128b = (__m128i *)&dl_ch_magb1[aarx][symbol*frame_parms->N_RB_DL*12]; + rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12]; + rxdataF_comp0_128 = (__m128i *)&rxdataF_comp0[aarx][symbol*frame_parms->N_RB_DL*12]; + rxdataF_comp1_128 = (__m128i *)&rxdataF_comp1[aarx][symbol*frame_parms->N_RB_DL*12]; + + + for (rb=0;rb<nb_rb;rb++) { + // combine TX channels using precoder from pmi + + prec2A_TM3_128(&dl_ch0_128[0],&dl_ch1_128[0]); + prec2A_TM3_128(&dl_ch0_128[1],&dl_ch1_128[1]); + + if (pilots==0) { + prec2A_TM3_128(&dl_ch0_128[2],&dl_ch1_128[2]); + } + + if (mod_order0>2) { + // get channel amplitude if not QPSK + + mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],dl_ch0_128[0]); + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); + + mmtmpD1 = _mm_madd_epi16(dl_ch0_128[1],dl_ch0_128[1]); + mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); + + mmtmpD0 = _mm_packs_epi32(mmtmpD0,mmtmpD1); + + dl_ch_mag0_128[0] = _mm_unpacklo_epi16(mmtmpD0,mmtmpD0); + dl_ch_mag0_128b[0] = dl_ch_mag0_128[0]; + dl_ch_mag0_128[0] = _mm_mulhi_epi16(dl_ch_mag0_128[0],QAM_amp0_128); + dl_ch_mag0_128[0] = _mm_slli_epi16(dl_ch_mag0_128[0],1); + + // print_shorts("dl_ch_mag0_128[0]=",&dl_ch_mag0_128[0]); + + dl_ch_mag0_128[1] = _mm_unpackhi_epi16(mmtmpD0,mmtmpD0); + dl_ch_mag0_128b[1] = dl_ch_mag0_128[1]; + dl_ch_mag0_128[1] = _mm_mulhi_epi16(dl_ch_mag0_128[1],QAM_amp0_128); + dl_ch_mag0_128[1] = _mm_slli_epi16(dl_ch_mag0_128[1],1); + + if (pilots==0) { + mmtmpD0 = _mm_madd_epi16(dl_ch0_128[2],dl_ch0_128[2]); + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); + + mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0); + + dl_ch_mag0_128[2] = _mm_unpacklo_epi16(mmtmpD1,mmtmpD1); + dl_ch_mag0_128b[2] = dl_ch_mag0_128[2]; + + dl_ch_mag0_128[2] = _mm_mulhi_epi16(dl_ch_mag0_128[2],QAM_amp0_128); + dl_ch_mag0_128[2] = _mm_slli_epi16(dl_ch_mag0_128[2],1); + } + + dl_ch_mag0_128b[0] = _mm_mulhi_epi16(dl_ch_mag0_128b[0],QAM_amp0_128b); + dl_ch_mag0_128b[0] = _mm_slli_epi16(dl_ch_mag0_128b[0],1); + + //print_shorts("dl_ch_mag128b[0]=",&dl_ch_mag128b[0]); + + dl_ch_mag0_128b[1] = _mm_mulhi_epi16(dl_ch_mag0_128b[1],QAM_amp0_128b); + dl_ch_mag0_128b[1] = _mm_slli_epi16(dl_ch_mag0_128b[1],1); + + if (pilots==0) { + dl_ch_mag0_128b[2] = _mm_mulhi_epi16(dl_ch_mag0_128b[2],QAM_amp0_128b); + dl_ch_mag0_128b[2] = _mm_slli_epi16(dl_ch_mag0_128b[2],1); + } + } + + if (mod_order1>2) { + // get channel amplitude if not QPSK + + mmtmpD0 = _mm_madd_epi16(dl_ch1_128[0],dl_ch1_128[0]); + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); + + mmtmpD1 = _mm_madd_epi16(dl_ch1_128[1],dl_ch1_128[1]); + mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); + + mmtmpD0 = _mm_packs_epi32(mmtmpD0,mmtmpD1); + + dl_ch_mag1_128[0] = _mm_unpacklo_epi16(mmtmpD0,mmtmpD0); + dl_ch_mag1_128b[0] = dl_ch_mag1_128[0]; + dl_ch_mag1_128[0] = _mm_mulhi_epi16(dl_ch_mag1_128[0],QAM_amp1_128); + dl_ch_mag1_128[0] = _mm_slli_epi16(dl_ch_mag1_128[0],1); + + //print_shorts("dl_ch_mag128[0]=",&dl_ch_mag128[0]); + + dl_ch_mag1_128[1] = _mm_unpackhi_epi16(mmtmpD0,mmtmpD0); + dl_ch_mag1_128b[1] = dl_ch_mag1_128[1]; + dl_ch_mag1_128[1] = _mm_mulhi_epi16(dl_ch_mag1_128[1],QAM_amp1_128); + dl_ch_mag1_128[1] = _mm_slli_epi16(dl_ch_mag1_128[1],1); + + if (pilots==0) { + mmtmpD0 = _mm_madd_epi16(dl_ch1_128[2],dl_ch1_128[2]); + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); + + mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0); + + dl_ch_mag1_128[2] = _mm_unpacklo_epi16(mmtmpD1,mmtmpD1); + dl_ch_mag1_128b[2] = dl_ch_mag1_128[2]; + + dl_ch_mag1_128[2] = _mm_mulhi_epi16(dl_ch_mag1_128[2],QAM_amp1_128); + dl_ch_mag1_128[2] = _mm_slli_epi16(dl_ch_mag1_128[2],1); + } + + dl_ch_mag1_128b[0] = _mm_mulhi_epi16(dl_ch_mag1_128b[0],QAM_amp1_128b); + dl_ch_mag1_128b[0] = _mm_slli_epi16(dl_ch_mag1_128b[0],1); + + //print_shorts("dl_ch_mag128b[0]=",&dl_ch_mag128b[0]); + + dl_ch_mag1_128b[1] = _mm_mulhi_epi16(dl_ch_mag1_128b[1],QAM_amp1_128b); + dl_ch_mag1_128b[1] = _mm_slli_epi16(dl_ch_mag1_128b[1],1); + + if (pilots==0) { + dl_ch_mag1_128b[2] = _mm_mulhi_epi16(dl_ch_mag1_128b[2],QAM_amp1_128b); + dl_ch_mag1_128b[2] = _mm_slli_epi16(dl_ch_mag1_128b[2],1); + } + } + + // layer 0 + // MF multiply by conjugated channel + mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],rxdataF128[0]); + //print_ints("re",&mmtmpD0); + + // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) + mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[0],_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]); + mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[0]); + // print_ints("im",&mmtmpD1); + // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); + // printf("Shift: %d\n",output_shift); + // print_ints("re(shift)",&mmtmpD0); + mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); + // print_ints("im(shift)",&mmtmpD1); + mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); + mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); + // print_ints("c0",&mmtmpD2); + // print_ints("c1",&mmtmpD3); + rxdataF_comp0_128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3); + // print_shorts("rx:",rxdataF128); + // print_shorts("ch:",dl_ch0_128); + // print_shorts("pack:",rxdataF_comp0_128); + + // multiply by conjugated channel + mmtmpD0 = _mm_madd_epi16(dl_ch0_128[1],rxdataF128[1]); + // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) + mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[1],_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate); + mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[1]); + // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); + mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); + mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); + mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); + + rxdataF_comp0_128[1] = _mm_packs_epi32(mmtmpD2,mmtmpD3); + // print_shorts("rx:",rxdataF128+1); + // print_shorts("ch:",dl_ch128+1); + // print_shorts("pack:",rxdataF_comp128+1); + + if (pilots==0) { + // multiply by conjugated channel + mmtmpD0 = _mm_madd_epi16(dl_ch0_128[2],rxdataF128[2]); + // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) + mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[2],_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate); + mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[2]); + // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); + mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); + mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); + mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); + + rxdataF_comp0_128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3); + // print_shorts("rx:",rxdataF128+2); + // print_shorts("ch:",dl_ch128+2); + // print_shorts("pack:",rxdataF_comp128+2); + + } + else { + + } + + + // layer 1 + // MF multiply by conjugated channel + mmtmpD0 = _mm_madd_epi16(dl_ch1_128[0],rxdataF128[0]); // print_ints("re",&mmtmpD0); - + // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) - mmtmpD1 = _mm_shufflelo_epi16(dl_ch128_0[0],_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_shufflelo_epi16(dl_ch1_128[0],_MM_SHUFFLE(2,3,0,1)); mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]); // print_ints("im",&mmtmpD1); @@ -1097,15 +1631,15 @@ void dlsch_channel_compensation_prec(int **rxdataF_ext, mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); // print_ints("c0",&mmtmpD2); // print_ints("c1",&mmtmpD3); - rxdataF_comp128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3); + rxdataF_comp1_128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3); // print_shorts("rx:",rxdataF128); // print_shorts("ch:",dl_ch128); // print_shorts("pack:",rxdataF_comp128); - + // multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(dl_ch128_0[1],rxdataF128[1]); + mmtmpD0 = _mm_madd_epi16(dl_ch1_128[1],rxdataF128[1]); // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) - mmtmpD1 = _mm_shufflelo_epi16(dl_ch128_0[1],_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_shufflelo_epi16(dl_ch1_128[1],_MM_SHUFFLE(2,3,0,1)); mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate); mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[1]); @@ -1114,17 +1648,17 @@ void dlsch_channel_compensation_prec(int **rxdataF_ext, mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); - - rxdataF_comp128[1] = _mm_packs_epi32(mmtmpD2,mmtmpD3); + + rxdataF_comp1_128[1] = _mm_packs_epi32(mmtmpD2,mmtmpD3); // print_shorts("rx:",rxdataF128+1); // print_shorts("ch:",dl_ch128+1); // print_shorts("pack:",rxdataF_comp128+1); - + if (pilots==0) { // multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(dl_ch128_0[2],rxdataF128[2]); + mmtmpD0 = _mm_madd_epi16(dl_ch1_128[2],rxdataF128[2]); // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) - mmtmpD1 = _mm_shufflelo_epi16(dl_ch128_0[2],_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_shufflelo_epi16(dl_ch1_128[2],_MM_SHUFFLE(2,3,0,1)); mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate); mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[2]); @@ -1133,36 +1667,46 @@ void dlsch_channel_compensation_prec(int **rxdataF_ext, mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); - - rxdataF_comp128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3); + + rxdataF_comp1_128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3); // print_shorts("rx:",rxdataF128+2); // print_shorts("ch:",dl_ch128+2); // print_shorts("pack:",rxdataF_comp128+2); - - dl_ch128_0+=3; - dl_ch128_1+=3; - dl_ch_mag128+=3; - dl_ch_mag128b+=3; + + dl_ch0_128+=3; + dl_ch1_128+=3; + dl_ch_mag0_128+=3; + dl_ch_mag1_128+=3; + dl_ch_mag0_128b+=3; + dl_ch_mag1_128b+=3; rxdataF128+=3; - rxdataF_comp128+=3; + rxdataF_comp0_128+=3; + rxdataF_comp1_128+=3; } else { - dl_ch128_0+=2; - dl_ch128_1+=2; - dl_ch_mag128+=2; - dl_ch_mag128b+=2; + dl_ch0_128+=2; + dl_ch1_128+=2; + dl_ch_mag0_128+=2; + dl_ch_mag1_128+=2; + dl_ch_mag0_128b+=2; + dl_ch_mag1_128b+=2; rxdataF128+=2; - rxdataF_comp128+=2; + rxdataF_comp0_128+=2; + rxdataF_comp1_128+=2; } - } - - Nre = (pilots==0) ? 12 : 8; - - precoded_signal_strength += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre], - (nb_rb*Nre))*rx_power_correction) - (phy_measurements->n0_power[aarx])); + + Nre = (pilots==0) ? 12 : 8; + + precoded_signal_strength0 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre], + (nb_rb*Nre))*rx_power_correction) - (phy_measurements->n0_power[aarx])); + + precoded_signal_strength1 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx+2][symbol*frame_parms->N_RB_DL*Nre], + (nb_rb*Nre))*rx_power_correction) - (phy_measurements->n0_power[aarx])); + } // rb loop } // rx_antennas - - phy_measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength,phy_measurements->n0_power_tot); + + phy_measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength0,phy_measurements->n0_power_tot); + phy_measurements->precoded_cqi_dB[eNB_id][1] = dB_fixed2(precoded_signal_strength1,phy_measurements->n0_power_tot); //printf("eNB_id %d, symbol %d: precoded CQI %d dB\n",eNB_id,symbol, // phy_measurements->precoded_cqi_dB[eNB_id][0]); @@ -1180,7 +1724,7 @@ void dlsch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms, unsigned char output_shift) { unsigned short rb; - __m128i *dl_ch128,*dl_ch128i,*dl_ch_rho128; + __m128i *dl_ch128,*dl_ch128i,*dl_ch_rho128,mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3; unsigned char aarx,symbol_mod,pilots=0; // printf("dlsch_dual_stream_correlation: symbol %d\n",symbol); @@ -1190,33 +1734,37 @@ void dlsch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms, if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) { pilots=1; } - + // printf("Dual stream correlation (%p)\n",dl_ch_estimates_ext_i); + for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++) { dl_ch128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch128i = (__m128i *)&dl_ch_estimates_ext_i[aarx][symbol*frame_parms->N_RB_DL*12]; + if (dl_ch_estimates_ext_i == NULL) // TM3/4 + dl_ch128i = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; + else + dl_ch128i = (__m128i *)&dl_ch_estimates_ext_i[aarx][symbol*frame_parms->N_RB_DL*12]; dl_ch_rho128 = (__m128i *)&dl_ch_rho_ext[aarx][symbol*frame_parms->N_RB_DL*12]; for (rb=0;rb<nb_rb;rb++) { // multiply by conjugated channel mmtmpD0 = _mm_madd_epi16(dl_ch128[0],dl_ch128i[0]); - // print_ints("re",&mmtmpD0); + // print_ints("re",&mmtmpD0); // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) mmtmpD1 = _mm_shufflelo_epi16(dl_ch128[0],_MM_SHUFFLE(2,3,0,1)); mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]); - // print_ints("im",&mmtmpD1); mmtmpD1 = _mm_madd_epi16(mmtmpD1,dl_ch128i[0]); + // print_ints("im",&mmtmpD1); // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); - // print_ints("re(shift)",&mmtmpD0); + // print_ints("re(shift)",&mmtmpD0); mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); - // print_ints("im(shift)",&mmtmpD1); + // print_ints("im(shift)",&mmtmpD1); mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); - // print_ints("c0",&mmtmpD2); - // print_ints("c1",&mmtmpD3); + // print_ints("c0",&mmtmpD2); + // print_ints("c1",&mmtmpD3); dl_ch_rho128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3); // multiply by conjugated channel @@ -1304,6 +1852,8 @@ void dlsch_detection_mrc(LTE_DL_FRAME_PARMS *frame_parms, rho128_0 = (__m128i *) &rho[0][symbol*frame_parms->N_RB_DL*12]; rho128_1 = (__m128i *) &rho[1][symbol*frame_parms->N_RB_DL*12]; for (i=0;i<nb_rb*3;i++) { + // print_shorts("mrc rho0:",&rho128_0[i]); + // print_shorts("mrc rho1:",&rho128_1[i]); rho128_0[i] = _mm_adds_epi16(_mm_srai_epi16(rho128_0[i],1),_mm_srai_epi16(rho128_1[i],1)); } } @@ -1390,8 +1940,8 @@ void dlsch_channel_level(int **dl_ch_estimates_ext, short rb; unsigned char aatx,aarx,nre=12,symbol_mod; - __m128i *dl_ch128; - + __m128i *dl_ch128,avg128D; + symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; for (aatx=0;aatx<frame_parms->nb_antennas_tx_eNB;aatx++) @@ -1443,7 +1993,81 @@ void dlsch_channel_level(int **dl_ch_estimates_ext, } //compute average channel_level of effective (precoded) channel -void dlsch_channel_level_prec(int **dl_ch_estimates_ext, +void dlsch_channel_level_TM3(int **dl_ch_estimates_ext, + LTE_DL_FRAME_PARMS *frame_parms, + int *avg, + uint8_t symbol, + unsigned short nb_rb){ + + short rb; + unsigned char aarx,nre=12,symbol_mod; + __m128i *dl_ch0_128,*dl_ch1_128, dl_ch0_128_tmp, dl_ch1_128_tmp,avg128D; + + symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; + + //clear average level + avg128D = _mm_xor_si128(avg128D,avg128D); + avg[0] = 0; + avg[1] = 0; + // 5 is always a symbol with no pilots for both normal and extended prefix + + if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==0)) + nre=8; + else if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==1)) + nre=10; + else + nre=12; + + for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++) { + dl_ch0_128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; + dl_ch1_128 = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; + + for (rb=0;rb<nb_rb;rb++) { + + dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[0]); + dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[0]); + + prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp); + // mmtmpD0 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp); + avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp)); + + dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[1]); + dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[1]); + + prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp); + // mmtmpD1 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp); + avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp)); + + if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==0)) { + dl_ch0_128+=2; + dl_ch1_128+=2; + } + else { + dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[2]); + dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[2]); + + prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp); + // mmtmpD2 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp); + avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp)); + + dl_ch0_128+=3; + dl_ch1_128+=3; + } + } + avg[aarx] = (((int*)&avg128D)[0])/(nb_rb*nre) + + (((int*)&avg128D)[1])/(nb_rb*nre) + + (((int*)&avg128D)[2])/(nb_rb*nre) + + (((int*)&avg128D)[3])/(nb_rb*nre); + } + // choose maximum of the 2 effective channels + avg[0] = cmax(avg[0],avg[1]); + + _mm_empty(); + _m_empty(); +} + +//compute average channel_level of effective (precoded) channel +void dlsch_channel_level_TM56(int **dl_ch_estimates_ext, LTE_DL_FRAME_PARMS *frame_parms, unsigned char *pmi_ext, int *avg, @@ -1452,7 +2076,7 @@ void dlsch_channel_level_prec(int **dl_ch_estimates_ext, short rb; unsigned char aarx,nre=12,symbol_mod; - __m128i *dl_ch128_0,*dl_ch128_1, dl_ch128_0_tmp, dl_ch128_1_tmp; + __m128i *dl_ch0_128,*dl_ch1_128, dl_ch0_128_tmp, dl_ch1_128_tmp,avg128D; symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; @@ -1470,39 +2094,39 @@ void dlsch_channel_level_prec(int **dl_ch_estimates_ext, nre=12; for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++) { - dl_ch128_0 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch128_1 = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; + dl_ch0_128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; + dl_ch1_128 = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; for (rb=0;rb<nb_rb;rb++) { - dl_ch128_0_tmp = _mm_load_si128(&dl_ch128_0[0]); - dl_ch128_1_tmp = _mm_load_si128(&dl_ch128_1[0]); + dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[0]); + dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[0]); - prec2A_128(pmi_ext[rb],&dl_ch128_0_tmp,&dl_ch128_1_tmp); - mmtmpD0 = _mm_madd_epi16(dl_ch128_0_tmp,dl_ch128_0_tmp); - avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128_0_tmp,dl_ch128_0_tmp)); + prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128_tmp,&dl_ch1_128_tmp); + // mmtmpD0 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp); + avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp)); - dl_ch128_0_tmp = _mm_load_si128(&dl_ch128_0[1]); - dl_ch128_1_tmp = _mm_load_si128(&dl_ch128_1[1]); + dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[1]); + dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[1]); - prec2A_128(pmi_ext[rb],&dl_ch128_0_tmp,&dl_ch128_1_tmp); - mmtmpD1 = _mm_madd_epi16(dl_ch128_0_tmp,dl_ch128_0_tmp); - avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128_0_tmp,dl_ch128_0_tmp)); + prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128_tmp,&dl_ch1_128_tmp); + // mmtmpD1 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp); + avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp)); if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==0)) { - dl_ch128_0+=2; - dl_ch128_1+=2; + dl_ch0_128+=2; + dl_ch1_128+=2; } else { - dl_ch128_0_tmp = _mm_load_si128(&dl_ch128_0[2]); - dl_ch128_1_tmp = _mm_load_si128(&dl_ch128_1[2]); + dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[2]); + dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[2]); - prec2A_128(pmi_ext[rb],&dl_ch128_0_tmp,&dl_ch128_1_tmp); - mmtmpD2 = _mm_madd_epi16(dl_ch128_0_tmp,dl_ch128_0_tmp); - avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128_0_tmp,dl_ch128_0_tmp)); + prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128_tmp,&dl_ch1_128_tmp); + // mmtmpD2 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp); + avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp)); - dl_ch128_0+=3; - dl_ch128_1+=3; + dl_ch0_128+=3; + dl_ch1_128+=3; } } avg[aarx] = (((int*)&avg128D)[0])/(nb_rb*nre) + @@ -1642,6 +2266,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, unsigned int *rb_alloc, unsigned char symbol, unsigned char subframe, + uint32_t high_speed_flag, LTE_DL_FRAME_PARMS *frame_parms) { @@ -1672,16 +2297,16 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, poffset=3; for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++) { - - dl_ch0 = &dl_ch_estimates[aarx][5+(symbol*(frame_parms->ofdm_symbol_size))]; + + if (high_speed_flag == 1) + dl_ch0 = &dl_ch_estimates[aarx][5+(symbol*(frame_parms->ofdm_symbol_size))]; + else + dl_ch0 = &dl_ch_estimates[aarx][5]; dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*(frame_parms->N_RB_DL*12)]; rxF_ext = &rxdataF_ext[aarx][symbol*(frame_parms->N_RB_DL*12)]; -#ifndef NEW_FFT - rxF = &rxdataF[aarx][(frame_parms->first_carrier_offset + (symbol*(frame_parms->ofdm_symbol_size)))*2]; -#else rxF = &rxdataF[aarx][(frame_parms->first_carrier_offset + (symbol*(frame_parms->ofdm_symbol_size)))]; -#endif + if ((frame_parms->N_RB_DL&1) == 0) // even number of RBs for (rb=0;rb<frame_parms->N_RB_DL;rb++) { @@ -1698,11 +2323,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, // For second half of RBs skip DC carrier if (rb==(frame_parms->N_RB_DL>>1)) { -#ifndef NEW_FFT - rxF = &rxdataF[aarx][(1 + (symbol*(frame_parms->ofdm_symbol_size)))*2]; -#else rxF = &rxdataF[aarx][(1 + (symbol*(frame_parms->ofdm_symbol_size)))]; -#endif //dl_ch0++; } @@ -1710,20 +2331,17 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, *pmi_ext = (pmi>>((rb>>2)<<1))&3; memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int)); /* - printf("rb %d\n",rb); - for (i=0;i<12;i++) - printf("(%d %d)",((short *)dl_ch0)[i<<1],((short*)dl_ch0)[1+(i<<1)]); - printf("\n"); + printf("rb %d\n",rb); + for (i=0;i<12;i++) + printf("(%d %d)",((short *)dl_ch0)[i<<1],((short*)dl_ch0)[1+(i<<1)]); + printf("\n"); */ if (pilots==0) { for (i=0;i<12;i++) { -#ifndef NEW_FFT - rxF_ext[i]=rxF[i<<1]; -#else rxF_ext[i]=rxF[i]; -#endif /* - printf("%d : (%d,%d)\n",(rxF+i-&rxdataF[aarx][( (symbol*(frame_parms->ofdm_symbol_size)))]), - ((short*)&rxF[i])[0],((short*)&rxF[i])[1]);*/ + /* + printf("%d : (%d,%d)\n",(rxF+i-&rxdataF[aarx][( (symbol*(frame_parms->ofdm_symbol_size)))]), + ((short*)&rxF[i])[0],((short*)&rxF[i])[1]);*/ } dl_ch0_ext+=12; rxF_ext+=12; @@ -1733,11 +2351,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, for (i=0;i<12;i++) { if ((i!=(frame_parms->nushift+poffset)) && (i!=((frame_parms->nushift+poffset+6)%12))) { -#ifndef NEW_FFT - rxF_ext[j]=rxF[i<<1]; -#else rxF_ext[j]=rxF[i]; -#endif // printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); dl_ch0_ext[j++]=dl_ch0[i]; @@ -1749,11 +2363,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, nb_rb++; } dl_ch0+=12; -#ifndef NEW_FFT - rxF+=24; -#else rxF+=12; -#endif } else { // Odd number of RBs @@ -1836,33 +2446,21 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, if (skip_half==1) { memcpy(dl_ch0_ext,dl_ch0,6*sizeof(int)); for (i=0;i<6;i++) -#ifndef NEW_FFT - rxF_ext[i]=rxF[i<<1]; -#else rxF_ext[i]=rxF[i]; -#endif dl_ch0_ext+=6; rxF_ext+=6; } else if (skip_half==2) { memcpy(dl_ch0_ext,dl_ch0+6,6*sizeof(int)); for (i=0;i<6;i++) -#ifndef NEW_FFT - rxF_ext[i]=rxF[(i+6)<<1]; -#else rxF_ext[i]=rxF[(i+6)]; -#endif dl_ch0_ext+=6; rxF_ext+=6; } else { memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int)); for (i=0;i<12;i++) -#ifndef NEW_FFT - rxF_ext[i]=rxF[i<<1]; -#else rxF_ext[i]=rxF[i]; -#endif dl_ch0_ext+=12; rxF_ext+=12; } @@ -1873,11 +2471,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, if (skip_half==1) { for (i=0;i<6;i++) { if (i!=((frame_parms->nushift+poffset)%6)) { -#ifdef NEW_FFT - rxF_ext[j]=rxF[i<<1]; -#else rxF_ext[j]=rxF[i]; -#endif // printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); dl_ch0_ext[j++]=dl_ch0[i]; } @@ -1888,11 +2482,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, else if (skip_half==2) { for (i=0;i<6;i++) { if (i!=((frame_parms->nushift+poffset)%6)) { -#ifndef NEW_FFT - rxF_ext[j]=rxF[(i+6)<<1]; -#else rxF_ext[j]=rxF[(i+6)]; -#endif // printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); dl_ch0_ext[j++]=dl_ch0[i+6]; } @@ -1904,11 +2494,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, for (i=0;i<12;i++) { if ((i!=(frame_parms->nushift+poffset)) && (i!=((frame_parms->nushift+poffset+6)%12))) { -#ifndef NEW_FFT - rxF_ext[j]=rxF[i<<1]; -#else rxF_ext[j]=rxF[i]; -#endif // printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); dl_ch0_ext[j++]=dl_ch0[i]; @@ -1920,11 +2506,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, } } dl_ch0+=12; -#ifndef NEW_FFT - rxF+=24; -#else rxF+=12; -#endif } // first half loop @@ -1971,24 +2553,12 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, if (pilots==0) { for (i=0;i<6;i++) { dl_ch0_ext[i]=dl_ch0[i]; -#ifndef NEW_FFT - rxF_ext[i]=rxF[i<<1]; -#else rxF_ext[i]=rxF[i]; -#endif } -#ifndef NEW_FFT - rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))*2]; -#else rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))]; -#endif for (;i<12;i++) { dl_ch0_ext[i]=dl_ch0[i]; -#ifndef NEW_FFT - rxF_ext[i]=rxF[(1+i-6)<<1]; -#else rxF_ext[i]=rxF[(1+i-6)]; -#endif } dl_ch0_ext+=12; rxF_ext+=12; @@ -1998,27 +2568,15 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, for (i=0;i<6;i++) { if (i!=((frame_parms->nushift+poffset)%6)) { dl_ch0_ext[j]=dl_ch0[i]; -#ifndef NEW_FFT - rxF_ext[j++]=rxF[i<<1]; -#else rxF_ext[j++]=rxF[i]; -#endif // printf("**extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j-1],*(1+(short*)&rxF_ext[j-1])); } } -#ifndef NEW_FFT - rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))*2]; -#else rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))]; -#endif for (;i<12;i++) { if (i!=((frame_parms->nushift+6+poffset)%12)) { dl_ch0_ext[j]=dl_ch0[i]; -#ifndef NEW_FFT - rxF_ext[j++]=rxF[(1+i-6)<<1]; -#else rxF_ext[j++]=rxF[(1+i-6)]; -#endif // printf("**extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j-1],*(1+(short*)&rxF_ext[j-1])); } } @@ -2027,18 +2585,10 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, } // symbol_mod==0 } // rballoc==1 else { -#ifndef NEW_FFT - rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))*2]; -#else rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))]; -#endif } dl_ch0+=12; -#ifndef NEW_FFT - rxF+=14; -#else rxF+=7; -#endif rb++; for (;rb<frame_parms->N_RB_DL;rb++) { @@ -2113,11 +2663,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, if (skip_half==1) { memcpy(dl_ch0_ext,dl_ch0,6*sizeof(int)); for (i=0;i<6;i++) -#ifndef NEW_FFT - rxF_ext[i]=rxF[i<<1]; -#else - rxF_ext[i]=rxF[i]; -#endif + rxF_ext[i]=rxF[i]; dl_ch0_ext+=6; rxF_ext+=6; @@ -2125,11 +2671,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, else if (skip_half==2) { memcpy(dl_ch0_ext,dl_ch0+6,6*sizeof(int)); for (i=0;i<6;i++) -#ifndef NEW_FFT - rxF_ext[i]=rxF[(i+6)<<1]; -#else - rxF_ext[i]=rxF[(i+6)]; -#endif + rxF_ext[i]=rxF[(i+6)]; dl_ch0_ext+=6; rxF_ext+=6; @@ -2137,11 +2679,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, else { memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int)); for (i=0;i<12;i++) -#ifndef NEW_FFT - rxF_ext[i]=rxF[i<<1]; -#else - rxF_ext[i]=rxF[i]; -#endif + rxF_ext[i]=rxF[i]; dl_ch0_ext+=12; rxF_ext+=12; } @@ -2152,11 +2690,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, if (skip_half==1) { for (i=0;i<6;i++) { if (i!=((frame_parms->nushift+poffset)%6)) { -#ifndef NEW_FFT - rxF_ext[j]=rxF[i<<1]; -#else rxF_ext[j]=rxF[i]; -#endif // printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); dl_ch0_ext[j++]=dl_ch0[i]; } @@ -2167,11 +2701,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, else if (skip_half==2) { for (i=0;i<6;i++) { if (i!=((frame_parms->nushift+poffset)%6)) { -#ifndef NEW_FFT - rxF_ext[j]=rxF[(i+6)<<1]; -#else rxF_ext[j]=rxF[(i+6)]; -#endif // printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); dl_ch0_ext[j++]=dl_ch0[i+6]; } @@ -2183,11 +2713,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, for (i=0;i<12;i++) { if ((i!=(frame_parms->nushift+poffset)) && (i!=((frame_parms->nushift+poffset+6)%12))) { -#ifndef NEW_FFT - rxF_ext[j]=rxF[i<<1]; -#else rxF_ext[j]=rxF[i]; -#endif // printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); dl_ch0_ext[j++]=dl_ch0[i]; } @@ -2198,12 +2724,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, } // pilots=0 } dl_ch0+=12; -#ifndef NEW_FFT - rxF+=24; -#else rxF+=12; -#endif - } } } @@ -2223,6 +2744,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, unsigned int *rb_alloc, unsigned char symbol, unsigned char subframe, + uint32_t high_speed_flag, LTE_DL_FRAME_PARMS *frame_parms) { @@ -2251,20 +2773,21 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, } for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++) { - - dl_ch0 = &dl_ch_estimates[aarx][5+(symbol*(frame_parms->ofdm_symbol_size))]; + + if (high_speed_flag==1) { + dl_ch0 = &dl_ch_estimates[aarx][5+(symbol*(frame_parms->ofdm_symbol_size))]; + dl_ch1 = &dl_ch_estimates[2+aarx][5+(symbol*(frame_parms->ofdm_symbol_size))]; + } + else { + dl_ch0 = &dl_ch_estimates[aarx][5]; + dl_ch1 = &dl_ch_estimates[2+aarx][5]; + } dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*(frame_parms->N_RB_DL*12)]; - dl_ch1 = &dl_ch_estimates[2+aarx][5+(symbol*(frame_parms->ofdm_symbol_size))]; dl_ch1_ext = &dl_ch_estimates_ext[2+aarx][symbol*(frame_parms->N_RB_DL*12)]; pmi_loc = pmi_ext; rxF_ext = &rxdataF_ext[aarx][symbol*(frame_parms->N_RB_DL*12)]; - -#ifndef NEW_FFT - rxF = &rxdataF[aarx][(frame_parms->first_carrier_offset + (symbol*(frame_parms->ofdm_symbol_size)))*2]; -#else rxF = &rxdataF[aarx][(frame_parms->first_carrier_offset + (symbol*(frame_parms->ofdm_symbol_size)))]; -#endif if ((frame_parms->N_RB_DL&1) == 0) // even number of RBs for (rb=0;rb<frame_parms->N_RB_DL;rb++) { @@ -2282,11 +2805,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, // For second half of RBs skip DC carrier if (rb==(frame_parms->N_RB_DL>>1)) { -#ifndef NEW_FFT - rxF = &rxdataF[aarx][(1 + (symbol*(frame_parms->ofdm_symbol_size)))*2]; -#else rxF = &rxdataF[aarx][(1 + (symbol*(frame_parms->ofdm_symbol_size)))]; -#endif //dl_ch0++; //dl_ch1++; } @@ -2361,11 +2880,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, printf("\n");*/ for (i=0;i<12;i++) { -#ifndef NEW_FFT - rxF_ext[i]=rxF[i<<1]; -#else rxF_ext[i]=rxF[i]; -#endif // printf("%d : (%d,%d)\n",(rxF+(2*i)-&rxdataF[(aatx<<1)+aarx][( (symbol*(frame_parms->ofdm_symbol_size)))*2])/2, // ((short*)&rxF[i<<1])[0],((short*)&rxF[i<<1])[0]); } @@ -2381,11 +2896,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, (i!=frame_parms->nushift+3) && (i!=frame_parms->nushift+6) && (i!=((frame_parms->nushift+9)%12))) { -#ifndef NEW_FFT - rxF_ext[j]=rxF[i<<1]; -#else rxF_ext[j]=rxF[i]; -#endif // printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); dl_ch0_ext[j]=dl_ch0[i]; dl_ch1_ext[j++]=dl_ch1[i]; @@ -2399,12 +2910,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, } dl_ch0+=12; dl_ch1+=12; -#ifndef NEW_FFT - rxF+=24; -#else rxF+=12; -#endif - } else { // Odd number of RBs for (rb=0;rb<frame_parms->N_RB_DL>>1;rb++) { @@ -2484,11 +2990,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, memcpy(dl_ch0_ext,dl_ch0,6*sizeof(int)); memcpy(dl_ch1_ext,dl_ch1,6*sizeof(int)); for (i=0;i<6;i++) -#ifndef NEW_FFT - rxF_ext[i]=rxF[i<<1]; -#else - rxF_ext[i]=rxF[i]; -#endif + rxF_ext[i]=rxF[i]; dl_ch0_ext+=6; dl_ch1_ext+=6; rxF_ext+=6; @@ -2497,11 +2999,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, memcpy(dl_ch0_ext,dl_ch0+6,6*sizeof(int)); memcpy(dl_ch1_ext,dl_ch1+6,6*sizeof(int)); for (i=0;i<6;i++) -#ifndef NEW_FFT - rxF_ext[i]=rxF[(i+6)<<1]; -#else - rxF_ext[i]=rxF[(i+6)]; -#endif + rxF_ext[i]=rxF[(i+6)]; dl_ch0_ext+=6; dl_ch1_ext+=6; rxF_ext+=6; @@ -2510,11 +3008,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int)); memcpy(dl_ch1_ext,dl_ch1,12*sizeof(int)); for (i=0;i<12;i++) -#ifndef NEW_FFT - rxF_ext[i]=rxF[i<<1]; -#else - rxF_ext[i]=rxF[i]; -#endif + rxF_ext[i]=rxF[i]; dl_ch0_ext+=12; dl_ch1_ext+=12; rxF_ext+=12; @@ -2526,11 +3020,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, for (i=0;i<6;i++) { if ((i!=frame_parms->nushift) && (i!=((frame_parms->nushift+3)%6))) { -#ifndef NEW_FFT - rxF_ext[j]=rxF[i<<1]; -#else rxF_ext[j]=rxF[i]; -#endif // printf("(pilots,skip1)extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); dl_ch0_ext[j]=dl_ch0[i]; dl_ch1_ext[j++]=dl_ch1[i]; @@ -2544,11 +3034,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, for (i=0;i<6;i++) { if ((i!=frame_parms->nushift) && (i!=((frame_parms->nushift+3)%6))) { -#ifndef NEW_FFT - rxF_ext[j]=rxF[(i+6)<<1]; -#else rxF_ext[j]=rxF[(i+6)]; -#endif // printf("(pilots,skip2)extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); dl_ch0_ext[j]=dl_ch0[i+6]; dl_ch1_ext[j++]=dl_ch1[i+6]; @@ -2565,11 +3051,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, (i!=frame_parms->nushift+3) && (i!=frame_parms->nushift+6) && (i!=((frame_parms->nushift+9)%12))) { -#ifndef NEW_FFT - rxF_ext[j]=rxF[i<<1]; -#else rxF_ext[j]=rxF[i]; -#endif // printf("(pilots)extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); dl_ch0_ext[j] =dl_ch0[i]; @@ -2589,11 +3071,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, dl_ch0+=12; dl_ch1+=12; -#ifndef NEW_FFT - rxF+=24; -#else rxF+=12; -#endif } @@ -2647,25 +3125,13 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, for (i=0;i<6;i++) { dl_ch0_ext[i]=dl_ch0[i]; dl_ch1_ext[i]=dl_ch1[i]; -#ifndef NEW_FFT - rxF_ext[i]=rxF[i<<1]; -#else rxF_ext[i]=rxF[i]; -#endif } -#ifndef NEW_FFT - rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))*2]; -#else rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))]; -#endif for (;i<12;i++) { dl_ch0_ext[i]=dl_ch0[i]; dl_ch1_ext[i]=dl_ch1[i]; -#ifndef NEW_FFT - rxF_ext[i]=rxF[(1+i-6)<<1]; -#else rxF_ext[i]=rxF[(1+i-6)]; -#endif } dl_ch0_ext+=12; dl_ch1_ext+=12; @@ -2678,55 +3144,34 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, (i!=((frame_parms->nushift+3)%6))){ dl_ch0_ext[j]=dl_ch0[i]; dl_ch1_ext[j]=dl_ch1[i]; -#ifndef NEW_FFT - rxF_ext[j++]=rxF[i<<1]; -#else rxF_ext[j++]=rxF[i]; -#endif // printf("(pilots center)extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j-1],*(1+(short*)&rxF_ext[j-1])); // printf("extract rb %d, re %d => ch0 (%d,%d) ch1 (%d,%d)\n",rb,i, // *(short *)&dl_ch0_ext[j-1],*(1+(short*)&dl_ch0_ext[j-1]), // *(short *)&dl_ch1_ext[j-1],*(1+(short*)&dl_ch1_ext[j-1])); } - } -#ifndef NEW_FFT - rxF = &rxdataF[aarx][symbol*(frame_parms->ofdm_symbol_size)*2]; -#else - rxF = &rxdataF[aarx][symbol*(frame_parms->ofdm_symbol_size)]; -#endif - - for (;i<12;i++) { - if ((i!=((frame_parms->nushift+6)%12)) && - (i!=((frame_parms->nushift+9)%12))){ - dl_ch0_ext[j]=dl_ch0[i]; - dl_ch1_ext[j]=dl_ch1[i]; -#ifndef NEW_FFT - rxF_ext[j++]=rxF[(1+i-6)<<1]; -#else - rxF_ext[j++]=rxF[(1+i-6)]; -#endif - // printf("(pilots center )extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j-1],*(1+(short*)&rxF_ext[j-1])); - } + } + rxF = &rxdataF[aarx][symbol*(frame_parms->ofdm_symbol_size)]; + + for (;i<12;i++) { + if ((i!=((frame_parms->nushift+6)%12)) && + (i!=((frame_parms->nushift+9)%12))){ + dl_ch0_ext[j]=dl_ch0[i]; + dl_ch1_ext[j]=dl_ch1[i]; + rxF_ext[j++]=rxF[(1+i-6)]; } - dl_ch0_ext+=8; - dl_ch1_ext+=8; - rxF_ext+=8; } + dl_ch0_ext+=8; + dl_ch1_ext+=8; + rxF_ext+=8; + } } else { -#ifndef NEW_FFT - rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))*2]; -#else rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))]; -#endif } dl_ch0+=12; dl_ch1+=12; -#ifndef NEW_FFT - rxF+=14; -#else rxF+=7; -#endif rb++; for (;rb<frame_parms->N_RB_DL;rb++) { @@ -2806,11 +3251,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, memcpy(dl_ch0_ext,dl_ch0,6*sizeof(int)); memcpy(dl_ch1_ext,dl_ch1,6*sizeof(int)); for (i=0;i<6;i++) -#ifndef NEW_FFT - rxF_ext[i]=rxF[i<<1]; -#else - rxF_ext[i]=rxF[i]; -#endif + rxF_ext[i]=rxF[i]; dl_ch0_ext+=6; dl_ch1_ext+=6; rxF_ext+=6; @@ -2820,11 +3261,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, memcpy(dl_ch0_ext,dl_ch0+6,6*sizeof(int)); memcpy(dl_ch1_ext,dl_ch1+6,6*sizeof(int)); for (i=0;i<6;i++) -#ifndef NEW_FFT - rxF_ext[i]=rxF[(i+6)<<1]; -#else - rxF_ext[i]=rxF[(i+6)]; -#endif + rxF_ext[i]=rxF[(i+6)]; dl_ch0_ext+=6; dl_ch1_ext+=6; rxF_ext+=6; @@ -2834,11 +3271,8 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int)); memcpy(dl_ch1_ext,dl_ch1,12*sizeof(int)); for (i=0;i<12;i++) -#ifndef NEW_FFT - rxF_ext[i]=rxF[i<<1]; -#else - rxF_ext[i]=rxF[i]; -#endif + rxF_ext[i]=rxF[i]; + dl_ch0_ext+=12; dl_ch1_ext+=12; rxF_ext+=12; @@ -2850,11 +3284,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, for (i=0;i<6;i++) { if ((i!=(frame_parms->nushift)) && (i!=((frame_parms->nushift+3)%6))){ -#ifndef NEW_FFT - rxF_ext[j]=rxF[i<<1]; -#else rxF_ext[j]=rxF[i]; -#endif // printf("(skip1,pilots)extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); dl_ch0_ext[j]=dl_ch0[i]; dl_ch1_ext[j++]=dl_ch1[i]; @@ -2868,11 +3298,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, for (i=0;i<6;i++) { if ((i!=(frame_parms->nushift)) && (i!=((frame_parms->nushift+3)%6))){ -#ifndef NEW_FFT - rxF_ext[j]=rxF[(i+6)<<1]; -#else rxF_ext[j]=rxF[(i+6)]; -#endif // printf("(skip2,pilots)extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); dl_ch0_ext[j]=dl_ch0[i+6]; dl_ch1_ext[j++]=dl_ch1[i+6]; @@ -2888,11 +3314,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, (i!=frame_parms->nushift+3) && (i!=frame_parms->nushift+6) && (i!=((frame_parms->nushift+9)%12))) { -#ifndef NEW_FFT - rxF_ext[j]=rxF[i<<1]; -#else rxF_ext[j]=rxF[i]; -#endif // printf("(pilots)extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); dl_ch0_ext[j]=dl_ch0[i]; dl_ch1_ext[j++]=dl_ch1[i]; @@ -2910,11 +3332,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, } dl_ch0+=12; dl_ch1+=12; -#ifndef NEW_FFT - rxF+=24; -#else rxF+=12; -#endif } } } @@ -2941,27 +3359,59 @@ void dump_dlsch2(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint16_t coded_bits_per sprintf(fname,"dlsch%d_rxF_ext0.m",eNB_id); sprintf(vname,"dl%d_rxF_ext0",eNB_id); write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_ext[0],12*N_RB_DL*nsymb,1,1); + if (phy_vars_ue->lte_frame_parms.nb_antennas_rx >1) { + sprintf(fname,"dlsch%d_rxF_ext1.m",eNB_id); + sprintf(vname,"dl%d_rxF_ext1",eNB_id); + write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_ext[1],12*N_RB_DL*nsymb,1,1); + } sprintf(fname,"dlsch%d_ch_ext00.m",eNB_id); sprintf(vname,"dl%d_ch_ext00",eNB_id); write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1); + if (phy_vars_ue->lte_frame_parms.nb_antennas_rx == 2) { + sprintf(fname,"dlsch%d_ch_ext01.m",eNB_id); + sprintf(vname,"dl%d_ch_ext01",eNB_id); + write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1); + } + if (phy_vars_ue->lte_frame_parms.nb_antennas_tx_eNB == 2) { + sprintf(fname,"dlsch%d_ch_ext10.m",eNB_id); + sprintf(vname,"dl%d_ch_ext10",eNB_id); + write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1); + if (phy_vars_ue->lte_frame_parms.nb_antennas_rx == 2) { + sprintf(fname,"dlsch%d_ch_ext11.m",eNB_id); + sprintf(vname,"dl%d_ch_ext11",eNB_id); + write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1); + } + } /* write_output("dlsch%d_ch_ext01.m","dl01_ch0_ext",lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1); write_output("dlsch%d_ch_ext10.m","dl10_ch0_ext",lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1); write_output("dlsch%d_ch_ext11.m","dl11_ch0_ext",lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1); - write_output("dlsch%d_rho.m","dl_rho",lte_ue_pdsch_vars[eNB_id]->rho[0],12*N_RB_DL*nsymb,1,1); */ + sprintf(fname,"dlsch%d_rho.m",eNB_id); + sprintf(vname,"dl_rho%d",eNB_id); + write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[0],12*N_RB_DL*nsymb,1,1); + sprintf(fname,"dlsch%d_rxF_comp0.m",eNB_id); sprintf(vname,"dl%d_rxF_comp0",eNB_id); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp[0],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb,1,1); + + if (phy_vars_ue->lte_frame_parms.nb_antennas_tx_eNB == 2) { + sprintf(fname,"dlsch%d_rxF_comp1.m",eNB_id); + sprintf(vname,"dl%d_rxF_comp1",eNB_id); + write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[0],12*N_RB_DL*nsymb,1,1); + } + sprintf(fname,"dlsch%d_rxF_llr.m",eNB_id); sprintf(vname,"dl%d_llr",eNB_id); write_output(fname,vname, phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0],coded_bits_per_codeword,1,0); sprintf(fname,"dlsch%d_mag1.m",eNB_id); sprintf(vname,"dl%d_mag1",eNB_id); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_mag[0],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb,1,1); sprintf(fname,"dlsch%d_mag2.m",eNB_id); sprintf(vname,"dl%d_mag2",eNB_id); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_magb[0],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb,1,1); + + printf("log2_maxh = %d\n",phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->log2_maxh); } #endif diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c index 8dfc3ad4e032978c7b85f3d8c353e57b158d9a9e..ba83156742309f1f02b79b7c23ab539d19491aaf 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c @@ -1063,7 +1063,7 @@ length = number of resource elements xmm0 = _mm_xor_si128(xmm0,xmm0); // ZERO - // 1 term for nominator of LLR + // 1 term for numerator of LLR xmm3 = _mm_subs_epi16(y1r_over2,rho_rpi); A = _mm_abs_epi16(xmm3); // A = |y1r/2 - rho/sqrt(8)| xmm2 = _mm_adds_epi16(A,y0i_over2); // = |y1r/2 - rho/sqrt(8)| + y0i/2 @@ -1071,7 +1071,7 @@ length = number of resource elements B = _mm_abs_epi16(xmm3); // B = |y1i/2 - rho*/sqrt(8)| logmax_num_re0 = _mm_adds_epi16(B,xmm2); // = |y1r/2 - rho/sqrt(8)|+|y1i/2 - rho*/sqrt(8)| + y0i/2 - // 2 term for nominator of LLR + // 2 term for numerator of LLR xmm3 = _mm_subs_epi16(y1r_over2,rho_rmi); C = _mm_abs_epi16(xmm3); // C = |y1r/2 - rho*/4| xmm2 = _mm_subs_epi16(C,y0i_over2); // = |y1r/2 - rho*/4| - y0i/2 diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c index 0375f277953ec3786066cf5aa07b4112a3b5613a..12271d13f1677ea73589fa8b68e68ad1168d8be7 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c @@ -131,25 +131,39 @@ void layer1prec2A(int32_t *antenna0_sample, int32_t *antenna1_sample, uint8_t pr ((int16_t *)antenna1_sample)[1] = (int16_t)((((int16_t *)antenna1_sample)[1]*ONE_OVER_SQRT2_Q15)>>15); */ } -int allocate_REs_in_RB(mod_sym_t **txdataF, +int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, + mod_sym_t **txdataF, uint32_t *jj, + uint32_t *jj2, uint16_t re_offset, uint32_t symbol_offset, - uint8_t *output, - MIMO_mode_t mimo_mode, - uint8_t nu, + LTE_DL_eNB_HARQ_t *dlsch0_harq, + LTE_DL_eNB_HARQ_t *dlsch1_harq, uint8_t pilots, - uint8_t mod_order, - uint8_t precoder_index, int16_t amp, - int16_t *qam_table_s, + uint8_t precoder_index, + int16_t *qam_table_s0, + int16_t *qam_table_s1, uint32_t *re_allocated, uint8_t skip_dc, - uint8_t skip_half, - uint8_t use2ndpilots, - uint8_t Nlayers, - uint8_t first_layer, - LTE_DL_FRAME_PARMS *frame_parms) { + uint8_t skip_half) { + + + uint8_t *x0 = dlsch0_harq->e; + MIMO_mode_t mimo_mode = dlsch0_harq->mimo_mode; + + int first_layer0 = dlsch0_harq->first_layer; + int Nlayers0 = dlsch0_harq->Nlayers; + uint8_t mod_order0 = get_Qm(dlsch0_harq->mcs); + + + uint8_t *x1; + int Nlayers1; + int first_layer1; + uint8_t mod_order1; + + + int use2ndpilots = (frame_parms->mode1_flag==1)?1:0; uint32_t tti_offset,aa; uint8_t re; @@ -157,13 +171,36 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, uint8_t qam64_table_offset_im = 0; uint8_t qam16_table_offset_re = 0; uint8_t qam16_table_offset_im = 0; + uint8_t qam64_table_offset_re0 = 0; + uint8_t qam64_table_offset_im0 = 0; + uint8_t qam16_table_offset_re0 = 0; + uint8_t qam16_table_offset_im0 = 0; + uint8_t qam64_table_offset_re1 = 0; + uint8_t qam64_table_offset_im1 = 0; + uint8_t qam16_table_offset_re1 = 0; + uint8_t qam16_table_offset_im1 = 0; + int16_t xx0_re,xx1_re; + int16_t xx0_im,xx1_im; + int16_t gain_lin_QPSK;//,gain_lin_16QAM1,gain_lin_16QAM2; int16_t re_off=re_offset; - gain_lin_QPSK = (int16_t)((amp*ONE_OVER_SQRT2_Q15)>>15); + uint8_t first_re,last_re; int32_t tmp_sample1,tmp_sample2; int16_t tmp_amp=amp; uint8_t layer; + int s=1; + + gain_lin_QPSK = (int16_t)((amp*ONE_OVER_SQRT2_Q15)>>15); + // if (mimo_mode == LARGE_CDD) gain_lin_QPSK>>=1; + + if (dlsch1_harq) { + x1 = dlsch1_harq->e; + Nlayers1 = dlsch1_harq->Nlayers; + first_layer1 = dlsch1_harq->first_layer; + mod_order1 = get_Qm(dlsch1_harq->mcs); + + } /* switch (mod_order) { case 2: @@ -186,7 +223,7 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, */ #ifdef DEBUG_DLSCH_MODULATION - printf("allocate_re (mod %d): symbol_offset %d re_offset %d (%d,%d), jj %d -> %d,%d, nu %d\n",mod_order,symbol_offset,re_offset,skip_dc,skip_half,*jj, output[*jj], output[1+*jj],nu); + printf("allocate_re (mod %d): symbol_offset %d re_offset %d (%d,%d), jj %d -> %d,%d\n",mod_order0,symbol_offset,re_offset,skip_dc,skip_half,*jj, x0[*jj], x0[1+*jj]); #endif first_re=0; @@ -198,7 +235,8 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, first_re=6; for (re=first_re;re<last_re;re++) { - + + if ((skip_dc == 1) && (re==6)) re_off=re_off - frame_parms->ofdm_symbol_size+1; @@ -212,15 +250,15 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, if (mimo_mode == SISO) { //SISO mapping *re_allocated = *re_allocated + 1; - switch (mod_order) { + switch (mod_order0) { case 2: //QPSK - // printf("%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + //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; aa<frame_parms->nb_antennas_tx; aa++) { - ((int16_t*)&txdataF[aa][tti_offset])[0] += (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i + ((int16_t*)&txdataF[aa][tti_offset])[0] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i } *jj = *jj + 1; for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) { - ((int16_t*)&txdataF[aa][tti_offset])[1] += (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1} + ((int16_t*)&txdataF[aa][tti_offset])[1] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1} } *jj = *jj + 1; @@ -231,24 +269,24 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, qam16_table_offset_re = 0; qam16_table_offset_im = 0; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam16_table_offset_re+=2; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam16_table_offset_im+=2; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam16_table_offset_re+=1; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam16_table_offset_im+=1; *jj=*jj+1; for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) { - ((int16_t *)&txdataF[aa][tti_offset])[0]+=qam_table_s[qam16_table_offset_re]; - ((int16_t *)&txdataF[aa][tti_offset])[1]+=qam_table_s[qam16_table_offset_im]; + ((int16_t *)&txdataF[aa][tti_offset])[0]+=qam_table_s0[qam16_table_offset_re]; + ((int16_t *)&txdataF[aa][tti_offset])[1]+=qam_table_s0[qam16_table_offset_im]; // ((int16_t *)&txdataF[aa][tti_offset])[0]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15); // ((int16_t *)&txdataF[aa][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15); } @@ -261,28 +299,28 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, qam64_table_offset_re = 0; qam64_table_offset_im = 0; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_re+=4; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_im+=4; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_re+=2; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_im+=2; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_re+=1; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_im+=1; *jj=*jj+1; for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) { - ((int16_t *)&txdataF[aa][tti_offset])[0]+=qam_table_s[qam64_table_offset_re];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15); - ((int16_t *)&txdataF[aa][tti_offset])[1]+=qam_table_s[qam64_table_offset_im];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15); + ((int16_t *)&txdataF[aa][tti_offset])[0]+=qam_table_s0[qam64_table_offset_re];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15); + ((int16_t *)&txdataF[aa][tti_offset])[1]+=qam_table_s0[qam64_table_offset_im];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15); } break; @@ -294,29 +332,29 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, // normalization for 2 tx antennas amp = (int16_t)(((int32_t)tmp_amp*ONE_OVER_SQRT2_Q15)>>15); - switch (mod_order) { + switch (mod_order0) { 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] = (x0[*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; + ((int16_t*)&tmp_sample1)[1] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; *jj=*jj+1; // second antenna position n -> -x1* - ((int16_t*)&tmp_sample2)[0] = (output[*jj]==1) ? (gain_lin_QPSK) : -gain_lin_QPSK; + ((int16_t*)&tmp_sample2)[0] = (x0[*jj]==1) ? (gain_lin_QPSK) : -gain_lin_QPSK; *jj=*jj+1; - ((int16_t*)&tmp_sample2)[1] = (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; + ((int16_t*)&tmp_sample2)[1] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; *jj=*jj+1; // normalization for 2 tx antennas - ((int16_t*)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_SQRT2_Q15)>>15); + ((int16_t*)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_SQRT2_Q15)>>15); ((int16_t*)&txdataF[0][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample1)[1]*ONE_OVER_SQRT2_Q15)>>15); - ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_SQRT2_Q15)>>15); - ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_SQRT2_Q15)>>15); - + ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_SQRT2_Q15)>>15); + ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_SQRT2_Q15)>>15); + break; case 4: //16QAM @@ -325,18 +363,18 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, qam16_table_offset_re = 0; qam16_table_offset_im = 0; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam16_table_offset_re+=2; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam16_table_offset_im+=2; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam16_table_offset_re+=1; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam16_table_offset_im+=1; *jj=*jj+1; @@ -347,18 +385,18 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, qam16_table_offset_re = 0; qam16_table_offset_im = 0; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam16_table_offset_re+=2; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam16_table_offset_im+=2; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam16_table_offset_re+=1; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam16_table_offset_im+=1; *jj=*jj+1; @@ -373,22 +411,22 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, qam64_table_offset_re = 0; qam64_table_offset_im = 0; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_re+=4; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_im+=4; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_re+=2; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_im+=2; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_re+=1; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_im+=1; *jj=*jj+1; @@ -399,22 +437,22 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, // Antenna 1 => -x1* qam64_table_offset_re = 0; qam64_table_offset_im = 0; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_re+=4; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_im+=4; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_re+=2; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_im+=2; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_re+=1; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_im+=1; *jj=*jj+1; @@ -437,84 +475,181 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, ((int16_t *)&txdataF[1][tti_offset+2])[1] += -((int16_t *)&txdataF[0][tti_offset])[1]; } } - else if (mimo_mode == ANTCYCLING ) { - *re_allocated = *re_allocated + 1; - switch (mod_order) { - case 2: //QPSK - - ((int16_t*)&txdataF[re&1][tti_offset])[0] += (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; - *jj = *jj + 1; - ((int16_t*)&txdataF[re&1][tti_offset])[1] += (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; - *jj = *jj + 1; - break; - - case 4: //16QAM - - qam16_table_offset_re = 0; - qam16_table_offset_im = 0; + else if (mimo_mode == LARGE_CDD) { - 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; - - ((int16_t *)&txdataF[re&1][tti_offset])[0]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15); - ((int16_t *)&txdataF[re&1][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15); - - - break; - - case 6: //64QAM - - qam64_table_offset_re = 0; - qam64_table_offset_im = 0; + *re_allocated = *re_allocated + 1; - 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; - - ((int16_t *)&txdataF[re&1][tti_offset])[0]+=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15); - ((int16_t *)&txdataF[re&1][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15); - + if (frame_parms->nb_antennas_tx == 2) { + switch (mod_order0) { + default: + LOG_E(PHY,"Unknown mod_order0 %d\n",mod_order0); + xx0_re=xx0_im=0; + break; + case 2: //QPSK + // printf("%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + xx0_re = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; + *jj = *jj + 1; + xx0_im = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; + *jj = *jj + 1; + + + + // printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + break; + + case 4: //16QAM + + qam16_table_offset_re0 = 0; + qam16_table_offset_im0 = 0; + if (x0[*jj] == 1) + qam16_table_offset_re0+=2; + *jj=*jj+1; + if (x0[*jj] == 1) + qam16_table_offset_im0+=2; + *jj=*jj+1; + + if (x0[*jj] == 1) + qam16_table_offset_re0+=1; + *jj=*jj+1; + if (x0[*jj] == 1) + qam16_table_offset_im0+=1; + *jj=*jj+1; + + xx0_re = qam_table_s0[qam16_table_offset_re0]; + xx0_im = qam_table_s0[qam16_table_offset_im0]; + + break; + + case 6: //64QAM + + + qam64_table_offset_re0 = 0; + qam64_table_offset_im0 = 0; + + if (x0[*jj] == 1) + qam64_table_offset_re0+=4; + *jj=*jj+1; + if (x0[*jj] == 1) + qam64_table_offset_im0+=4; + *jj=*jj+1; + if (x0[*jj] == 1) + qam64_table_offset_re0+=2; + *jj=*jj+1; + if (x0[*jj] == 1) + qam64_table_offset_im0+=2; + *jj=*jj+1; + if (x0[*jj] == 1) + qam64_table_offset_re0+=1; + *jj=*jj+1; + if (x0[*jj] == 1) + qam64_table_offset_im0+=1; + *jj=*jj+1; + + xx0_re = qam_table_s0[qam16_table_offset_re0]; + xx0_im = qam_table_s0[qam16_table_offset_im0]; + + + break; + + } + switch (mod_order1) { + default: + LOG_E(PHY,"Unknown mod_order1 %d\n",mod_order1); + xx1_re=xx1_im=0; + break; + case 2: //QPSK + // printf("%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + xx1_re = (x1[*jj2]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; + *jj2 = *jj2 + 1; + xx1_im = (x1[*jj2]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; + *jj2 = *jj2 + 1; + // printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + break; + + case 4: //16QAM + + qam16_table_offset_re1 = 0; + qam16_table_offset_im1 = 0; + if (x1[*jj2] == 1) + qam16_table_offset_re1+=2; + *jj2 = *jj2 + 1; + if (x1[*jj2] == 1) + qam16_table_offset_im1+=2; + *jj2 = *jj2 + 1; + if (x1[*jj2] == 1) + qam16_table_offset_re1+=1; + *jj2 = *jj2 + 1; + if (x1[*jj2] == 1) + qam16_table_offset_im1+=1; + *jj2 = *jj2 + 1; + + xx1_re = qam_table_s1[qam16_table_offset_re1]; + xx1_im = qam_table_s1[qam16_table_offset_im1]; + + break; + + case 6: //64QAM + + qam64_table_offset_re1 = 0; + qam64_table_offset_im1 = 0; + + if (x1[*jj2] == 1) + qam64_table_offset_re0+=4; + *jj2 = *jj2 + 1; + if (x1[*jj2] == 1) + qam64_table_offset_im1+=4; + *jj2 = *jj2 + 1; + if (x1[*jj2] == 1) + qam64_table_offset_re1+=2; + *jj2 = *jj2 + 1; + if (x1[*jj2] == 1) + qam64_table_offset_im1+=2; + *jj2 = *jj2 + 1; + if (x1[*jj2] == 1) + qam64_table_offset_re1+=1; + *jj2 = *jj2 + 1; + if (x1[*jj2] == 1) + qam64_table_offset_im1+=1; + *jj2 = *jj2 + 1; + + xx1_re = qam_table_s1[qam16_table_offset_re1]; + xx1_im = qam_table_s1[qam16_table_offset_im1]; + + + break; + + } + + // This implements the Large CDD precoding for 2 TX antennas + // - - - - - - - - - - - - + //| y0 | | 1 0 || 1 0 || 1 1 || x0 | | x0 + x1 | + //| y1 | = .5 | 0 1 || 0 (-1)^i || 1 -1 || x1 | = .5| (-1)^i(x0 - x1)| + // - - - - - - - - - - - + // Note: Factor .5 is accounted for in amplitude when calling this function + ((int16_t *)&txdataF[0][tti_offset])[0]+=((xx0_re+xx1_re)>>1); + ((int16_t *)&txdataF[1][tti_offset])[0]+=(s*((xx0_re-xx1_re)>>1)); + ((int16_t *)&txdataF[0][tti_offset])[1]+=((xx0_im+xx1_im)>>1); + ((int16_t *)&txdataF[1][tti_offset])[1]+=(s*((xx0_im-xx1_im)>>1)); + /* + printf("CDD: xx0 (%d,%d), xx1(%d,%d), s(%d), txF[0] (%d,%d), txF[1] (%d,%d)\n", + xx0_re,xx0_im,xx1_re,xx1_im, s, ((int16_t *)&txdataF[0][tti_offset])[0],((int16_t *)&txdataF[0][tti_offset])[1], + ((int16_t *)&txdataF[1][tti_offset])[0],((int16_t *)&txdataF[1][tti_offset])[1]); + */ + // s alternates +1/-1 for each RE + s = -s; } } - else if ((mimo_mode >= UNIFORM_PRECODING11)&&(mimo_mode <= PUSCH_PRECODING1)) { // this is for transmission modes 4-6 (1 layer) *re_allocated = *re_allocated + 1; amp = (int16_t)(((int32_t)tmp_amp*ONE_OVER_SQRT2_Q15)>>15); - switch (mod_order) { + switch (mod_order0) { case 2: //QPSK - ((int16_t*)&tmp_sample1)[0] = (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; + ((int16_t*)&tmp_sample1)[0] = (x0[*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; + ((int16_t*)&tmp_sample1)[1] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; *jj = *jj + 1; // normalization for 2 tx antennas @@ -523,8 +658,8 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, if (frame_parms->nb_antennas_tx == 2) { layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index); - ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_SQRT2_Q15)>>15); - ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_SQRT2_Q15)>>15); + ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_SQRT2_Q15)>>15); + ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_SQRT2_Q15)>>15); } break; @@ -534,18 +669,18 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, qam16_table_offset_re = 0; qam16_table_offset_im = 0; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam16_table_offset_re+=2; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam16_table_offset_im+=2; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam16_table_offset_re+=1; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam16_table_offset_im+=1; *jj=*jj+1; @@ -568,22 +703,22 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, qam64_table_offset_re = 0; qam64_table_offset_im = 0; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_re+=4; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_im+=4; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_re+=2; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_im+=2; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_re+=1; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_im+=1; *jj=*jj+1; @@ -614,15 +749,14 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, if (mimo_mode >= TM8) { //TM8,TM9,TM10 - if (is_not_UEspecRS(first_layer,re)) { - switch (mod_order) { + if (is_not_UEspecRS(first_layer0,re)) { + switch (mod_order0) { 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 + for (layer=first_layer0;layer<=(first_layer0+Nlayers0);layer++) { + ((int16_t*)&txdataF[layer][tti_offset])[0] = (x0[*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} + ((int16_t*)&txdataF[layer][tti_offset])[1] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1} *jj = *jj + 1; } break; @@ -631,25 +765,22 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, if (is_not_UEspecRS(layer,re)) { qam16_table_offset_re = 0; qam16_table_offset_im = 0; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam16_table_offset_re+=2; - *jj=*jj+1; - if (output[*jj] == 1) + *jj = *jj + 1; + if (x0[*jj] == 1) qam16_table_offset_im+=2; - *jj=*jj+1; - - - if (output[*jj] == 1) + *jj = *jj + 1; + if (x0[*jj] == 1) qam16_table_offset_re+=1; - *jj=*jj+1; - if (output[*jj] == 1) + *jj = *jj + 1; + if (x0[*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]; + *jj = *jj + 1; + + for (layer=first_layer0;layer<=(first_layer0+Nlayers0);layer++) { + ((int16_t*)&txdataF[layer][tti_offset])[0] = qam_table_s0[qam16_table_offset_re]; + ((int16_t*)&txdataF[layer][tti_offset])[1] = qam_table_s0[qam16_table_offset_im]; } } break; @@ -660,28 +791,28 @@ int allocate_REs_in_RB(mod_sym_t **txdataF, qam64_table_offset_re = 0; qam64_table_offset_im = 0; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_re+=4; - *jj=*jj+1; - if (output[*jj] == 1) + *jj = *jj + 1; + if (x0[*jj] == 1) qam64_table_offset_im+=4; - *jj=*jj+1; - if (output[*jj] == 1) + *jj = *jj + 1; + if (x0[*jj] == 1) qam64_table_offset_re+=2; - *jj=*jj+1; - if (output[*jj] == 1) + *jj = *jj + 1; + if (x0[*jj] == 1) qam64_table_offset_im+=2; - *jj=*jj+1; - if (output[*jj] == 1) + *jj = *jj + 1; + if (x0[*jj] == 1) qam64_table_offset_re+=1; - *jj=*jj+1; - if (output[*jj] == 1) + *jj = *jj + 1; + if (x0[*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]; + *jj = *jj + 1; + + for (layer=first_layer0;layer<=(first_layer0+Nlayers0);layer++) { + ((int16_t*)&txdataF[layer][tti_offset])[0] = qam_table_s0[qam64_table_offset_re]; + ((int16_t*)&txdataF[layer][tti_offset])[1] = qam_table_s0[qam64_table_offset_im]; } break; @@ -704,7 +835,7 @@ int allocate_REs_in_RB_MCH(mod_sym_t **txdataF, uint32_t *jj, uint16_t re_offset, uint32_t symbol_offset, - uint8_t *output, + uint8_t *x0, uint8_t l, uint8_t mod_order, int16_t amp, @@ -725,7 +856,7 @@ int allocate_REs_in_RB_MCH(mod_sym_t **txdataF, uint8_t first_re,last_re; int inc; #ifdef DEBUG_DLSCH_MODULATION - printf("allocate_re_MCH (mod %d): symbol_offset %d re_offset %d (%d), jj %d -> %d,%d\n",mod_order,symbol_offset,re_offset,skip_dc,*jj, output[*jj], output[1+*jj]); + printf("allocate_re_MCH (mod %d): symbol_offset %d re_offset %d (%d), jj %d -> %d,%d\n",mod_order,symbol_offset,re_offset,skip_dc,*jj, x0[*jj], x0[1+*jj]); #endif last_re=12; @@ -754,10 +885,10 @@ int allocate_REs_in_RB_MCH(mod_sym_t **txdataF, 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; aa<frame_parms->nb_antennas_tx; aa++) - ((int16_t*)&txdataF[aa][tti_offset])[0] += (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i + ((int16_t*)&txdataF[aa][tti_offset])[0] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i *jj = *jj + 1; for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) - ((int16_t*)&txdataF[aa][tti_offset])[1] += (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1} + ((int16_t*)&txdataF[aa][tti_offset])[1] += (x0[*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]); @@ -767,18 +898,18 @@ int allocate_REs_in_RB_MCH(mod_sym_t **txdataF, qam16_table_offset_re = 0; qam16_table_offset_im = 0; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam16_table_offset_re+=2; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam16_table_offset_im+=2; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam16_table_offset_re+=1; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam16_table_offset_im+=1; *jj=*jj+1; @@ -797,22 +928,22 @@ int allocate_REs_in_RB_MCH(mod_sym_t **txdataF, qam64_table_offset_re = 0; qam64_table_offset_im = 0; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_re+=4; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_im+=4; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_re+=2; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_im+=2; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_re+=1; *jj=*jj+1; - if (output[*jj] == 1) + if (x0[*jj] == 1) qam64_table_offset_im+=1; *jj=*jj+1; @@ -827,7 +958,11 @@ int allocate_REs_in_RB_MCH(mod_sym_t **txdataF, return(0); } -uint8_t get_pmi(uint8_t N_RB_DL,MIMO_mode_t mode,uint32_t pmi_alloc,uint16_t rb) { +uint8_t get_pmi(uint8_t N_RB_DL,LTE_DL_eNB_HARQ_t *dlsch_harq,uint16_t rb) { + + + MIMO_mode_t mode = dlsch_harq->mimo_mode; + uint32_t pmi_alloc = dlsch_harq->pmi_alloc; // printf("Getting pmi for RB %d => %d\n",rb,(pmi_alloc>>((rb>>2)<<1))&3); switch (N_RB_DL) { @@ -837,6 +972,7 @@ uint8_t get_pmi(uint8_t N_RB_DL,MIMO_mode_t mode,uint32_t pmi_alloc,uint16_t rb) else return((pmi_alloc>>rb)&1); break; + default: case 25: // 4 PRBs per subband if (mode <= PUSCH_PRECODING1) return((pmi_alloc>>((rb>>2)<<1))&3); @@ -855,8 +991,6 @@ uint8_t get_pmi(uint8_t N_RB_DL,MIMO_mode_t mode,uint32_t pmi_alloc,uint16_t rb) else return((pmi_alloc>>(rb>>3))&1); break; - default: - break; } } @@ -866,49 +1000,81 @@ int dlsch_modulation(mod_sym_t **txdataF, uint32_t subframe_offset, LTE_DL_FRAME_PARMS *frame_parms, uint8_t num_pdcch_symbols, - LTE_eNB_DLSCH_t *dlsch){ + LTE_eNB_DLSCH_t *dlsch0, + LTE_eNB_DLSCH_t *dlsch1){ uint8_t nsymb; - uint8_t harq_pid = dlsch->current_harq_pid; - uint32_t i,jj,re_allocated,symbol_offset; + uint8_t harq_pid = dlsch0->current_harq_pid; + LTE_DL_eNB_HARQ_t *dlsch0_harq = dlsch0->harq_processes[harq_pid]; + LTE_DL_eNB_HARQ_t *dlsch1_harq; //= dlsch1->harq_processes[harq_pid]; + uint32_t i,jj,jj2,re_allocated,symbol_offset; uint16_t l,rb,re_offset; uint32_t rb_alloc_ind; - uint32_t *rb_alloc = dlsch->rb_alloc; + uint32_t *rb_alloc = dlsch0_harq->rb_alloc; uint8_t pilots=0; uint8_t skip_dc,skip_half; - uint8_t mod_order = get_Qm(dlsch->harq_processes[harq_pid]->mcs); + uint8_t mod_order0 = get_Qm(dlsch0_harq->mcs); + uint8_t mod_order1; 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; + int16_t qam16_table_a0[4],qam64_table_a0[8],qam16_table_b0[4],qam64_table_b0[8]; + int16_t qam16_table_a1[4],qam64_table_a1[8],qam16_table_b1[4],qam64_table_b1[8]; + int16_t *qam_table_s0,*qam_table_s1; #ifdef DEBUG_DLSCH_MODULATION - uint8_t Nl = dlsch->harq_processes[harq_pid]->Nl; + uint8_t Nl0 = dlsch0_harq->Nl; + uint8_t Nl1; #endif + + if (dlsch1) { + dlsch1_harq = dlsch1->harq_processes[harq_pid]; + mod_order1 = get_Qm(dlsch1_harq->mcs); +#ifdef DEBUG_DLSCH_MODULATION + Nl1 = dlsch1_harq->Nl; +#endif + } vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_MODULATION, VCD_FUNCTION_IN); nsymb = (frame_parms->Ncp==0) ? 14:12; - amp_rho_a = (int16_t)(((int32_t)amp*dlsch->sqrt_rho_a)>>13); - amp_rho_b = (int16_t)(((int32_t)amp*dlsch->sqrt_rho_b)>>13); + amp_rho_a = (int16_t)(((int32_t)amp*dlsch0->sqrt_rho_a)>>13); + amp_rho_b = (int16_t)(((int32_t)amp*dlsch0->sqrt_rho_b)>>13); - if (mod_order == 4) + if (mod_order0 == 4) for (i=0;i<4;i++) { - qam16_table_a[i] = (int16_t)(((int32_t)qam16_table[i]*amp_rho_a)>>15); - qam16_table_b[i] = (int16_t)(((int32_t)qam16_table[i]*amp_rho_b)>>15); + qam16_table_a0[i] = (int16_t)(((int32_t)qam16_table[i]*amp_rho_a)>>15); + qam16_table_b0[i] = (int16_t)(((int32_t)qam16_table[i]*amp_rho_b)>>15); } - else if (mod_order == 6) + else if (mod_order0 == 6) for (i=0;i<8;i++) { - qam64_table_a[i] = (int16_t)(((int32_t)qam64_table[i]*amp_rho_a)>>15); - qam64_table_b[i] = (int16_t)(((int32_t)qam64_table[i]*amp_rho_b)>>15); + qam64_table_a0[i] = (int16_t)(((int32_t)qam64_table[i]*amp_rho_a)>>15); + qam64_table_b0[i] = (int16_t)(((int32_t)qam64_table[i]*amp_rho_b)>>15); + } + + if (mod_order1 == 4) + for (i=0;i<4;i++) { + qam16_table_a1[i] = (int16_t)(((int32_t)qam16_table[i]*amp_rho_a)>>15); + qam16_table_b1[i] = (int16_t)(((int32_t)qam16_table[i]*amp_rho_b)>>15); + } + else if (mod_order0 == 6) + for (i=0;i<8;i++) { + qam64_table_a1[i] = (int16_t)(((int32_t)qam64_table[i]*amp_rho_a)>>15); + qam64_table_b1[i] = (int16_t)(((int32_t)qam64_table[i]*amp_rho_b)>>15); } //Modulation mapping (difference w.r.t. LTE specs) - jj=0; + jj=0;jj2=0; re_allocated=0; // printf("num_pdcch_symbols %d, nsymb %d\n",num_pdcch_symbols,nsymb); for (l=num_pdcch_symbols;l<nsymb;l++) { #ifdef DEBUG_DLSCH_MODULATION - msg("Generating DLSCH (harq_pid %d,mimo %d, pmi_alloc %x, mod %d, nu %d, rb_alloc[0] %d) in %d\n",harq_pid,dlsch->harq_processes[harq_pid]->mimo_mode,pmi2hex_2Ar1(dlsch->pmi_alloc),mod_order, dlsch->layer_index, rb_alloc[0], l); + msg("Generating DLSCH (harq_pid %d,mimo %d, pmi_alloc0 %llx, mod0 %d, mod1 %d, rb_alloc[0] %d) in %d\n", + harq_pid, + dlsch0_harq->mimo_mode, + pmi2hex_2Ar1(dlsch0_harq->pmi_alloc), + mod_order0, + mod_order1, + rb_alloc[0], + l); #endif if (frame_parms->Ncp==0) { // normal prefix @@ -1060,39 +1226,50 @@ int dlsch_modulation(mod_sym_t **txdataF, } } - if (dlsch->layer_index>1) { - msg("layer_index %d: re_offset %d, symbol %d offset %d\n",dlsch->layer_index,re_offset,l,symbol_offset); + if (dlsch0_harq->Nlayers>1) { + msg("Nlayers %d: re_offset %d, symbol %d offset %d\n",dlsch0_harq->Nlayers,re_offset,l,symbol_offset); return(-1); } - if (mod_order == 4) - qam_table_s = ((pilots) ? qam16_table_b : qam16_table_a); - else if (mod_order == 6) - qam_table_s = ((pilots) ? qam64_table_b : qam64_table_a); + if (dlsch1) { + if (dlsch1_harq->Nlayers>1) { + msg("Nlayers %d: re_offset %d, symbol %d offset %d\n",dlsch0_harq->Nlayers,re_offset,l,symbol_offset); + return(-1); + } + } + if (mod_order0 == 4) + qam_table_s0 = ((pilots) ? qam16_table_b0 : qam16_table_a0); + else if (mod_order0 == 6) + qam_table_s0 = ((pilots) ? qam64_table_b0 : qam64_table_a0); + else + qam_table_s0 = NULL; + + if (mod_order1 == 4) + qam_table_s1 = ((pilots) ? qam16_table_b1 : qam16_table_a1); + else if (mod_order1 == 6) + qam_table_s1 = ((pilots) ? qam64_table_b1 : qam64_table_a1); else - qam_table_s = NULL; + qam_table_s1 = NULL; 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); - allocate_REs_in_RB(txdataF, + // printf("Allocated rb %d, subframe_offset %d, symbol_offset %d, re_offset %d, jj %d\n",rb,subframe_offset,symbol_offset,re_offset,jj); + allocate_REs_in_RB(frame_parms, + txdataF, &jj, + &jj2, re_offset, symbol_offset, - dlsch->e, - dlsch->harq_processes[harq_pid]->mimo_mode, - dlsch->layer_index, + dlsch0->harq_processes[harq_pid], + (dlsch1==NULL) ? NULL : dlsch1->harq_processes[harq_pid], pilots, - mod_order, - get_pmi(frame_parms->N_RB_DL,dlsch->harq_processes[harq_pid]->mimo_mode,dlsch->pmi_alloc,rb), ((pilots) ? amp_rho_b : amp_rho_a), - qam_table_s, + get_pmi(frame_parms->N_RB_DL,dlsch0->harq_processes[harq_pid],rb), + qam_table_s0, + qam_table_s1, &re_allocated, 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); + skip_half); + } re_offset+=12; // go to next RB @@ -1111,7 +1288,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,Nl,2,0,subframe_offset)); + msg("generate_dlsch : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch0_harq->nb_rb,dlsch0_harq->rb_alloc,mod_order0,Nl0,2,0,subframe_offset)); #endif vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_MODULATION, VCD_FUNCTION_OUT); @@ -1181,7 +1358,7 @@ int mch_modulation(mod_sym_t **txdataF, &jj, re_offset, symbol_offset, - dlsch->e, + dlsch->harq_processes[0]->e, l, mod_order, amp, @@ -1208,7 +1385,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,1,2,0,subframe_offset)); + msg("generate_dlsch(MCH) : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->rb_alloc,mod_order,1,2,0,subframe_offset)); #endif return (re_allocated); diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c index a65e3068772dd40a9c942675e44c6b2c5e8e93ef..44abc063ba8bff86525cdd3c77e5e45e02dddcab 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c @@ -58,7 +58,7 @@ void dlsch_scrambling(LTE_DL_FRAME_PARMS *frame_parms, int i,j,k=0; // uint8_t reset; uint32_t x1, x2, s=0; - uint8_t *e=dlsch->e; + uint8_t *e=dlsch->harq_processes[dlsch->current_harq_pid]->e; vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_SCRAMBLING, VCD_FUNCTION_IN); diff --git a/openair1/PHY/LTE_TRANSPORT/initial_sync.c b/openair1/PHY/LTE_TRANSPORT/initial_sync.c index 334dda1ae45583d6701a3fffe142ec80ecb4ac70..4419e549e43946cbebfc3e4fc1df1e1f26823999 100644 --- a/openair1/PHY/LTE_TRANSPORT/initial_sync.c +++ b/openair1/PHY/LTE_TRANSPORT/initial_sync.c @@ -48,7 +48,7 @@ #include "gain_control.h" #endif -//#define DEBUG_INITIAL_SYNCH +#define DEBUG_INITIAL_SYNCH int pbch_detection(PHY_VARS_UE *phy_vars_ue, runmode_t mode) { @@ -111,6 +111,7 @@ int pbch_detection(PHY_VARS_UE *phy_vars_ue, runmode_t mode) { frame_parms, 0, SISO, + phy_vars_ue->high_speed_flag, frame_mod4); if ((pbch_tx_ant>0) && (pbch_tx_ant<=2)) { pbch_decoded = 1; @@ -122,6 +123,7 @@ int pbch_detection(PHY_VARS_UE *phy_vars_ue, runmode_t mode) { frame_parms, 0, ALAMOUTI, + phy_vars_ue->high_speed_flag, frame_mod4); if ((pbch_tx_ant>0) && (pbch_tx_ant<=2)) { pbch_decoded = 1; diff --git a/openair1/PHY/LTE_TRANSPORT/pbch.c b/openair1/PHY/LTE_TRANSPORT/pbch.c index 9aaf3a4f842baae36ddd1dc4d39e0f94270fd08c..920ab5b90c54ea634b03197fc35f9025bd25804b 100755 --- a/openair1/PHY/LTE_TRANSPORT/pbch.c +++ b/openair1/PHY/LTE_TRANSPORT/pbch.c @@ -70,6 +70,98 @@ extern __m128i zero; #define PBCH_A 24 +int allocate_pbch_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, + mod_sym_t **txdataF, + uint32_t *jj, + uint16_t re_offset, + uint32_t symbol_offset, + uint8_t *x0, + uint8_t pilots, + int16_t amp, + uint32_t *re_allocated) { + + MIMO_mode_t mimo_mode = (frame_parms->mode1_flag==1)?SISO:ALAMOUTI; + + + uint32_t tti_offset,aa; + uint8_t re; + int16_t gain_lin_QPSK; + int16_t re_off=re_offset; + + uint8_t first_re,last_re; + int32_t tmp_sample1,tmp_sample2; + + gain_lin_QPSK = (int16_t)((amp*ONE_OVER_SQRT2_Q15)>>15); + + first_re=0; + last_re=12; + + for (re=first_re;re<last_re;re++) { + + tti_offset = symbol_offset + re_off + re; + + // check that RE is not from Cell-specific RS + + if (is_not_pilot(pilots,re,frame_parms->nushift,0)==1) { + // printf("re %d (jj %d)\n",re,*jj); + if (mimo_mode == SISO) { //SISO mapping + *re_allocated = *re_allocated + 1; + // 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; aa<frame_parms->nb_antennas_tx; aa++) { + ((int16_t*)&txdataF[aa][tti_offset])[0] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i + } + *jj = *jj + 1; + for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) { + ((int16_t*)&txdataF[aa][tti_offset])[1] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1} + } + *jj = *jj + 1; + } + else if (mimo_mode == ALAMOUTI){ + *re_allocated = *re_allocated + 1; + + ((int16_t*)&tmp_sample1)[0] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; + *jj=*jj+1; + ((int16_t*)&tmp_sample1)[1] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; + *jj=*jj+1; + + // second antenna position n -> -x1* + + ((int16_t*)&tmp_sample2)[0] = (x0[*jj]==1) ? (gain_lin_QPSK) : -gain_lin_QPSK; + *jj=*jj+1; + ((int16_t*)&tmp_sample2)[1] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; + *jj=*jj+1; + + // normalization for 2 tx antennas + ((int16_t*)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_SQRT2_Q15)>>15); + ((int16_t*)&txdataF[0][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample1)[1]*ONE_OVER_SQRT2_Q15)>>15); + ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_SQRT2_Q15)>>15); + ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_SQRT2_Q15)>>15); + + // fill in the rest of the ALAMOUTI precoding + if (is_not_pilot(pilots,re + 1,frame_parms->nushift,0)==1) { + ((int16_t *)&txdataF[0][tti_offset+1])[0] += -((int16_t *)&txdataF[1][tti_offset])[0]; //x1 + ((int16_t *)&txdataF[0][tti_offset+1])[1] += ((int16_t *)&txdataF[1][tti_offset])[1]; + ((int16_t *)&txdataF[1][tti_offset+1])[0] += ((int16_t *)&txdataF[0][tti_offset])[0]; //x0* + ((int16_t *)&txdataF[1][tti_offset+1])[1] += -((int16_t *)&txdataF[0][tti_offset])[1]; + } + else { + ((int16_t *)&txdataF[0][tti_offset+2])[0] += -((int16_t *)&txdataF[1][tti_offset])[0]; //x1 + ((int16_t *)&txdataF[0][tti_offset+2])[1] += ((int16_t *)&txdataF[1][tti_offset])[1]; + ((int16_t *)&txdataF[1][tti_offset+2])[0] += ((int16_t *)&txdataF[0][tti_offset])[0]; //x0* + ((int16_t *)&txdataF[1][tti_offset+2])[1] += -((int16_t *)&txdataF[0][tti_offset])[1]; + } + re++; // adjacent carriers are taken care of by precoding + *re_allocated = *re_allocated + 1; + if (is_not_pilot(pilots,re,frame_parms->nushift,0)==0) { // skip pilots + re++; + *re_allocated = *re_allocated + 1; + } + } + } + } + return(0); +} + //uint8_t pbch_d[96+(3*(16+PBCH_A))], pbch_w[3*3*(16+PBCH_A)],pbch_e[1920]; //one bit per byte int generate_pbch(LTE_eNB_PBCH *eNB_pbch, mod_sym_t **txdataF, @@ -260,62 +352,51 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch, #endif -#ifdef IFFT_FPGA - re_offset = frame_parms->N_RB_DL*12-3*12; - symbol_offset = frame_parms->N_RB_DL*12*l; -#else re_offset = frame_parms->ofdm_symbol_size-3*12; symbol_offset = frame_parms->ofdm_symbol_size*l; -#endif for (rb=0;rb<6;rb++) { #ifdef DEBUG_PBCH msg("RB %d, jj %d, re_offset %d, symbol_offset %d, pilots %d, nushift %d\n",rb,jj,re_offset, symbol_offset, pilots,frame_parms->nushift); #endif - allocate_REs_in_RB(txdataF, - &jj, - re_offset, - symbol_offset, - &eNB_pbch->pbch_e[frame_mod4*(pbch_E>>2)], - (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI, - 0, - pilots, - 2, - 0, + allocate_pbch_REs_in_RB(frame_parms, + txdataF, + &jj, + re_offset, + symbol_offset, + &eNB_pbch->pbch_e[frame_mod4*(pbch_E>>2)], + pilots, #ifdef INTERFERENCE_MITIGATION - (pilots_2==1)?(amp/3):amp, + (pilots_2==1)?(amp/3):amp, #else - amp, + amp, #endif - NULL, - &re_allocated, - 0, - 0, - 0, - 1, - 0, - frame_parms); + &re_allocated); re_offset+=12; // go to next RB // check if we crossed the symbol boundary and skip DC -#ifdef IFFT_FPGA - if (re_offset >= frame_parms->N_RB_DL*12) - re_offset = 0; -#else + if (re_offset >= frame_parms->ofdm_symbol_size) re_offset=1; -#endif } // } } #ifdef DEBUG_PBCH - msg("[PBCH] txdataF=\n"); - for (i=0;i<frame_parms->ofdm_symbol_size;i++) - msg("%d=>(%d,%d)\n",i,((short*)&txdataF[0][frame_parms->ofdm_symbol_size*(nsymb>>1)+i])[0], - ((short*)&txdataF[0][frame_parms->ofdm_symbol_size*(nsymb>>1)+i])[1]); + printf("[PBCH] txdataF=\n"); + for (i=0;i<frame_parms->ofdm_symbol_size;i++) { + printf("%d=>(%d,%d)",i,((short*)&txdataF[0][frame_parms->ofdm_symbol_size*(nsymb>>1)+i])[0], + ((short*)&txdataF[0][frame_parms->ofdm_symbol_size*(nsymb>>1)+i])[1]); + if (frame_parms->mode1_flag==0) { + printf("(%d,%d)\n",((short*)&txdataF[1][frame_parms->ofdm_symbol_size*(nsymb>>1)+i])[0], + ((short*)&txdataF[1][frame_parms->ofdm_symbol_size*(nsymb>>1)+i])[1]); + } + else { + printf("\n"); + } + } #endif @@ -332,11 +413,12 @@ int32_t generate_pbch_emul(PHY_VARS_eNB *phy_vars_eNB,uint8_t *pbch_pdu) { } uint16_t pbch_extract(int **rxdataF, - int **dl_ch_estimates, - int **rxdataF_ext, - int **dl_ch_estimates_ext, - uint32_t symbol, - LTE_DL_FRAME_PARMS *frame_parms) { + int **dl_ch_estimates, + int **rxdataF_ext, + int **dl_ch_estimates_ext, + uint32_t symbol, + uint32_t high_speed_flag, + LTE_DL_FRAME_PARMS *frame_parms) { uint16_t rb,nb_rb=6; @@ -356,21 +438,14 @@ uint16_t pbch_extract(int **rxdataF, (rx_offset + (symbol*(frame_parms->ofdm_symbol_size)))*2, LTE_CE_OFFSET+ch_offset+(symbol_mod*(frame_parms->ofdm_symbol_size))); */ -#ifndef NEW_FFT - rxF = &rxdataF[aarx][(rx_offset + (symbol*(frame_parms->ofdm_symbol_size)))*2]; -#else + rxF = &rxdataF[aarx][(rx_offset + (symbol*(frame_parms->ofdm_symbol_size)))]; -#endif rxF_ext = &rxdataF_ext[aarx][symbol_mod*(6*12)]; for (rb=0; rb<nb_rb; rb++) { // skip DC carrier if (rb==3) { -#ifndef NEW_FFT - rxF = &rxdataF[aarx][(1 + (symbol*(frame_parms->ofdm_symbol_size)))*2]; -#else rxF = &rxdataF[aarx][(1 + (symbol*(frame_parms->ofdm_symbol_size)))]; -#endif } if ((symbol_mod==0) || (symbol_mod==1)) { j=0; @@ -379,39 +454,26 @@ uint16_t pbch_extract(int **rxdataF, (i!=(nushiftmod3+3)) && (i!=(nushiftmod3+6)) && (i!=(nushiftmod3+9))) { -#ifndef NEW_FFT - rxF_ext[j++]=rxF[i<<1]; -#else rxF_ext[j++]=rxF[i]; -#endif } } -#ifndef NEW_FFT - rxF+=24; -#else rxF+=12; -#endif rxF_ext+=8; } else { for (i=0;i<12;i++) { -#ifndef NEW_FFT - rxF_ext[i]=rxF[i<<1]; -#else rxF_ext[i]=rxF[i]; -#endif } -#ifndef NEW_FFT - rxF+=24; -#else rxF+=12; -#endif rxF_ext+=12; } } for (aatx=0;aatx<4;aatx++) {//frame_parms->nb_antennas_tx_eNB;aatx++) { - dl_ch0 = &dl_ch_estimates[(aatx<<1)+aarx][LTE_CE_OFFSET+ch_offset+(symbol*(frame_parms->ofdm_symbol_size))]; + if (high_speed_flag == 1) + dl_ch0 = &dl_ch_estimates[(aatx<<1)+aarx][LTE_CE_OFFSET+ch_offset+(symbol*(frame_parms->ofdm_symbol_size))]; + else + dl_ch0 = &dl_ch_estimates[(aatx<<1)+aarx][LTE_CE_OFFSET+ch_offset]; dl_ch0_ext = &dl_ch_estimates_ext[(aatx<<1)+aarx][symbol_mod*(6*12)]; for (rb=0; rb<nb_rb; rb++) { @@ -737,11 +799,12 @@ static int8_t pbch_w_rx[3*3*(16+PBCH_A)],pbch_d_rx[96+(3*(16+PBCH_A))]; uint16_t rx_pbch(LTE_UE_COMMON *lte_ue_common_vars, - LTE_UE_PBCH *lte_ue_pbch_vars, - LTE_DL_FRAME_PARMS *frame_parms, - uint8_t eNB_id, - MIMO_mode_t mimo_mode, - uint8_t frame_mod4) { + LTE_UE_PBCH *lte_ue_pbch_vars, + LTE_DL_FRAME_PARMS *frame_parms, + uint8_t eNB_id, + MIMO_mode_t mimo_mode, + uint32_t high_speed_flag, + uint8_t frame_mod4) { uint8_t log2_maxh;//,aatx,aarx; int max_h=0; @@ -778,6 +841,7 @@ uint16_t rx_pbch(LTE_UE_COMMON *lte_ue_common_vars, lte_ue_pbch_vars->rxdataF_ext, lte_ue_pbch_vars->dl_ch_estimates_ext, symbol, + high_speed_flag, frame_parms); #ifdef DEBUG_PBCH msg("[PHY] PBCH Symbol %d\n",symbol); @@ -811,7 +875,7 @@ uint16_t rx_pbch(LTE_UE_COMMON *lte_ue_common_vars, // msg("[PBCH][RX] Alamouti receiver not yet implemented!\n"); // return(-1); } - else if ((mimo_mode != ANTCYCLING) && (mimo_mode != SISO)) { + else if (mimo_mode != SISO) { msg("[PBCH][RX] Unsupported MIMO mode\n"); return(-1); } @@ -911,7 +975,7 @@ uint16_t rx_pbch_emul(PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t pbch_phase) { - double bler=0.0, x=0.0; + double bler=0.0;//, x=0.0; double sinr=0.0; uint16_t nb_rb = phy_vars_ue->lte_frame_parms.N_RB_DL; int16_t f; diff --git a/openair1/PHY/LTE_TRANSPORT/pmch.c b/openair1/PHY/LTE_TRANSPORT/pmch.c index d906b8ec823a0cb0c085b6b2c7cd2ccaef9876de..f1a79190f99fe5343c388cadc3b42b2b3b3e8fe2 100644 --- a/openair1/PHY/LTE_TRANSPORT/pmch.c +++ b/openair1/PHY/LTE_TRANSPORT/pmch.c @@ -75,16 +75,16 @@ void dump_mch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint16_t coded_bits_per_co */ sprintf(fname,"mch_rxF_comp0.m"); sprintf(vname,"pmch_rxF_comp0"); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->rxdataF_comp[0],12*N_RB_DL*nsymb_pmch,1,1); + write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb_pmch,1,1); sprintf(fname,"mch_rxF_llr.m"); sprintf(vname,"pmch_llr"); write_output(fname,vname, phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->llr[0],coded_bits_per_codeword,1,0); sprintf(fname,"mch_mag1.m"); sprintf(vname,"pmch_mag1"); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->dl_ch_mag[0],12*N_RB_DL*nsymb_pmch,1,1); + write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb_pmch,1,1); sprintf(fname,"mch_mag2.m"); sprintf(vname,"pmch_mag2"); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->dl_ch_magb[0],12*N_RB_DL*nsymb_pmch,1,1); + write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb_pmch,1,1); write_output("mch00_ch0.m","pmch00_ch0", &(phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][0][0]), @@ -186,24 +186,24 @@ void fill_eNB_dlsch_MCH(PHY_VARS_eNB *phy_vars_eNB,int mcs,int ndi,int rvidx, in dlsch->harq_processes[0]->Nl = 1; dlsch->harq_processes[0]->TBS = TBStable[get_I_TBS(dlsch->harq_processes[0]->mcs)][frame_parms->N_RB_DL-1]; dlsch->current_harq_pid = 0; - dlsch->nb_rb = frame_parms->N_RB_DL; + dlsch->harq_processes[0]->nb_rb = frame_parms->N_RB_DL; switch(frame_parms->N_RB_DL) { case 6: - dlsch->rb_alloc[0] = 0x3f; + dlsch->harq_processes[0]->rb_alloc[0] = 0x3f; break; case 25: - dlsch->rb_alloc[0] = 0x1ffffff; + dlsch->harq_processes[0]->rb_alloc[0] = 0x1ffffff; break; case 50: - dlsch->rb_alloc[0] = 0xffffffff; - dlsch->rb_alloc[1] = 0x3ffff; + dlsch->harq_processes[0]->rb_alloc[0] = 0xffffffff; + dlsch->harq_processes[0]->rb_alloc[1] = 0x3ffff; break; case 100: - dlsch->rb_alloc[0] = 0xffffffff; - dlsch->rb_alloc[1] = 0xffffffff; - dlsch->rb_alloc[2] = 0xffffffff; - dlsch->rb_alloc[3] = 0xf; + dlsch->harq_processes[0]->rb_alloc[0] = 0xffffffff; + dlsch->harq_processes[0]->rb_alloc[1] = 0xffffffff; + dlsch->harq_processes[0]->rb_alloc[2] = 0xffffffff; + dlsch->harq_processes[0]->rb_alloc[3] = 0xf; break; } @@ -277,7 +277,7 @@ void fill_UE_dlsch_MCH(PHY_VARS_UE *phy_vars_ue,int mcs,int ndi,int rvidx,int eN }else { 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, + phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->rb_alloc, get_Qm(phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->mcs),1, 2,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); @@ -820,9 +820,9 @@ int rx_pmch(PHY_VARS_UE *phy_vars_ue, mch_channel_compensation(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, + lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, frame_parms, symbol, get_Qm(dlsch_ue[0]->harq_processes[0]->mcs), @@ -831,33 +831,33 @@ int rx_pmch(PHY_VARS_UE *phy_vars_ue, if (frame_parms->nb_antennas_rx > 1) mch_detection_mrc(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, symbol); switch (get_Qm(dlsch_ue[0]->harq_processes[0]->mcs)) { case 2 : mch_qpsk_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, lte_ue_pdsch_vars[eNB_id]->llr[0], symbol, lte_ue_pdsch_vars[eNB_id]->llr128); break; case 4: mch_16qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, lte_ue_pdsch_vars[eNB_id]->llr[0], - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag, + lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, symbol, lte_ue_pdsch_vars[eNB_id]->llr128); break; case 6: mch_64qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, + lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, lte_ue_pdsch_vars[eNB_id]->llr[0], - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb, + lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, + lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, symbol, lte_ue_pdsch_vars[eNB_id]->llr128); break; diff --git a/openair1/PHY/LTE_TRANSPORT/power_control.c b/openair1/PHY/LTE_TRANSPORT/power_control.c index ad45ee8ade9c9e62dde7d836f756622405f76420..5f7ffe1e2f35567dd612ac026525987afe74a31e 100644 --- a/openair1/PHY/LTE_TRANSPORT/power_control.c +++ b/openair1/PHY/LTE_TRANSPORT/power_control.c @@ -46,13 +46,13 @@ double get_pa_dB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated) { } double computeRhoA_eNB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, - LTE_eNB_DLSCH_t *dlsch_eNB ){ + LTE_eNB_DLSCH_t *dlsch_eNB,int dl_power_off){ double rho_a_dB; double sqrt_rho_a_lin; rho_a_dB = pa_values[ pdsch_config_dedicated->p_a]; - if(!dlsch_eNB->dl_power_off) + if(!dl_power_off) rho_a_dB-=10*log10(2); sqrt_rho_a_lin= pow(10,(0.05*rho_a_dB)); @@ -69,12 +69,13 @@ double computeRhoA_eNB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, double computeRhoB_eNB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, PDSCH_CONFIG_COMMON *pdsch_config_common, uint8_t n_antenna_port, - LTE_eNB_DLSCH_t *dlsch_eNB){ + LTE_eNB_DLSCH_t *dlsch_eNB, + int dl_power_off){ double rho_a_dB, rho_b_dB; double sqrt_rho_b_lin; - rho_a_dB= computeRhoA_eNB(pdsch_config_dedicated,dlsch_eNB); + rho_a_dB= computeRhoA_eNB(pdsch_config_dedicated,dlsch_eNB,dl_power_off); if(n_antenna_port>1) rho_b_dB= ratioPB[1][pdsch_config_common->p_b] + rho_a_dB; diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h index b3eb129364ad7416950100e18aea7873769af788..d297d4623e390aaae73ee4ee59c9368de903ab33 100644 --- a/openair1/PHY/LTE_TRANSPORT/proto.h +++ b/openair1/PHY/LTE_TRANSPORT/proto.h @@ -128,65 +128,56 @@ void dlsch_encoding_emul(PHY_VARS_eNB *phy_vars_eNB, /** \fn allocate_REs_in_RB(mod_sym_t **txdataF, uint32_t *jj, + uint32_t *jj2, uint16_t re_offset, uint32_t symbol_offset, - uint8_t *output, - MIMO_mode_t mimo_mode, - uint8_t nu, + LTE_DL_eNB_HARQ_t *dlsch0_harq, + LTE_DL_eNB_HARQ_t *dlsch1_harq, 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); \brief Fills RB with data \param txdataF pointer to output data (frequency domain signal) - \param jj index to output + \param jj index to output (from CW 1) + \param jj index to output (from CW 2) \param re_offset index of the first RE of the RB \param symbol_offset index to the OFDM symbol - \param output output of the channel coder, one bit per byte - \param mimo_mode MIMO mode - \param nu Layer index + \param dlsch0_harq Pointer to Transport block 0 HARQ structure + \param dlsch0_harq Pointer to Transport block 1 HARQ structure \param pilots =1 if symbol_offset is an OFDM symbol that contains pilots, 0 otherwise - \param mod_order 2=QPSK, 4=16QAM, 6=64QAM - \param precoder_index 36-211 W precoder column (1 layer) or matrix (2 layer) selection index \param amp Amplitude for symbols - \param qam_table_s pointer to scaled QAM table (by rho_a or rho_b) + \param qam_table_s0 pointer to scaled QAM table for Transport Block 0 (by rho_a or rho_b) + \param qam_table_s1 pointer to scaled QAM table for Transport Block 1 (by rho_a or rho_b) \param re_allocated pointer to allocation counter \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, +int32_t allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, + mod_sym_t **txdataF, uint32_t *jj, + uint32_t *jj2, uint16_t re_offset, uint32_t symbol_offset, - uint8_t *output, - MIMO_mode_t mimo_mode, - uint8_t nu, + LTE_DL_eNB_HARQ_t *dlsch0_harq, + LTE_DL_eNB_HARQ_t *dlsch1_harq, uint8_t pilots, - uint8_t mod_order, - uint8_t precoder_index, int16_t amp, - int16_t *qam_table_s, + uint8_t precoder_index, + int16_t *qam_table_s0, + int16_t *qam_table_s1, 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); + uint8_t skip_half); + /** \fn int32_t dlsch_modulation(mod_sym_t **txdataF, int16_t amp, @@ -201,15 +192,17 @@ int32_t allocate_REs_in_RB(mod_sym_t **txdataF, @param sub_frame_offset Offset of this subframe in units of subframes (usually 0) @param frame_parms Pointer to frame descriptor @param num_pdcch_symbols Number of PDCCH symbols in this subframe - @param dlsch Pointer to DLSCH descriptor for this allocation + @param dlsch0 Pointer to Transport Block 0 DLSCH descriptor for this allocation + @param dlsch1 Pointer to Transport Block 0 DLSCH descriptor for this allocation */ int32_t dlsch_modulation(mod_sym_t **txdataF, - int16_t amp, - uint32_t sub_frame_offset, - LTE_DL_FRAME_PARMS *frame_parms, - uint8_t num_pdcch_symbols, - LTE_eNB_DLSCH_t *dlsch); + int16_t amp, + uint32_t sub_frame_offset, + LTE_DL_FRAME_PARMS *frame_parms, + uint8_t num_pdcch_symbols, + LTE_eNB_DLSCH_t *dlsch0, + LTE_eNB_DLSCH_t *dlsch1); /* \brief This function is the top-level routine for generation of the sub-frame signal (frequency-domain) for MCH. @param txdataF Table of pointers for frequency-domain TX signals @@ -861,6 +854,7 @@ void dlsch_detection_mrc(LTE_DL_FRAME_PARMS *frame_parms, @param rb_alloc RB allocation vector @param symbol Symbol to extract @param subframe Subframe number + @param high_speed_flag @param frame_parms Pointer to frame descriptor */ uint16_t dlsch_extract_rbs_single(int32_t **rxdataF, @@ -872,6 +866,7 @@ uint16_t dlsch_extract_rbs_single(int32_t **rxdataF, uint32_t *rb_alloc, uint8_t symbol, uint8_t subframe, + uint32_t high_speed_flag, LTE_DL_FRAME_PARMS *frame_parms); /** \fn dlsch_extract_rbs_dual(int32_t **rxdataF, @@ -894,6 +889,7 @@ uint16_t dlsch_extract_rbs_single(int32_t **rxdataF, @param rb_alloc RB allocation vector @param symbol Symbol to extract @param subframe Subframe index + @param high_speed_flag @param frame_parms Pointer to frame descriptor */ uint16_t dlsch_extract_rbs_dual(int32_t **rxdataF, @@ -905,6 +901,7 @@ uint16_t dlsch_extract_rbs_dual(int32_t **rxdataF, uint32_t *rb_alloc, uint8_t symbol, uint8_t subframe, + uint32_t high_speed_flag, LTE_DL_FRAME_PARMS *frame_parms); /** \brief This function performs channel compensation (matched filtering) on the received RBs for this allocation. In addition, it computes the squared-magnitude of the channel with weightings for 16QAM/64QAM detection as well as dual-stream detection (cross-correlation) @@ -944,7 +941,7 @@ void dlsch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms, int **dl_ch_rho_ext, unsigned char output_shift); -void dlsch_channel_compensation_prec(int **rxdataF_ext, +void dlsch_channel_compensation_TM56(int **rxdataF_ext, int **dl_ch_estimates_ext, int **dl_ch_mag, int **dl_ch_magb, @@ -959,6 +956,17 @@ void dlsch_channel_compensation_prec(int **rxdataF_ext, unsigned char output_shift, unsigned char dl_power_off); +void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, + LTE_UE_PDSCH *lte_ue_pdsch_vars, + PHY_MEASUREMENTS *phy_measurements, + int eNB_id, + unsigned char symbol, + unsigned char mod_order0, + unsigned char mod_order1, + unsigned short nb_rb, + unsigned char output_shift); + + /** \brief This function computes the average channel level over all allocated RBs and antennas (TX/RX) in order to compute output shift for compensated signal @param dl_ch_estimates_ext Channel estimates in allocated RBs @param frame_parms Pointer to frame descriptor @@ -972,7 +980,13 @@ void dlsch_channel_level(int32_t **dl_ch_estimates_ext, uint8_t pilots_flag, uint16_t nb_rb); -void dlsch_channel_level_prec(int32_t **dl_ch_estimates_ext, +void dlsch_channel_level_TM3(int **dl_ch_estimates_ext, + LTE_DL_FRAME_PARMS *frame_parms, + int *avg, + uint8_t symbol, + unsigned short nb_rb); + +void dlsch_channel_level_TM56(int32_t **dl_ch_estimates_ext, LTE_DL_FRAME_PARMS *frame_parms, unsigned char *pmi_ext, int32_t *avg, @@ -1045,12 +1059,13 @@ int32_t rx_pdsch(PHY_VARS_UE *phy_vars_ue, uint8_t harq_pid); int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars, - LTE_UE_PDCCH **lte_ue_pdcch_vars, - LTE_DL_FRAME_PARMS *frame_parms, - uint8_t subframe, - uint8_t eNB_id, - MIMO_mode_t mimo_mode, - uint8_t is_secondary_ue); + LTE_UE_PDCCH **lte_ue_pdcch_vars, + LTE_DL_FRAME_PARMS *frame_parms, + uint8_t subframe, + uint8_t eNB_id, + MIMO_mode_t mimo_mode, + uint32_t high_speed_flag, + uint8_t is_secondary_ue); /*! \brief Performs detection of SSS to find cell ID and other framing parameters (FDD/TDD, normal/extended prefix) @param phy_vars_ue Pointer to UE variables @param tot_metric Pointer to variable containing maximum metric under framing hypothesis (to be compared to other hypotheses @@ -1069,6 +1084,7 @@ uint16_t rx_pbch(LTE_UE_COMMON *lte_ue_common_vars, LTE_DL_FRAME_PARMS *frame_parms, uint8_t eNB_id, MIMO_mode_t mimo_mode, + uint32_t high_speed_flag, uint8_t frame_mod4); uint16_t rx_pbch_emul(PHY_VARS_UE *phy_vars_ue, @@ -1144,12 +1160,12 @@ uint16_t extract_crc(uint8_t *dci,uint8_t DCI_LENGTH); \param stream0_out pointer to output stream \param rho01 pointer to correlation matrix \param length*/ -void qpsk_qpsk_prec(short *stream0_in, - short *stream1_in, - short *stream0_out, - short *rho01, - int length - ); +void qpsk_qpsk_TM3456(short *stream0_in, + short *stream1_in, + short *stream0_out, + short *rho01, + int length + ); /** \brief Attempt decoding of a particular DCI with given length and format. @param DCI_LENGTH length of DCI in bits @@ -1710,10 +1726,7 @@ void init_prach_tables(int N_ZC); */ int is_pmch_subframe(frame_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_parms); -//ICIC algos -uint8_t Get_SB_size(uint8_t n_rb_dl); -//end ALU's algo - +uint8_t is_not_pilot(uint8_t pilots, uint8_t re, uint8_t nushift, uint8_t use2ndpilots); uint32_t dlsch_decoding_abstraction(double *dlsch_MIPB, LTE_DL_FRAME_PARMS *lte_frame_parms, @@ -1725,12 +1738,13 @@ uint32_t dlsch_decoding_abstraction(double *dlsch_MIPB, double get_pa_dB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated); double computeRhoA_eNB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, - LTE_eNB_DLSCH_t *dlsch_eNB ); + LTE_eNB_DLSCH_t *dlsch_eNB, + int dl_power_off); double computeRhoB_eNB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, PDSCH_CONFIG_COMMON *pdsch_config_common, uint8_t n_antenna_port, - LTE_eNB_DLSCH_t *dlsch_eNB); + LTE_eNB_DLSCH_t *dlsch_eNB,int dl_power_off); double computeRhoA_UE(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, LTE_UE_DLSCH_t *dlsch_ue, diff --git a/openair1/PHY/LTE_TRANSPORT/uci_tools.c b/openair1/PHY/LTE_TRANSPORT/uci_tools.c index 9530a956d1a588e03f1d6c863450410702d44b1e..39e703c093f76b2bca3e684f54320b91056602aa 100644 --- a/openair1/PHY/LTE_TRANSPORT/uci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/uci_tools.c @@ -44,7 +44,7 @@ #ifdef DEBUG_UCI_TOOLS #include "PHY/vars.h" #endif -//#define DEBUG_UCI +#define DEBUG_UCI uint64_t pmi2hex_2Ar1(uint32_t pmi) { diff --git a/openair1/PHY/LTE_TRANSPORT/vars.h b/openair1/PHY/LTE_TRANSPORT/vars.h index 37966ec07e76cb56d496f82fe771c360f6fbf649..21e413f2ce16b9e108c79ac347a9b6afe653aaeb 100644 --- a/openair1/PHY/LTE_TRANSPORT/vars.h +++ b/openair1/PHY/LTE_TRANSPORT/vars.h @@ -76,9 +76,8 @@ unsigned char cs_ack_extended[4] = {1,2,6,7}; //unsigned short scfdma_amps[25] = {0,5120,3620,2956,2560,2290,2090,1935,1810,1706,1619,1544,1478,1420,1368,1322,1280,1242,1207,1175,1145,1117,1092,1068,1045,1024}; -char dci_format_strings[15][13] = {"0","1","1A","1B","1C","1D", - "2_2A_L10PRB","2_2A_M10PRB","2_4A_L10PRB","2_4A_M10PRB", - "2A_2A_L10PRB","2A_2A_M10PRB","2A_4A_L10PRB","2A_4A_M10PRB", +char dci_format_strings[15][13] = {"0","1","1A","1B","1C","1D","1E_2A_M10PRB", + "2","2A","2B","2C","2D", "3"}; uint8_t wACK[5][4] = {{1,1,1,1},{1,0,1,0},{1,1,0,0},{1,0,0,1},{0,0,0,0}}; diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c index 716271fc3bd80f74cb05cf6cbf94d0042be1a246..0455e9904597d501c8f4d6514bbe69b791d2bc70 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.c +++ b/openair1/PHY/TOOLS/lte_phy_scope.c @@ -498,7 +498,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, pdcch_comp = (int16_t*) phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->rxdataF_comp[0]; pdsch_llr = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0]; // stream 0 // pdsch_llr = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id]->llr[0]; // stream 0 - pdsch_comp = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp[0]; + pdsch_comp = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0]; // Received signal in time domain of receive antenna 0 if (rxsig_t != NULL) { @@ -633,22 +633,22 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, // PDSCH LLRs if (pdsch_llr != NULL) { - for (i=0; i<coded_bits_per_codeword; i++) { - llr[i] = (float) pdsch_llr[i]; + for (i=0; i<coded_bits_per_codeword/4; i++) { + llr[i] = (float) pdsch_llr[4*i]; bit[i] = (float) i; } - fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword); - fl_set_xyplot_data(form->pdsch_llr,bit,llr,coded_bits_per_codeword,"","",""); + fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword/4); + fl_set_xyplot_data(form->pdsch_llr,bit,llr,coded_bits_per_codeword/4,"","",""); } // PDSCH I/Q of MF Output if (pdsch_comp!=NULL) { ind=0; for (k=0; k<frame_parms->symbols_per_tti; k++) { - for (i=0; i<12*frame_parms->N_RB_DL; i++) { - I[ind] = pdsch_comp[(2*frame_parms->N_RB_DL*12*k)+2*i]; - Q[ind] = pdsch_comp[(2*frame_parms->N_RB_DL*12*k)+2*i+1]; + for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { + I[ind] = pdsch_comp[(2*frame_parms->N_RB_DL*12*k)+4*i]; + Q[ind] = pdsch_comp[(2*frame_parms->N_RB_DL*12*k)+4*i+1]; ind++; } } diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 245c8d0d203715bde96013efe78b56af8f193e5e..dc98c0ff72709441d959fb61d23f03dc5c0d6c55 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -425,6 +425,9 @@ typedef struct uint32_t X_u[64][839]; + uint32_t high_speed_flag; + int16_t ch_est_alpha; + char ulsch_no_allocation_counter[NUMBER_OF_CONNECTED_eNB_MAX]; unsigned char ulsch_ue_Msg3_active[NUMBER_OF_CONNECTED_eNB_MAX]; diff --git a/openair1/PHY/impl_defs_lte.h b/openair1/PHY/impl_defs_lte.h index e8b2ffd0da0118ac4191482c697ccabce2941784..a9ebbe0518d4766e7aac8126bab780dd70ef1b2b 100644 --- a/openair1/PHY/impl_defs_lte.h +++ b/openair1/PHY/impl_defs_lte.h @@ -527,7 +527,7 @@ typedef struct { typedef enum { SISO=0, ALAMOUTI=1, - ANTCYCLING=2, + LARGE_CDD=2, UNIFORM_PRECODING11=3, UNIFORM_PRECODING1m1=4, UNIFORM_PRECODING1j=5, @@ -630,17 +630,23 @@ typedef struct { /// Received frequency-domain signal after extraction int32_t **rxdataF_ext; /// Received frequency-domain signal after extraction and channel compensation - int32_t **rxdataF_comp; + int32_t **rxdataF_comp0; + /// Received frequency-domain signal after extraction and channel compensation + int32_t **rxdataF_comp1; /// Downlink channel estimates extracted in PRBS int32_t **dl_ch_estimates_ext; /// Downlink cross-correlation of MIMO channel estimates (unquantized PMI) extracted in PRBS int32_t **dl_ch_rho_ext; /// Downlink PMIs extracted in PRBS and grouped in subbands uint8_t *pmi_ext; - /// Magnitude of Downlink Channel (16QAM level/First 64QAM level) - int32_t **dl_ch_mag; - /// Magnitude of Downlink Channel (2nd 64QAM level) - int32_t **dl_ch_magb; + /// Magnitude of Downlink Channel first layer (16QAM level/First 64QAM level) + int32_t **dl_ch_mag0; + /// Magnitude of Downlink Channel second layer (16QAM level/First 64QAM level) + int32_t **dl_ch_mag1; + /// Magnitude of Downlink Channel, first layer (2nd 64QAM level) + int32_t **dl_ch_magb0; + /// Magnitude of Downlink Channel second layer (2nd 64QAM level) + int32_t **dl_ch_magb1; /// Cross-correlation of two eNB signals int32_t **rho; /// never used... always send dl_ch_rho_ext instead... diff --git a/openair1/PHY/impl_defs_top.h b/openair1/PHY/impl_defs_top.h index be9b619b862f4737978068c3016e5226d1ca85f2..66857b9dc13bf1dc714ad64bb2da4b4630d9c2da 100755 --- a/openair1/PHY/impl_defs_top.h +++ b/openair1/PHY/impl_defs_top.h @@ -406,7 +406,7 @@ typedef struct //! estimated correlation (wideband dB) between spatial channels (computed in dlsch_demodulation) int rx_correlation_dB[NUMBER_OF_CONNECTED_eNB_MAX][2]; - /// Wideband CQI (sum of all RX antennas, in dB, for precoded transmission modes (4,5,6), up to 4 spatial streams) + /// Wideband CQI (sum of all RX antennas, in dB, for precoded transmission modes (3,4,5,6), up to 4 spatial streams) int precoded_cqi_dB[NUMBER_OF_CONNECTED_eNB_MAX+1][4]; /// Subband CQI per RX antenna (= SINR) int subband_cqi[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX][NUMBER_OF_SUBBANDS_MAX]; diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index dc55a084d4f95eabfa390b8151538b818d43833e..72472178b5d38d82bc80ba4c9ce4c8f32aca466d 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1789,8 +1789,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e 0, phy_vars_eNB->dlsch_eNB_SI, get_G(&phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->dlsch_eNB_SI->nb_rb, - phy_vars_eNB->dlsch_eNB_SI->rb_alloc, + phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->nb_rb, + phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->rb_alloc, get_Qm(phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->mcs), 1, num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), @@ -1805,7 +1805,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e subframe, &phy_vars_eNB->lte_frame_parms, num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB_SI); + phy_vars_eNB->dlsch_eNB_SI, + (LTE_eNB_DLSCH_t *)NULL); stop_meas(&phy_vars_eNB->dlsch_modulation_stats); } #ifdef PHY_ABSTRACTION @@ -1917,8 +1918,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e 0, phy_vars_eNB->dlsch_eNB_ra, get_G(&phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->dlsch_eNB_ra->nb_rb, - phy_vars_eNB->dlsch_eNB_ra->rb_alloc, + phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->nb_rb, + phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->rb_alloc, get_Qm(phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->mcs), 1, num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), @@ -1930,7 +1931,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e subframe, &phy_vars_eNB->lte_frame_parms, num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB_ra); + phy_vars_eNB->dlsch_eNB_ra, + (LTE_eNB_DLSCH_t *)NULL); } #ifdef PHY_ABSTRACTION else { @@ -1967,14 +1969,14 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e phy_vars_eNB->Mod_id, phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti,harq_pid, phy_vars_eNB->proc[sched_subframe].frame_tx, subframe, input_buffer_length, get_G(&phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nb_rb, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rb_alloc, + phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb, + phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->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->proc[sched_subframe].frame_tx,subframe), - 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]->nb_rb, phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs, - pmi2hex_2Ar1(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->pmi_alloc), + pmi2hex_2Ar1(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->pmi_alloc), phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rvidx, phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->round); #endif @@ -2042,8 +2044,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e 0, phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0], get_G(&phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nb_rb, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rb_alloc, + phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb, + phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->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->proc[sched_subframe].frame_tx,subframe), @@ -2066,7 +2068,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e subframe, &phy_vars_eNB->lte_frame_parms, num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]); + phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0], + phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][1]); stop_meas(&phy_vars_eNB->dlsch_modulation_stats); } diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index f885fbf1eb8c4834193056509adf33c9a90260ed..2ddbab1a497842d2bf92888064398c738607dc96 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -163,11 +163,11 @@ void dump_dlsch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,uint8_t write_output("dlsch11_ch0_ext.m","dl11_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1); write_output("dlsch_rho.m","dl_rho",lte_ue_pdsch_vars[0]->rho[0],300*12,1,1); */ - write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", phy_vars_ue->lte_ue_pdsch_vars[0]->rxdataF_comp[0],300*12,1,1); + write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", phy_vars_ue->lte_ue_pdsch_vars[0]->rxdataF_comp0[0],300*12,1,1); write_output("dlsch_rxF_llr.m","dlsch_llr", phy_vars_ue->lte_ue_pdsch_vars[0]->llr[0],coded_bits_per_codeword,1,0); - write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars[0]->dl_ch_mag,300*12,1,1); - write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars[0]->dl_ch_magb,300*12,1,1); + write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars[0]->dl_ch_mag0,300*12,1,1); + write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars[0]->dl_ch_magb0,300*12,1,1); } void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) { @@ -198,11 +198,11 @@ void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) { write_output("dlsch11_ch0_ext.m","dl11_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1); write_output("dlsch_rho.m","dl_rho",lte_ue_pdsch_vars[0]->rho[0],300*12,1,1); */ - write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", phy_vars_ue->lte_ue_pdsch_vars_SI[0]->rxdataF_comp[0],300*nsymb,1,1); + write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", phy_vars_ue->lte_ue_pdsch_vars_SI[0]->rxdataF_comp0[0],300*nsymb,1,1); write_output("dlsch_rxF_llr.m","dlsch_llr", phy_vars_ue->lte_ue_pdsch_vars_SI[0]->llr[0],coded_bits_per_codeword,1,0); - write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars_SI[0]->dl_ch_mag,300*nsymb,1,1); - write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars_SI[0]->dl_ch_magb,300*nsymb,1,1); + write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars_SI[0]->dl_ch_mag0,300*nsymb,1,1); + write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars_SI[0]->dl_ch_magb0,300*nsymb,1,1); exit(-1); } @@ -251,11 +251,11 @@ void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) { write_output("dlsch11_ch0_ext.m","dl11_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1); write_output("dlsch_rho.m","dl_rho",lte_ue_pdsch_vars[0]->rho[0],300*12,1,1); */ - write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", phy_vars_ue->lte_ue_pdsch_vars_ra[0]->rxdataF_comp[0],300*nsymb,1,1); + write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", phy_vars_ue->lte_ue_pdsch_vars_ra[0]->rxdataF_comp0[0],300*nsymb,1,1); write_output("dlsch_rxF_llr.m","dlsch_llr", phy_vars_ue->lte_ue_pdsch_vars_ra[0]->llr[0],coded_bits_per_codeword,1,0); - write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars_ra[0]->dl_ch_mag,300*nsymb,1,1); - write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars_ra[0]->dl_ch_magb,300*nsymb,1,1); + write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars_ra[0]->dl_ch_mag0,300*nsymb,1,1); + write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars_ra[0]->dl_ch_magb0,300*nsymb,1,1); } #endif @@ -1187,7 +1187,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra #endif //else EXMIMO start_meas(&phy_vars_ue->ofdm_mod_stats); - for (aa=0; aa<1/*frame_parms->nb_antennas_tx*/; aa++) { + for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) { if (frame_parms->Ncp == 1) PHY_ofdm_mod(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size], #ifdef EXMIMO @@ -1711,6 +1711,7 @@ void lte_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst &phy_vars_ue->lte_frame_parms, eNB_id, phy_vars_ue->lte_frame_parms.mode1_flag==1?SISO:ALAMOUTI, + phy_vars_ue->high_speed_flag, pbch_phase); @@ -1893,6 +1894,7 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst subframe_rx, eNB_id, (phy_vars_ue->lte_frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, + phy_vars_ue->high_speed_flag, phy_vars_ue->is_secondary_ue); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_OUT); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING, VCD_FUNCTION_IN); @@ -2056,8 +2058,8 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst return(-1); } #endif - - + + // dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); if (generate_ue_dlsch_params_from_dci(subframe_rx, (void *)&dci_alloc_rx[i].dci_pdu, phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti, @@ -2558,7 +2560,8 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs); // if (abstraction_flag ==0 ) - // dump_dlsch(phy_vars_ue,eNB_id,subframe_prev,harq_pid); + //dump_dlsch(phy_vars_ue,eNB_id,subframe_prev,harq_pid); + //mac_xface->macphy_exit(""); #endif } else { diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index e5cfb6ba0db430d701f4cab98fc8b5bf8a294b44..66e5c25d149ec2e3b6fbc3f81184ac244f652b9c 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -165,11 +165,19 @@ void lte_param_init(unsigned char N_tx, unsigned char N_rx,unsigned char transmi generate_phich_reg_mapping(&PHY_vars_UE->lte_frame_parms); // DL power control init - PHY_vars_eNB->pdsch_config_dedicated->p_a = 4; // 4 = 0dB - ((PHY_vars_eNB->lte_frame_parms).pdsch_config_common).p_b = (lte_frame_parms->nb_antennas_tx_eNB>1) ? 1 : 0; // rho_a = rhob + if (transmission_mode == 1) { + PHY_vars_eNB->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB + ((PHY_vars_eNB->lte_frame_parms).pdsch_config_common).p_b = 0; + PHY_vars_UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB + ((PHY_vars_UE->lte_frame_parms).pdsch_config_common).p_b = 0; + } + else {(lte_frame_parms->nb_antennas_tx_eNB>1) ? 1 : 0; // rho_a = rhob + PHY_vars_eNB->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB + ((PHY_vars_eNB->lte_frame_parms).pdsch_config_common).p_b = 1; + PHY_vars_UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB + ((PHY_vars_UE->lte_frame_parms).pdsch_config_common).p_b = 1; + } - PHY_vars_UE->pdsch_config_dedicated->p_a = 4; // 4 = 0dB - ((PHY_vars_UE->lte_frame_parms).pdsch_config_common).p_b = (lte_frame_parms->nb_antennas_tx_eNB>1) ? 1 : 0; // rho_a = rhob printf("Done lte_param_init\n"); @@ -232,11 +240,11 @@ int main(int argc, char **argv) { double forgetting_factor=0.0; //in [0,1] 0 means a new channel every time, 1 means keep the same channel double iqim=0.0; - uint8_t extended_prefix_flag=0,transmission_mode=1,n_tx=1,n_rx=1; + uint8_t extended_prefix_flag=0,transmission_mode=1,n_tx=1,n_rx=2; uint16_t Nid_cell=0; int eNB_id = 0, eNB_id_i = 1; - unsigned char mcs=0,mcs1=0,mcs2=0,mcs_i=0,dual_stream_UE = 0,awgn_flag=0,round,dci_flag=0; + unsigned char mcs1=0,mcs2=0,mcs_i=0,dual_stream_UE = 0,awgn_flag=0,round,dci_flag=0; unsigned char i_mod = 2; unsigned short NB_RB; unsigned char Ns,l,m; @@ -247,8 +255,8 @@ int main(int argc, char **argv) { SCM_t channel_model=Rayleigh1; // unsigned char *input_data,*decoded_output; - unsigned char *input_buffer[2]; - unsigned short input_buffer_length; + unsigned char *input_buffer0[2],*input_buffer1[2]; + unsigned short input_buffer_length0,input_buffer_length1; unsigned int ret; unsigned int coded_bits_per_codeword=0,nsymb,dci_cnt,tbs=0; @@ -325,6 +333,9 @@ int main(int argc, char **argv) { double effective_rate=0.0; char channel_model_input[10]="I"; + + int TB0_active = 1; + opp_enabled=1; // to enable the time meas cpu_freq_GHz = (double)get_cpu_freq_GHz(); @@ -341,7 +352,7 @@ int main(int argc, char **argv) { snr0 = 0; num_layers = 1; - while ((c = getopt (argc, argv, "hadpDe:m:n:o:s:f:t:c:g:r:F:x:y:z:MN:I:i:O:R:S:C:T:b:u:v:w:B:PLl:")) != -1) { + while ((c = getopt (argc, argv, "hadpDe:m:n:o:s:f:t:c:g:r:F:x:y:z:AM:N:I:i:O:R:S:C:T:b:u:v:w:B:PLl:")) != -1) { switch (c) { case 'a': @@ -358,7 +369,10 @@ int main(int argc, char **argv) { dci_flag = 1; break; case 'm': - mcs = atoi(optarg); + mcs1 = atoi(optarg); + break; + case 'M': + mcs2 = atoi(optarg); break; case 't': mcs_i = atoi(optarg); @@ -392,7 +406,7 @@ int main(int argc, char **argv) { case 'f': input_snr_step= atof(optarg); break; - case 'M': + case 'A': abstx = 1; break; case 'N': @@ -458,6 +472,7 @@ int main(int argc, char **argv) { transmission_mode=atoi(optarg); if ((transmission_mode!=1) && (transmission_mode!=2) && + (transmission_mode!=3) && (transmission_mode!=5) && (transmission_mode!=6)) { msg("Unsupported transmission mode %d\n",transmission_mode); @@ -534,11 +549,12 @@ int main(int argc, char **argv) { break; case 'h': default: - printf("%s -h(elp) -a(wgn on) -d(ci decoding on) -p(extended prefix on) -m mcs -n n_frames -s snr0 -x transmission mode (1,2,5,6) -y TXant -z RXant -I trch_file\n",argv[0]); + printf("%s -h(elp) -a(wgn on) -d(ci decoding on) -p(extended prefix on) -m mcs1 -M mcs2 -n n_frames -s snr0 -x transmission mode (1,2,5,6) -y TXant -z RXant -I trch_file\n",argv[0]); printf("-h This message\n"); printf("-a Use AWGN channel and not multipath\n"); printf("-c Number of PDCCH symbols\n"); - printf("-m MCS\n"); + printf("-m MCS1 for TB 1\n"); + printf("-M MCS2 for TB 2\n"); printf("-d Transmit the DCI and compute its error statistics and the overall throughput\n"); printf("-p Use extended prefix mode\n"); printf("-n Number of frames to simulate\n"); @@ -590,6 +606,9 @@ int main(int argc, char **argv) { NB_RB=conv_nprb(0,DLSCH_RB_ALLOC,N_RB_DL); + if ((transmission_mode > 1) && (n_tx != 2)) + printf("n_tx must be >1 for transmission_mode %d\n",transmission_mode); + #ifdef XFORMS fl_initialize (&argc, argv, NULL, 0, 0); form_ue = create_lte_phy_scope_ue(); @@ -613,7 +632,8 @@ int main(int argc, char **argv) { eNB_id_i = PHY_vars_UE->n_connected_eNB; - printf("Setting mcs = %d\n",mcs); + printf("Setting mcs1 = %d\n",mcs1); + printf("Setting mcs2 = %d\n",mcs2); printf("NPRB = %d\n",NB_RB); printf("n_frames = %d\n",n_frames); printf("Transmission mode %d with %dx%d antenna configuration, Extended Prefix %d\n",transmission_mode,n_tx,n_rx,extended_prefix_flag); @@ -647,9 +667,9 @@ int main(int argc, char **argv) { SCM_A, SCM_B, SCM_C, SCM_D, EPA, EVA, ETU, Rayleigh8, Rayleigh1, Rayleigh1_corr, Rayleigh1_anticorr, Rice1, Rice8); if(transmission_mode==5) - sprintf(bler_fname,"bler_tx%d_chan%d_nrx%d_mcs%d_mcsi%d_u%d_imod%d.csv",transmission_mode,channel_model,n_rx,mcs,mcs_i,dual_stream_UE,i_mod); + sprintf(bler_fname,"bler_tx%d_chan%d_nrx%d_mcs%d_mcsi%d_u%d_imod%d.csv",transmission_mode,channel_model,n_rx,mcs1,mcs_i,dual_stream_UE,i_mod); else - sprintf(bler_fname,"bler_tx%d_chan%d_nrx%d_mcs%d.csv",transmission_mode,channel_model,n_rx,mcs); + sprintf(bler_fname,"bler_tx%d_chan%d_nrx%d_mcs%d.csv",transmission_mode,channel_model,n_rx,mcs1); bler_fd = fopen(bler_fname,"w"); fprintf(bler_fd,"SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err\n"); @@ -662,16 +682,16 @@ int main(int argc, char **argv) { char dirname[FILENAME_MAX]; sprintf(dirname, "%s/SIMU/USER/pre-ci-logs-%s", getenv("OPENAIR_TARGETS"),hostname ); sprintf(time_meas_fname,"%s/time_meas_prb%d_mcs%d_anttx%d_antrx%d_pdcch%d_channel%s_tx%d.csv", - dirname,N_RB_DL,mcs,n_tx,n_rx,num_pdcch_symbols,channel_model_input,transmission_mode); + dirname,N_RB_DL,mcs1,n_tx,n_rx,num_pdcch_symbols,channel_model_input,transmission_mode); mkdir(dirname,0777); time_meas_fd = fopen(time_meas_fname,"w"); } if(abstx){ // CSV file - sprintf(csv_fname,"dataout_tx%d_u2%d_mcs%d_chan%d_nsimus%d_R%d.m",transmission_mode,dual_stream_UE,mcs,channel_model,n_frames,num_rounds); + sprintf(csv_fname,"dataout_tx%d_u2%d_mcs%d_chan%d_nsimus%d_R%d.m",transmission_mode,dual_stream_UE,mcs1,channel_model,n_frames,num_rounds); csv_fd = fopen(csv_fname,"w"); - fprintf(csv_fd,"data_all%d=[",mcs); + fprintf(csv_fd,"data_all%d=[",mcs1); } /* @@ -807,7 +827,7 @@ int main(int argc, char **argv) { DLSCH_alloc_pdu2_1E[0].dai = 0; DLSCH_alloc_pdu2_1E[0].harq_pid = 0; //DLSCH_alloc_pdu2_1E[0].tb_swap = 0; - DLSCH_alloc_pdu2_1E[0].mcs = mcs; + DLSCH_alloc_pdu2_1E[0].mcs = mcs1; DLSCH_alloc_pdu2_1E[0].ndi = 1; DLSCH_alloc_pdu2_1E[0].rv = 0; // Forget second codeword @@ -834,7 +854,7 @@ int main(int argc, char **argv) { forgetting_factor, rx_sample_offset, 0); - if(abstx==1 && num_rounds>1){ + if(num_rounds>1){ for(n=1;n<4;n++) eNB2UE[n] = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx, PHY_vars_UE->lte_frame_parms.nb_antennas_rx, @@ -916,7 +936,7 @@ int main(int argc, char **argv) { ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; break; @@ -928,7 +948,7 @@ int main(int argc, char **argv) { ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; break; @@ -940,7 +960,7 @@ int main(int argc, char **argv) { ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; break; @@ -950,7 +970,7 @@ int main(int argc, char **argv) { ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; dci_length = sizeof_DCI1_20MHz_TDD_t; @@ -967,7 +987,7 @@ int main(int argc, char **argv) { ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; break; @@ -978,7 +998,7 @@ int main(int argc, char **argv) { ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; break; @@ -989,7 +1009,7 @@ int main(int argc, char **argv) { ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; break; @@ -1000,7 +1020,7 @@ int main(int argc, char **argv) { ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; break; @@ -1042,7 +1062,7 @@ int main(int argc, char **argv) { ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; break; @@ -1055,7 +1075,7 @@ int main(int argc, char **argv) { ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 1; break; @@ -1068,7 +1088,7 @@ int main(int argc, char **argv) { ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; break; @@ -1079,7 +1099,7 @@ int main(int argc, char **argv) { ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t; @@ -1097,7 +1117,7 @@ int main(int argc, char **argv) { ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4); ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; break; @@ -1109,7 +1129,7 @@ int main(int argc, char **argv) { ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4); ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; break; @@ -1121,7 +1141,7 @@ int main(int argc, char **argv) { ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4); ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; break; @@ -1133,7 +1153,7 @@ int main(int argc, char **argv) { ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4); ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; break; @@ -1147,24 +1167,319 @@ int main(int argc, char **argv) { dci_alloc[num_dci].nCCE = 0; dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]); - printf("Generating dlsch params for user %d\n",k); - generate_eNB_dlsch_params_from_dci(0, - &DLSCH_alloc_pdu_1[0], - SI_RNTI, - format1A, - PHY_vars_eNB->dlsch_eNB[0], - &PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI, - PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single); + printf("Generating dlsch params for user %d\n",k); + generate_eNB_dlsch_params_from_dci(0, + &DLSCH_alloc_pdu_1[0], + SI_RNTI, + format1A, + PHY_vars_eNB->dlsch_eNB[0], + &PHY_vars_eNB->lte_frame_parms, + PHY_vars_eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single); num_common_dci++; num_dci++; + + } + break; + case 3: + if (common_flag == 0) { + + if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx == 2) { + + if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { + + switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI2A_1_5MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2A_1_5MHz_2A_TDD_t); + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + case 25: + dci_length = sizeof_DCI2A_5MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2A_5MHz_2A_TDD_t); + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + case 50: + dci_length = sizeof_DCI2A_10MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2A_10MHz_2A_TDD_t); + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + case 100: + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + dci_length = sizeof_DCI2A_20MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2A_20MHz_2A_TDD_t); + break; + } + } + + else { + switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI2A_1_5MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2A_1_5MHz_2A_FDD_t); + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + case 25: + dci_length = sizeof_DCI2A_5MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2A_5MHz_2A_FDD_t); + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + case 50: + dci_length = sizeof_DCI2A_10MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2A_10MHz_2A_FDD_t); + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + case 100: + dci_length = sizeof_DCI2A_20MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2A_20MHz_2A_FDD_t); + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + } + } + } + else if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx == 4) { + } + + memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); + dci_alloc[num_dci].dci_length = dci_length; + dci_alloc[num_dci].L = 1; + dci_alloc[num_dci].rnti = n_rnti+k; + dci_alloc[num_dci].format = format2A; + dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]); + + printf("Generating dlsch params for user %d / format 2A (%d)\n",k,format2A); + generate_eNB_dlsch_params_from_dci(0, + &DLSCH_alloc_pdu_1[0], + n_rnti+k, + format2A, + PHY_vars_eNB->dlsch_eNB[0], + &PHY_vars_eNB->lte_frame_parms, + PHY_vars_eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single); + + num_dci++; + num_ue_spec_dci++; } + else { + if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { + + switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t); + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4); + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 25: + dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t); + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,3); + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 1; + break; + case 50: + dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t); + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4); + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 100: + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4); + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t); + break; + } + } + else { + switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI1A_1_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_1_5MHz_FDD_t); + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4); + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 25: + dci_length = sizeof_DCI1A_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_5MHz_FDD_t); + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4); + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 50: + dci_length = sizeof_DCI1A_10MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_10MHz_FDD_t); + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4); + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 100: + dci_length = sizeof_DCI1A_20MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_20MHz_FDD_t); + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4); + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + } + } + memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); + dci_alloc[num_dci].dci_length = dci_length; + dci_alloc[num_dci].L = 1; + dci_alloc[num_dci].rnti = SI_RNTI; + dci_alloc[num_dci].format = format1A; + dci_alloc[num_dci].nCCE = 0; + dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]); + + printf("Generating dlsch params for user %d\n",k); + generate_eNB_dlsch_params_from_dci(0, + &DLSCH_alloc_pdu_1[0], + SI_RNTI, + format1A, + PHY_vars_eNB->dlsch_eNB[0], + &PHY_vars_eNB->lte_frame_parms, + PHY_vars_eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single); + + num_common_dci++; + num_dci++; + + } + printf("Generated DCI format 2A (Transmission Mode 3)\n"); break; + case 4: if (common_flag == 0) { @@ -1303,14 +1618,14 @@ int main(int argc, char **argv) { dci_alloc[num_dci].dci_length = dci_length; dci_alloc[num_dci].L = 1; dci_alloc[num_dci].rnti = n_rnti+k; - dci_alloc[num_dci].format = format1; + dci_alloc[num_dci].format = format2; dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]); printf("Generating dlsch params for user %d\n",k); generate_eNB_dlsch_params_from_dci(0, &DLSCH_alloc_pdu_1[0], n_rnti+k, - format1, + format2, PHY_vars_eNB->dlsch_eNB[0], &PHY_vars_eNB->lte_frame_parms, PHY_vars_eNB->pdsch_config_dedicated, @@ -1335,7 +1650,7 @@ int main(int argc, char **argv) { ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; break; @@ -1348,7 +1663,7 @@ int main(int argc, char **argv) { ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 1; break; @@ -1361,7 +1676,7 @@ int main(int argc, char **argv) { ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; break; @@ -1372,7 +1687,7 @@ int main(int argc, char **argv) { ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t; @@ -1390,7 +1705,7 @@ int main(int argc, char **argv) { ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4); ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; break; @@ -1402,7 +1717,7 @@ int main(int argc, char **argv) { ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4); ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; break; @@ -1414,7 +1729,7 @@ int main(int argc, char **argv) { ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4); ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; break; @@ -1426,7 +1741,7 @@ int main(int argc, char **argv) { ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4); ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; break; @@ -1520,27 +1835,33 @@ int main(int argc, char **argv) { for (k=0;k<n_users;k++) { - input_buffer_length = PHY_vars_eNB->dlsch_eNB[k][0]->harq_processes[0]->TBS/8; - input_buffer[k] = (unsigned char *)malloc(input_buffer_length+4); - memset(input_buffer[k],0,input_buffer_length+4); + input_buffer_length0 = PHY_vars_eNB->dlsch_eNB[k][0]->harq_processes[0]->TBS/8; + input_buffer0[k] = (unsigned char *)malloc(input_buffer_length0+4); + memset(input_buffer0[k],0,input_buffer_length0+4); + input_buffer_length1 = PHY_vars_eNB->dlsch_eNB[k][1]->harq_processes[0]->TBS/8; + input_buffer1[k] = (unsigned char *)malloc(input_buffer_length1+4); + memset(input_buffer1[k],0,input_buffer_length1+4); if (input_trch_file==0) { - for (i=0;i<input_buffer_length;i++) { - input_buffer[k][i]= (unsigned char)(taus()&0xff); + for (i=0;i<input_buffer_length0;i++) { + input_buffer0[k][i]= (unsigned char)(taus()&0xff); + } + for (i=0;i<input_buffer_length1;i++) { + input_buffer1[k][i]= (unsigned char)(taus()&0xff); } } else { i=0; - while ((!feof(input_trch_fd)) && (i<input_buffer_length<<3)) { + while ((!feof(input_trch_fd)) && (i<input_buffer_length0<<3)) { ret=fscanf(input_trch_fd,"%s",input_trch_val); if (input_trch_val[0] == '1') - input_buffer[k][i>>3]+=(1<<(7-(i&7))); + input_buffer0[k][i>>3]+=(1<<(7-(i&7))); if (i<16) printf("input_trch_val %d : %c\n",i,input_trch_val[0]); i++; if (((i%8) == 0) && (i<17)) - printf("%x\n",input_buffer[k][(i-1)>>3]); + printf("%x\n",input_buffer0[k][(i-1)>>3]); } printf("Read in %d bits\n",i); } @@ -1549,8 +1870,8 @@ int main(int argc, char **argv) { // this is for user 0 only coded_bits_per_codeword = 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, + PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->nb_rb, + PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[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, @@ -1560,6 +1881,9 @@ int main(int argc, char **argv) { printf("uncoded_ber_bit=%p\n",uncoded_ber_bit); snr_step = input_snr_step; + PHY_vars_UE->high_speed_flag = 1; + PHY_vars_UE->ch_est_alpha=0; + for (ch_realization=0;ch_realization<n_ch_rlz;ch_realization++){ if(abstx){ printf("**********************Channel Realization Index = %d **************************\n", ch_realization); @@ -1649,6 +1973,8 @@ int main(int argc, char **argv) { if (common_flag == 0) { if (round == 0) { // First round + TB0_active = 1; + PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->rvidx = round&3; if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { @@ -1678,6 +2004,38 @@ int main(int argc, char **argv) { break; } break; + case 3: + switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + case 6: + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_TDD_t)); + break; + case 25: + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_TDD_t)); + break; + case 50: + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_TDD_t)); + break; + case 100: + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_TDD_t)); + break; + } + break; case 5: DLSCH_alloc_pdu2_1E[0].ndi = trials&1; DLSCH_alloc_pdu2_1E[0].rv = 0; @@ -1712,6 +2070,38 @@ int main(int argc, char **argv) { break; } break; + case 3: + switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + case 6: + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_FDD_t)); + break; + case 25: + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_FDD_t)); + break; + case 50: + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_FDD_t)); + break; + case 100: + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_FDD_t)); + break; + } + break; case 5: DLSCH_alloc_pdu2_1E[0].ndi = trials&1; DLSCH_alloc_pdu2_1E[0].rv = 0; @@ -1753,6 +2143,70 @@ int main(int argc, char **argv) { break; } break; + case 3: + switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + case 6: + if (TB0_active==1) { + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB0 + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_TDD_t)); + break; + case 25: + if (TB0_active==1) { + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB0 + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_TDD_t)); + break; + case 50: + if (TB0_active==1) { + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB0 + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_TDD_t)); + break; + case 100: + if (TB0_active==1) { + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB0 + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_TDD_t)); + break; + } + break; case 5: DLSCH_alloc_pdu2_1E[0].ndi = trials&1; DLSCH_alloc_pdu2_1E[0].rv = round&3; @@ -1787,6 +2241,70 @@ int main(int argc, char **argv) { break; } break; + case 3: + switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + case 6: + if (TB0_active==1) { + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB0 + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_FDD_t)); + break; + case 25: + if (TB0_active==1) { + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB0 + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_FDD_t)); + break; + case 50: + if (TB0_active==1) { + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB0 + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_FDD_t)); + break; + case 100: + if (TB0_active==1) { + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB0 + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_FDD_t)); + break; + } + break; case 5: DLSCH_alloc_pdu2_1E[0].ndi = trials&1; DLSCH_alloc_pdu2_1E[0].rv = round&3; @@ -1814,8 +2332,8 @@ int main(int argc, char **argv) { for (k=0;k<n_users;k++) { coded_bits_per_codeword = get_G(&PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->dlsch_eNB[k][0]->nb_rb, - PHY_vars_eNB->dlsch_eNB[k][0]->rb_alloc, + PHY_vars_eNB->dlsch_eNB[k][0]->harq_processes[0]->nb_rb, + PHY_vars_eNB->dlsch_eNB[k][0]->harq_processes[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, @@ -1839,10 +2357,10 @@ int main(int argc, char **argv) { // use the PMI from previous trial if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) { - PHY_vars_eNB->dlsch_eNB[0][0]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE->PHY_measurements,0,PHY_vars_eNB->lte_frame_parms.N_RB_DL); - PHY_vars_UE->dlsch_ue[0][0]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE->PHY_measurements,0,PHY_vars_UE->lte_frame_parms.N_RB_DL); + PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE->PHY_measurements,0,PHY_vars_eNB->lte_frame_parms.N_RB_DL); + PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE->PHY_measurements,0,PHY_vars_UE->lte_frame_parms.N_RB_DL); if (n_users>1) - PHY_vars_eNB->dlsch_eNB[1][0]->pmi_alloc = (PHY_vars_eNB->dlsch_eNB[0][0]->pmi_alloc ^ 0x1555); + PHY_vars_eNB->dlsch_eNB[1][0]->harq_processes[0]->pmi_alloc = (PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->pmi_alloc ^ 0x1555); /* if ((trials<10) && (round==0)) { printf("tx PMI UE0 %x (pmi_feedback %d)\n",pmi2hex_2Ar1(PHY_vars_eNB->dlsch_eNB[0][0]->pmi_alloc),pmi_feedback); @@ -1854,7 +2372,7 @@ int main(int argc, char **argv) { start_meas(&PHY_vars_eNB->dlsch_encoding_stats); - if (dlsch_encoding(input_buffer[k], + if (dlsch_encoding(input_buffer0[k], &PHY_vars_eNB->lte_frame_parms, num_pdcch_symbols, PHY_vars_eNB->dlsch_eNB[k][0], @@ -1864,6 +2382,18 @@ int main(int argc, char **argv) { &PHY_vars_eNB->dlsch_interleaving_stats )<0) exit(-1); + if (transmission_mode == 3) { + if (dlsch_encoding(input_buffer1[k], + &PHY_vars_eNB->lte_frame_parms, + num_pdcch_symbols, + PHY_vars_eNB->dlsch_eNB[k][1], + 0,subframe, + &PHY_vars_eNB->dlsch_rate_matching_stats, + &PHY_vars_eNB->dlsch_turbo_encoding_stats, + &PHY_vars_eNB->dlsch_interleaving_stats + )<0) + exit(-1); + } stop_meas(&PHY_vars_eNB->dlsch_encoding_stats); PHY_vars_eNB->dlsch_eNB[k][0]->rnti = (common_flag==0) ? n_rnti+k : SI_RNTI; @@ -1895,19 +2425,13 @@ int main(int argc, char **argv) { subframe, &PHY_vars_eNB->lte_frame_parms, num_pdcch_symbols, - PHY_vars_eNB->dlsch_eNB[k][0]); + PHY_vars_eNB->dlsch_eNB[k][0], + PHY_vars_eNB->dlsch_eNB[k][1]); stop_meas(&PHY_vars_eNB->dlsch_modulation_stats); /* if (trials==0 && round==0) printf("RE count %d\n",re_allocated); */ - if (num_layers>1) - re_allocated = dlsch_modulation(PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id], - AMP, - subframe, - &PHY_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - PHY_vars_eNB->dlsch_eNB[k][1]); } //n_users @@ -2242,6 +2766,7 @@ int main(int argc, char **argv) { subframe, 0, (PHY_vars_UE->lte_frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, + PHY_vars_UE->high_speed_flag, 0); stop_meas(&PHY_vars_UE->dlsch_rx_pdcch_stats); // overwrite number of pdcch symbols @@ -2270,7 +2795,7 @@ int main(int argc, char **argv) { } for (i=0;i<dci_cnt;i++) { - //printf("Generating dlsch parameters for RNTI %x\n",dci_alloc_rx[i].rnti); + // printf("Generating dlsch parameters for RNTI %x\n",dci_alloc_rx[i].rnti); PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->first_tx=1; if ((dci_alloc_rx[i].rnti == n_rnti) && (generate_ue_dlsch_params_from_dci(0, @@ -2294,9 +2819,9 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols, /* 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); rate*=get_Qm(PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->mcs); - - printf("num_pdcch_symbols %d, G %d, TBS %d\n",PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols,coded_bits_per_codeword,PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->TBS); */ + printf("num_pdcch_symbols %d, G %d, TBS %d\n",PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols,coded_bits_per_codeword,PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->TBS); + dlsch_active = 1; } else { @@ -2321,6 +2846,7 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols, PHY_vars_UE->lte_ue_pdcch_vars[0]->crnti = n_rnti; PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols; + PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->first_tx=1; switch (transmission_mode) { case 1: case 2: @@ -2335,6 +2861,19 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols, 0, P_RNTI); break; + case 3: + PHY_vars_UE->dlsch_ue[0][1]->harq_processes[0]->first_tx=1; + generate_ue_dlsch_params_from_dci(0, + &DLSCH_alloc_pdu_1[0], + (common_flag==0)? C_RNTI : SI_RNTI, + (common_flag==0)? format2A : format1A, + PHY_vars_UE->dlsch_ue[0], + &PHY_vars_UE->lte_frame_parms, + PHY_vars_UE->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI); + break; case 4: generate_ue_dlsch_params_from_dci(0, &DLSCH_alloc_pdu_1[0], @@ -2483,8 +3022,8 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols, //pdsch_vars dump_dlsch2(PHY_vars_UE,eNB_id,coded_bits_per_codeword); - dump_dlsch2(PHY_vars_UE,eNB_id_i,coded_bits_per_codeword); - write_output("dlsch_e.m","e",PHY_vars_eNB->dlsch_eNB[0][0]->e,coded_bits_per_codeword,1,4); + //dump_dlsch2(PHY_vars_UE,eNB_id_i,coded_bits_per_codeword); + write_output("dlsch_e.m","e",PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4); //pdcch_vars write_output("pdcchF0_ext.m","pdcchF_ext", PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->rxdataF_ext[0],2*3*PHY_vars_UE->lte_frame_parms.ofdm_symbol_size,1,1); @@ -2513,8 +3052,8 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols, PHY_vars_UE->dlsch_ue[0][0]->rnti = (common_flag==0) ? n_rnti: SI_RNTI; coded_bits_per_codeword = 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, + PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->nb_rb, + PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[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, @@ -2525,7 +3064,7 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols, // calculate uncoded BLER uncoded_ber=0; for (i=0;i<coded_bits_per_codeword;i++) - if (PHY_vars_eNB->dlsch_eNB[0][0]->e[i] != (PHY_vars_UE->lte_ue_pdsch_vars[0]->llr[0][i]<0)) { + if (PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->e[i] != (PHY_vars_UE->lte_ue_pdsch_vars[0]->llr[0][i]<0)) { uncoded_ber_bit[i] = 1; uncoded_ber++; } @@ -2570,7 +3109,7 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols, printf("No DLSCH errors found,uncoded ber %f\n",uncoded_ber); PHY_vars_UE->total_TBS[eNB_id] = PHY_vars_UE->total_TBS[eNB_id] + PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS; - + TB0_active = 0; } else { errs[round]++; @@ -2618,7 +3157,7 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols, //pdsch_vars dump_dlsch2(PHY_vars_UE,eNB_id,coded_bits_per_codeword); - write_output("dlsch_e.m","e",PHY_vars_eNB->dlsch_eNB[0][0]->e,coded_bits_per_codeword,1,4); + write_output("dlsch_e.m","e",PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4); write_output("dlsch_ber_bit.m","ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0); write_output("dlsch_eNB_w.m","w",PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,4); write_output("dlsch_UE_w.m","w",PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,0); @@ -2744,22 +3283,41 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols, (double)PHY_vars_UE->dlsch_tc_intl2_stats.diff/PHY_vars_UE->dlsch_tc_intl2_stats.trials, PHY_vars_UE->dlsch_tc_intl2_stats.trials); } - - fprintf(bler_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d\n", - SNR, - mcs, - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, - rate, - errs[0], - round_trials[0], - errs[1], - round_trials[1], - errs[2], - round_trials[2], - errs[3], - round_trials[3], - dci_errors); + if ((transmission_mode != 3) && (transmission_mode != 4)) { + fprintf(bler_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d\n", + SNR, + mcs1, + PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, + rate, + errs[0], + round_trials[0], + errs[1], + round_trials[1], + errs[2], + round_trials[2], + errs[3], + round_trials[3], + dci_errors); + } + else { + fprintf(bler_fd,"%f;%d;%d;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d\n", + SNR, + mcs1,mcs2, + PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, + PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->TBS, + rate, + errs[0], + round_trials[0], + errs[1], + round_trials[1], + errs[2], + round_trials[2], + errs[3], + round_trials[3], + dci_errors); + } + if(abstx){ //ABSTRACTION blerr[0] = (double)errs[0]/(round_trials[0]); @@ -2776,48 +3334,94 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols, if ( (test_perf != 0) && (100 * effective_rate > test_perf )) { fprintf(time_meas_fd,"SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err\n"); - fprintf(time_meas_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d\n", - SNR, - mcs, - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, - rate, - errs[0], - round_trials[0], - errs[1], - round_trials[1], - errs[2], - round_trials[2], - errs[3], - round_trials[3], - dci_errors); - - fprintf(time_meas_fd,"SNR; MCS; TBS; rate; DL_DECOD_ITER; err0; trials0; err1; trials1; err2; trials2; err3; trials3; PE; dci_err;PE;ND;\n"); - fprintf(time_meas_fd,"%f;%d;%d;%f(%2.1f%%,%f);%f;%d;%d;%d;%d;%d;%d;%d;%d;(%e,%e,%e,%e);%d/%d;%e;%f(%f);\n", - SNR, - mcs, - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, - rate*effective_rate, - 100*effective_rate, - rate, - (double)avg_iter/iter_trials, - errs[0], - round_trials[0], - errs[1], - round_trials[1], - errs[2], - round_trials[2], - errs[3], - round_trials[3], - (double)errs[0]/(round_trials[0]), - (double)errs[1]/(round_trials[0]), - (double)errs[2]/(round_trials[0]), - (double)errs[3]/(round_trials[0]), - dci_errors, - round_trials[0], - (double)dci_errors/(round_trials[0]), - (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/(double)PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, - (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])); - + if ((transmission_mode != 3) && (transmission_mode != 4)) { + fprintf(time_meas_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d\n", + SNR, + mcs1, + PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, + rate, + errs[0], + round_trials[0], + errs[1], + round_trials[1], + errs[2], + round_trials[2], + errs[3], + round_trials[3], + dci_errors); + + fprintf(time_meas_fd,"SNR; MCS; TBS; rate; DL_DECOD_ITER; err0; trials0; err1; trials1; err2; trials2; err3; trials3; PE; dci_err;PE;ND;\n"); + fprintf(time_meas_fd,"%f;%d;%d;%f(%2.1f%%,%f);%f;%d;%d;%d;%d;%d;%d;%d;%d;(%e,%e,%e,%e);%d/%d;%e;%f(%f);\n", + SNR, + mcs1, + PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, + rate*effective_rate, + 100*effective_rate, + rate, + (double)avg_iter/iter_trials, + errs[0], + round_trials[0], + errs[1], + round_trials[1], + errs[2], + round_trials[2], + errs[3], + round_trials[3], + (double)errs[0]/(round_trials[0]), + (double)errs[1]/(round_trials[0]), + (double)errs[2]/(round_trials[0]), + (double)errs[3]/(round_trials[0]), + dci_errors, + round_trials[0], + (double)dci_errors/(round_trials[0]), + (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/(double)PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, + (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])); + } + else { + fprintf(time_meas_fd,"%f;%d;%d;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d\n", + SNR, + mcs1,mcs2, + PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, + PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->TBS, + rate, + errs[0], + round_trials[0], + errs[1], + round_trials[1], + errs[2], + round_trials[2], + errs[3], + round_trials[3], + dci_errors); + + fprintf(time_meas_fd,"SNR; MCS; TBS; rate; DL_DECOD_ITER; err0; trials0; err1; trials1; err2; trials2; err3; trials3; PE; dci_err;PE;ND;\n"); + fprintf(time_meas_fd,"%f;%d;%d;%d;%d;%f(%2.1f%%,%f);%f;%d;%d;%d;%d;%d;%d;%d;%d;(%e,%e,%e,%e);%d/%d;%e;%f(%f);\n", + SNR, + mcs1,mcs2, + PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, + PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->TBS, + rate*effective_rate, + 100*effective_rate, + rate, + (double)avg_iter/iter_trials, + errs[0], + round_trials[0], + errs[1], + round_trials[1], + errs[2], + round_trials[2], + errs[3], + round_trials[3], + (double)errs[0]/(round_trials[0]), + (double)errs[1]/(round_trials[0]), + (double)errs[2]/(round_trials[0]), + (double)errs[3]/(round_trials[0]), + dci_errors, + round_trials[0], + (double)dci_errors/(round_trials[0]), + (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/(double)PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, + (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])); + } fprintf(time_meas_fd,"eNB_PROC_TX(%d); OFDM_MOD(%d); DL_MOD(%d); DL_SCR(%d); DL_ENC(%d); UE_PROC_RX(%d); OFDM_DEMOD_CH_EST(%d); RX_PDCCH(%d); CH_COMP_LLR(%d); DL_USCR; DL_DECOD(%d);\n", PHY_vars_eNB->phy_proc_tx.trials, PHY_vars_eNB->ofdm_mod_stats.trials, @@ -2845,7 +3449,7 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols, get_time_meas_us(&PHY_vars_UE->dlsch_decoding_stats) ); /* - fprintf(time_meas_fd,"%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;", + fprintf(time_meas_fd,"%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;", PHY_vars_eNB->phy_proc_tx.trials, PHY_vars_eNB->ofdm_mod_stats.trials, PHY_vars_eNB->dlsch_modulation_stats.trials, @@ -2857,19 +3461,19 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols, PHY_vars_UE->dlsch_llr_stats.trials, PHY_vars_UE->dlsch_unscrambling_stats.trials, PHY_vars_UE->dlsch_decoding_stats.trials); - */ - printf("[passed] effective rate : %f (%2.1f%%,%f)): log and break \n",rate*effective_rate, 100*effective_rate, rate ); - break; - } else if (test_perf !=0 ){ - printf("[continue] effective rate : %f (%2.1f%%,%f)): increase snr \n",rate*effective_rate, 100*effective_rate, rate); - } + */ + printf("[passed] effective rate : %f (%2.1f%%,%f)): log and break \n",rate*effective_rate, 100*effective_rate, rate ); + break; + } else if (test_perf !=0 ){ + printf("[continue] effective rate : %f (%2.1f%%,%f)): increase snr \n",rate*effective_rate, 100*effective_rate, rate); + } + + if (((double)errs[0]/(round_trials[0]))<1e-2) + break; + }// SNR - if (((double)errs[0]/(round_trials[0]))<1e-2) - break; - }// SNR - - - } //ch_realization + + } //ch_realization fclose(bler_fd); @@ -2891,8 +3495,10 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols, free(uncoded_ber_bit); uncoded_ber_bit = NULL; for (k=0;k<n_users;k++) { - free(input_buffer[k]); - input_buffer[k]=NULL; + free(input_buffer0[k]); + free(input_buffer1[k]); + input_buffer0[k]=NULL; + input_buffer1[k]=NULL; } printf("Freeing dlsch structures\n"); for (i=0;i<2;i++) { @@ -2917,7 +3523,7 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols, // lte_sync_time_free(); - printf("[MUMIMO] mcs %d, mcsi %d, offset %d, bler %f\n",mcs,mcs_i,offset_mumimo_llr_drange_fix,((double)errs[0])/((double)round_trials[0])); + // printf("[MUMIMO] mcs %d, mcsi %d, offset %d, bler %f\n",mcs,mcs_i,offset_mumimo_llr_drange_fix,((double)errs[0])/((double)round_trials[0])); return(0); } diff --git a/openair1/SIMULATION/LTE_PHY/pbchsim.c b/openair1/SIMULATION/LTE_PHY/pbchsim.c index 15c0581b73f54fbff30f18b7d395763dfdb13182..ecda10fccd6df3d8ff03812471f6d79af1b246cd 100644 --- a/openair1/SIMULATION/LTE_PHY/pbchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pbchsim.c @@ -991,6 +991,7 @@ int main(int argc, char **argv) { &PHY_vars_UE->lte_frame_parms, 0, SISO, + PHY_vars_UE->high_speed_flag, frame_mod4); if ((pbch_tx_ant>0) && (pbch_tx_ant<4)) { PHY_vars_UE->lte_frame_parms.mode1_flag = 1; @@ -1004,6 +1005,7 @@ int main(int argc, char **argv) { &PHY_vars_eNb->lte_frame_parms, 0, ALAMOUTI, + PHY_vars_UE->high_speed_flag, frame_mod4); if ((pbch_tx_ant>0) && (pbch_tx_ant<4)) { PHY_vars_UE->lte_frame_parms.mode1_flag = 0;