From b5a55c13968a3d6b7c7f58cd8612426e3f2f7c3e Mon Sep 17 00:00:00 2001 From: Matthieu Kanj <Matthieu.kanj@b-com.com> Date: Mon, 22 Jan 2018 18:23:19 +0100 Subject: [PATCH] version for testing NRS signal --- openair1/PHY/LTE_REFSIG/defs_NB_IoT.h | 4 +- .../PHY/LTE_REFSIG/lte_dl_cell_spec_NB_IoT.c | 69 +++++++- openair1/PHY/LTE_TRANSPORT/nprach_NB_IoT.c | 6 +- openair1/PHY/LTE_TRANSPORT/pilots_NB_IoT.c | 162 ++++++++++++++---- openair1/PHY/LTE_TRANSPORT/proto_NB_IoT.h | 3 +- .../SCHED/phy_procedures_lte_eNb_NB_IoT.c | 11 +- 6 files changed, 210 insertions(+), 45 deletions(-) diff --git a/openair1/PHY/LTE_REFSIG/defs_NB_IoT.h b/openair1/PHY/LTE_REFSIG/defs_NB_IoT.h index 9c6e20b920..586470bb59 100644 --- a/openair1/PHY/LTE_REFSIG/defs_NB_IoT.h +++ b/openair1/PHY/LTE_REFSIG/defs_NB_IoT.h @@ -18,7 +18,7 @@ #define __LTE_REFSIG_DEFS_NB_IOT__H__ #include "PHY/defs_NB_IoT.h" - +#include "PHY/defs.h" /** @ingroup _PHY_REF_SIG * @{ */ @@ -40,7 +40,7 @@ void lte_gold_NB_IoT(NB_IoT_DL_FRAME_PARMS *frame_parms, @param p antenna index @param RB_IoT_ID the ID of the RB dedicated for NB_IoT */ -int lte_dl_cell_spec_NB_IoT(PHY_VARS_eNB_NB_IoT *phy_vars_eNB, +int lte_dl_cell_spec_NB_IoT(PHY_VARS_eNB *phy_vars_eNB, int32_t *output, short amp, unsigned char Ns, diff --git a/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec_NB_IoT.c b/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec_NB_IoT.c index cf8818f0b6..0b1d22674d 100644 --- a/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec_NB_IoT.c +++ b/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec_NB_IoT.c @@ -21,7 +21,7 @@ #include "PHY/LTE_REFSIG/defs_NB_IoT.h" #include "PHY/defs_NB_IoT.h" -int lte_dl_cell_spec_NB_IoT(PHY_VARS_eNB_NB_IoT *phy_vars_eNB, +int lte_dl_cell_spec_NB_IoT(PHY_VARS_eNB *phy_vars_eNB, int32_t *output, short amp, unsigned char Ns, @@ -76,6 +76,72 @@ int lte_dl_cell_spec_NB_IoT(PHY_VARS_eNB_NB_IoT *phy_vars_eNB, DevAssert( Ns < 20 ); DevAssert( l < 2 ); + for (m=0; m<2; m++) { + output[k] = qpsk[(phy_vars_eNB->lte_gold_table[Ns][l][0]) & 3]; //TODO should be defined one for NB-IoT + k+=6; + } + + return(0); +} + + +///////////////////////////////////////////////////////////////////////// +/* +int lte_dl_cell_spec_NB_IoT(PHY_VARS_eNB_NB_IoT *phy_vars_eNB, + int32_t *output, + short amp, + unsigned char Ns, + unsigned char l, + unsigned char p, + unsigned short RB_IoT_ID) // the ID of the RB dedicated for NB_IoT +{ + unsigned char nu,m; + unsigned short k,a; + unsigned short NB_IoT_start,bandwidth_even_odd; + int32_t qpsk[4]; + + a = (amp*ONE_OVER_SQRT2_Q15_NB_IoT)>>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; + + if ((p==0) && (l==0) ) + nu = 0; + else if ((p==0) && (l>0)) + nu = 3; + else if ((p==1) && (l==0)) + nu = 3; + else if ((p==1) && (l>0)) + nu = 0; + else { + printf("lte_dl_cell_spec_NB_IoT: p %d, l %d -> ERROR\n",p,l); + return(-1); + } + + // testing if the total number of RBs is even or odd + bandwidth_even_odd = phy_vars_eNB->frame_parms.N_RB_DL % 2; // 0 even, 1 odd + + //mprime = 0; // mprime = 0,1 for NB_IoT // for LTE , maximum number of resources blocks (110) - the total number of RB in the selected bandwidth (.... 15 , 25 , 50, 100) + k = (nu + phy_vars_eNB->frame_parms.nushift)%6; + + if(RB_IoT_ID < (phy_vars_eNB->frame_parms.N_RB_DL/2)) + { //XXX this mod operation is not valid since the second member is not an integer but double (for the moment i put a cast) + NB_IoT_start = phy_vars_eNB->frame_parms.ofdm_symbol_size - 12*(phy_vars_eNB->frame_parms.N_RB_DL/2) - (bandwidth_even_odd*6) + 12*(RB_IoT_ID%((int)(ceil(phy_vars_eNB->frame_parms.N_RB_DL/(float)2)))); + } else { + //XXX invalid mod operation (put a cast for the moment) + NB_IoT_start = (bandwidth_even_odd*6) + 12*(RB_IoT_ID%((int)(ceil(phy_vars_eNB->frame_parms.N_RB_DL/(float)2)))); + } + + k+=NB_IoT_start; + + DevAssert( Ns < 20 ); + DevAssert( l < 2 ); + for (m=0; m<2; m++) { output[k] = qpsk[(phy_vars_eNB->lte_gold_table_NB_IoT[Ns][l][0]) & 3]; //TODO should be defined one for NB-IoT k+=6; @@ -84,3 +150,4 @@ int lte_dl_cell_spec_NB_IoT(PHY_VARS_eNB_NB_IoT *phy_vars_eNB, return(0); } +*/ \ No newline at end of file diff --git a/openair1/PHY/LTE_TRANSPORT/nprach_NB_IoT.c b/openair1/PHY/LTE_TRANSPORT/nprach_NB_IoT.c index bf16459da4..5ac5209e7d 100644 --- a/openair1/PHY/LTE_TRANSPORT/nprach_NB_IoT.c +++ b/openair1/PHY/LTE_TRANSPORT/nprach_NB_IoT.c @@ -359,7 +359,7 @@ void RX_NPRACH_NB_IoT(PHY_VARS_eNB_NB_IoT *eNB, int16_t *Rx_buffer){ uint32_t estimated_TA_coarse=0; int16_t *Rx_sub_sampled_buffer_128,*Rx_sub_sampled_buffer_16; uint16_t sub_sampling_rate; //NB-IoT: to be defined somewhere - uint32_t FRAME_LENGTH_COMPLEX_SAMPLES=0; // NB-IoT: length of input buffer, to be defined somewhere + uint32_t FRAME_LENGTH_COMPLEX_SAMPLESx=0; // NB-IoT: length of input buffer, to be defined somewhere uint32_t FRAME_LENGTH_COMPLEX_SUB_SAMPLES; // Length of buffer after sub-sampling uint32_t *length_ouput; // Length of buffer after sub-sampling char coarse=1; // flag that indicate the level of TA estimation @@ -370,7 +370,7 @@ void RX_NPRACH_NB_IoT(PHY_VARS_eNB_NB_IoT *eNB, int16_t *Rx_buffer){ sub_sampling_rate = 128; length_ouput = &FRAME_LENGTH_COMPLEX_SUB_SAMPLES; - Rx_sub_sampled_buffer_128 = sub_sampling_NB_IoT(Rx_buffer,FRAME_LENGTH_COMPLEX_SAMPLES,length_ouput, sub_sampling_rate); + Rx_sub_sampled_buffer_128 = sub_sampling_NB_IoT(Rx_buffer,FRAME_LENGTH_COMPLEX_SAMPLESx,length_ouput, sub_sampling_rate); // Detection and TA estimation stage /============================================================/ @@ -387,7 +387,7 @@ void RX_NPRACH_NB_IoT(PHY_VARS_eNB_NB_IoT *eNB, int16_t *Rx_buffer){ // Sub-sampling stage /============================================================/ sub_sampling_rate = 16; - Rx_sub_sampled_buffer_16 = sub_sampling_NB_IoT(Rx_buffer,FRAME_LENGTH_COMPLEX_SAMPLES,length_ouput, sub_sampling_rate); + Rx_sub_sampled_buffer_16 = sub_sampling_NB_IoT(Rx_buffer,FRAME_LENGTH_COMPLEX_SAMPLESx,length_ouput, sub_sampling_rate); // Fine TA estimation stage /============================================================/ diff --git a/openair1/PHY/LTE_TRANSPORT/pilots_NB_IoT.c b/openair1/PHY/LTE_TRANSPORT/pilots_NB_IoT.c index 96ecd44117..ef7a0f7456 100644 --- a/openair1/PHY/LTE_TRANSPORT/pilots_NB_IoT.c +++ b/openair1/PHY/LTE_TRANSPORT/pilots_NB_IoT.c @@ -12,34 +12,33 @@ * \warning */ -//#include "PHY/defs.h" +#include "PHY/defs.h" #include "PHY/defs_NB_IoT.h" #include "PHY/LTE_REFSIG/defs_NB_IoT.h" -void generate_pilots_NB_IoT(PHY_VARS_eNB_NB_IoT *phy_vars_eNB, +void generate_pilots_NB_IoT(PHY_VARS_eNB *phy_vars_eNB, int32_t **txdataF, int16_t amp, - uint16_t Ntti, // Ntti = 10 - unsigned short RB_IoT_ID, // RB reserved for NB-IoT + uint16_t Ntti, // Ntti = 0..9 + unsigned short RB_ID, // RB reserved for NB-IoT unsigned short With_NSSS) // With_NSSS = 1; if the frame include a sub-Frame with NSSS signal { - NB_IoT_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->frame_parms_NB_IoT; - + LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->frame_parms; + uint16_t subframe = Ntti; uint32_t tti,tti_offset,slot_offset,Nsymb,samples_per_symbol; uint8_t first_pilot,second_pilot; - + unsigned short RB_IoT_ID = RB_ID; Nsymb = 14; first_pilot = 5; // first pilot position second_pilot = 6; // second pilot position - - for (tti=0; tti<Ntti; tti++) { // loop on sub-frames - tti_offset = tti*frame_parms->ofdm_symbol_size*Nsymb; // begins with 0 + slot_offset = (Ntti*2)%20; + + if(subframe !=5 && ((With_NSSS*subframe)!= 9) ) // condition to avoid NPSS and NSSS signals + { + tti_offset = subframe*frame_parms->ofdm_symbol_size*Nsymb; // begins with 0 samples_per_symbol = frame_parms->ofdm_symbol_size; // ex. 512 - slot_offset = (tti*2)%20; // 0, 2, 4, ....... 18 - - if((slot_offset != 10) && ((With_NSSS*slot_offset) != 18)) { // condition to avoid NPSS and NSSS signals //Generate Pilots for slot 0 and 1 @@ -47,70 +46,171 @@ void generate_pilots_NB_IoT(PHY_VARS_eNB_NB_IoT *phy_vars_eNB, lte_dl_cell_spec_NB_IoT(phy_vars_eNB, &txdataF[0][tti_offset + (first_pilot*samples_per_symbol)], // tti_offset 512 x 32 bits amp, - RB_IoT_ID, slot_offset, - 0, //p - 0); + 0, + 0, + RB_IoT_ID); //antenna 0 symbol 6 slot 0 lte_dl_cell_spec_NB_IoT(phy_vars_eNB,&txdataF[0][tti_offset + (second_pilot*samples_per_symbol)], amp, - RB_IoT_ID, slot_offset, 1, - 0); + 0, + RB_IoT_ID); //antenna 0 symbol 5 slot 1 lte_dl_cell_spec_NB_IoT(phy_vars_eNB,&txdataF[0][tti_offset + (7*samples_per_symbol) + (first_pilot*samples_per_symbol)], amp, - RB_IoT_ID, 1+slot_offset, 0, - 0); + 0, + RB_IoT_ID); //antenna 0 symbol 6 slot 1 lte_dl_cell_spec_NB_IoT(phy_vars_eNB,&txdataF[0][tti_offset + (7*samples_per_symbol) + (second_pilot*samples_per_symbol)], amp, - RB_IoT_ID, 1+slot_offset, 1, - 0); + 0, + RB_IoT_ID); if (frame_parms->nb_antennas_tx > 1) { // Pilots generation with two antennas // antenna 1 symbol 5 slot 0 lte_dl_cell_spec_NB_IoT(phy_vars_eNB,&txdataF[1][tti_offset + (first_pilot*samples_per_symbol)], amp, - RB_IoT_ID, slot_offset, 0, - 1); + 1, + RB_IoT_ID); // antenna 1 symbol 6 slot 0 lte_dl_cell_spec_NB_IoT(phy_vars_eNB,&txdataF[1][tti_offset + (second_pilot*samples_per_symbol)], amp, - RB_IoT_ID, slot_offset, 1, - 1); + 1, + RB_IoT_ID); //antenna 1 symbol 5 slot 1 lte_dl_cell_spec_NB_IoT(phy_vars_eNB,&txdataF[1][tti_offset + (7*samples_per_symbol) + (first_pilot*samples_per_symbol)], amp, - RB_IoT_ID, 1+slot_offset, 0, - 1); + 1, + RB_IoT_ID); // antenna 1 symbol 6 slot 1 lte_dl_cell_spec_NB_IoT(phy_vars_eNB,&txdataF[1][tti_offset + (7*samples_per_symbol) + (second_pilot*samples_per_symbol)], amp, - RB_IoT_ID, 1+slot_offset, 1, - 1); + 1, + RB_IoT_ID); } - } } } + + +////////////////////////////////////////////////////// +/* +void generate_pilots_NB_IoT(PHY_VARS_eNB_NB_IoT *phy_vars_eNB, + int32_t **txdataF, + int16_t amp, + uint16_t Ntti, // Ntti = 10 + unsigned short RB_IoT_ID, // RB reserved for NB-IoT + unsigned short With_NSSS) // With_NSSS = 1; if the frame include a sub-Frame with NSSS signal +{ + + NB_IoT_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->frame_parms_NB_IoT; + + uint32_t tti,tti_offset,slot_offset,Nsymb,samples_per_symbol; + uint8_t first_pilot,second_pilot; + + Nsymb = 14; + first_pilot = 5; // first pilot position + second_pilot = 6; // second pilot position + + for (tti=0; tti<Ntti; tti++) { // loop on sub-frames + + tti_offset = tti*frame_parms->ofdm_symbol_size*Nsymb; // begins with 0 + samples_per_symbol = frame_parms->ofdm_symbol_size; // ex. 512 + slot_offset = (tti*2)%20; // 0, 2, 4, ....... 18 + + if((slot_offset != 10) && ((With_NSSS*slot_offset) != 18)) { // condition to avoid NPSS and NSSS signals + + //Generate Pilots for slot 0 and 1 + + //antenna 0 symbol 5 slot 0 + lte_dl_cell_spec_NB_IoT(phy_vars_eNB, + &txdataF[0][tti_offset + (first_pilot*samples_per_symbol)], // tti_offset 512 x 32 bits + amp, + RB_IoT_ID, + slot_offset, + 0, //p + 0); + + //antenna 0 symbol 6 slot 0 + lte_dl_cell_spec_NB_IoT(phy_vars_eNB,&txdataF[0][tti_offset + (second_pilot*samples_per_symbol)], + amp, + RB_IoT_ID, + slot_offset, + 1, + 0); + + //antenna 0 symbol 5 slot 1 + lte_dl_cell_spec_NB_IoT(phy_vars_eNB,&txdataF[0][tti_offset + (7*samples_per_symbol) + (first_pilot*samples_per_symbol)], + amp, + RB_IoT_ID, + 1+slot_offset, + 0, + 0); + + //antenna 0 symbol 6 slot 1 + lte_dl_cell_spec_NB_IoT(phy_vars_eNB,&txdataF[0][tti_offset + (7*samples_per_symbol) + (second_pilot*samples_per_symbol)], + amp, + RB_IoT_ID, + 1+slot_offset, + 1, + 0); + + if (frame_parms->nb_antennas_tx > 1) { // Pilots generation with two antennas + + // antenna 1 symbol 5 slot 0 + lte_dl_cell_spec_NB_IoT(phy_vars_eNB,&txdataF[1][tti_offset + (first_pilot*samples_per_symbol)], + amp, + RB_IoT_ID, + slot_offset, + 0, + 1); + + // antenna 1 symbol 6 slot 0 + lte_dl_cell_spec_NB_IoT(phy_vars_eNB,&txdataF[1][tti_offset + (second_pilot*samples_per_symbol)], + amp, + RB_IoT_ID, + slot_offset, + 1, + 1); + + //antenna 1 symbol 5 slot 1 + lte_dl_cell_spec_NB_IoT(phy_vars_eNB,&txdataF[1][tti_offset + (7*samples_per_symbol) + (first_pilot*samples_per_symbol)], + amp, + RB_IoT_ID, + 1+slot_offset, + 0, + 1); + + // antenna 1 symbol 6 slot 1 + lte_dl_cell_spec_NB_IoT(phy_vars_eNB,&txdataF[1][tti_offset + (7*samples_per_symbol) + (second_pilot*samples_per_symbol)], + amp, + RB_IoT_ID, + 1+slot_offset, + 1, + 1); + } + } + } +} +*/ \ No newline at end of file diff --git a/openair1/PHY/LTE_TRANSPORT/proto_NB_IoT.h b/openair1/PHY/LTE_TRANSPORT/proto_NB_IoT.h index 47696fa9c2..c241d2dbbf 100644 --- a/openair1/PHY/LTE_TRANSPORT/proto_NB_IoT.h +++ b/openair1/PHY/LTE_TRANSPORT/proto_NB_IoT.h @@ -33,6 +33,7 @@ #define __LTE_TRANSPORT_PROTO_NB_IOT__H__ #include "PHY/defs_NB_IoT.h" #include "PHY/impl_defs_lte.h" +#include "PHY/defs.h" //#include <math.h> //NPSS @@ -65,7 +66,7 @@ int nsss_extract_NB_IoT(PHY_VARS_UE_NB_IoT *ue, //NRS -void generate_pilots_NB_IoT(PHY_VARS_eNB_NB_IoT *phy_vars_eNB, +void generate_pilots_NB_IoT(PHY_VARS_eNB *phy_vars_eNB, int32_t **txdataF, int16_t amp, uint16_t Ntti, // Ntti = 10 diff --git a/openair1/SCHED/phy_procedures_lte_eNb_NB_IoT.c b/openair1/SCHED/phy_procedures_lte_eNb_NB_IoT.c index ed4db6631d..e290c524ba 100644 --- a/openair1/SCHED/phy_procedures_lte_eNb_NB_IoT.c +++ b/openair1/SCHED/phy_procedures_lte_eNb_NB_IoT.c @@ -220,7 +220,7 @@ void common_signal_procedures_NB_IoT(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) int **txdataF = eNB->common_vars.txdataF[0]; int subframe = proc->subframe_tx; int frame = proc->frame_tx; - uint16_t Ntti = 10; //ntti = 10 + //uint16_t Ntti = 10; //ntti = 10 int RB_IoT_ID=2 ; // XXX should be initialized (RB reserved for NB-IoT, PRB index) int With_NSSS=0; // With_NSSS = 1; if the frame include a sub-Frame with NSSS signal @@ -260,17 +260,14 @@ void common_signal_procedures_NB_IoT(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) RB_IoT_ID); } - /*else - { generate_pilots_NB_IoT(eNB, txdataF, AMP, - Ntti, + subframe, RB_IoT_ID, - With_NSSS); - } - */ + With_NSSS); + } void phy_procedures_eNB_uespec_RX_NB_IoT(PHY_VARS_eNB_NB_IoT *eNB,eNB_rxtx_proc_t *proc,UL_IND_t *UL_INFO) -- 2.26.2