Commit 0ed5a4b5 authored by lfarizav's avatar lfarizav

frequency analysis

parent 1fb76157
......@@ -1108,6 +1108,15 @@ int phy_init_lte_ue(PHY_VARS_UE *ue,
// many memory allocation sizes are hard coded
AssertFatal( fp->nb_antennas_rx <= 2, "hard coded allocation for ue_common_vars->dl_ch_estimates[eNB_id]" );
AssertFatal( ue->n_connected_eNB <= NUMBER_OF_CONNECTED_eNB_MAX, "n_connected_eNB is too large" );
// do_ofdm_mod for frequency analysis
int do_ofdm_mod = ue->do_ofdm_mod=1;
if (do_ofdm_mod==0)
LOG_D(PHY,"Frequency domain deactivated. do_ofdm_mod flag is initialized in %d.\n",ue->do_ofdm_mod);
else
LOG_D(PHY,"Frequency domain activated. do_ofdm_mod flag is initialized in %d.\n ",ue->do_ofdm_mod);
// init phy_vars_ue
for (i=0; i<4; i++) {
......@@ -1138,7 +1147,7 @@ int phy_init_lte_ue(PHY_VARS_UE *ue,
for (i=0; i<fp->nb_antennas_tx; i++) {
common_vars->txdata[i] = (int32_t*)malloc16_clear( fp->samples_per_tti*10*sizeof(int32_t) );
common_vars->txdataF[i] = (int32_t *)malloc16_clear( fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t) );
common_vars->txdataF[i] = (int32_t *)malloc16_clear( (fp->ofdm_symbol_size*fp->symbols_per_tti*10)*sizeof(int32_t) );
}
// init RX buffers
......@@ -1151,7 +1160,7 @@ int phy_init_lte_ue(PHY_VARS_UE *ue,
for (i=0; i<fp->nb_antennas_rx; i++) {
common_vars->rxdata[i] = (int32_t*) malloc16_clear( (fp->samples_per_tti*10+2048)*sizeof(int32_t) );
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
common_vars->common_vars_rx_data_per_thread[th_id].rxdataF[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->ofdm_symbol_size*14) );
common_vars->common_vars_rx_data_per_thread[th_id].rxdataF[i] = (int32_t*)malloc16_clear((fp->ofdm_symbol_size*14)*sizeof(int32_t));
}
}
}
......
......@@ -116,6 +116,14 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
uint8_t l,
uint8_t symbol);
int lte_dl_channel_estimation_freq(PHY_VARS_UE *phy_vars_ue,
module_id_t eNB_id,
uint8_t eNB_offset,
uint8_t Ns,
uint8_t p,
uint8_t l,
uint8_t symbol);
int lte_dl_bf_channel_estimation(PHY_VARS_UE *phy_vars_ue,
module_id_t eNB_id,
uint8_t eNB_offset,
......@@ -130,6 +138,13 @@ int lte_dl_msbfn_channel_estimation(PHY_VARS_UE *phy_vars_ue,
unsigned char l,
unsigned char symbol);
int lte_dl_msbfn_channel_estimation_freq(PHY_VARS_UE *phy_vars_ue,
module_id_t eNB_id,
uint8_t eNB_offset,
int subframe,
unsigned char l,
unsigned char symbol);
int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue,
module_id_t eNB_id,
uint8_t eNB_offset,
......@@ -197,6 +212,10 @@ void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue,
uint8_t slot,
uint8_t abstraction_flag);
void ue_rrc_measurements_freq(PHY_VARS_UE *phy_vars_ue,
uint8_t slot,
uint8_t abstraction_flag);
void lte_ue_measurements_emul(PHY_VARS_UE *phy_vars_ue,uint8_t last_slot,uint8_t eNB_id);
/*! \brief Function to return the path-loss based on the UE cell-specific reference signal strength and transmission power of eNB
......
This diff is collapsed.
This diff is collapsed.
......@@ -1022,14 +1022,25 @@ uint16_t rx_pbch(LTE_UE_COMMON *lte_ue_common_vars,
(((uint16_t)pbch_a[PBCH_A>>3]<<8)+pbch_a[(PBCH_A>>3)+1]);
if (crc == 0x0000)
{
printf("[pbch] 1\n");
return(1);
}
else if (crc == 0xffff)
{
printf("[pbch] 2\n");
return(2);
}
else if (crc == 0x5555)
{
printf("[pbch] 4\n");
return(4);
}
else
{
printf("[pbch] -1\n");
return(-1);
}
}
......
......@@ -390,7 +390,60 @@ void mch_extract_rbs(int **rxdataF,
}
void mch_extract_rbs_freq(int **rxdataF,
int **dl_ch_estimates,
int **rxdataF_ext,
int **dl_ch_estimates_ext,
unsigned char symbol,
unsigned char subframe,
LTE_DL_FRAME_PARMS *frame_parms)
{
int pilots=0,i,j,offset,aarx;
// printf("Extracting PMCH: symbol %d\n",symbol);
if ((symbol==2)||
(symbol==10)) {
pilots = 1;
offset = 1;
} else if (symbol==6) {
pilots = 1;
offset = 0;
}
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
if (pilots==1) {
for (i=offset,j=0; i<frame_parms->N_RB_DL*6; i+=2,j++) {
/* printf("MCH with pilots: i %d, j %d => %d,%d\n",i,j,
*(int16_t*)&rxdataF[aarx][i+frame_parms->first_carrier_offset + (symbol*frame_parms->ofdm_symbol_size)],
*(int16_t*)(1+&rxdataF[aarx][i+frame_parms->first_carrier_offset + (symbol*frame_parms->ofdm_symbol_size)]));
*/
rxdataF_ext[aarx][j+symbol*(frame_parms->N_RB_DL*12)] = rxdataF[aarx][i+frame_parms->first_carrier_offset + (symbol*frame_parms->ofdm_symbol_size)+subframe*(frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti)];
rxdataF_ext[aarx][(frame_parms->N_RB_DL*3)+j+symbol*(frame_parms->N_RB_DL*12)] = rxdataF[aarx][i+1+ (symbol*frame_parms->ofdm_symbol_size)];
dl_ch_estimates_ext[aarx][j+symbol*(frame_parms->N_RB_DL*12)+subframe*(frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti)] = dl_ch_estimates[aarx][i+(symbol*frame_parms->ofdm_symbol_size)];
dl_ch_estimates_ext[aarx][(frame_parms->N_RB_DL*3)+j+symbol*(frame_parms->N_RB_DL*12)] = dl_ch_estimates[aarx][i+(frame_parms->N_RB_DL*6)+(symbol*frame_parms->ofdm_symbol_size)];
}
} else {
memcpy((void*)&rxdataF_ext[aarx][symbol*(frame_parms->N_RB_DL*12)],
(void*)&rxdataF[aarx][frame_parms->first_carrier_offset + (symbol*frame_parms->ofdm_symbol_size)+subframe*(frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti)],
frame_parms->N_RB_DL*24);
memcpy((void*)&rxdataF_ext[aarx][(frame_parms->N_RB_DL*6) + symbol*(frame_parms->N_RB_DL*12)],
(void*)&rxdataF[aarx][1 + (symbol*frame_parms->ofdm_symbol_size)+subframe*(frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti)],
frame_parms->N_RB_DL*24);
memcpy((void*)&dl_ch_estimates_ext[aarx][symbol*(frame_parms->N_RB_DL*12)],
(void*)&dl_ch_estimates[aarx][(symbol*frame_parms->ofdm_symbol_size)],
frame_parms->N_RB_DL*48);
}
}
}
void mch_channel_level(int **dl_ch_estimates_ext,
LTE_DL_FRAME_PARMS *frame_parms,
int *avg,
......@@ -968,7 +1021,15 @@ int rx_pmch(PHY_VARS_UE *ue,
int avgs,aarx;
//printf("*********************mch: symbol %d\n",symbol);
if (ue->do_ofdm_mod)
mch_extract_rbs_freq(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id],
pdsch_vars[eNB_id]->rxdataF_ext,
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
symbol,
subframe,
frame_parms);
else
mch_extract_rbs(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id],
pdsch_vars[eNB_id]->rxdataF_ext,
......
......@@ -1056,6 +1056,17 @@ uint16_t dlsch_extract_rbs_single(int32_t **rxdataF,
uint8_t subframe,
uint32_t high_speed_flag,
LTE_DL_FRAME_PARMS *frame_parms);
uint16_t dlsch_extract_rbs_single_freq(int32_t **rxdataF,
int32_t **dl_ch_estimates,
int32_t **rxdataF_ext,
int32_t **dl_ch_estimates_ext,
uint16_t pmi,
uint8_t *pmi_ext,
uint32_t *rb_alloc,
uint8_t symbol,
uint8_t subframe,
uint32_t high_speed_flag,
LTE_DL_FRAME_PARMS *frame_parms);
/** \fn dlsch_extract_rbs_dual(int32_t **rxdataF,
int32_t **dl_ch_estimates,
......@@ -1093,6 +1104,19 @@ uint16_t dlsch_extract_rbs_dual(int32_t **rxdataF,
LTE_DL_FRAME_PARMS *frame_parms,
MIMO_mode_t mimo_mode);
uint16_t dlsch_extract_rbs_dual_freq(int32_t **rxdataF,
int32_t **dl_ch_estimates,
int32_t **rxdataF_ext,
int32_t **dl_ch_estimates_ext,
uint16_t pmi,
uint8_t *pmi_ext,
uint32_t *rb_alloc,
uint8_t symbol,
uint8_t subframe,
uint32_t high_speed_flag,
LTE_DL_FRAME_PARMS *frame_parms,
MIMO_mode_t mimo_mode);
/** \fn dlsch_extract_rbs_TM7(int32_t **rxdataF,
int32_t **dl_bf_ch_estimates,
int32_t **rxdataF_ext,
......@@ -1124,6 +1148,16 @@ uint16_t dlsch_extract_rbs_TM7(int32_t **rxdataF,
uint32_t high_speed_flag,
LTE_DL_FRAME_PARMS *frame_parms);
uint16_t dlsch_extract_rbs_TM7_freq(int32_t **rxdataF,
int32_t **dl_bf_ch_estimates,
int32_t **rxdataF_ext,
int32_t **dl_bf_ch_estimates_ext,
uint32_t *rb_alloc,
uint8_t symbol,
uint8_t subframe,
uint32_t high_speed_flag,
LTE_DL_FRAME_PARMS *frame_parms);
/** \brief This function performs channel compensation (matched filtering) on the received RBs for this allocation. In addition, it computes the squared-magnitude of the channel with weightings for 16QAM/64QAM detection as well as dual-stream detection (cross-correlation)
@param rxdataF_ext Frequency-domain received signal in RBs to be demodulated
@param dl_ch_estimates_ext Frequency-domain channel estimates in RBs to be demodulated
......
......@@ -65,12 +65,25 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
int no_prefix,
int reset_freq_est);
int slot_fep_freq(PHY_VARS_UE *phy_vars_ue,
unsigned char l,
unsigned char Ns,
int sample_offset,
int no_prefix,
int reset_freq_est);
int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue,
unsigned char l,
int subframe,
int sample_offset,
int no_prefix);
int slot_fep_mbsfn_freq(PHY_VARS_UE *phy_vars_ue,
unsigned char l,
int subframe,
int sample_offset,
int no_prefix);
int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms,
LTE_eNB_COMMON *eNb_common_vars,
unsigned char l,
......
......@@ -211,6 +211,222 @@ int slot_fep(PHY_VARS_UE *ue,
}
// do frequency offset estimation here!
// use channel estimates from current symbol (=ch_t) and last symbol (ch_{t-1})
#ifdef DEBUG_FEP
printf("Frequency offset estimation\n");
#endif
if (l==(4-frame_parms->Ncp)) {
#if UE_TIMING_TRACE
start_meas(&ue->dlsch_freq_offset_estimation_stats);
#endif
lte_est_freq_offset(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[0],
frame_parms,
l,
&common_vars->freq_offset,
reset_freq_est);
#if UE_TIMING_TRACE
stop_meas(&ue->dlsch_freq_offset_estimation_stats);
#endif
}
}
}
#ifdef DEBUG_FEP
printf("slot_fep: done\n");
#endif
return(0);
}
int slot_fep_freq(PHY_VARS_UE *ue,
unsigned char l,
unsigned char Ns,
int sample_offset,
int no_prefix,
int reset_freq_est)
{
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
LTE_UE_COMMON *common_vars = &ue->common_vars;
uint8_t eNB_id = 0;//ue_common_vars->eNb_id;
unsigned char aa;
unsigned char symbol = l+((7-frame_parms->Ncp)*(Ns&1)); ///symbol within sub-frame
//unsigned int nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
//unsigned int nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples0);
unsigned int subframe_offset;//,subframe_offset_F;
unsigned int slot_offset;
int i;
//unsigned int frame_length_samples = frame_parms->samples_per_tti * 10;
unsigned int rx_offset;
/*LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id];
unsigned char harq_pid = dlsch_ue[0]->current_harq_pid;
LTE_DL_UE_HARQ_t *dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid];
int uespec_pilot[9][1200];*/
/*void (*dft)(int16_t *,int16_t *, int);
int tmp_dft_in[2048] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs
switch (frame_parms->ofdm_symbol_size) {
case 128:
dft = dft128;
break;
case 256:
dft = dft256;
break;
case 512:
dft = dft512;
break;
case 1024:
dft = dft1024;
break;
case 1536:
dft = dft1536;
break;
case 2048:
dft = dft2048;
break;
default:
dft = dft512;
break;
}
if (no_prefix) {
subframe_offset = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_tti * (Ns>>1);
slot_offset = frame_parms->ofdm_symbol_size * (frame_parms->symbols_per_tti>>1) * (Ns%2);
} else {
subframe_offset = frame_parms->samples_per_tti * (Ns>>1);
slot_offset = (frame_parms->samples_per_tti>>1) * (Ns%2);
}*/
// subframe_offset_F = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_tti * (Ns>>1);
if (l<0 || l>=7-frame_parms->Ncp) {
printf("slot_fep: l must be between 0 and %d\n",7-frame_parms->Ncp);
return(-1);
}
if (Ns<0 || Ns>=20) {
printf("slot_fep: Ns must be between 0 and 19\n");
return(-1);
}
/*for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
memset(&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int));
rx_offset = sample_offset + slot_offset + nb_prefix_samples0 + subframe_offset - SOFFSET;
// Align with 256 bit
// rx_offset = rx_offset&0xfffffff8;
if (l==0) {
if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size))
memcpy((short *)&common_vars->rxdata[aa][frame_length_samples],
(short *)&common_vars->rxdata[aa][0],
frame_parms->ofdm_symbol_size*sizeof(int));
if ((rx_offset&7)!=0) { // if input to dft is not 256-bit aligned, issue for size 6,15 and 25 PRBs
memcpy((void *)tmp_dft_in,
(void *)&common_vars->rxdata[aa][rx_offset % frame_length_samples],
frame_parms->ofdm_symbol_size*sizeof(int));
dft((int16_t *)tmp_dft_in,
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
} else { // use dft input from RX buffer directly
#if UE_TIMING_TRACE
start_meas(&ue->rx_dft_stats);
#endif
dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
#if UE_TIMING_TRACE
stop_meas(&ue->rx_dft_stats);
#endif
}
} else {
rx_offset += (frame_parms->ofdm_symbol_size+nb_prefix_samples)*l;// +
// (frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1);
#ifdef DEBUG_FEP
// if (ue->frame <100)
LOG_I(PHY,"slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, subframe_offset %d, sample_offset %d,rx_offset %d, frame_length_samples %d\n", ue->proc.proc_rxtx[(Ns>>1)&1].frame_rx,Ns, symbol,
nb_prefix_samples,nb_prefix_samples0,slot_offset,subframe_offset,sample_offset,rx_offset,frame_length_samples);
#endif
if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size))
memcpy((void *)&common_vars->rxdata[aa][frame_length_samples],
(void *)&common_vars->rxdata[aa][0],
frame_parms->ofdm_symbol_size*sizeof(int));
#if UE_TIMING_TRACE
start_meas(&ue->rx_dft_stats);
#endif
if ((rx_offset&7)!=0) { // if input to dft is not 128-bit aligned, issue for size 6 and 15 PRBs
memcpy((void *)tmp_dft_in,
(void *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
frame_parms->ofdm_symbol_size*sizeof(int));
dft((int16_t *)tmp_dft_in,
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
} else { // use dft input from RX buffer directly
dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
}
#if UE_TIMING_TRACE
stop_meas(&ue->rx_dft_stats);
#endif
}
#ifdef DEBUG_FEP
// if (ue->frame <100)
printf("slot_fep: frame %d: symbol %d rx_offset %d\n", ue->proc.proc_rxtx[(Ns>>1)&1].frame_rx, symbol,rx_offset);
#endif
}*/
if (ue->perfect_ce == 0) {
if ((l==0) || (l==(4-frame_parms->Ncp))) {
for (aa=0; aa<frame_parms->nb_antenna_ports_eNB; aa++) {
#ifdef DEBUG_FEP
printf("Channel estimation eNB %d, aatx %d, slot %d, symbol %d\n",eNB_id,aa,Ns,l);
#endif
#if UE_TIMING_TRACE
start_meas(&ue->dlsch_channel_estimation_stats);
#endif
lte_dl_channel_estimation_freq(ue,eNB_id,0,
Ns,
aa,
l,
symbol);
#if UE_TIMING_TRACE
stop_meas(&ue->dlsch_channel_estimation_stats);
#endif
for (i=0; i<ue->measurements.n_adj_cells; i++) {
lte_dl_channel_estimation_freq(ue,eNB_id,i+1,
Ns,
aa,
l,
symbol);
}
}
// do frequency offset estimation here!
// use channel estimates from current symbol (=ch_t) and last symbol (ch_{t-1})
#ifdef DEBUG_FEP
......
......@@ -202,3 +202,180 @@ int slot_fep_mbsfn(PHY_VARS_UE *ue,
#endif
return(0);
}
int slot_fep_mbsfn_freq(PHY_VARS_UE *ue,
unsigned char l,
int subframe,
int sample_offset,
int no_prefix)
{
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
LTE_UE_COMMON *common_vars = &ue->common_vars;
uint8_t eNB_id = 0;//ue_common_vars->eNb_id;
unsigned char aa;
unsigned char frame_type = frame_parms->frame_type; // Frame Type: 0 - FDD, 1 - TDD;
//unsigned int nb_prefix_samples = frame_parms->ofdm_symbol_size>>2;//(no_prefix ? 0 : frame_parms->nb_prefix_samples);
//unsigned int nb_prefix_samples0 = frame_parms->ofdm_symbol_size>>2;//(no_prefix ? 0 : frame_parms->nb_prefix_samples0);
unsigned int subframe_offset;
// int i;
unsigned int frame_length_samples = frame_parms->samples_per_tti * 10;
/*void (*dft)(int16_t *,int16_t *, int);
switch (frame_parms->ofdm_symbol_size) {
case 128:
dft = dft128;
break;
case 256:
dft = dft256;
break;
case 512:
dft = dft512;
break;
case 1024:
dft = dft1024;
break;
case 1536:
dft = dft1536;
break;
case 2048:
dft = dft2048;
break;
default:
dft = dft512;
break;
}
if (no_prefix) {
subframe_offset = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_tti * subframe;
} else {
subframe_offset = frame_parms->samples_per_tti * subframe;
}*/
if (l<0 || l>=12) {
msg("slot_fep_mbsfn: l must be between 0 and 11\n");
return(-1);
}
if (((subframe == 0) || (subframe == 5) || // SFn 0,4,5,9;
(subframe == 4) || (subframe == 9))
&& (frame_type==FDD) ) { //check for valid MBSFN subframe
msg("slot_fep_mbsfn: Subframe must be 1,2,3,6,7,8 for FDD, Got %d \n",subframe);
return(-1);
} else if (((subframe == 0) || (subframe == 1) || (subframe==2) || // SFn 0,4,5,9;
(subframe == 5) || (subframe == 6))
&& (frame_type==TDD) ) { //check for valid MBSFN subframe
msg("slot_fep_mbsfn: Subframe must be 3,4,7,8,9 for TDD, Got %d \n",subframe);
return(-1);
}
#ifdef DEBUG_FEP
msg("slot_fep_mbsfn: subframe %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, subframe_offset %d, sample_offset %d\n", subframe, l, nb_prefix_samples,nb_prefix_samples0,subframe_offset,
sample_offset);
#endif
/*for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
memset(&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aa][frame_parms->ofdm_symbol_size*l],0,frame_parms->ofdm_symbol_size*sizeof(int));
if (l==0) {
#if UE_TIMING_TRACE
start_meas(&ue->rx_dft_stats);
#endif
dft((int16_t *)&common_vars->rxdata[aa][(sample_offset +
nb_prefix_samples0 +
subframe_offset -
SOFFSET) % frame_length_samples],
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aa][frame_parms->ofdm_symbol_size*l],1);
#if UE_TIMING_TRACE
stop_meas(&ue->rx_dft_stats);
#endif
} else {
if ((sample_offset +
(frame_parms->ofdm_symbol_size+nb_prefix_samples0+nb_prefix_samples) +
(frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1) +
subframe_offset-
SOFFSET) > (frame_length_samples - frame_parms->ofdm_symbol_size))
memcpy((short *)&common_vars->rxdata[aa][frame_length_samples],
(short *)&common_vars->rxdata[aa][0],
frame_parms->ofdm_symbol_size*sizeof(int));
#if UE_TIMING_TRACE
start_meas(&ue->rx_dft_stats);
#endif
dft((int16_t *)&common_vars->rxdata[aa][(sample_offset +
(frame_parms->ofdm_symbol_size+nb_prefix_samples0+nb_prefix_samples) +
(frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1) +
subframe_offset-
SOFFSET) % frame_length_samples],
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aa][frame_parms->ofdm_symbol_size*l],1);
#if UE_TIMING_TRACE
stop_meas(&ue->rx_dft_stats);
#endif
}
}*/
//if ((l==0) || (l==(4-frame_parms->Ncp))) {
// changed to invoke MBSFN channel estimation in symbols 2,6,10
if ((l==2)||(l==6)||(l==10)) {
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
if (ue->perfect_ce == 0) {
#ifdef DEBUG_FEP
msg("Channel estimation eNB %d, aatx %d, subframe %d, symbol %d\n",eNB_id,aa,subframe,l);
#endif
lte_dl_mbsfn_channel_estimation_freq(ue,
eNB_id,
0,
subframe,
l);
/* for (i=0;i<ue->PHY_measurements.n_adj_cells;i++) {
lte_dl_mbsfn_channel_estimation(ue,
eNB_id,
i+1,
subframe,
l);
lte_dl_channel_estimation(ue,eNB_id,0,
Ns,
aa,
l,
symbol);
for (i=0;i<ue->PHY_measurements.n_adj_cells;i++) {
lte_dl_channel_estimation(ue,eNB_id,i+1,
Ns,
aa,
l,
symbol); */
// }
// do frequency offset estimation here!
// use channel estimates from current symbol (=ch_t) and last symbol (ch_{t-1})
#ifdef DEBUG_FEP
msg("Frequency offset estimation\n");
#endif
// if ((l == 0) || (l==(4-frame_parms->Ncp)))
/* if ((l==2)||(l==6)||(l==10))
lte_mbsfn_est_freq_offset(common_vars->dl_ch_estimates[0],
frame_parms,
l,
&common_vars->freq_offset); */
}
}
}
#ifdef DEBUG_FEP
msg("slot_fep_mbsfn: done\n");
#endif
return(0);
}
......@@ -74,7 +74,11 @@ int write_output(const char *fname,const char *vname,void *data,int length,int d
break;
case 16:
for (i=0; i<length<<1; i+=(2*dec)) {
fprintf(fp,"%d\t%d\t%d\n",i/2,((short *)data)[i],((short *)data)[i+1]);
}
break;
case 2: // real 32-bit
for (i=0; i<length; i+=dec) {
fprintf(fp,"%d\n",((int *)data)[i]);
......
......@@ -969,6 +969,7 @@ typedef struct {
SLIST_HEAD(ral_thresholds_gen_poll_s, ral_threshold_phy_t) ral_thresholds_gen_polled[RAL_LINK_PARAM_GEN_MAX];
SLIST_HEAD(ral_thresholds_lte_poll_s, ral_threshold_phy_t) ral_thresholds_lte_polled[RAL_LINK_PARAM_LTE_MAX];
#endif
int do_ofdm_mod;
} PHY_VARS_UE;
......
......@@ -1320,6 +1320,7 @@ void ulsch_common_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, uint8_t empt
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
if (!ue->do_ofdm_mod){
if (frame_parms->Ncp == 1)
PHY_ofdm_mod(&ue->common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size],
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
......@@ -1385,7 +1386,7 @@ void ulsch_common_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, uint8_t empt
write_output("txBuff.m","txSignal",&ue->common_vars.txdata[aa][ulsch_start],frame_parms->samples_per_tti,1,1);
}
*/
}//skip time domain for frequency analysis
} //nb_antennas_tx
#if UE_TIMING_TRACE
......@@ -2620,14 +2621,26 @@ void ue_measurement_procedures(
if (l==0) {
// UE measurements on symbol 0
if (abstraction_flag==0) {
LOG_D(PHY,"Calling measurements subframe %d, rxdata %p\n",subframe_rx,ue->common_vars.rxdata);
if (ue->do_ofdm_mod){//frequency analysis
LOG_D(PHY,"Calling measurements subframe %d, thread[%d].rxdataF %p\n",subframe_rx,(slot>>1)&0x1,ue->common_vars.common_vars_rx_data_per_thread[(slot>>1)&0x1].rxdataF);
lte_ue_measurements(ue,
(subframe_rx*frame_parms->samples_per_tti+ue->rx_offset)%(frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME),
(subframe_rx == 1) ? 1 : 0,
0,
0,
subframe_rx);
lte_ue_measurements(ue,
(subframe_rx*frame_parms->samples_per_tti+ue->rx_offset)%(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME),
(subframe_rx == 1) ? 1 : 0,
0,
0,
subframe_rx);
}
else
{
LOG_D(PHY,"Calling measurements subframe %d, rxdata %p\n",subframe_rx,ue->common_vars.rxdata);
lte_ue_measurements(ue,
(subframe_rx*frame_parms->samples_per_tti+ue->rx_offset)%(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME),
(subframe_rx == 1) ? 1 : 0,
0,
0,
subframe_rx);
}
} else {
lte_ue_measurements(ue,
0,
......@@ -2686,12 +2699,13 @@ void ue_measurement_procedures(
if (abstraction_flag == 0) {
if (ue->no_timing_correction==0)
lte_adjust_synch(&ue->frame_parms,
ue,
eNB_id,
subframe_rx,
0,
16384);
if (!ue->do_ofdm_mod)
lte_adjust_synch(&ue->frame_parms,
ue,
eNB_id,
subframe_rx,
0,
16384);
}
}
......@@ -2867,7 +2881,11 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uin
int frame_rx = proc->frame_rx;
int subframe_rx = proc->subframe_rx;
printf("pbch0_before. ue->proc->frame_rx %d, ue->subframe_rx %d, enb->proc->frame_tx %d, enb->subframe_tx %d\n",ue->proc.proc_rxtx[0].frame_rx,ue->proc.proc_rxtx[0].subframe_rx,PHY_vars_eNB_g[eNB_id][0]->proc.proc_rxtx[0].frame_tx,PHY_vars_eNB_g[eNB_id][0]->proc.proc_rxtx[0].subframe_tx);
printf("pbch1_before. ue->proc->frame_rx %d, ue->subframe_rx %d, enb->proc->frame_tx %d, enb->subframe_tx %d\n",ue->proc.proc_rxtx[1].frame_rx,ue->proc.proc_rxtx[1].subframe_rx,PHY_vars_eNB_g[eNB_id][0]->proc.proc_rxtx[0].frame_tx,PHY_vars_eNB_g[eNB_id][0]->proc.proc_rxtx[0].subframe_tx);
printf("pbch0_after. ue->proc->frame_rx %d, ue->subframe_rx %d, enb->proc->frame_tx %d, enb->subframe_tx %d\n",ue->proc.proc_rxtx[0].frame_rx,ue->proc.proc_rxtx[0].subframe_rx,PHY_vars_eNB_g[0][0]->proc.proc_rxtx[0].frame_tx,PHY_vars_eNB_g[0][0]->proc.proc_rxtx[0].subframe_tx);
printf("pbch1_after. ue->proc->frame_rx %d, ue->subframe_rx %d, enb->proc->frame_tx %d, enb->subframe_tx %d\n",ue->proc.proc_rxtx[1].frame_rx,ue->proc.proc_rxtx[1].subframe_rx,PHY_vars_eNB_g[0][0]->proc.proc_rxtx[1].frame_tx,PHY_vars_eNB_g[0][0]->proc.proc_rxtx[1].subframe_tx);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_FUNCTION_IN);
pbch_phase=(frame_rx%4);
......@@ -3515,7 +3533,12 @@ void ue_pmch_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,int eNB_id,int abs
if (abstraction_flag == 0 ) {
for (l=2; l<12; l++) {
if (ue->do_ofdm_mod)
slot_fep_mbsfn(ue,
l,
subframe_rx,
0,0);//ue->rx_offset,0);
else
slot_fep_mbsfn(ue,
l,
subframe_rx,
......@@ -5063,7 +5086,11 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,
#if T_TRACER
T(T_UE_PHY_DL_TICK, T_INT(ue->Mod_id), T_INT(frame_rx%1024), T_INT(subframe_rx));
if (ue->do_ofdm_mod)
T(T_UE_PHY_INPUT_SIGNAL, T_INT(ue->Mod_id), T_INT(frame_rx%1024), T_INT(subframe_rx), T_INT(0),
T_BUFFER(&ue->common_vars.rxdata[0][subframe_rx*ue->frame_parms.ofdm_symbol_size*subframe_rx*ue->frame_parms.symbols_per_tti],
ue->frame_parms.ofdm_symbol_size*subframe_rx*ue->frame_parms.symbols_per_tti * 4));
else
T(T_UE_PHY_INPUT_SIGNAL, T_INT(ue->Mod_id), T_INT(frame_rx%1024), T_INT(subframe_rx), T_INT(0),
T_BUFFER(&ue->common_vars.rxdata[0][subframe_rx*ue->frame_parms.samples_per_tti],
ue->frame_parms.samples_per_tti * 4));
......@@ -5138,6 +5165,14 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,
start_meas(&ue->ofdm_demod_stats);
#endif
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN);
if (ue->do_ofdm_mod)
slot_fep_freq(ue,
l,
(subframe_rx<<1),
0,
0,
0);
else
slot_fep(ue,
l,
(subframe_rx<<1),
......@@ -5179,7 +5214,14 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,
ue_pmch_procedures(ue,proc,eNB_id,abstraction_flag);
return 0;
}
if (ue->do_ofdm_mod)
slot_fep_freq(ue,
0,
1+(subframe_rx<<1),
0,
0,
0);
else
slot_fep(ue,
0,
1+(subframe_rx<<1),
......@@ -5275,6 +5317,14 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,
start_meas(&ue->ofdm_demod_stats);
#endif
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN);
if (ue->do_ofdm_mod)
slot_fep_freq(ue,
l,
1+(subframe_rx<<1),
0,
0,
0);
else
slot_fep(ue,
l,
1+(subframe_rx<<1),
......@@ -5295,6 +5345,14 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,
int next_subframe_rx = (1+subframe_rx)%10;
if (subframe_select(&ue->frame_parms,next_subframe_rx) != SF_UL)
{
if (ue->do_ofdm_mod)
slot_fep_freq(ue,
0,
(next_subframe_rx<<1),
0,
0,
0);
else
slot_fep(ue,
0,
(next_subframe_rx<<1),
......
......@@ -47,3 +47,59 @@ void adc(double *r_re[2],
//printf("Adc outputs %d %e %d \n",i,((short *)output[0])[((i+output_offset)<<1)], ((i+output_offset)<<1) );
}
}
void adc_freq(double *r_re[2],
double *r_im[2],
unsigned int input_offset,
unsigned int output_offset,
unsigned int **output,
unsigned int nb_rx_antennas,
unsigned int length,
unsigned char B)
{
int i;
int aa;
double gain = (double)(1<<(B-1));
//double gain = 1.0;
for (i=0; i<length; i++) {
for (aa=0; aa<nb_rx_antennas; aa++) {
((short *)output[aa])[((i+output_offset)<<1)] = (short)(r_re[aa][i+input_offset]*gain);
((short *)output[aa])[1+((i+output_offset)<<1)] = (short)(r_im[aa][i+input_offset]*gain);
if ((r_re[aa][i+input_offset]*gain) > 30000) {
//("Adc outputs %d %e %d \n",i,((short *)output[0])[((i+output_offset)<<1)], ((i+output_offset)<<1) );
}
}
//printf("Adc outputs %d %e %d \n",i,((short *)output[0])[((i+output_offset)<<1)], ((i+output_offset)<<1) );
}
}
void adc_prach(double *r_re[2],
double *r_im[2],
unsigned int input_offset,
unsigned int output_offset,
unsigned int *output,
unsigned int nb_rx_antennas,
unsigned int length,
unsigned char B)
{
int i;
int aa;
double gain = (double)(1<<(B-1));
//double gain = 1.0;
for (i=0; i<length; i++) {
for (aa=0; aa<nb_rx_antennas; aa++) {
((short *)output)[((i+output_offset)<<1)] = (short)(r_re[aa][i+input_offset]*gain);
((short *)output)[1+((i+output_offset)<<1)] = (short)(r_im[aa][i+input_offset]*gain);
if ((r_re[aa][i+input_offset]*gain) > 30000) {
//("Adc outputs %d %e %d \n",i,((short *)output[0])[((i+output_offset)<<1)], ((i+output_offset)<<1) );
}
}
//printf("Adc outputs %d %e %d \n",i,((short *)output[0])[((i+output_offset)<<1)], ((i+output_offset)<<1) );
}
}
......@@ -126,3 +126,55 @@ double dac_fixed_gain(double *s_re[2],
return(signal_energy_fp(s_re,s_im,nb_tx_antennas,length_meas,0)/NB_RE);
}
double dac_fixed_gain_prach(double *s_re[2],
double *s_im[2],
uint32_t *input,
uint32_t input_offset,
uint32_t nb_tx_antennas,
uint32_t length,
uint32_t input_offset_meas,
uint32_t length_meas,
uint8_t B,
double txpwr_dBm,
int NB_RE)
{
int i;
int aa;
double amp,amp1;
amp = //sqrt(NB_RE)*pow(10.0,.05*txpwr_dBm)/sqrt(nb_tx_antennas); //this is amp per tx antenna
pow(10.0,.05*txpwr_dBm)/sqrt(nb_tx_antennas); //this is amp per tx antenna
amp1 = 0;
for (aa=0; aa<nb_tx_antennas; aa++) {
amp1 += sqrt((double)signal_energy((int32_t*)&input[input_offset_meas],length_meas)/NB_RE);
}
amp1/=nb_tx_antennas;
// printf("DAC: amp1 %f dB (%d,%d), tx_power %f\n",20*log10(amp1),input_offset,input_offset_meas,txpwr_dBm);
/*
if (nb_tx_antennas==2)
amp1 = AMP/2;
else if (nb_tx_antennas==4)
amp1 = ((AMP*ONE_OVER_SQRT2_Q15)>>16);
else //assume (nb_tx_antennas==1)
amp1 = ((AMP*ONE_OVER_SQRT2_Q15)>>15);
amp1 = amp1*sqrt(512.0/300.0); //account for loss due to null carriers
//printf("DL: amp1 %f dB (%d,%d), tx_power %f\n",20*log10(amp1),input_offset,input_offset_meas,txpwr_dBm);
*/
for (i=0; i<length; i++) {
for (aa=0; aa<nb_tx_antennas; aa++) {
s_re[aa][i] = amp*((double)(((short *)input))[((i+input_offset)<<1)])/amp1; ///(1<<(B-1));
s_im[aa][i] = amp*((double)(((short *)input))[((i+input_offset)<<1)+1])/amp1; ///(1<<(B-1));
}
}
// printf("ener %e\n",signal_energy_fp(s_re,s_im,nb_tx_antennas,length,0));
return(signal_energy_fp(s_re,s_im,nb_tx_antennas,length_meas,0)/NB_RE);
}
......@@ -74,6 +74,24 @@ void adc(double *r_re[2],
unsigned int length,
unsigned char B);
void adc_freq(double *r_re[2],
double *r_im[2],
unsigned int input_offset,
unsigned int output_offset,
int **output,
unsigned int nb_rx_antennas,
unsigned int length,
unsigned char B);
void adc_prach(double *r_re[2],
double *r_im[2],
unsigned int input_offset,
unsigned int output_offset,
unsigned int *output,
unsigned int nb_rx_antennas,
unsigned int length,
unsigned char B);
void dac(double *s_re[2],
double *s_im[2],
int **input,
......@@ -85,6 +103,17 @@ void dac(double *s_re[2],
unsigned int meas_length,
unsigned int meas_offset);
void dac_prach(double *s_re[2],
double *s_im[2],
int **input,
unsigned int input_offset,
unsigned int nb_tx_antennas,
unsigned int length,
double amp_dBm,
unsigned char B,
unsigned int meas_length,
unsigned int meas_offset);
double dac_fixed_gain(double *s_re[2],
double *s_im[2],
int **input,
......
......@@ -139,6 +139,108 @@ int freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples)
return(0);
}
int init_freq_channel_prach(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples,int16_t prach_fmt,int16_t prach_prb_offset)
{
double delta_f,freq; // 90 kHz spacing
double delay;
int16_t f,f1;
uint8_t l;
int prach_samples, prach_pbr_offset_samples, max_nb_rb_samples;
if ((n_samples&1)==0) {
fprintf(stderr, "freq_channel_init: n_samples has to be odd\n");
return(-1);
}
if (nb_rb-prach_prb_offset<6) {
fprintf(stderr, "freq_channel_init: Impossible to allocate PRACH, change prach_prb_offset\n");
return(-1);
}
prach_samples = (prach_fmt<4)?864:144;
cos_lut = (double **)malloc(prach_samples*sizeof(double*));
sin_lut = (double **)malloc(prach_samples*sizeof(double*));
delta_f = (prach_fmt<4)?nb_rb*180000/((n_samples-1)*12):nb_rb*180000/((n_samples-1)*2);//1.25 khz for preamble format 1,2,3. 7.5 khz for format 4
max_nb_rb_samples = nb_rb*180000/delta_f;//7200
prach_pbr_offset_samples = (prach_prb_offset+6)*180000/delta_f;//864 if prach_prb_offset=0,7200 if prach_prb_offset=44
printf("prach_samples = %d, delta_f = %e, max_nb_rb_samples= %d, prach_pbr_offset_samples = %d\n",prach_samples,delta_f,max_nb_rb_samples,prach_pbr_offset_samples);
for (f=max_nb_rb_samples/2-prach_pbr_offset_samples,f1=0; f<max_nb_rb_samples/2-prach_pbr_offset_samples+prach_samples; f++,f1++) {//3600-864,3600-864+864|3600-7200,3600-7200+839
freq=delta_f*(double)f*1e-6;// due to the fact that delays is in mus
cos_lut[f1] = (double *)malloc((int)desc->nb_taps*sizeof(double));
sin_lut[f1] = (double *)malloc((int)desc->nb_taps*sizeof(double));
for (l=0; l<(int)desc->nb_taps; l++) {
if (desc->nb_taps==1)
delay = desc->delays[l];
else
delay = desc->delays[l]+NB_SAMPLES_CHANNEL_OFFSET/desc->sampling_rate;
cos_lut[f1][l] = cos(2*M_PI*freq*delay);
sin_lut[f1][l] = sin(2*M_PI*freq*delay);
printf("freq: %e, f1: %d, f: %d, arg_sin_cos = %e, cos () = %e, sin () =n %e)\n",freq, f1,f, 2*M_PI*freq*delay, cos_lut[f1][l], sin_lut[f1][l]);
}
}
return(0);
}
int freq_channel_prach(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples,int16_t prach_fmt,int16_t prach_prb_offset)
{
int16_t f;
uint8_t aarx,aatx,l;
double *clut,*slut;
int prach_samples;
static int freq_channel_init=0;
static int n_samples_max=0;
prach_samples = (prach_fmt<4)?864:144;
// do some error checking
// n_samples has to be a odd number because we assume the spectrum is symmetric around the DC and includes the DC
if ((n_samples&1)==0) {
fprintf(stderr, "freq_channel: n_samples has to be odd\n");
return(-1);
}
if (nb_rb-prach_prb_offset<6) {
fprintf(stderr, "freq_channel_init: Impossible to allocate PRACH, check prach_prb_offset\n");
return(-1);
}
if (freq_channel_init == 0) {
// we are initializing the lut for the largets possible n_samples=12*nb_rb+1
// if called with n_samples<12*nb_rb+1, we decimate the lut
n_samples_max=12*nb_rb+1;
if (init_freq_channel_prach(desc,nb_rb,n_samples_max,prach_fmt,prach_prb_offset)==0)
freq_channel_init=1;
else
return(-1);
}
start_meas(&desc->interp_freq);
for (f=0; f<prach_samples; f++) {
clut = cos_lut[f];
slut = sin_lut[f];
for (aarx=0; aarx<desc->nb_rx; aarx++) {
for (aatx=0; aatx<desc->nb_tx; aatx++) {
desc->chF[aarx+(aatx*desc->nb_rx)][f].x=0.0;
desc->chF[aarx+(aatx*desc->nb_rx)][f].y=0.0;
for (l=0; l<(int)desc->nb_taps; l++) {
desc->chF[aarx+(aatx*desc->nb_rx)][f].x+=(desc->a[l][aarx+(aatx*desc->nb_rx)].x*clut[l]+
desc->a[l][aarx+(aatx*desc->nb_rx)].y*slut[l]);
desc->chF[aarx+(aatx*desc->nb_rx)][f].y+=(-desc->a[l][aarx+(aatx*desc->nb_rx)].x*slut[l]+
desc->a[l][aarx+(aatx*desc->nb_rx)].y*clut[l]);
}
}
}
}
stop_meas(&desc->interp_freq);
return(0);
}
double compute_pbch_sinr(channel_desc_t *desc,
channel_desc_t *desc_i1,
......
......@@ -245,6 +245,56 @@ void multipath_channel(channel_desc_t *desc,
double *rx_sig_im[2],
uint32_t length,
uint8_t keep_channel);
/**\fn void multipath_channel_freq(channel_desc_t *desc,
double tx_sig_re[2],
double tx_sig_im[2],
double rx_sig_re[2],
double rx_sig_im[2],
uint32_t length,
uint8_t keep_channel)
\brief This function generates and applys a random frequency selective random channel model.
@param desc Pointer to channel descriptor
@param tx_sig_re input signal (real component)
@param tx_sig_im input signal (imaginary component)
@param rx_sig_re output signal (real component)
@param rx_sig_im output signal (imaginary component)
@param length Length of input signal
@param keep_channel Set to 1 to keep channel constant for null-B/F
*/
void multipath_channel_freq(channel_desc_t *desc,
double *tx_sig_re[2],
double *tx_sig_im[2],
double *rx_sig_re[2],
double *rx_sig_im[2],
uint32_t length,
uint8_t keep_channel);
/**\fn void multipath_channel_prach(channel_desc_t *desc,
double tx_sig_re[2],
double tx_sig_im[2],
double rx_sig_re[2],
double rx_sig_im[2],
uint32_t length,
uint8_t keep_channel)
\brief This function generates and applys a random frequency selective random channel model.
@param desc Pointer to channel descriptor
@param tx_sig_re input signal (real component)
@param tx_sig_im input signal (imaginary component)
@param rx_sig_re output signal (real component)
@param rx_sig_im output signal (imaginary component)
@param length Length of input signal
@param keep_channel Set to 1 to keep channel constant for null-B/F
*/
void multipath_channel_freq_test(channel_desc_t *desc,
double *tx_sig_re[2],
double *tx_sig_im[2],
double *rx_sig_re[2],
double *rx_sig_im[2],
uint32_t length,
uint8_t keep_channel);
/*
\fn double compute_pbch_sinr(channel_desc_t *desc,
channel_desc_t *desc_i1,
......
......@@ -25,6 +25,7 @@
#include <string.h>
#include "defs.h"
#include "SIMULATION/RF/defs.h"
#include "PHY/extern.h"
//#define DEBUG_CH
uint8_t multipath_channel_nosigconv(channel_desc_t *desc)
......@@ -211,5 +212,197 @@ void multipath_channel(channel_desc_t *desc,
} // i
}
#endif
void multipath_channel_freq(channel_desc_t *desc,
double *tx_sig_re[2],
double *tx_sig_im[2],
double *rx_sig_re[2],
double *rx_sig_im[2],
uint32_t length,
uint8_t keep_channel)
{
int ii,j,k,f,f2;
struct complex rx_tmp;
double path_loss = pow(10,desc->path_loss_dB/20);
int dd;
dd = abs(desc->channel_offset);
int nb_rb, n_samples, ofdm_symbol_size, symbols_per_tti;
nb_rb=PHY_vars_UE_g[0][0]->frame_parms.N_RB_DL;
n_samples=PHY_vars_UE_g[0][0]->frame_parms.N_RB_DL*12+1;
ofdm_symbol_size=length/PHY_vars_UE_g[0][0]->frame_parms.symbols_per_tti;
symbols_per_tti=length/PHY_vars_UE_g[0][0]->frame_parms.ofdm_symbol_size;
FILE *file;
file = fopen("multipath.txt","w");
#ifdef DEBUG_CH
printf("[CHANNEL_FREQ] keep = %d : path_loss = %g (%f), nb_rx %d, nb_tx %d, dd %d, len %d \n",keep_channel,path_loss,desc->path_loss_dB,desc->nb_rx,desc->nb_tx,dd,desc->channel_length);
#endif
printf("[CHANNEL_FREQ] keep = %d : path_loss = %g (%f), nb_rx %d, nb_tx %d, dd %d, len %d , symbols tti %d\n",keep_channel,path_loss,desc->path_loss_dB,desc->nb_rx,desc->nb_tx,dd,desc->channel_length,symbols_per_tti);
if (keep_channel) {
// do nothing - keep channel
} else {
random_channel(desc,0);//Find a(l)
freq_channel(desc,nb_rb,n_samples);//Find desc->chF
//freq_channel_prach(desc,nb_rb,n_samples,1,44);//Find desc->chF
}
for (k=0;k<symbols_per_tti;k++){//k = 0-13 normal cyclic prefix
f2 = 0;
for (f=0;f<ofdm_symbol_size; f++) {//f2 = 0-1023 for 10 Mhz BW
for (ii=0; ii<desc->nb_rx; ii++) {
rx_tmp.x = 0;
rx_tmp.y = 0;
if (f<=(n_samples>>1) && f>0)
{
for (j=0; j<desc->nb_tx; j++) {
//first n_samples>>1 samples of each frequency ofdm symbol out of ofdm_symbol_size
//RX_RE(k) += TX_RE(k).chF(k).x - TX_IM(k).chF(k).y
//RX_IM(k) += TX_IM(k).chF(k).x + TX_RE(k).chF(k).y
rx_tmp.x += (tx_sig_re[j][f+k*ofdm_symbol_size] * desc->chF[ii+(j*desc->nb_rx)][f+(n_samples>>1)-1].x)
-(tx_sig_im[j][f+k*ofdm_symbol_size] * desc->chF[ii+(j*desc->nb_rx)][f+(n_samples>>1)-1].y);
rx_tmp.y += (tx_sig_im[j][f+k*ofdm_symbol_size] * desc->chF[ii+(j*desc->nb_rx)][f+(n_samples>>1)-1].x)
+(tx_sig_re[j][f+k*ofdm_symbol_size] * desc->chF[ii+(j*desc->nb_rx)][f+(n_samples>>1)-1].y);
} // j
rx_sig_re[ii][f+k*ofdm_symbol_size] = rx_tmp.x*path_loss;
rx_sig_im[ii][f+k*ofdm_symbol_size] = rx_tmp.y*path_loss;
}
else if (f>=ofdm_symbol_size-(n_samples>>1))
{
for (j=0; j<desc->nb_tx; j++) {
//last n_samples>>1 samples of each frequency ofdm symbol out of ofdm_symbol_size
//RX_RE(k) += TX_RE(k).chF(k).x - TX_IM(k).chF(k).y
//RX_IM(k) += TX_IM(k).chF(k).x + TX_RE(k).chF(k).y
rx_tmp.x += (tx_sig_re[j][f+k*ofdm_symbol_size] * desc->chF[ii+(j*desc->nb_rx)][f2].x)
-(tx_sig_im[j][f+k*ofdm_symbol_size] * desc->chF[ii+(j*desc->nb_rx)][f2].y);
rx_tmp.y += (tx_sig_im[j][f+k*ofdm_symbol_size] * desc->chF[ii+(j*desc->nb_rx)][f2].x)
+(tx_sig_re[j][f+k*ofdm_symbol_size] * desc->chF[ii+(j*desc->nb_rx)][f2].y);
} // j
rx_sig_re[ii][f+k*ofdm_symbol_size] = rx_tmp.x*path_loss;
rx_sig_im[ii][f+k*ofdm_symbol_size] = rx_tmp.y*path_loss;
f2++;
}
else
{
rx_sig_re[ii][f+k*ofdm_symbol_size] = 0;
rx_sig_im[ii][f+k*ofdm_symbol_size] = 0;
}
//fprintf(file,"%d\t%d\t%d\t%e\t%e\t%e\t%e\t%e\t%e\n",f,f2,k,tx_sig_re[ii][f+k*ofdm_symbol_size],tx_sig_im[ii][f+k*ofdm_symbol_size],rx_sig_re[ii][f+k*ofdm_symbol_size],rx_sig_im[ii][f+k*ofdm_symbol_size],desc->chF[0][f].x,desc->chF[0][f].y);
//fflush(file);
//printf("number of taps%d\n",desc->channel_length);
} // ii
} // f,f2,f3
}//k
//fclose(file);
}
void multipath_channel_freq_test(channel_desc_t *desc,
double *tx_sig_re[2],
double *tx_sig_im[2],
double *rx_sig_re[2],
double *rx_sig_im[2],
uint32_t length,
uint8_t keep_channel)
{
int ii,k,f;
double path_loss = pow(10,desc->path_loss_dB/20);
int dd;
dd = abs(desc->channel_offset);
int nb_rb, n_samples, ofdm_symbol_size, symbols_per_tti;
nb_rb=PHY_vars_UE_g[0][0]->frame_parms.N_RB_DL;
n_samples=PHY_vars_UE_g[0][0]->frame_parms.N_RB_DL*12+1;
ofdm_symbol_size=length/PHY_vars_UE_g[0][0]->frame_parms.symbols_per_tti;
symbols_per_tti=length/PHY_vars_UE_g[0][0]->frame_parms.ofdm_symbol_size;
printf("[CHANNEL_FREQ] keep = %d : path_loss = %g (%f), nb_rx %d, nb_tx %d, dd %d, len %d , symbols tti %d\n",keep_channel,path_loss,desc->path_loss_dB,desc->nb_rx,desc->nb_tx,dd,desc->channel_length,symbols_per_tti);
for (k=0;k<symbols_per_tti;k++){//k = 0-13 normal cyclic prefix
for (f=0;f<ofdm_symbol_size; f++) {//f2 = 0-1024 for 10 Mhz
for (ii=0; ii<desc->nb_rx; ii++) {
{
rx_sig_re[ii][f+k*ofdm_symbol_size] = tx_sig_re[ii][f+k*ofdm_symbol_size]*path_loss;
rx_sig_im[ii][f+k*ofdm_symbol_size] = tx_sig_im[ii][f+k*ofdm_symbol_size]*path_loss;
}
} // ii
} // f
}//k
}
void multipath_channel_prach(channel_desc_t *desc,
double *tx_sig_re[2],
double *tx_sig_im[2],
double *rx_sig_re[2],
double *rx_sig_im[2],
uint32_t length,
uint8_t keep_channel)
{
LTE_DL_FRAME_PARMS* const fp = &PHY_vars_UE_g[0][0]->frame_parms;
int prach_samples;
lte_frame_type_t frame_type = PHY_vars_eNB_g[0][0]->frame_parms.frame_type;
uint8_t prach_ConfigIndex = PHY_vars_eNB_g[0][0]->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex;
uint8_t prach_fmt = get_prach_fmt(prach_ConfigIndex,frame_type);
int n_ra_prb;
int ii,j,k,f,l;
struct complex rx_tmp;
double delta_f;
FILE *file_prach;
file_prach = fopen("multipath_prach.txt","w");
prach_samples = (prach_fmt<4)?13+839+12:3+139+2;
double path_loss = pow(10,desc->path_loss_dB/20);
int nb_rb, n_samples, ofdm_symbol_size, symbols_per_tti;
n_ra_prb = get_prach_prb_offset(fp, PHY_vars_UE_g[0][0]->prach_resources[0]->ra_TDD_map_index, PHY_vars_eNB_g[0][0]->proc.frame_prach);
nb_rb=fp->N_RB_DL;
n_samples=fp->N_RB_DL*12+1;
ofdm_symbol_size=fp->ofdm_symbol_size;
symbols_per_tti=fp->symbols_per_tti;
delta_f = (prach_fmt<4)?nb_rb*180000/((n_samples-1)*12):nb_rb*180000/((n_samples-1)*2);
printf("prach_samples %d, n_ra_prb %d, delta_f %e\n",prach_samples,get_prach_prb_offset(fp, PHY_vars_UE_g[0][0]->prach_resources[0]->ra_TDD_map_index, PHY_vars_eNB_g[0][0]->proc.frame_prach), delta_f);
#ifdef DEBUG_CH
printf("[CHANNEL_PRACH] keep = %d : path_loss = %g (%f), nb_rx %d, nb_tx %d, len %d \n",keep_channel,path_loss,desc->path_loss_dB,desc->nb_rx,desc->nb_tx,desc->channel_length);
#endif
printf("[CHANNEL_PRACH] keep = %d : path_loss = %g (%f), nb_rx %d, nb_tx %d, len %d , symbols tti %d\n",keep_channel,path_loss,desc->path_loss_dB,desc->nb_rx,desc->nb_tx,desc->channel_length,symbols_per_tti);
if (keep_channel) {
// do nothing - keep channel
} else {
random_channel(desc,0);//Find a(l)
freq_channel_prach(desc,nb_rb,n_samples,prach_fmt,n_ra_prb);//Find desc->chF
}
for (l=0;l<symbols_per_tti;l++){//0-13 normal cyclic prefix
k = (12*n_ra_prb) - 6*fp->N_RB_UL;
if (k<0)
k+=fp->ofdm_symbol_size;
k*=12;
//k+=13;
k+=1;
for (f=0;f<prach_samples; f++) {
if (k>=((prach_fmt<4)?12:2)*ofdm_symbol_size)
k=0;
rx_tmp.x = 0;
rx_tmp.y = 0;
for (ii=0; ii<desc->nb_rx; ii++) {
for (j=0; j<desc->nb_tx; j++) {
//RX_RE(k) = TX_RE(k).chF(k).x - TX_IM(k).chF(k).y
rx_tmp.x += ((tx_sig_re[ii][k+l*ofdm_symbol_size*12] * desc->chF[ii+(j*desc->nb_rx)][f].x)-(tx_sig_im[ii][k+l*ofdm_symbol_size*12] * desc->chF[ii+(j*desc->nb_rx)][f].y));
//RX_IM(k) = TX_IM(k).chF(k).x + TX_RE(k).chF(k).y
rx_tmp.y += ((tx_sig_im[ii][k+l*ofdm_symbol_size*12] * desc->chF[ii+(j*desc->nb_rx)][f].x)+(tx_sig_re[ii][k+l*ofdm_symbol_size*12] * desc->chF[ii+(j*desc->nb_rx)][f].y));
} // j
rx_sig_re[ii][k+l*ofdm_symbol_size*12] = rx_tmp.x*path_loss;
rx_sig_im[ii][k+l*ofdm_symbol_size*12] = rx_tmp.y*path_loss;
//fprintf(file_prach,"%d\t%d\t%e\t%e\t%e\t%e\t%e\t%e\n",f,k,tx_sig_re[ii][k+l*ofdm_symbol_size*12],tx_sig_im[ii][k+l*ofdm_symbol_size*12],rx_sig_re[ii][k+l*ofdm_symbol_size*12],rx_sig_im[ii][k+l*ofdm_symbol_size*12],desc->chF[0][f].x,desc->chF[0][f].y);
//fflush(file_prach);
} // ii
k++;
} // f
}//l
}
......@@ -139,7 +139,7 @@ eNBs =
////////// MME parameters:
mme_ip_address = ( { ipv4 = "192.168.12.11";
mme_ip_address = ( { ipv4 = "172.24.11.201";
ipv6 = "192:168:30::17";
active = "yes";
preference = "ipv4";
......@@ -149,18 +149,18 @@ eNBs =
NETWORK_INTERFACES :
{
ENB_INTERFACE_NAME_FOR_S1_MME = "eth3";
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24";
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
ENB_IPV4_ADDRESS_FOR_S1_MME = "172.24.10.219/24";
ENB_INTERFACE_NAME_FOR_S1U = "eth3";
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24";
ENB_IPV4_ADDRESS_FOR_S1U = "172.24.10.219/24";
ENB_PORT_FOR_S1U = 2152; # Spec 2152
};
rrh_gw_config = (
{
local_if_name = "lo";
remote_address = "127.0.0.2";
local_address = "127.0.0.1";
local_if_name = "eth0";
remote_address = "192.168.12.170";
local_address = "192.168.12.171";
local_port = 50000; #for raw option local port must be the same to remote
remote_port = 50000;
rrh_gw_active = "yes";
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -767,14 +767,21 @@ l2l1_task (void *args_p)
< (oai_emulation.info.first_enb_local
+ oai_emulation.info.nb_enb_local));
eNB_inst++) {
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++)
current_eNB_rx_timestamp[eNB_inst][CC_id] += PHY_vars_eNB_g[eNB_inst][CC_id]->frame_parms.samples_per_tti;
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++){
if (PHY_vars_UE_g[0][0]->do_ofdm_mod)//frequency analysis
current_eNB_rx_timestamp[eNB_inst][CC_id] += PHY_vars_eNB_g[eNB_inst][CC_id]->frame_parms.ofdm_symbol_size*PHY_vars_eNB_g[eNB_inst][CC_id]->frame_parms.symbols_per_tti;
else//time analysis
current_eNB_rx_timestamp[eNB_inst][CC_id] += PHY_vars_eNB_g[eNB_inst][CC_id]->frame_parms.samples_per_tti;
}
}
for (UE_inst = 0; UE_inst<NB_UE_INST;UE_inst++) {
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++)
current_UE_rx_timestamp[UE_inst][CC_id] += PHY_vars_UE_g[UE_inst][CC_id]->frame_parms.samples_per_tti;
}
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++){
if (PHY_vars_UE_g[0][0]->do_ofdm_mod)//frequency analysis
current_UE_rx_timestamp[UE_inst][CC_id] += PHY_vars_UE_g[UE_inst][CC_id]->frame_parms.ofdm_symbol_size*PHY_vars_UE_g[UE_inst][CC_id]->frame_parms.symbols_per_tti;
else//time analysis
current_UE_rx_timestamp[UE_inst][CC_id] += PHY_vars_UE_g[UE_inst][CC_id]->frame_parms.samples_per_tti;
}
}
for (eNB_inst = oai_emulation.info.first_enb_local;
(eNB_inst
< (oai_emulation.info.first_enb_local
......
......@@ -122,6 +122,7 @@ int map1,map2;
double **ShaF = NULL;
// pointers signal buffers (s = transmit, r,r0 = receive)
double **s_re, **s_im, **r_re, **r_im, **r_re0, **r_im0;
double **s_re_f, **s_im_f, **r_re_f, **r_im_f, **r_re0_f, **r_im0_f;
node_list* ue_node_list = NULL;
node_list* enb_node_list = NULL;
int omg_period = 10000;
......@@ -1049,8 +1050,19 @@ int eNB_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void *
openair0_timestamp last = last_eNB_rx_timestamp[eNB_id][CC_id];
*ptimestamp = last_eNB_rx_timestamp[eNB_id][CC_id];
int do_ofdm_mod = PHY_vars_UE_g[0][CC_id]->do_ofdm_mod;
LTE_DL_FRAME_PARMS *frame_parms=&PHY_vars_UE_g[0][CC_id]->frame_parms;
LOG_D(EMU,"eNB_trx_read nsamps %d TS(%"PRId64",%"PRId64") => subframe %d\n",nsamps,
uint32_t frame;
if (do_ofdm_mod)
LOG_D(EMU,"eNB_trx_read nsamps %d TS(%"PRId64",%"PRId64") => subframe %d\n",nsamps,
current_eNB_rx_timestamp[eNB_id][CC_id],
last_eNB_rx_timestamp[eNB_id][CC_id],
(int)((*ptimestamp/(PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.ofdm_symbol_size*PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.symbols_per_tti))%10));
else
LOG_D(EMU,"eNB_trx_read nsamps %d TS(%"PRId64",%"PRId64") => subframe %d\n",nsamps,
current_eNB_rx_timestamp[eNB_id][CC_id],
last_eNB_rx_timestamp[eNB_id][CC_id],
(int)((*ptimestamp/PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti)%10));
......@@ -1071,14 +1083,49 @@ int eNB_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void *
nsamps -= read_samples;
if (current_eNB_rx_timestamp[eNB_id][CC_id] == last) {
subframe = (last/PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti)%10;
//subframe = (subframe+9) % 10;
if (do_ofdm_mod)
{
subframe = (last/(PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.ofdm_symbol_size*PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.symbols_per_tti))%10;
frame = (last/(10*PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.ofdm_symbol_size*PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.symbols_per_tti))%1023;
}
else
{
subframe = (last/PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti)%10;
frame = (last/(10*PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti))%1023;
}
printf("[oaisim_functs] subframe %d, frame %d\n",subframe,frame);
LOG_D(PHY,"eNB_trx_read generating UL subframe %d (Ts %llu, current TS %llu)\n",
subframe,(unsigned long long)*ptimestamp,
(unsigned long long)current_eNB_rx_timestamp[eNB_id][CC_id]);
do_UL_sig(UE2eNB,
if (do_ofdm_mod)
{
write_output("txprachF.m","prach_txF", PHY_vars_UE_g[0][0]->prach_vars[0]->prachF,frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti,1,1);
//generate_prach(PHY_vars_UE_g[0][0],eNB_id,subframe,frame);
//PHY_vars_UE_g[0][0]->generate_prach=1;
if (is_prach_subframe(frame_parms,frame,subframe))
do_UL_prach(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);
do_UL_sig_freq(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);
}
else
do_UL_sig(UE2eNB,
enb_data,
ue_data,
subframe,
......@@ -1102,12 +1149,14 @@ int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void **
int ret = nsamps;
int UE_id = device->Mod_id;
int CC_id = device->CC_id;
int subframe;
int subframe, frame;
int read_samples, max_samples;
openair0_timestamp last = last_UE_rx_timestamp[UE_id][CC_id];
*ptimestamp = last_UE_rx_timestamp[UE_id][CC_id];
int do_ofdm_mod = PHY_vars_UE_g[0][0]->do_ofdm_mod;
LOG_D(EMU,"UE_trx_read nsamps %d TS(%llu,%llu) antenna %d\n",nsamps,
(unsigned long long)current_UE_rx_timestamp[UE_id][CC_id],
(unsigned long long)last_UE_rx_timestamp[UE_id][CC_id],
......@@ -1143,13 +1192,32 @@ int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void **
if (current_UE_rx_timestamp[UE_id][CC_id] == last) {
// we have one subframe here so generate the received signal
subframe = (last/PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti)%10;
if (do_ofdm_mod)
{
subframe = (last/(PHY_vars_UE_g[UE_id][CC_id]->frame_parms.ofdm_symbol_size*PHY_vars_UE_g[UE_id][CC_id]->frame_parms.symbols_per_tti))%10;
frame = (last/(10*PHY_vars_UE_g[UE_id][CC_id]->frame_parms.ofdm_symbol_size*PHY_vars_UE_g[UE_id][CC_id]->frame_parms.symbols_per_tti))%1023;
}
else
{
subframe = (last/PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti)%10;
frame = (last/(10*PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti))%1023;
}
printf("[oaisim_functs] subframe %d, frame %d\n",subframe,frame);
//subframe = (subframe+9) % 10;
LOG_D(PHY,"UE_trx_read generating DL subframe %d (Ts %llu, current TS %llu)\n",
subframe,(unsigned long long)*ptimestamp,
(unsigned long long)current_UE_rx_timestamp[UE_id][CC_id]);
if (do_ofdm_mod)
do_DL_sig_freq(eNB2UE,
enb_data,
ue_data,
subframe,
0, //abstraction_flag,
&PHY_vars_UE_g[UE_id][CC_id]->frame_parms,
UE_id,
CC_id);
else
do_DL_sig(eNB2UE,
enb_data,
ue_data,
......@@ -1273,6 +1341,9 @@ void init_devices(void){
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;
if (PHY_vars_UE_g[0][0]->do_ofdm_mod)
current_eNB_rx_timestamp[eNB_id][CC_id] = PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.ofdm_symbol_size*PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.symbols_per_tti;
else
current_eNB_rx_timestamp[eNB_id][CC_id] = PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti;
last_eNB_rx_timestamp[eNB_id][CC_id] = 0;
}
......@@ -1286,7 +1357,10 @@ void init_devices(void){
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;
current_UE_rx_timestamp[UE_id][CC_id] = PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti;
if (PHY_vars_UE_g[0][0]->do_ofdm_mod)
current_UE_rx_timestamp[UE_id][CC_id] = PHY_vars_UE_g[UE_id][CC_id]->frame_parms.ofdm_symbol_size*PHY_vars_UE_g[UE_id][CC_id]->frame_parms.symbols_per_tti;
else
current_UE_rx_timestamp[UE_id][CC_id] = PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti;
last_UE_rx_timestamp[UE_id][CC_id] = 0;
}
......@@ -1485,6 +1559,11 @@ void init_ocm(void)
char* frame_type = "unknown";
int do_ofdm_mod = PHY_vars_UE_g[0][0]->do_ofdm_mod;
int nb_rb, n_samples;
nb_rb=PHY_vars_UE_g[0][0]->frame_parms.N_RB_DL;
n_samples=nb_rb*12+1;
switch (oai_emulation.info.frame_type[0]) {
case FDD:
frame_type = "FDD";
......@@ -1537,7 +1616,11 @@ void init_ocm(void)
}
if (abstraction_flag == 0)
init_channel_vars (frame_parms[0], &s_re, &s_im, &r_re, &r_im, &r_re0, &r_im0);
if (do_ofdm_mod)
init_channel_vars_freq (frame_parms[0], &s_re_f, &s_im_f, &r_re_f, &r_im_f, &r_re0_f, &r_im0_f);
else
init_channel_vars (frame_parms[0], &s_re, &s_im, &r_re, &r_im, &r_re0, &r_im0);
// initialize channel descriptors
for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) {
......@@ -1556,7 +1639,15 @@ void init_ocm(void)
forgetting_factor,
0,
0);
random_channel(eNB2UE[eNB_id][UE_id][CC_id],abstraction_flag);
if (do_ofdm_mod)
{
random_channel(eNB2UE[eNB_id][UE_id][CC_id],abstraction_flag);//Find a(l)
freq_channel(eNB2UE[eNB_id][UE_id][CC_id],nb_rb,n_samples);//Find desc->chF
}
else
random_channel(eNB2UE[eNB_id][UE_id][CC_id],abstraction_flag);
LOG_D(OCM,"[SIM] Initializing channel (%s, %d) from UE %d to eNB %d\n", oai_emulation.environment_system_config.fading.small_scale.selected_option,
map_str_to_int(small_scale_names, oai_emulation.environment_system_config.fading.small_scale.selected_option),UE_id, eNB_id);
......@@ -1569,8 +1660,13 @@ void init_ocm(void)
forgetting_factor,
0,
0);
random_channel(UE2eNB[UE_id][eNB_id][CC_id],abstraction_flag);
if (do_ofdm_mod)
{
random_channel(UE2eNB[UE_id][eNB_id][CC_id],abstraction_flag);//Find a(l)
freq_channel(UE2eNB[UE_id][eNB_id][CC_id],nb_rb,n_samples);//Find desc->chF
}
else
random_channel(UE2eNB[UE_id][eNB_id][CC_id],abstraction_flag);
// to make channel reciprocal uncomment following line instead of previous. However this only works for SISO at the moment. For MIMO the channel would need to be transposed.
//UE2eNB[UE_id][eNB_id] = eNB2UE[eNB_id][UE_id];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment