diff --git a/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c b/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c index 54f52ef40b..a9ddf6d310 100644 --- a/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c +++ b/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c @@ -154,3 +154,92 @@ int lte_dl_mbsfn_rx(PHY_VARS_UE *ue, return(0); } +#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) +int lte_dl_mbsfn_khz_1dot25(PHY_VARS_eNB *eNB, int32_t *output, + short amp, + int subframe) +{ + + unsigned int mprime,mprime_dword,mprime_qpsk_symb,m; + unsigned short k=0,a; + int32_t qpsk[4]; + + a = (amp*ONE_OVER_SQRT2_Q15)>>15; + ((short *)&qpsk[0])[0] = a; + ((short *)&qpsk[0])[1] = a; + + ((short *)&qpsk[1])[0] = -a; + ((short *)&qpsk[1])[1] = a; + ((short *)&qpsk[2])[0] = a; + ((short *)&qpsk[2])[1] = -a; + + ((short *)&qpsk[3])[0] = -a; + ((short *)&qpsk[3])[1] = -a; + + + mprime = 3*(110 - eNB->frame_parms.N_RB_DL); + + for (m=0; mframe_parms.N_RB_DL*24; m++) // m = 0:24*N_RB_DL-1 + { + if ((subframe&0x1)==0) // n_sf mod 2 == 0: even + k = 6*m; + else + k = 6*m + 3; + + + k+=eNB->frame_parms.first_carrier_offset_khz_1dot25; + + mprime_dword = mprime>>4; + mprime_qpsk_symb = mprime&0xf; + + if (k >= eNB->frame_parms.ofdm_symbol_size_khz_1dot25) { + k++; // skip DC carrier + k-=eNB->frame_parms.ofdm_symbol_size_khz_1dot25; + } + output[k] = qpsk[(eNB->lte_gold_mbsfn_khz_1dot25_table[subframe][mprime_dword]>>(2*mprime_qpsk_symb))&3]; + mprime++; + } + + return(0); +} + + +int lte_dl_mbsfn_khz_1dot25_rx(PHY_VARS_UE *ue, + int *output, + int subframe) +{ + + unsigned int mprime,mprime_dword,mprime_qpsk_symb,m; + unsigned short k=0; + unsigned int qpsk[4]; + + // This includes complex conjugate for channel estimation + + ((short *)&qpsk[0])[0] = ONE_OVER_SQRT2_Q15; + ((short *)&qpsk[0])[1] = -ONE_OVER_SQRT2_Q15; + ((short *)&qpsk[1])[0] = -ONE_OVER_SQRT2_Q15; + ((short *)&qpsk[1])[1] = -ONE_OVER_SQRT2_Q15; + ((short *)&qpsk[2])[0] = ONE_OVER_SQRT2_Q15; + ((short *)&qpsk[2])[1] = ONE_OVER_SQRT2_Q15; + ((short *)&qpsk[3])[0] = -ONE_OVER_SQRT2_Q15; + ((short *)&qpsk[3])[1] = ONE_OVER_SQRT2_Q15; + + mprime = 3*(110 - ue->frame_parms.N_RB_DL); + + for (m=0; mframe_parms.N_RB_DL*24; m++) // m = 0:24*N_RB_DL-1 + { mprime_dword = mprime>>4; + mprime_qpsk_symb = mprime&0xf; + + // this is r_mprime from 3GPP 36-211 6.10.1.2 + output[k] = qpsk[(ue->lte_gold_mbsfn_khz_1dot25_table[subframe][mprime_dword]>>(2*mprime_qpsk_symb))&3]; + + mprime++; + k++; + + } + + return(0); +} + +#endif // MAKE Rel14 + diff --git a/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c b/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c index 69dbb705db..2ec3c44027 100644 --- a/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c +++ b/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c @@ -95,6 +95,34 @@ void lte_gold_mbsfn(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_mbsfn_tabl } +#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) +void lte_gold_mbsfn_khz_1dot25(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_mbsfn_khz_1dot25_table[10][150],uint16_t Nid_mbsfn){ + unsigned char sfn,l; + unsigned int n,x1,x2;//,x1tmp,x2tmp; + + for (sfn=0; sfn<10; sfn++) { + x2 = (Nid_mbsfn) + (((1+(Nid_mbsfn<<1))*(1 + (7*(1+sfn))))<<9); //cinit + x1 = 1+ (1<<31); + x2=x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31); + for (n=1; n<50; n++) { + x1 = (x1>>1) ^ (x1>>4); + x1 = x1 ^ (x1<<31) ^ (x1<<28); + x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4); + x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28); + } + for (n=0; n<150; n++) { + x1 = (x1>>1) ^ (x1>>4); + x1 = x1 ^ (x1<<31) ^ (x1<<28); + x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4); + x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28); + lte_gold_mbsfn_khz_1dot25_table[sfn][n] = x1^x2; + } + } +} +#endif + + + #ifdef LTE_GOLD_MAIN main() {