Commit d06018d1 authored by Raymond Knopp's avatar Raymond Knopp

Merge branch 'four_antenna_eNB' into oairu

parents 7a169947 89657f20
...@@ -852,7 +852,7 @@ endif (${RU} STREQUAL 0) ...@@ -852,7 +852,7 @@ endif (${RU} STREQUAL 0)
# Hardware dependant options # Hardware dependant options
################################### ###################################
add_list1_option(NB_ANTENNAS_RX "2" "Number of antennas in reception" "1" "2" "4") add_list1_option(NB_ANTENNAS_RX "4" "Number of antennas in reception" "1" "2" "4")
add_list1_option(NB_ANTENNAS_TX "4" "Number of antennas in transmission" "1" "2" "4") add_list1_option(NB_ANTENNAS_TX "4" "Number of antennas in transmission" "1" "2" "4")
add_list2_option(RF_BOARD "EXMIMO" "RF head type" "None" "OAI_USRP" "OAI_BLADERF" "OAI_LMSSDR" "OAI_SIMU") add_list2_option(RF_BOARD "EXMIMO" "RF head type" "None" "OAI_USRP" "OAI_BLADERF" "OAI_LMSSDR" "OAI_SIMU")
......
...@@ -519,7 +519,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, ...@@ -519,7 +519,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
AssertFatal (fp->symbols_per_tti > 11, "fp->symbols_per_tti %d < 12\n", fp->symbols_per_tti); AssertFatal (fp->symbols_per_tti > 11, "fp->symbols_per_tti %d < 12\n", fp->symbols_per_tti);
AssertFatal (fp->N_RB_UL > 5, "fp->N_RB_UL %d < 6\n", fp->N_RB_UL); AssertFatal (fp->N_RB_UL > 5, "fp->N_RB_UL %d < 6\n", fp->N_RB_UL);
for (i = 0; i < 2; i++) { for (i = 0; i < fp->nb_antennas_rx; i++) {
// FIXME We should get rid of this // FIXME We should get rid of this
pusch_vars[ULSCH_id]->rxdataF_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti ); pusch_vars[ULSCH_id]->rxdataF_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti );
...@@ -592,7 +592,7 @@ void phy_free_lte_eNB(PHY_VARS_eNB *eNB) { ...@@ -592,7 +592,7 @@ void phy_free_lte_eNB(PHY_VARS_eNB *eNB) {
free_and_zero(prach_vars->rxsigF[0]); free_and_zero(prach_vars->rxsigF[0]);
for (int ULSCH_id=0; ULSCH_id<NUMBER_OF_ULSCH_MAX; ULSCH_id++) { for (int ULSCH_id=0; ULSCH_id<NUMBER_OF_ULSCH_MAX; ULSCH_id++) {
for (i = 0; i < 2; i++) { for (i = 0; i < fp->nb_antennas_rx; i++) {
free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext[i]); free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext[i]);
free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext2[i]); free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext2[i]);
free_and_zero(pusch_vars[ULSCH_id]->drs_ch_estimates[i]); free_and_zero(pusch_vars[ULSCH_id]->drs_ch_estimates[i]);
......
...@@ -121,8 +121,8 @@ int lte_est_timing_advance_pusch(LTE_DL_FRAME_PARMS *frame_parms, ...@@ -121,8 +121,8 @@ int lte_est_timing_advance_pusch(LTE_DL_FRAME_PARMS *frame_parms,
int sync_pos = 0;//(frame_parms->ofdm_symbol_size-cyclic_shift*frame_parms->ofdm_symbol_size/12)%(frame_parms->ofdm_symbol_size); int sync_pos = 0;//(frame_parms->ofdm_symbol_size-cyclic_shift*frame_parms->ofdm_symbol_size/12)%(frame_parms->ofdm_symbol_size);
AssertFatal(frame_parms->ofdm_symbol_size > 127,"frame_parms->ofdm_symbol_size %d<128\n",frame_parms->ofdm_symbol_size); AssertFatal(frame_parms->ofdm_symbol_size > 127,"frame_parms->ofdm_symbol_size %d<128\n",frame_parms->ofdm_symbol_size);
AssertFatal(frame_parms->nb_antennas_rx >0 && frame_parms->nb_antennas_rx<3,"frame_parms->nb_antennas_rx %d not in [0,1]\n", AssertFatal(frame_parms->nb_antennas_rx >0 && frame_parms->nb_antennas_rx<=4,"frame_parms->nb_antennas_rx %d not in [1...%d]\n",
frame_parms->nb_antennas_rx); frame_parms->nb_antennas_rx,4);
for (i = 0; i < frame_parms->ofdm_symbol_size; i++) { for (i = 0; i < frame_parms->ofdm_symbol_size; i++) {
temp = 0; temp = 0;
......
...@@ -112,34 +112,33 @@ void lte_eNB_I0_measurements(PHY_VARS_eNB *eNB, ...@@ -112,34 +112,33 @@ void lte_eNB_I0_measurements(PHY_VARS_eNB *eNB,
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
measurements->n0_subband_power[aarx][rb] = 0; measurements->n0_subband_power[aarx][rb] = 0;
for (int s=0;s<(14-(frame_parms->Ncp<<1));s++) { for (int s=0;s<(14-(frame_parms->Ncp<<1));s++) {
// select the 7th symbol in an uplink subframe offset = offset0 + (s*frame_parms->ofdm_symbol_size);
offset = offset0 + (s*frame_parms->ofdm_symbol_size); ul_ch = &common_vars->rxdataF[aarx][offset];
ul_ch = &common_vars->rxdataF[aarx][offset]; len = 12;
len = 12;
// just do first half of middle PRB for odd number of PRBs // just do first half of middle PRB for odd number of PRBs
if (((frame_parms->N_RB_UL&1) == 1) && if (((frame_parms->N_RB_UL&1) == 1) &&
(rb==(frame_parms->N_RB_UL>>1))) { (rb==(frame_parms->N_RB_UL>>1))) {
len=6; len=6;
} }
AssertFatal(ul_ch, "RX signal buffer (freq) problem"); AssertFatal(ul_ch, "RX signal buffer (freq) problem");
measurements->n0_subband_power[aarx][rb] += signal_energy_nodc(ul_ch,len); measurements->n0_subband_power[aarx][rb] += signal_energy_nodc(ul_ch,len);
} } // symbol
measurements->n0_subband_power[aarx][rb]/=(14-(frame_parms->Ncp<<1)); measurements->n0_subband_power[aarx][rb]/=(14-(frame_parms->Ncp<<1));
measurements->n0_subband_power_dB[aarx][rb] = dB_fixed(measurements->n0_subband_power[aarx][rb]); measurements->n0_subband_power_dB[aarx][rb] = dB_fixed(measurements->n0_subband_power[aarx][rb]);
n0_power_tot += measurements->n0_subband_power[aarx][rb]; n0_power_tot += measurements->n0_subband_power[aarx][rb];
} } //antenna
n0_power_tot/=frame_parms->nb_antennas_rx; n0_power_tot/=frame_parms->nb_antennas_rx;
n0_power_tot2 += n0_power_tot; n0_power_tot2 += n0_power_tot;
measurements->n0_subband_power_tot_dB[rb] = dB_fixed(n0_power_tot); measurements->n0_subband_power_tot_dB[rb] = dB_fixed(n0_power_tot);
measurements->n0_subband_power_tot_dBm[rb] = measurements->n0_subband_power_tot_dB[rb] - eNB->rx_total_gain_dB - dB_fixed(frame_parms->N_RB_UL); measurements->n0_subband_power_tot_dBm[rb] = measurements->n0_subband_power_tot_dB[rb] - eNB->rx_total_gain_dB - dB_fixed(frame_parms->N_RB_UL);
} } //rb not used in subframe
} } //rb
if (nb_rb>0) measurements->n0_subband_power_avg_dB = dB_fixed(n0_power_tot2/nb_rb); if (nb_rb>0) measurements->n0_subband_power_avg_dB = dB_fixed(n0_power_tot2/nb_rb);
} }
......
...@@ -42,10 +42,10 @@ extern int16_t *ul_ref_sigs_rx[30][2][34]; ...@@ -42,10 +42,10 @@ extern int16_t *ul_ref_sigs_rx[30][2][34];
int32_t lte_ul_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms, int32_t lte_ul_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms,
L1_rxtx_proc_t *proc, L1_rxtx_proc_t *proc,
LTE_eNB_ULSCH_t * ulsch, LTE_eNB_ULSCH_t * ulsch,
int32_t **ul_ch_estimates, int32_t **ul_ch_estimates,
int32_t **ul_ch_estimates_time, int32_t **ul_ch_estimates_time,
int32_t **rxdataF_ext, int32_t **rxdataF_ext,
module_id_t UE_id, module_id_t UE_id,
unsigned char l, unsigned char l,
unsigned char Ns) { unsigned char Ns) {
......
...@@ -99,7 +99,7 @@ void dump_uci_stats(FILE *fd,PHY_VARS_eNB *eNB,int frame) { ...@@ -99,7 +99,7 @@ void dump_uci_stats(FILE *fd,PHY_VARS_eNB *eNB,int frame) {
/* PUCCH format3 >> */ /* PUCCH format3 >> */
/* SubCarrier Demap */ /* SubCarrier Demap */
uint16_t pucchfmt3_subCarrierDeMapping( PHY_VARS_eNB *eNB, uint16_t pucchfmt3_subCarrierDeMapping( PHY_VARS_eNB *eNB,
int16_t SubCarrierDeMapData[NB_ANTENNAS_RX][14][12][2], int16_t SubCarrierDeMapData[4][14][12][2],
uint16_t n3_pucch ) { uint16_t n3_pucch ) {
LTE_eNB_COMMON *eNB_common_vars = &eNB->common_vars; LTE_eNB_COMMON *eNB_common_vars = &eNB->common_vars;
LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
...@@ -149,8 +149,8 @@ uint16_t pucchfmt3_subCarrierDeMapping( PHY_VARS_eNB *eNB, ...@@ -149,8 +149,8 @@ uint16_t pucchfmt3_subCarrierDeMapping( PHY_VARS_eNB *eNB,
} }
/* cyclic shift hopping remove */ /* cyclic shift hopping remove */
uint16_t pucchfmt3_Baseseq_csh_remove( int16_t SubCarrierDeMapData[NB_ANTENNAS_RX][14][12][2], uint16_t pucchfmt3_Baseseq_csh_remove( int16_t SubCarrierDeMapData[4][14][12][2],
int16_t CshData_fmt3[NB_ANTENNAS_RX][14][12][2], int16_t CshData_fmt3[4][14][12][2],
LTE_DL_FRAME_PARMS *frame_parms, LTE_DL_FRAME_PARMS *frame_parms,
uint8_t subframe, uint8_t subframe,
uint8_t ncs_cell[20][7] ) { uint8_t ncs_cell[20][7] ) {
...@@ -200,9 +200,9 @@ const int16_t TBL_3_SF5_GEN_N_DASH_NS[MAXROW_TBL_SF5_OS_IDX] = {0,3,6,8,10}; ...@@ -200,9 +200,9 @@ const int16_t TBL_3_SF5_GEN_N_DASH_NS[MAXROW_TBL_SF5_OS_IDX] = {0,3,6,8,10};
const int16_t TBL_3_SF4_GEN_N_DASH_NS[MAXROW_TBL_SF4_OS_IDX] = {0,3,6,9}; const int16_t TBL_3_SF4_GEN_N_DASH_NS[MAXROW_TBL_SF4_OS_IDX] = {0,3,6,9};
/* Channel estimation */ /* Channel estimation */
uint16_t pucchfmt3_ChannelEstimation( int16_t SubCarrierDeMapData[NB_ANTENNAS_RX][14][12][2], uint16_t pucchfmt3_ChannelEstimation( int16_t SubCarrierDeMapData[4][14][12][2],
double delta_theta[NB_ANTENNAS_RX][12], double delta_theta[4][12],
int16_t ChestValue[NB_ANTENNAS_RX][2][12][2], int16_t ChestValue[4][2][12][2],
int16_t *Interpw, int16_t *Interpw,
uint8_t subframe, uint8_t subframe,
uint8_t shortened_format, uint8_t shortened_format,
...@@ -214,12 +214,12 @@ uint16_t pucchfmt3_ChannelEstimation( int16_t SubCarrierDeMapData[NB_ANTENNAS_RX ...@@ -214,12 +214,12 @@ uint16_t pucchfmt3_ChannelEstimation( int16_t SubCarrierDeMapData[NB_ANTENNAS_RX
int16_t np, np_n, ip_ind=-1; int16_t np, np_n, ip_ind=-1;
//int16_t npucch_sf; //int16_t npucch_sf;
int16_t calctmp[2]; int16_t calctmp[2];
int16_t BsCshData[NB_ANTENNAS_RX][D_NSYM1SF][D_NSC1RB][2]; int16_t BsCshData[4][D_NSYM1SF][D_NSC1RB][2];
//int16_t delta_theta_calctmp[NB_ANTENNAS_RX][4][D_NSC1RB][2], delta_theta_comp[NB_ANTENNAS_RX][D_NSC1RB][2]; //int16_t delta_theta_calctmp[4][4][D_NSC1RB][2], delta_theta_comp[4][D_NSC1RB][2];
int16_t delta_theta_comp[NB_ANTENNAS_RX][D_NSC1RB][2]; int16_t delta_theta_comp[4][D_NSC1RB][2];
int16_t CsData_allavg[NB_ANTENNAS_RX][14][2]; int16_t CsData_allavg[4][14][2];
int16_t CsData_temp[NB_ANTENNAS_RX][D_NSYM1SF][D_NSC1RB][2]; int16_t CsData_temp[4][D_NSYM1SF][D_NSC1RB][2];
int32_t IP_CsData_allsfavg[NB_ANTENNAS_RX][14][4][2]; int32_t IP_CsData_allsfavg[4][14][4][2];
int32_t IP_allavg[D_NPUCCH_SF5]; int32_t IP_allavg[D_NPUCCH_SF5];
//int16_t temp_ch[2]; //int16_t temp_ch[2];
int16_t m[NUMBER_OF_UE_MAX], m_self=0, same_m_number; int16_t m[NUMBER_OF_UE_MAX], m_self=0, same_m_number;
...@@ -463,9 +463,9 @@ uint16_t pucchfmt3_ChannelEstimation( int16_t SubCarrierDeMapData[NB_ANTENNAS_RX ...@@ -463,9 +463,9 @@ uint16_t pucchfmt3_ChannelEstimation( int16_t SubCarrierDeMapData[NB_ANTENNAS_RX
} }
/* Channel Equalization */ /* Channel Equalization */
uint16_t pucchfmt3_Equalization( int16_t CshData_fmt3[NB_ANTENNAS_RX][14][12][2], uint16_t pucchfmt3_Equalization( int16_t CshData_fmt3[4][14][12][2],
int16_t ChdetAfterValue_fmt3[NB_ANTENNAS_RX][14][12][2], int16_t ChdetAfterValue_fmt3[4][14][12][2],
int16_t ChestValue[NB_ANTENNAS_RX][2][12][2], int16_t ChestValue[4][2][12][2],
LTE_DL_FRAME_PARMS *frame_parms) { LTE_DL_FRAME_PARMS *frame_parms) {
int16_t aa, sltNo, symNo, k; int16_t aa, sltNo, symNo, k;
...@@ -488,9 +488,9 @@ uint16_t pucchfmt3_Equalization( int16_t CshData_fmt3[NB_ANTENNAS_RX][14][12][2] ...@@ -488,9 +488,9 @@ uint16_t pucchfmt3_Equalization( int16_t CshData_fmt3[NB_ANTENNAS_RX][14][12][2]
} }
/* Frequency deviation remove AFC */ /* Frequency deviation remove AFC */
uint16_t pucchfmt3_FrqDevRemove( int16_t ChdetAfterValue_fmt3[NB_ANTENNAS_RX][14][12][2], uint16_t pucchfmt3_FrqDevRemove( int16_t ChdetAfterValue_fmt3[4][14][12][2],
double delta_theta[NB_ANTENNAS_RX][12], double delta_theta[4][12],
int16_t RemoveFrqDev_fmt3[NB_ANTENNAS_RX][2][5][12][2], int16_t RemoveFrqDev_fmt3[4][2][5][12][2],
LTE_DL_FRAME_PARMS *frame_parms ) { LTE_DL_FRAME_PARMS *frame_parms ) {
int16_t aa, sltNo, symNo1slt, k, n; int16_t aa, sltNo, symNo1slt, k, n;
double calctmp[2]; double calctmp[2];
...@@ -540,8 +540,8 @@ const int16_t TBL_3_SF4[MAXROW_TBL_SF4_fmt3][MAXCLM_TBL_SF4][2] = { ...@@ -540,8 +540,8 @@ const int16_t TBL_3_SF4[MAXROW_TBL_SF4_fmt3][MAXCLM_TBL_SF4][2] = {
}; };
/* orthogonal sequence remove */ /* orthogonal sequence remove */
uint16_t pucchfmt3_OrthSeqRemove( int16_t RemoveFrqDev_fmt3[NB_ANTENNAS_RX][2][5][12][2], uint16_t pucchfmt3_OrthSeqRemove( int16_t RemoveFrqDev_fmt3[4][2][5][12][2],
int16_t Fmt3xDataRmvOrth[NB_ANTENNAS_RX][2][5][12][2], int16_t Fmt3xDataRmvOrth[4][2][5][12][2],
uint8_t shortened_format, uint8_t shortened_format,
uint16_t n3_pucch, uint16_t n3_pucch,
LTE_DL_FRAME_PARMS *frame_parms ) { LTE_DL_FRAME_PARMS *frame_parms ) {
...@@ -587,7 +587,7 @@ uint16_t pucchfmt3_OrthSeqRemove( int16_t RemoveFrqDev_fmt3[NB_ANTENNAS_RX][2][5 ...@@ -587,7 +587,7 @@ uint16_t pucchfmt3_OrthSeqRemove( int16_t RemoveFrqDev_fmt3[NB_ANTENNAS_RX][2][5
} }
/* averaging antenna */ /* averaging antenna */
uint16_t pucchfmt3_AvgAnt( int16_t Fmt3xDataRmvOrth[NB_ANTENNAS_RX][2][5][12][2], uint16_t pucchfmt3_AvgAnt( int16_t Fmt3xDataRmvOrth[4][2][5][12][2],
int16_t Fmt3xDataAvgAnt[2][5][12][2], int16_t Fmt3xDataAvgAnt[2][5][12][2],
uint8_t shortened_format, uint8_t shortened_format,
LTE_DL_FRAME_PARMS *frame_parms ) { LTE_DL_FRAME_PARMS *frame_parms ) {
...@@ -907,7 +907,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, ...@@ -907,7 +907,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
uint32_t u,v,n,aa; uint32_t u,v,n,aa;
uint32_t z[12*14]; uint32_t z[12*14];
int16_t *zptr; int16_t *zptr;
int16_t rxcomp[NB_ANTENNAS_RX][2*12*14]; int16_t rxcomp[4][2*12*14];
uint8_t ns,N_UL_symb,nsymb,n_oc,n_oc0,n_oc1; uint8_t ns,N_UL_symb,nsymb,n_oc,n_oc0,n_oc1;
uint8_t c = (frame_parms->Ncp==0) ? 3 : 2; uint8_t c = (frame_parms->Ncp==0) ? 3 : 2;
int16_t nprime,nprime0,nprime1; int16_t nprime,nprime0,nprime1;
...@@ -918,12 +918,12 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, ...@@ -918,12 +918,12 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
int16_t tmp_re,tmp_im,W_re=0,W_im=0; int16_t tmp_re,tmp_im,W_re=0,W_im=0;
int16_t *rxptr; int16_t *rxptr;
uint32_t symbol_offset; uint32_t symbol_offset;
int16_t stat0_ref_re[NB_ANTENNAS_RX],stat0_ref_im[NB_ANTENNAS_RX],stat1_ref_re[NB_ANTENNAS_RX],stat1_ref_im[NB_ANTENNAS_RX],*cfo; int16_t stat0_ref_re[4],stat0_ref_im[4],stat1_ref_re[4],stat1_ref_im[4],*cfo;
int16_t chest0_re[NB_ANTENNAS_RX][12],chest0_im[NB_ANTENNAS_RX][12]; int16_t chest0_re[4][12],chest0_im[4][12];
int16_t chest1_re[NB_ANTENNAS_RX][12],chest1_im[NB_ANTENNAS_RX][12]; int16_t chest1_re[4][12],chest1_im[4][12];
int32_t chest_mag; int32_t chest_mag;
int32_t stat0_re[NB_ANTENNAS_RX],stat1_re[NB_ANTENNAS_RX],stat0_im[NB_ANTENNAS_RX],stat1_im[NB_ANTENNAS_RX]; int32_t stat0_re[4],stat1_re[4],stat0_im[4],stat1_im[4];
uint32_t stat0[NB_ANTENNAS_RX],stat1[NB_ANTENNAS_RX],stat_max=0,stat0_max[NB_ANTENNAS_RX],stat1_max[NB_ANTENNAS_RX]; uint32_t stat0[4],stat1[4],stat_max=0,stat0_max[4],stat1_max[4];
uint8_t log2_maxh; uint8_t log2_maxh;
uint8_t deltaPUCCH_Shift = frame_parms->pucch_config_common.deltaPUCCH_Shift; uint8_t deltaPUCCH_Shift = frame_parms->pucch_config_common.deltaPUCCH_Shift;
uint8_t NRB2 = frame_parms->pucch_config_common.nRB_CQI; uint8_t NRB2 = frame_parms->pucch_config_common.nRB_CQI;
...@@ -936,13 +936,13 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, ...@@ -936,13 +936,13 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
int chL; int chL;
/* PUCCH format3 >> */ /* PUCCH format3 >> */
uint16_t Ret = 0; uint16_t Ret = 0;
int16_t SubCarrierDeMapData[NB_ANTENNAS_RX][14][12][2]; //[Antenna][Symbol][Subcarrier][Complex] int16_t SubCarrierDeMapData[4][14][12][2]; //[Antenna][Symbol][Subcarrier][Complex]
int16_t CshData_fmt3[NB_ANTENNAS_RX][14][12][2]; //[Antenna][Symbol][Subcarrier][Complex] int16_t CshData_fmt3[4][14][12][2]; //[Antenna][Symbol][Subcarrier][Complex]
double delta_theta[NB_ANTENNAS_RX][12]; //[Antenna][Subcarrier][Complex] double delta_theta[4][12]; //[Antenna][Subcarrier][Complex]
int16_t ChestValue[NB_ANTENNAS_RX][2][12][2]; //[Antenna][Slot][Subcarrier][Complex] int16_t ChestValue[4][2][12][2]; //[Antenna][Slot][Subcarrier][Complex]
int16_t ChdetAfterValue_fmt3[NB_ANTENNAS_RX][14][12][2]; //[Antenna][Symbol][Subcarrier][Complex] int16_t ChdetAfterValue_fmt3[4][14][12][2]; //[Antenna][Symbol][Subcarrier][Complex]
int16_t RemoveFrqDev_fmt3[NB_ANTENNAS_RX][2][5][12][2]; //[Antenna][Slot][PUCCH_Symbol][Subcarrier][Complex] int16_t RemoveFrqDev_fmt3[4][2][5][12][2]; //[Antenna][Slot][PUCCH_Symbol][Subcarrier][Complex]
int16_t Fmt3xDataRmvOrth[NB_ANTENNAS_RX][2][5][12][2]; //[Antenna][Slot][PUCCH_Symbol][Subcarrier][Complex] int16_t Fmt3xDataRmvOrth[4][2][5][12][2]; //[Antenna][Slot][PUCCH_Symbol][Subcarrier][Complex]
int16_t Fmt3xDataAvgAnt[2][5][12][2]; //[Slot][PUCCH_Symbol][Subcarrier][Complex] int16_t Fmt3xDataAvgAnt[2][5][12][2]; //[Slot][PUCCH_Symbol][Subcarrier][Complex]
int16_t Fmt3xDataAvgSym[2][12][2]; //[Slot][Subcarrier][Complex] int16_t Fmt3xDataAvgSym[2][12][2]; //[Slot][Subcarrier][Complex]
int16_t IFFTOutData_Fmt3[2][12][2]; //[Slot][Subcarrier][Complex] int16_t IFFTOutData_Fmt3[2][12][2]; //[Slot][Subcarrier][Complex]
......
...@@ -630,11 +630,15 @@ void ulsch_detection_mrc(LTE_DL_FRAME_PARMS *frame_parms, ...@@ -630,11 +630,15 @@ void ulsch_detection_mrc(LTE_DL_FRAME_PARMS *frame_parms,
uint8_t symbol, uint8_t symbol,
uint16_t nb_rb) { uint16_t nb_rb) {
#if defined(__x86_64__) || defined(__i386__) #if defined(__x86_64__) || defined(__i386__)
__m128i *rxdataF_comp128_0,*ul_ch_mag128_0,*ul_ch_mag128_0b; __m128i *rxdataF_comp128_0=NULL,*ul_ch_mag128_0=NULL,*ul_ch_mag128_0b=NULL;
__m128i *rxdataF_comp128_1,*ul_ch_mag128_1,*ul_ch_mag128_1b; __m128i *rxdataF_comp128_1=NULL,*ul_ch_mag128_1=NULL,*ul_ch_mag128_1b=NULL;
__m128i *rxdataF_comp128_2=NULL,*ul_ch_mag128_2=NULL,*ul_ch_mag128_2b=NULL;
__m128i *rxdataF_comp128_3=NULL,*ul_ch_mag128_3=NULL,*ul_ch_mag128_3b=NULL;
#elif defined(__arm__) #elif defined(__arm__)
int16x8_t *rxdataF_comp128_0,*ul_ch_mag128_0,*ul_ch_mag128_0b; int16x8_t *rxdataF_comp128_0,*ul_ch_mag128_0,*ul_ch_mag128_0b;
int16x8_t *rxdataF_comp128_1,*ul_ch_mag128_1,*ul_ch_mag128_1b; int16x8_t *rxdataF_comp128_1,*ul_ch_mag128_1,*ul_ch_mag128_1b;
int16x8_t *rxdataF_comp128_2,*ul_ch_mag128_2,*ul_ch_mag128_2b;
int16x8_t *rxdataF_comp128_3,*ul_ch_mag128_3,*ul_ch_mag128_3b;
#endif #endif
int32_t i; int32_t i;
...@@ -646,15 +650,39 @@ void ulsch_detection_mrc(LTE_DL_FRAME_PARMS *frame_parms, ...@@ -646,15 +650,39 @@ void ulsch_detection_mrc(LTE_DL_FRAME_PARMS *frame_parms,
ul_ch_mag128_1 = (__m128i *)&ul_ch_mag[1][symbol*frame_parms->N_RB_DL*12]; ul_ch_mag128_1 = (__m128i *)&ul_ch_mag[1][symbol*frame_parms->N_RB_DL*12];
ul_ch_mag128_0b = (__m128i *)&ul_ch_magb[0][symbol*frame_parms->N_RB_DL*12]; ul_ch_mag128_0b = (__m128i *)&ul_ch_magb[0][symbol*frame_parms->N_RB_DL*12];
ul_ch_mag128_1b = (__m128i *)&ul_ch_magb[1][symbol*frame_parms->N_RB_DL*12]; ul_ch_mag128_1b = (__m128i *)&ul_ch_magb[1][symbol*frame_parms->N_RB_DL*12];
if (frame_parms->nb_antennas_rx>2) {
// MRC on each re of rb, both on MF output and magnitude (for 16QAM/64QAM llr computation) rxdataF_comp128_2 = (__m128i *)&rxdataF_comp[2][symbol*frame_parms->N_RB_DL*12];
for (i=0; i<nb_rb*3; i++) { ul_ch_mag128_2 = (__m128i *)&ul_ch_mag[2][symbol*frame_parms->N_RB_DL*12];
rxdataF_comp128_0[i] = _mm_adds_epi16(_mm_srai_epi16(rxdataF_comp128_0[i],1),_mm_srai_epi16(rxdataF_comp128_1[i],1)); ul_ch_mag128_2b = (__m128i *)&ul_ch_magb[2][symbol*frame_parms->N_RB_DL*12];
ul_ch_mag128_0[i] = _mm_adds_epi16(_mm_srai_epi16(ul_ch_mag128_0[i],1),_mm_srai_epi16(ul_ch_mag128_1[i],1)); }
ul_ch_mag128_0b[i] = _mm_adds_epi16(_mm_srai_epi16(ul_ch_mag128_0b[i],1),_mm_srai_epi16(ul_ch_mag128_1b[i],1)); if (frame_parms->nb_antennas_rx>3) {
rxdataF_comp128_0[i] = _mm_add_epi16(rxdataF_comp128_0[i],(*(__m128i *)&jitterc[0])); rxdataF_comp128_3 = (__m128i *)&rxdataF_comp[3][symbol*frame_parms->N_RB_DL*12];
ul_ch_mag128_3 = (__m128i *)&ul_ch_mag[3][symbol*frame_parms->N_RB_DL*12];
ul_ch_mag128_3b = (__m128i *)&ul_ch_magb[3][symbol*frame_parms->N_RB_DL*12];
} }
// MRC on each re of rb, both on MF output and magnitude (for 16QAM/64QAM llr computation)
if (frame_parms->nb_antennas_rx==2)
for (i=0; i<nb_rb*3; i++) {
rxdataF_comp128_0[i] = _mm_srai_epi16(_mm_adds_epi16(rxdataF_comp128_0[i],rxdataF_comp128_1[i]),1);
ul_ch_mag128_0[i] = _mm_srai_epi16(_mm_adds_epi16(ul_ch_mag128_0[i],ul_ch_mag128_1[i]),1);
ul_ch_mag128_0b[i] = _mm_srai_epi16(_mm_adds_epi16(ul_ch_mag128_0b[i],ul_ch_mag128_1b[i]),1);
rxdataF_comp128_0[i] = _mm_add_epi16(rxdataF_comp128_0[i],(*(__m128i *)&jitterc[0]));
}
if (frame_parms->nb_antennas_rx==3)
for (i=0; i<nb_rb*3; i++) {
rxdataF_comp128_0[i] = _mm_srai_epi16(_mm_adds_epi16(rxdataF_comp128_0[i],_mm_adds_epi16(rxdataF_comp128_1[i],rxdataF_comp128_2[i])),1);
ul_ch_mag128_0[i] = _mm_srai_epi16(_mm_adds_epi16(ul_ch_mag128_0[i],_mm_adds_epi16(ul_ch_mag128_1[i],ul_ch_mag128_2[i])),1);
ul_ch_mag128_0b[i] = _mm_srai_epi16(_mm_adds_epi16(ul_ch_mag128_0b[i],_mm_adds_epi16(ul_ch_mag128_1b[i],ul_ch_mag128_2b[i])),1);
rxdataF_comp128_0[i] = _mm_add_epi16(rxdataF_comp128_0[i],(*(__m128i *)&jitterc[0]));
}
if (frame_parms->nb_antennas_rx==4)
for (i=0; i<nb_rb*3; i++) {
rxdataF_comp128_0[i] = _mm_srai_epi16(_mm_adds_epi16(rxdataF_comp128_0[i],_mm_adds_epi16(rxdataF_comp128_1[i],_mm_adds_epi16(rxdataF_comp128_2[i],rxdataF_comp128_3[i]))),2);
ul_ch_mag128_0[i] = _mm_srai_epi16(_mm_adds_epi16(ul_ch_mag128_0[i],_mm_adds_epi16(ul_ch_mag128_1[i],_mm_adds_epi16(ul_ch_mag128_2[i],ul_ch_mag128_3[i]))),2);
ul_ch_mag128_0b[i] = _mm_srai_epi16(_mm_adds_epi16(ul_ch_mag128_0b[i],_mm_adds_epi16(ul_ch_mag128_1b[i],_mm_adds_epi16(ul_ch_mag128_2b[i],ul_ch_mag128_3b[i]))),2);
rxdataF_comp128_0[i] = _mm_add_epi16(rxdataF_comp128_0[i],(*(__m128i *)&jitterc[0]));
}
#elif defined(__arm__) #elif defined(__arm__)
rxdataF_comp128_0 = (int16x8_t *)&rxdataF_comp[0][symbol*frame_parms->N_RB_DL*12]; rxdataF_comp128_0 = (int16x8_t *)&rxdataF_comp[0][symbol*frame_parms->N_RB_DL*12];
rxdataF_comp128_1 = (int16x8_t *)&rxdataF_comp[1][symbol*frame_parms->N_RB_DL*12]; rxdataF_comp128_1 = (int16x8_t *)&rxdataF_comp[1][symbol*frame_parms->N_RB_DL*12];
...@@ -798,7 +826,7 @@ void ulsch_channel_compensation(int32_t **rxdataF_ext, ...@@ -798,7 +826,7 @@ void ulsch_channel_compensation(int32_t **rxdataF_ext,
mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift); mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift);
mmtmpU1 = _mm_packs_epi32(mmtmpU0,mmtmpU0); mmtmpU1 = _mm_packs_epi32(mmtmpU0,mmtmpU0);
ul_ch_mag128[2] = _mm_unpacklo_epi16(mmtmpU1,mmtmpU1); ul_ch_mag128[2] = _mm_unpacklo_epi16(mmtmpU1,mmtmpU1);
LOG_D(PHY,"comp: symbol %d rb %d => %d,%d,%d (output_shift %d)\n",symbol,rb,*((int16_t *)&ul_ch_mag128[0]),*((int16_t *)&ul_ch_mag128[1]),*((int16_t *)&ul_ch_mag128[2]),output_shift); //LOG_I(PHY,"comp: ant %d symbol %d rb %d => %d,%d,%d (output_shift %d)\n",aarx,symbol,rb,*((int16_t *)&ul_ch_mag128[0]),*((int16_t *)&ul_ch_mag128[1]),*((int16_t *)&ul_ch_mag128[2]),output_shift);
#elif defined(__arm__) #elif defined(__arm__)
mmtmpU0 = vmull_s16(ul_ch128[0], ul_ch128[0]); mmtmpU0 = vmull_s16(ul_ch128[0], ul_ch128[0]);
mmtmpU0 = vqshlq_s32(vqaddq_s32(mmtmpU0,vrev64q_s32(mmtmpU0)),-output_shift128); mmtmpU0 = vqshlq_s32(vqaddq_s32(mmtmpU0,vrev64q_s32(mmtmpU0)),-output_shift128);
...@@ -837,6 +865,7 @@ void ulsch_channel_compensation(int32_t **rxdataF_ext, ...@@ -837,6 +865,7 @@ void ulsch_channel_compensation(int32_t **rxdataF_ext,
// print_ints("c1",&mmtmpU3); // print_ints("c1",&mmtmpU3);
rxdataF_comp128[0] = _mm_packs_epi32(mmtmpU2,mmtmpU3); rxdataF_comp128[0] = _mm_packs_epi32(mmtmpU2,mmtmpU3);
/* /*
LOG_I(PHY,"Antenna %d:",aarx);
print_shorts("rx:",&rxdataF128[0]); print_shorts("rx:",&rxdataF128[0]);
print_shorts("ch:",&ul_ch128[0]); print_shorts("ch:",&ul_ch128[0]);
print_shorts("pack:",&rxdataF_comp128[0]); print_shorts("pack:",&rxdataF_comp128[0]);
...@@ -854,9 +883,12 @@ void ulsch_channel_compensation(int32_t **rxdataF_ext, ...@@ -854,9 +883,12 @@ void ulsch_channel_compensation(int32_t **rxdataF_ext,
mmtmpU2 = _mm_unpacklo_epi32(mmtmpU0,mmtmpU1); mmtmpU2 = _mm_unpacklo_epi32(mmtmpU0,mmtmpU1);
mmtmpU3 = _mm_unpackhi_epi32(mmtmpU0,mmtmpU1); mmtmpU3 = _mm_unpackhi_epi32(mmtmpU0,mmtmpU1);
rxdataF_comp128[1] = _mm_packs_epi32(mmtmpU2,mmtmpU3); rxdataF_comp128[1] = _mm_packs_epi32(mmtmpU2,mmtmpU3);
// print_shorts("rx:",rxdataF128[1]); /*
// print_shorts("ch:",ul_ch128[1]); LOG_I(PHY,"Antenna %d:",aarx);
// print_shorts("pack:",rxdataF_comp128[1]); print_shorts("rx:",&rxdataF128[1]);
print_shorts("ch:",&ul_ch128[1]);
print_shorts("pack:",&rxdataF_comp128[1]);
*/
// multiply by conjugated channel // multiply by conjugated channel
mmtmpU0 = _mm_madd_epi16(ul_ch128[2],rxdataF128[2]); mmtmpU0 = _mm_madd_epi16(ul_ch128[2],rxdataF128[2]);
// mmtmpU0 contains real part of 4 consecutive outputs (32-bit) // mmtmpU0 contains real part of 4 consecutive outputs (32-bit)
...@@ -870,9 +902,12 @@ void ulsch_channel_compensation(int32_t **rxdataF_ext, ...@@ -870,9 +902,12 @@ void ulsch_channel_compensation(int32_t **rxdataF_ext,
mmtmpU2 = _mm_unpacklo_epi32(mmtmpU0,mmtmpU1); mmtmpU2 = _mm_unpacklo_epi32(mmtmpU0,mmtmpU1);
mmtmpU3 = _mm_unpackhi_epi32(mmtmpU0,mmtmpU1); mmtmpU3 = _mm_unpackhi_epi32(mmtmpU0,mmtmpU1);
rxdataF_comp128[2] = _mm_packs_epi32(mmtmpU2,mmtmpU3); rxdataF_comp128[2] = _mm_packs_epi32(mmtmpU2,mmtmpU3);
// print_shorts("rx:",rxdataF128[2]); /*
// print_shorts("ch:",ul_ch128[2]); LOG_I(PHY,"Antenna %d:",aarx);
// print_shorts("pack:",rxdataF_comp128[2]); print_shorts("rx:",&rxdataF128[2]);
print_shorts("ch:",&ul_ch128[2]);
print_shorts("pack:",&rxdataF_comp128[2]);
*/
// Add a jitter to compensate for the saturation in "packs" resulting in a bias on the DC after IDFT // Add a jitter to compensate for the saturation in "packs" resulting in a bias on the DC after IDFT
rxdataF_comp128[0] = _mm_add_epi16(rxdataF_comp128[0],(*(__m128i *)&jitter[0])); rxdataF_comp128[0] = _mm_add_epi16(rxdataF_comp128[0],(*(__m128i *)&jitter[0]));
rxdataF_comp128[1] = _mm_add_epi16(rxdataF_comp128[1],(*(__m128i *)&jitter[0])); rxdataF_comp128[1] = _mm_add_epi16(rxdataF_comp128[1],(*(__m128i *)&jitter[0]));
...@@ -1126,7 +1161,7 @@ void rx_ulsch(PHY_VARS_eNB *eNB, ...@@ -1126,7 +1161,7 @@ void rx_ulsch(PHY_VARS_eNB *eNB,
avgs = cmax(avgs,avgU[aarx]); avgs = cmax(avgs,avgU[aarx]);
// log2_maxh = 4+(log2_approx(avgs)/2); // log2_maxh = 4+(log2_approx(avgs)/2);
log2_maxh = (log2_approx(avgs)/2)+ log2_approx(frame_parms->nb_antennas_rx-1)+4; log2_maxh = (log2_approx(avgs)/2); //+ log2_approx(frame_parms->nb_antennas_rx-1)+4;
LOG_D(PHY,"[ULSCH] log2_maxh = %d (%d,%d)\n",log2_maxh,avgU[0],avgs); LOG_D(PHY,"[ULSCH] log2_maxh = %d (%d,%d)\n",log2_maxh,avgU[0],avgs);
for (l=0; l<(frame_parms->symbols_per_tti-ulsch[UE_id]->harq_processes[harq_pid]->srs_active); l++) { for (l=0; l<(frame_parms->symbols_per_tti-ulsch[UE_id]->harq_processes[harq_pid]->srs_active); l++) {
...@@ -1246,62 +1281,41 @@ void dump_ulsch(PHY_VARS_eNB *eNB,int frame,int subframe,uint8_t UE_id,int round ...@@ -1246,62 +1281,41 @@ void dump_ulsch(PHY_VARS_eNB *eNB,int frame,int subframe,uint8_t UE_id,int round
eNB->ulsch[UE_id]->harq_processes[harq_pid]->Kplus*3,1,0); eNB->ulsch[UE_id]->harq_processes[harq_pid]->Kplus*3,1,0);
if (eNB->common_vars.rxdata) { if (eNB->common_vars.rxdata) {
sprintf(fname,"/tmp/rxsig0_r%d.m",round); for (int aarx=0;aarx<eNB->frame_parms.nb_antennas_rx;aarx++) {
sprintf(vname,"rxs0_r%d",round); sprintf(fname,"/tmp/rxsig%d_r%d.m",aarx,round);
LOG_UM(fname,vname, &eNB->common_vars.rxdata[0][0],eNB->frame_parms.samples_per_tti*10,1,1); sprintf(vname,"rxs%d_r%d",aarx,round);
LOG_UM(fname,vname, &eNB->common_vars.rxdata[aarx][0],eNB->frame_parms.samples_per_tti*10,1,1);
if (eNB->frame_parms.nb_antennas_rx>1)
if (eNB->common_vars.rxdata) {
sprintf(fname,"/tmp/rxsig1_r%d.m",round);
sprintf(vname,"rxs1_r%d",round);
LOG_UM(fname,vname, &eNB->common_vars.rxdata[1][0],eNB->frame_parms.samples_per_tti*10,1,1);
}
}
sprintf(fname,"/tmp/rxsigF0_r%d.m",round);
sprintf(vname,"rxsF0_r%d",round);
LOG_UM(fname,vname, (void *)&eNB->common_vars.rxdataF[0][0],eNB->frame_parms.ofdm_symbol_size*nsymb,1,1);
if (eNB->frame_parms.nb_antennas_rx>1) { }
sprintf(fname,"/tmp/rxsigF1_r%d.m",round);
sprintf(vname,"rxsF1_r%d",round);
LOG_UM(vname,fname, &eNB->common_vars.rxdataF[1][0],eNB->frame_parms.ofdm_symbol_size*nsymb,1,1);
} }
if (eNB->common_vars.rxdataF) {
sprintf(fname,"/tmp/rxsigF0_ext_r%d.m",round); for (int aarx=0;aarx<eNB->frame_parms.nb_antennas_rx;aarx++) {
sprintf(vname,"rxsF0_ext_r%d",round); sprintf(fname,"/tmp/rxsigF%d_r%d.m",aarx,round);
LOG_UM(fname,vname, &eNB->pusch_vars[UE_id]->rxdataF_ext[0][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1); sprintf(vname,"rxsF%d_r%d",aarx,round);
LOG_UM(fname,vname, (void *)&eNB->common_vars.rxdataF[aarx][0],eNB->frame_parms.ofdm_symbol_size*nsymb,1,1);
if (eNB->frame_parms.nb_antennas_rx>1) { }
sprintf(fname,"/tmp/rxsigF1_ext_r%d.m",round); }
sprintf(vname,"rxsF1_ext_r%d",round); if (eNB->pusch_vars[UE_id]->rxdataF_ext) {
LOG_UM(fname,vname,&eNB->pusch_vars[UE_id]->rxdataF_ext[1][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1); for (int aarx=0;aarx<eNB->frame_parms.nb_antennas_rx;aarx++) {
sprintf(fname,"/tmp/rxsigF%d_ext_r%d.m",aarx,round);
sprintf(vname,"rxsF%d_ext_r%d",aarx,round);
LOG_UM(fname,vname, &eNB->pusch_vars[UE_id]->rxdataF_ext[aarx][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1);
}
} }
/* /*
if (eNB->srs_vars[UE_id].srs_ch_estimates) LOG_UM("/tmp/srs_est0.m","srsest0",eNB->srs_vars[UE_id].srs_ch_estimates[0],eNB->frame_parms.ofdm_symbol_size,1,1); if (eNB->srs_vars[UE_id].srs_ch_estimates) LOG_UM("/tmp/srs_est0.m","srsest0",eNB->srs_vars[UE_id].srs_ch_estimates[0],eNB->frame_parms.ofdm_symbol_size,1,1);
if (eNB->frame_parms.nb_antennas_rx>1) if (eNB->frame_parms.nb_antennas_rx>1)
if (eNB->srs_vars[UE_id].srs_ch_estimates) LOG_UM("/tmp/srs_est1.m","srsest1",eNB->srs_vars[UE_id].srs_ch_estimates[1],eNB->frame_parms.ofdm_symbol_size,1,1); if (eNB->srs_vars[UE_id].srs_ch_estimates) LOG_UM("/tmp/srs_est1.m","srsest1",eNB->srs_vars[UE_id].srs_ch_estimates[1],eNB->frame_parms.ofdm_symbol_size,1,1);
*/ */
sprintf(fname,"/tmp/drs_est0_r%d.m",round); for (int aarx=0;aarx<eNB->frame_parms.nb_antennas_rx;aarx++) {
sprintf(vname,"drsest0_r%d",round); sprintf(fname,"/tmp/drs_est%d_r%d.m",aarx,round);
LOG_UM(fname,vname,eNB->pusch_vars[UE_id]->drs_ch_estimates[0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1); sprintf(vname,"drsest%d_r%d",aarx,round);
LOG_UM(fname,vname,eNB->pusch_vars[UE_id]->drs_ch_estimates[aarx],eNB->frame_parms.N_RB_UL*12*nsymb,1,1);
if (eNB->frame_parms.nb_antennas_rx>1) {
sprintf(fname,"/tmp/drs_est1_r%d.m",round); sprintf(fname,"/tmp/ulsch%d_rxF_comp0_r%d.m",aarx,round);
sprintf(vname,"drsest1_r%d",round); sprintf(vname,"ulsch_rxF%d_comp0_r%d",aarx,round);
LOG_UM(fname,vname,eNB->pusch_vars[UE_id]->drs_ch_estimates[1],eNB->frame_parms.N_RB_UL*12*nsymb,1,1); LOG_UM(fname,vname,&eNB->pusch_vars[UE_id]->rxdataF_comp[aarx][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1);
}
sprintf(fname,"/tmp/ulsch0_rxF_comp0_r%d.m",round);
sprintf(vname,"ulsch0_rxF_comp0_r%d",round);
LOG_UM(fname,vname,&eNB->pusch_vars[UE_id]->rxdataF_comp[0][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1);
if (eNB->frame_parms.nb_antennas_rx>1) {
sprintf(fname,"/tmp/ulsch0_rxF_comp1_r%d.m",round);
sprintf(vname,"ulsch0_rxF_comp1_r%d",round);
LOG_UM(fname,vname,&eNB->pusch_vars[UE_id]->rxdataF_comp[1][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1);
} }
// LOG_M("ulsch_rxF_comp1.m","ulsch0_rxF_comp1",&eNB->pusch_vars[UE_id]->rxdataF_comp[0][1][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1); // LOG_M("ulsch_rxF_comp1.m","ulsch0_rxF_comp1",&eNB->pusch_vars[UE_id]->rxdataF_comp[0][1][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1);
......
...@@ -344,7 +344,6 @@ int main(int argc, char **argv) { ...@@ -344,7 +344,6 @@ int main(int argc, char **argv) {
int UE_id = 0; int UE_id = 0;
static int nb_rb=25,first_rb=0,mcs=0,round=0; static int nb_rb=25,first_rb=0,mcs=0,round=0;
//unsigned char l; //unsigned char l;
static int awgn_flag = 0 ;
SCM_t channel_model=Rice1; SCM_t channel_model=Rice1;
unsigned char *input_buffer=0,harq_pid; unsigned char *input_buffer=0,harq_pid;
unsigned short input_buffer_length; unsigned short input_buffer_length;
...@@ -1088,14 +1087,12 @@ int main(int argc, char **argv) { ...@@ -1088,14 +1087,12 @@ int main(int argc, char **argv) {
} }
} }
if (awgn_flag == 0) { if (UE2eNB->max_Doppler == 0) {
if (UE2eNB->max_Doppler == 0) { multipath_channel(UE2eNB,s_re,s_im,r_re,r_im,
multipath_channel(UE2eNB,s_re,s_im,r_re,r_im, eNB->frame_parms.samples_per_tti,hold_channel,0);
eNB->frame_parms.samples_per_tti,hold_channel,0); } else {
} else { multipath_tv_channel(UE2eNB,s_re,s_im,r_re,r_im,
multipath_tv_channel(UE2eNB,s_re,s_im,r_re,r_im, 2*eNB->frame_parms.samples_per_tti,hold_channel);
2*eNB->frame_parms.samples_per_tti,hold_channel);
}
} }
if(abstx) { if(abstx) {
......
...@@ -39,13 +39,13 @@ uint8_t multipath_channel_nosigconv(channel_desc_t *desc) ...@@ -39,13 +39,13 @@ uint8_t multipath_channel_nosigconv(channel_desc_t *desc)
//#define CHANNEL_SSE //#define CHANNEL_SSE
#ifdef CHANNEL_SSE #ifdef CHANNEL_SSE
void multipath_channel(channel_desc_t *desc, void multipath_channel(channel_desc_t *desc,
double tx_sig_re[2][30720*2], double tx_sig_re[NB_ANTENNAS_TX][30720*2],
double tx_sig_im[2][30720*2], double tx_sig_im[NB_ANTENANS_TX][30720*2],
double rx_sig_re[2][30720*2], double rx_sig_re[NB_ANTENNAS_RX][30720*2],
double rx_sig_im[2][30720*2], double rx_sig_im[NB_ANTENNAS_RX][30720*2],
uint32_t length, uint32_t length,
uint8_t keep_channel, uint8_t keep_channel,
int log_channel) int log_channel)
{ {
int i,ii,j,l; int i,ii,j,l;
...@@ -146,13 +146,13 @@ void multipath_channel(channel_desc_t *desc, ...@@ -146,13 +146,13 @@ void multipath_channel(channel_desc_t *desc,
#else #else
void multipath_channel(channel_desc_t *desc, void multipath_channel(channel_desc_t *desc,
double *tx_sig_re[2], double *tx_sig_re[NB_ANTENNAS_TX],
double *tx_sig_im[2], double *tx_sig_im[NB_ANTENNAS_TX],
double *rx_sig_re[2], double *rx_sig_re[NB_ANTENNAS_RX],
double *rx_sig_im[2], double *rx_sig_im[NB_ANTENNAS_RX],
uint32_t length, uint32_t length,
uint8_t keep_channel, uint8_t keep_channel,
int log_channel) int log_channel)
{ {
int i,ii,j,l; int i,ii,j,l;
...@@ -198,21 +198,22 @@ void multipath_channel(channel_desc_t *desc, ...@@ -198,21 +198,22 @@ void multipath_channel(channel_desc_t *desc,
rx_tmp.x += (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].x) - (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].y); rx_tmp.x += (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].x) - (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].y);
rx_tmp.y += (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].x) + (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].y); rx_tmp.y += (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].x) + (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].y);
if (i==0 && log_channel == 1) {
printf("channel[%d][%d][%d] = %f dB (%e,%e)\n",ii,j,l,10*log10(pow(desc->ch[ii+(j*desc->nb_rx)][l].x,2.0)+pow(desc->ch[ii+(j*desc->nb_rx)][l].y,2.0)), if (i==0 && log_channel == 1) {
desc->ch[ii+(j*desc->nb_rx)][l].x, printf("channel[%d][%d][%d] = %f dB (%e,%e)\n",ii,j,l,10*log10(pow(desc->ch[ii+(j*desc->nb_rx)][l].x,2.0)+pow(desc->ch[ii+(j*desc->nb_rx)][l].y,2.0)),
desc->ch[ii+(j*desc->nb_rx)][l].y); desc->ch[ii+(j*desc->nb_rx)][l].x,
} desc->ch[ii+(j*desc->nb_rx)][l].y);
}
} //l } //l
} // j } // j
rx_sig_re[ii][i+dd] = rx_tmp.x*path_loss; rx_sig_re[ii][i+dd] = rx_tmp.x*path_loss;
rx_sig_im[ii][i+dd] = rx_tmp.y*path_loss; rx_sig_im[ii][i+dd] = rx_tmp.y*path_loss;
#ifdef DEBUG_CHANNEL
/* if ((ii==0)&&((i%32)==0)) { if ((i%32)==0) {
printf("%p %p %f,%f => %e,%e\n",rx_sig_re[ii],rx_sig_im[ii],rx_tmp.x,rx_tmp.y,rx_sig_re[ii][i-dd],rx_sig_im[ii][i-dd]); printf("rx aa %d: %p %p %f,%f => %e,%e\n",ii,rx_sig_re[ii],rx_sig_im[ii],rx_tmp.x,rx_tmp.y,rx_sig_re[ii][i-dd],rx_sig_im[ii][i-dd]);
}*/ }
#endif
//rx_sig_re[ii][i] = sqrt(.5)*(tx_sig_re[0][i] + tx_sig_re[1][i]); //rx_sig_re[ii][i] = sqrt(.5)*(tx_sig_re[0][i] + tx_sig_re[1][i]);
//rx_sig_im[ii][i] = sqrt(.5)*(tx_sig_im[0][i] + tx_sig_im[1][i]); //rx_sig_im[ii][i] = sqrt(.5)*(tx_sig_im[0][i] + tx_sig_im[1][i]);
......
...@@ -300,10 +300,10 @@ void set_channeldesc_owner(channel_desc_t *cdesc, channelmod_moduleid_t module_i ...@@ -300,10 +300,10 @@ void set_channeldesc_owner(channel_desc_t *cdesc, channelmod_moduleid_t module_i
int random_channel(channel_desc_t *desc, uint8_t abstraction_flag); int random_channel(channel_desc_t *desc, uint8_t abstraction_flag);
/**\fn void multipath_channel(channel_desc_t *desc, /**\fn void multipath_channel(channel_desc_t *desc,
double tx_sig_re[2], double tx_sig_re[NB_ANTENNAS_TX],
double tx_sig_im[2], double tx_sig_im[NB_ANTENANS_TX],
double rx_sig_re[2], double rx_sig_re[NB_ANTENNAS_RX],
double rx_sig_im[2], double rx_sig_im[NB_ANTENNAS_RX],
uint32_t length, uint32_t length,
uint8_t keep_channel, uint8_t keep_channel,
int log_channel) int log_channel)
...@@ -320,10 +320,10 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag); ...@@ -320,10 +320,10 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag);
*/ */
void multipath_channel(channel_desc_t *desc, void multipath_channel(channel_desc_t *desc,
double *tx_sig_re[2], double *tx_sig_re[NB_ANTENNAS_TX],
double *tx_sig_im[2], double *tx_sig_im[NB_ANTENNAS_TX],
double *rx_sig_re[2], double *rx_sig_re[NB_ANTENNAS_RX],
double *rx_sig_im[2], double *rx_sig_im[NB_ANTENNAS_RX],
uint32_t length, uint32_t length,
uint8_t keep_channel, uint8_t keep_channel,
int log_channel); int log_channel);
......
...@@ -624,14 +624,14 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp ...@@ -624,14 +624,14 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp
#if defined(__x86_64) || defined(__i386__) #if defined(__x86_64) || defined(__i386__)
#ifdef __AVX2__ #ifdef __AVX2__
nsamps2 = (nsamps+7)>>3; nsamps2 = (nsamps+7)>>3;
__m256i buff_tmp[2][nsamps2]; __m256i buff_tmp[4][nsamps2];
#else #else
nsamps2 = (nsamps+3)>>2; nsamps2 = (nsamps+3)>>2;
__m128i buff_tmp[2][nsamps2]; __m128i buff_tmp[4][nsamps2];
#endif #endif
#elif defined(__arm__) #elif defined(__arm__)
nsamps2 = (nsamps+3)>>2; nsamps2 = (nsamps+3)>>2;
int16x8_t buff_tmp[2][nsamps2]; int16x8_t buff_tmp[4][nsamps2];
#endif #endif
int rxshift; int rxshift;
...@@ -1301,8 +1301,10 @@ extern "C" { ...@@ -1301,8 +1301,10 @@ extern "C" {
LOG_I(HW,"rx_max_num_samps %zu\n", LOG_I(HW,"rx_max_num_samps %zu\n",
s->usrp->get_rx_stream(stream_args_rx)->get_max_num_samps()); s->usrp->get_rx_stream(stream_args_rx)->get_max_num_samps());
for (int i = 0; i<openair0_cfg[0].rx_num_channels; i++) for (int i = 0; i<openair0_cfg[0].rx_num_channels; i++) {
LOG_I(HW,"setting rx channel %d\n",i);
stream_args_rx.channels.push_back(i); stream_args_rx.channels.push_back(i);
}
s->rx_stream = s->usrp->get_rx_stream(stream_args_rx); s->rx_stream = s->usrp->get_rx_stream(stream_args_rx);
uhd::stream_args_t stream_args_tx("sc16", "sc16"); uhd::stream_args_t stream_args_tx("sc16", "sc16");
......
...@@ -551,6 +551,8 @@ int wakeup_tx(PHY_VARS_eNB *eNB, ...@@ -551,6 +551,8 @@ int wakeup_tx(PHY_VARS_eNB *eNB,
L1_rxtx_proc_t *L1_proc_tx = &eNB->proc.L1_proc_tx; L1_rxtx_proc_t *L1_proc_tx = &eNB->proc.L1_proc_tx;
int ret; int ret;
LOG_D(PHY,"ENTERED wakeup_tx (IC %d)\n",L1_proc_tx->instance_cnt); LOG_D(PHY,"ENTERED wakeup_tx (IC %d)\n",L1_proc_tx->instance_cnt);
// check if subframe is a has TX else return
if (subframe_select(&eNB->frame_parms,subframe_tx) == SF_UL) return 0;
AssertFatal((ret = pthread_mutex_lock(&L1_proc_tx->mutex))==0,"mutex_lock returns %d\n",ret); AssertFatal((ret = pthread_mutex_lock(&L1_proc_tx->mutex))==0,"mutex_lock returns %d\n",ret);
LOG_D(PHY,"L1 RX %d.%d Waiting to wake up L1 TX %d.%d (IC L1TX %d)\n",frame_rx,subframe_rx,frame_tx,subframe_tx,L1_proc_tx->instance_cnt); LOG_D(PHY,"L1 RX %d.%d Waiting to wake up L1 TX %d.%d (IC L1TX %d)\n",frame_rx,subframe_rx,frame_tx,subframe_tx,L1_proc_tx->instance_cnt);
...@@ -591,7 +593,10 @@ int wakeup_rxtx(PHY_VARS_eNB *eNB, ...@@ -591,7 +593,10 @@ int wakeup_rxtx(PHY_VARS_eNB *eNB,
if (L1_proc->instance_cnt == 0) { // L1_thread is busy so abort the subframe if (L1_proc->instance_cnt == 0) { // L1_thread is busy so abort the subframe
AssertFatal((ret=pthread_mutex_unlock( &L1_proc->mutex))==0,"mutex_unlock return %d\n",ret); AssertFatal((ret=pthread_mutex_unlock( &L1_proc->mutex))==0,"mutex_unlock return %d\n",ret);
LOG_W(PHY,"L1_thread isn't ready in %d.%d, aborting RX processing\n",ru_proc->frame_rx,ru_proc->tti_rx); LOG_W(PHY,"L1_thread isn't ready in %d.%d, aborting RX processing\n",ru_proc->frame_rx,ru_proc->tti_rx);
AssertFatal(1==0,"L1_thread isn't ready in %d.%d (L1RX %d.%d), aborting RX, exiting\n",
ru_proc->frame_rx,ru_proc->tti_rx,L1_proc->frame_rx,L1_proc->subframe_rx);
return(0); return(0);
} }
++L1_proc->instance_cnt; ++L1_proc->instance_cnt;
......
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