Files
openairinterface5g/openair1/SIMULATION/LTE_PHY/phy_procedures_sim_secsys.c
T
Lionel Gauthier 059a0a3fdc astyle --recursive --indent=spaces=2 --style=kr --indent-col1-comments --break-blocks --convert-tabs --max-code-length=200
This is done for better merging branch/LG_PRE_RELEASE_0.3 into trunk (same process is applied on this branch)

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@7073 818b1a75-f10b-46b9-bf7c-635c3b92a50f
2015-04-09 09:29:12 +00:00

2445 lines
107 KiB
C

/*******************************************************************************
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 <http://www.gnu.org/licenses/>.
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
*******************************************************************************/
#include <string.h>
#include <math.h>
#include "SIMULATION/TOOLS/defs.h"
#include "SIMULATION/RF/defs.h"
#include "PHY/types.h"
#include "PHY/defs.h"
#include "PHY/vars.h"
#include "MAC_INTERFACE/vars.h"
#ifdef IFFT_FPGA
#include "PHY/LTE_REFSIG/mod_table.h"
#endif
#include "SCHED/defs.h"
#include "SCHED/vars.h"
#include "ARCH/CBMIMO1/DEVICE_DRIVER/vars.h"
#include "PHY/LTE_TRANSPORT/mcs_tbs_tools.h"
#define SECONDARY_SYSTEM
#ifdef SECONDARY_SYSTEM
#endif
#ifndef PBS_SIM
//#define PBS_SIM
#endif //PBS_SIM
#ifdef PBS_SIM
#define PBS_OUTPUT_DIR "." //"/homes/sorby/Devel/simDataOutput/" //"/home/Local_Data/sorby_dl_sim_secsys/"
#endif
//#define SKIP_RF_CHAIN
//#define CHANNEL_FROM_FILE //--Unstable, doesn't work properly. Possibly how the channel is written to file.
//#define FLAT_CHANNEL
//#define SKIP_RF_RX
//#define DISABLE_SECONDARY
#define BW 7.68 //Fs in MHz
#define Td 1
#define N_TRIALS_MAX 2
#define KdB 10 /// Ricean factor in dB
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
//#define DEBUG_PHY
/*
DCI0_5MHz_TDD0_t UL_alloc_pdu;
DCI1A_5MHz_TDD_1_6_t CCCH_alloc_pdu;
DCI2_5MHz_2A_L10PRB_TDD_t DLSCH_alloc_pdu1;
DCI2_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu2;
*/
#define UL_RB_ALLOC computeRIV(lte_frame_parms->N_RB_UL,0,24)
#define CCCH_RB_ALLOC computeRIV(lte_frame_parms->N_RB_UL,0,3)
#define RA_RB_ALLOC computeRIV(lte_frame_parms->N_RB_UL,0,3)
#define DLSCH_RB_ALLOC 0x1fff
int main(int argc, char **argv)
{
int i,j,l,aa,sector,i_max,l_max,aa_max,aatx,aarx;
double SE,target_rx_pwr_dB = 35;
double sigma2, sigma2_dB=0;
int n_frames = 2;
number_of_cards = 1;
mod_sym_t **txdataF;
#ifdef SECONDARY_SYSTEM
mod_sym_t **txdataF_ext;
#endif
#ifdef IFFT_FPGA
int **txdataF2;
#ifdef SECONDARY_SYSTEM
int **txdataF2_secsys;
#endif
#endif
int **txdata,**rxdata;
#ifdef SECONDARY_SYSTEM
int **txdata_ext, **rxdata_ext[2];
#endif
double **s_re,**s_im,**r_re,**r_im;
//double amps[8] = {0.999,0.001,0.0,0.0,0.0,0.0,0.0,0.0};
double amps[8] = {0.3868472 , 0.3094778 , 0.1547389 , 0.0773694 , 0.0386847 , 0.0193424 , 0.0096712 , 0.0038685};
double aoa=0.1;
double rice_k = KdB;
double ricean_factor=(1/(1 + pow(10,.1*rice_k))); //0.0000005;
double forgetting_factor = 0; // high forgetting factor -> slow temporal variation
int channel_length;
int meas_length, meas_offset;
struct complex **ch;
unsigned char pbch_pdu[6];
int sync_pos, sync_pos_slot;
FILE *rx_frame_file;
int result;
int freq_offset;
int subframe_offset;
char fname[200], vname[100];
int trial, n_errors=0;
double STxGain = 0;
double SNR = 0;
unsigned char plot_flag=0;
#ifdef PBS_SIM
FILE *er_data_fd, *turboIter_fd;//, *er_cause_fd;
char er_data_fname[120], turboIter_fname[120];//, er_cause_fname[60];
// for file output
char pbs_output_dir[100] = "";
unsigned char pbs_output_dir_length = 0;
strcat(pbs_output_dir,PBS_OUTPUT_DIR);
pbs_output_dir_length = 100;
char tempChar[100] = "";
#endif //PBS_SIM
#define N_STxG (int)((stxg1-stxg0+stxgStepSize)/stxgStepSize)
#define N_SNR (int)((snr1-snr0+snrStepSize)/snrStepSize)
double stxg0,stxg1;
double snr0,snr1;
/******************************************************************
INITIALIZE SIMULATION PARAMETERS
*****************************************************************/
unsigned char stxg_ind = 0; ///index for STxG to be written out in loop
unsigned char snr_ind = 0; ///index for SNR to be written out in loop
/*
float snrStepSize = 0.25; //step size in dB -- will be fixed
float stxgStepSize = 0.5; //step size in dB -- will be fixed
*/
float snrStepSize = 0.5; //step size in dB
float stxgStepSize = 1; //step size in dB
n_frames = N_TRIALS_MAX; //maximum length of simulation in number of frames
stxg0 = 0;
stxg1 = 0; //set = stxg0 to keep fixed
snr0 = 10;
snr1 = 11; //set = stxg0 to keep fixed
if (argc==2) {
snr0 = atof(argv[1]);
snr1 = snr0; //set = stxg0 to keep fixed
}
if (argc>2) {
snr0 = atof(argv[1]);
snr1 = atof(argv[2]); //set = stxg0 to keep fixed
}
if (argc>3)
n_frames = atoi(argv[3]);
if (argc>4) {
rice_k = atoi(argv[4]);
ricean_factor=(1/(1 + pow(10,.1*rice_k)));
}
if (argc>5) {
stxg0 = atof(argv[5]);
stxg1 = stxg0; //set = stxg0 to keep fixed
}
if (argc>6) {
stxg1 = atof(argv[6]);
}
if (argc>7) {
snrStepSize = atof(argv[7]);
}
if (argc>8) {
stxgStepSize = atof(argv[8]);
} else {
SE = 1;
}
int ch_min =400, ch_max=0;
double stxg_act=0;
int dl_er[2], dci_er[2];
unsigned int nb_rb = 25;
unsigned int first_rb = 0;
unsigned int eNb_id = 0;
unsigned int UE_id = 0;
#ifdef SECONDARY_SYSTEM
unsigned int eNb_id_secsys = 0;
unsigned int UE_id_secsys = 0;
#endif
unsigned int slot_offset, slot_offset_time;
int slot,last_slot, next_slot;
double path_loss_dB_def = -60;
unsigned int rx_gain[3];
double rx_gain_lin;
double nf[2] = {3.0,3.0}; //currently unused
double ip =0.0;
double N0W, path_loss, path_loss_dB, tx_pwr, rx_pwr;
#ifdef SECONDARY_SYSTEM
enum UNIT_ID {
PeNb, /// PeNb
SeNb, /// SeNb
P_UE, /// P_UE
S_UE /// S_UE
};
enum CH_ID {
PeSe, /// PeNb <--> SeNb
PeSu, /// PeNb <--> S_UE
SePu, /// SeNb <--> P_UE
PuSu, /// P_UE <--> S_UE
PePu, /// PeNb <--> P_UE
SeSu /// SeNb <--> S_UE
};
#ifdef SECONDARY_SYSTEM
// double aoa_ar[6]={M_PI*1.2,M_PI/2,M_PI/2,M_PI*1.1,0,0}; with the old equation
double aoa_ar[6]= {(M_PI/2)*1.05,(M_PI/4)*.95,(M_PI/4)*1.05,(M_PI/2)*.95,0,0.05*(M_PI/4)};
#endif
double path_loss_ar_dB[6], path_loss_ar[6];
struct complex **ch_ar[6];
double tx_pwr_secsys, rx_pwr_sec[2], STxG, SePu_pwr, rx_pwr_pre[3], tx_pwr_post[2], tx_pwr_SRS, rx_pwr_SRS;
int STxGdB = 0;
double **s_re_secsys,**s_im_secsys,**r_re_ext[2],**r_im_ext[2];
double **r_re_crossLink[6],**r_im_crossLink[6]; /// indexed by enum CH_I
FILE *channel_file;
char has_channel=0;
char channel_output[] = "channel_output.txt";
#endif //SECONDARY_SYSTEM
int rx_pwr2;
double norm_const=1;
unsigned char first_call = 1,first_call_secsys = 1;
char stats_buffer[4096];
int len;
#ifdef EMOS
fifo_dump_emos emos_dump;
#endif
channel_length = (int) 11+2*BW*Td;
#ifdef SECONDARY_SYSTEM
double ch_tmp[2*channel_length*4*6]; //(real/imag)*channel_length*(nbRx*nbTx)*#ofChannels
#endif
PHY_config = malloc(sizeof(PHY_CONFIG));
mac_xface = malloc(sizeof(MAC_xface));
#ifndef SECONDARY_SYSTEM
PHY_VARS_eNB *PHY_vars_eNb[1]; // 1 eNB
PHY_vars_eNb[0] = malloc(sizeof(PHY_VARS_eNB));
PHY_VARS_UE *PHY_vars_UE[1]; // 1 UEs
PHY_vars_UE[0] = malloc(sizeof(PHY_VARS_UE));
#else //SECONDARY_SYSTEM
PHY_VARS_eNB *PHY_vars_eNb[3]; // 3 eNBs
PHY_vars_eNb[0] = malloc(sizeof(PHY_VARS_eNB));
PHY_vars_eNb[1] = malloc(sizeof(PHY_VARS_eNB));
PHY_vars_eNb[2] = malloc(sizeof(PHY_VARS_eNB)); //virtual eNb
PHY_VARS_UE *PHY_vars_UE[3]; // 3 UEs
PHY_vars_UE[0] = malloc(sizeof(PHY_VARS_UE));
PHY_vars_UE[1] = malloc(sizeof(PHY_VARS_UE));
PHY_vars_UE[2] = malloc(sizeof(PHY_VARS_UE)); //virtual UE
// PHY_config_secsys = malloc(sizeof(PHY_CONFIG));
// mac_xfaec_secsys = malloc(sizeof(MAC_xface));
#endif
//lte_frame_parms = &(PHY_config->lte_frame_parms);
lte_frame_parms = &(PHY_vars_eNb[0]->lte_frame_parms);
lte_frame_parms->N_RB_DL = 25;
lte_frame_parms->N_RB_UL = 25;
lte_frame_parms->Ng_times6 = 1;
lte_frame_parms->Ncp = 1;
lte_frame_parms->Nid_cell = 0;
lte_frame_parms->nushift = 0;
lte_frame_parms->nb_antennas_tx = 2;
lte_frame_parms->nb_antennas_rx = 2;
lte_frame_parms->first_dlsch_symbol = 4;
lte_frame_parms->num_dlsch_symbols = 6;
lte_frame_parms->mode1_flag = 1;
lte_frame_parms->Csrs = 2;
lte_frame_parms->Bsrs = 0;
lte_frame_parms->kTC = 0;
lte_frame_parms->n_RRC = 0;
init_frame_parms(lte_frame_parms);
copy_lte_parms_to_phy_framing(lte_frame_parms, &(PHY_config->PHY_framing));
phy_init_top(NB_ANTENNAS_TX);
lte_frame_parms->twiddle_fft = twiddle_fft;
lte_frame_parms->twiddle_ifft = twiddle_ifft;
lte_frame_parms->rev = rev;
lte_gold(lte_frame_parms);
generate_ul_ref_sigs();
generate_ul_ref_sigs_rx();
generate_64qam_table();
generate_16qam_table();
generate_RIV_tables();
#ifdef DEBUG_PHY
msg("[PHY_vars_UE] = %p",PHY_vars_UE);
#endif //DEBUG_PHY
lte_sync_time_init(lte_frame_parms);
//*****************************************************************
// INITIALIZE TOP STRUCTURES
//*****************************************************************
//use same frame parameters for UE as for eNb
PHY_vars_UE[0]->lte_frame_parms = *lte_frame_parms;
PHY_vars_UE[0]->lte_frame_parms.nb_antennas_rx = 1;
PHY_vars_UE[0]->lte_frame_parms.nb_antennas_tx = 1;
PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_rx = 1;
PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx = 1;
#ifdef SECONDARY_SYSTEM
//use same frame parameters for secondary system
PHY_vars_eNb[1]->lte_frame_parms = *lte_frame_parms;
PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_rx = 2;
PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_tx = 2;
//use same frame parameters for UE as for eNb
PHY_vars_UE[1]->lte_frame_parms = *lte_frame_parms;
PHY_vars_UE[1]->lte_frame_parms.nb_antennas_rx = 2;
PHY_vars_UE[1]->lte_frame_parms.nb_antennas_tx = 2;
/// VIRTUAL UNITS, used for comparative measurements
//virtual user used as a copy of the primary receiver, with only interference for comparative measurements
PHY_vars_UE[2]->lte_frame_parms = *lte_frame_parms;
PHY_vars_UE[2]->lte_frame_parms.nb_antennas_rx = 1;
PHY_vars_UE[2]->lte_frame_parms.nb_antennas_tx = 1;
PHY_vars_eNb[2]->lte_frame_parms = *lte_frame_parms;
PHY_vars_eNb[2]->lte_frame_parms.nb_antennas_rx = 1;
PHY_vars_eNb[2]->lte_frame_parms.nb_antennas_tx = 1;
#endif
PHY_vars_UE[0]->is_secondary_ue = 0;
phy_init_lte_ue(&PHY_vars_UE[0]->lte_frame_parms,
&PHY_vars_UE[0]->lte_ue_common_vars,
PHY_vars_UE[0]->lte_ue_dlsch_vars,
PHY_vars_UE[0]->lte_ue_dlsch_vars_cntl,
PHY_vars_UE[0]->lte_ue_dlsch_vars_ra,
PHY_vars_UE[0]->lte_ue_dlsch_vars_1A,
PHY_vars_UE[0]->lte_ue_pbch_vars,
PHY_vars_UE[0]->lte_ue_pdcch_vars,
PHY_vars_UE[0]);
PHY_vars_UE[0]->lte_ue_dlsch_vars[eNb_id]->log2_maxh = 4;
PHY_vars_UE[0]->dlsch_ue_active = 0;
PHY_vars_UE[0]->dlsch_ue_cntl_active = 0;
PHY_vars_UE[0]->dlsch_errors = 0;
PHY_vars_eNb[0]->is_secondary_eNb = 0;
phy_init_lte_eNB(&PHY_vars_eNb[0]->lte_frame_parms,
&PHY_vars_eNb[0]->lte_eNB_common_vars,
PHY_vars_eNb[0]->lte_eNB_ulsch_vars,
PHY_vars_eNb[0]->is_secondary_eNb,
PHY_vars_eNb[1],
0,
0);
PHY_vars_eNb[0]->is_init_sync = 0; // not used for primary eNb
PHY_vars_eNb[0]->dlsch_eNb_active = 0;
PHY_vars_eNb[0]->dlsch_eNb_cntl_active = 0;
#ifdef SECONDARY_SYSTEM
PHY_vars_UE[1]->is_secondary_ue = 1;
PHY_vars_UE[1]->has_valid_precoder = 0;
// exploit pilot shift to have orthogonal pilots in frequency
//NOTE: If this is done in SeNb only, then the only difference at receiver is that its channel estimates of xchannel is in buffer with index PeNb_id and the wanted signals channel is in buffer with index (PeNb_id+nu_shift(1))
//PHY_vars_UE[1]->lte_frame_parms.nushift = 1;
phy_init_lte_ue(&PHY_vars_UE[1]->lte_frame_parms,
&PHY_vars_UE[1]->lte_ue_common_vars,
PHY_vars_UE[1]->lte_ue_dlsch_vars,
PHY_vars_UE[1]->lte_ue_dlsch_vars_cntl,
PHY_vars_UE[1]->lte_ue_dlsch_vars_ra,
PHY_vars_UE[1]->lte_ue_dlsch_vars_1A,
PHY_vars_UE[1]->lte_ue_pbch_vars,
PHY_vars_UE[1]->lte_ue_pdcch_vars,
PHY_vars_UE[1]);
PHY_vars_UE[1]->lte_ue_dlsch_vars[eNb_id_secsys]->log2_maxh = 4;
PHY_vars_UE[1]->dlsch_ue_active = 0;
PHY_vars_UE[1]->dlsch_ue_cntl_active = 0;
PHY_vars_UE[1]->dlsch_errors = 0;
PHY_vars_UE[2]->is_secondary_ue = 0;
phy_init_lte_ue(&PHY_vars_UE[2]->lte_frame_parms,
&PHY_vars_UE[2]->lte_ue_common_vars,
PHY_vars_UE[2]->lte_ue_dlsch_vars,
PHY_vars_UE[2]->lte_ue_dlsch_vars_cntl,
PHY_vars_UE[2]->lte_ue_dlsch_vars_ra,
PHY_vars_UE[2]->lte_ue_dlsch_vars_1A,
PHY_vars_UE[2]->lte_ue_pbch_vars,
PHY_vars_UE[2]->lte_ue_pdcch_vars,
PHY_vars_UE[2]);
PHY_vars_UE[2]->lte_ue_dlsch_vars[eNb_id_secsys]->log2_maxh = 4;
PHY_vars_UE[2]->dlsch_ue_active = 0;
PHY_vars_UE[2]->dlsch_ue_cntl_active = 0;
PHY_vars_UE[2]->dlsch_errors = 0;
PHY_vars_eNb[1]->is_secondary_eNb = 1;
// exploit pilot shift to have orthogonal pilots in frequency
PHY_vars_eNb[1]->lte_frame_parms.nushift = 1;
phy_init_lte_eNB(&PHY_vars_eNb[1]->lte_frame_parms,
&PHY_vars_eNb[1]->lte_eNB_common_vars,
PHY_vars_eNb[1]->lte_eNB_ulsch_vars,
PHY_vars_eNb[1]->is_secondary_eNb,
PHY_vars_eNb[1],
0,
0);
PHY_vars_eNb[1]->is_init_sync = 1; //synchronization is not simulated yet, hence synch is assumed
PHY_vars_eNb[1]->has_valid_precoder = 0;
PHY_vars_eNb[1]->dlsch_eNb_active = 0;
PHY_vars_eNb[1]->dlsch_eNb_cntl_active = 0;
//Virtual eNb
PHY_vars_eNb[2]->is_secondary_eNb = 0;
phy_init_lte_eNB(&PHY_vars_eNb[2]->lte_frame_parms,
&PHY_vars_eNb[2]->lte_eNB_common_vars,
PHY_vars_eNb[2]->lte_eNB_ulsch_vars,
PHY_vars_eNb[2]->is_secondary_eNb,
PHY_vars_eNb[2],
0,
0);
PHY_vars_eNb[2]->is_init_sync = 0;
PHY_vars_eNb[2]->has_valid_precoder = 0;
PHY_vars_eNb[2]->dlsch_eNb_active = 0;
PHY_vars_eNb[2]->dlsch_eNb_cntl_active = 0;
#endif
// UE_mode = PRACH;
//PHY_vars_UE[0]->UE_mode = PRACH;
//PHY_vars_eNb[0]->eNB_UE_stats[0].mode[0] = PRACH;
PHY_vars_UE[0]->UE_mode = PUSCH;
PHY_vars_eNb[0]->eNB_UE_stats[0].mode[0] = PUSCH;
PHY_vars_eNb[0]->eNB_UE_stats[0].UE_id[0] = 0xBA82;
PHY_vars_UE[0]->lte_ue_pdcch_vars[0]->crnti = 0xBA82;
#ifdef SECONDARY_SYSTEM
//PHY_vars_UE[1]->UE_mode = PRACH;
//PHY_vars_eNb[1]->eNB_UE_stats[0].mode[0] = PRACH;
PHY_vars_UE[1]->UE_mode = PUSCH;
PHY_vars_eNb[1]->eNB_UE_stats[0].mode[0] = PUSCH;
PHY_vars_eNb[1]->eNB_UE_stats[0].UE_id[0] = 0xBD17;
PHY_vars_UE[1]->lte_ue_pdcch_vars[0]->crnti = 0xBD17;
#endif //SECONDARY_SYSTEM
#ifndef SECONDARY_SYSTEM
aa_max = 1; //number of eNBs
l_max = 1; //number of UEs
#else //SECONDARY_SYSTEM
aa_max = 3; //number of eNBs
l_max = 3; //number of UEs
#endif
//loop over eNBs
for (aa=0; aa<aa_max; aa++) {
PHY_vars_eNb[aa]->dlsch_eNb = (LTE_eNb_DLSCH_t**) malloc16(2*sizeof(LTE_eNb_DLSCH_t*));
//loop over transport channels
for (i=0; i<2; i++) {
PHY_vars_eNb[aa]->dlsch_eNb[i] = new_eNb_dlsch(1,8);
if (!PHY_vars_eNb[aa]->dlsch_eNb[i]) {
msg("Can't get eNb ulsch structures\n");
exit(-1);
} else {
msg("PHY_vars_eNb[%d]->dlsch_eNb[%d] = %p\n",aa,i,PHY_vars_eNb[aa]->dlsch_eNb[i]);
}
}
PHY_vars_eNb[aa]->ulsch_eNb = (LTE_eNb_ULSCH_t**) malloc16(sizeof(LTE_eNb_ULSCH_t*));
PHY_vars_eNb[aa]->ulsch_eNb[0] = new_eNb_ulsch(3);
if (!PHY_vars_eNb[aa]->ulsch_eNb[0]) {
msg("Can't get eNb ulsch structures\n");
exit(-1);
} else {
msg("PHY_vars_eNb[%d]->ulsch_eNb[%d] = %p\n",aa,0,PHY_vars_eNb[aa]->ulsch_eNb[0]);
}
PHY_vars_eNb[aa]->dlsch_eNb_cntl = new_eNb_dlsch(1,1);
PHY_vars_eNb[aa]->dlsch_eNb_1A = new_eNb_dlsch(1,1);
PHY_vars_eNb[aa]->dlsch_eNb_ra = new_eNb_dlsch(1,1);
}
//loop over UEs
for (l=0; l<l_max; l++) {
PHY_vars_UE[l]->dlsch_ue = (LTE_UE_DLSCH_t**) malloc16(2*sizeof(LTE_UE_DLSCH_t*));
//loop over transport channels
for (i=0; i<2; i++) {
PHY_vars_UE[l]->dlsch_ue[i] = new_ue_dlsch(1,8);
if (!PHY_vars_UE[l]->dlsch_ue[i]) {
msg("Can't get ue ulsch structures\n");
exit(-1);
} else {
msg("PHY_vars_UE [%d]->dlsch_ue [%d] = %p\n",i,aa,PHY_vars_UE[l]->dlsch_ue[i]);
}
}
PHY_vars_UE[l]->ulsch_ue = (LTE_UE_ULSCH_t**) malloc16(2*sizeof(LTE_UE_ULSCH_t*));
PHY_vars_UE[l]->ulsch_ue[0] = new_ue_ulsch(3);
if (!PHY_vars_UE[l]->ulsch_ue[0]) {
msg("Can't get ue ulsch structures\n");
exit(-1);
} else {
msg("PHY_vars_UE [%d]->ulsch_ue [%d] = %p\n",l,0,PHY_vars_UE[l]->ulsch_ue[0]);
}
PHY_vars_UE[l]->dlsch_ue_cntl = new_ue_dlsch(1,1);
PHY_vars_UE[l]->dlsch_ue_1A = new_ue_dlsch(1,1);
PHY_vars_UE[l]->dlsch_ue_ra = new_ue_dlsch(1,1);
}
#ifdef SECONDARY_SYSTEM
txdataF_rep_tmp = (int **)malloc(2*(PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_tx)*sizeof(int*));
for (aa=0; aa<(PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_tx); aa++) {
txdataF_rep_tmp[aa] = (int *)malloc16(2*sizeof(int)*(PHY_vars_eNb[1]->lte_frame_parms.ofdm_symbol_size)); // repeated format (hence the '2*')
if (txdataF_rep_tmp[aa]) {
#ifdef DEBUG_PHY
msg("[openair][LTE_PHY][INIT] txdataF_rep_tmp[%d] allocated at %p\n",aa,txdataF_rep_tmp[aa]);
#endif
bzero(txdataF_rep_tmp[aa],2*(sizeof(int))*(PHY_vars_eNb[1]->lte_frame_parms.ofdm_symbol_size));
} else {
msg("[openair][LTE_PHY][INIT] txdataF_rep_tmp[%d] not allocated\n",aa);
return(-1);
}
#ifdef DEBUG_PHY
msg("[openair][LTE_PHY][INIT] txdataF_rep_tmp[%d] = %p, length = %d\n",aa,txdataF_rep_tmp[aa],2*(sizeof(int))*(PHY_vars_eNb[1]->lte_frame_parms.ofdm_symbol_size));
#endif
}
#endif //SECONDARY_SYSTEM
unsigned char m_mcs,m_I_tbs;
//SE = 1
m_I_tbs = SE2I_TBS(SE, lte_frame_parms->N_RB_DL, lte_frame_parms->num_dlsch_symbols);
m_mcs = I_TBS2I_MCS(m_I_tbs);
// init DCI structures for testing
UL_alloc_pdu.type = 0;
UL_alloc_pdu.hopping = 0;
UL_alloc_pdu.rballoc = UL_RB_ALLOC;
UL_alloc_pdu.mcs = 0;
UL_alloc_pdu.ndi = 1;
UL_alloc_pdu.TPC = 0;
UL_alloc_pdu.cqi_req = 1;
CCCH_alloc_pdu.type = 1;
CCCH_alloc_pdu.vrb_type = 0;
CCCH_alloc_pdu.rballoc = CCCH_RB_ALLOC;
CCCH_alloc_pdu.ndi = 1;
CCCH_alloc_pdu.rv = 1;
CCCH_alloc_pdu.mcs = 1;
CCCH_alloc_pdu.harq_pid = 0;
CCCH_alloc_pdu.TPC = 1;
DLSCH_alloc_pdu1A.type = 1;
DLSCH_alloc_pdu1A.vrb_type = 0;
DLSCH_alloc_pdu1A.rballoc = CCCH_RB_ALLOC;
DLSCH_alloc_pdu1A.ndi = 1;
DLSCH_alloc_pdu1A.rv = 1;
DLSCH_alloc_pdu1A.mcs = 0;
DLSCH_alloc_pdu1A.harq_pid = 0;
DLSCH_alloc_pdu1A.TPC = 1;
RA_alloc_pdu.type = 1;
RA_alloc_pdu.vrb_type = 0;
RA_alloc_pdu.rballoc = RA_RB_ALLOC;
RA_alloc_pdu.ndi = 1;
RA_alloc_pdu.rv = 1;
RA_alloc_pdu.mcs = 1;
RA_alloc_pdu.harq_pid = 0;
RA_alloc_pdu.TPC = 1;
DLSCH_alloc_pdu2.rah = 0;
DLSCH_alloc_pdu2.rballoc = DLSCH_RB_ALLOC;
DLSCH_alloc_pdu2.TPC = 0;
DLSCH_alloc_pdu2.dai = 0;
DLSCH_alloc_pdu2.harq_pid = 0;
DLSCH_alloc_pdu2.tb_swap = 0;
DLSCH_alloc_pdu2.mcs1 = 4;
DLSCH_alloc_pdu2.ndi1 = 1;
DLSCH_alloc_pdu2.rv1 = 0;
// Forget second codeword
DLSCH_alloc_pdu2.tpmi = 0;
#ifdef IFFT_FPGA
txdata = (int **)malloc16(2*sizeof(int*));
txdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES);
txdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES);
bzero(txdata[0],FRAME_LENGTH_BYTES);
bzero(txdata[1],FRAME_LENGTH_BYTES);
rxdata = (int **)malloc16(2*sizeof(int*));
rxdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES);
rxdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES);
bzero(rxdata[0],FRAME_LENGTH_BYTES);
bzero(rxdata[1],FRAME_LENGTH_BYTES);
txdataF2 = (int **)malloc16(2*sizeof(int*));
txdataF2[0] = (int *)malloc16(FRAME_LENGTH_BYTES_NO_PREFIX);
txdataF2[1] = (int *)malloc16(FRAME_LENGTH_BYTES_NO_PREFIX);
bzero(txdataF2[0],FRAME_LENGTH_BYTES_NO_PREFIX);
bzero(txdataF2[1],FRAME_LENGTH_BYTES_NO_PREFIX);
#endif
s_re = malloc(2*sizeof(double*));
s_im = malloc(2*sizeof(double*));
r_re = malloc(2*sizeof(double*));
r_im = malloc(2*sizeof(double*));
#ifdef SECONDARY_SYSTEM
s_re_secsys = malloc(2*sizeof(double*));
s_im_secsys = malloc(2*sizeof(double*));
for (i=0; i<2; i++) {
r_re_ext[i] = malloc(2*sizeof(double*));
r_im_ext[i] = malloc(2*sizeof(double*));
}
for (l=0; l<6; l++) {
r_re_crossLink[l] = malloc(2*sizeof(double*));
r_im_crossLink[l] = malloc(2*sizeof(double*));
}
#endif
for (i=0; i<2; i++) { //loop over antennas
s_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero(s_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
s_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero(s_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
r_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero(r_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
r_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero(r_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
#ifdef SECONDARY_SYSTEM
s_re_secsys[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero(s_re_secsys[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
s_im_secsys[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero(s_im_secsys[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
for (j=0; j<2; j++) {
r_re_ext[j][i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero(r_re_ext[j][i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
r_im_ext[j][i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero(r_im_ext[j][i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
}
for (l=0; l<6; l++) { //loop over channel index
r_re_crossLink[l][i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero(r_re_crossLink[l][i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
r_im_crossLink[l][i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero(r_im_crossLink[l][i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
} // channel index
#endif
}
ch = (struct complex**) malloc(4 * sizeof(struct complex*));
for (i = 0; i<4; i++)
ch[i] = (struct complex*) malloc(channel_length * sizeof(struct complex));
#ifdef SECONDARY_SYSTEM
for (l=0; l<6; l++) {
ch_ar[l] = (struct complex**) malloc(4 * sizeof(struct complex*));
for (i = 0; i<4; i++)
ch_ar[l][i] = (struct complex*) malloc(channel_length * sizeof(struct complex));
}
randominit(0);
set_taus_seed(0);
#ifdef CHANNEL_FROM_FILE
channel_file = fopen(channel_output,"r");
if (channel_file) {
if (fscanf(channel_file,"%d",&has_channel) != EOF) {
if (has_channel == 1) {
for (aa=0; aa<6; aa++) { //loop over channel index
for (i=0; i<PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_rx; i++) {
for (j=0; j<(PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_tx); j++) {
for (l=0; l<channel_length; l++) {
if (fscanf(channel_file,"%lf %lf",&ch_ar[aa][i + j*2][l].r, &ch_ar[aa][i + j*2][l].i) != 2) break;
}
}
}
}
}
}
fclose(channel_file);
}
#else //CHANNEL_FROM_FILE
has_channel = 0;
first_call = 1;
first_call_secsys = 1;
#endif //CHANNEL_FROM_FILE
#ifdef FLAT_CHANNEL
struct complex ch_const[6][PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_rx*(PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_tx)];
/*
double realCh_const[4];
double imagCh_const[4];
for (i=0; i<4; i++) {
realCh_const[i] = gaussdouble(0.0,1.0);
imagCh_const[i] = gaussdouble(0.0,1.0);
}
*/
for (aa=0; aa<6; aa++) { //loop over channel index
for (i=0; i<PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_rx; i++) {
for (j=0; j<(PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_tx); j++) {
ch_const[aa][i +j*2].r = gaussdouble(0.0,1.0);
ch_const[aa][i +j*2].i = gaussdouble(0.0,1.0);
if (has_channel) {
ch_const[aa][i +j*2].r = ch_ar[aa][i + j*2][0].r;
ch_const[aa][i +j*2].i = ch_ar[aa][i + j*2][0].i;
} else {
ch_ar[aa][i + j*2][0].r = ch_const[aa][i +j*2].r;
ch_ar[aa][i + j*2][0].i = ch_const[aa][i +j*2].i;
}
// msg("ch_const[%i][%i]->r = %lf \n",aa,i +j*2,ch_const[aa][i +j*2].r);
// msg("ch_const[%i][%i]->i = %lf \n",aa,i +j*2,ch_const[aa][i +j*2].i);
for (l=1; l<channel_length; l++) {
ch_ar[aa][i + j*2][l].r = 0;
ch_ar[aa][i + j*2][l].i = 0;
}
}
}
norm_const = pow(
pow(ch_ar[aa][0][0].r,2)
+ pow(ch_ar[aa][0][0].i,2) +
pow(ch_ar[aa][1][0].r,2)
+ pow(ch_ar[aa][1][0].i,2)
,.5);
ch_ar[aa][0][0].r = (ch_ar[aa][0][0].r/norm_const);
ch_ar[aa][0][0].i = (ch_ar[aa][0][0].i/norm_const);
ch_ar[aa][1][0].r = (ch_ar[aa][1][0].r/norm_const);
ch_ar[aa][1][0].i = (ch_ar[aa][1][0].i/norm_const);
}
has_channel = 1;
first_call = 0;
first_call_secsys = 0;
int knownData[PHY_vars_eNb[1]->lte_frame_parms.ofdm_symbol_size*PHY_vars_eNb[1]->lte_frame_parms.symbols_per_tti>>1][20][2][2];//[samples][slot][antennas][real-0/imag-1]
char knownDataFlag = 0;
int check =0;
channel_file = fopen("knownData.txt","r");
if (channel_file) {
if (fscanf(channel_file,"%d",&knownDataFlag) != EOF) {
if (knownDataFlag == 1) {
for (aa=0; aa<2; aa++) { //loop over antennas
for (j=0; j<20; j++) {
for (l=0; l<(PHY_vars_eNb[1]->lte_frame_parms.ofdm_symbol_size*PHY_vars_eNb[1]->lte_frame_parms.symbols_per_tti>>1); l++) {
check = fscanf(channel_file,"%d %d",&knownData[l][j][aa][0], &knownData[l][j][aa][1]);
if (check == 2) {
} else {
msg("read wrong!\n");
break;
}
}
}
}
}
}
fclose(channel_file);
}
#endif //FLAT_CHANNEL
#endif //SECONDARY_SYSTEM
openair_daq_vars.tdd = 1;
openair_daq_vars.dlsch_transmission_mode = 1;
openair_daq_vars.rx_gain_mode = DAQ_AGC_OFF;
openair_daq_vars.rx_rf_mode = 1;
openair_daq_vars.timing_advance = TIMING_ADVANCE_INIT;
openair_daq_vars.target_ue_dl_mcs = 4;
openair_daq_vars.target_ue_ul_mcs = 4;
openair_daq_vars.dlsch_rate_adaptation = 0;
openair_daq_vars.ue_ul_nb_rb = 2;
PHY_vars_UE[0]->rx_total_gain_dB = 140;
PHY_vars_eNb[0]->rx_total_gain_eNB_dB = 140;
#ifdef SECONDARY_SYSTEM
PHY_vars_UE[1]->rx_total_gain_dB = 140;
PHY_vars_eNb[1]->rx_total_gain_eNB_dB = 140;
PHY_vars_UE[2]->rx_total_gain_dB = 140;
PHY_vars_eNb[2]->rx_total_gain_eNB_dB = 140;
#endif
#ifdef PBS_SIM
strncpy(tempChar,pbs_output_dir,100);
#ifdef MU_RECEIVER
#ifndef DISABLE_SECONDARY
strcat(tempChar,"er_data_%d_%d_K%d.m");
#else
strcat(tempChar,"er_data_%d_%d_K%d_UB.m");
#endif //DISABLE_SECONDARY
#else
strcat(tempChar,"er_data_%d_%d_K%d_noIC.m");
#endif //MU_RECEIVER
sprintf(er_data_fname,tempChar,(int)(snr0*10 + 200),(int)(snr1*10 + 200),(int)rice_k); // + 200 for offset to get positive integer
er_data_fd = fopen(er_data_fname,"w");
if (er_data_fd) {
printf("Opened er_data_fd file successfully\n");
} else {
printf("Could not open er_data_fd file\n");
}
strncpy(tempChar,pbs_output_dir,100);
#ifdef MU_RECEIVER
#ifndef DISABLE_SECONDARY
strcat(tempChar,"turboIter_%d_%d_K%d.m");
#else
strcat(tempChar,"turboIter_%d_%d_K%d_UB.m");
#endif //DISABLE_SECONDARY
#else
strcat(tempChar,"turboIter_%d_%d_K%d_noIC.m");
#endif //MU_RECEIVER
sprintf(turboIter_fname,tempChar,(int)(snr0*10 + 200),(int)(snr1*10 + 200),(int)rice_k);
turboIter_fd = fopen(turboIter_fname,"w");
if (turboIter_fd) {
printf("Opened turboIter_fd file successfully\n");
} else {
printf("Could not open turboIter_fd file\n");
}
/*
strncpy(tempChar,pbs_output_dir,100);
strcat(tempChar,"er_cause_%d_%d_K%d.csv");
sprintf(er_cause_fname,tempChar,(int)(snr0*10 + 200),(int)(snr1*10 + 200),(int)rice_k);
er_cause_fd = fopen(er_cause_fname,"w");
*/
fprintf(er_data_fd,"er_data_fd = zeros(%i,%i,%i,%i);\n",N_STxG,N_SNR,2,7);
fprintf(turboIter_fd,"turboIter_fd = ones(%i,%i,%i);\n",N_STxG,N_SNR,2);
// fprintf(er_cause_fd,"dci/dlsch,Pri/Sec,stxg_ind,snr_ind,frame,rx_pwr,int_pwr,E[|ch_SePu|^2],stxg_act/tx_pwr,log2(pmax)\n");
#endif //PBS_SIM
/*-------------------------------------------------------------
SIMULATION START
---------------------------------------------------------------*/
for (SNR = snr0; SNR<=snr1; SNR+=snrStepSize) {
snr_ind++;
if ((SNR >= 5) && (snrStepSize < 1)) {
snrStepSize = 1;
}
if ((SNR >= 10) && (snrStepSize < 2)) {
snrStepSize = 2;
}
path_loss_dB_def = -105 + SNR;
#ifndef PBS_SIM
printf("path_loss_dB_def _pwr: %f\n",path_loss_dB_def);
#endif //PBS_SIM
stxg_ind=0;
for (STxGain = stxg0; STxGain<=stxg1; STxGain+=stxgStepSize) {
stxg_ind++; // initialized with 0, first index 1 (for MatLab/Octave)
PHY_vars_UE[0]->dlsch_errors=0;
PHY_vars_UE[0]->dlsch_errors_last=0;
PHY_vars_UE[0]->dlsch_received=0;
PHY_vars_UE[0]->dlsch_received_last=0;
PHY_vars_UE[0]->dlsch_fer=0;
PHY_vars_UE[0]->dlsch_cntl_errors=0;
PHY_vars_UE[0]->dlsch_cntl_received=0;
PHY_vars_UE[0]->dlsch_ra_errors=0;
PHY_vars_UE[0]->current_dlsch_cqi=0;
PHY_vars_UE[0]->lte_ue_pdcch_vars[eNb_id]->dci_errors=0;
PHY_vars_UE[0]->lte_ue_pdcch_vars[eNb_id]->dci_received=0;
PHY_vars_UE[0]->lte_ue_pdcch_vars[eNb_id]->dci_false=0;
PHY_vars_UE[0]->lte_ue_pdcch_vars[eNb_id]->dci_missed=0;
PHY_vars_UE[0]->lte_ue_pbch_vars[eNb_id]->pdu_errors=0;
PHY_vars_UE[0]->lte_ue_pbch_vars[eNb_id]->pdu_errors_last=0;
PHY_vars_UE[0]->lte_ue_pbch_vars[eNb_id]->pdu_errors_conseq=0;
PHY_vars_UE[0]->lte_ue_pbch_vars[eNb_id]->pdu_fer=0;
PHY_vars_UE[0]->turbo_iterations=0;
PHY_vars_UE[0]->first_run_timing_advance=0;
#ifdef SECONDARY_SYSTEM
PHY_vars_UE[1]->dlsch_errors=0;
PHY_vars_UE[1]->dlsch_errors_last=0;
PHY_vars_UE[1]->dlsch_received=0;
PHY_vars_UE[1]->dlsch_received_last=0;
PHY_vars_UE[1]->dlsch_fer=0;
PHY_vars_UE[1]->dlsch_cntl_errors=0;
PHY_vars_UE[1]->dlsch_cntl_received=0;
PHY_vars_UE[1]->dlsch_ra_errors=0;
PHY_vars_UE[1]->current_dlsch_cqi=0;
PHY_vars_UE[1]->lte_ue_pdcch_vars[eNb_id]->dci_errors=0;
PHY_vars_UE[1]->lte_ue_pdcch_vars[eNb_id]->dci_received=0;
PHY_vars_UE[1]->lte_ue_pdcch_vars[eNb_id]->dci_false=0;
PHY_vars_UE[1]->lte_ue_pdcch_vars[eNb_id]->dci_missed=0;
PHY_vars_UE[1]->lte_ue_pbch_vars[eNb_id]->pdu_errors=0;
PHY_vars_UE[1]->lte_ue_pbch_vars[eNb_id]->pdu_errors_last=0;
PHY_vars_UE[1]->lte_ue_pbch_vars[eNb_id]->pdu_errors_conseq=0;
PHY_vars_UE[1]->lte_ue_pbch_vars[eNb_id]->pdu_fer=0;
PHY_vars_UE[1]->turbo_iterations=0;
PHY_vars_UE[1]->first_run_timing_advance=0;
#endif
dl_er[0] = 0;
dci_er[0] = 0;
first_call = 1;
#ifdef SECONDARY_SYSTEM
dl_er[1] = 0;
dci_er[1] = 0;
first_call_secsys = 1;
#endif
PHY_vars_UE[0]->UE_mode = PUSCH;
PHY_vars_eNb[0]->eNB_UE_stats[0].mode[0] = PUSCH;
PHY_vars_eNb[0]->eNB_UE_stats[0].UE_id[0] = 0xBA82;
PHY_vars_UE[0]->lte_ue_pdcch_vars[0]->crnti = 0xBA82;
#ifdef SECONDARY_SYSTEM
PHY_vars_UE[1]->UE_mode = PUSCH;
PHY_vars_eNb[1]->eNB_UE_stats[0].mode[0] = PUSCH;
PHY_vars_eNb[1]->eNB_UE_stats[0].UE_id[0] = 0xBD17;
PHY_vars_UE[1]->lte_ue_pdcch_vars[0]->crnti = 0xBD17;
#endif
#ifdef SECONDARY_SYSTEM
printf("STxGain :: %f dB\n",STxGain);
printf("SNR :: %f dB\n",SNR);
#endif
#ifdef SKIP_RF_CHAIN
STxG = pow(10,.1*STxGain);
#endif //SKIP_RF_CHAIN
for (mac_xface->frame=0; mac_xface->frame<n_frames; mac_xface->frame++) {
#ifndef PBS_SIM
if (mac_xface->frame==2)
plot_flag = 1;
else
plot_flag = 0;
#endif //PBS_SIM
#ifdef RANDOM_BF
// if (mac_xface->frame%20==0) {
for (aa=0; aa<PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_rx; aa++) {
for (j=0; j<2; j++) { //loop over real/imaginary
PHY_vars_eNb[1]->const_ch[aa][j] = gaussdouble(0.0,1.0);
/*
if ((PHY_vars_eNb[1]->const_ch[aa][j] < 0.2) && (PHY_vars_eNb[1]->const_ch[aa][j] >= 0))
PHY_vars_eNb[1]->const_ch[aa][j] = 0.2;
if (PHY_vars_eNb[1]->const_ch[aa][j] > .5)
PHY_vars_eNb[1]->const_ch[aa][j] = .5;
if (PHY_vars_eNb[1]->const_ch[aa][j] < -.5)
PHY_vars_eNb[1]->const_ch[aa][j] = -.5;
if ((PHY_vars_eNb[1]->const_ch[aa][j] > -0.2) && (PHY_vars_eNb[1]->const_ch[aa][j] <= 0))
PHY_vars_eNb[1]->const_ch[aa][j] = -0.2;
*/
PHY_vars_UE[1]->const_ch[aa][j] = gaussdouble(0.0,1.0);
/*
if ((PHY_vars_UE[1]->const_ch[aa][j] < 0.2) && (PHY_vars_UE[1]->const_ch[aa][j] >= 0))
PHY_vars_UE[1]->const_ch[aa][j] = 0.2;
if (PHY_vars_UE[1]->const_ch[aa][j] > .5)
PHY_vars_UE[1]->const_ch[aa][j] = .5;
if (PHY_vars_UE[1]->const_ch[aa][j] < -.5)
PHY_vars_UE[1]->const_ch[aa][j] = -.5;
if ((PHY_vars_UE[1]->const_ch[aa][j] > -0.2) && (PHY_vars_UE[1]->const_ch[aa][j] <= 0))
PHY_vars_UE[1]->const_ch[aa][j] = -0.2;
*/
}
}
norm_const = pow(
pow(PHY_vars_eNb[1]->const_ch[0][0],2)
+ pow(PHY_vars_eNb[1]->const_ch[0][1],2) +
pow(PHY_vars_eNb[1]->const_ch[1][0],2)
+ pow(PHY_vars_eNb[1]->const_ch[1][1],2)
,.5);
PHY_vars_eNb[1]->const_ch[0][0] = (short)((PHY_vars_eNb[1]->const_ch[0][0]/norm_const)*pow(2,10));//512;//
ch_min = MIN(abs(ch_min),abs(PHY_vars_eNb[1]->const_ch[0][0]));
ch_max = MAX(abs(ch_max),abs(PHY_vars_eNb[1]->const_ch[0][0]));
PHY_vars_eNb[1]->const_ch[0][1] = (short)((PHY_vars_eNb[1]->const_ch[0][1]/norm_const)*pow(2,10));//238;//
ch_min = MIN(abs(ch_min),abs(PHY_vars_eNb[1]->const_ch[0][1]));
ch_max = MAX(abs(ch_max),abs(PHY_vars_eNb[1]->const_ch[0][1]));
PHY_vars_eNb[1]->const_ch[1][0] = (short)((PHY_vars_eNb[1]->const_ch[1][0]/norm_const)*pow(2,10));//-102;//
ch_min = MIN(abs(ch_min),abs(PHY_vars_eNb[1]->const_ch[1][0]));
ch_max = MAX(abs(ch_max),abs(PHY_vars_eNb[1]->const_ch[1][0]));
PHY_vars_eNb[1]->const_ch[1][1] = (short)((PHY_vars_eNb[1]->const_ch[1][1]/norm_const)*pow(2,10));//512;//
ch_min = MIN(abs(ch_min),abs(PHY_vars_eNb[1]->const_ch[1][1]));
ch_max = MAX(abs(ch_max),abs(PHY_vars_eNb[1]->const_ch[1][1]));
norm_const = pow(
pow(PHY_vars_UE[1]->const_ch[0][0],2)
+ pow(PHY_vars_UE[1]->const_ch[0][1],2) +
pow(PHY_vars_UE[1]->const_ch[1][0],2)
+ pow(PHY_vars_UE[1]->const_ch[1][1],2)
,.5);
PHY_vars_UE[1]->const_ch[0][0] = (short)((PHY_vars_UE[1]->const_ch[0][0]/norm_const)*pow(2,10));
PHY_vars_UE[1]->const_ch[0][1] = (short)((PHY_vars_UE[1]->const_ch[0][1]/norm_const)*pow(2,10));
PHY_vars_UE[1]->const_ch[1][0] = (short)((PHY_vars_UE[1]->const_ch[1][0]/norm_const)*pow(2,10));
PHY_vars_UE[1]->const_ch[1][1] = (short)((PHY_vars_UE[1]->const_ch[1][1]/norm_const)*pow(2,10));
// }
#endif //RANDOM_BF
for (slot=0 ; slot<20 ; slot++) {
last_slot = (slot - 1)%20;
if (last_slot <0)
last_slot+=20;
next_slot = (slot + 1)%20;
#ifdef SECONDARY_SYSTEM
path_loss_dB = path_loss_dB_def;
path_loss = pow(10,.1*path_loss_dB);
/*
if ((next_slot > 2) && (next_slot < 10)) {
if (PHY_vars_UE[1]->UE_mode == PRACH) // 6 RBs, 23 dBm
path_loss_dB += (-20+6.2); // UE
else
path_loss_dB += (-20+(double)PHY_vars_UE[1]->ulsch_ue[0]->power_offset);
}*/
path_loss_ar_dB[SeSu] = path_loss_dB;
path_loss_ar[SeSu] = pow(10,.1*path_loss_ar_dB[SeSu]);
path_loss_ar_dB[PeSu] = path_loss_dB;
path_loss_ar[PeSu] = pow(10,.1*path_loss_ar_dB[PeSu]);
#endif //SECONDARY_SYSTEM
path_loss_dB = path_loss_dB_def;
path_loss = pow(10,.1*path_loss_dB);
#ifdef SECONDARY_SYSTEM
path_loss_ar_dB[PeSe] = path_loss_dB;
path_loss_ar[PeSe] = pow(10,.1*path_loss_ar_dB[PeSe]);
#endif //SECONDARY_SYSTEM
/*
if (PHY_vars_UE[0]->UE_mode == PRACH) // 6 RBs, 23 dBm
path_loss_dB += (-20+6.2); // UE
else
path_loss_dB += (-20+(double)PHY_vars_UE[0]->ulsch_ue[0]->power_offset);
*/
#ifdef SECONDARY_SYSTEM
path_loss_ar_dB[SePu] = path_loss_dB;
path_loss_ar[SePu] = pow(10,.1*path_loss_ar_dB[SePu]);
path_loss_ar_dB[PePu] = path_loss_dB;
#endif //SECONDARY_SYSTEM
#ifndef PBS_SIM
printf("path_losses, next_slot %d: \n",next_slot);
for (i=1; i<6; i++) {
printf("path_loss_ar_dB[%d]: %f\n",i,path_loss_ar_dB[i]);
}
#endif //PBS_SIM
/*
if ((next_slot > 2) && (next_slot < 10)) { //UL
PHY_vars_eNb[0]->rx_total_gain_eNB_dB = - (MIN(path_loss_ar_dB[PePu],path_loss_ar_dB[PeSu]));
PHY_vars_eNb[1]->rx_total_gain_eNB_dB = - (MIN(path_loss_ar_dB[SePu],path_loss_ar_dB[SeSu]));
PHY_vars_eNb[2]->rx_total_gain_eNB_dB = PHY_vars_eNb[0]->rx_total_gain_eNB_dB;
for (i=0 ; i<3; i++) {
rx_gain[i] = PHY_vars_eNb[i]->rx_total_gain_eNB_dB;
#ifndef PBS_SIM
printf("[RF RX] Slot: %d: rx_gain (eNB) %d\n",next_slot, rx_gain[i])
#endif //PBS_SIM
}
} else { //D
PHY_vars_UE[0]->rx_total_gain_dB = - (MIN(path_loss_ar_dB[PePu],path_loss_ar_dB[SePu]));
PHY_vars_UE[1]->rx_total_gain_dB = - (MIN(path_loss_ar_dB[SeSu],path_loss_ar_dB[PeSu]));
PHY_vars_UE[2]->rx_total_gain_dB = PHY_vars_UE[0]->rx_total_gain_dB;
for (i=0 ; i<3; i++)
rx_gain[i] = PHY_vars_UE[i]->rx_total_gain_dB;
#ifndef PBS_SIM
printf("[RF RX] Slot: %d: rx_gain (UE) %d\n",next_slot, rx_gain[i]);
#endif //PBS_SIM
}
}
*/
/*-------------------------------------------------------------
ALL LTE PROCESSING
---------------------------------------------------------------*/
if (next_slot==2) {
//channel just changed and the precoders are no longer valid.
PHY_vars_eNb[1]->has_valid_precoder = 0;
PHY_vars_UE[1]->has_valid_precoder = 0;
}
#ifndef PBS_SIM
printf("\n");
printf("Frame %d, slot %d : eNB procedures\n",mac_xface->frame,slot);
#endif //PBS_SIM
mac_xface->is_cluster_head = 1;
phy_procedures_eNb_lte(last_slot,next_slot,PHY_vars_eNb[0]);
#ifndef DISABLE_SECONDARY
#ifdef SECONDARY_SYSTEM
#ifndef PBS_SIM
printf("\n");
printf("Frame %d, slot %d : Secondary eNB procedures\n",mac_xface->frame,slot);
#endif //PBS_SIM
phy_procedures_eNb_lte(last_slot,next_slot,PHY_vars_eNb[1]);
if ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_UL) || last_slot==3) {
//printf("\n");
//printf("Frame %d, slot %d : Virtual Primary eNB procedures\n",mac_xface->frame,slot);
//phy_procedures_eNb_lte(last_slot,next_slot,PHY_vars_eNb[2]);
}
#endif //SECONDARY_SYSTEM
#ifndef PBS_SIM
printf("\n\n");
printf("Frame %d, slot %d : UE procedures\n",mac_xface->frame,slot);
#endif //PBS_SIM
#endif //DISABLE_SECONDARY
mac_xface->is_cluster_head = 0;
phy_procedures_ue_lte(last_slot,next_slot,PHY_vars_UE[0]);
#ifndef DISABLE_SECONDARY
#ifdef SECONDARY_SYSTEM
#ifndef PBS_SIM
printf("\n");
printf("Frame %d, slot %d : Secondary UE procedures\n",mac_xface->frame,slot);
#endif //PBS_SIM
phy_procedures_ue_lte(last_slot,next_slot,PHY_vars_UE[1]);
#ifndef PBS_SIM
if ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_DL) || last_slot==2) {
//printf("\n");
//printf("Frame %d, slot %d : Virtual Primary UE procedures\n",mac_xface->frame,slot);
//phy_procedures_ue_lte(last_slot,next_slot,PHY_vars_UE[2]);
}
#endif //PBS_SIM
#endif //SECONDARY_SYSTEM
#ifndef PBS_SIM
printf("\n");
#endif //PBS_SIM
#endif //DISABLE_SECONDARY
/*-------------------------------------------------------------
ASSIGN POINTERS TO CORRECT BUFFERS ACCORDING TO TDD-STRUCTURE
----- TX PART -----
and perform OFDM modulation ifndef IFFT_FPGA
---------------------------------------------------------------*/
if (subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_DL) {
txdataF = PHY_vars_eNb[0]->lte_eNB_common_vars.txdataF[eNb_id];
#ifdef SECONDARY_SYSTEM
txdataF_ext = PHY_vars_eNb[1]->lte_eNB_common_vars.txdataF[eNb_id_secsys];
#endif
#ifndef IFFT_FPGA
txdata = PHY_vars_eNb[0]->lte_eNB_common_vars.txdata[eNb_id];
#ifdef SECONDARY_SYSTEM
txdata_ext = PHY_vars_eNb[1]->lte_eNB_common_vars.txdata[eNb_id_secsys];
#endif
#endif
} else if (subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_UL) {
txdataF = PHY_vars_UE[0]->lte_ue_common_vars.txdataF;
#ifdef SECONDARY_SYSTEM
txdataF_ext = PHY_vars_UE[1]->lte_ue_common_vars.txdataF;
#endif
#ifndef IFFT_FPGA
txdata = PHY_vars_UE[0]->lte_ue_common_vars.txdata;
#ifdef SECONDARY_SYSTEM
txdata_ext = PHY_vars_UE[1]->lte_ue_common_vars.txdata;
#endif
#endif
} else { //it must be a special subframe
//which also means that SECONDARY system must listen, and synchronize as an UE, every x(=10) frame(s). PBS located in the 3rd symbol in this slot.
if (next_slot%2==0) {//DL part
txdataF = PHY_vars_eNb[0]->lte_eNB_common_vars.txdataF[eNb_id];
#ifdef SECONDARY_SYSTEM // SEC_SYS should be in Rx-mode here, primary will transmit
txdataF_ext =
PHY_vars_eNb[1]->lte_eNB_common_vars.txdataF[eNb_id_secsys]; // should point to NULL (though this will now just point to a lot of zeros, since phy_procedures routine will not generate PSS).
#endif
#ifndef IFFT_FPGA
txdata = PHY_vars_eNb[0]->lte_eNB_common_vars.txdata[eNb_id];
#ifdef SECONDARY_SYSTEM // SEC_SYS should be in Rx-mode here, primary will transmit
txdata_ext =
PHY_vars_eNb[1]->lte_eNB_common_vars.txdata[eNb_id_secsys]; // should point to NULL (though this will now just point to a lot of zeros, since phy_procedures routine will not generate PSS).
#endif
#endif
} else { // UL part
txdataF = PHY_vars_UE[0]->lte_ue_common_vars.txdataF;
#ifdef SECONDARY_SYSTEM // S_eNb should be in Rx-mode here
txdataF_ext = PHY_vars_UE[1]->lte_ue_common_vars.txdataF;
#endif
#ifndef IFFT_FPGA
txdata = PHY_vars_UE[0]->lte_ue_common_vars.txdata;
#ifdef SECONDARY_SYSTEM // S_eNb should be in Rx-mode here
txdata_ext = PHY_vars_UE[1]->lte_ue_common_vars.txdata;
#endif
#endif
}
}
#ifdef IFFT_FPGA
slot_offset = (next_slot)*(lte_frame_parms->N_RB_DL*12)*((lte_frame_parms->Ncp==1) ? 6 : 7);
//write_output("eNb_txsigF0.m","eNb_txsF0", PHY_vars_eNb->lte_eNB_common_vars->txdataF[eNb_id][0],300*120,1,4);
//write_output("eNb_txsigF1.m","eNb_txsF1", PHY_vars_eNb->lte_eNB_common_vars->txdataF[eNb_id][1],300*120,1,4);
// do table lookup and write results to txdataF2
for (aa=0; aa<lte_frame_parms->nb_antennas_tx; aa++) {
l = slot_offset;
for (i=0; i<NUMBER_OF_OFDM_CARRIERS*((lte_frame_parms->Ncp==1) ? 6 : 7); i++)
if ((i%512>=1) && (i%512<=150))
txdataF2[aa][i] = ((int*)mod_table)[txdataF[aa][l++]];
else if (i%512>=362)
txdataF2[aa][i] = ((int*)mod_table)[txdataF[aa][l++]];
else
txdataF2[aa][i] = 0;
#ifdef SECONDARY_SYSTEM
if ((i%512>=1) && (i%512<=150))
txdataF2_secsys[aa][i] = ((int*)mod_table)[txdataF_ext[aa][l++]];
else if (i%512>=362)
txdataF2_secsys[aa][i] = ((int*)mod_table)[txdataF_ext[aa][l++]];
else
txdataF2_secsys[aa][i] = 0;
#endif
}
for (aa=0; aa<lte_frame_parms->nb_antennas_tx; aa++)
PHY_ofdm_mod(txdataF2[aa], // input
txdata[aa], // output
lte_frame_parms->log2_symbol_size, // log2_fft_size
(lte_frame_parms->Ncp==1) ? 6 : 7, // number of symbols
lte_frame_parms->nb_prefix_samples, // number of prefix samples
lte_frame_parms->twiddle_ifft, // IFFT twiddle factors
lte_frame_parms->rev, // bit-reversal permutation
CYCLIC_PREFIX);
#ifdef SECONDARY_SYSTEM
for (aa=0; aa<lte_frame_parms->nb_antennas_tx; aa++)
PHY_ofdm_mod(txdataF2_secsys[aa], // input
txdata_ext[aa], // output
lte_frame_parms->log2_symbol_size,
(lte_frame_parms->Ncp==1) ? 6 : 7,
lte_frame_parms->nb_prefix_samples,
lte_frame_parms->twiddle_ifft,
lte_frame_parms->rev,
CYCLIC_PREFIX);
#endif //SECONDARY_SYSTE
#else //IFFT_FPGA
slot_offset = (next_slot)*(lte_frame_parms->ofdm_symbol_size)*((lte_frame_parms->Ncp==1) ? 6 : 7);
#ifndef PBS_SIM
// printf("Copying TX buffer for slot %d (%d)\n",next_slot,slot_offset); CYCLIC_PREFIX);
#endif //PBS_SIM
slot_offset_time = (next_slot)*(lte_frame_parms->samples_per_tti>>1);
for (aa=0; aa<PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx; aa++) {
PHY_ofdm_mod(&txdataF[aa][slot_offset], // input
&txdata[aa][slot_offset_time], // output
lte_frame_parms->log2_symbol_size, // log2_fft_size
(lte_frame_parms->Ncp==1) ? 6 : 7, // number of symbols
lte_frame_parms->nb_prefix_samples, // number of prefix samples
lte_frame_parms->twiddle_ifft, // IFFT twiddle factors
lte_frame_parms->rev, // bit-reversal permutation
CYCLIC_PREFIX);
}
#ifndef PBS_SIM
if (next_slot==7) {
write_output("txdata_f0.m","txs_f0",&txdataF[0][slot_offset],(lte_frame_parms->ofdm_symbol_size*lte_frame_parms->symbols_per_tti>>1),1,1);
if (PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx == 2)
write_output("txdata_f1.m","txs_f1",&txdataF[1][slot_offset],(lte_frame_parms->ofdm_symbol_size*lte_frame_parms->symbols_per_tti>>1),1,1);
write_output("txdata_t0.m","txs_t0",&txdata[0][slot_offset_time],lte_frame_parms->samples_per_tti>>1,1,1);
if (PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx == 2)
write_output("txdata_t1.m","txs_t1",&txdata[1][slot_offset_time],lte_frame_parms->samples_per_tti>>1,1,1);
}
#endif //PBS_SIM
#ifdef SECONDARY_SYSTEM
for (aa=0; aa<(PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_tx); aa++) {
PHY_ofdm_mod(&txdataF_ext[aa][slot_offset],// input
&txdata_ext[aa][slot_offset_time],// output
lte_frame_parms->log2_symbol_size,
(lte_frame_parms->Ncp==1) ? 6 : 7,
lte_frame_parms->nb_prefix_samples,
lte_frame_parms->twiddle_ifft,
lte_frame_parms->rev, CYCLIC_PREFIX);
}
#ifndef PBS_SIM
if (next_slot==7) {
write_output("txdata_f0.m","txs_f0",&txdataF_ext[0][slot_offset],(lte_frame_parms->ofdm_symbol_size*lte_frame_parms->symbols_per_tti>>1),1,1);
if ((PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_tx) == 2)
write_output("txdata_f1.m","txs_f1",&txdataF_ext[1][slot_offset],(lte_frame_parms->ofdm_symbol_size*lte_frame_parms->symbols_per_tti>>1),1,1);
write_output("txdata_t0.m","txs_t0",&txdata_ext[0][slot_offset_time],lte_frame_parms->samples_per_tti>>1,1,1);
if ((PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_tx) == 2)
write_output("txdata_t1.m","txs_t1",&txdata_ext[1][slot_offset_time],lte_frame_parms->samples_per_tti>>1,1,1);
}
#endif //PBS_SIM
#endif //SECONDARY_SYSTEM
#endif //IFFT_FPGA
/*-------------------------------------------------------------
ASSIGN POINTERS TO CORRECT BUFFERS ACCORDING TO TDD-STRUCTURE
----- RX PART -----
---------------------------------------------------------------*/
if (subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_DL)
rxdata = PHY_vars_UE[0]->lte_ue_common_vars.rxdata;
else if (subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_UL)
rxdata = PHY_vars_eNb[0]->lte_eNB_common_vars.rxdata[eNb_id];
else //it must be a special subframe
if (next_slot%2==0) //DL part
rxdata = PHY_vars_UE[0]->lte_ue_common_vars.rxdata;
else // UL part
rxdata = PHY_vars_eNb[0]->lte_eNB_common_vars.rxdata[eNb_id];
#ifdef SECONDARY_SYSTEM
if (subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_DL) {
rxdata_ext[0] = PHY_vars_UE[1]->lte_ue_common_vars.rxdata;
rxdata_ext[1] = PHY_vars_UE[2]->lte_ue_common_vars.rxdata;
} else if (subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_UL) {
rxdata_ext[0] = PHY_vars_eNb[1]->lte_eNB_common_vars.rxdata[eNb_id_secsys];
rxdata_ext[1] = PHY_vars_eNb[2]->lte_eNB_common_vars.rxdata[eNb_id];
} else { //it must be a special subframe
//which also means that SECONDARY system must listen, and synchronize as an UE, every x(=100) frame(s) or every frame on power up. PSS is located in the 3rd symbol in this slot.
if (PHY_vars_eNb[1]->is_init_sync && mac_xface->frame%100>0) {
if (next_slot%2==0) { //DL part
rxdata_ext[0] = PHY_vars_UE[1]->lte_ue_common_vars.rxdata;
//make sure SeNb rx_buffer is empty from the time when it listened and synchronized
for (aa=0; aa<PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_rx; aa++)
memset(&PHY_vars_eNb[1]->lte_eNB_common_vars.rxdata[eNb_id_secsys][aa][next_slot*((PHY_vars_eNb[1]->lte_frame_parms.nb_prefix_samples+PHY_vars_eNb[1]->lte_frame_parms.ofdm_symbol_size)*
(PHY_vars_eNb[1]->lte_frame_parms.symbols_per_tti>>1))],0,(PHY_vars_eNb[1]->lte_frame_parms.nb_prefix_samples+PHY_vars_eNb[1]->lte_frame_parms.ofdm_symbol_size)*
(PHY_vars_eNb[1]->lte_frame_parms.symbols_per_tti>>1)*sizeof(mod_sym_t));
} else { //UL part
rxdata_ext[0] = PHY_vars_eNb[1]->lte_eNB_common_vars.rxdata[eNb_id_secsys];
}
} else { //Listen (in both SF slots) and synchronize
rxdata_ext[0] = PHY_vars_eNb[1]->lte_eNB_common_vars.rxdata[eNb_id_secsys];
}
// virtual primary system applies regular configuration
if (next_slot%2==0) { //DL part
rxdata_ext[1] = PHY_vars_UE[2]->lte_ue_common_vars.rxdata;
} else { //UL part
rxdata_ext[1] = PHY_vars_eNb[2]->lte_eNB_common_vars.rxdata[eNb_id];
}
}
#endif //SECONDARY_SYSTEM
/*-------------------------------------------------------------
TRANSMISSION SIMULATION
---------------------------------------------------------------*/
#ifdef SKIP_RF_CHAIN
// get pointer to data ready to be transmitted
for (i=0; i<(PHY_vars_eNb[0]->lte_frame_parms.samples_per_tti>>1); i++) {
for (aa=0; aa<PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx; aa++) {
s_re[aa][i] = (double)(((short *)txdata[aa])[(slot_offset_time+i)<<1]);
s_im[aa][i] = (double)(((short *)txdata[aa])[((slot_offset_time+i)<<1)+1]);
}
#ifdef SECONDARY_SYSTEM
for (aa=0; aa<(PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_tx); aa++) {
s_re_secsys[aa][i] = (double)(((short *)txdata_ext[aa])[(slot_offset_time+i)<<1]);
s_im_secsys[aa][i] = (double)(((short *)txdata_ext[aa])[((slot_offset_time+i)<<1)+1]);
}
#endif //SECONDARY_SYSTEM
}
for (i=0; i<(PHY_vars_eNb[0]->lte_frame_parms.samples_per_tti>>1); i++) {
for (aa=0; aa<PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_rx; aa++) {
for (j=0; j<PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx; j++) {
r_re[aa][i] = s_re[aa][i]*ch_ar[PePu][aa][0].r - s_im[aa][i]*ch_ar[PePu][aa][0].i + 0;
r_im[aa][i] = s_im[aa][i]*ch_ar[PePu][aa][0].r + s_re[aa][i]*ch_ar[PePu][aa][0].i + 0;
}
}
}
#ifdef SECONDARY_SYSTEM
for (i=0; i<(PHY_vars_eNb[0]->lte_frame_parms.samples_per_tti>>1); i++) {
for (aa=0; aa<(PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_rx); aa++) {
for (j=0; j<PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_tx; j++) {
r_re_ext[0][aa][i] += s_re_secsys[j][i]*ch_ar[SeSu][aa + j*(PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_rx)][0].r -
s_im_secsys[j][i]*ch_ar[SeSu][aa + j*(PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_rx)][0].i + 0;
r_im_ext[0][aa][i] += s_im_secsys[j][i]*ch_ar[SeSu][aa + j*(PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_rx)][0].r +
s_re_secsys[j][i]*ch_ar[SeSu][aa + j*(PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_rx)][0].i + 0;
}
}
// signal from primary system to secondary system
for (aa=0; aa<(PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_rx); aa++) {
for (j=0; j<PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx; j++) {
if ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_DL) || ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_S) && (next_slot%2==0))) { // DL
r_re_ext[0][aa][i] += s_re[j][i]*ch_ar[PeSu][aa + j*(PHY_vars_UE[1]->lte_frame_parms.nb_antennas_rx)][0].r - s_im[j][i]*ch_ar[PeSu][aa + j*(PHY_vars_UE[1]->lte_frame_parms.nb_antennas_rx)][0].i + 0;
r_im_ext[0][aa][i] += s_im[j][i]*ch_ar[PeSu][aa + j*(PHY_vars_UE[1]->lte_frame_parms.nb_antennas_rx)][0].r + s_re[j][i]*ch_ar[PeSu][aa + j*(PHY_vars_UE[1]->lte_frame_parms.nb_antennas_rx)][0].i + 0;
} else { //UL
r_re_ext[0][aa][i] += s_re[j][i]*ch_ar[SePu][aa + j*(PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_rx)][0].r - s_im[j][i]*ch_ar[SePu][aa + j*(PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_rx)][0].i + 0;
r_im_ext[0][aa][i] += s_im[j][i]*ch_ar[SePu][aa + j*(PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_rx)][0].r + s_re[j][i]*ch_ar[SePu][aa + j*(PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_rx)][0].i + 0;
}
}
}
// only signal from secondary to primary (to the virtual receivers)
for (aa=0; aa<PHY_vars_eNb[2]->lte_frame_parms.nb_antennas_rx; aa++) { //can be outer loop as long as eNb and UE share the same number of Rx antennas
for (j=0; j<PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_tx; j++) {
if ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_DL) || ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_S) && (next_slot%2==0))) { // DL
r_re_ext[1][aa][i] += s_re_secsys[j][i]*ch_ar[SePu][aa + j*(PHY_vars_UE[2]->lte_frame_parms.nb_antennas_rx)][0].r -
s_im_secsys[j][i]*ch_ar[SePu][aa + j*(PHY_vars_UE[2]->lte_frame_parms.nb_antennas_rx)][0].i + 0;
r_im_ext[1][aa][i] += s_im_secsys[j][i]*ch_ar[SePu][aa + j*(PHY_vars_UE[2]->lte_frame_parms.nb_antennas_rx)][0].r +
s_re_secsys[j][i]*ch_ar[SePu][aa + j*(PHY_vars_UE[2]->lte_frame_parms.nb_antennas_rx)][0].i + 0;
} else { //UL
r_re_ext[1][aa][i] += s_re_secsys[j][i]*ch_ar[PeSu][aa + j*(PHY_vars_eNb[2]->lte_frame_parms.nb_antennas_rx)][0].r -
s_im_secsys[j][i]*ch_ar[PeSu][aa + j*(PHY_vars_eNb[2]->lte_frame_parms.nb_antennas_rx)][0].i + 0;
r_im_ext[1][aa][i] += s_im_secsys[j][i]*ch_ar[PeSu][aa + j*(PHY_vars_eNb[2]->lte_frame_parms.nb_antennas_rx)][0].r +
s_re_secsys[j][i]*ch_ar[PeSu][aa + j*(PHY_vars_eNb[2]->lte_frame_parms.nb_antennas_rx)][0].i + 0;
}
}
}
// signal from secondary to primary
for (aa=0; aa<PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_rx; aa++) { //can be outer loop as long as eNb and UE share the same number of Rx antennas
for (j=0; j<PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_tx; j++) {
if ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_DL) || ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_S) && (next_slot%2==0))) { // DL
r_re[aa][i] += s_re_secsys[j][i]*ch_ar[SePu][aa + j*(PHY_vars_UE[0]->lte_frame_parms.nb_antennas_rx)][0].r - s_im_secsys[j][i]*ch_ar[SePu][aa + j*(PHY_vars_UE[0]->lte_frame_parms.nb_antennas_rx)][0].i
+ 0;
r_im[aa][i] += s_im_secsys[j][i]*ch_ar[SePu][aa + j*(PHY_vars_UE[0]->lte_frame_parms.nb_antennas_rx)][0].r + s_re_secsys[j][i]*ch_ar[SePu][aa + j*(PHY_vars_UE[0]->lte_frame_parms.nb_antennas_rx)][0].i
+ 0;
} else { //UL
r_re[aa][i] += s_re_secsys[j][i]*ch_ar[PeSu][aa + j*(PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_rx)][0].r -
s_im_secsys[j][i]*ch_ar[PeSu][aa + j*(PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_rx)][0].i + 0;
r_im[aa][i] += s_im_secsys[j][i]*ch_ar[PeSu][aa + j*(PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_rx)][0].r +
s_re_secsys[j][i]*ch_ar[PeSu][aa + j*(PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_rx)][0].i + 0;
}
}
}
}
#endif //SECONDARY_SYSTEM
slot_offset_time = next_slot*(PHY_vars_eNb[0]->lte_frame_parms.samples_per_tti>>1);
for (i=0; i<(PHY_vars_eNb[0]->lte_frame_parms.samples_per_tti>>1); i++) {
for (aa=0; aa<PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_rx; aa++) {
((short *)rxdata[aa])[((i+slot_offset_time)<<1)] = (short)(r_re[aa][i+0]*1);
((short *)rxdata[aa])[1+((i+slot_offset_time)<<1)] = (short)(r_im[aa][i+0]*1);
#ifdef SECONDARY_SYSTEM
((short *)rxdata_ext[1][aa])[((i+slot_offset_time)<<1)] = (short)(r_re_ext[1][aa][i+0]*1);
((short *)rxdata_ext[1][aa])[1+((i+slot_offset_time)<<1)] = (short)(r_im_ext[1][aa][i+0]*1);
}
for (aa=0; aa<PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_rx; aa++) {
((short *)rxdata_ext[0][aa])[((i+slot_offset_time)<<1)] = (short)(r_re_ext[0][aa][i+0]*1);
((short *)rxdata_ext[0][aa])[1+((i+slot_offset_time)<<1)] = (short)(r_im_ext[0][aa][i+0]*1);
#endif
}
}
#else //SKIP_RF_CHAIN
/*-------------------------------------------------------------
D/A
---------------------------------------------------------------*/
// convert to floating point
tx_pwr = dac_fixed_gain(s_re,
s_im,
txdata,
slot_offset_time,
PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx,
lte_frame_parms->samples_per_tti>>1,
14,
18+5); // -(20log10(1024)-20log10(2^13)) ~= 18, +5 to adjust DCI to have ~0dBm
if ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_DL) || ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_S) && (next_slot%2==0))) { // DL
tx_pwr = 6*signal_energy_fp(s_re,s_im,PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx,640,0); // RSs only on every sixth --> *6
} else { // UL
if (next_slot%2==0)
tx_pwr = signal_energy_fp(s_re,s_im,PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx,640*2,640*3);
else
tx_pwr = 2*signal_energy_fp(s_re,s_im,PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx,640,640*5); // SRSs only on every second --> *2
}
#ifndef PBS_SIM
printf("tx_pwr Primary %f dB for slot %d (subframe %d)\n",10*log10(tx_pwr),next_slot,next_slot>>1);
#endif //PBS_SIM
if (next_slot == 7) {
tx_pwr_SRS = tx_pwr;
}
#ifndef PBS_SIM
if (next_slot>>1 == 6 || next_slot>>1 == 0) {
tx_pwr_SRS = 6*signal_energy_fp(s_re,s_im,PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx,640,0);
printf("tx_pwr %f dB for slot %d (subframe %d)\n",10*log10(tx_pwr_SRS),next_slot,next_slot>>1);
tx_pwr_SRS = signal_energy_fp(s_re,s_im,PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx,640,640);
printf("tx_pwr %f dB for slot %d (subframe %d)\n",10*log10(tx_pwr_SRS),next_slot,next_slot>>1);
tx_pwr_SRS = signal_energy_fp(s_re,s_im,PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx,640,640*2);
printf("tx_pwr %f dB for slot %d (subframe %d)\n",10*log10(tx_pwr_SRS),next_slot,next_slot>>1);
tx_pwr_SRS = 6*signal_energy_fp(s_re,s_im,PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx,640,640*3);
printf("tx_pwr %f dB for slot %d (subframe %d)\n",10*log10(tx_pwr_SRS),next_slot,next_slot>>1);
tx_pwr_SRS = signal_energy_fp(s_re,s_im,PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx,640,640*4);
printf("tx_pwr %f dB for slot %d (subframe %d)\n",10*log10(tx_pwr_SRS),next_slot,next_slot>>1);
tx_pwr_SRS = signal_energy_fp(s_re,s_im,PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx,640,640*5);
printf("tx_pwr %f dB for slot %d (subframe %d)\n",10*log10(tx_pwr_SRS),next_slot,next_slot>>1);
}
if (next_slot>>1 == 6 || next_slot>>1 == 0) {
printf("tx_pwr %f dB for slot %d (subframe %d)\n",10*log10(tx_pwr),next_slot,next_slot>>1);
}
#endif //PBS_SIM
#ifdef SECONDARY_SYSTEM
// convert to floating point
dac_fixed_gain(s_re_secsys,
s_im_secsys,
txdata_ext,
slot_offset_time,
PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_tx,
lte_frame_parms->samples_per_tti>>1,
14,
18+5-3); // -(20log10(1024)-20log10(2^13)) ~= 18, +5 to adjust DCI to have ~0dBm
if ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_DL) || ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_S) && (next_slot%2==0))) { // DL
tx_pwr_secsys = 6*signal_energy_fp(s_re_secsys,s_im_secsys,1,640,0); // RSs only on every sixth --> *6
tx_pwr_secsys += 6*signal_energy_fp(&s_re_secsys[1],&s_im_secsys[1],1,640,0); // RSs only on every sixth --> *6
} else { // UL
if (next_slot%2==0) {
tx_pwr_secsys = signal_energy_fp(s_re_secsys,s_im_secsys,1,640*2,640*3);
tx_pwr_secsys += signal_energy_fp(&s_re_secsys[1],&s_im_secsys[1],1,640*2,640*3);
} else {
tx_pwr_secsys = 2*signal_energy_fp(s_re_secsys,s_im_secsys,1,640,640*5); // SRSs only on every second --> *2
tx_pwr_secsys += 2*signal_energy_fp(&s_re_secsys[1],&s_im_secsys[1],1,640,640*5); // SRSs only on every second --> *2
}
}
#ifndef PBS_SIM
printf("tx_pwr Secondary before %f dB for slot %d (subframe %d)\n",10*log10(tx_pwr_secsys),next_slot,next_slot>>1);
#endif //PBS_SIM
if (next_slot == 9) {
//printf("tx pwr secondary UE = %lf dB\n", 10*log10(tx_pwr_secsys)); //indicates the power of the B/F vector
tx_pwr = tx_pwr_SRS;
//printf("tx pwr ratio = %lf dB\n", 10*log10(tx_pwr/tx_pwr_secsys));
}
// for convenience call same function for power scaling, but only if there is data to send i.e. tx_pwr_secsys>0
if (tx_pwr_secsys>0) {
if (tx_pwr_secsys > tx_pwr)
tx_pwr_secsys = dac_fixed_gain(s_re_secsys,
s_im_secsys,
txdata_ext,
slot_offset_time,
PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_tx,
lte_frame_parms->samples_per_tti>>1,
14,
18+5-3+STxGain- ((tx_pwr) ? (10*log10(tx_pwr_secsys/tx_pwr)) : 0)); // -(20log10(1024)-20log10(2^13)) ~= 18, +5 to adjust DCI to have ~0dBm, -3 because of two tx antennas
else
tx_pwr_secsys = dac_fixed_gain(s_re_secsys,
s_im_secsys,
txdata_ext,
slot_offset_time,
PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_tx,
lte_frame_parms->samples_per_tti>>1,
14,
18+5-3+STxGain+ ((tx_pwr_secsys) ? (10*log10(tx_pwr/tx_pwr_secsys)) : 0)); // -(20log10(1024)-20log10(2^13)) ~= 18, +5 to adjust DCI to have ~0dBm, -3 because of two tx antennas
} //else if(next_slot==10 || next_slot==9) {
//plot_flag = 1;
//}
#ifndef PBS_SIM
if ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_DL) || ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_S) && (next_slot%2==0))) { // DL
tx_pwr_secsys = 6*signal_energy_fp(s_re_secsys,s_im_secsys,1,640,0); // RSs only on every sixth --> *6
tx_pwr_secsys += 6*signal_energy_fp(&s_re_secsys[1],&s_im_secsys[1],1,640,0); // RSs only on every sixth --> *6
} else { // UL
if (next_slot%2==0) {
tx_pwr_secsys = signal_energy_fp(s_re_secsys,s_im_secsys,1,640*2,640*3);
tx_pwr_secsys += signal_energy_fp(&s_re_secsys[1],&s_im_secsys[1],1,640*2,640*3);
} else {
tx_pwr_secsys = 2*signal_energy_fp(s_re_secsys,s_im_secsys,1,640,640*5); // SRSs only on every second --> *2
tx_pwr_secsys += 2*signal_energy_fp(&s_re_secsys[1],&s_im_secsys[1],1,640,640*5); // SRSs only on every second --> *2
}
}
printf("tx_pwr Secondary %f dB for slot %d (subframe %d)\n",10*log10(tx_pwr_secsys),next_slot,next_slot>>1);
/*
if (next_slot==11) {
write_output("txdata_t_a0.m","txs_t_a0",&txdata_ext[0][slot_offset_time],lte_frame_parms->samples_per_tti>>1,1,1);
write_output("txdata_t_a1.m","txs_t_a1",&txdata_ext[1][slot_offset_time],lte_frame_parms->samples_per_tti>>1,1,1);
write_output("txdata_t_real_a0.m","txs_t_r_a0",s_re_secsys[0],lte_frame_parms->samples_per_tti>>1,1,7);
write_output("txdata_t_real_a1.m","txs_t_r_a1",s_re_secsys[1],lte_frame_parms->samples_per_tti>>1,1,7);
}
*/
#endif //PBS_SIM
#endif //SECONDARY_SYSTEM
/*-------------------------------------------------------------
CHANNEL MODEL
ANTENNA(s) TO ANTENNA(s)
---------------------------------------------------------------*/
#ifndef PBS_SIM
if ((last_slot==1 || last_slot==10) && mac_xface->frame>0) {
for (aarx=0; aarx<PHY_vars_UE[1]->lte_frame_parms.nb_antennas_rx; aarx++) {
for (aatx=0; aatx<PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx; aatx++) {
sprintf(fname,"dl_ch_estimate_prim_%i%i.m",aatx,aarx);
sprintf(vname,"dl_ch_est_p_%i%i",aatx,aarx);
write_output(fname,vname,PHY_vars_UE[1]->lte_ue_common_vars.dl_ch_estimates[0][(2*aatx)+aarx],PHY_vars_UE[1]->lte_frame_parms.ofdm_symbol_size*PHY_vars_UE[1]->lte_frame_parms.symbols_per_tti,1,1);
}
}
for (aarx=0; aarx<PHY_vars_UE[1]->lte_frame_parms.nb_antennas_rx; aarx++) {
for (aatx=0; aatx<(PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_tx); aatx++) {
sprintf(fname,"dl_ch_estimate_seco_%i%i.m",aatx,aarx);
sprintf(vname,"dl_ch_est_s_%i%i",aatx,aarx);
write_output(fname,vname,PHY_vars_UE[1]->lte_ue_common_vars.dl_ch_estimates[1][(2*aatx)+aarx],PHY_vars_UE[1]->lte_frame_parms.ofdm_symbol_size*PHY_vars_UE[1]->lte_frame_parms.symbols_per_tti,1,1);
}
}
}
#endif //PBS_SIM
multipath_channel(
#ifdef SECONDARY_SYSTEM
ch_ar[PePu],
#else
ch,
#endif
s_re,s_im,r_re,r_im,
amps,Td,BW,ricean_factor,
#ifdef SECONDARY_SYSTEM
aoa_ar[PePu],
#else
aoa,
#endif
PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx,
PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_rx,
OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*(7-lte_frame_parms->Ncp),
channel_length,
0,
forgetting_factor, //forgetting factor (temporal variation, block stationary)
((first_call == 1) ? 1 : 0),
#ifdef SECONDARY_SYSTEM
(has_channel) ? 1 :
#endif
((next_slot==2 || first_call==1) ? 0 : 1),
#ifdef SECONDARY_SYSTEM
PePu,
#else
0,
#endif
0);
if (first_call == 1)
first_call = 0;
#ifdef SECONDARY_SYSTEM
#ifndef PBS_SIM
// printf("channel for slot %d (subframe %d)\n",next_slot,next_slot>>1);
#endif //PBS_SIM
// SeNb to S_UE
multipath_channel(ch_ar[SeSu],s_re_secsys,s_im_secsys,
r_re_ext[0],r_im_ext[0],
amps,Td,BW,ricean_factor,aoa_ar[SeSu],
PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_tx,
PHY_vars_UE[1]->lte_frame_parms.nb_antennas_rx,
OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*(7-lte_frame_parms->Ncp),
channel_length,
0,
forgetting_factor, //forgetting factor (temporal variation, block stationary)
((first_call_secsys == 1) ? 1 : 0),
(has_channel) ? 1 : ((next_slot==2 || first_call_secsys==1) ? 0 : 1),
SeSu,0);
#ifdef DEBUG_PHY
msg("ch_ar[%i][0][0].r = %lf\n",SeSu,ch_ar[SeSu][0][0].r);
#endif //DEBUG_PHY
// channel models for interference paths
if ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_DL) || ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_S) && (next_slot%2==0))) { // DL
// from PeNb to SeNb
multipath_channel(ch_ar[PeSe],s_re,s_im,
r_re_crossLink[PeSe],r_im_crossLink[PeSe],
amps,Td,BW,ricean_factor,aoa_ar[PeSe],
PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx,
PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_rx,
OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*(7-lte_frame_parms->Ncp),
channel_length,
0,
forgetting_factor, //forgetting factor (temporal variation, block stationary)
((first_call_secsys == 1) ? 1 : 0),
(has_channel) ? 1 : ((next_slot==2 || first_call_secsys==1) ? 0 : 1),
PeSe,
0);
#ifdef DEBUG_PHY
msg("ch_ar[%i][0][0].r = %lf\n",PeSe,ch_ar[PeSe][0][0].r);
#endif //DEBUG_PHY
// from PeNb to S_UE
multipath_channel(ch_ar[PeSu],s_re,s_im,
r_re_crossLink[PeSu],r_im_crossLink[PeSu],
amps,Td,BW,ricean_factor,aoa_ar[PeSu],
PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx,
PHY_vars_UE[1]->lte_frame_parms.nb_antennas_rx,
OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*(7-lte_frame_parms->Ncp),
channel_length,
0,
forgetting_factor, //forgetting factor (temporal variation, block stationary)
((first_call_secsys == 1) ? 1 : 0),
(has_channel) ? 1 : ((next_slot==2 || first_call_secsys==1) ? 0 : 1),
PeSu,
0);
#ifdef DEBUG_PHY
msg("ch_ar[%i][0][0].r = %lf\n",PeSu,ch_ar[PeSu][0][0].r);
#endif //DEBUG_PHY
// from SeNb to P_UE
multipath_channel(ch_ar[SePu],s_re_secsys,s_im_secsys,
r_re_crossLink[SePu],r_im_crossLink[SePu],
amps,Td,BW,ricean_factor,aoa_ar[SePu],
PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_tx,
PHY_vars_UE[0]->lte_frame_parms.nb_antennas_rx,
OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*(7-lte_frame_parms->Ncp),
channel_length,
0,
forgetting_factor, //forgetting factor (temporal variation, block stationary)
((first_call_secsys == 1) ? 1 : 0),
(has_channel) ? 1 : ((next_slot==2 || first_call_secsys==1) ? 0 : 1),
SePu,
0);
#ifdef DEBUG_PHY
msg("ch_ar[i][0][0].r = %lf\n",SePu,ch_ar[SePu][0][0].r);
#endif //DEBUG_PHY
} else { //UL
// from P_UE to SeNb
multipath_channel(ch_ar[SePu],s_re,s_im,
r_re_crossLink[SePu],r_im_crossLink[SePu],
amps,Td,BW,ricean_factor,aoa_ar[SePu],
PHY_vars_UE[0]->lte_frame_parms.nb_antennas_tx,
PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_rx,
OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*(7-lte_frame_parms->Ncp),
channel_length,
0,
forgetting_factor, //forgetting factor (temporal variation, block stationary)
((first_call_secsys == 1) ? 1 : 0),
(has_channel) ? 1 : ((next_slot==2 || first_call_secsys==1) ? 0 : 1),
SePu,
0);
#ifdef DEBUG_PHY
msg("ch_ar[%i][0][0].r = %lf\n",SePu,ch_ar[SePu][0][0].r);
#endif //DEBUG_PHY
// from P_UE to S_UE
multipath_channel(ch_ar[PuSu],s_re,s_im,
r_re_crossLink[PuSu],r_im_crossLink[PuSu],
amps,Td,BW,ricean_factor,aoa_ar[PuSu],
PHY_vars_UE[0]->lte_frame_parms.nb_antennas_tx,
PHY_vars_UE[1]->lte_frame_parms.nb_antennas_rx,
OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*(7-lte_frame_parms->Ncp),
channel_length,
0,
forgetting_factor, //forgetting factor (temporal variation, block stationary)
((first_call_secsys == 1) ? 1 : 0),
(has_channel) ? 1 : ((next_slot==2 || first_call_secsys==1) ? 0 : 1),
PuSu,
0);
#ifdef DEBUG_PHY
msg("ch_ar[%i][0][0].r = %lf\n",PuSu,ch_ar[PuSu][0][0].r);
#endif //DEBUG_PHY
// from S_UE to P_eNb
multipath_channel(ch_ar[PeSu],s_re_secsys,s_im_secsys,
r_re_crossLink[PeSu],r_im_crossLink[PeSu],
amps,Td,BW,ricean_factor,aoa_ar[PeSu],
PHY_vars_UE[1]->lte_frame_parms.nb_antennas_tx,
PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_rx,
OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*(7-lte_frame_parms->Ncp),
channel_length,
0,
forgetting_factor, //forgetting factor (temporal variation, block stationary)
((first_call_secsys == 1) ? 1 : 0),
(has_channel) ? 1 : ((next_slot==2 || first_call_secsys==1) ? 0 : 1),
PeSu,
0);
#ifdef DEBUG_PHY
msg("ch_ar[%i][0][0].r = %lf\n",PeSu,ch_ar[PeSu][0][0].r);
#endif //DEBUG_PHY
}
if (first_call_secsys == 1)
first_call_secsys = 0;
#endif //SECONDARY_SYSTEM
#ifdef DEBUG_PHY
if (next_slot==10) {
write_output("UE1_rxs_pilot_cl_re.m","UE1_rxs_cl_p_r",r_re_crossLink[PeSu][0],640,1,7);
write_output("UE1_rxs_pilot_cl_im.m","UE1_rxs_cl_p_i",r_im_crossLink[PeSu][0],640,1,7);
write_output("UE1_txs_pilot_re.m","UE1_txs_p_r",s_re_secsys[0],640,1,7);
write_output("UE1_txs_pilot_im.m","UE1_txs_p_i",s_im_secsys[0],640,1,7);
write_output("UE1_rxs_pilot_re.m","UE1_rxs_p_r",r_re_ext[0][0],640,1,7);
write_output("UE1_rxs_pilot_im.m","UE1_rxs_p_i",r_im_ext[0][0],640,1,7);
write_output("eNb1_txF_pilot_a0.m","eNb_txF_p0",&PHY_vars_eNb[1]->lte_eNB_common_vars.txdataF[eNb_id][0][next_slot*PHY_vars_eNb[1]->lte_frame_parms.ofdm_symbol_size*
(PHY_vars_eNb[1]->lte_frame_parms.symbols_per_tti>>1)],PHY_vars_eNb[1]->lte_frame_parms.ofdm_symbol_size,1,1);
write_output("eNb1_txF_pilot_a1.m","eNb_txF_p1",&PHY_vars_eNb[1]->lte_eNB_common_vars.txdataF[eNb_id][1][next_slot*PHY_vars_eNb[1]->lte_frame_parms.ofdm_symbol_size*
(PHY_vars_eNb[1]->lte_frame_parms.symbols_per_tti>>1)],PHY_vars_eNb[1]->lte_frame_parms.ofdm_symbol_size,1,1);
}
#endif //DEBUG_PHY
for (i=0; i<(lte_frame_parms->samples_per_tti>>1); i++) {
for (aa=0; aa<PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_rx; aa++) {
r_re[aa][i]=r_re[aa][i]*sqrt(path_loss);
r_im[aa][i]=r_im[aa][i]*sqrt(path_loss);
}
#ifdef SECONDARY_SYSTEM
for (aa=0; aa<PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_rx; aa++) {
r_re_ext[0][aa][i] = r_re_ext[0][aa][i]*sqrt(path_loss_ar[SeSu]);
r_im_ext[0][aa][i] = r_im_ext[0][aa][i]*sqrt(path_loss_ar[SeSu]);
}
if ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_S) && (next_slot%2==0)) { // Special SF - DL
for (aa=0; aa<PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_rx; aa++) {
if ((mac_xface->frame%100)==0) { // r_*_ext[0] buffer busy for SeNb --> no primary PSS available for secondary system
// from PeNb to SeNb
r_re_ext[0][aa][i] += r_re_crossLink[PeSe][aa][i]*sqrt(path_loss_ar[PeSe]);
r_im_ext[0][aa][i] += r_im_crossLink[PeSe][aa][i]*sqrt(path_loss_ar[PeSe]);
} else {
// from PeNb to S_UE
r_re_ext[0][aa][i] += r_re_crossLink[PeSu][aa][i]*sqrt(path_loss_ar[PeSu]);
r_im_ext[0][aa][i] += r_im_crossLink[PeSu][aa][i]*sqrt(path_loss_ar[PeSu]);
}
}
for (aa=0; aa<PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_rx; aa++) {
// from SeNb to P_UE
r_re[aa][i] += r_re_crossLink[SePu][aa][i]*sqrt(path_loss_ar[SePu]);
r_im[aa][i] += r_im_crossLink[SePu][aa][i]*sqrt(path_loss_ar[SePu]);
// from SeNb to virtual P_UE
r_re_ext[1][aa][i] = r_re_crossLink[SePu][aa][i]*sqrt(path_loss_ar[SePu]);
r_im_ext[1][aa][i] = r_im_crossLink[SePu][aa][i]*sqrt(path_loss_ar[SePu]);
}
} else if ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_S) && (next_slot%2==1)) { //Special SF - UL
for (aa=0; aa<PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_rx; aa++) {
// from P_UE to SeN
r_re_ext[0][aa][i] += r_re_crossLink[SePu][aa][i]*sqrt(path_loss_ar[SePu]);
r_im_ext[0][aa][i] += r_im_crossLink[SePu][aa][i]*sqrt(path_loss_ar[SePu]);
}
for (aa=0; aa<PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_rx; aa++) {
// from S_UE to PeNb
r_re[aa][i] += r_re_crossLink[PeSu][aa][i]*sqrt(path_loss_ar[PeSu]);
r_im[aa][i] += r_im_crossLink[PeSu][aa][i]*sqrt(path_loss_ar[PeSu]);
// from S_UE to Virtual PeNb
r_re_ext[1][aa][i] = r_re_crossLink[PeSu][aa][i]*sqrt(path_loss_ar[PeSu]);
r_im_ext[1][aa][i] = r_im_crossLink[PeSu][aa][i]*sqrt(path_loss_ar[PeSu]);
}
} else if ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_DL)) { // DL
for (aa=0; aa<PHY_vars_UE[1]->lte_frame_parms.nb_antennas_rx; aa++) {
// from PeNb to S_UE
r_re_ext[0][aa][i] += r_re_crossLink[PeSu][aa][i]*sqrt(path_loss_ar[PeSu]);
r_im_ext[0][aa][i] += r_im_crossLink[PeSu][aa][i]*sqrt(path_loss_ar[PeSu]);
}
for (aa=0; aa<PHY_vars_UE[0]->lte_frame_parms.nb_antennas_rx; aa++) {
// from SeNb to P_UE
r_re[aa][i] += r_re_crossLink[SePu][aa][i]*sqrt(path_loss_ar[SePu]);
r_im[aa][i] += r_im_crossLink[SePu][aa][i]*sqrt(path_loss_ar[SePu]);
// from SeNb to virtual P_UE
r_re_ext[1][aa][i] = r_re_crossLink[SePu][aa][i]*sqrt(path_loss_ar[SePu]);
r_im_ext[1][aa][i] = r_im_crossLink[SePu][aa][i]*sqrt(path_loss_ar[SePu]);
}
} else { // UL
for (aa=0; aa<PHY_vars_eNb[1]->lte_frame_parms.nb_antennas_rx; aa++) {
// from P_UE to SeNb
//if ((next_slot>>1) != 5) {
r_re_ext[0][aa][i] += r_re_crossLink[SePu][aa][i]*sqrt(path_loss_ar[SePu]);
r_im_ext[0][aa][i] += r_im_crossLink[SePu][aa][i]*sqrt(path_loss_ar[SePu]);
//}
}
for (aa=0; aa<PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_rx; aa++) {
// from S_UE to PeNb
r_re[aa][i] += r_re_crossLink[PeSu][aa][i]*sqrt(path_loss_ar[PeSu]);
r_im[aa][i] += r_im_crossLink[PeSu][aa][i]*sqrt(path_loss_ar[PeSu]);
// from S_UE to Virtual PeNb
r_re_ext[1][aa][i] = r_re_crossLink[PeSu][aa][i]*sqrt(path_loss_ar[PeSu]);
r_im_ext[1][aa][i] = r_im_crossLink[PeSu][aa][i]*sqrt(path_loss_ar[PeSu]);
}
}
#endif //SECONDARY_SYSTEM
}
/*-------------------------------------------------------------
RF MODELLING
RX PART
---------------------------------------------------------------*/
if ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_DL) || ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_S) && (next_slot%2==0))) { // DL
#ifdef DISABLE_SECONDARY
rx_pwr_pre[0] = 6*signal_energy_fp(r_re,r_im,PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx,640,0); // RSs only on one of three when Secondary is disabled --> *3
#else //DISABLE_SECONDARY
rx_pwr_pre[0] = (6/2)*signal_energy_fp(r_re,r_im,PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx,640,
0); // RSs only on two of three when Secondary is enabled --> *3/2 (This would be based on the ZBF not working...)
#endif //DISABLE_SECONDARY
rx_gain[0] = target_rx_pwr_dB - 10*log10(rx_pwr_pre[0]);
PHY_vars_UE[0]->rx_total_gain_dB = rx_gain[0];
} else { // UL
if (next_slot%2==0)
rx_pwr_pre[0] = signal_energy_fp(r_re,r_im,PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx,640*2,640*3);
else
rx_pwr_pre[0] = 2*signal_energy_fp(r_re,r_im,PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx,640,640*5); // SRSs only on every second --> *2
rx_gain[0] = target_rx_pwr_dB - 10*log10(rx_pwr_pre[0]);
PHY_vars_eNb[0]->rx_total_gain_eNB_dB = rx_gain[0];
}
#ifndef PBS_SIM
printf("rx_pwr_pre[%d] (RF in) %f dB for slot %d (subframe %d)\n",0,10*log10(rx_pwr_pre[0]),next_slot,next_slot>>1);
#endif //PBS_SIM
#ifndef SKIP_RF_RX
rf_rx(r_re,
r_im,
NULL,
NULL,
0,
PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_rx,
lte_frame_parms->samples_per_tti>>1,
1.0/7.68e6 * 1e9, // sampling time (ns)
2, // freq offset (Hz) (-20kHz..20kHz)
0.0, // drift (Hz) NOT YET IMPLEMENTED
nf, // noise_figure NOT YET IMPLEMENTED
(double)rx_gain[0]-66.227, // rx_gain (dB)
200, // IP3_dBm (dBm)
&ip, // initial phase
30.0e3, // pn_cutoff (kHz)
-500.0, // pn_amp (dBc) default: 50
0.0, // IQ imbalance (dB),
0.0); // IQ phase imbalance (rad)
#else //SKIP_RF_RX
N0W = pow(10.0,.1*(-174.0 - 10*log10((1.0/7.68e6 * 1e9)*1e-9)));
rx_gain_lin = pow(10.0,.05*((double)rx_gain[0]-66.227));
for (aa=0; aa<PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_rx; aa++) {
for (i=0; i<PHY_vars_eNb[0]->lte_frame_parms.samples_per_tti>>1; i++) {
r_re[aa][i] = rx_gain_lin*(r_re[aa][i] + (sqrt(.5*N0W)*gaussdouble(0.0,1.0)));
r_im[aa][i] = rx_gain_lin*(r_im[aa][i] + (sqrt(.5*N0W)*gaussdouble(0.0,1.0)));
}
}
#endif //SKIP_RF_RX
if ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_DL) || ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_S) && (next_slot%2==0))) { // DL
#ifdef DISABLE_SECONDARY
rx_pwr = 6*signal_energy_fp(r_re,r_im,PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx,640,0); // RSs only on one of six when Secondary is disabled --> *6
#else //DISABLE_SECONDARY
rx_pwr = (6/2)*signal_energy_fp(r_re,r_im,PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx,640,0);
// RSs only on two of six when Secondary is enabled --> *6/2 (This would be based on the ZBF not working...)
#endif //DISABLE_SECONDARY
} else { // UL
if (next_slot%2==0)
rx_pwr = signal_energy_fp(r_re,r_im,PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx,640*2,640*3);
else
rx_pwr = 2*signal_energy_fp(r_re,r_im,PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx,640,640*5); // SRSs only on every second --> *2
}
#ifndef PBS_SIM
printf("rx_pwr Primary (ADC in) %f dB for slot %d (subframe %d)\n",10*log10(rx_pwr),next_slot,next_slot>>1);
rx_pwr = signal_energy_fp(r_re,r_im,PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_rx,(lte_frame_parms->ofdm_symbol_size+lte_frame_parms->nb_prefix_samples),
2*(lte_frame_parms->ofdm_symbol_size+lte_frame_parms->nb_prefix_samples));
#endif //PBS_SIM
#ifdef SECONDARY_SYSTEM
for (j=0; j<2; j++) {
if ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_DL) || ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_S) && (next_slot%2==0))) { // DL
rx_pwr_pre[j+1] = (6/2)*signal_energy_fp(r_re_ext[j],r_im_ext[j],1,640,0); // RSs only on every sixth --> *6
if (j==0)
rx_pwr_pre[j+1] += (6/2)*signal_energy_fp(&r_re_ext[j][1],&r_im_ext[j][1],1,640,0); // RSs only on every third --> *6
rx_gain[j+1] = target_rx_pwr_dB - 10*log10(rx_pwr_pre[j+1]) + 3 + 10; // gain should be per antenna, compensate by 3dB
PHY_vars_UE[j+1]->rx_total_gain_dB = rx_gain[j+1];
} else { // UL
if (next_slot%2==0) {
rx_pwr_pre[j+1] = signal_energy_fp(r_re_ext[j],r_im_ext[j],1,640*2,640*3);
if (j==0)
rx_pwr_pre[j+1] += signal_energy_fp(&r_re_ext[j][1],&r_im_ext[j][1],1,640*2,640*3);
} else {
rx_pwr_pre[j+1] = 2*signal_energy_fp(r_re_ext[j],r_im_ext[j],1,640,640*5); // SRSs only on every second --> *2
if (j==0)
rx_pwr_pre[j+1] += 2*signal_energy_fp(&r_re_ext[j][1],&r_im_ext[j][1],1,640,640*5); // SRSs only on every second --> *2
}
rx_gain[j+1] = target_rx_pwr_dB - 10*log10(rx_pwr_pre[j+1]) + 3 + 10; // gain should be per antenna, compensate by 3dB
PHY_vars_eNb[j+1]->rx_total_gain_eNB_dB = rx_gain[j+1];
}
#ifndef PBS_SIM
printf("rx_pwr_pre[%d] (RF in) %f dB for slot %d (subframe %d)\n",j+1,10*log10(rx_pwr_pre[j+1]),next_slot,next_slot>>1);
#endif //PBS_SIM
// RF model
#ifndef SKIP_RF_RX
rf_rx(r_re_ext[j],
r_im_ext[j],
NULL,
NULL,
0,
PHY_vars_eNb[j+1]->lte_frame_parms.nb_antennas_rx,
lte_frame_parms->samples_per_tti>>1,
1.0/7.68e6 * 1e9, // sampling time (ns)
2, // freq offset (Hz) (-20kHz..20kHz)
0.0, // drift (Hz) NOT YET IMPLEMENTED
nf, // noise_figure NOT YET IMPLEMENTED
(double)rx_gain[j+1]-66.227, // rx_gain (dB)
200, // IP3_dBm (dBm)
&ip, // initial phase
30.0e3, // pn_cutoff (kHz)
-500.0, // pn_amp (dBc) default: 50
0.0, // IQ imbalance (dB),
0.0); // IQ phase imbalance (rad)
#else //SKIP_RF_RX
N0W = pow(10.0,.1*(-174.0 - 10*log10((1.0/7.68e6 * 1e9)*1e-9)));
rx_gain_lin = pow(10.0,.05*((double)rx_gain[j+1]-66.227));
for (aa=0; aa<PHY_vars_eNb[j+1]->lte_frame_parms.nb_antennas_rx; aa++) {
for (i=0; i<PHY_vars_eNb[j+1]->lte_frame_parms.samples_per_tti>>1; i++) {
r_re_ext[j][aa][i] = rx_gain_lin*(r_re_ext[j][aa][i] + (sqrt(.5*N0W)*gaussdouble(0.0,1.0)));
r_im_ext[j][aa][i] = rx_gain_lin*(r_im_ext[j][aa][i] + (sqrt(.5*N0W)*gaussdouble(0.0,1.0)));
}
}
#endif //SKIP_RF_RX
#ifndef PBS_SIM
if (j==0) {
printf("Rx Gain Primary : %d (slot %d)\n",rx_gain[0],next_slot);
printf("Rx Gain Secondary : %d (slot %d)\n",rx_gain[1],next_slot);
}
#endif //PBS_SIM
if ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_DL) || ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_S) && (next_slot%2==0))) { // DL
rx_pwr_sec[j] = (6/2)*signal_energy_fp(r_re_ext[j],r_im_ext[j],1,640,0); // RSs only on every sixth --> *6
if (j==0)
rx_pwr_sec[j] += (6/2)*signal_energy_fp(&r_re_ext[j][1],&r_im_ext[j][1],1,640,0); // RSs only on every sixth --> *6
} else { // UL
if (next_slot%2==0) {
rx_pwr_sec[j] = signal_energy_fp(r_re_ext[j],r_im_ext[j],1,640*2,640*3);
if (j==0)
rx_pwr_sec[j] += signal_energy_fp(&r_re_ext[j][1],&r_im_ext[j][1],1,640*2,640*3);
} else {
rx_pwr_sec[j] = 2*signal_energy_fp(r_re_ext[j],r_im_ext[j],1,640,640*5); // SRSs only on every second --> *2
if (j==0)
rx_pwr_sec[j] += 2*signal_energy_fp(&r_re_ext[j][1],&r_im_ext[j][1],1,640,640*5); // SRSs only on every second --> *2
}
}
#ifndef PBS_SIM
if (j==0)
printf("rx_pwr Secondary (ADC in) %f dB for slot %d (subframe %d)\n",10*log10(rx_pwr_sec[j]),next_slot,next_slot>>1);
#endif //PBS_SIM
} //loop over secondary transmission simulations
#endif //SECONDARY_SYSTEM
/*-------------------------------------------------------------
A/D CONVERSION
(QUANTIZATION)
---------------------------------------------------------------*/
adc(r_re,
r_im,
0,
slot_offset_time,
rxdata,
PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_rx,
lte_frame_parms->samples_per_tti>>1,
12);
if ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_DL) || ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_S) && (next_slot%2==0))) { // DL
#ifdef DISABLE_SECONDARY
rx_pwr2 = 6*signal_energy(rxdata[0]+slot_offset_time,640); // RSs only on one of three when Secondary is disabled --> *3
#else //DISABLE_SECONDARY
rx_pwr2 = (6/2)*signal_energy(rxdata[0]+slot_offset_time,640);
// RSs only on two of three when Secondary is enabled --> *3/2 (This would be based on the ZBF not working...)
#endif //DISABLE_SECONDARY
} else { // UL
if (next_slot%2==0)
rx_pwr2 = signal_energy(rxdata[0]+slot_offset_time+640*3,640*2);
else
rx_pwr2 = 2*signal_energy(rxdata[0]+slot_offset_time+5*(lte_frame_parms->samples_per_tti>>1)/6,640); // SRSs only on every second --> *2
}
#ifndef PBS_SIM
printf("rx_pwr Primary (ADC out) %f dB (%d) for slot %d (subframe %d)\n",10*log10((double)rx_pwr2),rx_pwr2,next_slot,next_slot>>1);
#endif //PBS_SIM
if (next_slot == 12)
printf("rx_pwr Primary (ADC out) %f dB (%d) for slot %d (subframe %d)\n",10*log10((double)rx_pwr2),rx_pwr2,next_slot,next_slot>>1);
#ifdef SECONDARY_SYSTEM
for (j=0; j<2; j++) {
adc(r_re_ext[j],
r_im_ext[j],
0,
slot_offset_time,
rxdata_ext[j],
PHY_vars_eNb[j+1]->lte_frame_parms.nb_antennas_rx,
lte_frame_parms->samples_per_tti>>1,
12);
if ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_DL) || ((subframe_select_tdd(lte_frame_parms->tdd_config,next_slot>>1) == SF_S) && (next_slot%2==0))) { // DL
rx_pwr2 = (6/2)*signal_energy(rxdata_ext[j][0]+slot_offset_time,640);
} else { // UL
if (next_slot%2==0)
rx_pwr2 = signal_energy(rxdata_ext[j][0]+slot_offset_time+640*3,640*2);
else
rx_pwr2 = 2*signal_energy(rxdata_ext[j][0]+slot_offset_time+5*(lte_frame_parms->samples_per_tti>>1)/6,640); // SRSs only on every second --> *2
}
#ifndef PBS_SIM
if (j==0)
printf("rx_pwr Secondary (ADC out) %f dB (%d) for slot %d (subframe %d)\n",10*log10((double)rx_pwr2),rx_pwr2,next_slot,next_slot>>1);
#endif //PBS_SIM
}
#endif //SECONDARY_SYSTEM
#endif //SKIP_RF_CHAIN
if (plot_flag) {
if (next_slot == 19) {
write_output("UE_rxsig0.m","UE_rxs0", PHY_vars_UE[0]->lte_ue_common_vars.rxdata[0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
if (PHY_vars_UE[0]->lte_frame_parms.nb_antennas_rx == 2)
write_output("UE_rxsig0.m","UE_rxs0", PHY_vars_UE[0]->lte_ue_common_vars.rxdata[0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
write_output("eNb_rxsig0.m","eNb_rxs0", PHY_vars_eNb[0]->lte_eNB_common_vars.rxdata[eNb_id][0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
if (PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_rx == 2)
write_output("eNb_rxsig1.m","eNb_rxs1", PHY_vars_eNb[0]->lte_eNB_common_vars.rxdata[eNb_id][1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
write_output("UE_txsig0.m","UE_txs0", PHY_vars_UE[0]->lte_ue_common_vars.txdata[0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
if (PHY_vars_UE[0]->lte_frame_parms.nb_antennas_tx == 2)
write_output("UE_txsig1.m","UE_txs1", PHY_vars_UE[0]->lte_ue_common_vars.txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
write_output("eNb_txsig0.m","eNb_txs0", PHY_vars_eNb[0]->lte_eNB_common_vars.txdata[eNb_id][0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
if (PHY_vars_eNb[0]->lte_frame_parms.nb_antennas_tx == 2)
write_output("eNb_txsig1.m","eNb_txs1", PHY_vars_eNb[0]->lte_eNB_common_vars.txdata[eNb_id][1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
}
#ifdef SECONDARY_SYSTEM
if (next_slot == 19) {
write_output("UE_rxsig0_1.m","UE_rxs0_1", PHY_vars_UE[1]->lte_ue_common_vars.rxdata[0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
write_output("UE_rxsig1_1.m","UE_rxs1_1", PHY_vars_UE[1]->lte_ue_common_vars.rxdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
write_output("UE_rxsig0_2.m","UE_rxs0_2", PHY_vars_UE[2]->lte_ue_common_vars.rxdata[0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
if (PHY_vars_UE[2]->lte_frame_parms.nb_antennas_rx == 2)
write_output("UE_rxsig1_2.m","UE_rxs1_2", PHY_vars_UE[2]->lte_ue_common_vars.rxdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
write_output("eNb_rxsig0_1.m","eNb_rxs0_1", PHY_vars_eNb[1]->lte_eNB_common_vars.rxdata[eNb_id_secsys][0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
write_output("eNb_rxsig1_1.m","eNb_rxs1_1", PHY_vars_eNb[1]->lte_eNB_common_vars.rxdata[eNb_id_secsys][1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
write_output("eNb_rxsig0_2.m","eNb_rxs0_2", PHY_vars_eNb[2]->lte_eNB_common_vars.rxdata[eNb_id][0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
if (PHY_vars_eNb[2]->lte_frame_parms.nb_antennas_rx == 2)
write_output("eNb_rxsig1_2.m","eNb_rxs1_2", PHY_vars_eNb[2]->lte_eNB_common_vars.rxdata[eNb_id][1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
write_output("UE_txsig0_1.m","UE_txs0_1", PHY_vars_UE[1]->lte_ue_common_vars.txdata[0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
write_output("UE_txsig1_1.m","UE_txs1_1", PHY_vars_UE[1]->lte_ue_common_vars.txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
write_output("eNb_txsig0_1.m","eNb_txs0_1", PHY_vars_eNb[1]->lte_eNB_common_vars.txdata[eNb_id_secsys][0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
write_output("eNb_txsig1_1.m","eNb_txs1_1", PHY_vars_eNb[1]->lte_eNB_common_vars.txdata[eNb_id_secsys][1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
write_output("eNb_txsigF0_1.m","eNb_txsF0_1", PHY_vars_eNb[1]->lte_eNB_common_vars.txdataF[eNb_id_secsys][0],lte_frame_parms->ofdm_symbol_size*lte_frame_parms->symbols_per_tti*10,1,1);
write_output("eNb_txsigF1_1.m","eNb_txsF1_1", PHY_vars_eNb[1]->lte_eNB_common_vars.txdataF[eNb_id_secsys][1],lte_frame_parms->ofdm_symbol_size*lte_frame_parms->symbols_per_tti*10,1,1);
write_output("eNb_txsigF0.m","eNb_txsF0", PHY_vars_eNb[0]->lte_eNB_common_vars.txdataF[eNb_id_secsys][0],lte_frame_parms->ofdm_symbol_size*lte_frame_parms->symbols_per_tti*10,1,1);
if (PHY_vars_UE[2]->lte_frame_parms.nb_antennas_tx == 2)
write_output("eNb_txsigF1.m","eNb_txsF1", PHY_vars_eNb[0]->lte_eNB_common_vars.txdataF[eNb_id_secsys][1],lte_frame_parms->ofdm_symbol_size*lte_frame_parms->symbols_per_tti*10,1,1);
}
#endif //SECONDARY_SYSTEM
} // if(plot_flag)
/*
// optional: read rx_frame from file
if ((rx_frame_file = fopen("rx_frame.dat","r")) == NULL)
{
printf("[openair][CHBCH_TEST][INFO] Cannot open rx_frame.m data file\n");
exit(0);
}
fclose(rx_frame_file);
*/
} //for(slot...
//#ifndef PBS_SIM
if ((mac_xface->frame%200 == 0) && (mac_xface->frame>=200)) {
printf("Primary rate: %f (at frame %d), %f (DCI)\n",
((double)(PHY_vars_UE[0]->dlsch_received - PHY_vars_UE[0]->dlsch_errors)/(mac_xface->frame+1)),
mac_xface->frame,
((double)(PHY_vars_UE[0]->lte_ue_pdcch_vars[eNb_id]->dci_received - PHY_vars_UE[0]->lte_ue_pdcch_vars[eNb_id]->dci_errors)/((mac_xface->frame+1))));
printf("Secondary rate: %f (at frame %d), %f (DCI)\n",
((double)(PHY_vars_UE[1]->dlsch_received - PHY_vars_UE[1]->dlsch_errors)/(mac_xface->frame+1)),
mac_xface->frame,
((double)(PHY_vars_UE[1]->lte_ue_pdcch_vars[eNb_id]->dci_received - PHY_vars_UE[1]->lte_ue_pdcch_vars[eNb_id]->dci_errors)/((mac_xface->frame+1))));
}
//#endif //PBS_SIM
if (((PHY_vars_UE[0]->lte_ue_pdcch_vars[eNb_id]->dci_received - PHY_vars_UE[0]->lte_ue_pdcch_vars[eNb_id]->dci_errors)<(mac_xface->frame*.0025) && (mac_xface->frame > 400))) {
mac_xface->frame++; // too bad, no need to try more frames
printf("Breaking (bad) before dumping, Frame %d, STxG %f, SNR %f\n", mac_xface->frame,STxGain,SNR);
break;
}
#ifndef DISABLE_SECONDARY
if ((PHY_vars_UE[1]->lte_ue_pdcch_vars[eNb_id]->dci_received - PHY_vars_UE[1]->lte_ue_pdcch_vars[eNb_id]->dci_errors)<(mac_xface->frame*.0025 && (mac_xface->frame > 400))) {
mac_xface->frame++; // too bad, no need to try more frames
printf("Breaking (bad) before dumping, Frame %d, STxG %f, SNR %f\n", mac_xface->frame,STxGain,SNR);
break;
}
#endif //DISABLE_SECONDARY
if (((PHY_vars_UE[0]->dlsch_received - PHY_vars_UE[0]->dlsch_errors)>(mac_xface->frame*.999) && (mac_xface->frame > 500))) {
#ifndef DISABLE_SECONDARY
if ((PHY_vars_UE[1]->dlsch_received - PHY_vars_UE[1]->dlsch_errors)>(mac_xface->frame*.999))
#endif //DISABLE_SECONDARY
{
mac_xface->frame++; // too good, no need to continu
printf("Breaking (good) before dumping, Frame %d, STxG %f, SNR %f\n", mac_xface->frame,STxGain,SNR);
break;
}
}
} //for(mac_xface->frame...
#ifdef PBS_SIM
for (j=0; j<2; j++) {
printf("Dumping data, Frame %d, STxG %f, SNR %f\n", mac_xface->frame,STxGain,SNR);
fprintf(er_data_fd,"er_data_fd(%i,%i,%i,:) = [%i,%i,%i,%i,%i,%f,%f];\n",stxg_ind,snr_ind,j+1,
PHY_vars_UE[j]->dlsch_errors,
PHY_vars_UE[j]->lte_ue_pdcch_vars[eNb_id]->dci_errors,
PHY_vars_UE[j]->dlsch_received,
PHY_vars_UE[j]->lte_ue_pdcch_vars[eNb_id]->dci_received,
mac_xface->frame,STxGain,SNR);
fprintf(turboIter_fd,"turboIter_fd(%i,%i,%i) = %i;\n",stxg_ind,snr_ind,j+1,PHY_vars_UE[j]->turbo_iterations);
}
// break if error rate is below threshold (if too early --> increase MCS)
#endif //PBS_SIM
} //for(stxg_ind...
} //for(snr_ind...
#ifdef CHANNEL_FROM_FILE
#ifdef SECONDARY_SYSTEM
if (!fopen(channel_output,"r")) {
channel_file = fopen(channel_output,"w");
if (channel_file) {
fprintf(channel_file,"%d\n",1);
for (aa=0; aa<6; aa++) { //loop over channel index
for (i=0; i<2; i++) {
for (j=0; j<2; j++) {
for (l=0; l<channel_length; l++) {
fprintf(channel_file,"%lf %lf\n",ch_ar[aa][i + j*2][l].r, ch_ar[aa][i + j*2][l].i);
}
}
}
}
fclose(channel_file);
}
}
#endif //SECONDARY_SYSTEM
#endif //CHANNEL_FROM_FILE
#ifdef PBS_SIM
fclose(turboIter_fd);
fclose(er_data_fd);
// fclose(er_cause_fd);
#endif //PBS_SIM
#ifdef IFFT_FPGA
free(txdataF2[0]);
free(txdataF2[1]);
free(txdataF2);
free(txdata[0]);
free(txdata[1]);
free(txdata);
#endif
for (i=0; i<2; i++) {
free(s_re[i]);
free(s_im[i]);
free(r_re[i]);
free(r_im[i]);
}
#ifdef SECONDARY_SYSTEM
for (i=0; i<2; i++) {
free(s_re_secsys[i]);
free(s_im_secsys[i]);
for (j=0; j<2; j++) {
free(r_re_ext[j][i]);
free(r_im_ext[j][i]);
}
free(r_re_ext[i]);
free(r_im_ext[i]);
}
for (l=0; l<6; l++) {
free(r_re_crossLink[l]);
free(r_im_crossLink[l]);
}
#endif //SECONDARY_SYSTEM
#ifndef SECONDARY_SYSTE
free(PHY_vars_eNb[0]);
free(PHY_vars_UE[0]);
#else //SECONDARY_SYSTEM
free(PHY_vars_eNb[0]);
free(PHY_vars_eNb[1]);
free(PHY_vars_UE[0]);
free(PHY_vars_UE[1]);
#endif
for (i = 0; i<4; i++)
free(ch[i]);
free(ch);
#ifdef SECONDARY_SYSTEM
for (l=0; l<6; l++) {
for (i = 0; i<4; i++)
free(ch_ar[l][i]);
free(ch_ar[l]);
}
#endif //SECONDARY_SYSTEM
lte_sync_time_free();
return(n_errors);
}