oaisim with interfaces for lte-ue/lte-enb threading compiles and runs.
This commit is contained in:
+225
-310
@@ -76,16 +76,21 @@ int first_rbUL ;
|
||||
extern Signal_buffers_t *signal_buffers_g;
|
||||
|
||||
|
||||
double r_re_DL[NUMBER_OF_UE_MAX][2][30720];
|
||||
double r_im_DL[NUMBER_OF_UE_MAX][2][30720];
|
||||
double r_re_UL[NUMBER_OF_eNB_MAX][2][30720];
|
||||
double r_im_UL[NUMBER_OF_eNB_MAX][2][30720];
|
||||
int eNB_output_mask[NUMBER_OF_UE_MAX];
|
||||
int UE_output_mask[NUMBER_OF_eNB_MAX];
|
||||
pthread_mutex_t eNB_output_mutex[NUMBER_OF_UE_MAX];
|
||||
pthread_mutex_t UE_output_mutex[NUMBER_OF_eNB_MAX];
|
||||
|
||||
void do_DL_sig(double **r_re0,double **r_im0,
|
||||
double **r_re,double **r_im,
|
||||
double **s_re,double **s_im,
|
||||
channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_NUM_CCs],
|
||||
node_desc_t *enb_data[NUMBER_OF_eNB_MAX],
|
||||
node_desc_t *ue_data[NUMBER_OF_UE_MAX],
|
||||
uint16_t next_slot,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t UE_id,
|
||||
int CC_id)
|
||||
void do_DL_sig(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_NUM_CCs],
|
||||
node_desc_t *enb_data[NUMBER_OF_eNB_MAX],
|
||||
node_desc_t *ue_data[NUMBER_OF_UE_MAX],
|
||||
uint16_t subframe,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t UE_id,
|
||||
int CC_id)
|
||||
{
|
||||
|
||||
int32_t att_eNB_id=-1;
|
||||
@@ -96,19 +101,20 @@ void do_DL_sig(double **r_re0,double **r_im0,
|
||||
double rx_pwr;
|
||||
int32_t rx_pwr2;
|
||||
uint32_t i,aa;
|
||||
uint32_t slot_offset,slot_offset_meas = 0;
|
||||
uint32_t sf_offset;
|
||||
|
||||
double min_path_loss=-200;
|
||||
uint8_t hold_channel=0;
|
||||
// uint8_t aatx,aarx;
|
||||
uint8_t nb_antennas_rx = eNB2UE[0][0][CC_id]->nb_rx; // number of rx antennas at UE
|
||||
uint8_t nb_antennas_tx = eNB2UE[0][0][CC_id]->nb_tx; // number of tx antennas at eNB
|
||||
|
||||
//LTE_DL_FRAME_PARMS *fp;
|
||||
// int subframe_sched = ((next_slot>>1) == 0) ? 9 : ((next_slot>>1)-1);
|
||||
double s_re[2][PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti];
|
||||
double s_im[2][PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti];
|
||||
double r_re0[2][PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti];
|
||||
double r_im0[2][PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti];
|
||||
|
||||
|
||||
|
||||
if (next_slot==0)
|
||||
if (subframe==0)
|
||||
hold_channel = 0;
|
||||
else
|
||||
hold_channel = 1;
|
||||
@@ -186,19 +192,6 @@ void do_DL_sig(double **r_re0,double **r_im0,
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
if(PHY_vars_UE_g[UE_id]->transmission_mode[att_eNB_id]>=5)
|
||||
{
|
||||
lte_ue_measurements(PHY_vars_UE_g[UE_id],
|
||||
((next_slot-1)>>1)*frame_parms->samples_per_tti,
|
||||
1,
|
||||
abstraction_flag);
|
||||
|
||||
PHY_vars_eNB_g[att_eNB_id]->dlsch_eNB[0][0]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE_g[UE_id]->PHY_measurements,0);
|
||||
// printf("pmi_alloc in channel sim: %d",PHY_vars_eNB_g[att_eNB_id]->dlsch_eNB[0][0]->pmi_alloc);
|
||||
}
|
||||
*/
|
||||
|
||||
// calculate the SNR for the attached eNB (this assumes eNB always uses PMI stored in eNB_UE_stats; to be improved)
|
||||
init_snr(eNB2UE[att_eNB_id][UE_id][CC_id], enb_data[att_eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id][CC_id]->sinr_dB, &PHY_vars_UE_g[UE_id][CC_id]->N0,
|
||||
PHY_vars_UE_g[UE_id][CC_id]->transmission_mode[att_eNB_id], PHY_vars_eNB_g[att_eNB_id][CC_id]->UE_stats[UE_id].DL_pmi_single,
|
||||
@@ -214,52 +207,44 @@ void do_DL_sig(double **r_re0,double **r_im0,
|
||||
}
|
||||
|
||||
else { //abstraction_flag
|
||||
/*
|
||||
Call do_OFDM_mod from phy_procedures_eNB_TX function
|
||||
*/
|
||||
|
||||
// printf("r_re[0] %p\n",r_re[0]);
|
||||
for (aa=0; aa<nb_antennas_rx; aa++) {
|
||||
memset((void*)r_re[aa],0,(frame_parms->samples_per_tti>>1)*sizeof(double));
|
||||
memset((void*)r_im[aa],0,(frame_parms->samples_per_tti>>1)*sizeof(double));
|
||||
|
||||
pthread_mutex_lock(&eNB_output_mutex[UE_id]);
|
||||
if (eNB_output_mask[UE_id] == 0) { // This is the first eNodeB for this UE, clear the buffer
|
||||
|
||||
for (aa=0; aa<nb_antennas_rx; aa++) {
|
||||
memset((void*)r_re_DL[UE_id][aa],0,(frame_parms->samples_per_tti)*sizeof(double));
|
||||
memset((void*)r_im_DL[UE_id][aa],0,(frame_parms->samples_per_tti)*sizeof(double));
|
||||
}
|
||||
}
|
||||
pthread_mutex_unlock(&eNB_output_mutex[UE_id]);
|
||||
|
||||
/*
|
||||
for (i=0;i<16;i++)
|
||||
printf("%f, %X\n",r_re[aa][i],(unsigned long long)r_re[aa][i]);
|
||||
*/
|
||||
for (eNB_id=0; eNB_id<NB_eNB_INST; eNB_id++) {
|
||||
// if (((double)PHY_vars_UE_g[UE_id]->tx_power_dBm +
|
||||
// eNB2UE[eNB_id][UE_id]->path_loss_dB) <= -107.0)
|
||||
// break;
|
||||
|
||||
txdata = PHY_vars_eNB_g[eNB_id][CC_id]->common_vars.txdata[0];
|
||||
slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1);
|
||||
slot_offset_meas = ((next_slot&1)==0) ? slot_offset : (slot_offset-(frame_parms->samples_per_tti>>1));
|
||||
tx_pwr = dac_fixed_gain(s_re,
|
||||
s_im,
|
||||
sf_offset = subframe*frame_parms->samples_per_tti;
|
||||
tx_pwr = dac_fixed_gain((double**)s_re,
|
||||
(double**)s_im,
|
||||
txdata,
|
||||
slot_offset,
|
||||
sf_offset,
|
||||
nb_antennas_tx,
|
||||
frame_parms->samples_per_tti>>1,
|
||||
slot_offset_meas,
|
||||
frame_parms->samples_per_tti,
|
||||
sf_offset,
|
||||
frame_parms->ofdm_symbol_size,
|
||||
14,
|
||||
// enb_data[eNB_id]->tx_power_dBm);
|
||||
frame_parms->pdsch_config_common.referenceSignalPower, // dBm/RE
|
||||
frame_parms->N_RB_DL*12);
|
||||
|
||||
#ifdef DEBUG_SIM
|
||||
LOG_D(OCM,"[SIM][DL] eNB %d (CCid %d): tx_pwr %.1f dBm/RE (target %d dBm/RE), for slot %d (subframe %d)\n",
|
||||
LOG_D(OCM,"[SIM][DL] eNB %d (CCid %d): tx_pwr %.1f dBm/RE (target %d dBm/RE), for subframe %d\n",
|
||||
eNB_id,CC_id,
|
||||
10*log10(tx_pwr),
|
||||
frame_parms->pdsch_config_common.referenceSignalPower,
|
||||
next_slot,
|
||||
next_slot>>1);
|
||||
subframe);
|
||||
|
||||
#endif
|
||||
//eNB2UE[eNB_id][UE_id]->path_loss_dB = 0;
|
||||
multipath_channel(eNB2UE[eNB_id][UE_id][CC_id],s_re,s_im,r_re0,r_im0,
|
||||
frame_parms->samples_per_tti>>1,hold_channel);
|
||||
multipath_channel(eNB2UE[eNB_id][UE_id][CC_id],(double**)s_re,(double**)s_im,(double**)r_re0,(double**)r_im0,
|
||||
frame_parms->samples_per_tti,hold_channel);
|
||||
#ifdef DEBUG_SIM
|
||||
rx_pwr = signal_energy_fp2(eNB2UE[eNB_id][UE_id][CC_id]->ch[0],
|
||||
eNB2UE[eNB_id][UE_id][CC_id]->channel_length)*eNB2UE[eNB_id][UE_id][CC_id]->channel_length;
|
||||
@@ -281,17 +266,17 @@ void do_DL_sig(double **r_re0,double **r_im0,
|
||||
eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB);
|
||||
|
||||
#ifdef DEBUG_SIM
|
||||
rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,
|
||||
rx_pwr = signal_energy_fp((double**)r_re0,(double**)r_im0,nb_antennas_rx,
|
||||
frame_parms->ofdm_symbol_size,
|
||||
slot_offset_meas)/(12.0*frame_parms->N_RB_DL);
|
||||
LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr %f dBm/RE (%f dBm RSSI)for slot %d (subframe %d)\n",UE_id,
|
||||
sf_offset)/(12.0*frame_parms->N_RB_DL);
|
||||
LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr %f dBm/RE (%f dBm RSSI)for subframe %d\n",UE_id,
|
||||
10*log10(rx_pwr),
|
||||
10*log10(rx_pwr*(double)frame_parms->N_RB_DL*12),next_slot,next_slot>>1);
|
||||
10*log10(rx_pwr*(double)frame_parms->N_RB_DL*12),subframe);
|
||||
LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr (noise) -132 dBm/RE (N0fs = %.1f dBm, N0B = %.1f dBm) for slot %d (subframe %d)\n",
|
||||
UE_id,
|
||||
10*log10(eNB2UE[eNB_id][UE_id][CC_id]->sampling_rate*1e6)-174,
|
||||
10*log10(eNB2UE[eNB_id][UE_id][CC_id]->sampling_rate*1e6*12*frame_parms->N_RB_DL/(double)frame_parms->ofdm_symbol_size)-174,
|
||||
next_slot,next_slot>>1);
|
||||
subframe);
|
||||
#endif
|
||||
|
||||
if (eNB2UE[eNB_id][UE_id][CC_id]->first_run == 1)
|
||||
@@ -300,96 +285,85 @@ void do_DL_sig(double **r_re0,double **r_im0,
|
||||
|
||||
// RF model
|
||||
#ifdef DEBUG_SIM
|
||||
LOG_D(OCM,"[SIM][DL] UE %d (CCid %d): rx_gain %d dB (-ADC %f) for slot %d (subframe %d)\n",UE_id,CC_id,PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB,
|
||||
PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB-66.227,next_slot,next_slot>>1);
|
||||
LOG_D(OCM,"[SIM][DL] UE %d (CCid %d): rx_gain %d dB (-ADC %f) for subframe %d\n",UE_id,CC_id,PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB,
|
||||
PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB-66.227,subframe);
|
||||
#endif
|
||||
/*
|
||||
rf_rx(r_re0,
|
||||
r_im0,
|
||||
NULL,
|
||||
NULL,
|
||||
0,
|
||||
nb_antennas_rx,
|
||||
frame_parms->samples_per_tti>>1,
|
||||
1e3/eNB2UE[eNB_id][UE_id]->BW, // sampling time (ns)
|
||||
0.0, // freq offset (Hz) (-20kHz..20kHz)
|
||||
0.0, // drift (Hz) NOT YET IMPLEMENTED
|
||||
ue_data[UE_id]->rx_noise_level, // noise_figure NOT YET IMPLEMENTED
|
||||
(double)PHY_vars_UE_g[UE_id]->rx_total_gain_dB - 66.227, // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
|
||||
200.0, // IP3_dBm (dBm)
|
||||
&eNB2UE[eNB_id][UE_id]->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)
|
||||
*/
|
||||
|
||||
rf_rx_simple(r_re0,
|
||||
r_im0,
|
||||
rf_rx_simple((double**)r_re0,
|
||||
(double**)r_im0,
|
||||
nb_antennas_rx,
|
||||
frame_parms->samples_per_tti>>1,
|
||||
frame_parms->samples_per_tti,
|
||||
1e3/eNB2UE[eNB_id][UE_id][CC_id]->sampling_rate, // sampling time (ns)
|
||||
(double)PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB - 66.227); // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
|
||||
|
||||
#ifdef DEBUG_SIM
|
||||
rx_pwr = signal_energy_fp(r_re0,r_im0,
|
||||
rx_pwr = signal_energy_fp((double**)r_re0,(double**)r_im0,
|
||||
nb_antennas_rx,
|
||||
frame_parms->ofdm_symbol_size,
|
||||
slot_offset_meas)/(12.0*frame_parms->N_RB_DL);
|
||||
LOG_D(OCM,"[SIM][DL] UE %d : ADC in (eNB %d) %f dBm/RE for slot %d (subframe %d)\n",
|
||||
sf_offset)/(12.0*frame_parms->N_RB_DL);
|
||||
LOG_D(OCM,"[SIM][DL] UE %d : ADC in (eNB %d) %f dBm/RE for subframe %d\n",
|
||||
UE_id,eNB_id,
|
||||
10*log10(rx_pwr),next_slot,next_slot>>1);
|
||||
10*log10(rx_pwr),subframe);
|
||||
#endif
|
||||
|
||||
for (i=0; i<(frame_parms->samples_per_tti>>1); i++) {
|
||||
|
||||
pthread_mutex_lock(&eNB_output_mutex[UE_id]);
|
||||
for (i=0; i<frame_parms->samples_per_tti; i++) {
|
||||
for (aa=0; aa<nb_antennas_rx; aa++) {
|
||||
r_re[aa][i]+=r_re0[aa][i];
|
||||
r_im[aa][i]+=r_im0[aa][i];
|
||||
r_re_DL[UE_id][aa][i]+=r_re0[aa][i];
|
||||
r_im_DL[UE_id][aa][i]+=r_im0[aa][i];
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
eNB_output_mask[UE_id] |= (1<<eNB_id);
|
||||
if (eNB_output_mask[UE_id] == (1<<NB_eNB_INST)-1) {
|
||||
eNB_output_mask[UE_id]=0;
|
||||
|
||||
|
||||
#ifdef DEBUG_SIM
|
||||
rx_pwr = signal_energy_fp(r_re,r_im,nb_antennas_rx,frame_parms->ofdm_symbol_size,slot_offset_meas)/(12.0*frame_parms->N_RB_DL);
|
||||
LOG_D(OCM,"[SIM][DL] UE %d : ADC in %f dBm for slot %d (subframe %d)\n",UE_id,10*log10(rx_pwr),next_slot,next_slot>>1);
|
||||
rx_pwr = signal_energy_fp((double**)r_re_DL[UE_id],(double**)r_im_DL[UE_id],nb_antennas_rx,frame_parms->ofdm_symbol_size,sf_offset)/(12.0*frame_parms->N_RB_DL);
|
||||
LOG_D(OCM,"[SIM][DL] UE %d : ADC in %f dBm for subframe %d\n",UE_id,10*log10(rx_pwr),subframe);
|
||||
#endif
|
||||
|
||||
rxdata = PHY_vars_UE_g[UE_id][CC_id]->common_vars.rxdata;
|
||||
slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1);
|
||||
|
||||
adc(r_re,
|
||||
r_im,
|
||||
0,
|
||||
slot_offset,
|
||||
rxdata,
|
||||
nb_antennas_rx,
|
||||
frame_parms->samples_per_tti>>1,
|
||||
12);
|
||||
|
||||
|
||||
rxdata = PHY_vars_UE_g[UE_id][CC_id]->common_vars.rxdata;
|
||||
sf_offset = subframe*frame_parms->samples_per_tti;
|
||||
|
||||
adc((double**)r_re_DL[UE_id],
|
||||
(double**)r_im_DL[UE_id],
|
||||
0,
|
||||
sf_offset,
|
||||
rxdata,
|
||||
nb_antennas_rx,
|
||||
frame_parms->samples_per_tti,
|
||||
12);
|
||||
|
||||
#ifdef DEBUG_SIM
|
||||
rx_pwr2 = signal_energy(rxdata[0]+slot_offset,frame_parms->ofdm_symbol_size)/(12.0*frame_parms->N_RB_DL);
|
||||
LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr (ADC out) %f dB/RE (%d) for slot %d (subframe %d), writing to %p\n",UE_id, 10*log10((double)rx_pwr2),rx_pwr2,next_slot,next_slot>>1,rxdata);
|
||||
rx_pwr2 = signal_energy(rxdata[0]+sf_offset,frame_parms->ofdm_symbol_size)/(12.0*frame_parms->N_RB_DL);
|
||||
LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr (ADC out) %f dB/RE (%d) for subframe %d, writing to %p\n",UE_id, 10*log10((double)rx_pwr2),rx_pwr2,subframe,rxdata);
|
||||
#else
|
||||
UNUSED_VARIABLE(rx_pwr2);
|
||||
UNUSED_VARIABLE(tx_pwr);
|
||||
UNUSED_VARIABLE(rx_pwr);
|
||||
UNUSED_VARIABLE(rx_pwr2);
|
||||
UNUSED_VARIABLE(tx_pwr);
|
||||
UNUSED_VARIABLE(rx_pwr);
|
||||
#endif
|
||||
//}// UE_index loop
|
||||
|
||||
} // eNB_output_mask
|
||||
pthread_mutex_unlock(&eNB_output_mutex[UE_id]);
|
||||
} // eNB_id
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_NUM_CCs],
|
||||
node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],uint16_t next_slot,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms, uint32_t frame,uint8_t CC_id)
|
||||
void do_UL_sig(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_NUM_CCs],
|
||||
node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],
|
||||
uint16_t subframe,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint32_t frame,int eNB_id,uint8_t CC_id)
|
||||
{
|
||||
|
||||
int32_t **txdata,**rxdata;
|
||||
#ifdef PHY_ABSTRACTION_UL
|
||||
int32_t att_eNB_id=-1;
|
||||
#endif
|
||||
uint8_t eNB_id=0,UE_id=0;
|
||||
uint8_t UE_id=0;
|
||||
|
||||
uint8_t nb_antennas_rx = UE2eNB[0][0][CC_id]->nb_rx; // number of rx antennas at eNB
|
||||
uint8_t nb_antennas_tx = UE2eNB[0][0][CC_id]->nb_tx; // number of tx antennas at UE
|
||||
@@ -397,7 +371,7 @@ void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double
|
||||
double tx_pwr, rx_pwr;
|
||||
int32_t rx_pwr2;
|
||||
uint32_t i,aa;
|
||||
uint32_t slot_offset,slot_offset_meas;
|
||||
uint32_t sf_offset;
|
||||
|
||||
uint8_t hold_channel=0;
|
||||
|
||||
@@ -408,192 +382,149 @@ void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double
|
||||
int ulnbrb2 ;
|
||||
int ulfrrb2 ;
|
||||
uint8_t harq_pid;
|
||||
int subframe = (next_slot>>1);
|
||||
#endif
|
||||
|
||||
/*
|
||||
if (next_slot==4)
|
||||
hold_channel = 0;
|
||||
else
|
||||
hold_channel = 1;
|
||||
*/
|
||||
double s_re[2][PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti];
|
||||
double s_im[2][PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti];
|
||||
double r_re0[2][PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti];
|
||||
double r_im0[2][PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti];
|
||||
|
||||
if (abstraction_flag!=0) {
|
||||
#ifdef PHY_ABSTRACTION_UL
|
||||
|
||||
for (eNB_id=0; eNB_id<NB_eNB_INST; eNB_id++) {
|
||||
for (UE_id=0; UE_id<NB_UE_INST; UE_id++) {
|
||||
if (!hold_channel) {
|
||||
random_channel(UE2eNB[UE_id][eNB_id][CC_id],abstraction_flag);
|
||||
freq_channel(UE2eNB[UE_id][eNB_id][CC_id], frame_parms->N_RB_UL,frame_parms->N_RB_UL*12+1);
|
||||
|
||||
// REceived power at the eNB
|
||||
rx_pwr = signal_energy_fp2(UE2eNB[UE_id][eNB_id][CC_id]->ch[0],
|
||||
UE2eNB[UE_id][eNB_id][CC_id]->channel_length)*UE2eNB[UE_id][att_eNB_id][CC_id]->channel_length; // calculate the rx power at the eNB
|
||||
}
|
||||
|
||||
// write_output("SINRch.m","SINRch",PHY_vars_eNB_g[att_eNB_id]->sinr_dB_eNB,frame_parms->N_RB_UL*12+1,1,1);
|
||||
if(subframe>1 && subframe <5) {
|
||||
harq_pid = subframe2harq_pid(frame_parms,frame,subframe);
|
||||
ul_nb_rb = PHY_vars_eNB_g[att_eNB_id][CC_id]->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->nb_rb;
|
||||
ul_fr_rb = PHY_vars_eNB_g[att_eNB_id][CC_id]->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->first_rb;
|
||||
}
|
||||
|
||||
if(ul_nb_rb>1 && (ul_fr_rb < 25 && ul_fr_rb > -1)) {
|
||||
number_rb_ul = ul_nb_rb;
|
||||
first_rbUL = ul_fr_rb;
|
||||
init_snr_up(UE2eNB[UE_id][att_eNB_id][CC_id],enb_data[att_eNB_id], ue_data[UE_id],PHY_vars_eNB_g[att_eNB_id][CC_id]->sinr_dB,&PHY_vars_UE_g[att_eNB_id][CC_id]->N0,ul_nb_rb,ul_fr_rb);
|
||||
|
||||
}
|
||||
} //UE_id
|
||||
} //eNB_id
|
||||
for (UE_id=0; UE_id<NB_UE_INST; UE_id++) {
|
||||
if (!hold_channel) {
|
||||
random_channel(UE2eNB[UE_id][eNB_id][CC_id],abstraction_flag);
|
||||
freq_channel(UE2eNB[UE_id][eNB_id][CC_id], frame_parms->N_RB_UL,frame_parms->N_RB_UL*12+1);
|
||||
|
||||
// REceived power at the eNB
|
||||
rx_pwr = signal_energy_fp2(UE2eNB[UE_id][eNB_id][CC_id]->ch[0],
|
||||
UE2eNB[UE_id][eNB_id][CC_id]->channel_length)*UE2eNB[UE_id][att_eNB_id][CC_id]->channel_length; // calculate the rx power at the eNB
|
||||
}
|
||||
|
||||
// write_output("SINRch.m","SINRch",PHY_vars_eNB_g[att_eNB_id]->sinr_dB_eNB,frame_parms->N_RB_UL*12+1,1,1);
|
||||
if(subframe>1 && subframe <5) {
|
||||
harq_pid = subframe2harq_pid(frame_parms,frame,subframe);
|
||||
ul_nb_rb = PHY_vars_eNB_g[att_eNB_id][CC_id]->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->nb_rb;
|
||||
ul_fr_rb = PHY_vars_eNB_g[att_eNB_id][CC_id]->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->first_rb;
|
||||
}
|
||||
|
||||
if(ul_nb_rb>1 && (ul_fr_rb < 25 && ul_fr_rb > -1)) {
|
||||
number_rb_ul = ul_nb_rb;
|
||||
first_rbUL = ul_fr_rb;
|
||||
init_snr_up(UE2eNB[UE_id][att_eNB_id][CC_id],enb_data[att_eNB_id], ue_data[UE_id],PHY_vars_eNB_g[att_eNB_id][CC_id]->sinr_dB,&PHY_vars_UE_g[att_eNB_id][CC_id]->N0,ul_nb_rb,ul_fr_rb);
|
||||
|
||||
}
|
||||
} //UE_id
|
||||
|
||||
#else
|
||||
/* the following functions are not needed */
|
||||
/*
|
||||
if (abstraction_flag!=0) {
|
||||
for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) {
|
||||
for (UE_id=0;UE_id<NB_UE_INST;UE_id++) {
|
||||
random_channel(UE2eNB[UE_id][eNB_id]);
|
||||
freq_channel(UE2eNB[UE_id][eNB_id], frame_parms->N_RB_UL,2);
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
#endif
|
||||
} else { //without abstraction
|
||||
|
||||
for (eNB_id=0; eNB_id<NB_eNB_INST; eNB_id++) {
|
||||
// Clear RX signal for eNB = eNB_id
|
||||
for (i=0; i<(frame_parms->samples_per_tti>>1); i++) {
|
||||
for (aa=0; aa<nb_antennas_rx; aa++) {
|
||||
r_re[aa][i]=0.0;
|
||||
r_im[aa][i]=0.0;
|
||||
}
|
||||
pthread_mutex_lock(&UE_output_mutex[eNB_id]);
|
||||
// Clear RX signal for eNB = eNB_id
|
||||
for (i=0; i<frame_parms->samples_per_tti; i++) {
|
||||
for (aa=0; aa<nb_antennas_rx; aa++) {
|
||||
r_re_UL[eNB_id][aa][i]=0.0;
|
||||
r_im_UL[eNB_id][aa][i]=0.0;
|
||||
}
|
||||
}
|
||||
pthread_mutex_unlock(&UE_output_mutex[eNB_id]);
|
||||
|
||||
// Compute RX signal for eNB = eNB_id
|
||||
for (UE_id=0; UE_id<NB_UE_INST; UE_id++) {
|
||||
// Compute RX signal for eNB = eNB_id
|
||||
for (UE_id=0; UE_id<NB_UE_INST; UE_id++) {
|
||||
|
||||
txdata = PHY_vars_UE_g[UE_id][CC_id]->common_vars.txdata;
|
||||
sf_offset = subframe*frame_parms->samples_per_tti;
|
||||
|
||||
if (((double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm +
|
||||
UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB) <= -125.0) {
|
||||
// don't simulate a UE that is too weak
|
||||
} else {
|
||||
|
||||
tx_pwr = dac_fixed_gain((double**)s_re,
|
||||
(double**)s_im,
|
||||
txdata,
|
||||
sf_offset,
|
||||
nb_antennas_tx,
|
||||
frame_parms->samples_per_tti,
|
||||
sf_offset,
|
||||
frame_parms->ofdm_symbol_size,
|
||||
14,
|
||||
(double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm-10*log10((double)PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE),
|
||||
PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE); // This make the previous argument the total power
|
||||
LOG_D(OCM,"[SIM][UL] UE %d tx_pwr %f dBm (target %d dBm, num_RE %d) for subframe %d (sf_offset %d)\n",
|
||||
UE_id,
|
||||
10*log10(tx_pwr),
|
||||
PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm,
|
||||
PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE,
|
||||
subframe,sf_offset);
|
||||
|
||||
|
||||
multipath_channel(UE2eNB[UE_id][eNB_id][CC_id],(double**)s_re,(double**)s_im,(double**)r_re0,(double**)r_im0,
|
||||
frame_parms->samples_per_tti,hold_channel);
|
||||
|
||||
|
||||
txdata = PHY_vars_UE_g[UE_id][CC_id]->common_vars.txdata;
|
||||
slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1);
|
||||
slot_offset_meas = ((next_slot&1)==0) ? slot_offset : (slot_offset-(frame_parms->samples_per_tti>>1));
|
||||
rx_pwr = signal_energy_fp2(UE2eNB[UE_id][eNB_id][CC_id]->ch[0],
|
||||
UE2eNB[UE_id][eNB_id][CC_id]->channel_length)*UE2eNB[UE_id][eNB_id][CC_id]->channel_length;
|
||||
|
||||
if (((double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm +
|
||||
UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB) <= -125.0) {
|
||||
|
||||
// don't simulate a UE that is too weak
|
||||
} else {
|
||||
|
||||
tx_pwr = dac_fixed_gain(s_re,
|
||||
s_im,
|
||||
txdata,
|
||||
slot_offset,
|
||||
nb_antennas_tx,
|
||||
frame_parms->samples_per_tti>>1,
|
||||
slot_offset_meas,
|
||||
frame_parms->ofdm_symbol_size,
|
||||
14,
|
||||
(double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm-10*log10((double)PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE),
|
||||
PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE); // This make the previous argument the total power
|
||||
//ue_data[UE_id]->tx_power_dBm);
|
||||
//#ifdef DEBUG_SIM
|
||||
LOG_D(OCM,"[SIM][UL] UE %d tx_pwr %f dBm (target %d dBm, num_RE %d) for slot %d (subframe %d, slot_offset %d, slot_offset_meas %d)\n",
|
||||
UE_id,
|
||||
10*log10(tx_pwr),
|
||||
PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm,
|
||||
PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE,
|
||||
next_slot,next_slot>>1,slot_offset,slot_offset_meas);
|
||||
//#endif
|
||||
|
||||
multipath_channel(UE2eNB[UE_id][eNB_id][CC_id],s_re,s_im,r_re0,r_im0,
|
||||
frame_parms->samples_per_tti>>1,hold_channel);
|
||||
|
||||
//#ifdef DEBUG_SIM
|
||||
rx_pwr = signal_energy_fp2(UE2eNB[UE_id][eNB_id][CC_id]->ch[0],
|
||||
UE2eNB[UE_id][eNB_id][CC_id]->channel_length)*UE2eNB[UE_id][eNB_id][CC_id]->channel_length;
|
||||
LOG_D(OCM,"[SIM][UL] slot %d Channel UE %d => eNB %d : %f dB (hold %d,length %d, PL %f)\n",next_slot,UE_id,eNB_id,10*log10(rx_pwr),
|
||||
hold_channel,UE2eNB[UE_id][eNB_id][CC_id]->channel_length,
|
||||
UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB);
|
||||
//#endif
|
||||
|
||||
//#ifdef DEBUG_SIM
|
||||
rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
|
||||
LOG_D(OCM,"[SIM][UL] eNB %d : rx_pwr %f dBm (%f) for slot %d (subframe %d), sptti %d\n",
|
||||
eNB_id,10*log10(rx_pwr),rx_pwr,next_slot,next_slot>>1,frame_parms->samples_per_tti);
|
||||
//#endif
|
||||
|
||||
|
||||
if (UE2eNB[UE_id][eNB_id][CC_id]->first_run == 1)
|
||||
UE2eNB[UE_id][eNB_id][CC_id]->first_run = 0;
|
||||
|
||||
|
||||
|
||||
for (aa=0; aa<nb_antennas_rx; aa++) {
|
||||
for (i=0; i<(frame_parms->samples_per_tti>>1); i++) {
|
||||
r_re[aa][i]+=r_re0[aa][i];
|
||||
r_im[aa][i]+=r_im0[aa][i];
|
||||
}
|
||||
}
|
||||
}
|
||||
} //UE_id
|
||||
|
||||
// RF model
|
||||
/*
|
||||
rf_rx(r_re0,
|
||||
r_im0,
|
||||
NULL,
|
||||
NULL,
|
||||
0,
|
||||
frame_parms->nb_antennas_rx,
|
||||
frame_parms->samples_per_tti>>1,
|
||||
1e3/UE2eNB[UE_id][eNB_id]->BW, // sampling time (ns)
|
||||
0.0, // freq offset (Hz) (-20kHz..20kHz)
|
||||
0.0, // drift (Hz) NOT YET IMPLEMENTED
|
||||
enb_data[eNB_id]->rx_noise_level, // noise_figure NOT YET IMPLEMENTED
|
||||
(double)PHY_vars_eNB_g[eNB_id]->rx_total_gain_eNB_dB - 66.227, // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
|
||||
200.0, // IP3_dBm (dBm)
|
||||
&UE2eNB[UE_id][eNB_id]->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)
|
||||
*/
|
||||
|
||||
rf_rx_simple(r_re,
|
||||
r_im,
|
||||
nb_antennas_rx,
|
||||
frame_parms->samples_per_tti>>1,
|
||||
1e3/UE2eNB[0][eNB_id][CC_id]->sampling_rate, // sampling time (ns)
|
||||
(double)PHY_vars_eNB_g[eNB_id][CC_id]->rx_total_gain_dB - 66.227); // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
|
||||
LOG_D(OCM,"[SIM][UL] subframe %d Channel UE %d => eNB %d : %f dB (hold %d,length %d, PL %f)\n",subframe,UE_id,eNB_id,10*log10(rx_pwr),
|
||||
hold_channel,UE2eNB[UE_id][eNB_id][CC_id]->channel_length,
|
||||
UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB);
|
||||
|
||||
rx_pwr = signal_energy_fp((double**)r_re0,(double**)r_im0,nb_antennas_rx,frame_parms->samples_per_tti,0);
|
||||
LOG_D(OCM,"[SIM][UL] eNB %d : rx_pwr %f dBm (%f) for subframe %d, sptti %d\n",
|
||||
eNB_id,10*log10(rx_pwr),rx_pwr,subframe,frame_parms->samples_per_tti);
|
||||
|
||||
|
||||
if (UE2eNB[UE_id][eNB_id][CC_id]->first_run == 1)
|
||||
UE2eNB[UE_id][eNB_id][CC_id]->first_run = 0;
|
||||
|
||||
|
||||
pthread_mutex_lock(&UE_output_mutex[eNB_id]);
|
||||
for (aa=0; aa<nb_antennas_rx; aa++) {
|
||||
for (i=0; i<frame_parms->samples_per_tti; i++) {
|
||||
r_re_UL[eNB_id][aa][i]+=r_re0[aa][i];
|
||||
r_im_UL[eNB_id][aa][i]+=r_im0[aa][i];
|
||||
}
|
||||
}
|
||||
pthread_mutex_unlock(&UE_output_mutex[eNB_id]);
|
||||
}
|
||||
} //UE_id
|
||||
|
||||
rf_rx_simple((double**)r_re_UL[eNB_id],
|
||||
(double**)r_im_UL[eNB_id],
|
||||
nb_antennas_rx,
|
||||
frame_parms->samples_per_tti,
|
||||
1e3/UE2eNB[0][eNB_id][CC_id]->sampling_rate, // sampling time (ns)
|
||||
(double)PHY_vars_eNB_g[eNB_id][CC_id]->rx_total_gain_dB - 66.227); // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
|
||||
|
||||
#ifdef DEBUG_SIM
|
||||
rx_pwr = signal_energy_fp(r_re,r_im,nb_antennas_rx,frame_parms->samples_per_tti>>1,0)*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL);
|
||||
LOG_D(OCM,"[SIM][UL] rx_pwr (ADC in) %f dB for slot %d (subframe %d)\n",10*log10(rx_pwr),next_slot,next_slot>>1);
|
||||
rx_pwr = signal_energy_fp((double**)r_re_UL[eNB_id],(double**)r_im_UL[eNB_id],nb_antennas_rx,frame_parms->samples_per_tti,0)*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL);
|
||||
LOG_D(OCM,"[SIM][UL] rx_pwr (ADC in) %f dB for subframe %d\n",10*log10(rx_pwr),subframe);
|
||||
#endif
|
||||
|
||||
rxdata = PHY_vars_eNB_g[eNB_id][CC_id]->common_vars.rxdata[0];
|
||||
slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1);
|
||||
|
||||
adc(r_re,
|
||||
r_im,
|
||||
0,
|
||||
slot_offset,
|
||||
rxdata,
|
||||
nb_antennas_rx,
|
||||
frame_parms->samples_per_tti>>1,
|
||||
12);
|
||||
|
||||
|
||||
rxdata = PHY_vars_eNB_g[eNB_id][CC_id]->common_vars.rxdata[0];
|
||||
sf_offset = subframe*frame_parms->samples_per_tti;
|
||||
|
||||
adc((double**)r_re_UL[eNB_id],
|
||||
(double**)r_im_UL[eNB_id],
|
||||
0,
|
||||
sf_offset,
|
||||
rxdata,
|
||||
nb_antennas_rx,
|
||||
frame_parms->samples_per_tti,
|
||||
12);
|
||||
|
||||
#ifdef DEBUG_SIM
|
||||
rx_pwr2 = signal_energy(rxdata[0]+slot_offset,frame_parms->samples_per_tti>>1)*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL);
|
||||
LOG_D(OCM,"[SIM][UL] eNB %d rx_pwr (ADC out) %f dB (%d) for slot %d (subframe %d)\n",eNB_id,10*log10((double)rx_pwr2),rx_pwr2,next_slot,next_slot>>1);
|
||||
rx_pwr2 = signal_energy(rxdata[0]+sf_offset,frame_parms->samples_per_tti)*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL);
|
||||
LOG_D(OCM,"[SIM][UL] eNB %d rx_pwr (ADC out) %f dB (%d) for subframe %d\n",eNB_id,10*log10((double)rx_pwr2),rx_pwr2,subframe);
|
||||
#else
|
||||
UNUSED_VARIABLE(tx_pwr);
|
||||
UNUSED_VARIABLE(rx_pwr);
|
||||
UNUSED_VARIABLE(rx_pwr2);
|
||||
UNUSED_VARIABLE(tx_pwr);
|
||||
UNUSED_VARIABLE(rx_pwr);
|
||||
UNUSED_VARIABLE(rx_pwr2);
|
||||
#endif
|
||||
|
||||
} // eNB_id
|
||||
|
||||
} // abstraction_flag==0
|
||||
|
||||
}
|
||||
@@ -604,29 +535,13 @@ void init_channel_vars(LTE_DL_FRAME_PARMS *frame_parms, double ***s_re,double **
|
||||
|
||||
int i;
|
||||
|
||||
*s_re = malloc(2*sizeof(double*));
|
||||
*s_im = malloc(2*sizeof(double*));
|
||||
*r_re = malloc(2*sizeof(double*));
|
||||
*r_im = malloc(2*sizeof(double*));
|
||||
*r_re0 = malloc(2*sizeof(double*));
|
||||
*r_im0 = malloc(2*sizeof(double*));
|
||||
memset(eNB_output_mask,0,sizeof(int)*NUMBER_OF_UE_MAX);
|
||||
for (i=0;i<NB_UE_INST;i++)
|
||||
pthread_mutex_init(&eNB_output_mutex[i],NULL);
|
||||
|
||||
memset(UE_output_mask,0,sizeof(int)*NUMBER_OF_eNB_MAX);
|
||||
for (i=0;i<NB_eNB_INST;i++)
|
||||
pthread_mutex_init(&UE_output_mutex[i],NULL);
|
||||
|
||||
for (i=0; i<2; i++) {
|
||||
|
||||
(*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));
|
||||
(*r_re0)[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
|
||||
bzero((*r_re0)[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
|
||||
(*r_im0)[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
|
||||
bzero((*r_im0)[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -179,7 +179,6 @@ extern uint16_t Nid_cell;
|
||||
|
||||
extern LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs];
|
||||
|
||||
extern Enb_properties_array_t enb_properties;
|
||||
|
||||
|
||||
//#ifdef XFORMS
|
||||
@@ -759,8 +758,9 @@ l2l1_task (void *args_p)
|
||||
proc->frame_rx = frame;
|
||||
proc->subframe_rx = sf;
|
||||
proc->timestamp_rx += PHY_vars_eNB_g[eNB_inst][CC_id]->frame_parms.samples_per_tti;
|
||||
pthread_mutex_unlock( &proc->mutex_FH );
|
||||
|
||||
if (proc->instance_cnt_FH == 0) {
|
||||
if (cnt_FH == 0) {
|
||||
if (pthread_cond_signal(&proc->cond_FH) != 0) {
|
||||
LOG_E(PHY,"ERROR pthread_cond_signal for eNB FH CCid %d\n",proc->CC_id);
|
||||
exit_fun("ERROR pthread_cond_signal");
|
||||
|
||||
@@ -50,11 +50,13 @@ eNB_MAC_INST* get_eNB_mac_inst(module_id_t module_idP);
|
||||
OAI_Emulation* get_OAI_emulation(void);
|
||||
void init_channel_vars(LTE_DL_FRAME_PARMS *frame_parms, double ***s_re,double ***s_im,double ***r_re,double ***r_im,double ***r_re0,double ***r_im0);
|
||||
|
||||
void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_NUM_CCs],
|
||||
node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],uint16_t next_slot,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms, uint32_t,uint8_t);
|
||||
void do_UL_sig(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_NUM_CCs],
|
||||
node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],
|
||||
uint16_t subframe,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint32_t frame,int eNB_id,uint8_t CC_id);
|
||||
|
||||
void do_DL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_NUM_CCs],
|
||||
node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],uint16_t next_slot,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,uint8_t UE_id,int CC_id);
|
||||
void do_DL_sig(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_NUM_CCs],
|
||||
node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],uint16_t subframe,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,uint8_t UE_id,int CC_id);
|
||||
|
||||
void init_ue(node_desc_t *ue_data, UE_Antenna ue_ant);//Abstraction changes
|
||||
void init_enb(node_desc_t *enb_data, eNB_Antenna enb_ant);//Abstraction changes
|
||||
|
||||
@@ -173,6 +173,12 @@ extern time_stats_t ul_chan_stats;
|
||||
|
||||
extern int xforms;
|
||||
|
||||
extern uint32_t downlink_frequency[MAX_NUM_CCs][4];
|
||||
extern int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
|
||||
|
||||
void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst);
|
||||
void stop_eNB(int nb_inst);
|
||||
|
||||
void get_simulation_options(int argc, char *argv[])
|
||||
{
|
||||
int option;
|
||||
@@ -774,11 +780,15 @@ void get_simulation_options(int argc, char *argv[])
|
||||
conf_config_file_name, oai_emulation.info.nb_enb_local, enb_properties->number);
|
||||
|
||||
/* Update some simulation parameters */
|
||||
oai_emulation.info.frame_type[0] = enb_properties->properties[0]->frame_type[0];
|
||||
oai_emulation.info.tdd_config[0] = enb_properties->properties[0]->tdd_config[0];
|
||||
oai_emulation.info.tdd_config_S[0] = enb_properties->properties[0]->tdd_config_s[0];
|
||||
oai_emulation.info.frame_type[0] = enb_properties->properties[0]->frame_type[0];
|
||||
oai_emulation.info.tdd_config[0] = enb_properties->properties[0]->tdd_config[0];
|
||||
oai_emulation.info.tdd_config_S[0] = enb_properties->properties[0]->tdd_config_s[0];
|
||||
oai_emulation.info.extended_prefix_flag[0] = enb_properties->properties[0]->prefix_type[0];
|
||||
|
||||
oai_emulation.info.node_function[0] = enb_properties->properties[0]->cc_node_function[0];
|
||||
oai_emulation.info.node_timing[0] = enb_properties->properties[0]->cc_node_timing[0];
|
||||
downlink_frequency[0][0] = enb_properties->properties[0]->downlink_frequency[0];
|
||||
uplink_frequency_offset[0][0] = enb_properties->properties[0]->uplink_frequency_offset[0];
|
||||
}
|
||||
|
||||
free(conf_config_file_name);
|
||||
@@ -939,6 +949,119 @@ void init_seed(uint8_t set_seed)
|
||||
}
|
||||
}
|
||||
|
||||
int eNB_trx_start(openair0_device *device) {
|
||||
return(0);
|
||||
}
|
||||
|
||||
void eNB_trx_end(openair0_device *device) {
|
||||
return;
|
||||
}
|
||||
|
||||
int eNB_trx_stop(openair0_device *device) {
|
||||
return(0);
|
||||
}
|
||||
int UE_trx_start(openair0_device *device) {
|
||||
return(0);
|
||||
}
|
||||
int UE_trx_end(openair0_device *device) {
|
||||
return(0);
|
||||
}
|
||||
int UE_trx_stop(openair0_device *device) {
|
||||
return(0);
|
||||
}
|
||||
int eNB_trx_set_freq(openair0_device *device, openair0_config_t *openair0_cfg, int dummy) {
|
||||
return(0);
|
||||
}
|
||||
int eNB_trx_set_gains(openair0_device *device, openair0_config_t *openair0_cfg) {
|
||||
return(0);
|
||||
}
|
||||
int UE_trx_set_freq(openair0_device *device, openair0_config_t *openair0_cfg, int dummy) {
|
||||
return(0);
|
||||
}
|
||||
int UE_trx_set_gains(openair0_device *device, openair0_config_t *openair0_cfg) {
|
||||
return(0);
|
||||
}
|
||||
|
||||
int eNB_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) {
|
||||
return(0);
|
||||
}
|
||||
|
||||
int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) {
|
||||
return(0);
|
||||
}
|
||||
|
||||
int eNB_trx_write(openair0_device *device,openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) {
|
||||
|
||||
int eNB_id = device->Mod_id;
|
||||
int CC_id = device->CC_id;
|
||||
int UE_id;
|
||||
int subframe = (timestamp/PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti)%10;
|
||||
|
||||
for (UE_id=0;UE_id<=NB_UE_INST;UE_id++) {
|
||||
do_DL_sig(eNB2UE,
|
||||
enb_data,
|
||||
ue_data,
|
||||
subframe,
|
||||
0, //abstraction_flag,
|
||||
&PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms,
|
||||
UE_id,
|
||||
CC_id);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
int UE_trx_write(openair0_device *device,openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) {
|
||||
|
||||
int UE_id = device->Mod_id;
|
||||
int CC_id = device->CC_id;
|
||||
int eNB_id;
|
||||
int subframe = (timestamp/PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti)%10;
|
||||
|
||||
for (eNB_id=0;eNB_id<=NB_eNB_INST;eNB_id++) {
|
||||
do_UL_sig(UE2eNB,
|
||||
enb_data,
|
||||
ue_data,
|
||||
subframe,
|
||||
0, // abstraction_flag
|
||||
&PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms,
|
||||
0, // frame is only used for abstraction
|
||||
eNB_id,
|
||||
CC_id);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
void init_devices(void){
|
||||
|
||||
module_id_t UE_id, eNB_id;
|
||||
uint8_t CC_id;
|
||||
|
||||
for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||
for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) {
|
||||
PHY_vars_eNB_g[eNB_id][CC_id]->rfdevice.Mod_id = eNB_id;
|
||||
PHY_vars_eNB_g[eNB_id][CC_id]->rfdevice.CC_id = CC_id;
|
||||
PHY_vars_eNB_g[eNB_id][CC_id]->rfdevice.trx_start_func = eNB_trx_start;
|
||||
PHY_vars_eNB_g[eNB_id][CC_id]->rfdevice.trx_read_func = eNB_trx_read;
|
||||
PHY_vars_eNB_g[eNB_id][CC_id]->rfdevice.trx_write_func = eNB_trx_write;
|
||||
PHY_vars_eNB_g[eNB_id][CC_id]->rfdevice.trx_end_func = eNB_trx_end;
|
||||
PHY_vars_eNB_g[eNB_id][CC_id]->rfdevice.trx_stop_func = eNB_trx_stop;
|
||||
PHY_vars_eNB_g[eNB_id][CC_id]->rfdevice.trx_set_freq_func = eNB_trx_set_freq;
|
||||
PHY_vars_eNB_g[eNB_id][CC_id]->rfdevice.trx_set_gains_func = eNB_trx_set_gains;
|
||||
}
|
||||
for (UE_id=0;UE_id<NB_eNB_INST;UE_id++) {
|
||||
PHY_vars_UE_g[UE_id][CC_id]->rfdevice.Mod_id = UE_id;
|
||||
PHY_vars_UE_g[UE_id][CC_id]->rfdevice.CC_id = CC_id;
|
||||
PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_start_func = UE_trx_start;
|
||||
PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_read_func = UE_trx_read;
|
||||
PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_write_func = UE_trx_write;
|
||||
PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_end_func = UE_trx_end;
|
||||
PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_stop_func = UE_trx_stop;
|
||||
PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_set_freq_func = UE_trx_set_freq;
|
||||
PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_set_gains_func = UE_trx_set_gains;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void init_openair1(void)
|
||||
{
|
||||
module_id_t UE_id, eNB_id;
|
||||
@@ -1029,7 +1152,9 @@ void init_openair1(void)
|
||||
}
|
||||
}
|
||||
|
||||
init_eNB(eNodeB_3GPP,NB_eNB_INST);
|
||||
init_devices ();
|
||||
|
||||
init_eNB(oai_emulation.info.node_function,oai_emulation.info.node_timing,NB_eNB_INST);
|
||||
|
||||
// init_ue_status();
|
||||
for (UE_id=0; UE_id<NB_UE_INST; UE_id++) {
|
||||
|
||||
Reference in New Issue
Block a user