From d7db5cdd57ebc92ddc57a9eaf5c923133091e8d3 Mon Sep 17 00:00:00 2001 From: Xiwen JIANG Date: Wed, 15 Jun 2016 17:54:13 +0200 Subject: [PATCH] merge ue_spec beamforming and cell_spec beamforming to beam_precoding --- openair1/PHY/INIT/lte_init.c | 22 ++- openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c | 2 +- openair1/PHY/MODULATION/beamforming.c | 185 +++++------------- openair1/PHY/MODULATION/defs.h | 35 +--- openair1/PHY/MODULATION/ofdm_mod.c | 13 +- openair1/PHY/impl_defs_lte.h | 15 +- openair1/SCHED/phy_procedures_lte_eNb.c | 19 +- openair1/SIMULATION/LTE_PHY/dlsim.c | 10 +- .../CONF/enb.band7.tm1.exmimo2.conf | 8 +- 9 files changed, 109 insertions(+), 200 deletions(-) diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index c13373647d..f5e9fdae10 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -1235,7 +1235,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *phy_vars_eNB, LTE_eNB_PUSCH** const eNB_pusch_vars = phy_vars_eNB->lte_eNB_pusch_vars; LTE_eNB_SRS* const eNB_srs_vars = phy_vars_eNB->lte_eNB_srs_vars; LTE_eNB_PRACH* const eNB_prach_vars = &phy_vars_eNB->lte_eNB_prach_vars; - int i, j, eNB_id, UE_id; + int i, j, re, eNB_id, UE_id; phy_vars_eNB->total_dlsch_bitrate = 0; phy_vars_eNB->total_transmitted_bits = 0; @@ -1302,7 +1302,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *phy_vars_eNB, #endif } - for (i=0; i<2; i++) { // 2 is the total number of cell specific antenna ports + /*for (i=0; i<2; i++) { // 2 is the total number of cell specific antenna ports eNB_common_vars->cell_spec_bf_weights[eNB_id][i] = (int32_t **)malloc16_clear(frame_parms->nb_antennas_tx*sizeof(int32_t*)); for (j=0; jnb_antennas_tx; j++) { eNB_common_vars->cell_spec_bf_weights[eNB_id][i][j] = (int32_t *)malloc16_clear(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t)); @@ -1310,11 +1310,25 @@ int phy_init_lte_eNB(PHY_VARS_eNB *phy_vars_eNB, msg("[openair][LTE_PHY][INIT] lte_eNB_common_vars->cell_spec_bf_weights[%d][%d][%d] = %p (%d bytes)\n", eNB_id,i,j,eNB_common_vars->cell_spec_bf_weights[eNB_id][i][j], OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t)); +#endif + } + } */ + + for (i=0; i<15; i++) { // 15 is the total number of antenna ports + eNB_common_vars->beam_weights[eNB_id][i] = (int32_t **)malloc16_clear(frame_parms->nb_antennas_tx*sizeof(int32_t*)); + for (j=0; jnb_antennas_tx; j++) { + eNB_common_vars->beam_weights[eNB_id][i][j] = (int32_t *)malloc16_clear(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t)); + for (re=0; rebeam_weights[eNB_id][i][j][re] = 0x00007fff; +#ifdef DEBUG_PUY + msg("[openair][LTE_PHY][INIT] lte_eNB_common_vars->beam_weights[%d][%d][%d] = %p (%d bytes)\n", + eNB_id,i,j,eNB_common_vars->beam_weights[eNB_id][i][j], + OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t)); #endif } } - for (i=0; i<8; i++) { //antenna port 5 for TM7, antenna port 7-15 for TM8-10 + /*for (i=0; i<8; i++) { //antenna port 5 for TM7, antenna port 7-15 for TM8-10 eNB_common_vars->ue_spec_bf_weights[eNB_id][i] = (int32_t **)malloc16_clear(frame_parms->nb_antennas_tx*sizeof(int32_t*)); for (j=0; jnb_antennas_tx; j++) { eNB_common_vars->ue_spec_bf_weights[eNB_id][i][j] = (int32_t*)malloc16_clear(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t)); @@ -1324,7 +1338,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *phy_vars_eNB, OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t)); #endif } - } + } */ // RX vars eNB_common_vars->rxdata[eNB_id] = (int32_t**)malloc16(frame_parms->nb_antennas_rx*sizeof(int32_t*) ); diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c index a59667c3f6..f50b0a7567 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c @@ -1446,7 +1446,7 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, // mapping ue specific beamforming weights from UE specified DLSCH structure to common space for (aa=0;aanb_antennas_tx;aa++){ - memcpy(phy_vars_eNB->lte_eNB_common_vars.ue_spec_bf_weights[0][0][aa],dlsch0->ue_spec_bf_weights[0][aa],frame_parms->ofdm_symbol_size*sizeof(int32_t)); + memcpy(phy_vars_eNB->lte_eNB_common_vars.beam_weights[0][5][aa],dlsch0->ue_spec_bf_weights[0][aa],frame_parms->ofdm_symbol_size*sizeof(int32_t)); } } diff --git a/openair1/PHY/MODULATION/beamforming.c b/openair1/PHY/MODULATION/beamforming.c index 157b8eb368..e37ab0e430 100644 --- a/openair1/PHY/MODULATION/beamforming.c +++ b/openair1/PHY/MODULATION/beamforming.c @@ -46,14 +46,12 @@ Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 069 #include "defs.h" #include "UTIL/LOG/vcd_signal_dumper.h" - -// ue_spec_beamforming: perform beamforming for data in transmission_mode TM7-TM10 -int ue_spec_beamforming(int32_t **txdataF, - int32_t **txdataF_BF, - LTE_DL_FRAME_PARMS *frame_parms, - int32_t ***ue_spec_bf_weights, - int slot, - int symbol) +int beam_precoding(int32_t **txdataF, + int32_t **txdataF_BF, + LTE_DL_FRAME_PARMS *frame_parms, + int32_t ***beam_weights, + int slot, + int symbol) { uint8_t p,aa; uint16_t re=0; @@ -66,41 +64,54 @@ int ue_spec_beamforming(int32_t **txdataF, memset(txdataF_BF[aa],0,4*(frame_parms->ofdm_symbol_size)); for (re=0;reofdm_symbol_size;re++) { + for (p=0; p<2; p++) { + if (txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re]!=0) { + for (aa=0;aanb_antennas_tx;aa++) { + ((int16_t*)&txdataF_BF[aa][re])[0] = (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0]*((int16_t*)&beam_weights[p][aa][re])[0])>>15); + ((int16_t*)&txdataF_BF[aa][re])[0] -= (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1]*((int16_t*)&beam_weights[p][aa][re])[1])>>15); + ((int16_t*)&txdataF_BF[aa][re])[1] = (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0]*((int16_t*)&beam_weights[p][aa][re])[1])>>15); + ((int16_t*)&txdataF_BF[aa][re])[1] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1]*((int16_t*)&beam_weights[0][aa][re])[0])>>15); + + //printf("beamforming.c:txdata[%d][%d]=%d+j%d, beam_weights[%d][%d][%d]=%d+j%d,txdata_BF[%d][%d]=%d+j%d\n", + // p,slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re, + // ((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0], + // ((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1], + // p,aa,re, + // ((int16_t*)&beam_weights[p][aa][re])[0],((int16_t*)&beam_weights[p][aa][re])[1], + // aa,re, + // ((int16_t*)&txdataF_BF[aa][re])[0], + // ((int16_t*)&txdataF_BF[aa][re])[1]); + } + + } + } if (txdataF[5][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re]!=0) { //that means this RE is actually using TM7 for (aa=0;aanb_antennas_tx;aa++) { - ((int16_t*)&txdataF_BF[aa][re])[0] = (int16_t)((((int16_t*)&txdataF[5][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0] - *((int16_t*)&ue_spec_bf_weights[0][aa][re])[0])>>15); - ((int16_t*)&txdataF_BF[aa][re])[0] -= (int16_t)((((int16_t*)&txdataF[5][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1] - *((int16_t*)&ue_spec_bf_weights[0][aa][re])[1])>>15); - ((int16_t*)&txdataF_BF[aa][re])[1] = (int16_t)((((int16_t*)&txdataF[5][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0] - *((int16_t*)&ue_spec_bf_weights[0][aa][re])[1])>>15); - ((int16_t*)&txdataF_BF[aa][re])[1] += (int16_t)((((int16_t*)&txdataF[5][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1] - *((int16_t*)&ue_spec_bf_weights[0][aa][re])[0])>>15); + ((int16_t*)&txdataF_BF[aa][re])[0] = (int16_t)((((int16_t*)&txdataF[5][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0]*((int16_t*)&beam_weights[5][aa][re])[0])>>15); + ((int16_t*)&txdataF_BF[aa][re])[0] -= (int16_t)((((int16_t*)&txdataF[5][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1]*((int16_t*)&beam_weights[5][aa][re])[1])>>15); + ((int16_t*)&txdataF_BF[aa][re])[1] = (int16_t)((((int16_t*)&txdataF[5][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0]*((int16_t*)&beam_weights[5][aa][re])[1])>>15); + ((int16_t*)&txdataF_BF[aa][re])[1] += (int16_t)((((int16_t*)&txdataF[5][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1]*((int16_t*)&beam_weights[5][aa][re])[0])>>15); + // printf("beamforming.c:txdata[%d][%d]=%d+j%d, beam_weights[%d][%d][%d]=%d+j%d,txdata_BF[%d][%d]=%d+j%d\n", + // p,slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re, + // ((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0], + // ((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1], + // p,aa,re, + // ((int16_t*)&beam_weights[p][aa][re])[0],((int16_t*)&beam_weights[p][aa][re])[1], + // aa,re, + // ((int16_t*)&txdataF_BF[aa][re])[0], + // ((int16_t*)&txdataF_BF[aa][re])[1]); -/* printf("beamforming.c:txdataF[5][%d]=%d+j%d, ue_bf_weights[0][%d][%d]=%d+j%d,txdata_BF[%d][%d]=%d+j%d\n", - slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re, - ((int16_t*)&txdataF[5][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0], - ((int16_t*)&txdataF[5][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1], - aa,re, - ((int16_t*)&ue_spec_bf_weights[0][aa][re])[0],((int16_t*)&ue_spec_bf_weights[0][aa][re])[1], - aa,re, - ((int16_t*)&txdataF_BF[aa][re])[0], - ((int16_t*)&txdataF_BF[aa][re])[1]); */ } } if (txdataF[7][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re]!=0) { //that means this RE is actually using TM8-10 - for (p=0;p<8;p++) { - if (txdataF[p+7][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re]!=0) { //that means this RE is actually allocated + for (p=7;p<15;p++) { + if (txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re]!=0) { //that means this RE is actually allocated for (aa=0;aanb_antennas_tx;aa++) { - ((int16_t*)&txdataF_BF[aa][re])[0] = (int16_t)((((int16_t*)&txdataF[p+7][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0] - *((int16_t*)&ue_spec_bf_weights[p][aa][re])[0])>>15); - ((int16_t*)&txdataF_BF[aa][re])[0] -= (int16_t)((((int16_t*)&txdataF[p+7][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1] - *((int16_t*)&ue_spec_bf_weights[p][aa][re])[1])>>15); - ((int16_t*)&txdataF_BF[aa][re])[1] = (int16_t)((((int16_t*)&txdataF[p+7][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0] - *((int16_t*)&ue_spec_bf_weights[p][aa][re])[1])>>15); - ((int16_t*)&txdataF_BF[aa][re])[1] += (int16_t)((((int16_t*)&txdataF[p+7][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1] - *((int16_t*)&ue_spec_bf_weights[p][aa][re])[0])>>15); + ((int16_t*)&txdataF_BF[aa][re])[0] = (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0]*((int16_t*)&beam_weights[p][aa][re])[0])>>15); + ((int16_t*)&txdataF_BF[aa][re])[0] -= (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1]*((int16_t*)&beam_weights[p][aa][re])[1])>>15); + ((int16_t*)&txdataF_BF[aa][re])[1] = (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0]*((int16_t*)&beam_weights[p][aa][re])[1])>>15); + ((int16_t*)&txdataF_BF[aa][re])[1] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1]*((int16_t*)&beam_weights[p][aa][re])[0])>>15); } } } @@ -108,107 +119,3 @@ int ue_spec_beamforming(int32_t **txdataF, } } -// cell_spec_beamforming: performed for all common data -int cell_spec_beamforming(int32_t **txdataF, - int32_t **txdataF_BF, - LTE_DL_FRAME_PARMS *frame_parms, - int32_t ***cell_spec_bf_weights, - int slot, - int symbol) -{ - uint8_t p,aa; - uint16_t re=0; - int slot_offset_F; - - slot_offset_F = slot*(frame_parms->ofdm_symbol_size)*((frame_parms->Ncp==1) ? 6 : 7); - - // clear txdata_BF[aa][re] for each call of cell_spec_beamforming - for(aa=0;aanb_antennas_tx;aa++) - memset(txdataF_BF[aa],0,4*(frame_parms->ofdm_symbol_size)); - - for (re=0;reofdm_symbol_size;re++) { - for (p=0;pnb_antenna_ports_eNB;p++) { - if (txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re]!=0) { //that means this RE is actually allocated - for (aa=0;aanb_antennas_tx;aa++) { - - ((int16_t*)&txdataF_BF[aa][re])[0] = (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0] - *((int16_t*)&cell_spec_bf_weights[p][aa][re])[0])>>15); - ((int16_t*)&txdataF_BF[aa][re])[0] -= (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1] - *((int16_t*)&cell_spec_bf_weights[p][aa][re])[1])>>15); - ((int16_t*)&txdataF_BF[aa][re])[1] = (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0] - *((int16_t*)&cell_spec_bf_weights[p][aa][re])[1])>>15); - ((int16_t*)&txdataF_BF[aa][re])[1] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1] - *((int16_t*)&cell_spec_bf_weights[p][aa][re])[0])>>15); - // printf("beamforming.c:txdata[%d][%d]=%d+j%d, cell_bf_weights[%d][%d][%d]=%d+j%d,txdata_BF[%d][%d]=%d+j%d\n", - // p,slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re, - // ((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0], - // ((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1], - // p,aa,re, - // ((int16_t*)&cell_spec_bf_weights[p][aa][re])[0],((int16_t*)&cell_spec_bf_weights[p][aa][re])[1], - // aa,re, - // ((int16_t*)&txdataF_BF[aa][re])[0], - // ((int16_t*)&txdataF_BF[aa][re])[1]); - } - } - } - } -} - - - - -/* -int ue_spec_beamforming(int32_t **txdataF, - int32_t **txdataF_BF, - LTE_DL_FRAME_PARMS *frame_parms, - LTE_eNB_DLSCH_t *dlsch0, - LTE_eNB_DLSCH_t *dlsch1, - int symbol) -{ - uint8_t p,aa; - uint16_t re=0; - - 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]; - MIMO_mode_t mimo_mode = dlsch0_harq->mimo_mode; - int first_layer0 = dlsch0_harq->first_layer; - int Nlayers0 = dlsch0_harq->Nlayers; - - // Fill these in later for TM8-10 - int Nlayers1; - int first_layer1; - - if (dlsch1_harq) { - Nlayers1 = dlsch1_harq->Nlayers; - first_layer1 = dlsch1_harq->first_layer; - } - - //temp - if(mimo_mode==TM7){ - first_layer0 = 5; - Nlayers0=1; - } - - for (re=0;renb_antennas_tx;aa++) { - txdataF_BF[aa][re] += txdataF[p][re]*dlsch0->uespec_bf_weights[p][aa][re]; - } - } - } - - if(dlsch1_harq) { - for (p=first_layer1;pnb_antennas_tx;aa++) { - txdataF_BF[aa][re] += txdataF[p][re]*dlsch1->uespec_bf_weights[p][aa][re]; - } - } - } - } - - } -} */ diff --git a/openair1/PHY/MODULATION/defs.h b/openair1/PHY/MODULATION/defs.h index fec65b8679..88c4e2a2d8 100644 --- a/openair1/PHY/MODULATION/defs.h +++ b/openair1/PHY/MODULATION/defs.h @@ -89,6 +89,8 @@ void normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,LTE_DL_FRA void do_OFDM_mod(mod_sym_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms); +void do_OFDM_mod_l(LTE_eNB_COMMON *eNB_common_vars, int eNB_id, uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms, uint8_t num_pdcch_symbols); + void remove_7_5_kHz(PHY_VARS_eNB *phy_vars_eNB,uint8_t subframe); void apply_7_5_kHz(PHY_VARS_UE *phy_vars_ue,int32_t*txdata,uint8_t subframe); @@ -99,39 +101,22 @@ void remove_625_Hz(PHY_VARS_eNB *phy_vars_eNB,int16_t *prach); void apply_625_Hz(PHY_VARS_UE *phy_vars_ue,int16_t *prach); -/** \brief This function performs UE specific beamforming especially for - * transmission mode TM7-10 - @param txdataF Table of pointers for frequency-domain TX signals - @param txdataF_BF Table of pointers for frequency-domain TX signals -after beamforming - @param frame_parms Frame descriptor structure - @param ue_spec_bf_weights UE specific beamforming weights applied on -each antenna element and each carrier - @param slot Slot number - @param symbol Symbol index on which to act*/ -int ue_spec_beamforming(int32_t **txdataF, - int32_t **txdataF_BF, - LTE_DL_FRAME_PARMS *frame_parms, - int32_t ***ue_spec_bf_weights, - int slot, - int symbol); - -/** \brief This function performs cell specific beamforming for common +/** \brief This function performs beamforming precoding for common * data @param txdataF Table of pointers for frequency-domain TX signals @param txdataF_BF Table of pointers for frequency-domain TX signals @param frame_parms Frame descriptor structure after beamforming - @param cell_spec_bf_weights Common beamforming weights applied on each + @param beam_weights Beamforming weights applied on each antenna element and each carrier @param slot Slot number @param symbol Symbol index on which to act*/ -int cell_spec_beamforming(int32_t **txdataF, - int32_t **txdataF_BF, - LTE_DL_FRAME_PARMS *frame_parms, - int32_t ***cell_spec_bf_weights, - int slot, - int symbol); +int beam_precoding(int32_t **txdataF, + int32_t **txdataF_BF, + LTE_DL_FRAME_PARMS *frame_parms, + int32_t ***beam_weights, + int slot, + int symbol); #endif /** @}*/ diff --git a/openair1/PHY/MODULATION/ofdm_mod.c b/openair1/PHY/MODULATION/ofdm_mod.c index e8344a1972..375c16c103 100755 --- a/openair1/PHY/MODULATION/ofdm_mod.c +++ b/openair1/PHY/MODULATION/ofdm_mod.c @@ -277,10 +277,11 @@ void do_OFDM_mod(mod_sym_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t } // OFDM modulation for each symbol -void do_OFDM_mod_l(LTE_eNB_COMMON *eNB_common_vars, int eNB_id, uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms, uint8_t num_pdcch_symbols, unsigned char transmission_mode) +void do_OFDM_mod_l(LTE_eNB_COMMON *eNB_common_vars, int eNB_id, uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms, uint8_t num_pdcch_symbols) { int aa, l, slot_offset, slot_offset_F; + int8_t UE_id=0; mod_sym_t **txdataF = eNB_common_vars->txdataF[eNB_id]; mod_sym_t **txdataF_BF = eNB_common_vars->txdataF_BF[eNB_id]; int32_t **txdata = eNB_common_vars->txdata[eNB_id]; @@ -292,13 +293,8 @@ void do_OFDM_mod_l(LTE_eNB_COMMON *eNB_common_vars, int eNB_id, uint16_t next_sl for (l=0; lsymbols_per_tti>>1; l++) { //printf("do_OFDM_mod_l, slot=%d, l=%d, NUMBER_OF_OFDM_CARRIERS=%d,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES=%d\n",next_slot, l,NUMBER_OF_OFDM_CARRIERS,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES); - if (lcell_spec_bf_weights[eNB_id],next_slot,l); - else - if (transmission_mode<7) - cell_spec_beamforming(txdataF,txdataF_BF,frame_parms,eNB_common_vars->cell_spec_bf_weights[eNB_id],next_slot,l); - else - ue_spec_beamforming(txdataF,txdataF_BF,frame_parms,eNB_common_vars->ue_spec_bf_weights[eNB_id],next_slot,l); + + beam_precoding(txdataF,txdataF_BF,frame_parms,eNB_common_vars->beam_weights[eNB_id],next_slot,l); for (aa=0; aanb_antennas_tx; aa++) { @@ -331,4 +327,3 @@ void do_OFDM_mod_l(LTE_eNB_COMMON *eNB_common_vars, int eNB_id, uint16_t next_sl } } -/** @} */ diff --git a/openair1/PHY/impl_defs_lte.h b/openair1/PHY/impl_defs_lte.h index 864d2d5d19..7a6130cef8 100644 --- a/openair1/PHY/impl_defs_lte.h +++ b/openair1/PHY/impl_defs_lte.h @@ -638,17 +638,24 @@ typedef struct { /// - second index: cell specific eNB antenna port index, up to 2 logical antenna ports are supported /// - third index: tx antenna [0..nb_antennas_tx[ /// - fourth index: sample [0..] - int32_t **cell_spec_bf_weights[3][2]; + // int32_t **cell_spec_bf_weights[3][2]; /// \brief Holds the ue specific beamforming weights /// - first index: eNB id [0..2] (hard coded) /// - second index: ue specific eNB antenna port index, port5->index0, port7-15->index0-7 /// - third index: tx antenna [0..nb_antennas_tx[ /// - fourth index: sample [0..] - int32_t **ue_spec_bf_weights[3][8]; + // int32_t **ue_spec_bf_weights[3][8]; + /// \brief Holds the ue specific beamforming weights + /// - first index: eNB id [0..2] (hard coded) + /// - second index: eNB antenna port index + /// - third index: tx antenna [0..nb_antennas_tx[ + /// - fourth index: sample [0..] + int32_t **beam_weights[3][15]; /// \brief Holds the tdd reciprocity calibration coefficients /// - first index: eNB id [0..2] (hard coded) - /// - second index: tx antenna [0..nb_antennas_tx[ - /// - third index: frenquency [0..] + /// - second index: ue specific eNB antenna port index, port5->index0, port7-15->index0-7 + /// - third index: tx antenna [0..nb_antennas_tx[ + /// - forth index: frenquency [0..] int32_t **tdd_calib_coeffs[3]; } LTE_eNB_COMMON; diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index bb6eb704e0..d2a350a4b8 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1610,7 +1610,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e phy_vars_eNB->dlsch_eNB_ra->active = 0; } - // Now scan UE specific DLSCH + // Now scan UE specific DLSCH for (UE_id=0; UE_iddlsch_eNB[(uint8_t)UE_id][0])&& @@ -1779,6 +1779,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->active = 0; //mac_xface->macphy_exit("first dlsch transmitted\n"); + } else if ((phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0])&& @@ -1791,6 +1792,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e //LOG_D(PHY,"[eNB %d] DCI: Clearing subframe_tx for subframe %d, UE %d\n",phy_vars_eNB->Mod_id,subframe,UE_id); #endif } + } @@ -1811,30 +1813,31 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e } - #ifdef EMOS phy_procedures_emos_eNB_TX(subframe, phy_vars_eNB); #endif + //cell-specific beamforming + #if !(defined(EXMIMO) || defined(OAI_USRP) || defined (CPRIGW)) if (abstraction_flag==0) { start_meas(&phy_vars_eNB->ofdm_mod_stats); - do_OFDM_mod_l(phy_vars_eNB->lte_eNB_common_vars, + //do_OFDM_mod (without l) ? + + do_OFDM_mod_l(&phy_vars_eNB->lte_eNB_common_vars, 0, subframe<<1, &phy_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - phy_vars_eNB->transmission_mode[(uint8_t)UE_id]); + num_pdcch_symbols); - do_OFDM_mod_l(phy_vars_eNB->lte_eNB_common_vars, + do_OFDM_mod_l(&phy_vars_eNB->lte_eNB_common_vars, 0, 1+(subframe<<1), &phy_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - phy_vars_eNB->transmission_mode[(uint8_t)UE_id]); + num_pdcch_symbols); stop_meas(&phy_vars_eNB->ofdm_mod_stats); } diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index f5c2446e86..19a0437bdf 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -643,7 +643,7 @@ int main(int argc, char **argv) frame_parms = &PHY_vars_eNB->lte_frame_parms; - cell_spec_bf_weights = PHY_vars_eNB->lte_eNB_common_vars.cell_spec_bf_weights[0][0]; + cell_spec_bf_weights = PHY_vars_eNB->lte_eNB_common_vars.beam_weights[0][0]; for(aa=0;aaofdm_symbol_size;re++) { if (n_tx_phy==1 || n_tx_phy==2) @@ -655,7 +655,7 @@ int main(int argc, char **argv) else if (n_tx_phy==64) cell_spec_bf_weights[aa][re] = 0x00007fff>>4; } - } + } if (transmission_mode==7){ lte_gold_ue_spec_port5(PHY_vars_eNB->lte_gold_uespec_port5_table[0],Nid_cell,n_rnti); @@ -2813,15 +2813,13 @@ PMI_FEEDBACK: eNB_id, (subframe*2), &PHY_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - transmission_mode); + num_pdcch_symbols); do_OFDM_mod_l(&PHY_vars_eNB->lte_eNB_common_vars, eNB_id, (subframe*2)+1, &PHY_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - transmission_mode); + num_pdcch_symbols); stop_meas(&PHY_vars_eNB->ofdm_mod_stats); stop_meas(&PHY_vars_eNB->phy_proc_tx); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf index 3ce32398f7..c0974d8703 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf @@ -154,13 +154,13 @@ eNBs = global_log_verbosity ="medium"; hw_log_level ="info"; hw_log_verbosity ="medium"; - phy_log_level ="warn"; + phy_log_level ="debug"; phy_log_verbosity ="medium"; - mac_log_level ="warn"; + mac_log_level ="debug"; mac_log_verbosity ="medium"; - rlc_log_level ="warn"; + rlc_log_level ="info"; rlc_log_verbosity ="medium"; - pdcp_log_level ="warn"; + pdcp_log_level ="info"; pdcp_log_verbosity ="medium"; rrc_log_level ="info"; rrc_log_verbosity ="medium";