From f02e6ca52634768748762084ca35a4a41799e75a Mon Sep 17 00:00:00 2001 From: Xiwen JIANG Date: Mon, 29 Feb 2016 17:15:26 +0100 Subject: [PATCH] add beamforming function --- openair1/PHY/LTE_TRANSPORT/beamforming.c | 211 +++++++++++++++++++++++ 1 file changed, 211 insertions(+) create mode 100644 openair1/PHY/LTE_TRANSPORT/beamforming.c diff --git a/openair1/PHY/LTE_TRANSPORT/beamforming.c b/openair1/PHY/LTE_TRANSPORT/beamforming.c new file mode 100644 index 0000000000..7a2b75d74e --- /dev/null +++ b/openair1/PHY/LTE_TRANSPORT/beamforming.c @@ -0,0 +1,211 @@ +/******************************************************************************* + OpenAirInterface + Copyright(c) 1999 - 2014 Eurecom + + OpenAirInterface is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + + OpenAirInterface is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OpenAirInterface.The full GNU General Public License is + included in this distribution in the file called "COPYING". If not, + see . + + Contact Information + OpenAirInterface Admin: openair_admin@eurecom.fr + OpenAirInterface Tech : openair_tech@eurecom.fr + OpenAirInterface Dev : openair4g-devel@eurecom.fr + +Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE + + *******************************************************************************/ + +/*! \file PHY/LTE_TRANSPORT/beamforming.c + * \brief + * \author R. Knopp, F. Kaltenberger, X. JIANG + * \date 2015 + * \version 0.1 + * \company Eurecom + * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,xiwen.jiang@eurecom.fr + * \note + * \warning + */ +#include "PHY/defs.h" +#include "PHY/extern.h" +#include "PHY/CODING/defs.h" +#include "PHY/CODING/extern.h" +#include "PHY/CODING/lte_interleaver_inline.h" +#include "PHY/LTE_TRANSPORT/defs.h" +#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) +{ + 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 spec_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++) { + 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); + +/* 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][re+symbol*frame_parms->ofdm_symbol_size]!=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 (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); + } + } + } + } + } +} + +// 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++) { + //printf("cell_spec_beamforming():txdata_BF[%d][%d]=%d+j%d\n",aa,re,((int16_t*)&txdataF_BF[aa][re])[0],((int16_t*)&txdataF_BF[aa][re])[1]); + + ((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]; + } + } + } + } + + } +} */