From b7b48fd6c7bcfa48009542a6fd589e5893b54718 Mon Sep 17 00:00:00 2001 From: Raymond Knopp <raymond.knopp@eurecom.fr> Date: Fri, 24 Aug 2018 10:32:03 +0200 Subject: [PATCH] beamforming debugging after fronthaul testing --- openair1/PHY/INIT/lte_init.c | 4 ++-- openair1/PHY/MODULATION/beamforming.c | 15 +++++++------- openair1/PHY/MODULATION/modulation_eNB.h | 22 +++++++++++---------- openair1/PHY/defs_eNB.h | 6 ++---- openair1/SCHED/ru_procedures.c | 25 +++++++++++------------- targets/RT/USER/lte-ru.c | 5 ++--- 6 files changed, 37 insertions(+), 40 deletions(-) diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index cbae84f56b..2626a8c219 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -781,13 +781,13 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, common_vars->txdataF = (int32_t **)malloc16(NB_ANTENNA_PORTS_ENB*sizeof(int32_t*)); common_vars->rxdataF = (int32_t **)malloc16(64*sizeof(int32_t*)); - LOG_D(PHY,"[INIT] NB_ANTENNA_PORTS_ENB:%d fp->nb_antenna_ports_eNB:%d\n", NB_ANTENNA_PORTS_ENB, fp->nb_antenna_ports_eNB); + LOG_I(PHY,"[INIT] NB_ANTENNA_PORTS_ENB:%d fp->nb_antenna_ports_eNB:%d\n", NB_ANTENNA_PORTS_ENB, fp->nb_antenna_ports_eNB); for (i=0; i<NB_ANTENNA_PORTS_ENB; i++) { if (i<fp->nb_antenna_ports_eNB || i==5) { common_vars->txdataF[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t) ); - LOG_D(PHY,"[INIT] common_vars->txdataF[%d] = %p (%lu bytes)\n", + LOG_I(PHY,"[INIT] common_vars->txdataF[%d] = %p (%lu bytes)\n", i,common_vars->txdataF[i], fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t)); } diff --git a/openair1/PHY/MODULATION/beamforming.c b/openair1/PHY/MODULATION/beamforming.c index eee11eef89..350f642fca 100644 --- a/openair1/PHY/MODULATION/beamforming.c +++ b/openair1/PHY/MODULATION/beamforming.c @@ -56,24 +56,25 @@ int beam_precoding(int32_t **txdataF, int32_t **txdataF_BF, int subframe, LTE_DL_FRAME_PARMS *frame_parms, - int32_t ***beam_weights, + int32_t **beam_weights[NUMBER_OF_eNB_MAX+1][15], int symbol, int aa, - int p) + int p, + int l1_id) { - LOG_D(PHY,"Starting precoding for symbol %d, physical antenna %d, logical port %d\n",symbol,aa,p); int rb_offset_neg0 = frame_parms->ofdm_symbol_size - (6*frame_parms->N_RB_DL); int rb_offset_neg = (subframe*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti) + rb_offset_neg0; int rb_offset_pos = (subframe*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti); + multadd_cpx_vector((int16_t*)&txdataF[p][rb_offset_neg+(symbol*frame_parms->ofdm_symbol_size)], - (int16_t*)&beam_weights[p][aa][rb_offset_neg0], + (int16_t*)&beam_weights[l1_id][p][aa][rb_offset_neg0], (int16_t*)&txdataF_BF[aa][rb_offset_neg0+(symbol*frame_parms->ofdm_symbol_size)], 0, 6*frame_parms->N_RB_DL, 15); multadd_cpx_vector((int16_t*)&txdataF[p][rb_offset_pos+(symbol*frame_parms->ofdm_symbol_size)], - (int16_t*)&beam_weights[p][aa][0], + (int16_t*)&beam_weights[l1_id][p][aa][0], (int16_t*)&txdataF_BF[aa][(symbol*frame_parms->ofdm_symbol_size)], 0, 7*frame_parms->N_RB_DL, // to allow for extra RE at the end, 12 useless multipy-adds (first one at DC and 11 at end) @@ -85,7 +86,7 @@ int beam_precoding(int32_t **txdataF, int beam_precoding_one_eNB(int32_t **txdataF, int32_t **txdataF_BF, - int32_t ***beam_weights, + int32_t **beam_weights[NUMBER_OF_eNB_MAX+1][15], int subframe, int nb_antenna_ports, int nb_tx, // total physical antenna @@ -112,7 +113,7 @@ int beam_precoding_one_eNB(int32_t **txdataF, for (symbol=0; symbol<symbols_per_tti; symbol++){ multadd_cpx_vector((int16_t*)&txdataF[p][symbol*ofdm_symbol_size+re_offset], - (int16_t*)beam_weights[p][aa], + (int16_t*)beam_weights[0][p][aa], (int16_t*)&txdataF_BF[aa][symbol*ofdm_symbol_size], 0, ofdm_symbol_size, diff --git a/openair1/PHY/MODULATION/modulation_eNB.h b/openair1/PHY/MODULATION/modulation_eNB.h index c7100126af..b5b148b802 100644 --- a/openair1/PHY/MODULATION/modulation_eNB.h +++ b/openair1/PHY/MODULATION/modulation_eNB.h @@ -46,15 +46,18 @@ after beamforming antenna element and each carrier @param slot Slot number @param symbol Symbol index on which to act - @param aa physical antenna index*/ + @param aa physical antenna index + @param p logical antenna index + @param l1_id L1 instance id*/ int beam_precoding(int32_t **txdataF, int32_t **txdataF_BF, - int submframe, + int subframe, LTE_DL_FRAME_PARMS *frame_parms, - int32_t ***beam_weights, + int32_t **beam_weights[NUMBER_OF_eNB_MAX+1][15], int symbol, int aa, - int p); + int p, + int l1_id); /** \brief This function performs beamforming precoding for common * data for only one eNB, fdragon @@ -69,12 +72,11 @@ antenna element and each carrier @param aa physical antenna index*/ int beam_precoding_one_eNB(int32_t **txdataF, int32_t **txdataF_BF, - int32_t ***beam_weights, - int subframe, - int nb_antenna_ports, - int nb_tx, // total physical antenna - LTE_DL_FRAME_PARMS *frame_parms - ); + int32_t **beam_weights[NUMBER_OF_eNB_MAX+1][15], + int subframe, + int nb_antenna_ports, + int nb_tx, // total physical antenna + LTE_DL_FRAME_PARMS *frame_parms); int f_read(char *calibF_fname, int nb_ant, int nb_freq, int32_t **tdd_calib_coeffs); diff --git a/openair1/PHY/defs_eNB.h b/openair1/PHY/defs_eNB.h index 5756781f36..5f829634ac 100644 --- a/openair1/PHY/defs_eNB.h +++ b/openair1/PHY/defs_eNB.h @@ -579,10 +579,8 @@ typedef struct { /// - second index: ? [0..2*ofdm_symbol_size*frame_parms->symbols_per_tti[ int32_t **rxdataF; /// \brief holds the transmit data in the frequency domain. - /// For IFFT_FPGA this points to the same memory as PHY_vars->rx_vars[a].RX_DMA_BUFFER. //? - /// - first index: eNB id [0..2] (hard coded) - /// - second index: tx antenna [0..14[ where 14 is the total supported antenna ports. - /// - third index: sample [0..] + /// - first index: tx antenna [0..14[ where 14 is the total supported antenna ports. + /// - second index: sample [0..] int32_t **txdataF; } LTE_eNB_COMMON; diff --git a/openair1/SCHED/ru_procedures.c b/openair1/SCHED/ru_procedures.c index c6915e2004..6fd5518d44 100644 --- a/openair1/SCHED/ru_procedures.c +++ b/openair1/SCHED/ru_procedures.c @@ -406,13 +406,10 @@ void feptx_ofdm(RU_t *ru) { void feptx_prec(RU_t *ru) { - // Theoni's - int l,i,aa,rb,p; + int l,i,aa,p; int subframe = ru->proc.subframe_tx; PHY_VARS_eNB **eNB_list = ru->eNB_list,*eNB; LTE_DL_FRAME_PARMS *fp; - int32_t ***bw; - RU_proc_t *proc = &ru->proc; /* fdragon int l,i,aa; @@ -422,7 +419,6 @@ void feptx_prec(RU_t *ru) { int subframe = ru->proc.subframe_tx; */ - if (ru->idx != 0) return; if (ru->num_eNB == 1) { @@ -430,6 +426,8 @@ void feptx_prec(RU_t *ru) { fp = &eNB->frame_parms; LTE_eNB_PDCCH *pdcch_vars = &eNB->pdcch_vars[subframe&1]; + if (subframe_select(fp,subframe) == SF_UL) return; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_PREC+ru->idx , 1); for (aa=0;aa<ru->nb_tx;aa++) { @@ -443,10 +441,7 @@ void feptx_prec(RU_t *ru) { #else if (p<fp->nb_antenna_ports_eNB) { - // pdcch region, copy entire signal from txdataF->txdataF_BF (bf_mask = 1) - // else do beamforming for pdcch according to beam_weights - // to be updated for eMBMS (p=4) - // For the moment this does nothing different than below. + // For the moment this does nothing different than below, except ignore antenna ports 5,7,8. for (l=0;l<pdcch_vars->num_pdcch_symbols;l++) beam_precoding(eNB->common_vars.txdataF, ru->common.txdataF_BF, @@ -455,7 +450,8 @@ void feptx_prec(RU_t *ru) { ru->beam_weights, l, aa, - p); + p, + eNB->Mod_id); } //if (p<fp->nb_antenna_ports_eNB) // PDSCH region @@ -468,7 +464,8 @@ void feptx_prec(RU_t *ru) { ru->beam_weights, l, aa, - p); + p, + eNB->Mod_id); } // for (l=pdcch_vars ....) } // if (p<fp->nb_antenna_ports_eNB) ... #endif //NO_PRECODING @@ -511,7 +508,6 @@ void feptx_prec(RU_t *ru) { for (i=0;i<ru->num_eNB;i++) { eNB = eNB_list[i]; fp = &eNB->frame_parms; - bw = ru->beam_weights[i]; for (l=0;l<fp->symbols_per_tti;l++) { for (aa=0;aa<ru->nb_tx;aa++) { @@ -519,10 +515,11 @@ void feptx_prec(RU_t *ru) { ru->common.txdataF_BF, subframe, fp, - bw, + ru->beam_weights, subframe<<1, l, - aa); + aa, + eNB->Mod_id); } } } diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c index 8fdc276def..214afabd70 100644 --- a/targets/RT/USER/lte-ru.c +++ b/targets/RT/USER/lte-ru.c @@ -1194,7 +1194,6 @@ void wakeup_eNBs(RU_t *ru) { } else { - LOG_I(PHY,"ru->num_eNB:%d\n", ru->num_eNB); for (i=0;i<ru->num_eNB;i++) @@ -1474,10 +1473,10 @@ static void* ru_thread_tx( void* param ) { if (oai_exit) break; - LOG_I(PHY,"ru_thread_tx: Waiting for TX processing\n"); + LOG_D(PHY,"ru_thread_tx: Waiting for TX processing\n"); // wait until eNBs are finished subframe RX n and TX n+4 wait_on_condition(&proc->mutex_eNBs,&proc->cond_eNBs,&proc->instance_cnt_eNBs,"ru_thread_tx"); - LOG_I(PHY,"ru_thread_tx: Woken from condition\n"); + LOG_D(PHY,"ru_thread_tx: Woken from condition\n"); if (oai_exit) break; // do TX front-end processing if needed (precoding and/or IDFTs) -- 2.26.2