Merge remote-tracking branch 'origin/develop' into feature-131-new-license
Conflicts: openair1/PHY/INIT/lte_init.c openair1/PHY/LTE_TRANSPORT/dci_tools.c openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c openair1/SCHED/phy_procedures_lte_eNb.c openair1/SCHED/phy_procedures_lte_ue.c openair1/SIMULATION/LTE_PHY/dlsim.c openair1/SIMULATION/RF/adc.c openair2/LAYER2/MAC/lte_transport_init.c targets/RT/USER/lte-softmodem.c targets/RT/USER/sched_dlsch.c targets/RT/USER/sched_rx_pdsch.c targets/RT/USER/sched_ulsch.c targets/SIMU/USER/oaisim.c
This commit is contained in:
@@ -24,7 +24,7 @@
|
||||
#define print_bytes2(s,x) printf("%s %x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x\n",s,(x)[0],(x)[1],(x)[2],(x)[3],(x)[4],(x)[5],(x)[6],(x)[7],(x)[8],(x)[9],(x)[10],(x)[11],(x)[12],(x)[13],(x)[14],(x)[15],(x)[16],(x)[17],(x)[18],(x)[19],(x)[20],(x)[21],(x)[22],(x)[23],(x)[24],(x)[25],(x)[26],(x)[27],(x)[28],(x)[29],(x)[30],(x)[31])
|
||||
|
||||
//#define DEBUG_TURBO_ENCODER 1
|
||||
#define CALLGRIND 1
|
||||
//#define CALLGRIND 1
|
||||
unsigned short threegpplte_interleaver_output;
|
||||
unsigned long long threegpplte_interleaver_tmp;
|
||||
|
||||
@@ -205,7 +205,7 @@ char interleave_compact_byte(short * base_interleaver,unsigned char * input, uns
|
||||
loop++;
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
for (i=0; i<loop ; i++ ) {
|
||||
// int cur_byte=i<<3;
|
||||
// for (b=0;b<8;b++)
|
||||
@@ -413,9 +413,11 @@ char interleave_compact_byte(short * base_interleaver,unsigned char * input, uns
|
||||
int input_length_words=1+((n-1)>>1);
|
||||
#else
|
||||
int input_length_words=1+((n-1)>>2);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
for ( i=0; i< input_length_words ; i ++ ) {
|
||||
|
||||
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
#ifndef __AVX2__
|
||||
tmp=_mm_insert_epi8(tmp,expandInput[*ptr_intl++],7);
|
||||
@@ -543,6 +545,7 @@ void threegpplte_turbo_encoder(unsigned char *input,
|
||||
|
||||
|
||||
unsigned char systematic2[768] __attribute__((aligned(32)));
|
||||
|
||||
interleave_compact_byte(base_interleaver,input,systematic2,input_length_bytes);
|
||||
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
@@ -556,7 +559,7 @@ void threegpplte_turbo_encoder(unsigned char *input,
|
||||
for ( state0=state1=i=0 ; i<input_length_bytes; i++ ) {
|
||||
cur_s1=input[i];
|
||||
cur_s2=systematic2[i];
|
||||
|
||||
|
||||
for ( code_rate=0; code_rate<3; code_rate++) {
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
/*
|
||||
@@ -564,6 +567,7 @@ void threegpplte_turbo_encoder(unsigned char *input,
|
||||
_mm_add_pi8(all_treillis[state0][cur_s1].parity1_64[code_rate],
|
||||
all_treillis[state1][cur_s2].parity2_64[code_rate]));
|
||||
*/
|
||||
|
||||
*ptr_output++ = _mm_add_pi8(all_treillis[state0][cur_s1].systematic_andp1_64[code_rate],
|
||||
all_treillis[state1][cur_s2].parity2_64[code_rate]);
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
///
|
||||
///
|
||||
|
||||
#undef __AVX2__
|
||||
#include "PHY/sse_intrin.h"
|
||||
|
||||
#ifndef TEST_DEBUG
|
||||
|
||||
@@ -104,18 +104,18 @@ void log_map8(llr_t* systematic,
|
||||
msg("log_map, frame_length %d\n",frame_length);
|
||||
#endif
|
||||
|
||||
start_meas(gamma_stats) ;
|
||||
if (gamma_stats) start_meas(gamma_stats) ;
|
||||
compute_gamma8(m11,m10,systematic,y_parity,frame_length,term_flag) ;
|
||||
stop_meas(gamma_stats);
|
||||
start_meas(alpha_stats) ;
|
||||
if (gamma_stats) stop_meas(gamma_stats);
|
||||
if (alpha_stats) start_meas(alpha_stats) ;
|
||||
compute_alpha8(alpha,beta,m11,m10,frame_length,F) ;
|
||||
stop_meas(alpha_stats);
|
||||
start_meas(beta_stats) ;
|
||||
if (alpha_stats) stop_meas(alpha_stats);
|
||||
if (beta_stats) start_meas(beta_stats) ;
|
||||
compute_beta8(alpha,beta,m11,m10,frame_length,F,offset8_flag) ;
|
||||
stop_meas(beta_stats);
|
||||
start_meas(ext_stats) ;
|
||||
if (beta_stats) stop_meas(beta_stats);
|
||||
if (ext_stats) start_meas(ext_stats) ;
|
||||
compute_ext8(alpha,beta,m11,m10,ext,systematic,frame_length) ;
|
||||
stop_meas(ext_stats);
|
||||
if (ext_stats) stop_meas(ext_stats);
|
||||
|
||||
|
||||
}
|
||||
@@ -935,7 +935,7 @@ unsigned char phy_threegpplte_turbo_decoder8(short *y,
|
||||
}
|
||||
|
||||
|
||||
start_meas(init_stats);
|
||||
if (init_stats) start_meas(init_stats);
|
||||
|
||||
|
||||
if ((n&15)>0) {
|
||||
@@ -1298,7 +1298,7 @@ unsigned char phy_threegpplte_turbo_decoder8(short *y,
|
||||
msg("\n");
|
||||
#endif //DEBUG_LOGMAP
|
||||
|
||||
stop_meas(init_stats);
|
||||
if (init_stats) stop_meas(init_stats);
|
||||
|
||||
// do log_map from first parity bit
|
||||
|
||||
@@ -1310,7 +1310,7 @@ unsigned char phy_threegpplte_turbo_decoder8(short *y,
|
||||
printf("\n*******************ITERATION %d (n %d, n2 %d), ext %p\n\n",iteration_cnt,n,n2,ext);
|
||||
#endif //DEBUG_LOGMAP
|
||||
|
||||
start_meas(intl1_stats);
|
||||
if (intl1_stats) start_meas(intl1_stats);
|
||||
pi4_p=pi4tab8[iind];
|
||||
|
||||
for (i=0; i<(n2>>4); i++) { // steady-state portion
|
||||
@@ -1351,7 +1351,7 @@ unsigned char phy_threegpplte_turbo_decoder8(short *y,
|
||||
#endif
|
||||
}
|
||||
|
||||
stop_meas(intl1_stats);
|
||||
if (intl1_stats) stop_meas(intl1_stats);
|
||||
|
||||
// do log_map from second parity bit
|
||||
|
||||
@@ -1456,7 +1456,7 @@ unsigned char phy_threegpplte_turbo_decoder8(short *y,
|
||||
|
||||
// Check if we decoded the block
|
||||
if (iteration_cnt>1) {
|
||||
start_meas(intl2_stats);
|
||||
if (intl2_stats) start_meas(intl2_stats);
|
||||
|
||||
if ((n2&0x7f) == 0) { // n2 is a multiple of 128 bits
|
||||
|
||||
@@ -1595,7 +1595,7 @@ unsigned char phy_threegpplte_turbo_decoder8(short *y,
|
||||
break;
|
||||
}
|
||||
|
||||
stop_meas(intl2_stats);
|
||||
if (intl2_stats) stop_meas(intl2_stats);
|
||||
|
||||
if ((crc == oldcrc) && (crc!=0)) {
|
||||
return(iteration_cnt);
|
||||
|
||||
@@ -25,7 +25,7 @@ uint32_t sub_block_interleaving_turbo(uint32_t D, uint8_t *d,uint8_t *w)
|
||||
{
|
||||
|
||||
uint32_t RTC = (D>>5), ND, ND3;
|
||||
uint32_t row,col,Kpi,index;
|
||||
uint32_t row,col,Kpi;
|
||||
uint32_t index3,k,k2;
|
||||
#ifdef RM_DEBUG
|
||||
uint32_t nulled=0;
|
||||
@@ -56,7 +56,6 @@ uint32_t sub_block_interleaving_turbo(uint32_t D, uint8_t *d,uint8_t *w)
|
||||
#ifdef RM_DEBUG
|
||||
printf("Col %d\n",col);
|
||||
#endif
|
||||
index = bitrev[col];
|
||||
index3 = bitrev_x3[col];//3*index;
|
||||
|
||||
for (row=0; row<RTC; row++) {
|
||||
@@ -80,10 +79,7 @@ uint32_t sub_block_interleaving_turbo(uint32_t D, uint8_t *d,uint8_t *w)
|
||||
|
||||
#endif
|
||||
index3+=96;
|
||||
index+=32;
|
||||
k++;
|
||||
k2++;
|
||||
k2++;
|
||||
k++;k2+=2;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -494,7 +490,8 @@ uint32_t lte_rate_matching_turbo(uint32_t RTC,
|
||||
// if (rvidx==3)
|
||||
// for (cnt=0;cnt<Ncb;cnt++)
|
||||
// counter_buffer[rvidx][cnt]=0;
|
||||
AssertFatal(Ncb>=(3*RTC<<5),"Exiting, RM condition (Ncb %d, Nir/C %d, Nsoft %d, Kw %d\n",Ncb,Nir/C,Nsoft,3*(RTC<<5));
|
||||
if (Ncb>(3*(RTC<<5)))
|
||||
AssertFatal(1==0,"Exiting, RM condition (Ncb %d, RTC %d, Nir/C %d, Nsoft %d, Kw %d)\n",Ncb,RTC,Nir/C,Nsoft,3*(RTC<<5));
|
||||
|
||||
|
||||
Gp = G/Nl/Qm;
|
||||
|
||||
@@ -125,7 +125,7 @@ int lte_segmentation(unsigned char *input_buffer,
|
||||
|
||||
while (k<((Kr - L)>>3)) {
|
||||
output_buffers[r][k] = input_buffer[s];
|
||||
// printf("encoding segment %d : byte %d => %d\n",r,k,input_buffer[s]);
|
||||
// printf("encoding segment %d : byte %d (%d) => %d\n",r,k,Kr>>3,input_buffer[s]);
|
||||
k++;
|
||||
s++;
|
||||
}
|
||||
|
||||
+15
-18
@@ -3,7 +3,7 @@
|
||||
|
||||
#include "PHY/defs.h"
|
||||
|
||||
#ifdef OPENAIR_LTE
|
||||
|
||||
#include "SystemInformationBlockType2.h"
|
||||
//#include "RadioResourceConfigCommonSIB.h"
|
||||
#include "RadioResourceConfigDedicated.h"
|
||||
@@ -13,18 +13,6 @@
|
||||
#ifdef Rel10
|
||||
#include "SCellToAddMod-r10.h"
|
||||
#endif
|
||||
#else
|
||||
|
||||
/**
|
||||
\fn int phy_init(unsigned char nb_antennas_tx)
|
||||
\brief Allocate and Initialize the PHY variables after receiving static configuration
|
||||
@param nb_antennas_tx Number of TX antennas
|
||||
*/
|
||||
int phy_init(unsigned char nb_antennas_tx);
|
||||
#endif
|
||||
|
||||
#ifdef OPENAIR_LTE
|
||||
|
||||
/** @addtogroup _PHY_STRUCTURES_
|
||||
* @{
|
||||
*/
|
||||
@@ -57,7 +45,6 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue,
|
||||
\details Only a subset of phy_vars_eNb is initialized.
|
||||
@param[out] phy_vars_eNb Pointer to eNB Variables
|
||||
@param is_secondary_eNb Flag to indicate this eNB gets synch from another
|
||||
@param cooperation_flag 0 for no cooperation, 1 for Delay Diversity and 2 for Distributed Alamouti
|
||||
@param abstraction_flag 1 indicates memory should be allocated for abstracted MODEM
|
||||
@returns 0 on success
|
||||
@returns -1 if any memory allocation failed
|
||||
@@ -65,7 +52,6 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue,
|
||||
*/
|
||||
int phy_init_lte_eNB(PHY_VARS_eNB *phy_vars_eNb,
|
||||
unsigned char is_secondary_eNb,
|
||||
unsigned char cooperation_flag,
|
||||
unsigned char abstraction_flag);
|
||||
|
||||
/** \brief Configure LTE_DL_FRAME_PARMS with components derived after initial synchronization (MIB decoding + primary/secondary synch).
|
||||
@@ -309,17 +295,28 @@ void phy_config_dedicated_scell_eNB(uint8_t Mod_id,
|
||||
int CC_id);
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*! !\fn void phy_cleanup(void)
|
||||
\brief Cleanup the PHY variables*/
|
||||
void phy_cleanup(void);
|
||||
|
||||
#ifdef OPENAIR_LTE
|
||||
|
||||
int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf);
|
||||
void dump_frame_parms(LTE_DL_FRAME_PARMS *frame_parms);
|
||||
#endif
|
||||
|
||||
void lte_param_init(unsigned char N_tx,
|
||||
unsigned char N_rx,
|
||||
unsigned char transmission_mode,
|
||||
uint8_t extended_prefix_flag,
|
||||
frame_t frame_type,
|
||||
uint16_t Nid_cell,
|
||||
uint8_t tdd_config,
|
||||
uint8_t N_RB_DL,
|
||||
uint8_t threequarter_fs,
|
||||
uint8_t osf,
|
||||
uint32_t perfect_ce);
|
||||
|
||||
/** @} */
|
||||
#endif
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
*/
|
||||
|
||||
//#define DEBUG_PHY
|
||||
|
||||
t
|
||||
|
||||
|
||||
/*
|
||||
|
||||
+635
-773
File diff suppressed because it is too large
Load Diff
@@ -9,8 +9,8 @@
|
||||
#include "PHY/defs.h"
|
||||
#include "PHY/extern.h"
|
||||
|
||||
extern PHY_VARS_eNB *PHY_vars_eNB;
|
||||
extern PHY_VARS_UE *PHY_vars_UE;
|
||||
extern PHY_VARS_eNB *eNB;
|
||||
extern PHY_VARS_UE *UE;
|
||||
|
||||
void lte_param_init(unsigned char N_tx,
|
||||
unsigned char N_rx,
|
||||
@@ -25,13 +25,14 @@ void lte_param_init(unsigned char N_tx,
|
||||
uint32_t perfect_ce)
|
||||
{
|
||||
|
||||
LTE_DL_FRAME_PARMS *lte_frame_parms;
|
||||
LTE_DL_FRAME_PARMS *frame_parms;
|
||||
int i;
|
||||
|
||||
|
||||
printf("Start lte_param_init\n");
|
||||
PHY_vars_eNB = malloc(sizeof(PHY_VARS_eNB));
|
||||
PHY_vars_UE = malloc(sizeof(PHY_VARS_UE));
|
||||
eNB = malloc(sizeof(PHY_VARS_eNB));
|
||||
UE = malloc(sizeof(PHY_VARS_UE));
|
||||
memset((void*)eNB,0,sizeof(PHY_VARS_eNB));
|
||||
memset((void*)UE,0,sizeof(PHY_VARS_UE));
|
||||
//PHY_config = malloc(sizeof(PHY_CONFIG));
|
||||
mac_xface = malloc(sizeof(MAC_xface));
|
||||
|
||||
@@ -39,69 +40,68 @@ void lte_param_init(unsigned char N_tx,
|
||||
randominit(0);
|
||||
set_taus_seed(0);
|
||||
|
||||
lte_frame_parms = &(PHY_vars_eNB->lte_frame_parms);
|
||||
frame_parms = &(eNB->frame_parms);
|
||||
|
||||
lte_frame_parms->N_RB_DL = N_RB_DL; //50 for 10MHz and 25 for 5 MHz
|
||||
lte_frame_parms->N_RB_UL = N_RB_DL;
|
||||
lte_frame_parms->threequarter_fs = threequarter_fs;
|
||||
lte_frame_parms->Ncp = extended_prefix_flag;
|
||||
lte_frame_parms->Ncp_UL = extended_prefix_flag;
|
||||
lte_frame_parms->Nid_cell = Nid_cell;
|
||||
lte_frame_parms->nushift = Nid_cell%6;
|
||||
lte_frame_parms->nb_antennas_tx = N_tx;
|
||||
lte_frame_parms->nb_antennas_rx = N_rx;
|
||||
lte_frame_parms->nb_antennas_tx_eNB = (transmission_mode == 1)? 1 : 2;
|
||||
lte_frame_parms->phich_config_common.phich_resource = oneSixth;
|
||||
lte_frame_parms->phich_config_common.phich_duration = normal;
|
||||
frame_parms->N_RB_DL = N_RB_DL; //50 for 10MHz and 25 for 5 MHz
|
||||
frame_parms->N_RB_UL = N_RB_DL;
|
||||
frame_parms->threequarter_fs = threequarter_fs;
|
||||
frame_parms->Ncp = extended_prefix_flag;
|
||||
frame_parms->Ncp_UL = extended_prefix_flag;
|
||||
frame_parms->Nid_cell = Nid_cell;
|
||||
frame_parms->nushift = Nid_cell%6;
|
||||
frame_parms->nb_antennas_tx = N_tx;
|
||||
frame_parms->nb_antennas_rx = N_rx;
|
||||
frame_parms->nb_antennas_tx_eNB = N_tx;
|
||||
frame_parms->phich_config_common.phich_resource = oneSixth;
|
||||
frame_parms->phich_config_common.phich_duration = normal;
|
||||
frame_parms->tdd_config = tdd_config;
|
||||
frame_parms->frame_type = frame_type;
|
||||
// frame_parms->Csrs = 2;
|
||||
// frame_parms->Bsrs = 0;
|
||||
// frame_parms->kTC = 0;44
|
||||
// frame_parms->n_RRC = 0;
|
||||
frame_parms->mode1_flag = (transmission_mode == 1)? 1 : 0;
|
||||
|
||||
lte_frame_parms->tdd_config = tdd_config;
|
||||
lte_frame_parms->frame_type = frame_type;
|
||||
// lte_frame_parms->Csrs = 2;
|
||||
// lte_frame_parms->Bsrs = 0;
|
||||
// lte_frame_parms->kTC = 0;44
|
||||
// lte_frame_parms->n_RRC = 0;
|
||||
lte_frame_parms->mode1_flag = (transmission_mode == 1)? 1 : 0;
|
||||
init_frame_parms(frame_parms,osf);
|
||||
|
||||
init_frame_parms(lte_frame_parms,osf);
|
||||
//copy_lte_parms_to_phy_framing(frame_parms, &(PHY_config->PHY_framing));
|
||||
|
||||
//copy_lte_parms_to_phy_framing(lte_frame_parms, &(PHY_config->PHY_framing));
|
||||
// phy_init_top(frame_parms); //allocation
|
||||
|
||||
// phy_init_top(lte_frame_parms); //allocation
|
||||
UE->is_secondary_ue = 0;
|
||||
UE->frame_parms = *frame_parms;
|
||||
eNB->frame_parms = *frame_parms;
|
||||
|
||||
PHY_vars_UE->is_secondary_ue = 0;
|
||||
PHY_vars_UE->lte_frame_parms = *lte_frame_parms;
|
||||
PHY_vars_eNB->lte_frame_parms = *lte_frame_parms;
|
||||
phy_init_lte_top(frame_parms);
|
||||
dump_frame_parms(frame_parms);
|
||||
|
||||
phy_init_lte_top(lte_frame_parms);
|
||||
dump_frame_parms(lte_frame_parms);
|
||||
|
||||
PHY_vars_UE->PHY_measurements.n_adj_cells=0;
|
||||
PHY_vars_UE->PHY_measurements.adj_cell_id[0] = Nid_cell+1;
|
||||
PHY_vars_UE->PHY_measurements.adj_cell_id[1] = Nid_cell+2;
|
||||
UE->measurements.n_adj_cells=0;
|
||||
UE->measurements.adj_cell_id[0] = Nid_cell+1;
|
||||
UE->measurements.adj_cell_id[1] = Nid_cell+2;
|
||||
|
||||
for (i=0; i<3; i++)
|
||||
lte_gold(lte_frame_parms,PHY_vars_UE->lte_gold_table[i],Nid_cell+i);
|
||||
lte_gold(frame_parms,UE->lte_gold_table[i],Nid_cell+i);
|
||||
|
||||
phy_init_lte_ue(PHY_vars_UE,1,0);
|
||||
phy_init_lte_eNB(PHY_vars_eNB,0,0,0);
|
||||
phy_init_lte_ue(UE,1,0);
|
||||
phy_init_lte_eNB(eNB,0,0);
|
||||
|
||||
generate_pcfich_reg_mapping(&PHY_vars_UE->lte_frame_parms);
|
||||
generate_phich_reg_mapping(&PHY_vars_UE->lte_frame_parms);
|
||||
generate_pcfich_reg_mapping(&UE->frame_parms);
|
||||
generate_phich_reg_mapping(&UE->frame_parms);
|
||||
|
||||
// DL power control init
|
||||
if (transmission_mode == 1) {
|
||||
PHY_vars_eNB->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
|
||||
((PHY_vars_eNB->lte_frame_parms).pdsch_config_common).p_b = 0;
|
||||
PHY_vars_UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
|
||||
((PHY_vars_UE->lte_frame_parms).pdsch_config_common).p_b = 0;
|
||||
eNB->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
|
||||
((eNB->frame_parms).pdsch_config_common).p_b = 0;
|
||||
UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
|
||||
((UE->frame_parms).pdsch_config_common).p_b = 0;
|
||||
} else { // rho_a = rhob
|
||||
PHY_vars_eNB->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
|
||||
((PHY_vars_eNB->lte_frame_parms).pdsch_config_common).p_b = 1;
|
||||
PHY_vars_UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
|
||||
((PHY_vars_UE->lte_frame_parms).pdsch_config_common).p_b = 1;
|
||||
eNB->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
|
||||
((eNB->frame_parms).pdsch_config_common).p_b = 1;
|
||||
UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
|
||||
((UE->frame_parms).pdsch_config_common).p_b = 1;
|
||||
}
|
||||
|
||||
PHY_vars_UE->perfect_ce = perfect_ce;
|
||||
UE->perfect_ce = perfect_ce;
|
||||
|
||||
printf("Done lte_param_init\n");
|
||||
|
||||
|
||||
@@ -2,131 +2,50 @@
|
||||
#include "PHY/defs.h"
|
||||
#include "PHY/extern.h"
|
||||
|
||||
#ifdef EXMIMO
|
||||
#include "openair0_lib.h"
|
||||
extern int card;
|
||||
#endif
|
||||
|
||||
void
|
||||
phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, uint32_t rx_power_fil_dB, uint8_t eNB_id)
|
||||
phy_adjust_gain (PHY_VARS_UE *ue, uint32_t rx_power_fil_dB, uint8_t eNB_id)
|
||||
{
|
||||
|
||||
#ifdef EXMIMO
|
||||
exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr;
|
||||
uint16_t i;
|
||||
#endif
|
||||
|
||||
LOG_D(PHY,"Gain control: rssi %d (%d,%d)\n",
|
||||
rx_power_fil_dB,
|
||||
phy_vars_ue->PHY_measurements.rssi,
|
||||
phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id]
|
||||
rx_power_fil_dB,
|
||||
ue->measurements.rssi,
|
||||
ue->measurements.rx_power_avg_dB[eNB_id]
|
||||
);
|
||||
|
||||
// Gain control with hysterisis
|
||||
// Adjust gain in phy_vars_ue->rx_vars[0].rx_total_gain_dB
|
||||
// Adjust gain in ue->rx_vars[0].rx_total_gain_dB
|
||||
|
||||
if (rx_power_fil_dB < TARGET_RX_POWER - 5) //&& (phy_vars_ue->rx_total_gain_dB < MAX_RF_GAIN) )
|
||||
phy_vars_ue->rx_total_gain_dB+=5;
|
||||
else if (rx_power_fil_dB > TARGET_RX_POWER + 5) //&& (phy_vars_ue->rx_total_gain_dB > MIN_RF_GAIN) )
|
||||
phy_vars_ue->rx_total_gain_dB-=5;
|
||||
if (rx_power_fil_dB < TARGET_RX_POWER - 5) //&& (ue->rx_total_gain_dB < MAX_RF_GAIN) )
|
||||
ue->rx_total_gain_dB+=5;
|
||||
else if (rx_power_fil_dB > TARGET_RX_POWER + 5) //&& (ue->rx_total_gain_dB > MIN_RF_GAIN) )
|
||||
ue->rx_total_gain_dB-=5;
|
||||
|
||||
if (phy_vars_ue->rx_total_gain_dB>MAX_RF_GAIN) {
|
||||
if (ue->rx_total_gain_dB>MAX_RF_GAIN) {
|
||||
/*
|
||||
if ((openair_daq_vars.rx_rf_mode==0) && (openair_daq_vars.mode == openair_NOT_SYNCHED)) {
|
||||
openair_daq_vars.rx_rf_mode=1;
|
||||
phy_vars_ue->rx_total_gain_dB = max(MIN_RF_GAIN,MAX_RF_GAIN-25);
|
||||
ue->rx_total_gain_dB = max(MIN_RF_GAIN,MAX_RF_GAIN-25);
|
||||
}
|
||||
else {
|
||||
*/
|
||||
phy_vars_ue->rx_total_gain_dB = MAX_RF_GAIN;
|
||||
} else if (phy_vars_ue->rx_total_gain_dB<MIN_RF_GAIN) {
|
||||
ue->rx_total_gain_dB = MAX_RF_GAIN;
|
||||
} else if (ue->rx_total_gain_dB<MIN_RF_GAIN) {
|
||||
/*
|
||||
if ((openair_daq_vars.rx_rf_mode==1) && (openair_daq_vars.mode == openair_NOT_SYNCHED)) {
|
||||
openair_daq_vars.rx_rf_mode=0;
|
||||
phy_vars_ue->rx_total_gain_dB = min(MAX_RF_GAIN,MIN_RF_GAIN+25);
|
||||
ue->rx_total_gain_dB = min(MAX_RF_GAIN,MIN_RF_GAIN+25);
|
||||
}
|
||||
else {
|
||||
*/
|
||||
phy_vars_ue->rx_total_gain_dB = MIN_RF_GAIN;
|
||||
ue->rx_total_gain_dB = MIN_RF_GAIN;
|
||||
}
|
||||
|
||||
LOG_D(PHY,"Gain control: rx_total_gain_dB = %d (max %d,rxpf %d)\n",phy_vars_ue->rx_total_gain_dB,MAX_RF_GAIN,rx_power_fil_dB);
|
||||
|
||||
#ifdef EXMIMO
|
||||
|
||||
if (phy_vars_ue->rx_total_gain_dB>phy_vars_ue->rx_gain_max[0]) {
|
||||
phy_vars_ue->rx_total_gain_dB = phy_vars_ue->rx_gain_max[0];
|
||||
|
||||
for (i=0; i<phy_vars_ue->lte_frame_parms.nb_antennas_rx; i++) {
|
||||
p_exmimo_config->rf.rx_gain[i][0] = 30;
|
||||
}
|
||||
|
||||
} else if (phy_vars_ue->rx_total_gain_dB<(phy_vars_ue->rx_gain_max[0]-30)) {
|
||||
// for the moment we stay in max gain mode
|
||||
phy_vars_ue->rx_total_gain_dB = phy_vars_ue->rx_gain_max[0] - 30;
|
||||
|
||||
for (i=0; i<phy_vars_ue->lte_frame_parms.nb_antennas_rx; i++) {
|
||||
p_exmimo_config->rf.rx_gain[i][0] = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
phy_vars_ue->rx_gain_mode[0] = byp;
|
||||
phy_vars_ue->rx_gain_mode[1] = byp;
|
||||
exmimo_pci_interface->rf.rf_mode0 = 22991; //bypass
|
||||
exmimo_pci_interface->rf.rf_mode1 = 22991; //bypass
|
||||
|
||||
if (phy_vars_ue->rx_total_gain_dB<(phy_vars_ue->rx_gain_byp[0]-50)) {
|
||||
exmimo_pci_interface->rf.rx_gain00 = 0;
|
||||
exmimo_pci_interface->rf.rx_gain10 = 0;
|
||||
}
|
||||
*/
|
||||
} else {
|
||||
|
||||
for (i=0; i<phy_vars_ue->lte_frame_parms.nb_antennas_rx; i++) {
|
||||
p_exmimo_config->rf.rx_gain[i][0] = 30 - phy_vars_ue->rx_gain_max[0] + phy_vars_ue->rx_total_gain_dB;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
break;
|
||||
case med_gain:
|
||||
case byp_gain:
|
||||
if (phy_vars_ue->rx_total_gain_dB>phy_vars_ue->rx_gain_byp[0]) {
|
||||
phy_vars_ue->rx_gain_mode[0] = max_gain;
|
||||
phy_vars_ue->rx_gain_mode[1] = max_gain;
|
||||
exmimo_pci_interface->rf.rf_mode0 = 55759; //max gain
|
||||
exmimo_pci_interface->rf.rf_mode1 = 55759; //max gain
|
||||
|
||||
if (phy_vars_ue->rx_total_gain_dB>phy_vars_ue->rx_gain_max[0]) {
|
||||
exmimo_pci_interface->rf.rx_gain00 = 50;
|
||||
exmimo_pci_interface->rf.rx_gain10 = 50;
|
||||
}
|
||||
else {
|
||||
exmimo_pci_interface->rf.rx_gain00 = 50 - phy_vars_ue->rx_gain_max[0] + phy_vars_ue->rx_total_gain_dB;
|
||||
exmimo_pci_interface->rf.rx_gain10 = 50 - phy_vars_ue->rx_gain_max[1] + phy_vars_ue->rx_total_gain_dB;
|
||||
}
|
||||
}
|
||||
else if (phy_vars_ue->rx_total_gain_dB<(phy_vars_ue->rx_gain_byp[0]-50)) {
|
||||
exmimo_pci_interface->rf.rx_gain00 = 0;
|
||||
exmimo_pci_interface->rf.rx_gain10 = 0;
|
||||
}
|
||||
else {
|
||||
exmimo_pci_interface->rf.rx_gain00 = 50 - phy_vars_ue->rx_gain_byp[0] + phy_vars_ue->rx_total_gain_dB;
|
||||
exmimo_pci_interface->rf.rx_gain10 = 50 - phy_vars_ue->rx_gain_byp[1] + phy_vars_ue->rx_total_gain_dB;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
exmimo_pci_interface->rf.rx_gain00 = 50;
|
||||
exmimo_pci_interface->rf.rx_gain10 = 50;
|
||||
break;
|
||||
}
|
||||
*/
|
||||
#endif
|
||||
LOG_D(PHY,"Gain control: rx_total_gain_dB = %d (max %d,rxpf %d)\n",ue->rx_total_gain_dB,MAX_RF_GAIN,rx_power_fil_dB);
|
||||
|
||||
#ifdef DEBUG_PHY
|
||||
/* if ((phy_vars_ue->frame%100==0) || (phy_vars_ue->frame < 10))
|
||||
/* if ((ue->frame%100==0) || (ue->frame < 10))
|
||||
msg("[PHY][ADJUST_GAIN] frame %d, rx_power = %d, rx_power_fil = %d, rx_power_fil_dB = %d, coef=%d, ncoef=%d, rx_total_gain_dB = %d (%d,%d,%d)\n",
|
||||
phy_vars_ue->frame,rx_power,rx_power_fil,rx_power_fil_dB,coef,ncoef,phy_vars_ue->rx_total_gain_dB,
|
||||
ue->frame,rx_power,rx_power_fil,rx_power_fil_dB,coef,ncoef,ue->rx_total_gain_dB,
|
||||
TARGET_RX_POWER,MAX_RF_GAIN,MIN_RF_GAIN);
|
||||
*/
|
||||
#endif //DEBUG_PHY
|
||||
|
||||
@@ -189,9 +189,9 @@ void phy_adjust_gain (PHY_VARS_UE *phy_vars_ue,
|
||||
unsigned char eNB_id);
|
||||
|
||||
int lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB,
|
||||
eNB_rxtx_proc_t *proc,
|
||||
module_id_t eNB_id,
|
||||
module_id_t UE_id,
|
||||
uint8_t subframe,
|
||||
uint8_t l,
|
||||
uint8_t Ns,
|
||||
uint8_t cooperation_flag);
|
||||
@@ -214,7 +214,7 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
unsigned char number_of_cards,
|
||||
short coef);
|
||||
|
||||
int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,module_id_t UE_id,uint8_t subframe);
|
||||
int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,module_id_t UE_id);
|
||||
|
||||
void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNB,
|
||||
int subframe,
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
#include "PHY/defs.h"
|
||||
#include "PHY/extern.h"
|
||||
|
||||
#include "UTIL/LOG/vcd_signal_dumper.h"
|
||||
|
||||
#define DEBUG_PHY
|
||||
|
||||
// Adjust location synchronization point to account for drift
|
||||
@@ -9,7 +11,7 @@
|
||||
// last channel estimate of the receiver
|
||||
|
||||
void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
PHY_VARS_UE *phy_vars_ue,
|
||||
PHY_VARS_UE *ue,
|
||||
unsigned char eNB_id,
|
||||
unsigned char clear,
|
||||
short coef)
|
||||
@@ -20,10 +22,12 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int diff;
|
||||
short Re,Im,ncoef;
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_IN);
|
||||
|
||||
ncoef = 32767 - coef;
|
||||
|
||||
#ifdef DEBUG_PHY
|
||||
LOG_D(PHY,"frame %d, slot %d: rx_offset (before) = %d\n",phy_vars_ue->frame_rx,phy_vars_ue->slot_rx,phy_vars_ue->rx_offset);
|
||||
LOG_D(PHY,"frame %d: rx_offset (before) = %d\n",ue->proc.proc_rxtx[0].frame_rx,ue->rx_offset);
|
||||
#endif //DEBUG_PHY
|
||||
|
||||
|
||||
@@ -32,8 +36,8 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
temp = 0;
|
||||
|
||||
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
|
||||
Re = ((int16_t*)phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_id][aa])[(i<<2)];
|
||||
Im = ((int16_t*)phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_id][aa])[1+(i<<2)];
|
||||
Re = ((int16_t*)ue->common_vars.dl_ch_estimates_time[eNB_id][aa])[(i<<2)];
|
||||
Im = ((int16_t*)ue->common_vars.dl_ch_estimates_time[eNB_id][aa])[1+(i<<2)];
|
||||
temp += (Re*Re/2) + (Im*Im/2);
|
||||
}
|
||||
|
||||
@@ -53,29 +57,30 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
diff = max_pos_fil - frame_parms->nb_prefix_samples/8;
|
||||
|
||||
if ( diff > SYNCH_HYST )
|
||||
phy_vars_ue->rx_offset++;
|
||||
ue->rx_offset++;
|
||||
else if (diff < -SYNCH_HYST)
|
||||
phy_vars_ue->rx_offset--;
|
||||
ue->rx_offset--;
|
||||
|
||||
if ( phy_vars_ue->rx_offset < 0 )
|
||||
phy_vars_ue->rx_offset += FRAME_LENGTH_COMPLEX_SAMPLES;
|
||||
if ( ue->rx_offset < 0 )
|
||||
ue->rx_offset += FRAME_LENGTH_COMPLEX_SAMPLES;
|
||||
|
||||
if ( phy_vars_ue->rx_offset >= FRAME_LENGTH_COMPLEX_SAMPLES )
|
||||
phy_vars_ue->rx_offset -= FRAME_LENGTH_COMPLEX_SAMPLES;
|
||||
if ( ue->rx_offset >= FRAME_LENGTH_COMPLEX_SAMPLES )
|
||||
ue->rx_offset -= FRAME_LENGTH_COMPLEX_SAMPLES;
|
||||
|
||||
|
||||
|
||||
#ifdef DEBUG_PHY
|
||||
LOG_D(PHY,"frame %d: rx_offset (after) = %d : max_pos = %d,max_pos_fil = %d (peak %d)\n",
|
||||
phy_vars_ue->frame_rx,phy_vars_ue->rx_offset,max_pos,max_pos_fil,temp);
|
||||
ue->proc.proc_rxtx[0].frame_rx,ue->rx_offset,max_pos,max_pos_fil,temp);
|
||||
#endif //DEBUG_PHY
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT);
|
||||
|
||||
}
|
||||
|
||||
|
||||
int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
LTE_eNB_SRS *lte_eNb_srs,
|
||||
LTE_eNB_SRS *lte_eNB_srs,
|
||||
unsigned int *eNB_id,
|
||||
unsigned char clear,
|
||||
unsigned char number_of_cards,
|
||||
@@ -105,23 +110,23 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
// do ifft of channel estimate
|
||||
switch(frame_parms->N_RB_DL) {
|
||||
case 6:
|
||||
dft128((int16_t*) <e_eNb_srs->srs_ch_estimates[ind][aa][0],
|
||||
(int16_t*) lte_eNb_srs->srs_ch_estimates_time[ind][aa],
|
||||
dft128((int16_t*) <e_eNB_srs->srs_ch_estimates[ind][aa][0],
|
||||
(int16_t*) lte_eNB_srs->srs_ch_estimates_time[ind][aa],
|
||||
1);
|
||||
break;
|
||||
case 25:
|
||||
dft512((int16_t*) <e_eNb_srs->srs_ch_estimates[ind][aa][0],
|
||||
(int16_t*) lte_eNb_srs->srs_ch_estimates_time[ind][aa],
|
||||
dft512((int16_t*) <e_eNB_srs->srs_ch_estimates[ind][aa][0],
|
||||
(int16_t*) lte_eNB_srs->srs_ch_estimates_time[ind][aa],
|
||||
1);
|
||||
break;
|
||||
case 50:
|
||||
dft1024((int16_t*) <e_eNb_srs->srs_ch_estimates[ind][aa][0],
|
||||
(int16_t*) lte_eNb_srs->srs_ch_estimates_time[ind][aa],
|
||||
dft1024((int16_t*) <e_eNB_srs->srs_ch_estimates[ind][aa][0],
|
||||
(int16_t*) lte_eNB_srs->srs_ch_estimates_time[ind][aa],
|
||||
1);
|
||||
break;
|
||||
case 100:
|
||||
dft2048((int16_t*) <e_eNb_srs->srs_ch_estimates[ind][aa][0],
|
||||
(int16_t*) lte_eNb_srs->srs_ch_estimates_time[ind][aa],
|
||||
dft2048((int16_t*) <e_eNB_srs->srs_ch_estimates[ind][aa][0],
|
||||
(int16_t*) lte_eNB_srs->srs_ch_estimates_time[ind][aa],
|
||||
1);
|
||||
break;
|
||||
}
|
||||
@@ -129,7 +134,7 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
#ifdef DEBUG_PHY
|
||||
sprintf(fname,"srs_ch_estimates_time_%d%d.m",ind,aa);
|
||||
sprintf(vname,"srs_time_%d%d",ind,aa);
|
||||
write_output(fname,vname,lte_eNb_srs->srs_ch_estimates_time[ind][aa],frame_parms->ofdm_symbol_size*2,2,1);
|
||||
write_output(fname,vname,lte_eNB_srs->srs_ch_estimates_time[ind][aa],frame_parms->ofdm_symbol_size*2,2,1);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
@@ -140,8 +145,8 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
temp = 0;
|
||||
|
||||
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
|
||||
Re = ((int16_t*)lte_eNb_srs->srs_ch_estimates_time[ind][aa])[(i<<1)];
|
||||
Im = ((int16_t*)lte_eNb_srs->srs_ch_estimates_time[ind][aa])[1+(i<<1)];
|
||||
Re = ((int16_t*)lte_eNB_srs->srs_ch_estimates_time[ind][aa])[(i<<1)];
|
||||
Im = ((int16_t*)lte_eNB_srs->srs_ch_estimates_time[ind][aa])[1+(i<<1)];
|
||||
temp += (Re*Re/2) + (Im*Im/2);
|
||||
}
|
||||
|
||||
@@ -167,7 +172,7 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
}
|
||||
|
||||
|
||||
int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,uint8_t UE_id,uint8_t sched_subframe)
|
||||
int lte_est_timing_advance_pusch(PHY_VARS_eNB* eNB,uint8_t UE_id)
|
||||
{
|
||||
static int first_run=1;
|
||||
static int max_pos_fil2=0;
|
||||
@@ -175,8 +180,8 @@ int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,uint8_t UE_id,uint8_
|
||||
short Re,Im,coef=24576;
|
||||
short ncoef = 32768 - coef;
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms;
|
||||
LTE_eNB_PUSCH *eNB_pusch_vars = phy_vars_eNB->lte_eNB_pusch_vars[UE_id];
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
|
||||
LTE_eNB_PUSCH *eNB_pusch_vars = eNB->pusch_vars[UE_id];
|
||||
int32_t **ul_ch_estimates_time= eNB_pusch_vars->drs_ch_estimates_time[0];
|
||||
uint8_t cyclic_shift = 0;
|
||||
int sync_pos = (frame_parms->ofdm_symbol_size-cyclic_shift*frame_parms->ofdm_symbol_size/12)%(frame_parms->ofdm_symbol_size);
|
||||
@@ -208,7 +213,7 @@ int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,uint8_t UE_id,uint8_
|
||||
max_pos_fil2 = ((max_pos_fil2 * coef) + (max_pos * ncoef)) >> 15;
|
||||
|
||||
#ifdef DEBUG_PHY
|
||||
LOG_D(PHY,"frame %d: max_pos = %d, max_pos_fil = %d, sync_pos=%d\n",phy_vars_eNB->proc[sched_subframe].frame_rx,max_pos,max_pos_fil2,sync_pos);
|
||||
LOG_D(PHY,"frame %d: max_pos = %d, max_pos_fil = %d, sync_pos=%d\n",eNB->proc.frame_rx,max_pos,max_pos_fil2,sync_pos);
|
||||
#endif //DEBUG_PHY
|
||||
|
||||
return(max_pos_fil2-sync_pos);
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#include "filt96_32.h"
|
||||
//#define DEBUG_CH
|
||||
|
||||
int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
int lte_dl_channel_estimation(PHY_VARS_UE *ue,
|
||||
uint8_t eNB_id,
|
||||
uint8_t eNB_offset,
|
||||
unsigned char Ns,
|
||||
@@ -26,13 +26,13 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
// unsigned int n;
|
||||
// int i;
|
||||
|
||||
uint16_t Nid_cell = (eNB_offset == 0) ? phy_vars_ue->lte_frame_parms.Nid_cell : phy_vars_ue->PHY_measurements.adj_cell_id[eNB_offset-1];
|
||||
uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1];
|
||||
|
||||
uint8_t nushift,pilot1,pilot2,pilot3;
|
||||
int **dl_ch_estimates=phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset];
|
||||
int **rxdataF=phy_vars_ue->lte_ue_common_vars.rxdataF;
|
||||
int **dl_ch_estimates=ue->common_vars.dl_ch_estimates[eNB_offset];
|
||||
int **rxdataF=ue->common_vars.rxdataF;
|
||||
|
||||
if (phy_vars_ue->lte_frame_parms.Ncp == 0) { // normal prefix
|
||||
if (ue->frame_parms.Ncp == 0) { // normal prefix
|
||||
pilot1 = 4;
|
||||
pilot2 = 7;
|
||||
pilot3 = 11;
|
||||
@@ -59,19 +59,19 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
}
|
||||
|
||||
|
||||
//ch_offset = (l*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size));
|
||||
if (phy_vars_ue->high_speed_flag == 0) // use second channel estimate position for temporary storage
|
||||
ch_offset = phy_vars_ue->lte_frame_parms.ofdm_symbol_size ;
|
||||
//ch_offset = (l*(ue->frame_parms.ofdm_symbol_size));
|
||||
if (ue->high_speed_flag == 0) // use second channel estimate position for temporary storage
|
||||
ch_offset = ue->frame_parms.ofdm_symbol_size ;
|
||||
else
|
||||
ch_offset = phy_vars_ue->lte_frame_parms.ofdm_symbol_size*symbol;
|
||||
ch_offset = ue->frame_parms.ofdm_symbol_size*symbol;
|
||||
|
||||
symbol_offset = phy_vars_ue->lte_frame_parms.ofdm_symbol_size*symbol;
|
||||
symbol_offset = ue->frame_parms.ofdm_symbol_size*symbol;
|
||||
|
||||
k = (nu + nushift)%6;
|
||||
|
||||
#ifdef DEBUG_CH
|
||||
printf("Channel Estimation : eNB_offset %d cell_id %d ch_offset %d, OFDM size %d, Ncp=%d, l=%d, Ns=%d, k=%d\n",eNB_offset,Nid_cell,ch_offset,phy_vars_ue->lte_frame_parms.ofdm_symbol_size,
|
||||
phy_vars_ue->lte_frame_parms.Ncp,l,Ns,k);
|
||||
printf("Channel Estimation : eNB_offset %d cell_id %d ch_offset %d, OFDM size %d, Ncp=%d, l=%d, Ns=%d, k=%d\n",eNB_offset,Nid_cell,ch_offset,ue->frame_parms.ofdm_symbol_size,
|
||||
ue->frame_parms.Ncp,l,Ns,k);
|
||||
#endif
|
||||
|
||||
switch (k) {
|
||||
@@ -154,7 +154,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
|
||||
|
||||
// generate pilot
|
||||
lte_dl_cell_spec_rx(phy_vars_ue,
|
||||
lte_dl_cell_spec_rx(ue,
|
||||
eNB_offset,
|
||||
&pilot[p][0],
|
||||
Ns,
|
||||
@@ -162,25 +162,25 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
p);
|
||||
|
||||
|
||||
for (aarx=0; aarx<phy_vars_ue->lte_frame_parms.nb_antennas_rx; aarx++) {
|
||||
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
|
||||
|
||||
pil = (int16_t *)&pilot[p][0];
|
||||
rxF = (int16_t *)&rxdataF[aarx][((symbol_offset+k+phy_vars_ue->lte_frame_parms.first_carrier_offset))];
|
||||
rxF = (int16_t *)&rxdataF[aarx][((symbol_offset+k+ue->frame_parms.first_carrier_offset))];
|
||||
dl_ch = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][ch_offset];
|
||||
|
||||
|
||||
// if (eNb_id==0)
|
||||
memset(dl_ch,0,4*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size));
|
||||
if (phy_vars_ue->high_speed_flag==0) // multiply previous channel estimate by ch_est_alpha
|
||||
multadd_complex_vector_real_scalar(dl_ch-(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<1),
|
||||
phy_vars_ue->ch_est_alpha,dl_ch-(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<1),
|
||||
1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
memset(dl_ch,0,4*(ue->frame_parms.ofdm_symbol_size));
|
||||
if (ue->high_speed_flag==0) // multiply previous channel estimate by ch_est_alpha
|
||||
multadd_complex_vector_real_scalar(dl_ch-(ue->frame_parms.ofdm_symbol_size<<1),
|
||||
ue->ch_est_alpha,dl_ch-(ue->frame_parms.ofdm_symbol_size<<1),
|
||||
1,ue->frame_parms.ofdm_symbol_size);
|
||||
#ifdef DEBUG_CH
|
||||
printf("k %d, first_carrier %d\n",k,phy_vars_ue->lte_frame_parms.first_carrier_offset);
|
||||
printf("k %d, first_carrier %d\n",k,ue->frame_parms.first_carrier_offset);
|
||||
#endif
|
||||
if ((phy_vars_ue->lte_frame_parms.N_RB_DL==6) ||
|
||||
(phy_vars_ue->lte_frame_parms.N_RB_DL==50) ||
|
||||
(phy_vars_ue->lte_frame_parms.N_RB_DL==100)) {
|
||||
if ((ue->frame_parms.N_RB_DL==6) ||
|
||||
(ue->frame_parms.N_RB_DL==50) ||
|
||||
(ue->frame_parms.N_RB_DL==100)) {
|
||||
|
||||
//First half of pilots
|
||||
// Treat first 2 pilots specially (left edge)
|
||||
@@ -210,7 +210,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
rxF+=12;
|
||||
dl_ch+=16;
|
||||
|
||||
for (pilot_cnt=2; pilot_cnt<((phy_vars_ue->lte_frame_parms.N_RB_DL)-1); pilot_cnt+=2) {
|
||||
for (pilot_cnt=2; pilot_cnt<((ue->frame_parms.N_RB_DL)-1); pilot_cnt+=2) {
|
||||
|
||||
|
||||
|
||||
@@ -257,7 +257,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
#ifdef DEBUG_CH
|
||||
printf("second half k %d\n",k);
|
||||
#endif
|
||||
for (pilot_cnt=0; pilot_cnt<((phy_vars_ue->lte_frame_parms.N_RB_DL)-3); pilot_cnt+=2) {
|
||||
for (pilot_cnt=0; pilot_cnt<((ue->frame_parms.N_RB_DL)-3); pilot_cnt+=2) {
|
||||
|
||||
|
||||
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||
@@ -314,7 +314,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
|
||||
}
|
||||
|
||||
else if (phy_vars_ue->lte_frame_parms.N_RB_DL==25) {
|
||||
else if (ue->frame_parms.N_RB_DL==25) {
|
||||
//printf("Channel estimation\n");
|
||||
|
||||
// Treat first 2 pilots specially (left edge)
|
||||
@@ -357,7 +357,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
for (pilot_cnt=2; pilot_cnt<24; pilot_cnt+=2) {
|
||||
|
||||
// printf("pilot[%d][%d] (%d,%d)\n",p,rb,pil[0],pil[1]);
|
||||
// printf("rx[%d][%d] -> (%d,%d)\n",p,phy_vars_ue->lte_frame_parms.first_carrier_offset + phy_vars_ue->lte_frame_parms.nushift + 6*rb+(3*p),rxF[0],rxF[1]);
|
||||
// printf("rx[%d][%d] -> (%d,%d)\n",p,ue->frame_parms.first_carrier_offset + ue->frame_parms.nushift + 6*rb+(3*p),rxF[0],rxF[1]);
|
||||
|
||||
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||
@@ -438,7 +438,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
for (pilot_cnt=0; pilot_cnt<22; pilot_cnt+=2) {
|
||||
|
||||
// printf("* pilot[%d][%d] (%d,%d)\n",p,rb,pil[0],pil[1]);
|
||||
// printf("rx[%d][%d] -> (%d,%d)\n",p,phy_vars_ue->lte_frame_parms.first_carrier_offset + phy_vars_ue->lte_frame_parms.nushift + 6*rb+(3*p),rxF[0],rxF[1]);
|
||||
// printf("rx[%d][%d] -> (%d,%d)\n",p,ue->frame_parms.first_carrier_offset + ue->frame_parms.nushift + 6*rb+(3*p),rxF[0],rxF[1]);
|
||||
|
||||
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||
@@ -511,7 +511,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
dl_ch,
|
||||
24);
|
||||
|
||||
} else if (phy_vars_ue->lte_frame_parms.N_RB_DL==15) {
|
||||
} else if (ue->frame_parms.N_RB_DL==15) {
|
||||
|
||||
//printf("First Half\n");
|
||||
for (rb=0; rb<28; rb+=4) {
|
||||
@@ -519,7 +519,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
//printf("aarx=%d\n",aarx);
|
||||
//printf("pilot[%d][%d] (%d,%d)\n",p,rb,pil[0],pil[1]);
|
||||
//printf("rx[%d][%d] -> (%d,%d)\n",p,
|
||||
// phy_vars_ue->lte_frame_parms.first_carrier_offset + phy_vars_ue->lte_frame_parms.nushift + 6*rb+(3*p),
|
||||
// ue->frame_parms.first_carrier_offset + ue->frame_parms.nushift + 6*rb+(3*p),
|
||||
// rxF[0],
|
||||
// rxF[1]);
|
||||
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||
@@ -574,7 +574,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
//printf("aarx=%d\n",aarx);
|
||||
//printf("pilot[%d][%d] (%d,%d)\n",p,rb,pil[0],pil[1]);
|
||||
//printf("rx[%d][%d] -> (%d,%d)\n",p,
|
||||
// phy_vars_ue->lte_frame_parms.first_carrier_offset + phy_vars_ue->lte_frame_parms.nushift + 6*rb+(3*p),
|
||||
// ue->frame_parms.first_carrier_offset + ue->frame_parms.nushift + 6*rb+(3*p),
|
||||
// rxF[0],
|
||||
// rxF[1]);
|
||||
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||
@@ -601,78 +601,78 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
|
||||
}
|
||||
} else {
|
||||
msg("channel estimation not implemented for phy_vars_ue->lte_frame_parms.N_RB_DL = %d\n",phy_vars_ue->lte_frame_parms.N_RB_DL);
|
||||
msg("channel estimation not implemented for ue->frame_parms.N_RB_DL = %d\n",ue->frame_parms.N_RB_DL);
|
||||
}
|
||||
|
||||
|
||||
if (phy_vars_ue->perfect_ce == 0) {
|
||||
if (ue->perfect_ce == 0) {
|
||||
// Temporal Interpolation
|
||||
// printf("ch_offset %d\n",ch_offset);
|
||||
|
||||
dl_ch = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][ch_offset];
|
||||
|
||||
if (phy_vars_ue->high_speed_flag == 0) {
|
||||
if (ue->high_speed_flag == 0) {
|
||||
multadd_complex_vector_real_scalar(dl_ch,
|
||||
32767-phy_vars_ue->ch_est_alpha,
|
||||
dl_ch-(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<1),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
32767-ue->ch_est_alpha,
|
||||
dl_ch-(ue->frame_parms.ofdm_symbol_size<<1),0,ue->frame_parms.ofdm_symbol_size);
|
||||
} else { // high_speed_flag == 1
|
||||
if (symbol == 0) {
|
||||
// printf("Interpolating %d->0\n",4-phy_vars_ue->lte_frame_parms.Ncp);
|
||||
// dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][(4-phy_vars_ue->lte_frame_parms.Ncp)*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
|
||||
dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot3*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
|
||||
// printf("Interpolating %d->0\n",4-ue->frame_parms.Ncp);
|
||||
// dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][(4-ue->frame_parms.Ncp)*(ue->frame_parms.ofdm_symbol_size)];
|
||||
dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot3*(ue->frame_parms.ofdm_symbol_size)];
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size);
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size);
|
||||
} // this is 1/3,2/3 combination for pilots spaced by 3 symbols
|
||||
else if (symbol == pilot1) {
|
||||
dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][0];
|
||||
|
||||
if (phy_vars_ue->lte_frame_parms.Ncp==0) {// pilot spacing 4 symbols (1/4,1/2,3/4 combination)
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,24576,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,8192,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
if (ue->frame_parms.Ncp==0) {// pilot spacing 4 symbols (1/4,1/2,3/4 combination)
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,24576,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,8192,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size);
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,16384,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,16384,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size);
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,8192,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,24576,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,8192,dl_ch_prev+(3*2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,24576,dl_ch_prev+(3*2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size);
|
||||
} else {
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size);
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)<<1),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size);
|
||||
} // pilot spacing 3 symbols (1/3,2/3 combination)
|
||||
} else if (symbol == pilot2) {
|
||||
dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot1*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
|
||||
dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot1*(ue->frame_parms.ofdm_symbol_size)];
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size);
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size);
|
||||
} else { // symbol == pilot3
|
||||
// printf("Interpolating 0->%d\n",4-phy_vars_ue->lte_frame_parms.Ncp);
|
||||
dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
|
||||
// printf("Interpolating 0->%d\n",4-ue->frame_parms.Ncp);
|
||||
dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot2*(ue->frame_parms.ofdm_symbol_size)];
|
||||
|
||||
if (phy_vars_ue->lte_frame_parms.Ncp==0) {// pilot spacing 4 symbols (1/4,1/2,3/4 combination)
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,24576,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,8192,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
if (ue->frame_parms.Ncp==0) {// pilot spacing 4 symbols (1/4,1/2,3/4 combination)
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,24576,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,8192,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size);
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,16384,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,16384,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size);
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,8192,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,24576,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,8192,dl_ch_prev+(3*2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,24576,dl_ch_prev+(3*2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size);
|
||||
} else {
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size);
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)<<1),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size);
|
||||
} // pilot spacing 3 symbols (1/3,2/3 combination)
|
||||
}
|
||||
|
||||
@@ -682,7 +682,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
|
||||
void (*idft)(int16_t *,int16_t *, int);
|
||||
|
||||
switch (phy_vars_ue->lte_frame_parms.ofdm_symbol_size) {
|
||||
switch (ue->frame_parms.ofdm_symbol_size) {
|
||||
case 128:
|
||||
idft = idft128;
|
||||
break;
|
||||
@@ -713,11 +713,11 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
}
|
||||
|
||||
// do ifft of channel estimate
|
||||
for (aarx=0; aarx<phy_vars_ue->lte_frame_parms.nb_antennas_rx; aarx++)
|
||||
for (p=0; p<phy_vars_ue->lte_frame_parms.nb_antennas_tx_eNB; p++) {
|
||||
if (phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][(p<<1)+aarx])
|
||||
idft((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][(p<<1)+aarx][8],
|
||||
(int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][(p<<1)+aarx],1);
|
||||
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++)
|
||||
for (p=0; p<ue->frame_parms.nb_antennas_tx_eNB; p++) {
|
||||
if (ue->common_vars.dl_ch_estimates[eNB_offset][(p<<1)+aarx])
|
||||
idft((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][(p<<1)+aarx][8],
|
||||
(int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][(p<<1)+aarx],1);
|
||||
}
|
||||
|
||||
return(0);
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include "PHY/defs.h"
|
||||
|
||||
//#define DEBUG_CH
|
||||
int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *ue,
|
||||
uint8_t eNB_id,
|
||||
uint8_t eNB_offset,
|
||||
int subframe,
|
||||
@@ -23,28 +23,16 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
// unsigned int n;
|
||||
// int i;
|
||||
|
||||
int **dl_ch_estimates=phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[0];
|
||||
int **rxdataF=phy_vars_ue->lte_ue_common_vars.rxdataF;
|
||||
int **dl_ch_estimates=ue->common_vars.dl_ch_estimates[0];
|
||||
int **rxdataF=ue->common_vars.rxdataF;
|
||||
|
||||
ch_offset = (l*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size));
|
||||
ch_offset = (l*(ue->frame_parms.ofdm_symbol_size));
|
||||
symbol_offset = ch_offset;//phy_vars_ue->lte_frame_parms.ofdm_symbol_size*l;
|
||||
|
||||
// printf("dl_mbsfn_channel_estimation.c: symbol %d (%d)\n",l,ch_offset);
|
||||
// m=phy_vars_ue->lte_frame_parms.N_RB_DL*6;
|
||||
/*
|
||||
if ((l==2) || (l==10))
|
||||
k = 0;//m<<1;
|
||||
else if (l==6)
|
||||
k = 1;//+(m<<1);
|
||||
else {
|
||||
msg("lte_dl_mbsfn: l %d -> ERROR\n",l);
|
||||
return(-1);
|
||||
}
|
||||
*/
|
||||
for (aarx=0; aarx<phy_vars_ue->lte_frame_parms.nb_antennas_rx; aarx++) {
|
||||
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
|
||||
// generate pilot
|
||||
if ((l==2)||(l==6)||(l==10)) {
|
||||
lte_dl_mbsfn_rx(phy_vars_ue,
|
||||
lte_dl_mbsfn_rx(ue,
|
||||
&pilot[0],
|
||||
subframe,
|
||||
l>>2);
|
||||
@@ -53,16 +41,16 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
|
||||
|
||||
pil = (short *)&pilot[0];
|
||||
rxF = (short *)&rxdataF[aarx][((symbol_offset+phy_vars_ue->lte_frame_parms.first_carrier_offset))];
|
||||
rxF = (short *)&rxdataF[aarx][((symbol_offset+ue->frame_parms.first_carrier_offset))];
|
||||
ch = (short *)&dl_ch_estimates[aarx][ch_offset];
|
||||
|
||||
// if (eNb_id==0)
|
||||
memset(ch,0,4*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size));
|
||||
memset(ch,0,4*(ue->frame_parms.ofdm_symbol_size));
|
||||
|
||||
//***********************************************************************
|
||||
if ((phy_vars_ue->lte_frame_parms.N_RB_DL==6) ||
|
||||
(phy_vars_ue->lte_frame_parms.N_RB_DL==50) ||
|
||||
(phy_vars_ue->lte_frame_parms.N_RB_DL==100)) {
|
||||
if ((ue->frame_parms.N_RB_DL==6) ||
|
||||
(ue->frame_parms.N_RB_DL==50) ||
|
||||
(ue->frame_parms.N_RB_DL==100)) {
|
||||
|
||||
// Interpolation and extrapolation;
|
||||
if (l==6) {
|
||||
@@ -71,10 +59,10 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
rxF+=2;
|
||||
}
|
||||
|
||||
for (rb=0; rb<phy_vars_ue->lte_frame_parms.N_RB_DL; rb++) {
|
||||
for (rb=0; rb<ue->frame_parms.N_RB_DL; rb++) {
|
||||
// ------------------------1st pilot------------------------
|
||||
|
||||
if (rb==(phy_vars_ue->lte_frame_parms.N_RB_DL>>1)) {
|
||||
if (rb==(ue->frame_parms.N_RB_DL>>1)) {
|
||||
rxF = (short *)&rxdataF[aarx][symbol_offset+1];
|
||||
|
||||
if (l==6)
|
||||
@@ -89,7 +77,7 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
/*
|
||||
printf("rb %d: pil0 (%d,%d) x (%d,%d) = (%d,%d)\n",
|
||||
rb,pil[0],pil[1],rxF[0],rxF[1],ch[0],ch[1]);*/
|
||||
if ((rb>0)&&(rb!=(phy_vars_ue->lte_frame_parms.N_RB_DL>>1))) {
|
||||
if ((rb>0)&&(rb!=(ue->frame_parms.N_RB_DL>>1))) {
|
||||
ch[-2] += ch[2];
|
||||
ch[-1] += ch[3];
|
||||
} else {
|
||||
@@ -137,8 +125,8 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
ch[20] = (short)(((int)pil[10]*rxF[20] - (int)pil[11]*rxF[21])>>15);
|
||||
ch[21] = (short)(((int)pil[10]*rxF[21] + (int)pil[11]*rxF[20])>>15);
|
||||
|
||||
if ((rb<(phy_vars_ue->lte_frame_parms.N_RB_DL-1))&&
|
||||
(rb!=((phy_vars_ue->lte_frame_parms.N_RB_DL>>1)-1))) {
|
||||
if ((rb<(ue->frame_parms.N_RB_DL-1))&&
|
||||
(rb!=((ue->frame_parms.N_RB_DL>>1)-1))) {
|
||||
ch[22] = ch[20]>>1;
|
||||
ch[23] = ch[21]>>1;
|
||||
ch[18] += ch[22];
|
||||
@@ -160,7 +148,7 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
}
|
||||
|
||||
//*********************************************************************
|
||||
else if (phy_vars_ue->lte_frame_parms.N_RB_DL==25) {
|
||||
else if (ue->frame_parms.N_RB_DL==25) {
|
||||
//printf("Channel estimation\n");
|
||||
//------------------------ loop over first 12 RBs------------------------
|
||||
if (l==6) {
|
||||
@@ -683,72 +671,73 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
//------------------------Temporal Interpolation ------------------------------
|
||||
if (l==6) {
|
||||
ch = (short *)&dl_ch_estimates[aarx][ch_offset];
|
||||
// printf("Interpolating ch 2,6 => %d\n",ch_offset);
|
||||
ch_prev = (short *)&dl_ch_estimates[aarx][2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
|
||||
ch0 = (short *)&dl_ch_estimates[aarx][0*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
|
||||
memcpy(ch0,ch_prev,4*phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
// printf("Interpolating ch 2,6 => %d\n",ch_offset);
|
||||
ch_prev = (short *)&dl_ch_estimates[aarx][2*(ue->frame_parms.ofdm_symbol_size)];
|
||||
ch0 = (short *)&dl_ch_estimates[aarx][0*(ue->frame_parms.ofdm_symbol_size)];
|
||||
memcpy(ch0,ch_prev,4*ue->frame_parms.ofdm_symbol_size);
|
||||
|
||||
ch1 = (short *)&dl_ch_estimates[aarx][1*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
|
||||
memcpy(ch1,ch_prev,4*phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
ch1 = (short *)&dl_ch_estimates[aarx][1*(ue->frame_parms.ofdm_symbol_size)];
|
||||
memcpy(ch1,ch_prev,4*ue->frame_parms.ofdm_symbol_size);
|
||||
|
||||
// 3/4 ch2 + 1/4 ch6 => ch3
|
||||
multadd_complex_vector_real_scalar(ch_prev,24576,ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(ch,8192,ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(ch_prev,24576,ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(ch,8192,ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size);
|
||||
|
||||
// 1/2 ch2 + 1/2 ch6 => ch4
|
||||
multadd_complex_vector_real_scalar(ch_prev,16384,ch_prev+(4*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(ch,16384,ch_prev+(4*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(ch_prev,16384,ch_prev+(4*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(ch,16384,ch_prev+(4*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size);
|
||||
// 1/4 ch2 + 3/4 ch6 => ch5
|
||||
multadd_complex_vector_real_scalar(ch_prev,8192,ch_prev+(6*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size))),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(ch,24576,ch_prev+(6*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size))),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(ch_prev,8192,ch_prev+(6*((ue->frame_parms.ofdm_symbol_size))),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(ch,24576,ch_prev+(6*((ue->frame_parms.ofdm_symbol_size))),0,ue->frame_parms.ofdm_symbol_size);
|
||||
}
|
||||
|
||||
if (l==10) {
|
||||
ch = (short *)&dl_ch_estimates[aarx][ch_offset];
|
||||
ch_prev = (short *)&dl_ch_estimates[aarx][6*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
|
||||
ch_prev = (short *)&dl_ch_estimates[aarx][6*(ue->frame_parms.ofdm_symbol_size)];
|
||||
// 3/4 ch6 + 1/4 ch10 => ch7
|
||||
multadd_complex_vector_real_scalar(ch_prev,24576,ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(ch,8192,ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(ch_prev,24576,ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(ch,8192,ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size);
|
||||
// 1/2 ch6 + 1/2 ch10 => ch8
|
||||
multadd_complex_vector_real_scalar(ch_prev,16384,ch_prev+(4*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(ch,16384,ch_prev+(4*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(ch_prev,16384,ch_prev+(4*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(ch,16384,ch_prev+(4*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size);
|
||||
// 1/4 ch6 + 3/4 ch10 => ch9
|
||||
multadd_complex_vector_real_scalar(ch_prev,8192,ch_prev+(6*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size))),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(ch,24576,ch_prev+(6*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size))),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(ch_prev,8192,ch_prev+(6*((ue->frame_parms.ofdm_symbol_size))),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(ch,24576,ch_prev+(6*((ue->frame_parms.ofdm_symbol_size))),0,ue->frame_parms.ofdm_symbol_size);
|
||||
// 5/4 ch10 - 1/4 ch6 => ch11
|
||||
// Ch11
|
||||
ch_prev = (short *)&dl_ch_estimates[aarx][10*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
|
||||
ch11 = (short *)&dl_ch_estimates[aarx][11*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
|
||||
memcpy(ch11,ch_prev,4*phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
ch_prev = (short *)&dl_ch_estimates[aarx][10*(ue->frame_parms.ofdm_symbol_size)];
|
||||
ch11 = (short *)&dl_ch_estimates[aarx][11*(ue->frame_parms.ofdm_symbol_size)];
|
||||
memcpy(ch11,ch_prev,4*ue->frame_parms.ofdm_symbol_size);
|
||||
}
|
||||
}
|
||||
|
||||
// do ifft of channel estimate
|
||||
for (aa=0; aa<phy_vars_ue->lte_frame_parms.nb_antennas_rx*phy_vars_ue->lte_frame_parms.nb_antennas_tx; aa++) {
|
||||
if (phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa]) {
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_DL) {
|
||||
for (aa=0; aa<ue->frame_parms.nb_antennas_rx*ue->frame_parms.nb_antennas_tx; aa++) {
|
||||
if (ue->common_vars.dl_ch_estimates[eNB_offset][aa]) {
|
||||
switch (ue->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
idft128((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][8],
|
||||
(int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][aa],
|
||||
idft128((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][aa][8],
|
||||
(int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][aa],
|
||||
1);
|
||||
break;
|
||||
case 25:
|
||||
idft512((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][8],
|
||||
(int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][aa],
|
||||
idft512((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][aa][8],
|
||||
(int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][aa],
|
||||
1);
|
||||
break;
|
||||
case 50:
|
||||
idft1024((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][8],
|
||||
(int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][aa],
|
||||
idft1024((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][aa][8],
|
||||
(int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][aa],
|
||||
1);
|
||||
break;
|
||||
case 75:
|
||||
idft1536((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][8],
|
||||
(int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][aa],
|
||||
idft1536((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][aa][8],
|
||||
(int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][aa],
|
||||
1);
|
||||
break;
|
||||
case 100:
|
||||
idft2048((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][8],
|
||||
(int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][aa],
|
||||
idft2048((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][aa][8],
|
||||
(int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][aa],
|
||||
1);
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -11,16 +11,16 @@
|
||||
int32_t rx_power_avg_eNB[3][3];
|
||||
|
||||
|
||||
void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNB,
|
||||
void lte_eNB_I0_measurements(PHY_VARS_eNB *eNB,
|
||||
int subframe,
|
||||
unsigned char eNB_id,
|
||||
unsigned char clear)
|
||||
{
|
||||
|
||||
LTE_eNB_COMMON *eNB_common_vars = &phy_vars_eNB->lte_eNB_common_vars;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms;
|
||||
PHY_MEASUREMENTS_eNB *phy_measurements = &phy_vars_eNB->PHY_measurements_eNB[eNB_id];
|
||||
uint32_t *rb_mask = phy_vars_eNB->rb_mask_ul;
|
||||
LTE_eNB_COMMON *common_vars = &eNB->common_vars;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
|
||||
PHY_MEASUREMENTS_eNB *measurements = &eNB->measurements[eNB_id];
|
||||
uint32_t *rb_mask = eNB->rb_mask_ul;
|
||||
|
||||
uint32_t aarx /* ,rx_power_correction */;
|
||||
uint32_t rb;
|
||||
@@ -31,24 +31,24 @@ void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNB,
|
||||
// noise measurements
|
||||
// for the moment we measure the noise on the 7th OFDM symbol (in S subframe)
|
||||
|
||||
phy_measurements->n0_power_tot = 0;
|
||||
measurements->n0_power_tot = 0;
|
||||
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
if (clear == 1)
|
||||
phy_measurements->n0_power[aarx]=0;
|
||||
measurements->n0_power[aarx]=0;
|
||||
|
||||
|
||||
phy_measurements->n0_power[aarx] = ((k1*signal_energy(&eNB_common_vars->rxdata[eNB_id][aarx][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size],
|
||||
frame_parms->ofdm_symbol_size)) + k2*phy_measurements->n0_power[aarx])>>10;
|
||||
//phy_measurements->n0_power[aarx] = (phy_measurements->n0_power[aarx]) * 12*frame_parms->N_RB_DL)/(frame_parms->ofdm_symbol_size);
|
||||
phy_measurements->n0_power_dB[aarx] = (unsigned short) dB_fixed(phy_measurements->n0_power[aarx]);
|
||||
phy_measurements->n0_power_tot += phy_measurements->n0_power[aarx];
|
||||
measurements->n0_power[aarx] = ((k1*signal_energy(&common_vars->rxdata[eNB_id][aarx][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size],
|
||||
frame_parms->ofdm_symbol_size)) + k2*measurements->n0_power[aarx])>>10;
|
||||
//measurements->n0_power[aarx] = (measurements->n0_power[aarx]) * 12*frame_parms->N_RB_DL)/(frame_parms->ofdm_symbol_size);
|
||||
measurements->n0_power_dB[aarx] = (unsigned short) dB_fixed(measurements->n0_power[aarx]);
|
||||
measurements->n0_power_tot += measurements->n0_power[aarx];
|
||||
}
|
||||
|
||||
phy_measurements->n0_power_tot_dB = (unsigned short) dB_fixed(phy_measurements->n0_power_tot);
|
||||
measurements->n0_power_tot_dB = (unsigned short) dB_fixed(measurements->n0_power_tot);
|
||||
|
||||
phy_measurements->n0_power_tot_dBm = phy_measurements->n0_power_tot_dB - phy_vars_eNB->rx_total_gain_eNB_dB;
|
||||
// printf("n0_power %d\n",phy_measurements->n0_power_tot_dB);
|
||||
measurements->n0_power_tot_dBm = measurements->n0_power_tot_dB - eNB->rx_total_gain_dB;
|
||||
// printf("n0_power %d\n",measurements->n0_power_tot_dB);
|
||||
|
||||
|
||||
for (rb=0; rb<frame_parms->N_RB_UL; rb++) {
|
||||
@@ -60,7 +60,7 @@ void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNB,
|
||||
// select the 7th symbol in an uplink subframe
|
||||
offset = (frame_parms->first_carrier_offset + (rb*12))%frame_parms->ofdm_symbol_size;
|
||||
offset += (7*frame_parms->ofdm_symbol_size);
|
||||
ul_ch = &eNB_common_vars->rxdataF[eNB_id][aarx][offset];
|
||||
ul_ch = &common_vars->rxdataF[eNB_id][aarx][offset];
|
||||
len = 12;
|
||||
// just do first half of middle PRB for odd number of PRBs
|
||||
if (((frame_parms->N_RB_UL&1) == 1) &&
|
||||
@@ -68,36 +68,36 @@ void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNB,
|
||||
len=6;
|
||||
}
|
||||
if (clear == 1)
|
||||
phy_measurements->n0_subband_power[aarx][rb]=0;
|
||||
measurements->n0_subband_power[aarx][rb]=0;
|
||||
|
||||
AssertFatal(ul_ch, "RX signal buffer (freq) problem");
|
||||
|
||||
|
||||
phy_measurements->n0_subband_power[aarx][rb] = signal_energy_nodc(ul_ch,len);
|
||||
measurements->n0_subband_power[aarx][rb] = signal_energy_nodc(ul_ch,len);
|
||||
//((k1*(signal_energy_nodc(ul_ch,len)))
|
||||
// + (k2*phy_measurements->n0_subband_power[aarx][rb]));
|
||||
// + (k2*measurements->n0_subband_power[aarx][rb]));
|
||||
|
||||
phy_measurements->n0_subband_power_dB[aarx][rb] = dB_fixed(phy_measurements->n0_subband_power[aarx][rb]);
|
||||
// printf("subframe %d (%d): eNb %d, aarx %d, rb %d len %d: energy %d (%d dB)\n",subframe,offset,eNB_id,aarx,rb,len,signal_energy_nodc(ul_ch,len),
|
||||
// phy_measurements->n0_subband_power_dB[aarx][rb]);
|
||||
n0_power_tot += phy_measurements->n0_subband_power[aarx][rb];
|
||||
measurements->n0_subband_power_dB[aarx][rb] = dB_fixed(measurements->n0_subband_power[aarx][rb]);
|
||||
// printf("subframe %d (%d): eNB %d, aarx %d, rb %d len %d: energy %d (%d dB)\n",subframe,offset,eNB_id,aarx,rb,len,signal_energy_nodc(ul_ch,len),
|
||||
// measurements->n0_subband_power_dB[aarx][rb]);
|
||||
n0_power_tot += measurements->n0_subband_power[aarx][rb];
|
||||
}
|
||||
|
||||
phy_measurements->n0_subband_power_tot_dB[rb] = dB_fixed(n0_power_tot);
|
||||
phy_measurements->n0_subband_power_tot_dBm[rb] = phy_measurements->n0_subband_power_tot_dB[rb] - phy_vars_eNB->rx_total_gain_eNB_dB - dB_fixed(frame_parms->N_RB_UL);
|
||||
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);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void lte_eNB_srs_measurements(PHY_VARS_eNB *phy_vars_eNb,
|
||||
void lte_eNB_srs_measurements(PHY_VARS_eNB *eNB,
|
||||
unsigned char eNB_id,
|
||||
unsigned char UE_id,
|
||||
unsigned char init_averaging)
|
||||
{
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNb->lte_frame_parms;
|
||||
PHY_MEASUREMENTS_eNB *phy_measurements = &phy_vars_eNb->PHY_measurements_eNB[eNB_id];
|
||||
LTE_eNB_SRS *eNB_srs_vars = &phy_vars_eNb->lte_eNB_srs_vars[UE_id];
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
|
||||
PHY_MEASUREMENTS_eNB *measurements = &eNB->measurements[eNB_id];
|
||||
LTE_eNB_SRS *srs_vars = &eNB->srs_vars[UE_id];
|
||||
|
||||
int32_t aarx,rx_power_correction;
|
||||
int32_t rx_power;
|
||||
@@ -123,39 +123,39 @@ void lte_eNB_srs_measurements(PHY_VARS_eNB *phy_vars_eNb,
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
|
||||
|
||||
phy_measurements->rx_spatial_power[UE_id][0][aarx] =
|
||||
((signal_energy_nodc(&eNB_srs_vars->srs_ch_estimates[eNB_id][aarx][frame_parms->first_carrier_offset],
|
||||
measurements->rx_spatial_power[UE_id][0][aarx] =
|
||||
((signal_energy_nodc(&srs_vars->srs_ch_estimates[eNB_id][aarx][frame_parms->first_carrier_offset],
|
||||
(frame_parms->N_RB_DL*6)) +
|
||||
signal_energy_nodc(&eNB_srs_vars->srs_ch_estimates[eNB_id][aarx][1],
|
||||
signal_energy_nodc(&srs_vars->srs_ch_estimates[eNB_id][aarx][1],
|
||||
(frame_parms->N_RB_DL*6)))*rx_power_correction) -
|
||||
phy_measurements->n0_power[aarx];
|
||||
measurements->n0_power[aarx];
|
||||
|
||||
phy_measurements->rx_spatial_power[UE_id][0][aarx]<<=1; // because of noise only in odd samples
|
||||
measurements->rx_spatial_power[UE_id][0][aarx]<<=1; // because of noise only in odd samples
|
||||
|
||||
phy_measurements->rx_spatial_power_dB[UE_id][0][aarx] = (unsigned short) dB_fixed(phy_measurements->rx_spatial_power[UE_id][0][aarx]);
|
||||
measurements->rx_spatial_power_dB[UE_id][0][aarx] = (unsigned short) dB_fixed(measurements->rx_spatial_power[UE_id][0][aarx]);
|
||||
|
||||
phy_measurements->wideband_cqi[UE_id][aarx] = phy_measurements->rx_spatial_power[UE_id][0][aarx];
|
||||
measurements->wideband_cqi[UE_id][aarx] = measurements->rx_spatial_power[UE_id][0][aarx];
|
||||
|
||||
|
||||
|
||||
// phy_measurements->rx_power[UE_id][aarx]/=frame_parms->nb_antennas_tx;
|
||||
phy_measurements->wideband_cqi_dB[UE_id][aarx] = (unsigned short) dB_fixed(phy_measurements->wideband_cqi[UE_id][aarx]);
|
||||
rx_power += phy_measurements->wideband_cqi[UE_id][aarx];
|
||||
// phy_measurements->rx_avg_power_dB[UE_id] += phy_measurements->rx_power_dB[UE_id][aarx];
|
||||
// measurements->rx_power[UE_id][aarx]/=frame_parms->nb_antennas_tx;
|
||||
measurements->wideband_cqi_dB[UE_id][aarx] = (unsigned short) dB_fixed(measurements->wideband_cqi[UE_id][aarx]);
|
||||
rx_power += measurements->wideband_cqi[UE_id][aarx];
|
||||
// measurements->rx_avg_power_dB[UE_id] += measurements->rx_power_dB[UE_id][aarx];
|
||||
}
|
||||
|
||||
|
||||
|
||||
// phy_measurements->rx_avg_power_dB[UE_id]/=frame_parms->nb_antennas_rx;
|
||||
// measurements->rx_avg_power_dB[UE_id]/=frame_parms->nb_antennas_rx;
|
||||
if (init_averaging == 0)
|
||||
rx_power_avg_eNB[UE_id][eNB_id] = ((k1*rx_power_avg_eNB[UE_id][eNB_id]) + (k2*rx_power))>>10;
|
||||
else
|
||||
rx_power_avg_eNB[UE_id][eNB_id] = rx_power;
|
||||
|
||||
phy_measurements->wideband_cqi_tot[UE_id] = dB_fixed2(rx_power,2*phy_measurements->n0_power_tot);
|
||||
measurements->wideband_cqi_tot[UE_id] = dB_fixed2(rx_power,2*measurements->n0_power_tot);
|
||||
// times 2 since we have noise only in the odd carriers of the srs comb
|
||||
|
||||
phy_measurements->rx_rssi_dBm[UE_id] = (int32_t)dB_fixed(rx_power_avg_eNB[UE_id][eNB_id])-phy_vars_eNb->rx_total_gain_eNB_dB;
|
||||
measurements->rx_rssi_dBm[UE_id] = (int32_t)dB_fixed(rx_power_avg_eNB[UE_id][eNB_id])-eNB->rx_total_gain_dB;
|
||||
|
||||
|
||||
|
||||
@@ -165,52 +165,52 @@ void lte_eNB_srs_measurements(PHY_VARS_eNB *phy_vars_eNb,
|
||||
|
||||
for (rb=0; rb<frame_parms->N_RB_DL; rb++) {
|
||||
|
||||
// printf("eNB_common_vars->srs_ch_estimates[0] => %x\n",eNB_common_vars->srs_ch_estimates[0]);
|
||||
// printf("common_vars->srs_ch_estimates[0] => %x\n",common_vars->srs_ch_estimates[0]);
|
||||
if (rb < 12)
|
||||
ul_ch = &eNB_srs_vars->srs_ch_estimates[eNB_id][aarx][frame_parms->first_carrier_offset + (rb*12)];
|
||||
ul_ch = &srs_vars->srs_ch_estimates[eNB_id][aarx][frame_parms->first_carrier_offset + (rb*12)];
|
||||
else if (rb>12)
|
||||
ul_ch = &eNB_srs_vars->srs_ch_estimates[eNB_id][aarx][6 + (rb-13)*12];
|
||||
ul_ch = &srs_vars->srs_ch_estimates[eNB_id][aarx][6 + (rb-13)*12];
|
||||
else {
|
||||
phy_measurements->subband_cqi_dB[UE_id][aarx][rb] = 0;
|
||||
measurements->subband_cqi_dB[UE_id][aarx][rb] = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
// cqi
|
||||
if (aarx==0)
|
||||
phy_measurements->subband_cqi_tot[UE_id][rb]=0;
|
||||
measurements->subband_cqi_tot[UE_id][rb]=0;
|
||||
|
||||
phy_measurements->subband_cqi[UE_id][aarx][rb] = (signal_energy_nodc(ul_ch,12))*rx_power_correction - phy_measurements->n0_power[aarx];
|
||||
measurements->subband_cqi[UE_id][aarx][rb] = (signal_energy_nodc(ul_ch,12))*rx_power_correction - measurements->n0_power[aarx];
|
||||
|
||||
if (phy_measurements->subband_cqi[UE_id][aarx][rb] < 0)
|
||||
phy_measurements->subband_cqi[UE_id][aarx][rb]=0;
|
||||
if (measurements->subband_cqi[UE_id][aarx][rb] < 0)
|
||||
measurements->subband_cqi[UE_id][aarx][rb]=0;
|
||||
|
||||
phy_measurements->subband_cqi_tot[UE_id][rb] += phy_measurements->subband_cqi[UE_id][aarx][rb];
|
||||
phy_measurements->subband_cqi_dB[UE_id][aarx][rb] = dB_fixed2(phy_measurements->subband_cqi[UE_id][aarx][rb],
|
||||
2*phy_measurements->n0_power[aarx]);
|
||||
measurements->subband_cqi_tot[UE_id][rb] += measurements->subband_cqi[UE_id][aarx][rb];
|
||||
measurements->subband_cqi_dB[UE_id][aarx][rb] = dB_fixed2(measurements->subband_cqi[UE_id][aarx][rb],
|
||||
2*measurements->n0_power[aarx]);
|
||||
// 2*n0_power since we have noise from the odd carriers in the comb of the srs
|
||||
|
||||
// msg("subband_cqi[%d][%d][%d] => %d (%d dB)\n",eNB_id,aarx,rb,phy_measurements->subband_cqi[eNB_id][aarx][rb],phy_measurements->subband_cqi_dB[eNB_id][aarx][rb]);
|
||||
// msg("subband_cqi[%d][%d][%d] => %d (%d dB)\n",eNB_id,aarx,rb,measurements->subband_cqi[eNB_id][aarx][rb],measurements->subband_cqi_dB[eNB_id][aarx][rb]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
for (rb=0; rb<frame_parms->N_RB_DL; rb++) {
|
||||
phy_measurements->subband_cqi_tot_dB[UE_id][rb] = dB_fixed2(phy_measurements->subband_cqi_tot[UE_id][rb],
|
||||
phy_measurements->n0_power_tot);
|
||||
measurements->subband_cqi_tot_dB[UE_id][rb] = dB_fixed2(measurements->subband_cqi_tot[UE_id][rb],
|
||||
measurements->n0_power_tot);
|
||||
/*
|
||||
if (phy_measurements->subband_cqi_tot_dB[UE_id][rb] == 65)
|
||||
msg("eNB meas error *****subband_cqi_tot[%d][%d] %d => %d dB (n0 %d)\n",UE_id,rb,phy_measurements->subband_cqi_tot[UE_id][rb],phy_measurements->subband_cqi_tot_dB[UE_id][rb],phy_measurements->n0_power_tot);
|
||||
if (measurements->subband_cqi_tot_dB[UE_id][rb] == 65)
|
||||
msg("eNB meas error *****subband_cqi_tot[%d][%d] %d => %d dB (n0 %d)\n",UE_id,rb,measurements->subband_cqi_tot[UE_id][rb],measurements->subband_cqi_tot_dB[UE_id][rb],measurements->n0_power_tot);
|
||||
*/
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void lte_eNB_I0_measurements_emul(PHY_VARS_eNB *phy_vars_eNb,
|
||||
void lte_eNB_I0_measurements_emul(PHY_VARS_eNB *eNB,
|
||||
uint8_t sect_id)
|
||||
{
|
||||
|
||||
LOG_D(PHY,"EMUL lte_eNB_IO_measurements_emul: eNB %d, sect %d\n",phy_vars_eNb->Mod_id,sect_id);
|
||||
LOG_D(PHY,"EMUL lte_eNB_IO_measurements_emul: eNB %d, sect %d\n",eNB->Mod_id,sect_id);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ void lte_sync_timefreq(PHY_VARS_UE *ue,int band,unsigned int DL_freq)
|
||||
|
||||
//compute frequency-domain representation of 6144-sample chunk
|
||||
|
||||
rxp = &ue->lte_ue_common_vars.rxdata[0][i];
|
||||
rxp = &ue->common_vars.rxdata[0][i];
|
||||
sp=spectrum;
|
||||
|
||||
while (1) {
|
||||
@@ -312,8 +312,8 @@ void lte_sync_timefreq(PHY_VARS_UE *ue,int band,unsigned int DL_freq)
|
||||
} // loop on pss index
|
||||
}
|
||||
|
||||
if (rxp == &ue->lte_ue_common_vars.rxdata[0][i+38400*4]) {
|
||||
rxp = &ue->lte_ue_common_vars.rxdata[0][i+38400*4];
|
||||
if (rxp == &ue->common_vars.rxdata[0][i+38400*4]) {
|
||||
rxp = &ue->common_vars.rxdata[0][i+38400*4];
|
||||
sp=spectrum_p5ms;
|
||||
} else {
|
||||
break;
|
||||
|
||||
@@ -38,36 +38,36 @@ void print_ints(char *s,int *x)
|
||||
int16_t get_PL(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index)
|
||||
{
|
||||
|
||||
PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||
PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||
/*
|
||||
int RSoffset;
|
||||
|
||||
|
||||
if (phy_vars_ue->lte_frame_parms.mode1_flag == 1)
|
||||
if (ue->frame_parms.mode1_flag == 1)
|
||||
RSoffset = 6;
|
||||
else
|
||||
RSoffset = 3;
|
||||
*/
|
||||
|
||||
LOG_D(PHY,"get_PL : Frame %d : rsrp %f dBm/RE (%f), eNB power %d dBm/RE\n", phy_vars_ue->frame_rx,
|
||||
(1.0*dB_fixed_times10(phy_vars_ue->PHY_measurements.rsrp[eNB_index])-(10.0*phy_vars_ue->rx_total_gain_dB))/10.0,
|
||||
10*log10((double)phy_vars_ue->PHY_measurements.rsrp[eNB_index]),
|
||||
phy_vars_ue->lte_frame_parms.pdsch_config_common.referenceSignalPower);
|
||||
LOG_D(PHY,"get_PL : Frame %d : rsrp %f dBm/RE (%f), eNB power %d dBm/RE\n", ue->proc.proc_rxtx[0].frame_rx,
|
||||
(1.0*dB_fixed_times10(ue->measurements.rsrp[eNB_index])-(10.0*ue->rx_total_gain_dB))/10.0,
|
||||
10*log10((double)ue->measurements.rsrp[eNB_index]),
|
||||
ue->frame_parms.pdsch_config_common.referenceSignalPower);
|
||||
|
||||
return((int16_t)(((10*phy_vars_ue->rx_total_gain_dB) -
|
||||
dB_fixed_times10(phy_vars_ue->PHY_measurements.rsrp[eNB_index])+
|
||||
// dB_fixed_times10(RSoffset*12*PHY_vars_UE_g[Mod_id][CC_id]->lte_frame_parms.N_RB_DL) +
|
||||
(phy_vars_ue->lte_frame_parms.pdsch_config_common.referenceSignalPower*10))/10));
|
||||
return((int16_t)(((10*ue->rx_total_gain_dB) -
|
||||
dB_fixed_times10(ue->measurements.rsrp[eNB_index])+
|
||||
// dB_fixed_times10(RSoffset*12*ue_g[Mod_id][CC_id]->frame_parms.N_RB_DL) +
|
||||
(ue->frame_parms.pdsch_config_common.referenceSignalPower*10))/10));
|
||||
}
|
||||
|
||||
|
||||
uint8_t get_n_adj_cells (uint8_t Mod_id,uint8_t CC_id)
|
||||
{
|
||||
|
||||
PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||
PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||
|
||||
if (phy_vars_ue)
|
||||
return phy_vars_ue->PHY_measurements.n_adj_cells;
|
||||
if (ue)
|
||||
return ue->measurements.n_adj_cells;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
@@ -75,30 +75,30 @@ uint8_t get_n_adj_cells (uint8_t Mod_id,uint8_t CC_id)
|
||||
uint32_t get_rx_total_gain_dB (uint8_t Mod_id,uint8_t CC_id)
|
||||
{
|
||||
|
||||
PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||
PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||
|
||||
if (phy_vars_ue)
|
||||
return phy_vars_ue->rx_total_gain_dB;
|
||||
if (ue)
|
||||
return ue->rx_total_gain_dB;
|
||||
|
||||
return 0xFFFFFFFF;
|
||||
}
|
||||
uint32_t get_RSSI (uint8_t Mod_id,uint8_t CC_id)
|
||||
{
|
||||
|
||||
PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||
PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||
|
||||
if (phy_vars_ue)
|
||||
return phy_vars_ue->PHY_measurements.rssi;
|
||||
if (ue)
|
||||
return ue->measurements.rssi;
|
||||
|
||||
return 0xFFFFFFFF;
|
||||
}
|
||||
uint32_t get_RSRP(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index)
|
||||
{
|
||||
|
||||
PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||
PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||
|
||||
if (phy_vars_ue)
|
||||
return phy_vars_ue->PHY_measurements.rsrp[eNB_index];
|
||||
if (ue)
|
||||
return ue->measurements.rsrp[eNB_index];
|
||||
|
||||
return 0xFFFFFFFF;
|
||||
}
|
||||
@@ -106,10 +106,10 @@ uint32_t get_RSRP(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index)
|
||||
uint32_t get_RSRQ(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index)
|
||||
{
|
||||
|
||||
PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||
PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||
|
||||
if (phy_vars_ue)
|
||||
return phy_vars_ue->PHY_measurements.rsrq[eNB_index];
|
||||
if (ue)
|
||||
return ue->measurements.rsrq[eNB_index];
|
||||
|
||||
return 0xFFFFFFFF;
|
||||
}
|
||||
@@ -117,10 +117,10 @@ uint32_t get_RSRQ(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index)
|
||||
int8_t set_RSRP_filtered(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index,float rsrp)
|
||||
{
|
||||
|
||||
PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||
PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||
|
||||
if (phy_vars_ue) {
|
||||
phy_vars_ue->PHY_measurements.rsrp_filtered[eNB_index]=rsrp;
|
||||
if (ue) {
|
||||
ue->measurements.rsrp_filtered[eNB_index]=rsrp;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -131,10 +131,10 @@ int8_t set_RSRP_filtered(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index,float rs
|
||||
int8_t set_RSRQ_filtered(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index,float rsrq)
|
||||
{
|
||||
|
||||
PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||
PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||
|
||||
if (phy_vars_ue) {
|
||||
phy_vars_ue->PHY_measurements.rsrq_filtered[eNB_index]=rsrq;
|
||||
if (ue) {
|
||||
ue->measurements.rsrq_filtered[eNB_index]=rsrq;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -143,103 +143,103 @@ int8_t set_RSRQ_filtered(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index,float rs
|
||||
|
||||
}
|
||||
|
||||
void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue,
|
||||
uint8_t slot,
|
||||
void ue_rrc_measurements(PHY_VARS_UE *ue,
|
||||
uint8_t subframe,
|
||||
uint8_t abstraction_flag)
|
||||
{
|
||||
|
||||
int aarx,rb;
|
||||
int16_t *rxF,*rxF_pss,*rxF_sss;
|
||||
|
||||
uint16_t Nid_cell = phy_vars_ue->lte_frame_parms.Nid_cell;
|
||||
uint16_t Nid_cell = ue->frame_parms.Nid_cell;
|
||||
uint8_t eNB_offset,nu,l,nushift,k;
|
||||
uint16_t off;
|
||||
|
||||
|
||||
for (eNB_offset = 0; eNB_offset<1+phy_vars_ue->PHY_measurements.n_adj_cells; eNB_offset++) {
|
||||
for (eNB_offset = 0; eNB_offset<1+ue->measurements.n_adj_cells; eNB_offset++) {
|
||||
|
||||
if (eNB_offset==0) {
|
||||
phy_vars_ue->PHY_measurements.rssi = 0;
|
||||
phy_vars_ue->PHY_measurements.n0_power_tot = 0;
|
||||
ue->measurements.rssi = 0;
|
||||
ue->measurements.n0_power_tot = 0;
|
||||
|
||||
if (abstraction_flag == 0) {
|
||||
if ((phy_vars_ue->lte_frame_parms.frame_type == FDD) &&
|
||||
((slot == 0) || (slot == 10))) { // FDD PSS/SSS, compute noise in DTX REs
|
||||
if ((ue->frame_parms.frame_type == FDD) &&
|
||||
((subframe == 0) || (subframe == 5))) { // FDD PSS/SSS, compute noise in DTX REs
|
||||
|
||||
if (phy_vars_ue->lte_frame_parms.Ncp==NORMAL) {
|
||||
for (aarx=0; aarx<phy_vars_ue->lte_frame_parms.nb_antennas_rx; aarx++) {
|
||||
if (ue->frame_parms.Ncp==NORMAL) {
|
||||
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
|
||||
|
||||
rxF_sss = (int16_t *)&phy_vars_ue->lte_ue_common_vars.rxdataF[aarx][(5*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
|
||||
rxF_pss = (int16_t *)&phy_vars_ue->lte_ue_common_vars.rxdataF[aarx][(6*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
|
||||
rxF_sss = (int16_t *)&ue->common_vars.rxdataF[aarx][(5*ue->frame_parms.ofdm_symbol_size)];
|
||||
rxF_pss = (int16_t *)&ue->common_vars.rxdataF[aarx][(6*ue->frame_parms.ofdm_symbol_size)];
|
||||
|
||||
|
||||
//-ve spectrum from SSS
|
||||
// printf("slot %d: SSS DTX: %d,%d, non-DTX %d,%d\n",slot,rxF_pss[-72],rxF_pss[-71],rxF_pss[-36],rxF_pss[-35]);
|
||||
|
||||
// phy_vars_ue->PHY_measurements.n0_power[aarx] = (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71]));
|
||||
// printf("sssn36 %d\n",phy_vars_ue->PHY_measurements.n0_power[aarx]);
|
||||
phy_vars_ue->PHY_measurements.n0_power[aarx] = (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69]));
|
||||
phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-68]*rxF_pss[-68])+((int32_t)rxF_pss[-67]*rxF_pss[-67]));
|
||||
phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-66]*rxF_pss[-66])+((int32_t)rxF_pss[-65]*rxF_pss[-65]));
|
||||
// phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63]));
|
||||
// printf("sssm32 %d\n",phy_vars_ue->PHY_measurements.n0_power[aarx]);
|
||||
// ue->measurements.n0_power[aarx] = (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71]));
|
||||
// printf("sssn36 %d\n",ue->measurements.n0_power[aarx]);
|
||||
ue->measurements.n0_power[aarx] = (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69]));
|
||||
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-68]*rxF_pss[-68])+((int32_t)rxF_pss[-67]*rxF_pss[-67]));
|
||||
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-66]*rxF_pss[-66])+((int32_t)rxF_pss[-65]*rxF_pss[-65]));
|
||||
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63]));
|
||||
// printf("sssm32 %d\n",ue->measurements.n0_power[aarx]);
|
||||
//+ve spectrum from SSS
|
||||
phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+70]*rxF_sss[2+70])+((int32_t)rxF_sss[2+69]*rxF_sss[2+69]));
|
||||
phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+68]*rxF_sss[2+68])+((int32_t)rxF_sss[2+67]*rxF_sss[2+67]));
|
||||
phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+66]*rxF_sss[2+66])+((int32_t)rxF_sss[2+65]*rxF_sss[2+65]));
|
||||
// phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+64]*rxF_sss[2+64])+((int32_t)rxF_sss[2+63]*rxF_sss[2+63]));
|
||||
// printf("sssp32 %d\n",phy_vars_ue->PHY_measurements.n0_power[aarx]);
|
||||
ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+70]*rxF_sss[2+70])+((int32_t)rxF_sss[2+69]*rxF_sss[2+69]));
|
||||
ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+68]*rxF_sss[2+68])+((int32_t)rxF_sss[2+67]*rxF_sss[2+67]));
|
||||
ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+66]*rxF_sss[2+66])+((int32_t)rxF_sss[2+65]*rxF_sss[2+65]));
|
||||
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+64]*rxF_sss[2+64])+((int32_t)rxF_sss[2+63]*rxF_sss[2+63]));
|
||||
// printf("sssp32 %d\n",ue->measurements.n0_power[aarx]);
|
||||
//+ve spectrum from PSS
|
||||
phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+70]*rxF_pss[2+70])+((int32_t)rxF_pss[2+69]*rxF_pss[2+69]));
|
||||
phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+68]*rxF_pss[2+68])+((int32_t)rxF_pss[2+67]*rxF_pss[2+67]));
|
||||
phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+66]*rxF_pss[2+66])+((int32_t)rxF_pss[2+65]*rxF_pss[2+65]));
|
||||
// phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+64]*rxF_pss[2+64])+((int32_t)rxF_pss[2+63]*rxF_pss[2+63]));
|
||||
// printf("pss32 %d\n",phy_vars_ue->PHY_measurements.n0_power[aarx]); //-ve spectrum from PSS
|
||||
rxF_pss = (int16_t *)&phy_vars_ue->lte_ue_common_vars.rxdataF[aarx][(7*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
|
||||
// phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71]));
|
||||
// printf("pssm36 %d\n",phy_vars_ue->PHY_measurements.n0_power[aarx]);
|
||||
phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69]));
|
||||
phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-68]*rxF_pss[-68])+((int32_t)rxF_pss[-67]*rxF_pss[-67]));
|
||||
phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-66]*rxF_pss[-66])+((int32_t)rxF_pss[-65]*rxF_pss[-65]));
|
||||
// phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63]));
|
||||
// printf("pssm32 %d\n",phy_vars_ue->PHY_measurements.n0_power[aarx]);
|
||||
phy_vars_ue->PHY_measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(phy_vars_ue->PHY_measurements.n0_power[aarx]/12);
|
||||
phy_vars_ue->PHY_measurements.n0_power_tot += phy_vars_ue->PHY_measurements.n0_power[aarx];
|
||||
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+70]*rxF_pss[2+70])+((int32_t)rxF_pss[2+69]*rxF_pss[2+69]));
|
||||
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+68]*rxF_pss[2+68])+((int32_t)rxF_pss[2+67]*rxF_pss[2+67]));
|
||||
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+66]*rxF_pss[2+66])+((int32_t)rxF_pss[2+65]*rxF_pss[2+65]));
|
||||
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+64]*rxF_pss[2+64])+((int32_t)rxF_pss[2+63]*rxF_pss[2+63]));
|
||||
// printf("pss32 %d\n",ue->measurements.n0_power[aarx]); //-ve spectrum from PSS
|
||||
rxF_pss = (int16_t *)&ue->common_vars.rxdataF[aarx][(7*ue->frame_parms.ofdm_symbol_size)];
|
||||
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71]));
|
||||
// printf("pssm36 %d\n",ue->measurements.n0_power[aarx]);
|
||||
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69]));
|
||||
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-68]*rxF_pss[-68])+((int32_t)rxF_pss[-67]*rxF_pss[-67]));
|
||||
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-66]*rxF_pss[-66])+((int32_t)rxF_pss[-65]*rxF_pss[-65]));
|
||||
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63]));
|
||||
// printf("pssm32 %d\n",ue->measurements.n0_power[aarx]);
|
||||
ue->measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(ue->measurements.n0_power[aarx]/12);
|
||||
ue->measurements.n0_power_tot += ue->measurements.n0_power[aarx];
|
||||
}
|
||||
|
||||
phy_vars_ue->PHY_measurements.n0_power_tot_dB = (unsigned short) dB_fixed(phy_vars_ue->PHY_measurements.n0_power_tot/(12*aarx));
|
||||
phy_vars_ue->PHY_measurements.n0_power_tot_dBm = phy_vars_ue->PHY_measurements.n0_power_tot_dB - phy_vars_ue->rx_total_gain_dB - dB_fixed(phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
ue->measurements.n0_power_tot_dB = (unsigned short) dB_fixed(ue->measurements.n0_power_tot/(12*aarx));
|
||||
ue->measurements.n0_power_tot_dBm = ue->measurements.n0_power_tot_dB - ue->rx_total_gain_dB - dB_fixed(ue->frame_parms.ofdm_symbol_size);
|
||||
}
|
||||
}
|
||||
else if ((phy_vars_ue->lte_frame_parms.frame_type == TDD) &&
|
||||
(slot == 1)) { // TDD SSS, compute noise in DTX REs
|
||||
else if ((ue->frame_parms.frame_type == TDD) &&
|
||||
(subframe == 0)) { // TDD SSS, compute noise in DTX REs
|
||||
|
||||
if (phy_vars_ue->lte_frame_parms.Ncp==NORMAL) {
|
||||
for (aarx=0; aarx<phy_vars_ue->lte_frame_parms.nb_antennas_rx; aarx++) {
|
||||
if (ue->frame_parms.Ncp==NORMAL) {
|
||||
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
|
||||
|
||||
rxF_sss = (int16_t *)&phy_vars_ue->lte_ue_common_vars.rxdataF[aarx][(6*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
|
||||
rxF_sss = (int16_t *)&ue->common_vars.rxdataF[aarx][(6*ue->frame_parms.ofdm_symbol_size)];
|
||||
// note this is a dummy pointer, the pss is not really there!
|
||||
// in FDD the pss is in the symbol after the sss, but not in TDD
|
||||
rxF_pss = (int16_t *)&phy_vars_ue->lte_ue_common_vars.rxdataF[aarx][(7*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
|
||||
rxF_pss = (int16_t *)&ue->common_vars.rxdataF[aarx][(7*ue->frame_parms.ofdm_symbol_size)];
|
||||
|
||||
//-ve spectrum from SSS
|
||||
// phy_vars_ue->PHY_measurements.n0_power[aarx] = (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71]));
|
||||
phy_vars_ue->PHY_measurements.n0_power[aarx] = (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69]));
|
||||
phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-68]*rxF_pss[-68])+((int32_t)rxF_pss[-67]*rxF_pss[-67]));
|
||||
phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-66]*rxF_pss[-66])+((int32_t)rxF_pss[-65]*rxF_pss[-65]));
|
||||
// phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63]));
|
||||
// ue->measurements.n0_power[aarx] = (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71]));
|
||||
ue->measurements.n0_power[aarx] = (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69]));
|
||||
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-68]*rxF_pss[-68])+((int32_t)rxF_pss[-67]*rxF_pss[-67]));
|
||||
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-66]*rxF_pss[-66])+((int32_t)rxF_pss[-65]*rxF_pss[-65]));
|
||||
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63]));
|
||||
//+ve spectrum from SSS
|
||||
// phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+72]*rxF_sss[2+72])+((int32_t)rxF_sss[2+71]*rxF_sss[2+71]));
|
||||
phy_vars_ue->PHY_measurements.n0_power[aarx] = (((int32_t)rxF_sss[2+70]*rxF_sss[2+70])+((int32_t)rxF_sss[2+69]*rxF_sss[2+69]));
|
||||
phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+68]*rxF_sss[2+68])+((int32_t)rxF_sss[2+67]*rxF_sss[2+67]));
|
||||
phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+66]*rxF_sss[2+66])+((int32_t)rxF_sss[2+65]*rxF_sss[2+65]));
|
||||
// phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+64]*rxF_sss[2+64])+((int32_t)rxF_sss[2+63]*rxF_sss[2+63]));
|
||||
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+72]*rxF_sss[2+72])+((int32_t)rxF_sss[2+71]*rxF_sss[2+71]));
|
||||
ue->measurements.n0_power[aarx] = (((int32_t)rxF_sss[2+70]*rxF_sss[2+70])+((int32_t)rxF_sss[2+69]*rxF_sss[2+69]));
|
||||
ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+68]*rxF_sss[2+68])+((int32_t)rxF_sss[2+67]*rxF_sss[2+67]));
|
||||
ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+66]*rxF_sss[2+66])+((int32_t)rxF_sss[2+65]*rxF_sss[2+65]));
|
||||
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+64]*rxF_sss[2+64])+((int32_t)rxF_sss[2+63]*rxF_sss[2+63]));
|
||||
|
||||
phy_vars_ue->PHY_measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(phy_vars_ue->PHY_measurements.n0_power[aarx]/(6));
|
||||
phy_vars_ue->PHY_measurements.n0_power_tot += phy_vars_ue->PHY_measurements.n0_power[aarx];
|
||||
ue->measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(ue->measurements.n0_power[aarx]/(6));
|
||||
ue->measurements.n0_power_tot += ue->measurements.n0_power[aarx];
|
||||
}
|
||||
phy_vars_ue->PHY_measurements.n0_power_tot_dB = (unsigned short) dB_fixed(phy_vars_ue->PHY_measurements.n0_power_tot/(6*aarx));
|
||||
phy_vars_ue->PHY_measurements.n0_power_tot_dBm = phy_vars_ue->PHY_measurements.n0_power_tot_dB - phy_vars_ue->rx_total_gain_dB - dB_fixed(phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
ue->measurements.n0_power_tot_dB = (unsigned short) dB_fixed(ue->measurements.n0_power_tot/(6*aarx));
|
||||
ue->measurements.n0_power_tot_dBm = ue->measurements.n0_power_tot_dB - ue->rx_total_gain_dB - dB_fixed(ue->frame_parms.ofdm_symbol_size);
|
||||
|
||||
|
||||
}
|
||||
@@ -247,58 +247,58 @@ void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue,
|
||||
}
|
||||
}
|
||||
// recompute nushift with eNB_offset corresponding to adjacent eNB on which to perform channel estimation
|
||||
// printf("[PHY][UE %d] Frame %d slot %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, Nid2 %d, nushift %d, eNB_offset %d)\n",phy_vars_ue->Mod_id,phy_vars_ue->frame,slot,Nid_cell,Nid2,nushift,eNB_offset);
|
||||
// printf("[PHY][UE %d] Frame %d slot %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, Nid2 %d, nushift %d, eNB_offset %d)\n",ue->Mod_id,ue->frame,slot,Nid_cell,Nid2,nushift,eNB_offset);
|
||||
if (eNB_offset > 0)
|
||||
Nid_cell = phy_vars_ue->PHY_measurements.adj_cell_id[eNB_offset-1];
|
||||
Nid_cell = ue->measurements.adj_cell_id[eNB_offset-1];
|
||||
|
||||
|
||||
nushift = Nid_cell%6;
|
||||
|
||||
|
||||
|
||||
phy_vars_ue->PHY_measurements.rsrp[eNB_offset] = 0;
|
||||
ue->measurements.rsrp[eNB_offset] = 0;
|
||||
|
||||
|
||||
if (abstraction_flag == 0) {
|
||||
|
||||
// compute RSRP using symbols 0 and 4-frame_parms->Ncp
|
||||
|
||||
for (l=0,nu=0; l<=(4-phy_vars_ue->lte_frame_parms.Ncp); l+=(4-phy_vars_ue->lte_frame_parms.Ncp),nu=3) {
|
||||
for (l=0,nu=0; l<=(4-ue->frame_parms.Ncp); l+=(4-ue->frame_parms.Ncp),nu=3) {
|
||||
k = (nu + nushift)%6;
|
||||
#ifdef DEBUG_MEAS
|
||||
LOG_I(PHY,"[UE %d] Frame %d slot %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, nushift %d, eNB_offset %d, k %d, l %d)\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_rx,slot,Nid_cell,nushift,
|
||||
LOG_I(PHY,"[UE %d] Frame %d subframe %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, nushift %d, eNB_offset %d, k %d, l %d)\n",ue->Mod_id,ue->proc.proc_rxtx[subframe&1].frame_rx,subframe,Nid_cell,nushift,
|
||||
eNB_offset,k,l);
|
||||
#endif
|
||||
|
||||
for (aarx=0; aarx<phy_vars_ue->lte_frame_parms.nb_antennas_rx; aarx++) {
|
||||
rxF = (int16_t *)&phy_vars_ue->lte_ue_common_vars.rxdataF[aarx][(l*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
|
||||
off = (phy_vars_ue->lte_frame_parms.first_carrier_offset+k)<<1;
|
||||
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
|
||||
rxF = (int16_t *)&ue->common_vars.rxdataF[aarx][(l*ue->frame_parms.ofdm_symbol_size)];
|
||||
off = (ue->frame_parms.first_carrier_offset+k)<<1;
|
||||
|
||||
if (l==(4-phy_vars_ue->lte_frame_parms.Ncp)) {
|
||||
for (rb=0; rb<phy_vars_ue->lte_frame_parms.N_RB_DL; rb++) {
|
||||
if (l==(4-ue->frame_parms.Ncp)) {
|
||||
for (rb=0; rb<ue->frame_parms.N_RB_DL; rb++) {
|
||||
|
||||
// printf("rb %d, off %d, off2 %d\n",rb,off,off2);
|
||||
|
||||
phy_vars_ue->PHY_measurements.rsrp[eNB_offset] += (((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1]));
|
||||
ue->measurements.rsrp[eNB_offset] += (((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1]));
|
||||
// printf("rb %d, off %d : %d\n",rb,off,((((int32_t)rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1])));
|
||||
// if ((phy_vars_ue->frame_rx&0x3ff) == 0)
|
||||
// if ((ue->frame_rx&0x3ff) == 0)
|
||||
// printf("rb %d, off %d : %d\n",rb,off,((rxF[off]*rxF[off])+(rxF[off+1]*rxF[off+1])));
|
||||
|
||||
|
||||
off+=12;
|
||||
|
||||
if (off>=(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<1))
|
||||
if (off>=(ue->frame_parms.ofdm_symbol_size<<1))
|
||||
off = (1+k)<<1;
|
||||
|
||||
phy_vars_ue->PHY_measurements.rsrp[eNB_offset] += (((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1]));
|
||||
ue->measurements.rsrp[eNB_offset] += (((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1]));
|
||||
// printf("rb %d, off %d : %d\n",rb,off,(((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1])));
|
||||
/*
|
||||
if ((phy_vars_ue->frame_rx&0x3ff) == 0)
|
||||
if ((ue->frame_rx&0x3ff) == 0)
|
||||
printf("rb %d, off %d : %d\n",rb,off,((rxF[off]*rxF[off])+(rxF[off+1]*rxF[off+1])));
|
||||
*/
|
||||
off+=12;
|
||||
|
||||
if (off>=(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<1))
|
||||
if (off>=(ue->frame_parms.ofdm_symbol_size<<1))
|
||||
off = (1+k)<<1;
|
||||
|
||||
}
|
||||
@@ -306,40 +306,40 @@ void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue,
|
||||
/*
|
||||
if ((eNB_offset==0)&&(l==0)) {
|
||||
for (i=0;i<6;i++,off2+=4)
|
||||
phy_vars_ue->PHY_measurements.rssi += ((rxF[off2]*rxF[off2])+(rxF[off2+1]*rxF[off2+1]));
|
||||
if (off2==(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<2))
|
||||
ue->measurements.rssi += ((rxF[off2]*rxF[off2])+(rxF[off2+1]*rxF[off2+1]));
|
||||
if (off2==(ue->frame_parms.ofdm_symbol_size<<2))
|
||||
off2=4;
|
||||
for (i=0;i<6;i++,off2+=4)
|
||||
phy_vars_ue->PHY_measurements.rssi += ((rxF[off2]*rxF[off2])+(rxF[off2+1]*rxF[off2+1]));
|
||||
ue->measurements.rssi += ((rxF[off2]*rxF[off2])+(rxF[off2+1]*rxF[off2+1]));
|
||||
}
|
||||
*/
|
||||
// printf("slot %d, rb %d => rsrp %d, rssi %d\n",slot,rb,phy_vars_ue->PHY_measurements.rsrp[eNB_offset],phy_vars_ue->PHY_measurements.rssi);
|
||||
// printf("slot %d, rb %d => rsrp %d, rssi %d\n",slot,rb,ue->measurements.rsrp[eNB_offset],ue->measurements.rssi);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 2 RE per PRB
|
||||
// phy_vars_ue->PHY_measurements.rsrp[eNB_offset]/=(24*phy_vars_ue->lte_frame_parms.N_RB_DL);
|
||||
phy_vars_ue->PHY_measurements.rsrp[eNB_offset]/=(2*phy_vars_ue->lte_frame_parms.N_RB_DL*phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
// LOG_I(PHY,"eNB: %d, RSRP: %d \n",eNB_offset,phy_vars_ue->PHY_measurements.rsrp[eNB_offset]);
|
||||
// ue->measurements.rsrp[eNB_offset]/=(24*ue->frame_parms.N_RB_DL);
|
||||
ue->measurements.rsrp[eNB_offset]/=(2*ue->frame_parms.N_RB_DL*ue->frame_parms.ofdm_symbol_size);
|
||||
// LOG_I(PHY,"eNB: %d, RSRP: %d \n",eNB_offset,ue->measurements.rsrp[eNB_offset]);
|
||||
if (eNB_offset == 0) {
|
||||
// phy_vars_ue->PHY_measurements.rssi/=(24*phy_vars_ue->lte_frame_parms.N_RB_DL);
|
||||
// phy_vars_ue->PHY_measurements.rssi*=rx_power_correction;
|
||||
// phy_vars_ue->PHY_measurements.rssi=phy_vars_ue->PHY_measurements.rsrp[0]*24/2;
|
||||
phy_vars_ue->PHY_measurements.rssi=phy_vars_ue->PHY_measurements.rsrp[0]*(12*phy_vars_ue->lte_frame_parms.N_RB_DL);
|
||||
// ue->measurements.rssi/=(24*ue->frame_parms.N_RB_DL);
|
||||
// ue->measurements.rssi*=rx_power_correction;
|
||||
// ue->measurements.rssi=ue->measurements.rsrp[0]*24/2;
|
||||
ue->measurements.rssi=ue->measurements.rsrp[0]*(12*ue->frame_parms.N_RB_DL);
|
||||
}
|
||||
|
||||
if (phy_vars_ue->PHY_measurements.rssi>0)
|
||||
phy_vars_ue->PHY_measurements.rsrq[eNB_offset] = 100*phy_vars_ue->PHY_measurements.rsrp[eNB_offset]*phy_vars_ue->lte_frame_parms.N_RB_DL/phy_vars_ue->PHY_measurements.rssi;
|
||||
if (ue->measurements.rssi>0)
|
||||
ue->measurements.rsrq[eNB_offset] = 100*ue->measurements.rsrp[eNB_offset]*ue->frame_parms.N_RB_DL/ue->measurements.rssi;
|
||||
else
|
||||
phy_vars_ue->PHY_measurements.rsrq[eNB_offset] = -12000;
|
||||
ue->measurements.rsrq[eNB_offset] = -12000;
|
||||
|
||||
//((200*phy_vars_ue->PHY_measurements.rsrq[eNB_offset]) + ((1024-200)*100*phy_vars_ue->PHY_measurements.rsrp[eNB_offset]*phy_vars_ue->lte_frame_parms.N_RB_DL/phy_vars_ue->PHY_measurements.rssi))>>10;
|
||||
//((200*ue->measurements.rsrq[eNB_offset]) + ((1024-200)*100*ue->measurements.rsrp[eNB_offset]*ue->frame_parms.N_RB_DL/ue->measurements.rssi))>>10;
|
||||
} else { // Do abstraction of RSRP and RSRQ
|
||||
phy_vars_ue->PHY_measurements.rssi = phy_vars_ue->PHY_measurements.rx_power_avg[0];
|
||||
ue->measurements.rssi = ue->measurements.rx_power_avg[0];
|
||||
// dummay value for the moment
|
||||
phy_vars_ue->PHY_measurements.rsrp[eNB_offset] = -93 ;
|
||||
phy_vars_ue->PHY_measurements.rsrq[eNB_offset] = 3;
|
||||
ue->measurements.rsrp[eNB_offset] = -93 ;
|
||||
ue->measurements.rsrq[eNB_offset] = 3;
|
||||
|
||||
}
|
||||
|
||||
@@ -348,24 +348,24 @@ void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue,
|
||||
// if (slot == 0) {
|
||||
|
||||
if (eNB_offset == 0)
|
||||
LOG_I(PHY,"[UE %d] Frame %d, slot %d RRC Measurements => rssi %3.1f dBm (digital: %3.1f dB, gain %d), N0 %d dBm\n",phy_vars_ue->Mod_id,
|
||||
phy_vars_ue->frame_rx,slot,10*log10(phy_vars_ue->PHY_measurements.rssi)-phy_vars_ue->rx_total_gain_dB,
|
||||
10*log10(phy_vars_ue->PHY_measurements.rssi),
|
||||
phy_vars_ue->rx_total_gain_dB,
|
||||
phy_vars_ue->PHY_measurements.n0_power_tot_dBm);
|
||||
LOG_I(PHY,"[UE %d] Frame %d, subframe %d RRC Measurements => rssi %3.1f dBm (digital: %3.1f dB, gain %d), N0 %d dBm\n",ue->Mod_id,
|
||||
ue->proc.proc_rxtx[subframe&1].frame_rx,subframe,10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB,
|
||||
10*log10(ue->measurements.rssi),
|
||||
ue->rx_total_gain_dB,
|
||||
ue->measurements.n0_power_tot_dBm);
|
||||
|
||||
LOG_I(PHY,"[UE %d] Frame %d, slot %d RRC Measurements (idx %d, Cell id %d) => rsrp: %3.1f dBm/RE (%d), rsrq: %3.1f dB\n",
|
||||
phy_vars_ue->Mod_id,
|
||||
phy_vars_ue->frame_rx,slot,eNB_offset,
|
||||
(eNB_offset>0) ? phy_vars_ue->PHY_measurements.adj_cell_id[eNB_offset-1] : phy_vars_ue->lte_frame_parms.Nid_cell,
|
||||
10*log10(phy_vars_ue->PHY_measurements.rsrp[eNB_offset])-phy_vars_ue->rx_total_gain_dB,
|
||||
phy_vars_ue->PHY_measurements.rsrp[eNB_offset],
|
||||
(10*log10(phy_vars_ue->PHY_measurements.rsrq[eNB_offset])));
|
||||
//LOG_D(PHY,"RSRP_total_dB: %3.2f \n",(dB_fixed_times10(phy_vars_ue->PHY_measurements.rsrp[eNB_offset])/10.0)-phy_vars_ue->rx_total_gain_dB-dB_fixed(phy_vars_ue->lte_frame_parms.N_RB_DL*12));
|
||||
LOG_I(PHY,"[UE %d] Frame %d, subframe %d RRC Measurements (idx %d, Cell id %d) => rsrp: %3.1f dBm/RE (%d), rsrq: %3.1f dB\n",
|
||||
ue->Mod_id,
|
||||
ue->proc.proc_rxtx[subframe&1].frame_rx,subframe,eNB_offset,
|
||||
(eNB_offset>0) ? ue->measurements.adj_cell_id[eNB_offset-1] : ue->frame_parms.Nid_cell,
|
||||
10*log10(ue->measurements.rsrp[eNB_offset])-ue->rx_total_gain_dB,
|
||||
ue->measurements.rsrp[eNB_offset],
|
||||
(10*log10(ue->measurements.rsrq[eNB_offset])));
|
||||
//LOG_D(PHY,"RSRP_total_dB: %3.2f \n",(dB_fixed_times10(ue->measurements.rsrp[eNB_offset])/10.0)-ue->rx_total_gain_dB-dB_fixed(ue->frame_parms.N_RB_DL*12));
|
||||
|
||||
//LOG_D(PHY,"RSRP_dB: %3.2f \n",(dB_fixed_times10(phy_vars_ue->PHY_measurements.rsrp[eNB_offset])/10.0));
|
||||
//LOG_D(PHY,"gain_loss_dB: %d \n",phy_vars_ue->rx_total_gain_dB);
|
||||
//LOG_D(PHY,"gain_fixed_dB: %d \n",dB_fixed(phy_vars_ue->lte_frame_parms.N_RB_DL*12));
|
||||
//LOG_D(PHY,"RSRP_dB: %3.2f \n",(dB_fixed_times10(ue->measurements.rsrp[eNB_offset])/10.0));
|
||||
//LOG_D(PHY,"gain_loss_dB: %d \n",ue->rx_total_gain_dB);
|
||||
//LOG_D(PHY,"gain_fixed_dB: %d \n",dB_fixed(ue->frame_parms.N_RB_DL*12));
|
||||
|
||||
// }
|
||||
|
||||
@@ -374,7 +374,7 @@ void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue,
|
||||
|
||||
}
|
||||
|
||||
void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue,
|
||||
void lte_ue_measurements(PHY_VARS_UE *ue,
|
||||
unsigned int subframe_offset,
|
||||
unsigned char N0_symbol,
|
||||
unsigned char abstraction_flag)
|
||||
@@ -391,7 +391,7 @@ void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue,
|
||||
int16x8_t *dl_ch0_128, *dl_ch1_128;
|
||||
#endif
|
||||
int *dl_ch0,*dl_ch1;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
||||
int nb_subbands,subband_size,last_subband_size;
|
||||
int N_RB_DL = frame_parms->N_RB_DL;
|
||||
|
||||
@@ -423,121 +423,121 @@ void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue,
|
||||
}
|
||||
|
||||
// signal measurements
|
||||
for (eNB_id=0; eNB_id<phy_vars_ue->n_connected_eNB; eNB_id++) {
|
||||
for (eNB_id=0; eNB_id<ue->n_connected_eNB; eNB_id++) {
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
for (aatx=0; aatx<frame_parms->nb_antennas_tx_eNB; aatx++) {
|
||||
phy_vars_ue->PHY_measurements.rx_spatial_power[eNB_id][aatx][aarx] =
|
||||
(signal_energy_nodc(&phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][(aatx<<1) + aarx][0],
|
||||
ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] =
|
||||
(signal_energy_nodc(&ue->common_vars.dl_ch_estimates[eNB_id][(aatx<<1) + aarx][0],
|
||||
(N_RB_DL*12)));
|
||||
//- phy_vars_ue->PHY_measurements.n0_power[aarx];
|
||||
//- ue->measurements.n0_power[aarx];
|
||||
|
||||
if (phy_vars_ue->PHY_measurements.rx_spatial_power[eNB_id][aatx][aarx]<0)
|
||||
phy_vars_ue->PHY_measurements.rx_spatial_power[eNB_id][aatx][aarx] = 0; //phy_vars_ue->PHY_measurements.n0_power[aarx];
|
||||
if (ue->measurements.rx_spatial_power[eNB_id][aatx][aarx]<0)
|
||||
ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] = 0; //ue->measurements.n0_power[aarx];
|
||||
|
||||
phy_vars_ue->PHY_measurements.rx_spatial_power_dB[eNB_id][aatx][aarx] = (unsigned short) dB_fixed(phy_vars_ue->PHY_measurements.rx_spatial_power[eNB_id][aatx][aarx]);
|
||||
ue->measurements.rx_spatial_power_dB[eNB_id][aatx][aarx] = (unsigned short) dB_fixed(ue->measurements.rx_spatial_power[eNB_id][aatx][aarx]);
|
||||
|
||||
if (aatx==0)
|
||||
phy_vars_ue->PHY_measurements.rx_power[eNB_id][aarx] = phy_vars_ue->PHY_measurements.rx_spatial_power[eNB_id][aatx][aarx];
|
||||
ue->measurements.rx_power[eNB_id][aarx] = ue->measurements.rx_spatial_power[eNB_id][aatx][aarx];
|
||||
else
|
||||
phy_vars_ue->PHY_measurements.rx_power[eNB_id][aarx] += phy_vars_ue->PHY_measurements.rx_spatial_power[eNB_id][aatx][aarx];
|
||||
ue->measurements.rx_power[eNB_id][aarx] += ue->measurements.rx_spatial_power[eNB_id][aatx][aarx];
|
||||
} //aatx
|
||||
|
||||
phy_vars_ue->PHY_measurements.rx_power_dB[eNB_id][aarx] = (unsigned short) dB_fixed(phy_vars_ue->PHY_measurements.rx_power[eNB_id][aarx]);
|
||||
ue->measurements.rx_power_dB[eNB_id][aarx] = (unsigned short) dB_fixed(ue->measurements.rx_power[eNB_id][aarx]);
|
||||
|
||||
if (aarx==0)
|
||||
phy_vars_ue->PHY_measurements.rx_power_tot[eNB_id] = phy_vars_ue->PHY_measurements.rx_power[eNB_id][aarx];
|
||||
ue->measurements.rx_power_tot[eNB_id] = ue->measurements.rx_power[eNB_id][aarx];
|
||||
else
|
||||
phy_vars_ue->PHY_measurements.rx_power_tot[eNB_id] += phy_vars_ue->PHY_measurements.rx_power[eNB_id][aarx];
|
||||
ue->measurements.rx_power_tot[eNB_id] += ue->measurements.rx_power[eNB_id][aarx];
|
||||
} //aarx
|
||||
|
||||
phy_vars_ue->PHY_measurements.rx_power_tot_dB[eNB_id] = (unsigned short) dB_fixed(phy_vars_ue->PHY_measurements.rx_power_tot[eNB_id]);
|
||||
ue->measurements.rx_power_tot_dB[eNB_id] = (unsigned short) dB_fixed(ue->measurements.rx_power_tot[eNB_id]);
|
||||
|
||||
} //eNB_id
|
||||
|
||||
// filter to remove jitter
|
||||
if (phy_vars_ue->init_averaging == 0) {
|
||||
for (eNB_id = 0; eNB_id < phy_vars_ue->n_connected_eNB; eNB_id++)
|
||||
phy_vars_ue->PHY_measurements.rx_power_avg[eNB_id] = (int)
|
||||
(((k1*((long long int)(phy_vars_ue->PHY_measurements.rx_power_avg[eNB_id]))) +
|
||||
(k2*((long long int)(phy_vars_ue->PHY_measurements.rx_power_tot[eNB_id]))))>>10);
|
||||
if (ue->init_averaging == 0) {
|
||||
for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++)
|
||||
ue->measurements.rx_power_avg[eNB_id] = (int)
|
||||
(((k1*((long long int)(ue->measurements.rx_power_avg[eNB_id]))) +
|
||||
(k2*((long long int)(ue->measurements.rx_power_tot[eNB_id]))))>>10);
|
||||
|
||||
phy_vars_ue->PHY_measurements.n0_power_avg = (int)
|
||||
(((k1*((long long int) (phy_vars_ue->PHY_measurements.n0_power_avg))) +
|
||||
(k2*((long long int) (phy_vars_ue->PHY_measurements.n0_power_tot))))>>10);
|
||||
ue->measurements.n0_power_avg = (int)
|
||||
(((k1*((long long int) (ue->measurements.n0_power_avg))) +
|
||||
(k2*((long long int) (ue->measurements.n0_power_tot))))>>10);
|
||||
} else {
|
||||
for (eNB_id = 0; eNB_id < phy_vars_ue->n_connected_eNB; eNB_id++)
|
||||
phy_vars_ue->PHY_measurements.rx_power_avg[eNB_id] = phy_vars_ue->PHY_measurements.rx_power_tot[eNB_id];
|
||||
for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++)
|
||||
ue->measurements.rx_power_avg[eNB_id] = ue->measurements.rx_power_tot[eNB_id];
|
||||
|
||||
phy_vars_ue->PHY_measurements.n0_power_avg = phy_vars_ue->PHY_measurements.n0_power_tot;
|
||||
phy_vars_ue->init_averaging = 0;
|
||||
ue->measurements.n0_power_avg = ue->measurements.n0_power_tot;
|
||||
ue->init_averaging = 0;
|
||||
}
|
||||
|
||||
for (eNB_id = 0; eNB_id < phy_vars_ue->n_connected_eNB; eNB_id++) {
|
||||
phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id] = dB_fixed( phy_vars_ue->PHY_measurements.rx_power_avg[eNB_id]);
|
||||
phy_vars_ue->PHY_measurements.wideband_cqi_tot[eNB_id] = dB_fixed2(phy_vars_ue->PHY_measurements.rx_power_tot[eNB_id],phy_vars_ue->PHY_measurements.n0_power_tot);
|
||||
phy_vars_ue->PHY_measurements.wideband_cqi_avg[eNB_id] = dB_fixed2(phy_vars_ue->PHY_measurements.rx_power_avg[eNB_id],phy_vars_ue->PHY_measurements.n0_power_avg);
|
||||
phy_vars_ue->PHY_measurements.rx_rssi_dBm[eNB_id] = phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id] - phy_vars_ue->rx_total_gain_dB;
|
||||
for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++) {
|
||||
ue->measurements.rx_power_avg_dB[eNB_id] = dB_fixed( ue->measurements.rx_power_avg[eNB_id]);
|
||||
ue->measurements.wideband_cqi_tot[eNB_id] = dB_fixed2(ue->measurements.rx_power_tot[eNB_id],ue->measurements.n0_power_tot);
|
||||
ue->measurements.wideband_cqi_avg[eNB_id] = dB_fixed2(ue->measurements.rx_power_avg[eNB_id],ue->measurements.n0_power_avg);
|
||||
ue->measurements.rx_rssi_dBm[eNB_id] = ue->measurements.rx_power_avg_dB[eNB_id] - ue->rx_total_gain_dB;
|
||||
#ifdef DEBUG_MEAS
|
||||
LOG_I(PHY,"[eNB %d] lte_ue_measurements: RSSI %d dBm, RSSI (digital) %d dB\n",
|
||||
eNB_id,phy_vars_ue->PHY_measurements.rx_rssi_dBm[eNB_id],
|
||||
phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id]);
|
||||
eNB_id,ue->measurements.rx_rssi_dBm[eNB_id],
|
||||
ue->measurements.rx_power_avg_dB[eNB_id]);
|
||||
#endif
|
||||
}
|
||||
|
||||
phy_vars_ue->PHY_measurements.n0_power_avg_dB = dB_fixed( phy_vars_ue->PHY_measurements.n0_power_avg);
|
||||
ue->measurements.n0_power_avg_dB = dB_fixed( ue->measurements.n0_power_avg);
|
||||
|
||||
for (eNB_id = 0; eNB_id < phy_vars_ue->n_connected_eNB; eNB_id++) {
|
||||
for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++) {
|
||||
if (frame_parms->mode1_flag==0) {
|
||||
// cqi/pmi information
|
||||
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
dl_ch0 = &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][aarx][4];
|
||||
dl_ch1 = &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][2+aarx][4];
|
||||
dl_ch0 = &ue->common_vars.dl_ch_estimates[eNB_id][aarx][4];
|
||||
dl_ch1 = &ue->common_vars.dl_ch_estimates[eNB_id][2+aarx][4];
|
||||
|
||||
for (subband=0; subband<nb_subbands; subband++) {
|
||||
|
||||
// cqi
|
||||
if (aarx==0)
|
||||
phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband]=0;
|
||||
ue->measurements.subband_cqi_tot[eNB_id][subband]=0;
|
||||
|
||||
if ((subband<(nb_subbands-1))||(N_RB_DL==6)) {
|
||||
/*for (i=0;i<48;i++)
|
||||
msg("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]);
|
||||
*/
|
||||
phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband] =
|
||||
ue->measurements.subband_cqi[eNB_id][aarx][subband] =
|
||||
(signal_energy_nodc(dl_ch0,subband_size) + signal_energy_nodc(dl_ch1,subband_size));
|
||||
|
||||
if ( phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband] < 0)
|
||||
phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband]=0;
|
||||
if ( ue->measurements.subband_cqi[eNB_id][aarx][subband] < 0)
|
||||
ue->measurements.subband_cqi[eNB_id][aarx][subband]=0;
|
||||
|
||||
/*
|
||||
else
|
||||
phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband]-=phy_vars_ue->PHY_measurements.n0_power[aarx];
|
||||
ue->measurements.subband_cqi[eNB_id][aarx][subband]-=ue->measurements.n0_power[aarx];
|
||||
*/
|
||||
|
||||
phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband] += phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband];
|
||||
phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband],
|
||||
phy_vars_ue->PHY_measurements.n0_power[aarx]);
|
||||
ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband];
|
||||
ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband],
|
||||
ue->measurements.n0_power[aarx]);
|
||||
} else { // this is for the last subband which is smaller in size
|
||||
// for (i=0;i<12;i++)
|
||||
// printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]);
|
||||
phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,last_subband_size) +
|
||||
signal_energy_nodc(dl_ch1,last_subband_size)); // - phy_vars_ue->PHY_measurements.n0_power[aarx];
|
||||
phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband] += phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband];
|
||||
phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband],
|
||||
phy_vars_ue->PHY_measurements.n0_power[aarx]);
|
||||
ue->measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,last_subband_size) +
|
||||
signal_energy_nodc(dl_ch1,last_subband_size)); // - ue->measurements.n0_power[aarx];
|
||||
ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband];
|
||||
ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband],
|
||||
ue->measurements.n0_power[aarx]);
|
||||
}
|
||||
|
||||
dl_ch1+=subband_size;
|
||||
dl_ch0+=subband_size;
|
||||
// msg("subband_cqi[%d][%d][%d] => %d (%d dB)\n",eNB_id,aarx,subband,phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband],phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][aarx][subband]);
|
||||
// msg("subband_cqi[%d][%d][%d] => %d (%d dB)\n",eNB_id,aarx,subband,ue->measurements.subband_cqi[eNB_id][aarx][subband],ue->measurements.subband_cqi_dB[eNB_id][aarx][subband]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
for (subband=0; subband<nb_subbands; subband++) {
|
||||
phy_vars_ue->PHY_measurements.subband_cqi_tot_dB[eNB_id][subband] = dB_fixed2(phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband],phy_vars_ue->PHY_measurements.n0_power_tot);
|
||||
// msg("subband_cqi_tot[%d][%d] => %d dB (n0 %d)\n",eNB_id,subband,phy_vars_ue->PHY_measurements.subband_cqi_tot_dB[eNB_id][subband],phy_vars_ue->PHY_measurements.n0_power_tot);
|
||||
ue->measurements.subband_cqi_tot_dB[eNB_id][subband] = dB_fixed2(ue->measurements.subband_cqi_tot[eNB_id][subband],ue->measurements.n0_power_tot);
|
||||
// msg("subband_cqi_tot[%d][%d] => %d dB (n0 %d)\n",eNB_id,subband,ue->measurements.subband_cqi_tot_dB[eNB_id][subband],ue->measurements.n0_power_tot);
|
||||
}
|
||||
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
@@ -546,13 +546,13 @@ void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue,
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
__m128i pmi128_re,pmi128_im,mmtmpPMI0,mmtmpPMI1 /* ,mmtmpPMI2,mmtmpPMI3 */ ;
|
||||
|
||||
dl_ch0_128 = (__m128i *)&phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][aarx][4];
|
||||
dl_ch1_128 = (__m128i *)&phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][2+aarx][4];
|
||||
dl_ch0_128 = (__m128i *)&ue->common_vars.dl_ch_estimates[eNB_id][aarx][4];
|
||||
dl_ch1_128 = (__m128i *)&ue->common_vars.dl_ch_estimates[eNB_id][2+aarx][4];
|
||||
#elif defined(__arm__)
|
||||
int32x4_t pmi128_re,pmi128_im,mmtmpPMI0,mmtmpPMI1,mmtmpPMI0b,mmtmpPMI1b;
|
||||
|
||||
dl_ch0_128 = (int16x8_t *)&phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][aarx][4];
|
||||
dl_ch1_128 = (int16x8_t *)&phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][2+aarx][4];
|
||||
dl_ch0_128 = (int16x8_t *)&ue->common_vars.dl_ch_estimates[eNB_id][aarx][4];
|
||||
dl_ch1_128 = (int16x8_t *)&ue->common_vars.dl_ch_estimates[eNB_id][2+aarx][4];
|
||||
|
||||
#endif
|
||||
for (subband=0; subband<nb_subbands; subband++) {
|
||||
@@ -600,68 +600,68 @@ void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue,
|
||||
dl_ch1_128++;
|
||||
}
|
||||
|
||||
phy_vars_ue->PHY_measurements.subband_pmi_re[eNB_id][subband][aarx] = (((int *)&pmi128_re)[0] + ((int *)&pmi128_re)[1] + ((int *)&pmi128_re)[2] + ((int *)&pmi128_re)[3])>>2;
|
||||
phy_vars_ue->PHY_measurements.subband_pmi_im[eNB_id][subband][aarx] = (((int *)&pmi128_im)[0] + ((int *)&pmi128_im)[1] + ((int *)&pmi128_im)[2] + ((int *)&pmi128_im)[3])>>2;
|
||||
phy_vars_ue->PHY_measurements.wideband_pmi_re[eNB_id][aarx] += phy_vars_ue->PHY_measurements.subband_pmi_re[eNB_id][subband][aarx];
|
||||
phy_vars_ue->PHY_measurements.wideband_pmi_im[eNB_id][aarx] += phy_vars_ue->PHY_measurements.subband_pmi_im[eNB_id][subband][aarx];
|
||||
ue->measurements.subband_pmi_re[eNB_id][subband][aarx] = (((int *)&pmi128_re)[0] + ((int *)&pmi128_re)[1] + ((int *)&pmi128_re)[2] + ((int *)&pmi128_re)[3])>>2;
|
||||
ue->measurements.subband_pmi_im[eNB_id][subband][aarx] = (((int *)&pmi128_im)[0] + ((int *)&pmi128_im)[1] + ((int *)&pmi128_im)[2] + ((int *)&pmi128_im)[3])>>2;
|
||||
ue->measurements.wideband_pmi_re[eNB_id][aarx] += ue->measurements.subband_pmi_re[eNB_id][subband][aarx];
|
||||
ue->measurements.wideband_pmi_im[eNB_id][aarx] += ue->measurements.subband_pmi_im[eNB_id][subband][aarx];
|
||||
} // subband loop
|
||||
} // rx antenna loop
|
||||
} // if frame_parms->mode1_flag == 0
|
||||
else {
|
||||
// cqi information only for mode 1
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
dl_ch0 = &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][aarx][4];
|
||||
dl_ch0 = &ue->common_vars.dl_ch_estimates[eNB_id][aarx][4];
|
||||
|
||||
for (subband=0; subband<7; subband++) {
|
||||
|
||||
// cqi
|
||||
if (aarx==0)
|
||||
phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband]=0;
|
||||
ue->measurements.subband_cqi_tot[eNB_id][subband]=0;
|
||||
|
||||
if (subband<6) {
|
||||
// for (i=0;i<48;i++)
|
||||
// printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]);
|
||||
phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband] =
|
||||
(signal_energy_nodc(dl_ch0,48) ) - phy_vars_ue->PHY_measurements.n0_power[aarx];
|
||||
ue->measurements.subband_cqi[eNB_id][aarx][subband] =
|
||||
(signal_energy_nodc(dl_ch0,48) ) - ue->measurements.n0_power[aarx];
|
||||
|
||||
phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband] += phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband];
|
||||
phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband],
|
||||
phy_vars_ue->PHY_measurements.n0_power[aarx]);
|
||||
ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband];
|
||||
ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband],
|
||||
ue->measurements.n0_power[aarx]);
|
||||
} else {
|
||||
// for (i=0;i<12;i++)
|
||||
// printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]);
|
||||
phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,12) ) - phy_vars_ue->PHY_measurements.n0_power[aarx];
|
||||
phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband] += phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband];
|
||||
phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband],
|
||||
phy_vars_ue->PHY_measurements.n0_power[aarx]);
|
||||
ue->measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,12) ) - ue->measurements.n0_power[aarx];
|
||||
ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband];
|
||||
ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband],
|
||||
ue->measurements.n0_power[aarx]);
|
||||
}
|
||||
|
||||
dl_ch1+=48;
|
||||
// msg("subband_cqi[%d][%d][%d] => %d (%d dB)\n",eNB_id,aarx,subband,phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband],phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][aarx][subband]);
|
||||
// msg("subband_cqi[%d][%d][%d] => %d (%d dB)\n",eNB_id,aarx,subband,ue->measurements.subband_cqi[eNB_id][aarx][subband],ue->measurements.subband_cqi_dB[eNB_id][aarx][subband]);
|
||||
}
|
||||
}
|
||||
|
||||
for (subband=0; subband<nb_subbands; subband++) {
|
||||
phy_vars_ue->PHY_measurements.subband_cqi_tot_dB[eNB_id][subband] = dB_fixed2(phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband],phy_vars_ue->PHY_measurements.n0_power_tot);
|
||||
ue->measurements.subband_cqi_tot_dB[eNB_id][subband] = dB_fixed2(ue->measurements.subband_cqi_tot[eNB_id][subband],ue->measurements.n0_power_tot);
|
||||
}
|
||||
}
|
||||
|
||||
phy_vars_ue->PHY_measurements.rank[eNB_id] = 0;
|
||||
ue->measurements.rank[eNB_id] = 0;
|
||||
|
||||
for (i=0; i<nb_subbands; i++) {
|
||||
phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB_id][i] = 0;
|
||||
ue->measurements.selected_rx_antennas[eNB_id][i] = 0;
|
||||
|
||||
if (frame_parms->nb_antennas_rx>1) {
|
||||
if (phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][0][i] >= phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][1][i])
|
||||
phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB_id][i] = 0;
|
||||
if (ue->measurements.subband_cqi_dB[eNB_id][0][i] >= ue->measurements.subband_cqi_dB[eNB_id][1][i])
|
||||
ue->measurements.selected_rx_antennas[eNB_id][i] = 0;
|
||||
else
|
||||
phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB_id][i] = 1;
|
||||
ue->measurements.selected_rx_antennas[eNB_id][i] = 1;
|
||||
} else
|
||||
phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB_id][i] = 0;
|
||||
ue->measurements.selected_rx_antennas[eNB_id][i] = 0;
|
||||
}
|
||||
|
||||
// if(eNB_id==0)
|
||||
// printf("in lte_ue_measurements: selected rx_antenna[eNB_id==0]:%u\n", phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB_id][i]);
|
||||
// printf("in lte_ue_measurements: selected rx_antenna[eNB_id==0]:%u\n", ue->measurements.selected_rx_antennas[eNB_id][i]);
|
||||
} // eNB_id loop
|
||||
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
@@ -671,9 +671,9 @@ void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue,
|
||||
}
|
||||
|
||||
|
||||
void lte_ue_measurements_emul(PHY_VARS_UE *phy_vars_ue,uint8_t last_slot,uint8_t eNB_id)
|
||||
void lte_ue_measurements_emul(PHY_VARS_UE *ue,uint8_t subframe,uint8_t eNB_id)
|
||||
{
|
||||
|
||||
msg("[PHY] EMUL UE lte_ue_measurements_emul last slot %d, eNB_id %d\n",last_slot,eNB_id);
|
||||
msg("[PHY] EMUL UE lte_ue_measurements_emul subframe %d, eNB_id %d\n",subframe,eNB_id);
|
||||
}
|
||||
|
||||
|
||||
@@ -25,29 +25,29 @@ static int16_t ru_90c[2*128] = {32767, 0,32766, -402,32758, -804,32746, -1206,32
|
||||
|
||||
#define SCALE 0x3FFF
|
||||
|
||||
int32_t lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB,
|
||||
int32_t lte_ul_channel_estimation(PHY_VARS_eNB *eNB,
|
||||
eNB_rxtx_proc_t *proc,
|
||||
uint8_t eNB_id,
|
||||
uint8_t UE_id,
|
||||
uint8_t sched_subframe,
|
||||
unsigned char l,
|
||||
unsigned char Ns,
|
||||
uint8_t cooperation_flag)
|
||||
{
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms;
|
||||
LTE_eNB_PUSCH *eNB_pusch_vars = phy_vars_eNB->lte_eNB_pusch_vars[UE_id];
|
||||
int32_t **ul_ch_estimates=eNB_pusch_vars->drs_ch_estimates[eNB_id];
|
||||
int32_t **ul_ch_estimates_time= eNB_pusch_vars->drs_ch_estimates_time[eNB_id];
|
||||
int32_t **ul_ch_estimates_0= eNB_pusch_vars->drs_ch_estimates_0[eNB_id];
|
||||
int32_t **ul_ch_estimates_1= eNB_pusch_vars->drs_ch_estimates_1[eNB_id];
|
||||
int32_t **rxdataF_ext= eNB_pusch_vars->rxdataF_ext[eNB_id];
|
||||
int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
|
||||
uint8_t harq_pid = subframe2harq_pid(frame_parms,phy_vars_eNB->proc[sched_subframe].frame_rx,subframe);
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
|
||||
LTE_eNB_PUSCH *pusch_vars = eNB->pusch_vars[UE_id];
|
||||
int32_t **ul_ch_estimates=pusch_vars->drs_ch_estimates[eNB_id];
|
||||
int32_t **ul_ch_estimates_time= pusch_vars->drs_ch_estimates_time[eNB_id];
|
||||
int32_t **ul_ch_estimates_0= pusch_vars->drs_ch_estimates_0[eNB_id];
|
||||
int32_t **ul_ch_estimates_1= pusch_vars->drs_ch_estimates_1[eNB_id];
|
||||
int32_t **rxdataF_ext= pusch_vars->rxdataF_ext[eNB_id];
|
||||
int subframe = proc->subframe_rx;
|
||||
uint8_t harq_pid = subframe2harq_pid(frame_parms,proc->frame_rx,subframe);
|
||||
int16_t delta_phase = 0;
|
||||
int16_t *ru1 = ru_90;
|
||||
int16_t *ru2 = ru_90;
|
||||
int16_t current_phase1,current_phase2;
|
||||
uint16_t N_rb_alloc = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb;
|
||||
uint16_t N_rb_alloc = eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb;
|
||||
uint16_t aa,Msc_RS,Msc_RS_idx;
|
||||
uint16_t * Msc_idx_ptr;
|
||||
int k,pilot_pos1 = 3 - frame_parms->Ncp, pilot_pos2 = 10 - 2*frame_parms->Ncp;
|
||||
@@ -89,7 +89,7 @@ int32_t lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB,
|
||||
Msc_RS = N_rb_alloc*12;
|
||||
|
||||
cyclic_shift = (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift +
|
||||
phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->n_DMRS2 +
|
||||
eNB->ulsch[UE_id]->harq_processes[harq_pid]->n_DMRS2 +
|
||||
frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[(subframe<<1)+Ns]) % 12;
|
||||
|
||||
#if defined(USER_MODE)
|
||||
@@ -307,7 +307,7 @@ int32_t lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB,
|
||||
#if T_TRACER
|
||||
if (aa == 0)
|
||||
T(T_ENB_PHY_UL_CHANNEL_ESTIMATE, T_INT(eNB_id), T_INT(UE_id),
|
||||
T_INT(phy_vars_eNB->proc[sched_subframe].frame_rx), T_INT(subframe),
|
||||
T_INT(proc->frame_rx), T_INT(subframe),
|
||||
T_INT(0), T_BUFFER(ul_ch_estimates_time[0], 512 * 4));
|
||||
#endif
|
||||
|
||||
@@ -649,11 +649,11 @@ extern uint16_t transmission_offset_tdd[16];
|
||||
#define DEBUG_SRS
|
||||
|
||||
int32_t lte_srs_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
LTE_eNB_COMMON *eNb_common_vars,
|
||||
LTE_eNB_SRS *eNb_srs_vars,
|
||||
LTE_eNB_COMMON *common_vars,
|
||||
LTE_eNB_SRS *srs_vars,
|
||||
SOUNDINGRS_UL_CONFIG_DEDICATED *soundingrs_ul_config_dedicated,
|
||||
unsigned char sub_frame_number,
|
||||
unsigned char eNb_id)
|
||||
unsigned char eNB_id)
|
||||
{
|
||||
|
||||
int T_SFC,aa;
|
||||
@@ -670,7 +670,7 @@ int32_t lte_srs_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
T_SFC = (Ssrs<=7 ? 5 : 10);
|
||||
|
||||
/*
|
||||
msg("SRS channel estimation eNb %d, subframs %d, %d %d %d %d %d\n",eNb_id,sub_frame_number,
|
||||
msg("SRS channel estimation eNB %d, subframs %d, %d %d %d %d %d\n",eNB_id,sub_frame_number,
|
||||
SRS_parms->Csrs,
|
||||
SRS_parms->Bsrs,
|
||||
SRS_parms->kTC,
|
||||
@@ -682,34 +682,34 @@ int32_t lte_srs_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
|
||||
if (generate_srs_rx(frame_parms,
|
||||
soundingrs_ul_config_dedicated,
|
||||
eNb_srs_vars->srs)==-1) {
|
||||
srs_vars->srs)==-1) {
|
||||
msg("lte_srs_channel_estimation: Error in generate_srs_rx\n");
|
||||
return(-1);
|
||||
}
|
||||
|
||||
for (aa=0; aa<nb_antennas_rx; aa++) {
|
||||
#ifdef DEBUG_SRS
|
||||
msg("SRS channel estimation eNb %d, subframs %d, aarx %d, %p, %p, %p\n",eNb_id,sub_frame_number,aa,
|
||||
&eNb_common_vars->rxdataF[eNb_id][aa][2*frame_parms->ofdm_symbol_size*symbol],
|
||||
eNb_srs_vars->srs,
|
||||
eNb_srs_vars->srs_ch_estimates[eNb_id][aa]);
|
||||
msg("SRS channel estimation eNB %d, subframs %d, aarx %d, %p, %p, %p\n",eNB_id,sub_frame_number,aa,
|
||||
&common_vars->rxdataF[eNB_id][aa][2*frame_parms->ofdm_symbol_size*symbol],
|
||||
srs_vars->srs,
|
||||
srs_vars->srs_ch_estimates[eNB_id][aa]);
|
||||
#endif
|
||||
|
||||
//write_output("eNb_rxF.m","rxF",&eNb_common_vars->rxdataF[0][aa][2*frame_parms->ofdm_symbol_size*symbol],2*(frame_parms->ofdm_symbol_size),2,1);
|
||||
//write_output("eNb_srs.m","srs_eNb",eNb_common_vars->srs,(frame_parms->ofdm_symbol_size),1,1);
|
||||
//write_output("eNB_rxF.m","rxF",&common_vars->rxdataF[0][aa][2*frame_parms->ofdm_symbol_size*symbol],2*(frame_parms->ofdm_symbol_size),2,1);
|
||||
//write_output("eNB_srs.m","srs_eNB",common_vars->srs,(frame_parms->ofdm_symbol_size),1,1);
|
||||
|
||||
mult_cpx_conj_vector((int16_t*) &eNb_common_vars->rxdataF[eNb_id][aa][2*frame_parms->ofdm_symbol_size*symbol],
|
||||
(int16_t*) eNb_srs_vars->srs,
|
||||
(int16_t*) eNb_srs_vars->srs_ch_estimates[eNb_id][aa],
|
||||
mult_cpx_conj_vector((int16_t*) &common_vars->rxdataF[eNB_id][aa][2*frame_parms->ofdm_symbol_size*symbol],
|
||||
(int16_t*) srs_vars->srs,
|
||||
(int16_t*) srs_vars->srs_ch_estimates[eNB_id][aa],
|
||||
frame_parms->ofdm_symbol_size,
|
||||
15);
|
||||
|
||||
//msg("SRS channel estimation cmult out\n");
|
||||
#ifdef USER_MODE
|
||||
#ifdef DEBUG_SRS
|
||||
sprintf(fname,"eNB_id%d_an%d_srs_ch_est.m",eNb_id,aa);
|
||||
sprintf(vname,"eNB%d_%d_srs_ch_est",eNb_id,aa);
|
||||
write_output(fname,vname,eNb_srs_vars->srs_ch_estimates[eNb_id][aa],frame_parms->ofdm_symbol_size,1,1);
|
||||
sprintf(fname,"eNB_id%d_an%d_srs_ch_est.m",eNB_id,aa);
|
||||
sprintf(vname,"eNB%d_%d_srs_ch_est",eNB_id,aa);
|
||||
write_output(fname,vname,srs_vars->srs_ch_estimates[eNB_id][aa],frame_parms->ofdm_symbol_size,1,1);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
@@ -718,7 +718,7 @@ int32_t lte_srs_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
/*
|
||||
else {
|
||||
for (aa=0;aa<nb_antennas_rx;aa++)
|
||||
bzero(eNb_srs_vars->srs_ch_estimates[eNb_id][aa],frame_parms->ofdm_symbol_size*sizeof(int));
|
||||
bzero(srs_vars->srs_ch_estimates[eNB_id][aa],frame_parms->ofdm_symbol_size*sizeof(int));
|
||||
}
|
||||
*/
|
||||
return(0);
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
|
||||
//Calibration
|
||||
int lte_dl_cell_spec_SS(PHY_VARS_eNB *phy_vars_eNB,
|
||||
int lte_dl_cell_spec_SS(PHY_VARS_eNB *eNB,
|
||||
int32_t *output,
|
||||
short amp,
|
||||
unsigned char Ns,
|
||||
@@ -48,27 +48,27 @@ int lte_dl_cell_spec_SS(PHY_VARS_eNB *phy_vars_eNB,
|
||||
return(-1);
|
||||
}
|
||||
|
||||
mprime = 110 - phy_vars_eNB->lte_frame_parms.N_RB_DL;
|
||||
mprime = 110 - eNB->frame_parms.N_RB_DL;
|
||||
|
||||
k = (nu + phy_vars_eNB->lte_frame_parms.nushift);
|
||||
k = (nu + eNB->frame_parms.nushift);
|
||||
|
||||
if (k > 6)//b
|
||||
k -=6;//b
|
||||
|
||||
k+=phy_vars_eNB->lte_frame_parms.first_carrier_offset;
|
||||
k+=eNB->frame_parms.first_carrier_offset;
|
||||
|
||||
for (m=0; m<phy_vars_eNB->lte_frame_parms.N_RB_DL<<1; m++) { // loop over pilots in one slot/symbol, 2*N_RB_DL pilots
|
||||
for (m=0; m<eNB->frame_parms.N_RB_DL<<1; m++) { // loop over pilots in one slot/symbol, 2*N_RB_DL pilots
|
||||
|
||||
mprime_dword = mprime>>4;
|
||||
mprime_qpsk_symb = mprime&0xf;
|
||||
|
||||
// this is r_mprime from 3GPP 36-211 6.10.1.2
|
||||
output[k] = qpsk[(phy_vars_eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3];
|
||||
output[k] = qpsk[(eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3];
|
||||
//output[k] = (lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3;
|
||||
#ifdef DEBUG_DL_CELL_SPEC
|
||||
printf("Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n",
|
||||
Ns,l,m,mprime_dword,mprime_qpsk_symb);
|
||||
printf("index = %d (k %d)\n",(phy_vars_eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k);
|
||||
printf("index = %d (k %d)\n",(eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k);
|
||||
#endif
|
||||
|
||||
mprime++;
|
||||
@@ -80,9 +80,9 @@ int lte_dl_cell_spec_SS(PHY_VARS_eNB *phy_vars_eNB,
|
||||
#endif
|
||||
k+=6;//b
|
||||
|
||||
if (k >= phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) {
|
||||
if (k >= eNB->frame_parms.ofdm_symbol_size) {
|
||||
k++; // skip DC carrier
|
||||
k-=phy_vars_eNB->lte_frame_parms.ofdm_symbol_size;
|
||||
k-=eNB->frame_parms.ofdm_symbol_size;
|
||||
}
|
||||
|
||||
// printf("** k %d\n",k);
|
||||
@@ -92,7 +92,7 @@ int lte_dl_cell_spec_SS(PHY_VARS_eNB *phy_vars_eNB,
|
||||
}
|
||||
|
||||
|
||||
int lte_dl_cell_spec(PHY_VARS_eNB *phy_vars_eNB,
|
||||
int lte_dl_cell_spec(PHY_VARS_eNB *eNB,
|
||||
int32_t *output,
|
||||
short amp,
|
||||
unsigned char Ns,
|
||||
@@ -127,31 +127,31 @@ int lte_dl_cell_spec(PHY_VARS_eNB *phy_vars_eNB,
|
||||
return(-1);
|
||||
}
|
||||
|
||||
mprime = 110 - phy_vars_eNB->lte_frame_parms.N_RB_DL;
|
||||
mprime = 110 - eNB->frame_parms.N_RB_DL;
|
||||
|
||||
k = (nu + phy_vars_eNB->lte_frame_parms.nushift);
|
||||
k = (nu + eNB->frame_parms.nushift);
|
||||
|
||||
if (k > 5)
|
||||
k -=6;
|
||||
|
||||
k+=phy_vars_eNB->lte_frame_parms.first_carrier_offset;
|
||||
k+=eNB->frame_parms.first_carrier_offset;
|
||||
|
||||
DevAssert( Ns < 20 );
|
||||
DevAssert( l < 2 );
|
||||
DevAssert( mprime>>4 < 14 );
|
||||
|
||||
for (m=0; m<phy_vars_eNB->lte_frame_parms.N_RB_DL<<1; m++) {
|
||||
for (m=0; m<eNB->frame_parms.N_RB_DL<<1; m++) {
|
||||
|
||||
mprime_dword = mprime>>4;
|
||||
mprime_qpsk_symb = mprime&0xf;
|
||||
|
||||
// this is r_mprime from 3GPP 36-211 6.10.1.2
|
||||
output[k] = qpsk[(phy_vars_eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3];
|
||||
output[k] = qpsk[(eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3];
|
||||
//output[k] = (lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3;
|
||||
#ifdef DEBUG_DL_CELL_SPEC
|
||||
printf("Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n",
|
||||
Ns,l,m,mprime_dword,mprime_qpsk_symb);
|
||||
printf("index = %d (k %d)\n",(phy_vars_eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k);
|
||||
printf("index = %d (k %d)\n",(eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k);
|
||||
#endif
|
||||
|
||||
mprime++;
|
||||
@@ -163,9 +163,9 @@ int lte_dl_cell_spec(PHY_VARS_eNB *phy_vars_eNB,
|
||||
#endif
|
||||
k+=6;
|
||||
|
||||
if (k >= phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) {
|
||||
if (k >= eNB->frame_parms.ofdm_symbol_size) {
|
||||
k++; // skip DC carrier
|
||||
k-=phy_vars_eNB->lte_frame_parms.ofdm_symbol_size;
|
||||
k-=eNB->frame_parms.ofdm_symbol_size;
|
||||
}
|
||||
|
||||
// printf("** k %d\n",k);
|
||||
@@ -174,7 +174,7 @@ int lte_dl_cell_spec(PHY_VARS_eNB *phy_vars_eNB,
|
||||
return(0);
|
||||
}
|
||||
|
||||
int lte_dl_cell_spec_rx(PHY_VARS_UE *phy_vars_ue,
|
||||
int lte_dl_cell_spec_rx(PHY_VARS_UE *ue,
|
||||
uint8_t eNB_offset,
|
||||
int *output,
|
||||
unsigned char Ns,
|
||||
@@ -202,19 +202,19 @@ int lte_dl_cell_spec_rx(PHY_VARS_UE *phy_vars_ue,
|
||||
((short *)&qpsk[3])[0] = -pamp;
|
||||
((short *)&qpsk[3])[1] = pamp;
|
||||
|
||||
mprime = 110 - phy_vars_ue->lte_frame_parms.N_RB_DL;
|
||||
mprime = 110 - ue->frame_parms.N_RB_DL;
|
||||
|
||||
for (m=0; m<phy_vars_ue->lte_frame_parms.N_RB_DL<<1; m++) {
|
||||
for (m=0; m<ue->frame_parms.N_RB_DL<<1; m++) {
|
||||
|
||||
mprime_dword = mprime>>4;
|
||||
mprime_qpsk_symb = mprime&0xf;
|
||||
|
||||
// this is r_mprime from 3GPP 36-211 6.10.1.2
|
||||
output[k] = qpsk[(phy_vars_ue->lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3];
|
||||
output[k] = qpsk[(ue->lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3];
|
||||
#ifdef DEBUG_DL_CELL_SPEC
|
||||
printf("Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n",
|
||||
Ns,l,m,mprime_dword,mprime_qpsk_symb);
|
||||
printf("index = %d (k %d)\n",(phy_vars_ue->lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k);
|
||||
printf("index = %d (k %d)\n",(ue->lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k);
|
||||
#endif
|
||||
|
||||
mprime++;
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
//extern unsigned int lte_gold_table[10][3][42];
|
||||
//#define DEBUG_DL_MBSFN
|
||||
|
||||
int lte_dl_mbsfn(PHY_VARS_eNB *phy_vars_eNB, int32_t *output,
|
||||
int lte_dl_mbsfn(PHY_VARS_eNB *eNB, int32_t *output,
|
||||
short amp,
|
||||
int subframe,
|
||||
unsigned char l)
|
||||
@@ -34,9 +34,9 @@ int lte_dl_mbsfn(PHY_VARS_eNB *phy_vars_eNB, int32_t *output,
|
||||
((short *)&qpsk[3])[1] = -a;
|
||||
|
||||
|
||||
mprime = 3*(110 - phy_vars_eNB->lte_frame_parms.N_RB_DL);
|
||||
mprime = 3*(110 - eNB->frame_parms.N_RB_DL);
|
||||
|
||||
for (m=0; m<phy_vars_eNB->lte_frame_parms.N_RB_DL*6; m++) {
|
||||
for (m=0; m<eNB->frame_parms.N_RB_DL*6; m++) {
|
||||
|
||||
if ((l==0) || (l==2))
|
||||
k = m<<1;
|
||||
@@ -47,24 +47,24 @@ int lte_dl_mbsfn(PHY_VARS_eNB *phy_vars_eNB, int32_t *output,
|
||||
return(-1);
|
||||
}
|
||||
|
||||
k+=phy_vars_eNB->lte_frame_parms.first_carrier_offset;
|
||||
k+=eNB->frame_parms.first_carrier_offset;
|
||||
|
||||
mprime_dword = mprime>>4;
|
||||
mprime_qpsk_symb = mprime&0xf;
|
||||
|
||||
if (k >= phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) {
|
||||
if (k >= eNB->frame_parms.ofdm_symbol_size) {
|
||||
k++; // skip DC carrier
|
||||
k-=phy_vars_eNB->lte_frame_parms.ofdm_symbol_size;
|
||||
k-=eNB->frame_parms.ofdm_symbol_size;
|
||||
}
|
||||
|
||||
output[k] = qpsk[(phy_vars_eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3];
|
||||
output[k] = qpsk[(eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3];
|
||||
//output[k] = (lte_gold_table[eNB_offset][subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3;
|
||||
|
||||
|
||||
#ifdef DEBUG_DL_MBSFN
|
||||
msg("subframe %d, l %d, m %d, mprime %d, mprime_dword %d, mprime_qpsk_symbol %d\n",
|
||||
subframe,l,m,mprime,mprime_dword,mprime_qpsk_symb);
|
||||
msg("index = %d (k %d)(%x)\n",(phy_vars_eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k,phy_vars_eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]);
|
||||
msg("index = %d (k %d)(%x)\n",(eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k,eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]);
|
||||
#endif
|
||||
mprime++;
|
||||
|
||||
@@ -82,7 +82,7 @@ int lte_dl_mbsfn(PHY_VARS_eNB *phy_vars_eNB, int32_t *output,
|
||||
|
||||
|
||||
|
||||
int lte_dl_mbsfn_rx(PHY_VARS_UE *phy_vars_ue,
|
||||
int lte_dl_mbsfn_rx(PHY_VARS_UE *ue,
|
||||
int *output,
|
||||
int subframe,
|
||||
unsigned char l)
|
||||
@@ -103,20 +103,20 @@ int lte_dl_mbsfn_rx(PHY_VARS_UE *phy_vars_ue,
|
||||
((short *)&qpsk[3])[0] = -ONE_OVER_SQRT2_Q15;
|
||||
((short *)&qpsk[3])[1] = ONE_OVER_SQRT2_Q15;
|
||||
|
||||
mprime = 3*(110 - phy_vars_ue->lte_frame_parms.N_RB_DL);
|
||||
mprime = 3*(110 - ue->frame_parms.N_RB_DL);
|
||||
|
||||
for (m=0; m<phy_vars_ue->lte_frame_parms.N_RB_DL*6; m++) {
|
||||
for (m=0; m<ue->frame_parms.N_RB_DL*6; m++) {
|
||||
|
||||
mprime_dword = mprime>>4;
|
||||
mprime_qpsk_symb = mprime&0xf;
|
||||
|
||||
// this is r_mprime from 3GPP 36-211 6.10.1.2
|
||||
output[k] = qpsk[(phy_vars_ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3];
|
||||
output[k] = qpsk[(ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3];
|
||||
|
||||
#ifdef DEBUG_DL_MBSFN
|
||||
printf("subframe %d, l %d, m %d, mprime %d, mprime_dword %d, mprime_qpsk_symbol %d\n",
|
||||
subframe,l,m,mprime, mprime_dword,mprime_qpsk_symb);
|
||||
printf("index = %d (k %d) (%x)\n",(phy_vars_ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k,phy_vars_ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]);
|
||||
printf("index = %d (k %d) (%x)\n",(ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k,ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]);
|
||||
#endif
|
||||
|
||||
mprime++;
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
int Wbar_NCP[8][4] = {{1,1,1,1},{1,-1,1,-1},{1,1,1,1},{1,-1,1,-1},{1,1,-1,-1},{-1,-1,1,1},{1,-1,-1,1},{-1,1,1,-1}};
|
||||
|
||||
int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB,
|
||||
int lte_dl_ue_spec(PHY_VARS_eNB *eNB,
|
||||
uint8_t UE_id,
|
||||
int32_t *output,
|
||||
short amp,
|
||||
@@ -35,7 +35,7 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB,
|
||||
int32_t qpsk[4],nqpsk[4],*qpsk_p,*output_p;
|
||||
int16_t a;
|
||||
int w,lprime,ind,l,ind_dword,ind_qpsk_symb,nPRB;
|
||||
// LTE_eNB_DLSCH_t *dlsch = phy_vars_eNB->dlsch_eNB[UE_id][0];
|
||||
// LTE_eNB_DLSCH_t *dlsch = eNB->dlsch_eNB[UE_id][0];
|
||||
|
||||
a = (amp*ONE_OVER_SQRT2_Q15)>>15;
|
||||
((short *)&qpsk[0])[0] = a;
|
||||
@@ -58,13 +58,13 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
if (p>=7) {
|
||||
if (SS_flag==0) {
|
||||
if (phy_vars_eNB->lte_frame_parms.Ncp == NORMAL) {
|
||||
if (eNB->frame_parms.Ncp == NORMAL) {
|
||||
// this is 3GPP 36-211 6.10.3.2, NORMAL CP, p>=7
|
||||
|
||||
|
||||
|
||||
// position output pointer to 5th symbol in slot
|
||||
output_p = output+(60*phy_vars_eNB->lte_frame_parms.N_RB_DL);
|
||||
output_p = output+(60*eNB->frame_parms.N_RB_DL);
|
||||
|
||||
// shift to 2nd RE in PRB for p=7,8,11,13
|
||||
if ((p==7) || (p==8) || (p==11) || (p==13)) output_p++;
|
||||
@@ -72,12 +72,12 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
for (lprime=0; lprime<2; lprime++) {
|
||||
|
||||
ind = 3*lprime*phy_vars_eNB->lte_frame_parms.N_RB_DL;
|
||||
ind = 3*lprime*eNB->frame_parms.N_RB_DL;
|
||||
l = lprime + ((Ns&1)<<1);
|
||||
|
||||
// loop over pairs of PRBs, this is the periodicity of the W_bar_NCP sequence
|
||||
// unroll the computations for the 6 pilots, select qpsk or nqpsk as function of W_bar_NCP
|
||||
for (nPRB=0; nPRB<phy_vars_eNB->lte_frame_parms.N_RB_DL; nPRB+=2) {
|
||||
for (nPRB=0; nPRB<eNB->frame_parms.N_RB_DL; nPRB+=2) {
|
||||
|
||||
// First pilot
|
||||
w = Wbar_NCP[p-7][l];
|
||||
@@ -87,13 +87,13 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB,
|
||||
ind_dword = ind>>4;
|
||||
ind_qpsk_symb = ind&0xf;
|
||||
|
||||
*output_p = qpsk_p[(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
*output_p = qpsk_p[(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
|
||||
|
||||
#ifdef DEBUG_DL_UESPEC
|
||||
LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n",
|
||||
Ns,l,m,mprime_dword,mprime_qpsk_symb);
|
||||
LOG_D(PHY,"index = %d\n",(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
LOG_D(PHY,"index = %d\n",(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
#endif
|
||||
|
||||
output_p+=5;
|
||||
@@ -106,12 +106,12 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB,
|
||||
ind_dword = ind>>4;
|
||||
ind_qpsk_symb = ind&0xf;
|
||||
|
||||
*output_p = qpsk_p[(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
*output_p = qpsk_p[(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
|
||||
#ifdef DEBUG_DL_UESPEC
|
||||
LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n",
|
||||
Ns,l,m,mprime_dword,mprime_qpsk_symb);
|
||||
LOG_D(PHY,"index = %d\n",(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
LOG_D(PHY,"index = %d\n",(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
#endif
|
||||
|
||||
output_p+=5;
|
||||
@@ -123,12 +123,12 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB,
|
||||
ind_dword = ind>>4;
|
||||
ind_qpsk_symb = ind&0xf;
|
||||
|
||||
*output_p = qpsk_p[(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
*output_p = qpsk_p[(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
|
||||
#ifdef DEBUG_DL_UESPEC
|
||||
LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n",
|
||||
Ns,l,m,mprime_dword,mprime_qpsk_symb);
|
||||
LOG_D(PHY,"index = %d\n",(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
LOG_D(PHY,"index = %d\n",(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
#endif
|
||||
|
||||
output_p+=2;
|
||||
@@ -142,13 +142,13 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB,
|
||||
ind_dword = ind>>4;
|
||||
ind_qpsk_symb = ind&0xf;
|
||||
|
||||
*output_p = qpsk_p[(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
*output_p = qpsk_p[(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
|
||||
|
||||
#ifdef DEBUG_DL_UESPEC
|
||||
LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n",
|
||||
Ns,l,m,mprime_dword,mprime_qpsk_symb);
|
||||
LOG_D(PHY,"index = %d\n",(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
LOG_D(PHY,"index = %d\n",(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
#endif
|
||||
|
||||
output_p+=5;
|
||||
@@ -161,12 +161,12 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB,
|
||||
ind_dword = ind>>4;
|
||||
ind_qpsk_symb = ind&0xf;
|
||||
|
||||
*output_p = qpsk_p[(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
*output_p = qpsk_p[(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
|
||||
#ifdef DEBUG_DL_UESPEC
|
||||
LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n",
|
||||
Ns,l,m,mprime_dword,mprime_qpsk_symb);
|
||||
LOG_D(PHY,"index = %d\n",(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
LOG_D(PHY,"index = %d\n",(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
#endif
|
||||
|
||||
output_p+=5;
|
||||
@@ -178,12 +178,12 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB,
|
||||
ind_dword = ind>>4;
|
||||
ind_qpsk_symb = ind&0xf;
|
||||
|
||||
*output_p = qpsk_p[(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
*output_p = qpsk_p[(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
|
||||
#ifdef DEBUG_DL_UESPEC
|
||||
LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n",
|
||||
Ns,l,m,mprime_dword,mprime_qpsk_symb);
|
||||
LOG_D(PHY,"index = %d\n",(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
LOG_D(PHY,"index = %d\n",(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
#endif
|
||||
|
||||
output_p+=2;
|
||||
@@ -231,9 +231,9 @@ int lte_dl_cell_spec_rx(PHY_VARS_UE *phy_vars_ue,
|
||||
((short *)&qpsk[3])[0] = -pamp;
|
||||
((short *)&qpsk[3])[1] = pamp;
|
||||
|
||||
mprime = 110 - phy_vars_ue->lte_frame_parms.N_RB_DL;
|
||||
mprime = 110 - phy_vars_ue->frame_parms.N_RB_DL;
|
||||
|
||||
for (m=0;m<phy_vars_ue->lte_frame_parms.N_RB_DL<<1;m++) {
|
||||
for (m=0;m<phy_vars_ue->frame_parms.N_RB_DL<<1;m++) {
|
||||
|
||||
mprime_dword = mprime>>4;
|
||||
mprime_qpsk_symb = mprime&0xf;
|
||||
|
||||
+198
-136
File diff suppressed because it is too large
Load Diff
@@ -15,7 +15,7 @@
|
||||
#include "PHY/vars.h"
|
||||
#endif
|
||||
#include "assertions.h"
|
||||
|
||||
|
||||
//#define DEBUG_DCI
|
||||
|
||||
uint32_t localRIV2alloc_LUT6[32];
|
||||
@@ -1187,7 +1187,7 @@ int generate_eNB_dlsch_params_from_dci(int frame,
|
||||
|
||||
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
|
||||
|
||||
// msg("DCI: Setting subframe_tx for subframe %d\n",subframe);
|
||||
// printf("DCI: Setting subframe_tx for subframe %d\n",subframe);
|
||||
dlsch[0]->subframe_tx[subframe] = 1;
|
||||
|
||||
conv_rballoc(rah,
|
||||
@@ -4406,9 +4406,6 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
LOG_D(PHY,"UE (%x/%d): Subframe %d Format1 DCI: ndi %d, old_ndi %d (first tx %d) harq_status %d\n",dlsch[0]->rnti,harq_pid,subframe,ndi,dlsch0_harq->DCINdi,
|
||||
dlsch0_harq->first_tx,dlsch0_harq->status);
|
||||
|
||||
// printf("Format2 DCI (UE, hard pid %d): ndi %d, old_ndi %d (first tx %d)\n",harq_pid,ndi,dlsch0_harq->DCINdi,
|
||||
// dlsch0_harq->first_tx);
|
||||
|
||||
if ((ndi!=dlsch0_harq->DCINdi)||
|
||||
(dlsch0_harq->first_tx==1)) {
|
||||
// printf("Rate: setting round to zero (ndi %d, DCINdi %d,first_tx %d)\n",ndi,dlsch0_harq->DCINdi,dlsch0_harq->first_tx);
|
||||
@@ -4441,7 +4438,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
dlsch0_harq->Qm = (mcs-28)<<1;
|
||||
else
|
||||
LOG_E(PHY,"invalid mcs %d\n",mcs);
|
||||
// msg("test: MCS %d, NPRB %d, TBS %d\n",mcs,NPRB,dlsch0_harq->TBS);
|
||||
// printf("test: MCS %d, NPRB %d, TBS %d\n",mcs,NPRB,dlsch0_harq->TBS);
|
||||
dlsch[0]->current_harq_pid = harq_pid;
|
||||
|
||||
dlsch[0]->active = 1;
|
||||
@@ -4709,7 +4706,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
dlsch[0]->g_pucch += delta_PUCCH_lut[TPC&3];
|
||||
/*
|
||||
if (dlsch0_harq->mcs>20) {
|
||||
msg("dci_tools.c: mcs > 20 disabled for now (asked %d)\n",dlsch0_harq->mcs);
|
||||
printf("dci_tools.c: mcs > 20 disabled for now (asked %d)\n",dlsch0_harq->mcs);
|
||||
return(-1);
|
||||
}
|
||||
*/
|
||||
@@ -5385,7 +5382,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
|
||||
/*
|
||||
if (dlsch0_harq->mcs>20) {
|
||||
msg("dci_tools.c: mcs > 20 disabled for now (asked %d)\n",dlsch0_harq->mcs);
|
||||
printf("dci_tools.c: mcs > 20 disabled for now (asked %d)\n",dlsch0_harq->mcs);
|
||||
return(-1);
|
||||
}
|
||||
*/
|
||||
@@ -5411,7 +5408,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
|
||||
// Fix this
|
||||
tpmi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->tpmi;
|
||||
// msg("ue: tpmi %d\n",tpmi);
|
||||
// printf("ue: tpmi %d\n",tpmi);
|
||||
|
||||
switch (tpmi) {
|
||||
case 0 :
|
||||
@@ -5530,9 +5527,9 @@ uint8_t subframe2harq_pid(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame,uint8_t
|
||||
/*
|
||||
#ifdef DEBUG_DCI
|
||||
if (frame_parms->frame_type == TDD)
|
||||
msg("dci_tools.c: subframe2_harq_pid, subframe %d for TDD configuration %d\n",subframe,frame_parms->tdd_config);
|
||||
printf("dci_tools.c: subframe2_harq_pid, subframe %d for TDD configuration %d\n",subframe,frame_parms->tdd_config);
|
||||
else
|
||||
msg("dci_tools.c: subframe2_harq_pid, subframe %d for FDD \n",subframe);
|
||||
printf("dci_tools.c: subframe2_harq_pid, subframe %d for FDD \n",subframe);
|
||||
#endif
|
||||
*/
|
||||
if (frame_parms->frame_type == FDD) {
|
||||
@@ -5708,7 +5705,7 @@ uint16_t quantize_subband_pmi(PHY_MEASUREMENTS *meas,uint8_t eNB_id,int nb_subba
|
||||
pmivect |= (pmiq<<(2*i));
|
||||
} else {
|
||||
// This needs to be done properly!!!
|
||||
msg("PMI feedback for rank>1 not supported!\n");
|
||||
printf("PMI feedback for rank>1 not supported!\n");
|
||||
pmivect = 0;
|
||||
}
|
||||
}
|
||||
@@ -5902,7 +5899,7 @@ uint32_t fill_subband_cqi(PHY_MEASUREMENTS *meas,uint8_t eNB_id,uint8_t trans_mo
|
||||
void fill_CQI(LTE_UE_ULSCH_t *ulsch,PHY_MEASUREMENTS *meas,uint8_t eNB_id,uint8_t harq_pid,int N_RB_DL,uint16_t rnti, uint8_t trans_mode, double sinr_eff)
|
||||
{
|
||||
|
||||
// msg("[PHY][UE] Filling CQI for eNB %d, meas->wideband_cqi_tot[%d] %d\n",
|
||||
// printf("[PHY][UE] Filling CQI for eNB %d, meas->wideband_cqi_tot[%d] %d\n",
|
||||
// eNB_id,eNB_id,meas->wideband_cqi_tot[eNB_id]);
|
||||
double sinr_tmp;
|
||||
uint8_t *o = ulsch->o;
|
||||
@@ -6164,7 +6161,8 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
uint16_t rnti,
|
||||
uint8_t subframe,
|
||||
DCI_format_t dci_format,
|
||||
PHY_VARS_UE *phy_vars_ue,
|
||||
PHY_VARS_UE *ue,
|
||||
UE_rxtx_proc_t *proc,
|
||||
uint16_t si_rnti,
|
||||
uint16_t ra_rnti,
|
||||
uint16_t p_rnti,
|
||||
@@ -6174,13 +6172,13 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
{
|
||||
|
||||
uint8_t harq_pid;
|
||||
uint8_t transmission_mode = phy_vars_ue->transmission_mode[eNB_id];
|
||||
ANFBmode_t AckNackFBMode = phy_vars_ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode;
|
||||
LTE_UE_ULSCH_t *ulsch = phy_vars_ue->ulsch_ue[eNB_id];
|
||||
// LTE_UE_DLSCH_t **dlsch = phy_vars_ue->dlsch_ue[0];
|
||||
PHY_MEASUREMENTS *meas = &phy_vars_ue->PHY_measurements;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms;
|
||||
// uint32_t current_dlsch_cqi = phy_vars_ue->current_dlsch_cqi[eNB_id];
|
||||
uint8_t transmission_mode = ue->transmission_mode[eNB_id];
|
||||
ANFBmode_t AckNackFBMode = ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode;
|
||||
LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id];
|
||||
// LTE_UE_DLSCH_t **dlsch = ue->dlsch[0];
|
||||
PHY_MEASUREMENTS *meas = &ue->measurements;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
||||
// uint32_t current_dlsch_cqi = ue->current_dlsch_cqi[eNB_id];
|
||||
|
||||
uint32_t cqi_req;
|
||||
uint32_t dai=0;
|
||||
@@ -6194,16 +6192,19 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
|
||||
if (dci_format == format0) {
|
||||
|
||||
if (!ulsch)
|
||||
return -1;
|
||||
|
||||
if (rnti == ra_rnti)
|
||||
harq_pid = 0;
|
||||
else
|
||||
harq_pid = subframe2harq_pid(frame_parms,
|
||||
pdcch_alloc2ul_frame(frame_parms,phy_vars_ue->frame_rx,subframe),
|
||||
pdcch_alloc2ul_frame(frame_parms,proc->frame_rx,subframe),
|
||||
pdcch_alloc2ul_subframe(frame_parms,subframe));
|
||||
|
||||
if (harq_pid == 255) {
|
||||
LOG_E(PHY, "frame %d, subframe %d, rnti %x, format %d: illegal harq_pid!\n",
|
||||
phy_vars_ue->frame_rx, subframe, rnti, dci_format);
|
||||
proc->frame_rx, subframe, rnti, dci_format);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
@@ -6261,7 +6262,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
RIV_max = RIV_max25;
|
||||
ulsch->harq_processes[harq_pid]->first_rb = RIV2first_rb_LUT25[rballoc];
|
||||
ulsch->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT25[rballoc];
|
||||
// printf("***********rballoc %d, first_rb %d, nb_rb %d\n",rballoc,ulsch->harq_processes[harq_pid]->first_rb,ulsch->harq_processes[harq_pid]->nb_rb);
|
||||
// printf("***********rballoc %d, first_rb %d, nb_rb %d (dci %p)\n",rballoc,ulsch->harq_processes[harq_pid]->first_rb,ulsch->harq_processes[harq_pid]->nb_rb,dci_pdu);
|
||||
break;
|
||||
|
||||
case 50:
|
||||
@@ -6330,7 +6331,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
|
||||
if (rballoc > RIV_max) {
|
||||
LOG_E(PHY,"frame %d, subframe %d, rnti %x, format %d: FATAL ERROR: generate_ue_ulsch_params_from_dci, rb_alloc > RIV_max\n",
|
||||
phy_vars_ue->frame_rx, subframe, rnti, dci_format);
|
||||
proc->frame_rx, subframe, rnti, dci_format);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
@@ -6343,18 +6344,18 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
|
||||
ulsch->harq_processes[harq_pid]->TPC = TPC;
|
||||
|
||||
if (phy_vars_ue->ul_power_control_dedicated[eNB_id].accumulationEnabled == 1) {
|
||||
if (ue->ul_power_control_dedicated[eNB_id].accumulationEnabled == 1) {
|
||||
LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d: f_pusch (ACC) %d, adjusting by %d (TPC %d)\n",
|
||||
phy_vars_ue->Mod_id,harq_pid,phy_vars_ue->frame_rx,subframe,ulsch->f_pusch,
|
||||
delta_PUSCH_acc[phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TPC],
|
||||
phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TPC);
|
||||
ulsch->f_pusch += delta_PUSCH_acc[phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TPC];
|
||||
ue->Mod_id,harq_pid,proc->frame_rx,subframe,ulsch->f_pusch,
|
||||
delta_PUSCH_acc[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC],
|
||||
ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC);
|
||||
ulsch->f_pusch += delta_PUSCH_acc[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC];
|
||||
} else {
|
||||
LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d: f_pusch (ABS) %d, adjusting to %d (TPC %d)\n",
|
||||
phy_vars_ue->Mod_id,harq_pid,phy_vars_ue->frame_rx,subframe,ulsch->f_pusch,
|
||||
delta_PUSCH_abs[phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TPC],
|
||||
phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TPC);
|
||||
ulsch->f_pusch = delta_PUSCH_abs[phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TPC];
|
||||
ue->Mod_id,harq_pid,proc->frame_rx,subframe,ulsch->f_pusch,
|
||||
delta_PUSCH_abs[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC],
|
||||
ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC);
|
||||
ulsch->f_pusch = delta_PUSCH_abs[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC];
|
||||
}
|
||||
|
||||
if (ulsch->harq_processes[harq_pid]->first_tx==1) {
|
||||
@@ -6382,7 +6383,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
ulsch->rnti = rnti;
|
||||
}
|
||||
|
||||
// msg("[PHY][UE] DCI format 0: harq_pid %d nb_rb %d, rballoc %d\n",harq_pid,ulsch->harq_processes[harq_pid]->nb_rb,
|
||||
// printf("[PHY][UE] DCI format 0: harq_pid %d nb_rb %d, rballoc %d\n",harq_pid,ulsch->harq_processes[harq_pid]->nb_rb,
|
||||
// ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->rballoc);
|
||||
//Mapping of cyclic shift field in DCI format0 to n_DMRS2 (3GPP 36.211, Table 5.5.2.1.1-1)
|
||||
if(cshift == 0)
|
||||
@@ -6425,7 +6426,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
// The aperiodic CQI reporting mode is fixed for every transmission mode instead of being configured by higher layer signaling
|
||||
case 1:
|
||||
if ((rnti >= cba_rnti) && (rnti < p_rnti)) {
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_DL) {
|
||||
switch (ue->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
ulsch->O = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz;
|
||||
break;
|
||||
@@ -6446,7 +6447,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
ulsch->uci_format = HLC_subband_cqi_mcs_CBA;
|
||||
ulsch->o_RI[0] = 0;
|
||||
} else if(meas->rank[eNB_id] == 0) {
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_DL) {
|
||||
switch (ue->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz;
|
||||
break;
|
||||
@@ -6467,7 +6468,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
ulsch->uci_format = HLC_subband_cqi_nopmi;
|
||||
ulsch->o_RI[0] = 0;
|
||||
} else {
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_DL) {
|
||||
switch (ue->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz;
|
||||
break;
|
||||
@@ -6493,7 +6494,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
|
||||
case 2:
|
||||
if ((rnti >= cba_rnti) && (rnti < p_rnti)) {
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_DL) {
|
||||
switch (ue->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
ulsch->O = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz;
|
||||
break;
|
||||
@@ -6514,7 +6515,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
ulsch->uci_format = HLC_subband_cqi_mcs_CBA;
|
||||
ulsch->o_RI[0] = 0;
|
||||
} else if(meas->rank[eNB_id] == 0) {
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_DL) {
|
||||
switch (ue->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz;
|
||||
break;
|
||||
@@ -6535,7 +6536,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
ulsch->uci_format = HLC_subband_cqi_nopmi;
|
||||
ulsch->o_RI[0] = 0;
|
||||
} else {
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_DL) {
|
||||
switch (ue->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz;
|
||||
break;
|
||||
@@ -6561,7 +6562,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
|
||||
case 3:
|
||||
if ((rnti >= cba_rnti) && (rnti < p_rnti)) {
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_DL) {
|
||||
switch (ue->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
ulsch->O = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz;
|
||||
break;
|
||||
@@ -6582,7 +6583,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
ulsch->uci_format = HLC_subband_cqi_mcs_CBA;
|
||||
ulsch->o_RI[0] = 0;
|
||||
} else if(meas->rank[eNB_id] == 0) {
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_DL) {
|
||||
switch (ue->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz;
|
||||
break;
|
||||
@@ -6603,7 +6604,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
ulsch->uci_format = HLC_subband_cqi_nopmi;
|
||||
ulsch->o_RI[0] = 0;
|
||||
} else {
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_DL) {
|
||||
switch (ue->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz;
|
||||
break;
|
||||
@@ -6629,7 +6630,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
|
||||
case 4:
|
||||
if ((rnti >= cba_rnti) && (rnti < p_rnti)) {
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_DL) {
|
||||
switch (ue->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
ulsch->O = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz;
|
||||
break;
|
||||
@@ -6650,7 +6651,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
ulsch->uci_format = HLC_subband_cqi_mcs_CBA;
|
||||
ulsch->o_RI[0] = 0;
|
||||
} else if(meas->rank[eNB_id] == 0) {
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_DL) {
|
||||
switch (ue->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
ulsch->O = sizeof_wideband_cqi_rank1_2A_1_5MHz;
|
||||
break;
|
||||
@@ -6671,7 +6672,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
ulsch->uci_format = wideband_cqi_rank1_2A;
|
||||
ulsch->o_RI[0] = 0;
|
||||
} else {
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_DL) {
|
||||
switch (ue->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
ulsch->O = sizeof_wideband_cqi_rank2_2A_1_5MHz;
|
||||
break;
|
||||
@@ -6697,7 +6698,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
|
||||
case 5:
|
||||
if ((rnti >= cba_rnti) && (rnti < p_rnti)) {
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_DL) {
|
||||
switch (ue->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
ulsch->O = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz;
|
||||
break;
|
||||
@@ -6718,7 +6719,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
ulsch->uci_format = HLC_subband_cqi_mcs_CBA;
|
||||
ulsch->o_RI[0] = 0;
|
||||
} else if(meas->rank[eNB_id] == 0) {
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_DL) {
|
||||
switch (ue->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
ulsch->O = sizeof_wideband_cqi_rank1_2A_1_5MHz;
|
||||
break;
|
||||
@@ -6739,7 +6740,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
ulsch->uci_format = wideband_cqi_rank1_2A;
|
||||
ulsch->o_RI[0] = 0;
|
||||
} else {
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_DL) {
|
||||
switch (ue->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
ulsch->O = sizeof_wideband_cqi_rank2_2A_1_5MHz;
|
||||
break;
|
||||
@@ -6765,7 +6766,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
|
||||
case 6:
|
||||
if ((rnti >= cba_rnti) && (rnti < p_rnti)) {
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_DL) {
|
||||
switch (ue->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
ulsch->O = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz;
|
||||
break;
|
||||
@@ -6786,7 +6787,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
ulsch->uci_format = HLC_subband_cqi_mcs_CBA;
|
||||
ulsch->o_RI[0] = 0;
|
||||
} else if(meas->rank[eNB_id] == 0) {
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_DL) {
|
||||
switch (ue->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
ulsch->O = sizeof_wideband_cqi_rank1_2A_1_5MHz;
|
||||
break;
|
||||
@@ -6807,7 +6808,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
ulsch->uci_format = wideband_cqi_rank1_2A;
|
||||
ulsch->o_RI[0] = 0;
|
||||
} else {
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_DL) {
|
||||
switch (ue->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
ulsch->O = sizeof_wideband_cqi_rank2_2A_1_5MHz;
|
||||
break;
|
||||
@@ -6833,7 +6834,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
|
||||
case 7:
|
||||
if ((rnti >= cba_rnti) && (rnti < p_rnti)) {
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_DL) {
|
||||
switch (ue->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
ulsch->O = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz;
|
||||
break;
|
||||
@@ -6854,7 +6855,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
ulsch->uci_format = HLC_subband_cqi_mcs_CBA;
|
||||
ulsch->o_RI[0] = 0;
|
||||
} else if(meas->rank[eNB_id] == 0) {
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_DL) {
|
||||
switch (ue->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz;
|
||||
break;
|
||||
@@ -6875,7 +6876,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
ulsch->uci_format = HLC_subband_cqi_nopmi;
|
||||
ulsch->o_RI[0] = 0;
|
||||
} else {
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_DL) {
|
||||
switch (ue->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz;
|
||||
break;
|
||||
@@ -6909,23 +6910,13 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
ulsch->uci_format = HLC_subband_cqi_nopmi;
|
||||
}
|
||||
|
||||
print_CQI(ulsch->o,ulsch->uci_format,eNB_id,phy_vars_ue->lte_frame_parms.N_RB_DL);
|
||||
print_CQI(ulsch->o,ulsch->uci_format,eNB_id,ue->frame_parms.N_RB_DL);
|
||||
|
||||
//FK: moved this part to ulsch_coding to be more recent
|
||||
/*
|
||||
fill_CQI(ulsch->o,ulsch->uci_format,meas,eNB_id,transmission_mode);
|
||||
print_CQI(ulsch->o,ulsch->uci_format,eNB_id);
|
||||
|
||||
// save PUSCH pmi for later (transmission modes 4,5,6)
|
||||
// msg("ulsch: saving pmi for DL %x\n",pmi2hex_2Ar1(((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi));
|
||||
dlsch[0]->pmi_alloc = ((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi;
|
||||
*/
|
||||
|
||||
// check this (see comment in generate_ue_ulsch_params_from_dci)
|
||||
if (frame_parms->frame_type == FDD) {
|
||||
int dl_subframe = (subframe<4) ? (subframe+6) : (subframe-4);
|
||||
|
||||
if (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[dl_subframe].send_harq_status>0) { // we have downlink transmission
|
||||
if (ue->dlsch[eNB_id][0]->harq_ack[dl_subframe].send_harq_status>0) { // we have downlink transmission
|
||||
ulsch->harq_processes[harq_pid]->O_ACK = 1;
|
||||
} else {
|
||||
ulsch->harq_processes[harq_pid]->O_ACK = 0;
|
||||
@@ -6939,9 +6930,9 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
// ulsch->harq_processes[harq_pid]->V_UL_DAI = dai+1;
|
||||
}
|
||||
|
||||
ulsch->beta_offset_cqi_times8 = beta_cqi[phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index];//18;
|
||||
ulsch->beta_offset_ri_times8 = beta_ri[phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_RI_Index];//10;
|
||||
ulsch->beta_offset_harqack_times8 = beta_ack[phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index];//16;
|
||||
ulsch->beta_offset_cqi_times8 = beta_cqi[ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index];//18;
|
||||
ulsch->beta_offset_ri_times8 = beta_ri[ue->pusch_config_dedicated[eNB_id].betaOffset_RI_Index];//10;
|
||||
ulsch->beta_offset_harqack_times8 = beta_ack[ue->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index];//16;
|
||||
|
||||
ulsch->Nsymb_pusch = 12-(frame_parms->Ncp<<1)-(use_srs==0?0:1);
|
||||
ulsch->srs_active = use_srs;
|
||||
@@ -6974,8 +6965,8 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
ulsch->harq_processes[harq_pid]->round = 0;
|
||||
|
||||
// a Ndi=1 automatically acknowledges previous PUSCH transmission
|
||||
if (phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1)
|
||||
phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] = 0;
|
||||
if (ue->ulsch_Msg3_active[eNB_id] == 1)
|
||||
ue->ulsch_Msg3_active[eNB_id] = 0;
|
||||
} else {
|
||||
// printf("Ndi = 0 : Setting RVidx from mcs %d\n",((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->mcs);
|
||||
if (mcs>28) ulsch->harq_processes[harq_pid]->rvidx = mcs - 28;
|
||||
@@ -6984,45 +6975,45 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
}
|
||||
|
||||
LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d, subframe %d : Programming PUSCH with n_DMRS2 %d (cshift %d), nb_rb %d, first_rb %d, mcs %d, round %d, rv %d\n",
|
||||
phy_vars_ue->Mod_id,harq_pid,phy_vars_ue->frame_rx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift,ulsch->harq_processes[harq_pid]->nb_rb,ulsch->harq_processes[harq_pid]->first_rb,
|
||||
ue->Mod_id,harq_pid,proc->frame_rx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift,ulsch->harq_processes[harq_pid]->nb_rb,ulsch->harq_processes[harq_pid]->first_rb,
|
||||
ulsch->harq_processes[harq_pid]->mcs,ulsch->harq_processes[harq_pid]->round,ulsch->harq_processes[harq_pid]->rvidx);
|
||||
|
||||
// ulsch->n_DMRS2 = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->cshift;
|
||||
|
||||
#ifdef DEBUG_DCI
|
||||
msg("Format 0 DCI : ulsch (ue): NBRB %d\n",ulsch->harq_processes[harq_pid]->nb_rb);
|
||||
msg("Format 0 DCI :ulsch (ue): first_rb %d\n",ulsch->harq_processes[harq_pid]->first_rb);
|
||||
msg("Format 0 DCI :ulsch (ue): harq_pid %d\n",harq_pid);
|
||||
msg("Format 0 DCI :ulsch (ue): round %d\n",ulsch->harq_processes[harq_pid]->round);
|
||||
msg("Format 0 DCI :ulsch (ue): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS);
|
||||
msg("Format 0 DCI :ulsch (ue): mcs %d\n",ulsch->harq_processes[harq_pid]->mcs);
|
||||
msg("Format 0 DCI :ulsch (ue): O %d\n",ulsch->O);
|
||||
printf("Format 0 DCI : ulsch (ue): NBRB %d\n",ulsch->harq_processes[harq_pid]->nb_rb);
|
||||
printf("Format 0 DCI :ulsch (ue): first_rb %d\n",ulsch->harq_processes[harq_pid]->first_rb);
|
||||
printf("Format 0 DCI :ulsch (ue): harq_pid %d\n",harq_pid);
|
||||
printf("Format 0 DCI :ulsch (ue): round %d\n",ulsch->harq_processes[harq_pid]->round);
|
||||
printf("Format 0 DCI :ulsch (ue): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS);
|
||||
printf("Format 0 DCI :ulsch (ue): mcs %d\n",ulsch->harq_processes[harq_pid]->mcs);
|
||||
printf("Format 0 DCI :ulsch (ue): O %d\n",ulsch->O);
|
||||
|
||||
if (frame_parms->frame_type == TDD)
|
||||
msg("Format 0 DCI :ulsch (ue): O_ACK/DAI %d/%d\n",ulsch->harq_processes[harq_pid]->O_ACK,dai);
|
||||
printf("Format 0 DCI :ulsch (ue): O_ACK/DAI %d/%d\n",ulsch->harq_processes[harq_pid]->O_ACK,dai);
|
||||
else
|
||||
msg("Format 0 DCI :ulsch (ue): O_ACK %d\n",ulsch->harq_processes[harq_pid]->O_ACK);
|
||||
printf("Format 0 DCI :ulsch (ue): O_ACK %d\n",ulsch->harq_processes[harq_pid]->O_ACK);
|
||||
|
||||
msg("Format 0 DCI :ulsch (ue): Nsymb_pusch %d\n",ulsch->Nsymb_pusch);
|
||||
msg("Format 0 DCI :ulsch (ue): cshift %d\n",ulsch->harq_processes[harq_pid]->n_DMRS2);
|
||||
printf("Format 0 DCI :ulsch (ue): Nsymb_pusch %d\n",ulsch->Nsymb_pusch);
|
||||
printf("Format 0 DCI :ulsch (ue): cshift %d\n",ulsch->harq_processes[harq_pid]->n_DMRS2);
|
||||
#else
|
||||
UNUSED_VARIABLE(dai);
|
||||
#endif
|
||||
return(0);
|
||||
} else {
|
||||
LOG_E(PHY,"frame %d, subframe %d: FATAL ERROR, generate_ue_ulsch_params_from_dci, Illegal dci_format %d\n",
|
||||
phy_vars_ue->frame_rx, subframe,dci_format);
|
||||
proc->frame_rx, subframe,dci_format);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int generate_eNB_ulsch_params_from_dci(void *dci_pdu,
|
||||
int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB,
|
||||
eNB_rxtx_proc_t *proc,
|
||||
void *dci_pdu,
|
||||
uint16_t rnti,
|
||||
uint8_t sched_subframe,
|
||||
DCI_format_t dci_format,
|
||||
uint8_t UE_id,
|
||||
PHY_VARS_eNB *phy_vars_eNB,
|
||||
uint16_t si_rnti,
|
||||
uint16_t ra_rnti,
|
||||
uint16_t p_rnti,
|
||||
@@ -7032,11 +7023,11 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu,
|
||||
|
||||
uint8_t harq_pid;
|
||||
uint32_t rb_alloc;
|
||||
uint8_t transmission_mode=phy_vars_eNB->transmission_mode[UE_id];
|
||||
ANFBmode_t AckNackFBMode = phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode;
|
||||
LTE_eNB_ULSCH_t *ulsch=phy_vars_eNB->ulsch_eNB[UE_id];
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms;
|
||||
int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx;
|
||||
uint8_t transmission_mode=eNB->transmission_mode[UE_id];
|
||||
ANFBmode_t AckNackFBMode = eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode;
|
||||
LTE_eNB_ULSCH_t *ulsch=eNB->ulsch[UE_id];
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
|
||||
int subframe = proc->subframe_tx;
|
||||
|
||||
uint32_t cqi_req = 0;
|
||||
uint32_t dai = 0;
|
||||
@@ -7049,7 +7040,7 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu,
|
||||
// uint32_t type;
|
||||
|
||||
#ifdef DEBUG_DCI
|
||||
LOG_D(PHY,"filling eNB ulsch params for rnti %x, dci format %d, dci %x, subframe %d\n",
|
||||
printf("filling eNB ulsch params for rnti %x, dci format %d, dci %x, subframe %d\n",
|
||||
rnti,dci_format,*(uint32_t*)dci_pdu,subframe);
|
||||
#endif
|
||||
|
||||
@@ -7057,11 +7048,10 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu,
|
||||
|
||||
harq_pid = subframe2harq_pid(frame_parms,
|
||||
pdcch_alloc2ul_frame(frame_parms,
|
||||
phy_vars_eNB->proc[sched_subframe].frame_tx,
|
||||
proc->frame_tx,
|
||||
subframe),
|
||||
pdcch_alloc2ul_subframe(frame_parms,subframe));
|
||||
|
||||
// printf("eNB: sched_subframe %d, subframe %d, frame_tx %d\n",sched_subframe,subframe,phy_vars_eNB->proc[sched_subframe].frame_tx);
|
||||
|
||||
switch (frame_parms->N_RB_DL) {
|
||||
case 6:
|
||||
@@ -7184,7 +7174,7 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu,
|
||||
}
|
||||
|
||||
#ifdef DEBUG_DCI
|
||||
LOG_D(PHY,"generate_eNB_ulsch_params_from_dci: subframe %d, rnti %x,harq_pid %d,cqi_req %d\n",subframe,rnti,harq_pid,cqi_req);
|
||||
printf("generate_eNB_ulsch_params_from_dci: subframe %d, rnti %x,harq_pid %d,cqi_req %d\n",subframe,rnti,harq_pid,cqi_req);
|
||||
#endif
|
||||
|
||||
ulsch->harq_processes[harq_pid]->dci_alloc = 1;
|
||||
@@ -7537,7 +7527,7 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu,
|
||||
if (frame_parms->frame_type == FDD) {
|
||||
int dl_subframe = (subframe<4) ? (subframe+6) : (subframe-4);
|
||||
|
||||
if (phy_vars_eNB->dlsch_eNB[UE_id][0]->subframe_tx[dl_subframe]>0) { // we have downlink transmission
|
||||
if (eNB->dlsch[UE_id][0]->subframe_tx[dl_subframe]>0) { // we have downlink transmission
|
||||
ulsch->harq_processes[harq_pid]->O_ACK = 1;
|
||||
} else {
|
||||
ulsch->harq_processes[harq_pid]->O_ACK = 0;
|
||||
@@ -7551,9 +7541,9 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu,
|
||||
ulsch->harq_processes[harq_pid]->V_UL_DAI = dai+1;
|
||||
}
|
||||
|
||||
ulsch->beta_offset_cqi_times8 = beta_cqi[phy_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_CQI_Index];//18;
|
||||
ulsch->beta_offset_ri_times8 = beta_ri[phy_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_RI_Index];//10;
|
||||
ulsch->beta_offset_harqack_times8 = beta_ack[phy_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_ACK_Index];//16;
|
||||
ulsch->beta_offset_cqi_times8 = beta_cqi[eNB->pusch_config_dedicated[UE_id].betaOffset_CQI_Index];//18;
|
||||
ulsch->beta_offset_ri_times8 = beta_ri[eNB->pusch_config_dedicated[UE_id].betaOffset_RI_Index];//10;
|
||||
ulsch->beta_offset_harqack_times8 = beta_ack[eNB->pusch_config_dedicated[UE_id].betaOffset_ACK_Index];//16;
|
||||
|
||||
ulsch->harq_processes[harq_pid]->Nsymb_pusch = 12-(frame_parms->Ncp<<1)-(use_srs==0?0:1);
|
||||
ulsch->harq_processes[harq_pid]->srs_active = use_srs;
|
||||
@@ -7579,7 +7569,7 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu,
|
||||
|
||||
|
||||
LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d, subframe %d : Programming PUSCH with n_DMRS2 %d (cshift %d)\n",
|
||||
phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift);
|
||||
eNB->Mod_id,harq_pid,proc->frame_tx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift);
|
||||
|
||||
|
||||
|
||||
@@ -7625,15 +7615,15 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu,
|
||||
//ulsch->n_DMRS2 = cshift;
|
||||
|
||||
#ifdef DEBUG_DCI
|
||||
msg("ulsch (eNB): NBRB %d\n",ulsch->harq_processes[harq_pid]->nb_rb);
|
||||
msg("ulsch (eNB): first_rb %d\n",ulsch->harq_processes[harq_pid]->first_rb);
|
||||
msg("ulsch (eNB): harq_pid %d\n",harq_pid);
|
||||
msg("ulsch (eNB): round %d\n",ulsch->harq_processes[harq_pid]->round);
|
||||
msg("ulsch (eNB): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS);
|
||||
msg("ulsch (eNB): mcs %d\n",ulsch->harq_processes[harq_pid]->mcs);
|
||||
msg("ulsch (eNB): Or1 %d\n",ulsch->harq_processes[harq_pid]->Or1);
|
||||
msg("ulsch (eNB): Nsymb_pusch %d\n",ulsch->harq_processes[harq_pid]->Nsymb_pusch);
|
||||
msg("ulsch (eNB): cshift %d\n",ulsch->harq_processes[harq_pid]->n_DMRS2);
|
||||
printf("ulsch (eNB): NBRB %d\n",ulsch->harq_processes[harq_pid]->nb_rb);
|
||||
printf("ulsch (eNB): first_rb %d\n",ulsch->harq_processes[harq_pid]->first_rb);
|
||||
printf("ulsch (eNB): harq_pid %d\n",harq_pid);
|
||||
printf("ulsch (eNB): round %d\n",ulsch->harq_processes[harq_pid]->round);
|
||||
printf("ulsch (eNB): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS);
|
||||
printf("ulsch (eNB): mcs %d\n",ulsch->harq_processes[harq_pid]->mcs);
|
||||
printf("ulsch (eNB): Or1 %d\n",ulsch->harq_processes[harq_pid]->Or1);
|
||||
printf("ulsch (eNB): Nsymb_pusch %d\n",ulsch->harq_processes[harq_pid]->Nsymb_pusch);
|
||||
printf("ulsch (eNB): cshift %d\n",ulsch->harq_processes[harq_pid]->n_DMRS2);
|
||||
#else
|
||||
UNUSED_VARIABLE(dai);
|
||||
#endif
|
||||
@@ -7646,15 +7636,15 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu,
|
||||
}
|
||||
|
||||
|
||||
double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id)
|
||||
double sinr_eff_cqi_calc(PHY_VARS_UE *ue, uint8_t eNB_id)
|
||||
{
|
||||
uint8_t transmission_mode = phy_vars_ue->transmission_mode[eNB_id];
|
||||
PHY_MEASUREMENTS *meas = &phy_vars_ue->PHY_measurements;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms;
|
||||
int32_t **dl_channel_est = phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id];
|
||||
uint8_t transmission_mode = ue->transmission_mode[eNB_id];
|
||||
PHY_MEASUREMENTS *meas = &ue->measurements;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
||||
int32_t **dl_channel_est = ue->common_vars.dl_ch_estimates[eNB_id];
|
||||
double *s_dB;
|
||||
s_dB = phy_vars_ue->sinr_CQI_dB;
|
||||
// LTE_UE_ULSCH_t *ulsch = phy_vars_ue->ulsch_ue[eNB_id];
|
||||
s_dB = ue->sinr_CQI_dB;
|
||||
// LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id];
|
||||
//for the calculation of SINR_eff for CQI calculation
|
||||
int count,a_rx,a_tx;
|
||||
double abs_channel=0;
|
||||
@@ -7766,7 +7756,7 @@ double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id)
|
||||
break;
|
||||
|
||||
default:
|
||||
msg("Problem in SINR Calculation for TM5 \n");
|
||||
printf("Problem in SINR Calculation for TM5 \n");
|
||||
break;
|
||||
}//switch(qq)
|
||||
}//a_rx
|
||||
@@ -7832,7 +7822,7 @@ double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id)
|
||||
break;
|
||||
|
||||
default:
|
||||
msg("Problem in SINR Calculation for TM6 \n");
|
||||
printf("Problem in SINR Calculation for TM6 \n");
|
||||
break;
|
||||
}//switch(qq)
|
||||
}//a_rx
|
||||
@@ -7844,7 +7834,7 @@ double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id)
|
||||
break;
|
||||
|
||||
default:
|
||||
msg("Problem in SINR Calculation for CQI \n");
|
||||
printf("Problem in SINR Calculation for CQI \n");
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -7913,7 +7903,7 @@ double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id)
|
||||
3) + p_qam64[5]*pow(I_qam64_avg,2) + p_qam64[6]*I_qam64_avg + p_qam64[7]);
|
||||
sinr_eff = cmax3(sinr_eff_qpsk,sinr_eff_qam16,sinr_eff_qam64);
|
||||
|
||||
//msg("SINR_Eff = %e\n",sinr_eff);
|
||||
//printf("SINR_Eff = %e\n",sinr_eff);
|
||||
|
||||
return(sinr_eff);
|
||||
}
|
||||
@@ -7932,20 +7922,20 @@ main()
|
||||
|
||||
rah = 0;
|
||||
rballoc = 0x1fff;
|
||||
msg("rballoc 0 %x => %x\n",rballoc,conv_rballoc(rah,rballoc));
|
||||
printf("rballoc 0 %x => %x\n",rballoc,conv_rballoc(rah,rballoc));
|
||||
rah = 1;
|
||||
|
||||
rballoc = 0x1678;
|
||||
msg("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc));
|
||||
printf("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc));
|
||||
|
||||
rballoc = 0xfffc;
|
||||
msg("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc));
|
||||
printf("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc));
|
||||
rballoc = 0xfffd;
|
||||
msg("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc));
|
||||
printf("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc));
|
||||
rballoc = 0xffff;
|
||||
msg("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc));
|
||||
printf("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc));
|
||||
rballoc = 0xfffe;
|
||||
msg("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc));
|
||||
printf("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -114,7 +114,7 @@ typedef struct {
|
||||
/// downlink power offset field
|
||||
uint8_t dl_power_off;
|
||||
/// Concatenated "e"-sequences (for definition see 36-212 V8.6 2009-03, p.17-18)
|
||||
uint8_t e[MAX_NUM_CHANNEL_BITS];
|
||||
uint8_t e[MAX_NUM_CHANNEL_BITS] __attribute__((aligned(32)));
|
||||
/// Turbo-code outputs (36-212 V8.6 2009-03, p.12
|
||||
uint8_t *d[MAX_NUM_DLSCH_SEGMENTS];//[(96+3+(3*6144))];
|
||||
/// Sub-block interleaver outputs (36-212 V8.6 2009-03, p.16-17)
|
||||
@@ -378,7 +378,7 @@ typedef struct {
|
||||
/// coded RI bits
|
||||
int16_t q_RI[MAX_RI_PAYLOAD];
|
||||
/// Concatenated "e"-sequences (for definition see 36-212 V8.6 2009-03, p.17-18)
|
||||
int16_t e[MAX_NUM_CHANNEL_BITS];
|
||||
int16_t e[MAX_NUM_CHANNEL_BITS] __attribute__((aligned(32)));
|
||||
/// Temporary h sequence to flag PUSCH_x/PUSCH_y symbols which are not scrambled
|
||||
uint8_t h[MAX_NUM_CHANNEL_BITS];
|
||||
/// Pointer to the payload
|
||||
@@ -674,6 +674,8 @@ typedef struct {
|
||||
uint32_t Nsoft;
|
||||
/// Maximum number of Turbo iterations
|
||||
uint8_t max_turbo_iterations;
|
||||
/// number of iterations used in last turbo decoding
|
||||
uint8_t last_iteration_cnt;
|
||||
/// accumulated tx power adjustment for PUCCH
|
||||
int8_t g_pucch;
|
||||
} LTE_UE_DLSCH_t;
|
||||
@@ -690,13 +692,17 @@ typedef enum {format0,
|
||||
format2B,
|
||||
format2C,
|
||||
format2D,
|
||||
format3
|
||||
format3,
|
||||
format3A,
|
||||
format4
|
||||
} DCI_format_t;
|
||||
|
||||
typedef enum {
|
||||
SI_PDSCH=0,
|
||||
RA_PDSCH,
|
||||
P_PDSCH,
|
||||
PDSCH,
|
||||
PDSCH1,
|
||||
PMCH
|
||||
} PDSCH_t;
|
||||
|
||||
|
||||
@@ -38,35 +38,35 @@ void free_eNB_dlsch(LTE_eNB_DLSCH_t *dlsch)
|
||||
|
||||
if (dlsch) {
|
||||
#ifdef DEBUG_DLSCH_FREE
|
||||
msg("Freeing dlsch %p\n",dlsch);
|
||||
printf("Freeing dlsch %p\n",dlsch);
|
||||
#endif
|
||||
|
||||
for (i=0; i<dlsch->Mdlharq; i++) {
|
||||
#ifdef DEBUG_DLSCH_FREE
|
||||
msg("Freeing dlsch process %d\n",i);
|
||||
printf("Freeing dlsch process %d\n",i);
|
||||
#endif
|
||||
|
||||
if (dlsch->harq_processes[i]) {
|
||||
#ifdef DEBUG_DLSCH_FREE
|
||||
msg("Freeing dlsch process %d (%p)\n",i,dlsch->harq_processes[i]);
|
||||
printf("Freeing dlsch process %d (%p)\n",i,dlsch->harq_processes[i]);
|
||||
#endif
|
||||
|
||||
if (dlsch->harq_processes[i]->b) {
|
||||
free16(dlsch->harq_processes[i]->b,MAX_DLSCH_PAYLOAD_BYTES);
|
||||
dlsch->harq_processes[i]->b = NULL;
|
||||
#ifdef DEBUG_DLSCH_FREE
|
||||
msg("Freeing dlsch process %d b (%p)\n",i,dlsch->harq_processes[i]->b);
|
||||
printf("Freeing dlsch process %d b (%p)\n",i,dlsch->harq_processes[i]->b);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef DEBUG_DLSCH_FREE
|
||||
msg("Freeing dlsch process %d c (%p)\n",i,dlsch->harq_processes[i]->c);
|
||||
printf("Freeing dlsch process %d c (%p)\n",i,dlsch->harq_processes[i]->c);
|
||||
#endif
|
||||
|
||||
for (r=0; r<MAX_NUM_DLSCH_SEGMENTS; r++) {
|
||||
|
||||
#ifdef DEBUG_DLSCH_FREE
|
||||
msg("Freeing dlsch process %d c[%d] (%p)\n",i,r,dlsch->harq_processes[i]->c[r]);
|
||||
printf("Freeing dlsch process %d c[%d] (%p)\n",i,r,dlsch->harq_processes[i]->c[r]);
|
||||
#endif
|
||||
|
||||
if (dlsch->harq_processes[i]->c[r]) {
|
||||
@@ -140,7 +140,7 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_
|
||||
if (dlsch->harq_processes[i]->b) {
|
||||
bzero(dlsch->harq_processes[i]->b,MAX_DLSCH_PAYLOAD_BYTES/bw_scaling);
|
||||
} else {
|
||||
msg("Can't get b\n");
|
||||
printf("Can't get b\n");
|
||||
exit_flag=1;
|
||||
}
|
||||
|
||||
@@ -152,19 +152,19 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_
|
||||
if (dlsch->harq_processes[i]->c[r]) {
|
||||
bzero(dlsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+ 768);
|
||||
} else {
|
||||
msg("Can't get c\n");
|
||||
printf("Can't get c\n");
|
||||
exit_flag=2;
|
||||
}
|
||||
if (dlsch->harq_processes[i]->d[r]) {
|
||||
bzero(dlsch->harq_processes[i]->d[r],(96+12+3+(3*6144)));
|
||||
} else {
|
||||
msg("Can't get d\n");
|
||||
printf("Can't get d\n");
|
||||
exit_flag=2;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
msg("Can't get harq_p %d\n",i);
|
||||
printf("Can't get harq_p %d\n",i);
|
||||
exit_flag=3;
|
||||
}
|
||||
}
|
||||
@@ -225,8 +225,297 @@ void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch)
|
||||
}
|
||||
|
||||
|
||||
int dlsch_encoding(unsigned char *a,
|
||||
LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int dlsch_encoding_2threads0(te_params *tep) {
|
||||
|
||||
LTE_eNB_DLSCH_t *dlsch = tep->dlsch;
|
||||
unsigned int G = tep->G;
|
||||
|
||||
unsigned short iind;
|
||||
unsigned char harq_pid = dlsch->current_harq_pid;
|
||||
unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb;
|
||||
unsigned int Kr=0,Kr_bytes,r,r_offset=0;
|
||||
unsigned short m=dlsch->harq_processes[harq_pid]->mcs;
|
||||
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING_W, VCD_FUNCTION_IN);
|
||||
|
||||
if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet
|
||||
|
||||
for (r=0; r<dlsch->harq_processes[harq_pid]->C>>1; r++) {
|
||||
|
||||
if (r<dlsch->harq_processes[harq_pid]->Cminus)
|
||||
Kr = dlsch->harq_processes[harq_pid]->Kminus;
|
||||
else
|
||||
Kr = dlsch->harq_processes[harq_pid]->Kplus;
|
||||
|
||||
Kr_bytes = Kr>>3;
|
||||
|
||||
// get interleaver index for Turbo code (lookup in Table 5.1.3-3 36-212, V8.6 2009-03, p. 13-14)
|
||||
if (Kr_bytes<=64)
|
||||
iind = (Kr_bytes-5);
|
||||
else if (Kr_bytes <=128)
|
||||
iind = 59 + ((Kr_bytes-64)>>1);
|
||||
else if (Kr_bytes <= 256)
|
||||
iind = 91 + ((Kr_bytes-128)>>2);
|
||||
else if (Kr_bytes <= 768)
|
||||
iind = 123 + ((Kr_bytes-256)>>3);
|
||||
else {
|
||||
printf("dlsch_coding: Illegal codeword size %d!!!\n",Kr_bytes);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
threegpplte_turbo_encoder(dlsch->harq_processes[harq_pid]->c[r],
|
||||
Kr>>3,
|
||||
&dlsch->harq_processes[harq_pid]->d[r][96],
|
||||
(r==0) ? dlsch->harq_processes[harq_pid]->F : 0,
|
||||
f1f2mat_old[iind*2], // f1 (see 36121-820, page 14)
|
||||
f1f2mat_old[(iind*2)+1] // f2 (see 36121-820, page 14)
|
||||
);
|
||||
dlsch->harq_processes[harq_pid]->RTC[r] =
|
||||
sub_block_interleaving_turbo(4+(Kr_bytes*8),
|
||||
&dlsch->harq_processes[harq_pid]->d[r][96],
|
||||
dlsch->harq_processes[harq_pid]->w[r]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the
|
||||
// outputs for each code segment, see Section 5.1.5 p.20
|
||||
|
||||
for (r=0; r<dlsch->harq_processes[harq_pid]->C>>1; r++) {
|
||||
r_offset += lte_rate_matching_turbo(dlsch->harq_processes[harq_pid]->RTC[r],
|
||||
G, //G
|
||||
dlsch->harq_processes[harq_pid]->w[r],
|
||||
dlsch->harq_processes[harq_pid]->e+r_offset,
|
||||
dlsch->harq_processes[harq_pid]->C, // C
|
||||
dlsch->Nsoft, // Nsoft,
|
||||
dlsch->Mdlharq,
|
||||
dlsch->Kmimo,
|
||||
dlsch->harq_processes[harq_pid]->rvidx,
|
||||
get_Qm(dlsch->harq_processes[harq_pid]->mcs),
|
||||
dlsch->harq_processes[harq_pid]->Nl,
|
||||
r,
|
||||
nb_rb,
|
||||
m); // r
|
||||
}
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING_W, VCD_FUNCTION_OUT);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
extern int oai_exit;
|
||||
void *te_thread(void *param) {
|
||||
|
||||
eNB_proc_t *proc = &((te_params *)param)->eNB->proc;
|
||||
while (!oai_exit) {
|
||||
|
||||
|
||||
if (wait_on_condition(&proc->mutex_te,&proc->cond_te,&proc->instance_cnt_te,"te thread")<0) break;
|
||||
|
||||
dlsch_encoding_2threads0((te_params*)param);
|
||||
|
||||
|
||||
if (release_thread(&proc->mutex_te,&proc->instance_cnt_te,"te thread")<0) break;
|
||||
|
||||
if (pthread_cond_signal(&proc->cond_te) != 0) {
|
||||
printf("[eNB] ERROR pthread_cond_signal for te thread exit\n");
|
||||
exit_fun( "ERROR pthread_cond_signal" );
|
||||
return(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
|
||||
unsigned char *a,
|
||||
uint8_t num_pdcch_symbols,
|
||||
LTE_eNB_DLSCH_t *dlsch,
|
||||
int frame,
|
||||
uint8_t subframe,
|
||||
time_stats_t *rm_stats,
|
||||
time_stats_t *te_stats,
|
||||
time_stats_t *i_stats)
|
||||
{
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
|
||||
eNB_proc_t *proc = &eNB->proc;
|
||||
unsigned int G;
|
||||
unsigned int crc=1;
|
||||
unsigned short iind;
|
||||
|
||||
unsigned char harq_pid = dlsch->current_harq_pid;
|
||||
unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb;
|
||||
unsigned int A;
|
||||
unsigned char mod_order;
|
||||
unsigned int Kr=0,Kr_bytes,r,r_offset=0;
|
||||
unsigned short m=dlsch->harq_processes[harq_pid]->mcs;
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN);
|
||||
|
||||
A = dlsch->harq_processes[harq_pid]->TBS; //6228
|
||||
mod_order = get_Qm(dlsch->harq_processes[harq_pid]->mcs);
|
||||
G = get_G(frame_parms,nb_rb,dlsch->harq_processes[harq_pid]->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe);
|
||||
|
||||
|
||||
if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet
|
||||
|
||||
// Add 24-bit crc (polynomial A) to payload
|
||||
crc = crc24a(a,
|
||||
A)>>8;
|
||||
a[A>>3] = ((uint8_t*)&crc)[2];
|
||||
a[1+(A>>3)] = ((uint8_t*)&crc)[1];
|
||||
a[2+(A>>3)] = ((uint8_t*)&crc)[0];
|
||||
|
||||
dlsch->harq_processes[harq_pid]->B = A+24;
|
||||
memcpy(dlsch->harq_processes[harq_pid]->b,a,(A/8)+4);
|
||||
|
||||
if (lte_segmentation(dlsch->harq_processes[harq_pid]->b,
|
||||
dlsch->harq_processes[harq_pid]->c,
|
||||
dlsch->harq_processes[harq_pid]->B,
|
||||
&dlsch->harq_processes[harq_pid]->C,
|
||||
&dlsch->harq_processes[harq_pid]->Cplus,
|
||||
&dlsch->harq_processes[harq_pid]->Cminus,
|
||||
&dlsch->harq_processes[harq_pid]->Kplus,
|
||||
&dlsch->harq_processes[harq_pid]->Kminus,
|
||||
&dlsch->harq_processes[harq_pid]->F)<0)
|
||||
return(-1);
|
||||
|
||||
|
||||
|
||||
if (proc->instance_cnt_te==0) {
|
||||
printf("[eNB] TE thread busy\n");
|
||||
exit_fun("TE thread busy");
|
||||
pthread_mutex_unlock( &proc->mutex_te );
|
||||
return(-1);
|
||||
}
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT);
|
||||
++proc->instance_cnt_te;
|
||||
|
||||
proc->tep.eNB = eNB;
|
||||
proc->tep.dlsch = dlsch;
|
||||
proc->tep.G = G;
|
||||
|
||||
// wakeup worker to do second half segments
|
||||
if (pthread_cond_signal(&proc->cond_te) != 0) {
|
||||
printf("[eNB] ERROR pthread_cond_signal for te thread exit\n");
|
||||
exit_fun( "ERROR pthread_cond_signal" );
|
||||
return (-1);
|
||||
}
|
||||
|
||||
pthread_mutex_unlock( &proc->mutex_te );
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN);
|
||||
for (r=dlsch->harq_processes[harq_pid]->C>>1; r<dlsch->harq_processes[harq_pid]->C; r++) {
|
||||
|
||||
if (r<dlsch->harq_processes[harq_pid]->Cminus)
|
||||
Kr = dlsch->harq_processes[harq_pid]->Kminus;
|
||||
else
|
||||
Kr = dlsch->harq_processes[harq_pid]->Kplus;
|
||||
|
||||
Kr_bytes = Kr>>3;
|
||||
|
||||
// get interleaver index for Turbo code (lookup in Table 5.1.3-3 36-212, V8.6 2009-03, p. 13-14)
|
||||
if (Kr_bytes<=64)
|
||||
iind = (Kr_bytes-5);
|
||||
else if (Kr_bytes <=128)
|
||||
iind = 59 + ((Kr_bytes-64)>>1);
|
||||
else if (Kr_bytes <= 256)
|
||||
iind = 91 + ((Kr_bytes-128)>>2);
|
||||
else if (Kr_bytes <= 768)
|
||||
iind = 123 + ((Kr_bytes-256)>>3);
|
||||
else {
|
||||
printf("dlsch_coding: Illegal codeword size %d!!!\n",Kr_bytes);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
|
||||
start_meas(te_stats);
|
||||
threegpplte_turbo_encoder(dlsch->harq_processes[harq_pid]->c[r],
|
||||
Kr>>3,
|
||||
&dlsch->harq_processes[harq_pid]->d[r][96],
|
||||
(r==0) ? dlsch->harq_processes[harq_pid]->F : 0,
|
||||
f1f2mat_old[iind*2], // f1 (see 36121-820, page 14)
|
||||
f1f2mat_old[(iind*2)+1] // f2 (see 36121-820, page 14)
|
||||
);
|
||||
stop_meas(te_stats);
|
||||
|
||||
start_meas(i_stats);
|
||||
dlsch->harq_processes[harq_pid]->RTC[r] =
|
||||
sub_block_interleaving_turbo(4+(Kr_bytes*8),
|
||||
&dlsch->harq_processes[harq_pid]->d[r][96],
|
||||
dlsch->harq_processes[harq_pid]->w[r]);
|
||||
stop_meas(i_stats);
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
|
||||
proc->tep.eNB = eNB;
|
||||
proc->tep.dlsch = dlsch;
|
||||
proc->tep.G = G;
|
||||
|
||||
// wakeup worker to do second half segments
|
||||
if (pthread_cond_signal(&proc->cond_te) != 0) {
|
||||
printf("[eNB] ERROR pthread_cond_signal for te thread exit\n");
|
||||
exit_fun( "ERROR pthread_cond_signal" );
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
// Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the
|
||||
// outputs for each code segment, see Section 5.1.5 p.20
|
||||
|
||||
for (r=0,r_offset=0; r<dlsch->harq_processes[harq_pid]->C; r++) {
|
||||
|
||||
// get information for E for the segments that are handled by the worker thread
|
||||
if (r<(dlsch->harq_processes[harq_pid]->C>>1)) {
|
||||
int Nl=dlsch->harq_processes[harq_pid]->Nl;
|
||||
int Qm=get_Qm(dlsch->harq_processes[harq_pid]->mcs);
|
||||
int C = dlsch->harq_processes[harq_pid]->C;
|
||||
int Gp = G/Nl/Qm;
|
||||
int GpmodC = Gp%C;
|
||||
if (r < (C-(GpmodC)))
|
||||
r_offset += Nl*Qm * (Gp/C);
|
||||
else
|
||||
r_offset += Nl*Qm * ((GpmodC==0?0:1) + (Gp/C));
|
||||
}
|
||||
else {
|
||||
start_meas(rm_stats);
|
||||
r_offset += lte_rate_matching_turbo(dlsch->harq_processes[harq_pid]->RTC[r],
|
||||
G, //G
|
||||
dlsch->harq_processes[harq_pid]->w[r],
|
||||
dlsch->harq_processes[harq_pid]->e+r_offset,
|
||||
dlsch->harq_processes[harq_pid]->C, // C
|
||||
dlsch->Nsoft, // Nsoft,
|
||||
dlsch->Mdlharq,
|
||||
dlsch->Kmimo,
|
||||
dlsch->harq_processes[harq_pid]->rvidx,
|
||||
get_Qm(dlsch->harq_processes[harq_pid]->mcs),
|
||||
dlsch->harq_processes[harq_pid]->Nl,
|
||||
r,
|
||||
nb_rb,
|
||||
m); // r
|
||||
stop_meas(rm_stats);
|
||||
}
|
||||
}
|
||||
|
||||
// wait for worker to finish
|
||||
|
||||
wait_on_busy_condition(&proc->mutex_te,&proc->cond_te,&proc->instance_cnt_te,"te thread");
|
||||
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
int dlsch_encoding(PHY_VARS_eNB *eNB,
|
||||
unsigned char *a,
|
||||
uint8_t num_pdcch_symbols,
|
||||
LTE_eNB_DLSCH_t *dlsch,
|
||||
int frame,
|
||||
@@ -240,6 +529,7 @@ int dlsch_encoding(unsigned char *a,
|
||||
unsigned int crc=1;
|
||||
unsigned short iind;
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
|
||||
unsigned char harq_pid = dlsch->current_harq_pid;
|
||||
unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb;
|
||||
unsigned int A;
|
||||
@@ -290,6 +580,7 @@ int dlsch_encoding(unsigned char *a,
|
||||
return(-1);
|
||||
|
||||
for (r=0; r<dlsch->harq_processes[harq_pid]->C; r++) {
|
||||
|
||||
if (r<dlsch->harq_processes[harq_pid]->Cminus)
|
||||
Kr = dlsch->harq_processes[harq_pid]->Kminus;
|
||||
else
|
||||
@@ -307,7 +598,7 @@ int dlsch_encoding(unsigned char *a,
|
||||
else if (Kr_bytes <= 768)
|
||||
iind = 123 + ((Kr_bytes-256)>>3);
|
||||
else {
|
||||
msg("dlsch_coding: Illegal codeword size %d!!!\n",Kr_bytes);
|
||||
printf("dlsch_coding: Illegal codeword size %d!!!\n",Kr_bytes);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
@@ -316,15 +607,15 @@ int dlsch_encoding(unsigned char *a,
|
||||
printf("Generating Code Segment %d (%d bits)\n",r,Kr);
|
||||
// generate codewords
|
||||
|
||||
msg("bits_per_codeword (Kr)= %d, A %d\n",Kr,A);
|
||||
msg("N_RB = %d\n",nb_rb);
|
||||
msg("Ncp %d\n",frame_parms->Ncp);
|
||||
msg("mod_order %d\n",mod_order);
|
||||
printf("bits_per_codeword (Kr)= %d, A %d\n",Kr,A);
|
||||
printf("N_RB = %d\n",nb_rb);
|
||||
printf("Ncp %d\n",frame_parms->Ncp);
|
||||
printf("mod_order %d\n",mod_order);
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef DEBUG_DLSCH_CODING
|
||||
msg("Encoding ... iind %d f1 %d, f2 %d\n",iind,f1f2mat_old[iind*2],f1f2mat_old[(iind*2)+1]);
|
||||
printf("Encoding ... iind %d f1 %d, f2 %d\n",iind,f1f2mat_old[iind*2],f1f2mat_old[(iind*2)+1]);
|
||||
#endif
|
||||
start_meas(te_stats);
|
||||
threegpplte_turbo_encoder(dlsch->harq_processes[harq_pid]->c[r],
|
||||
@@ -356,7 +647,7 @@ int dlsch_encoding(unsigned char *a,
|
||||
|
||||
for (r=0; r<dlsch->harq_processes[harq_pid]->C; r++) {
|
||||
#ifdef DEBUG_DLSCH_CODING
|
||||
msg("Rate Matching, Code segment %d (coded bits (G) %d,unpunctured/repeated bits per code segment %d,mod_order %d, nb_rb %d)...\n",
|
||||
printf("Rate Matching, Code segment %d (coded bits (G) %d,unpunctured/repeated bits per code segment %d,mod_order %d, nb_rb %d)...\n",
|
||||
r,
|
||||
G,
|
||||
Kr*3,
|
||||
|
||||
@@ -159,7 +159,8 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
|
||||
#ifdef DEBUG_DLSCH_DECODING
|
||||
uint16_t i;
|
||||
#endif
|
||||
#ifdef __AVX2__
|
||||
//#ifdef __AVX2__
|
||||
#if 0
|
||||
int Kr_last,skipped_last=0;
|
||||
uint8_t (*tc_2cw)(int16_t *y,
|
||||
int16_t *y2,
|
||||
@@ -220,7 +221,8 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
|
||||
}
|
||||
|
||||
if (llr8_flag == 0) {
|
||||
#ifdef __AVX2__
|
||||
//#ifdef __AVX2__
|
||||
#if 0
|
||||
tc_2cw = phy_threegpplte_turbo_decoder16avx2;
|
||||
#endif
|
||||
tc = phy_threegpplte_turbo_decoder16;
|
||||
@@ -639,6 +641,8 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
|
||||
}
|
||||
}
|
||||
|
||||
dlsch->last_iteration_cnt = ret;
|
||||
|
||||
return(ret);
|
||||
}
|
||||
|
||||
@@ -783,7 +787,7 @@ int dlsch_abstraction_MIESM(double* sinr_dB,uint8_t TM, uint32_t rb_alloc[4], ui
|
||||
|
||||
uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
|
||||
uint8_t subframe,
|
||||
uint8_t dlsch_id,
|
||||
PDSCH_t dlsch_id,
|
||||
uint8_t eNB_id)
|
||||
{
|
||||
|
||||
@@ -799,7 +803,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
|
||||
|
||||
// may not be necessary for PMCH??
|
||||
for (eNB_id2=0; eNB_id2<NB_eNB_INST; eNB_id2++) {
|
||||
if (PHY_vars_eNB_g[eNB_id2][CC_id]->lte_frame_parms.Nid_cell == phy_vars_ue->lte_frame_parms.Nid_cell)
|
||||
if (PHY_vars_eNB_g[eNB_id2][CC_id]->frame_parms.Nid_cell == phy_vars_ue->frame_parms.Nid_cell)
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -814,9 +818,9 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
|
||||
|
||||
|
||||
switch (dlsch_id) {
|
||||
case 0: // SI
|
||||
dlsch_ue = phy_vars_ue->dlsch_ue_SI[eNB_id];
|
||||
dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch_eNB_SI;
|
||||
case SI_PDSCH: // SI
|
||||
dlsch_ue = phy_vars_ue->dlsch_SI[eNB_id];
|
||||
dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch_SI;
|
||||
// printf("Doing SI: TBS %d\n",dlsch_ue->harq_processes[0]->TBS>>3);
|
||||
memcpy(dlsch_ue->harq_processes[0]->b,dlsch_eNB->harq_processes[0]->b,dlsch_ue->harq_processes[0]->TBS>>3);
|
||||
#ifdef DEBUG_DLSCH_DECODING
|
||||
@@ -830,9 +834,9 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
|
||||
return(1);
|
||||
break;
|
||||
|
||||
case 1: // RA
|
||||
dlsch_ue = phy_vars_ue->dlsch_ue_ra[eNB_id];
|
||||
dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch_eNB_ra;
|
||||
case RA_PDSCH: // RA
|
||||
dlsch_ue = phy_vars_ue->dlsch_ra[eNB_id];
|
||||
dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch_ra;
|
||||
memcpy(dlsch_ue->harq_processes[0]->b,dlsch_eNB->harq_processes[0]->b,dlsch_ue->harq_processes[0]->TBS>>3);
|
||||
#ifdef DEBUG_DLSCH_DECODING
|
||||
LOG_D(PHY,"RA Decoded\n");
|
||||
@@ -845,12 +849,12 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
|
||||
return(1);
|
||||
break;
|
||||
|
||||
case 2: // TB0
|
||||
dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id][0];
|
||||
case PDSCH: // TB0
|
||||
dlsch_ue = phy_vars_ue->dlsch[eNB_id][0];
|
||||
harq_pid = dlsch_ue->current_harq_pid;
|
||||
ue_id= (uint32_t)find_ue((int16_t)phy_vars_ue->lte_ue_pdcch_vars[(uint32_t)eNB_id]->crnti,PHY_vars_eNB_g[eNB_id2][CC_id]);
|
||||
ue_id= (uint32_t)find_ue((int16_t)phy_vars_ue->pdcch_vars[(uint32_t)eNB_id]->crnti,PHY_vars_eNB_g[eNB_id2][CC_id]);
|
||||
DevAssert( ue_id != (uint32_t)-1 );
|
||||
dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch_eNB[ue_id][0];
|
||||
dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch[ue_id][0];
|
||||
|
||||
#ifdef DEBUG_DLSCH_DECODING
|
||||
|
||||
@@ -885,17 +889,18 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
|
||||
dlsch_ue->harq_ack[subframe].ack = 0;
|
||||
dlsch_ue->harq_ack[subframe].harq_id = harq_pid;
|
||||
dlsch_ue->harq_ack[subframe].send_harq_status = 1;
|
||||
dlsch_ue->last_iteration_cnt = 1+dlsch_ue->max_turbo_iterations;
|
||||
return(1+dlsch_ue->max_turbo_iterations);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 3: { // TB1
|
||||
dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id][1];
|
||||
case PDSCH1: { // TB1
|
||||
dlsch_ue = phy_vars_ue->dlsch[eNB_id][1];
|
||||
harq_pid = dlsch_ue->current_harq_pid;
|
||||
int8_t UE_id = find_ue( phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti, PHY_vars_eNB_g[eNB_id2][CC_id] );
|
||||
int8_t UE_id = find_ue( phy_vars_ue->pdcch_vars[eNB_id]->crnti, PHY_vars_eNB_g[eNB_id2][CC_id] );
|
||||
DevAssert( UE_id != -1 );
|
||||
dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch_eNB[UE_id][1];
|
||||
dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch[UE_id][1];
|
||||
// reset HARQ
|
||||
dlsch_ue->harq_processes[harq_pid]->status = SCH_IDLE;
|
||||
dlsch_ue->harq_processes[harq_pid]->round = 0;
|
||||
@@ -909,10 +914,10 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
|
||||
break;
|
||||
}
|
||||
|
||||
case 5: // PMCH
|
||||
case PMCH: // PMCH
|
||||
|
||||
dlsch_ue = phy_vars_ue->dlsch_ue_MCH[eNB_id];
|
||||
dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch_eNB_MCH;
|
||||
dlsch_ue = phy_vars_ue->dlsch_MCH[eNB_id];
|
||||
dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch_MCH;
|
||||
|
||||
LOG_D(PHY,"decoding pmch emul (size is %d, enb %d %d)\n", dlsch_ue->harq_processes[0]->TBS>>3, eNB_id, eNB_id2);
|
||||
#ifdef DEBUG_DLSCH_DECODING
|
||||
@@ -934,17 +939,20 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
|
||||
memcpy(dlsch_ue->harq_processes[0]->b,
|
||||
dlsch_eNB->harq_processes[0]->b,
|
||||
dlsch_ue->harq_processes[0]->TBS>>3);
|
||||
dlsch_ue->last_iteration_cnt = 1;
|
||||
return(1);
|
||||
} else {
|
||||
// retransmission
|
||||
dlsch_ue->last_iteration_cnt = 1+dlsch_ue->max_turbo_iterations;
|
||||
return(1+dlsch_ue->max_turbo_iterations);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id][0];
|
||||
dlsch_ue = phy_vars_ue->dlsch[eNB_id][0];
|
||||
LOG_E(PHY,"dlsch_decoding_emul: FATAL, unknown DLSCH_id %d\n",dlsch_id);
|
||||
dlsch_ue->last_iteration_cnt = 1+dlsch_ue->max_turbo_iterations;
|
||||
return(1+dlsch_ue->max_turbo_iterations);
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -832,7 +832,7 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
|
||||
len_mod4 =len&3;
|
||||
len2=len>>2; // length in quad words (4 REs)
|
||||
len2+=(len_mod4?0:1);
|
||||
len2+=((len_mod4==0)?0:1);
|
||||
|
||||
for (i=0; i<len2; i++) {
|
||||
|
||||
|
||||
@@ -107,6 +107,389 @@ void layer1prec2A(int32_t *antenna0_sample, int32_t *antenna1_sample, uint8_t pr
|
||||
((int16_t *)antenna1_sample)[1] = (int16_t)((((int16_t *)antenna1_sample)[1]*ONE_OVER_SQRT2_Q15)>>15); */
|
||||
}
|
||||
|
||||
uint32_t FOUR[2]={0,4};
|
||||
uint32_t TWO[2]={0,2};
|
||||
|
||||
int allocate_REs_in_RB_no_pilots_16QAM_siso(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int **txdataF,
|
||||
uint32_t *jj,
|
||||
uint32_t *jj2,
|
||||
uint16_t re_offset,
|
||||
uint32_t symbol_offset,
|
||||
LTE_DL_eNB_HARQ_t *dlsch0_harq,
|
||||
LTE_DL_eNB_HARQ_t *dlsch1_harq,
|
||||
uint8_t pilots,
|
||||
int16_t amp,
|
||||
uint8_t precoder_index,
|
||||
int16_t *qam_table_s0,
|
||||
int16_t *qam_table_s1,
|
||||
uint32_t *re_allocated,
|
||||
uint8_t skip_dc,
|
||||
uint8_t skip_half,
|
||||
int *P1_SHIFT,
|
||||
int *P2_SHIFT)
|
||||
{
|
||||
|
||||
|
||||
uint8_t *x0 = dlsch0_harq->e;
|
||||
uint32_t qam16_table_offset_re = 0;
|
||||
uint32_t qam16_table_offset_im = 0;
|
||||
|
||||
uint32_t tti_offset;
|
||||
uint8_t re;
|
||||
uint8_t *x0p;
|
||||
|
||||
if (skip_dc == 0) {
|
||||
for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0;
|
||||
re<12;
|
||||
re++,x0p+=4,tti_offset++) {
|
||||
|
||||
qam16_table_offset_re=TWO[x0p[0]];
|
||||
qam16_table_offset_im=TWO[x0p[1]];
|
||||
qam16_table_offset_re+=x0p[2];
|
||||
qam16_table_offset_im+=x0p[3];
|
||||
((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam16_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam16_table_offset_im];
|
||||
}
|
||||
}
|
||||
else {
|
||||
// 1st half of PRB
|
||||
for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0;
|
||||
re<6;
|
||||
re++,x0p+=4,tti_offset++) {
|
||||
|
||||
qam16_table_offset_re=TWO[x0p[0]];
|
||||
qam16_table_offset_im=TWO[x0p[1]];
|
||||
qam16_table_offset_re+=x0p[2];
|
||||
qam16_table_offset_im+=x0p[3];
|
||||
((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam16_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam16_table_offset_im];
|
||||
}
|
||||
// 2nd half of PRB
|
||||
for (tti_offset=symbol_offset+re_offset-frame_parms->ofdm_symbol_size+7;
|
||||
re<12;
|
||||
re++,x0p+=4,tti_offset++) {
|
||||
|
||||
qam16_table_offset_re=TWO[x0p[0]];
|
||||
qam16_table_offset_im=TWO[x0p[1]];
|
||||
qam16_table_offset_re+=x0p[2];
|
||||
qam16_table_offset_im+=x0p[3];
|
||||
((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam16_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam16_table_offset_im];
|
||||
}
|
||||
}
|
||||
*re_allocated = *re_allocated + 12;
|
||||
*jj=*jj + 48;
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
int allocate_REs_in_RB_pilots_16QAM_siso(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int **txdataF,
|
||||
uint32_t *jj,
|
||||
uint32_t *jj2,
|
||||
uint16_t re_offset,
|
||||
uint32_t symbol_offset,
|
||||
LTE_DL_eNB_HARQ_t *dlsch0_harq,
|
||||
LTE_DL_eNB_HARQ_t *dlsch1_harq,
|
||||
uint8_t pilots,
|
||||
int16_t amp,
|
||||
uint8_t precoder_index,
|
||||
int16_t *qam_table_s0,
|
||||
int16_t *qam_table_s1,
|
||||
uint32_t *re_allocated,
|
||||
uint8_t skip_dc,
|
||||
uint8_t skip_half,
|
||||
int *P1_SHIFT,
|
||||
int *P2_SHIFT)
|
||||
{
|
||||
|
||||
|
||||
uint8_t *x0 = dlsch0_harq->e;
|
||||
uint32_t qam16_table_offset_re = 0;
|
||||
uint32_t qam16_table_offset_im = 0;
|
||||
|
||||
uint32_t tti_offset;
|
||||
uint8_t re;
|
||||
uint8_t *x0p;
|
||||
|
||||
|
||||
if (skip_dc == 0) {
|
||||
// printf("pilots: P1_SHIFT[0] %d\n",P1_SHIFT[0]);
|
||||
for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0];
|
||||
re<12;
|
||||
x0p+=4) {
|
||||
|
||||
qam16_table_offset_re=TWO[x0p[0]];
|
||||
qam16_table_offset_im=TWO[x0p[1]];
|
||||
qam16_table_offset_re+=x0p[2];
|
||||
qam16_table_offset_im+=x0p[3];
|
||||
((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam16_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam16_table_offset_im];
|
||||
// printf("pilots: re %d, tti_offset %d, P1_SHIFT %d\n",re,tti_offset,P1_SHIFT[re+1]);
|
||||
tti_offset+=P1_SHIFT[re+1];
|
||||
re+=P1_SHIFT[re+1];
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0];
|
||||
re<6;
|
||||
x0p+=4) {
|
||||
|
||||
qam16_table_offset_re=TWO[x0p[0]];
|
||||
qam16_table_offset_im=TWO[x0p[1]];
|
||||
qam16_table_offset_re+=x0p[2];
|
||||
qam16_table_offset_im+=x0p[3];
|
||||
((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam16_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam16_table_offset_im];
|
||||
tti_offset+=P1_SHIFT[re+1];
|
||||
re+=P1_SHIFT[re+1];
|
||||
}
|
||||
|
||||
for (tti_offset=symbol_offset+re_offset-frame_parms->ofdm_symbol_size+6+P1_SHIFT[6];
|
||||
re<12;
|
||||
x0p+=4) {
|
||||
|
||||
qam16_table_offset_re=TWO[x0p[0]];
|
||||
qam16_table_offset_im=TWO[x0p[1]];
|
||||
qam16_table_offset_re+=x0p[2];
|
||||
qam16_table_offset_im+=x0p[3];
|
||||
((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam16_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam16_table_offset_im];
|
||||
tti_offset+=P1_SHIFT[re+1];
|
||||
re+=P1_SHIFT[re+1];
|
||||
}
|
||||
}
|
||||
*re_allocated = *re_allocated + 10;
|
||||
*jj=*jj + 40;
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
int allocate_REs_in_RB_no_pilots_64QAM_siso(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int **txdataF,
|
||||
uint32_t *jj,
|
||||
uint32_t *jj2,
|
||||
uint16_t re_offset,
|
||||
uint32_t symbol_offset,
|
||||
LTE_DL_eNB_HARQ_t *dlsch0_harq,
|
||||
LTE_DL_eNB_HARQ_t *dlsch1_harq,
|
||||
uint8_t pilots,
|
||||
int16_t amp,
|
||||
uint8_t precoder_index,
|
||||
int16_t *qam_table_s0,
|
||||
int16_t *qam_table_s1,
|
||||
uint32_t *re_allocated,
|
||||
uint8_t skip_dc,
|
||||
uint8_t skip_half,
|
||||
int *P1_SHIFT,
|
||||
int *P2_SHIFT)
|
||||
{
|
||||
|
||||
|
||||
uint8_t *x0 = dlsch0_harq->e;
|
||||
uint32_t qam64_table_offset_re = 0;
|
||||
uint32_t qam64_table_offset_im = 0;
|
||||
|
||||
uint32_t tti_offset;
|
||||
uint8_t re;
|
||||
uint8_t *x0p;
|
||||
|
||||
if (skip_dc == 0) {
|
||||
|
||||
x0p=&x0[*jj],tti_offset=symbol_offset+re_offset;
|
||||
|
||||
/* for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0;
|
||||
re<12;
|
||||
re+=4,x0p+=24,tti_offset+=4) {*/
|
||||
|
||||
qam64_table_offset_re=(x0p[0]<<2)|(x0p[2]<<1)|x0p[4];
|
||||
qam64_table_offset_im=(x0p[1]<<2)|(x0p[3]<<1)|x0p[5];
|
||||
((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam64_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam64_table_offset_im];
|
||||
|
||||
qam64_table_offset_re=(x0p[6]<<2)|(x0p[8]<<1)|x0p[10];
|
||||
qam64_table_offset_im=(x0p[7]<<2)|(x0p[9]<<1)|x0p[11];
|
||||
((int16_t *)&txdataF[0][tti_offset])[2]=qam_table_s0[qam64_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[3]=qam_table_s0[qam64_table_offset_im];
|
||||
|
||||
qam64_table_offset_re=(x0p[12]<<2)|(x0p[14]<<1)|x0p[16];
|
||||
qam64_table_offset_im=(x0p[13]<<2)|(x0p[15]<<1)|x0p[17];
|
||||
((int16_t *)&txdataF[0][tti_offset])[4]=qam_table_s0[qam64_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[5]=qam_table_s0[qam64_table_offset_im];
|
||||
|
||||
qam64_table_offset_re=(x0p[18]<<2)|(x0p[20]<<1)|x0p[22];
|
||||
qam64_table_offset_im=(x0p[19]<<2)|(x0p[21]<<1)|x0p[23];
|
||||
((int16_t *)&txdataF[0][tti_offset])[6]=qam_table_s0[qam64_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[7]=qam_table_s0[qam64_table_offset_im];
|
||||
|
||||
qam64_table_offset_re=(x0p[24]<<2)|(x0p[26]<<1)|x0p[28];
|
||||
qam64_table_offset_im=(x0p[25]<<2)|(x0p[27]<<1)|x0p[29];
|
||||
((int16_t *)&txdataF[0][tti_offset])[8]=qam_table_s0[qam64_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[9]=qam_table_s0[qam64_table_offset_im];
|
||||
|
||||
qam64_table_offset_re=(x0p[30]<<2)|(x0p[32]<<1)|x0p[34];
|
||||
qam64_table_offset_im=(x0p[31]<<2)|(x0p[33]<<1)|x0p[35];
|
||||
((int16_t *)&txdataF[0][tti_offset])[10]=qam_table_s0[qam64_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[11]=qam_table_s0[qam64_table_offset_im];
|
||||
|
||||
qam64_table_offset_re=(x0p[36]<<2)|(x0p[38]<<1)|x0p[40];
|
||||
qam64_table_offset_im=(x0p[37]<<2)|(x0p[39]<<1)|x0p[41];
|
||||
((int16_t *)&txdataF[0][tti_offset])[12]=qam_table_s0[qam64_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[13]=qam_table_s0[qam64_table_offset_im];
|
||||
|
||||
qam64_table_offset_re=(x0p[42]<<2)|(x0p[44]<<1)|x0p[46];
|
||||
qam64_table_offset_im=(x0p[43]<<2)|(x0p[45]<<1)|x0p[47];
|
||||
((int16_t *)&txdataF[0][tti_offset])[14]=qam_table_s0[qam64_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[15]=qam_table_s0[qam64_table_offset_im];
|
||||
|
||||
qam64_table_offset_re=(x0p[48]<<2)|(x0p[50]<<1)|x0p[52];
|
||||
qam64_table_offset_im=(x0p[49]<<2)|(x0p[51]<<1)|x0p[53];
|
||||
((int16_t *)&txdataF[0][tti_offset])[16]=qam_table_s0[qam64_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[17]=qam_table_s0[qam64_table_offset_im];
|
||||
|
||||
qam64_table_offset_re=(x0p[54]<<2)|(x0p[56]<<1)|x0p[58];
|
||||
qam64_table_offset_im=(x0p[55]<<2)|(x0p[57]<<1)|x0p[59];
|
||||
((int16_t *)&txdataF[0][tti_offset])[18]=qam_table_s0[qam64_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[19]=qam_table_s0[qam64_table_offset_im];
|
||||
|
||||
qam64_table_offset_re=(x0p[60]<<2)|(x0p[62]<<1)|x0p[64];
|
||||
qam64_table_offset_im=(x0p[61]<<2)|(x0p[63]<<1)|x0p[65];
|
||||
((int16_t *)&txdataF[0][tti_offset])[20]=qam_table_s0[qam64_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[21]=qam_table_s0[qam64_table_offset_im];
|
||||
|
||||
qam64_table_offset_re=(x0p[66]<<2)|(x0p[68]<<1)|x0p[70];
|
||||
qam64_table_offset_im=(x0p[67]<<2)|(x0p[69]<<1)|x0p[71];
|
||||
((int16_t *)&txdataF[0][tti_offset])[22]=qam_table_s0[qam64_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[23]=qam_table_s0[qam64_table_offset_im];
|
||||
|
||||
|
||||
// }
|
||||
}
|
||||
else {
|
||||
for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0;
|
||||
re<6;
|
||||
re++,x0p+=6,tti_offset++) {
|
||||
|
||||
qam64_table_offset_re=FOUR[x0p[0]];
|
||||
qam64_table_offset_im=FOUR[x0p[1]];
|
||||
qam64_table_offset_re+=TWO[x0p[2]];
|
||||
qam64_table_offset_im+=TWO[x0p[3]];
|
||||
qam64_table_offset_re+=x0p[4];
|
||||
qam64_table_offset_im+=x0p[5];
|
||||
((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam64_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam64_table_offset_im];
|
||||
}
|
||||
|
||||
for (tti_offset=symbol_offset+re_offset-frame_parms->ofdm_symbol_size+7;
|
||||
re<12;
|
||||
re++,x0p+=6,tti_offset++) {
|
||||
|
||||
qam64_table_offset_re=FOUR[x0p[0]];
|
||||
qam64_table_offset_im=FOUR[x0p[1]];
|
||||
qam64_table_offset_re+=TWO[x0p[2]];
|
||||
qam64_table_offset_im+=TWO[x0p[3]];
|
||||
qam64_table_offset_re+=x0p[4];
|
||||
qam64_table_offset_im+=x0p[5];
|
||||
((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam64_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam64_table_offset_im];
|
||||
}
|
||||
}
|
||||
|
||||
*re_allocated = *re_allocated + 12;
|
||||
*jj=*jj + 72;
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
int allocate_REs_in_RB_pilots_64QAM_siso(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int **txdataF,
|
||||
uint32_t *jj,
|
||||
uint32_t *jj2,
|
||||
uint16_t re_offset,
|
||||
uint32_t symbol_offset,
|
||||
LTE_DL_eNB_HARQ_t *dlsch0_harq,
|
||||
LTE_DL_eNB_HARQ_t *dlsch1_harq,
|
||||
uint8_t pilots,
|
||||
int16_t amp,
|
||||
uint8_t precoder_index,
|
||||
int16_t *qam_table_s0,
|
||||
int16_t *qam_table_s1,
|
||||
uint32_t *re_allocated,
|
||||
uint8_t skip_dc,
|
||||
uint8_t skip_half,
|
||||
int *P1_SHIFT,
|
||||
int *P2_SHIFT)
|
||||
{
|
||||
|
||||
|
||||
uint8_t *x0 = dlsch0_harq->e;
|
||||
uint32_t qam64_table_offset_re = 0;
|
||||
uint32_t qam64_table_offset_im = 0;
|
||||
|
||||
uint32_t tti_offset;
|
||||
uint8_t re;
|
||||
uint8_t *x0p;
|
||||
|
||||
|
||||
if (skip_dc == 0) {
|
||||
// printf("pilots: P1_SHIFT[0] %d\n",P1_SHIFT[0]);
|
||||
for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0];
|
||||
re<12;
|
||||
x0p+=6) {
|
||||
|
||||
qam64_table_offset_re=FOUR[x0p[0]];
|
||||
qam64_table_offset_im=FOUR[x0p[1]];
|
||||
qam64_table_offset_re+=TWO[x0p[2]];
|
||||
qam64_table_offset_im+=TWO[x0p[3]];
|
||||
qam64_table_offset_re+=x0p[4];
|
||||
qam64_table_offset_im+=x0p[5];
|
||||
((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam64_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam64_table_offset_im];
|
||||
// printf("pilots: re %d, tti_offset %d, P1_SHIFT %d\n",re,tti_offset,P1_SHIFT[re+1]);
|
||||
tti_offset+=P1_SHIFT[re+1];
|
||||
re+=P1_SHIFT[re+1];
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0];
|
||||
re<6;
|
||||
x0p+=6) {
|
||||
|
||||
qam64_table_offset_re=FOUR[x0p[0]];
|
||||
qam64_table_offset_im=FOUR[x0p[1]];
|
||||
qam64_table_offset_re+=TWO[x0p[2]];
|
||||
qam64_table_offset_im+=TWO[x0p[3]];
|
||||
qam64_table_offset_re+=x0p[4];
|
||||
qam64_table_offset_im+=x0p[5];
|
||||
((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam64_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam64_table_offset_im];
|
||||
tti_offset+=P1_SHIFT[re+1];
|
||||
re+=P1_SHIFT[re+1];
|
||||
}
|
||||
|
||||
for (tti_offset=symbol_offset+re_offset-frame_parms->ofdm_symbol_size+6+P1_SHIFT[6];
|
||||
re<12;
|
||||
x0p+=6) {
|
||||
|
||||
qam64_table_offset_re=FOUR[x0p[0]];
|
||||
qam64_table_offset_im=FOUR[x0p[1]];
|
||||
qam64_table_offset_re+=TWO[x0p[2]];
|
||||
qam64_table_offset_im+=TWO[x0p[3]];
|
||||
qam64_table_offset_re+=x0p[4];
|
||||
qam64_table_offset_im+=x0p[5];
|
||||
((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam64_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam64_table_offset_im];
|
||||
tti_offset+=P1_SHIFT[re+1];
|
||||
re+=P1_SHIFT[re+1];
|
||||
}
|
||||
}
|
||||
*re_allocated = *re_allocated + 10;
|
||||
*jj=*jj + 60;
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t **txdataF,
|
||||
uint32_t *jj,
|
||||
@@ -122,7 +505,9 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int16_t *qam_table_s1,
|
||||
uint32_t *re_allocated,
|
||||
uint8_t skip_dc,
|
||||
uint8_t skip_half)
|
||||
uint8_t skip_half,
|
||||
int *P1_SHIFT,
|
||||
int *P2_SHIFT)
|
||||
{
|
||||
|
||||
|
||||
@@ -180,27 +565,6 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
switch (mod_order) {
|
||||
case 2:
|
||||
// QPSK single stream
|
||||
|
||||
break;
|
||||
case 4:
|
||||
//16QAM Single stream
|
||||
gain_lin_16QAM1 = (int16_t)(((int32_t)amp*QAM16_n1)>>15);
|
||||
gain_lin_16QAM2 = (int16_t)(((int32_t)amp*QAM16_n2)>>15);
|
||||
|
||||
break;
|
||||
|
||||
case 6:
|
||||
//64QAM Single stream
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
*/
|
||||
|
||||
#ifdef DEBUG_DLSCH_MODULATION
|
||||
printf("allocate_re (mod %d): symbol_offset %d re_offset %d (%d,%d), jj %d -> %d,%d\n",mod_order0,symbol_offset,re_offset,skip_dc,skip_half,*jj, x0[*jj], x0[1+*jj]);
|
||||
#endif
|
||||
@@ -213,6 +577,7 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
else if (skip_half==2)
|
||||
first_re=6;
|
||||
|
||||
|
||||
for (re=first_re; re<last_re; re++) {
|
||||
|
||||
|
||||
@@ -233,7 +598,7 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
switch (mod_order0) {
|
||||
case 2: //QPSK
|
||||
|
||||
// printf("%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
|
||||
// printf("re %d %d(%d) : %d,%d => ",re,tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||
((int16_t*)&txdataF[aa][tti_offset])[0] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i
|
||||
}
|
||||
@@ -246,7 +611,7 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
|
||||
*jj = *jj + 1;
|
||||
|
||||
// printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
|
||||
// printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
|
||||
break;
|
||||
|
||||
case 4: //16QAM
|
||||
@@ -321,8 +686,8 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
*jj=*jj+1;
|
||||
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||
((int16_t *)&txdataF[aa][tti_offset])[0]+=qam_table_s0[qam64_table_offset_re];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15);
|
||||
((int16_t *)&txdataF[aa][tti_offset])[1]+=qam_table_s0[qam64_table_offset_im];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15);
|
||||
((int16_t *)&txdataF[aa][tti_offset])[0]+=qam_table_s0[qam64_table_offset_re];
|
||||
((int16_t *)&txdataF[aa][tti_offset])[1]+=qam_table_s0[qam64_table_offset_im];
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -948,7 +1313,7 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
}
|
||||
}
|
||||
} else if (mimo_mode>=TM9_10) {
|
||||
msg("allocate_REs_in_RB() [dlsch.c] : ERROR, unknown mimo_mode %d\n",mimo_mode);
|
||||
printf("allocate_REs_in_RB() [dlsch.c] : ERROR, unknown mimo_mode %d\n",mimo_mode);
|
||||
return(-1);
|
||||
}
|
||||
}
|
||||
@@ -1156,6 +1521,143 @@ uint8_t get_pmi(uint8_t N_RB_DL,LTE_DL_eNB_HARQ_t *dlsch_harq,uint16_t rb)
|
||||
}
|
||||
|
||||
|
||||
inline int check_skip(int rb,int subframe_offset,LTE_DL_FRAME_PARMS *frame_parms,int l,int nsymb) __attribute__((always_inline));
|
||||
inline int check_skip(int rb,int subframe_offset,LTE_DL_FRAME_PARMS *frame_parms,int l,int nsymb) {
|
||||
|
||||
|
||||
if ((frame_parms->N_RB_DL&1) == 1) { // ODD N_RB_DL
|
||||
// PBCH
|
||||
if ((subframe_offset==0) &&
|
||||
(rb>((frame_parms->N_RB_DL>>1)-3)) &&
|
||||
(rb<((frame_parms->N_RB_DL>>1)+3)) &&
|
||||
(l>=(nsymb>>1)) &&
|
||||
(l<((nsymb>>1) + 4))) {
|
||||
return(1);
|
||||
}
|
||||
if (frame_parms->frame_type == TDD) { // TDD
|
||||
//SSS TDD
|
||||
if (((subframe_offset==0)||(subframe_offset==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==(nsymb-1)) ) {
|
||||
return(1);
|
||||
}
|
||||
//PSS TDD
|
||||
if (((subframe_offset==1) || (subframe_offset==6)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==2) ) {
|
||||
return(1);
|
||||
}
|
||||
} else {
|
||||
//PSS FDD
|
||||
if (((subframe_offset==0)||(subframe_offset==5)) &&
|
||||
(rb>((frame_parms->N_RB_DL>>1)-3)) &&
|
||||
(rb<((frame_parms->N_RB_DL>>1)+3)) &&
|
||||
(l==((nsymb>>1)-1)) ) {
|
||||
return(1);
|
||||
}
|
||||
//SSS FDD
|
||||
if (((subframe_offset==0)||(subframe_offset==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==((nsymb>>1)-2)) ) {
|
||||
return(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
else { // even N_RB_DL
|
||||
//PBCH
|
||||
if ((subframe_offset==0) &&
|
||||
(rb>=((frame_parms->N_RB_DL>>1)-3)) &&
|
||||
(rb<((frame_parms->N_RB_DL>>1)+3)) &&
|
||||
(l>=nsymb>>1) && (l<((nsymb>>1) + 4)))
|
||||
return(1);
|
||||
|
||||
if (frame_parms->frame_type == TDD) { // TDD
|
||||
//SSS
|
||||
if (((subframe_offset==0)||
|
||||
(subframe_offset==5)) &&
|
||||
(rb>=((frame_parms->N_RB_DL>>1)-3)) &&
|
||||
(rb<((frame_parms->N_RB_DL>>1)+3)) &&
|
||||
(l==nsymb-1) ) {
|
||||
return(1);
|
||||
}
|
||||
|
||||
//PSS
|
||||
if (((subframe_offset==1)||
|
||||
(subframe_offset==6)) &&
|
||||
(rb>=((frame_parms->N_RB_DL>>1)-3)) &&
|
||||
(rb<((frame_parms->N_RB_DL>>1)+3)) &&
|
||||
(l==2) ) {
|
||||
return(1);
|
||||
}
|
||||
} else { // FDD
|
||||
//SSS
|
||||
if (((subframe_offset==0)||(subframe_offset==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==((nsymb>>1)-2)) ) {
|
||||
return(1);
|
||||
}
|
||||
|
||||
//PSS
|
||||
if (((subframe_offset==0)||(subframe_offset==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==((nsymb>>1)-1)) ) {
|
||||
return(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
inline int check_skiphalf(int rb,int subframe_offset,LTE_DL_FRAME_PARMS *frame_parms,int l,int nsymb) __attribute__((always_inline));
|
||||
inline int check_skiphalf(int rb,int subframe_offset,LTE_DL_FRAME_PARMS *frame_parms,int l,int nsymb) {
|
||||
|
||||
// printf("check_skiphalf : rb %d, subframe_offset %d,l %d, nsymb %d\n",rb,subframe_offset,l,nsymb);
|
||||
|
||||
if ((frame_parms->N_RB_DL&1) == 1) { // ODD N_RB_DL
|
||||
|
||||
// PBCH
|
||||
if ((subframe_offset==0) &&
|
||||
(rb==((frame_parms->N_RB_DL>>1)-3)) &&
|
||||
(l>=(nsymb>>1)) &&
|
||||
(l<((nsymb>>1) + 4)))
|
||||
return(1);
|
||||
else if ((subframe_offset==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4)))
|
||||
return(2);
|
||||
|
||||
if (frame_parms->frame_type == TDD) { // TDD
|
||||
//SSS TDD
|
||||
if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==(nsymb-1)))
|
||||
return(1);
|
||||
else if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==(nsymb-1)))
|
||||
return(2);
|
||||
//PSS TDD
|
||||
if (((subframe_offset==1)||(subframe_offset==6)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==2))
|
||||
return(1);
|
||||
else if (((subframe_offset==1)||(subframe_offset==6)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==2))
|
||||
return(2);
|
||||
}
|
||||
else { // FDD
|
||||
//PSS FDD
|
||||
if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==((nsymb>>1)-1)))
|
||||
return(1);
|
||||
else if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==(((nsymb>>1)-1))))
|
||||
return(2);
|
||||
//SSS FDD
|
||||
if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && ((l==((nsymb>>1)-2))))
|
||||
return(1);
|
||||
else if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && ((l==(nsymb>>1)-2)))
|
||||
return(2);
|
||||
}
|
||||
}
|
||||
else { // EVEN N_RB_DL
|
||||
return(0);
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
inline int check_skip_dc(int rb,LTE_DL_FRAME_PARMS *frame_parms) __attribute__((always_inline));
|
||||
inline int check_skip_dc(int rb,LTE_DL_FRAME_PARMS *frame_parms) {
|
||||
|
||||
if (((frame_parms->N_RB_DL&1) == 1) && // odd N_RB_DL, rb==N_RB_DL/2 PRB contains DC element
|
||||
(rb==(frame_parms->N_RB_DL>>1)))
|
||||
return(1);
|
||||
else
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int dlsch_modulation(int32_t **txdataF,
|
||||
int16_t amp,
|
||||
uint32_t subframe_offset,
|
||||
@@ -1169,18 +1671,39 @@ int dlsch_modulation(int32_t **txdataF,
|
||||
uint8_t harq_pid = dlsch0->current_harq_pid;
|
||||
LTE_DL_eNB_HARQ_t *dlsch0_harq = dlsch0->harq_processes[harq_pid];
|
||||
LTE_DL_eNB_HARQ_t *dlsch1_harq; //= dlsch1->harq_processes[harq_pid];
|
||||
uint32_t i,jj,jj2,re_allocated,symbol_offset;
|
||||
uint32_t i,i2,jj,jj2,re_allocated,symbol_offset;
|
||||
uint16_t l,rb,re_offset;
|
||||
uint32_t rb_alloc_ind;
|
||||
uint32_t *rb_alloc = dlsch0_harq->rb_alloc;
|
||||
uint8_t pilots=0;
|
||||
uint8_t skip_dc,skip_half;
|
||||
uint8_t skip_dc=0,skip_half=0;
|
||||
uint8_t mod_order0 = get_Qm(dlsch0_harq->mcs);
|
||||
uint8_t mod_order1 = 0;
|
||||
int16_t amp_rho_a, amp_rho_b;
|
||||
int16_t qam16_table_a0[4],qam64_table_a0[8],qam16_table_b0[4],qam64_table_b0[8];
|
||||
int16_t qam16_table_a1[4],qam64_table_a1[8],qam16_table_b1[4],qam64_table_b1[8];
|
||||
int16_t *qam_table_s0,*qam_table_s1;
|
||||
int16_t *qam_table_s0=NULL,*qam_table_s1=NULL;
|
||||
int (*allocate_REs)(LTE_DL_FRAME_PARMS *,
|
||||
int **,
|
||||
uint32_t*,
|
||||
uint32_t*,
|
||||
uint16_t,
|
||||
uint32_t,
|
||||
LTE_DL_eNB_HARQ_t *,
|
||||
LTE_DL_eNB_HARQ_t *,
|
||||
uint8_t,
|
||||
int16_t,
|
||||
uint8_t,
|
||||
int16_t *,
|
||||
int16_t *,
|
||||
uint32_t *,
|
||||
uint8_t,
|
||||
uint8_t,
|
||||
int *,
|
||||
int *);
|
||||
int P1_SHIFT[13],P2_SHIFT[13];
|
||||
int offset,nushiftmod3;
|
||||
|
||||
#ifdef DEBUG_DLSCH_MODULATION
|
||||
uint8_t Nl0 = dlsch0_harq->Nl;
|
||||
uint8_t Nl1;
|
||||
@@ -1229,11 +1752,12 @@ int dlsch_modulation(int32_t **txdataF,
|
||||
jj2=0;
|
||||
re_allocated=0;
|
||||
|
||||
|
||||
// printf("num_pdcch_symbols %d, nsymb %d\n",num_pdcch_symbols,nsymb);
|
||||
for (l=num_pdcch_symbols; l<nsymb; l++) {
|
||||
|
||||
#ifdef DEBUG_DLSCH_MODULATION
|
||||
msg("Generating DLSCH (harq_pid %d,mimo %d, pmi_alloc0 %llx, mod0 %d, mod1 %d, rb_alloc[0] %d) in %d\n",
|
||||
printf("Generating DLSCH (harq_pid %d,mimo %d, pmi_alloc0 %llx, mod0 %d, mod1 %d, rb_alloc[0] %d) in %d\n",
|
||||
harq_pid,
|
||||
dlsch0_harq->mimo_mode,
|
||||
pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),
|
||||
@@ -1259,9 +1783,98 @@ int dlsch_modulation(int32_t **txdataF,
|
||||
pilots=0;
|
||||
}
|
||||
|
||||
offset = (pilots==2)?3:0;
|
||||
nushiftmod3 = frame_parms->nushift%3;
|
||||
|
||||
if (pilots>0) { // compute pilot arrays, could be done statically if performance suffers
|
||||
if (frame_parms->mode1_flag == 1) {
|
||||
// printf("l %d, nushift %d, offset %d\n",l,frame_parms->nushift,offset);
|
||||
for (i=0,i2=0;i<12;i++) {
|
||||
if ((i!=(frame_parms->nushift+offset)) && (i!=((frame_parms->nushift+6+offset)%12)))
|
||||
P1_SHIFT[i2++]=1;
|
||||
else
|
||||
P1_SHIFT[i2++]=2;
|
||||
}
|
||||
P1_SHIFT[0]--;
|
||||
}
|
||||
else {
|
||||
for (i=0,i2=0;i<12;i++) {
|
||||
if ((i!=nushiftmod3) && (i!=nushiftmod3+6) && (i!=nushiftmod3+3) && (i!=nushiftmod3+9))
|
||||
P2_SHIFT[i2++]=1;
|
||||
else
|
||||
P2_SHIFT[i2++]=2;
|
||||
}
|
||||
P2_SHIFT[0]--;
|
||||
}
|
||||
}
|
||||
P1_SHIFT[12]=1;P2_SHIFT[12]=1;
|
||||
|
||||
re_offset = frame_parms->first_carrier_offset;
|
||||
symbol_offset = (uint32_t)frame_parms->ofdm_symbol_size*(l+(subframe_offset*nsymb));
|
||||
|
||||
allocate_REs = allocate_REs_in_RB;
|
||||
|
||||
switch (mod_order0) {
|
||||
case 2:
|
||||
qam_table_s0 = NULL;
|
||||
break;
|
||||
case 4:
|
||||
if (pilots) {
|
||||
qam_table_s0 = qam16_table_b0;
|
||||
allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ?
|
||||
allocate_REs_in_RB_pilots_16QAM_siso :
|
||||
allocate_REs_in_RB;
|
||||
}
|
||||
else {
|
||||
qam_table_s0 = qam16_table_a0;
|
||||
allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ?
|
||||
allocate_REs_in_RB_no_pilots_16QAM_siso :
|
||||
allocate_REs_in_RB;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case 6:
|
||||
if (pilots) {
|
||||
qam_table_s0 = qam64_table_b0;
|
||||
allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ?
|
||||
allocate_REs_in_RB_pilots_64QAM_siso :
|
||||
allocate_REs_in_RB;
|
||||
}
|
||||
else {
|
||||
qam_table_s0 = qam64_table_a0;
|
||||
allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ?
|
||||
allocate_REs_in_RB_no_pilots_64QAM_siso :
|
||||
allocate_REs_in_RB;
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
switch (mod_order1) {
|
||||
case 2:
|
||||
qam_table_s1 = NULL;
|
||||
allocate_REs = allocate_REs_in_RB;
|
||||
break;
|
||||
case 4:
|
||||
if (pilots) {
|
||||
qam_table_s1 = qam16_table_b1;
|
||||
}
|
||||
else {
|
||||
qam_table_s1 = qam16_table_a1;
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
if (pilots) {
|
||||
qam_table_s1 = qam64_table_b1;
|
||||
}
|
||||
else {
|
||||
qam_table_s1 = qam64_table_a1;
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
//for (aa=0;aa<frame_parms->nb_antennas_tx;aa++)
|
||||
// memset(&txdataF[aa][symbol_offset],0,frame_parms->ofdm_symbol_size<<2);
|
||||
//printf("symbol_offset %d,subframe offset %d : pilots %d\n",symbol_offset,subframe_offset,pilots);
|
||||
@@ -1278,177 +1891,55 @@ int dlsch_modulation(int32_t **txdataF,
|
||||
else
|
||||
rb_alloc_ind = 0;
|
||||
|
||||
// check for PBCH
|
||||
skip_half=0;
|
||||
if (check_skip(rb,subframe_offset,frame_parms,l,nsymb)==1)
|
||||
rb_alloc_ind = 0;
|
||||
|
||||
if ((frame_parms->N_RB_DL&1) == 1) { // ODD N_RB_DL
|
||||
|
||||
if (rb==(frame_parms->N_RB_DL>>1))
|
||||
skip_dc = 1;
|
||||
else
|
||||
skip_dc = 0;
|
||||
|
||||
// PBCH
|
||||
if ((subframe_offset==0) &&
|
||||
(rb>((frame_parms->N_RB_DL>>1)-3)) &&
|
||||
(rb<((frame_parms->N_RB_DL>>1)+3)) &&
|
||||
(l>=(nsymb>>1)) &&
|
||||
(l<((nsymb>>1) + 4))) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
//PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3
|
||||
if ((subframe_offset==0) &&
|
||||
(rb==((frame_parms->N_RB_DL>>1)-3)) &&
|
||||
(l>=(nsymb>>1)) &&
|
||||
(l<((nsymb>>1) + 4)))
|
||||
skip_half=1;
|
||||
else if ((subframe_offset==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4)))
|
||||
skip_half=2;
|
||||
|
||||
if (frame_parms->frame_type == TDD) { // TDD
|
||||
//SSS TDD
|
||||
if (((subframe_offset==0)||(subframe_offset==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==(nsymb-1)) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
//SSS TDD
|
||||
if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==(nsymb-1)))
|
||||
skip_half=1;
|
||||
else if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==(nsymb-1)))
|
||||
skip_half=2;
|
||||
|
||||
//PSS TDD
|
||||
if (((subframe_offset==1) || (subframe_offset==6)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==2) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
//PSS TDD
|
||||
if (((subframe_offset==1)||(subframe_offset==6)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==2))
|
||||
skip_half=1;
|
||||
else if (((subframe_offset==1)||(subframe_offset==6)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==2))
|
||||
skip_half=2;
|
||||
} else {
|
||||
//PSS FDD
|
||||
if (((subframe_offset==0)||(subframe_offset==5)) &&
|
||||
(rb>((frame_parms->N_RB_DL>>1)-3)) &&
|
||||
(rb<((frame_parms->N_RB_DL>>1)+3)) &&
|
||||
(l==((nsymb>>1)-1)) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
//PSS FDD
|
||||
if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==((nsymb>>1)-1)))
|
||||
skip_half=1;
|
||||
else if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==(((nsymb>>1)-1))))
|
||||
skip_half=2;
|
||||
|
||||
//SSS FDD
|
||||
if (((subframe_offset==0)||(subframe_offset==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==((nsymb>>1)-2)) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
//SSS FDD
|
||||
if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && ((l==((nsymb>>1)-2))))
|
||||
skip_half=1;
|
||||
else if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && ((l==(nsymb>>1)-2)))
|
||||
skip_half=2;
|
||||
|
||||
}
|
||||
|
||||
} else { // EVEN N_RB_DL
|
||||
//PBCH
|
||||
if ((subframe_offset==0) &&
|
||||
(rb>=((frame_parms->N_RB_DL>>1)-3)) &&
|
||||
(rb<((frame_parms->N_RB_DL>>1)+3)) &&
|
||||
(l>=nsymb>>1) && (l<((nsymb>>1) + 4)))
|
||||
rb_alloc_ind = 0;
|
||||
|
||||
skip_dc=0;
|
||||
skip_half=0;
|
||||
|
||||
if (frame_parms->frame_type == TDD) { // TDD
|
||||
//SSS
|
||||
if (((subframe_offset==0)||
|
||||
(subframe_offset==5)) &&
|
||||
(rb>=((frame_parms->N_RB_DL>>1)-3)) &&
|
||||
(rb<((frame_parms->N_RB_DL>>1)+3)) &&
|
||||
(l==nsymb-1) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
//PSS
|
||||
if (((subframe_offset==1)||
|
||||
(subframe_offset==6)) &&
|
||||
(rb>=((frame_parms->N_RB_DL>>1)-3)) &&
|
||||
(rb<((frame_parms->N_RB_DL>>1)+3)) &&
|
||||
(l==2) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
} else { // FDD
|
||||
//SSS
|
||||
if (((subframe_offset==0)||(subframe_offset==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==((nsymb>>1)-2)) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
//PSS
|
||||
if (((subframe_offset==0)||(subframe_offset==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==((nsymb>>1)-1)) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
skip_half = check_skiphalf(rb,subframe_offset,frame_parms,l,nsymb);
|
||||
skip_dc = check_skip_dc(rb,frame_parms);
|
||||
|
||||
|
||||
if (dlsch0_harq->Nlayers>1) {
|
||||
msg("Nlayers %d: re_offset %d, symbol %d offset %d\n",dlsch0_harq->Nlayers,re_offset,l,symbol_offset);
|
||||
printf("Nlayers %d: re_offset %d, symbol %d offset %d\n",dlsch0_harq->Nlayers,re_offset,l,symbol_offset);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
if (dlsch1) {
|
||||
if (dlsch1_harq->Nlayers>1) {
|
||||
msg("Nlayers %d: re_offset %d, symbol %d offset %d\n",dlsch0_harq->Nlayers,re_offset,l,symbol_offset);
|
||||
printf("Nlayers %d: re_offset %d, symbol %d offset %d\n",dlsch0_harq->Nlayers,re_offset,l,symbol_offset);
|
||||
return(-1);
|
||||
}
|
||||
}
|
||||
|
||||
if (mod_order0 == 4)
|
||||
qam_table_s0 = ((pilots) ? qam16_table_b0 : qam16_table_a0);
|
||||
else if (mod_order0 == 6)
|
||||
qam_table_s0 = ((pilots) ? qam64_table_b0 : qam64_table_a0);
|
||||
else
|
||||
qam_table_s0 = NULL;
|
||||
|
||||
if (mod_order1 == 4)
|
||||
qam_table_s1 = ((pilots) ? qam16_table_b1 : qam16_table_a1);
|
||||
else if (mod_order1 == 6)
|
||||
qam_table_s1 = ((pilots) ? qam64_table_b1 : qam64_table_a1);
|
||||
else
|
||||
qam_table_s1 = NULL;
|
||||
|
||||
if (rb_alloc_ind > 0) {
|
||||
// printf("Allocated rb %d/symbol %d, skip_half %d, subframe_offset %d, symbol_offset %d, re_offset %d, jj %d\n",rb,l,skip_half,subframe_offset,symbol_offset,re_offset,jj);
|
||||
allocate_REs_in_RB(frame_parms,
|
||||
txdataF,
|
||||
&jj,
|
||||
&jj2,
|
||||
re_offset,
|
||||
symbol_offset,
|
||||
dlsch0->harq_processes[harq_pid],
|
||||
(dlsch1==NULL) ? NULL : dlsch1->harq_processes[harq_pid],
|
||||
pilots,
|
||||
((pilots) ? amp_rho_b : amp_rho_a),
|
||||
get_pmi(frame_parms->N_RB_DL,dlsch0->harq_processes[harq_pid],rb),
|
||||
qam_table_s0,
|
||||
qam_table_s1,
|
||||
&re_allocated,
|
||||
skip_dc,
|
||||
skip_half);
|
||||
|
||||
// printf("Allocated rb %d/symbol %d, skip_half %d, subframe_offset %d, symbol_offset %d, re_offset %d, jj %d\n",rb,l,skip_half,subframe_offset,symbol_offset,re_offset,jj);
|
||||
allocate_REs(frame_parms,
|
||||
txdataF,
|
||||
&jj,
|
||||
&jj2,
|
||||
re_offset,
|
||||
symbol_offset,
|
||||
dlsch0->harq_processes[harq_pid],
|
||||
(dlsch1==NULL) ? NULL : dlsch1->harq_processes[harq_pid],
|
||||
pilots,
|
||||
((pilots) ? amp_rho_b : amp_rho_a),
|
||||
get_pmi(frame_parms->N_RB_DL,dlsch0->harq_processes[harq_pid],rb),
|
||||
qam_table_s0,
|
||||
qam_table_s1,
|
||||
&re_allocated,
|
||||
skip_dc,
|
||||
skip_half,
|
||||
P1_SHIFT,
|
||||
P2_SHIFT);
|
||||
}
|
||||
else {
|
||||
// printf("Unallocated rb %d/symbol %d, re_offset %d, jj %d\n",rb,l,re_offset,jj);
|
||||
}
|
||||
|
||||
re_offset+=12; // go to next RB
|
||||
|
||||
|
||||
// check if we crossed the symbol boundary and skip DC
|
||||
|
||||
// check if we crossed the symbol boundary and skip DCs
|
||||
if (re_offset >= frame_parms->ofdm_symbol_size) {
|
||||
if (skip_dc == 0) //even number of RBs (doesn't straddle DC)
|
||||
re_offset=1;
|
||||
@@ -1462,7 +1953,7 @@ int dlsch_modulation(int32_t **txdataF,
|
||||
|
||||
|
||||
#ifdef DEBUG_DLSCH_MODULATION
|
||||
msg("generate_dlsch : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch0_harq->nb_rb,dlsch0_harq->rb_alloc,mod_order0,Nl0,2,0,subframe_offset));
|
||||
printf("generate_dlsch : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch0_harq->nb_rb,dlsch0_harq->rb_alloc,mod_order0,Nl0,2,0,subframe_offset));
|
||||
#endif
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_MODULATION, VCD_FUNCTION_OUT);
|
||||
@@ -1561,7 +2052,7 @@ int mch_modulation(int32_t **txdataF,
|
||||
|
||||
|
||||
#ifdef DEBUG_DLSCH_MODULATION
|
||||
msg("generate_dlsch(MCH) : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->rb_alloc,mod_order,1,2,0,subframe_offset));
|
||||
printf("generate_dlsch(MCH) : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->rb_alloc,mod_order,1,2,0,subframe_offset));
|
||||
#endif
|
||||
|
||||
return (re_allocated);
|
||||
|
||||
@@ -19,6 +19,34 @@
|
||||
#include "PHY/extern.h"
|
||||
#include "UTIL/LOG/vcd_signal_dumper.h"
|
||||
|
||||
static inline unsigned int lte_gold_scram(unsigned int *x1, unsigned int *x2, unsigned char reset) __attribute__((always_inline));
|
||||
static inline unsigned int lte_gold_scram(unsigned int *x1, unsigned int *x2, unsigned char reset)
|
||||
{
|
||||
int n;
|
||||
|
||||
if (reset) {
|
||||
*x1 = 1+ (1<<31);
|
||||
*x2=*x2 ^ ((*x2 ^ (*x2>>1) ^ (*x2>>2) ^ (*x2>>3))<<31);
|
||||
|
||||
// skip first 50 double words (1600 bits)
|
||||
// printf("n=0 : x1 %x, x2 %x\n",x1,x2);
|
||||
for (n=1; n<50; n++) {
|
||||
*x1 = (*x1>>1) ^ (*x1>>4);
|
||||
*x1 = *x1 ^ (*x1<<31) ^ (*x1<<28);
|
||||
*x2 = (*x2>>1) ^ (*x2>>2) ^ (*x2>>3) ^ (*x2>>4);
|
||||
*x2 = *x2 ^ (*x2<<31) ^ (*x2<<30) ^ (*x2<<29) ^ (*x2<<28);
|
||||
}
|
||||
}
|
||||
|
||||
*x1 = (*x1>>1) ^ (*x1>>4);
|
||||
*x1 = *x1 ^ (*x1<<31) ^ (*x1<<28);
|
||||
*x2 = (*x2>>1) ^ (*x2>>2) ^ (*x2>>3) ^ (*x2>>4);
|
||||
*x2 = *x2 ^ (*x2<<31) ^ (*x2<<30) ^ (*x2<<29) ^ (*x2<<28);
|
||||
return(*x1^*x2);
|
||||
// printf("n=%d : c %x\n",n,x1^x2);
|
||||
|
||||
}
|
||||
|
||||
void dlsch_scrambling(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int mbsfn_flag,
|
||||
LTE_eNB_DLSCH_t *dlsch,
|
||||
@@ -27,10 +55,11 @@ void dlsch_scrambling(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t Ns)
|
||||
{
|
||||
|
||||
int i,j,k=0;
|
||||
int i;
|
||||
// uint8_t reset;
|
||||
uint32_t x1, x2, s=0;
|
||||
uint8_t *e=dlsch->harq_processes[dlsch->current_harq_pid]->e;
|
||||
uint8_t *dlsch_e=dlsch->harq_processes[dlsch->current_harq_pid]->e;
|
||||
uint8_t *e=dlsch_e;
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_SCRAMBLING, VCD_FUNCTION_IN);
|
||||
|
||||
@@ -45,28 +74,64 @@ void dlsch_scrambling(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
#ifdef DEBUG_SCRAMBLING
|
||||
printf("scrambling: rnti %x, q %d, Ns %d, Nid_cell %d, length %d\n",dlsch->rnti,q,Ns,frame_parms->Nid_cell, G);
|
||||
#endif
|
||||
s = lte_gold_generic(&x1, &x2, 1);
|
||||
s = lte_gold_scram(&x1, &x2, 1);
|
||||
|
||||
for (i=0; i<(1+(G>>5)); i++) {
|
||||
|
||||
for (j=0; j<32; j++,k++) {
|
||||
#ifdef DEBUG_SCRAMBLING
|
||||
printf("scrambling %d : %d => ",k,e[k]);
|
||||
printf("scrambling %d : %d => ",k,e[k]);
|
||||
#endif
|
||||
e[k] = (e[k]&1) ^ ((s>>j)&1);
|
||||
#ifdef DEBUG_SCRAMBLING
|
||||
printf("%d\n",e[k]);
|
||||
#endif
|
||||
}
|
||||
|
||||
s = lte_gold_generic(&x1, &x2, 0);
|
||||
|
||||
e[0] = (e[0]) ^ (s&1);
|
||||
e[1] = (e[1]) ^ ((s>>1)&1);
|
||||
e[2] = (e[2]) ^ ((s>>2)&1);
|
||||
e[3] = (e[3]) ^ ((s>>3)&1);
|
||||
e[4] = (e[4]) ^ ((s>>4)&1);
|
||||
e[5] = (e[5]) ^ ((s>>5)&1);
|
||||
e[6] = (e[6]) ^ ((s>>6)&1);
|
||||
e[7] = (e[7]) ^ ((s>>7)&1);
|
||||
e[8] = (e[8]) ^ ((s>>8)&1);
|
||||
e[9] = (e[9]) ^ ((s>>9)&1);
|
||||
e[10] = (e[10]) ^ ((s>>10)&1);
|
||||
e[11] = (e[11]) ^ ((s>>11)&1);
|
||||
e[12] = (e[12]) ^ ((s>>12)&1);
|
||||
e[13] = (e[13]) ^ ((s>>13)&1);
|
||||
e[14] = (e[14]) ^ ((s>>14)&1);
|
||||
e[15] = (e[15]) ^ ((s>>15)&1);
|
||||
e[16] = (e[16]) ^ ((s>>16)&1);
|
||||
e[17] = (e[17]) ^ ((s>>17)&1);
|
||||
e[18] = (e[18]) ^ ((s>>18)&1);
|
||||
e[19] = (e[19]) ^ ((s>>19)&1);
|
||||
e[20] = (e[20]) ^ ((s>>20)&1);
|
||||
e[21] = (e[21]) ^ ((s>>21)&1);
|
||||
e[22] = (e[22]) ^ ((s>>22)&1);
|
||||
e[23] = (e[23]) ^ ((s>>23)&1);
|
||||
e[24] = (e[24]) ^ ((s>>24)&1);
|
||||
e[25] = (e[25]) ^ ((s>>25)&1);
|
||||
e[26] = (e[26]) ^ ((s>>26)&1);
|
||||
e[27] = (e[27]) ^ ((s>>27)&1);
|
||||
e[28] = (e[28]) ^ ((s>>28)&1);
|
||||
e[29] = (e[29]) ^ ((s>>29)&1);
|
||||
e[30] = (e[30]) ^ ((s>>30)&1);
|
||||
e[31] = (e[31]) ^ ((s>>31)&1);
|
||||
|
||||
// This is not faster for some unknown reason
|
||||
// ((__m128i *)e)[0] = _mm_xor_si128(((__m128i *)e)[0],((__m128i *)scrambling_lut)[s&65535]);
|
||||
// ((__m128i *)e)[1] = _mm_xor_si128(((__m128i *)e)[1],((__m128i *)scrambling_lut)[s>>16]);
|
||||
#ifdef DEBUG_SCRAMBLING
|
||||
printf("%d\n",e[k]);
|
||||
#endif
|
||||
|
||||
|
||||
s = lte_gold_scram(&x1, &x2, 0);
|
||||
e += 32;
|
||||
}
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_SCRAMBLING, VCD_FUNCTION_OUT);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void dlsch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int mbsfn_flag,
|
||||
LTE_UE_DLSCH_t *dlsch,
|
||||
@@ -91,7 +156,7 @@ void dlsch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
#ifdef DEBUG_SCRAMBLING
|
||||
printf("unscrambling: rnti %x, q %d, Ns %d, Nid_cell %d length %d\n",dlsch->rnti,q,Ns,frame_parms->Nid_cell,G);
|
||||
#endif
|
||||
s = lte_gold_generic(&x1, &x2, 1);
|
||||
s = lte_gold_scram(&x1, &x2, 1);
|
||||
|
||||
for (i=0; i<(1+(G>>5)); i++) {
|
||||
for (j=0; j<32; j++,k++) {
|
||||
@@ -104,6 +169,30 @@ void dlsch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
#endif
|
||||
}
|
||||
|
||||
s = lte_gold_generic(&x1, &x2, 0);
|
||||
s = lte_gold_scram(&x1, &x2, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void init_unscrambling_lut() {
|
||||
|
||||
uint32_t s;
|
||||
int i=0,j;
|
||||
|
||||
for (s=0;s<=65535;s++) {
|
||||
for (j=0;j<16;j++) {
|
||||
unscrambling_lut[i++] = (int16_t)((((s>>j)&1)<<1)-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void init_scrambling_lut() {
|
||||
|
||||
uint32_t s;
|
||||
int i=0,j;
|
||||
|
||||
for (s=0;s<=65535;s++) {
|
||||
for (j=0;j<16;j++) {
|
||||
scrambling_lut[i++] = (uint8_t)((s>>j)&1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,8 @@
|
||||
#include "PHY/sse_intrin.h"
|
||||
//#define DEBUG_DRS
|
||||
|
||||
int generate_drs_pusch(PHY_VARS_UE *phy_vars_ue,
|
||||
int generate_drs_pusch(PHY_VARS_UE *ue,
|
||||
UE_rxtx_proc_t *proc,
|
||||
uint8_t eNB_id,
|
||||
short amp,
|
||||
unsigned int subframe,
|
||||
@@ -33,26 +34,26 @@ int generate_drs_pusch(PHY_VARS_UE *phy_vars_ue,
|
||||
int16_t alpha_im[12] = {0, 16383, 28377, 32767, 28377, 16383, 0,-16384,-28378,-32768,-28378,-16384};
|
||||
|
||||
uint8_t cyclic_shift,cyclic_shift0,cyclic_shift1;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms;
|
||||
int32_t *txdataF = phy_vars_ue->lte_ue_common_vars.txdataF[ant];
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
||||
int32_t *txdataF = ue->common_vars.txdataF[ant];
|
||||
uint32_t u,v,alpha_ind;
|
||||
uint32_t u0=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[subframe<<1];
|
||||
uint32_t u1=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[1+(subframe<<1)];
|
||||
uint32_t v0=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[subframe<<1];
|
||||
uint32_t v1=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)];
|
||||
int32_t ref_re,ref_im;
|
||||
uint8_t harq_pid = subframe2harq_pid(frame_parms,phy_vars_ue->frame_tx,subframe);
|
||||
uint8_t harq_pid = subframe2harq_pid(frame_parms,proc->frame_tx,subframe);
|
||||
|
||||
cyclic_shift0 = (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift +
|
||||
phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->n_DMRS2 +
|
||||
phy_vars_ue->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]+
|
||||
((phy_vars_ue->ulsch_ue[0]->cooperation_flag==2)?10:0)+
|
||||
ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2 +
|
||||
frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]+
|
||||
((ue->ulsch[0]->cooperation_flag==2)?10:0)+
|
||||
ant*6) % 12;
|
||||
// printf("PUSCH.cyclicShift %d, n_DMRS2 %d, nPRS %d\n",frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift,phy_vars_ue->ulsch_ue[eNB_id]->n_DMRS2,phy_vars_ue->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]);
|
||||
// printf("PUSCH.cyclicShift %d, n_DMRS2 %d, nPRS %d\n",frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift,ue->ulsch[eNB_id]->n_DMRS2,ue->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]);
|
||||
cyclic_shift1 = (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift +
|
||||
phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->n_DMRS2 +
|
||||
phy_vars_ue->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[(subframe<<1)+1]+
|
||||
((phy_vars_ue->ulsch_ue[0]->cooperation_flag==2)?10:0)+
|
||||
ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2 +
|
||||
frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[(subframe<<1)+1]+
|
||||
((ue->ulsch[0]->cooperation_flag==2)?10:0)+
|
||||
ant*6) % 12;
|
||||
|
||||
// cyclic_shift0 = 0;
|
||||
@@ -65,7 +66,7 @@ int generate_drs_pusch(PHY_VARS_UE *phy_vars_ue,
|
||||
if (Msc_idx_ptr)
|
||||
Msc_RS_idx = Msc_idx_ptr - dftsizes;
|
||||
else {
|
||||
msg("generate_drs_pusch: index for Msc_RS=%d not found\n",Msc_RS);
|
||||
printf("generate_drs_pusch: index for Msc_RS=%d not found\n",Msc_RS);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
@@ -78,7 +79,7 @@ int generate_drs_pusch(PHY_VARS_UE *phy_vars_ue,
|
||||
|
||||
#endif
|
||||
#ifdef DEBUG_DRS
|
||||
msg("[PHY] drs_modulation: Msc_RS = %d, Msc_RS_idx = %d,cyclic_shift %d, u0 %d, v0 %d, u1 %d, v1 %d,cshift0 %d,cshift1 %d\n",Msc_RS, Msc_RS_idx,cyclic_shift,u0,v0,u1,v1,cyclic_shift0,cyclic_shift1);
|
||||
printf("[PHY] drs_modulation: Msc_RS = %d, Msc_RS_idx = %d,cyclic_shift %d, u0 %d, v0 %d, u1 %d, v1 %d,cshift0 %d,cshift1 %d\n",Msc_RS, Msc_RS_idx,cyclic_shift,u0,v0,u1,v1,cyclic_shift0,cyclic_shift1);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -87,21 +88,17 @@ int generate_drs_pusch(PHY_VARS_UE *phy_vars_ue,
|
||||
l<frame_parms->symbols_per_tti;
|
||||
l += (7 - frame_parms->Ncp),u=u1,v=v1,cyclic_shift=cyclic_shift1) {
|
||||
|
||||
drs_offset = 0; // msg("drs_modulation: Msc_RS = %d, Msc_RS_idx = %d\n",Msc_RS, Msc_RS_idx);
|
||||
drs_offset = 0; // printf("drs_modulation: Msc_RS = %d, Msc_RS_idx = %d\n",Msc_RS, Msc_RS_idx);
|
||||
|
||||
|
||||
|
||||
#ifdef IFFT_FPGA_UE
|
||||
re_offset = frame_parms->N_RB_DL*12/2;
|
||||
subframe_offset = subframe*frame_parms->symbols_per_tti*frame_parms->N_RB_UL*12;
|
||||
symbol_offset = subframe_offset + frame_parms->N_RB_UL*12*l;
|
||||
#else
|
||||
re_offset = frame_parms->first_carrier_offset;
|
||||
subframe_offset = subframe*frame_parms->symbols_per_tti*frame_parms->ofdm_symbol_size;
|
||||
symbol_offset = subframe_offset + frame_parms->ofdm_symbol_size*l;
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef DEBUG_DRS
|
||||
msg("generate_drs_pusch: symbol_offset %d, subframe offset %d, cyclic shift %d\n",symbol_offset,subframe_offset,cyclic_shift);
|
||||
printf("generate_drs_pusch: symbol_offset %d, subframe offset %d, cyclic shift %d\n",symbol_offset,subframe_offset,cyclic_shift);
|
||||
#endif
|
||||
alpha_ind = 0;
|
||||
|
||||
@@ -110,60 +107,9 @@ int generate_drs_pusch(PHY_VARS_UE *phy_vars_ue,
|
||||
if ((rb >= first_rb) && (rb<(first_rb+nb_rb))) {
|
||||
|
||||
#ifdef DEBUG_DRS
|
||||
msg("generate_drs_pusch: doing RB %d, re_offset=%d, drs_offset=%d,cyclic shift %d\n",rb,re_offset,drs_offset,cyclic_shift);
|
||||
printf("generate_drs_pusch: doing RB %d, re_offset=%d, drs_offset=%d,cyclic shift %d\n",rb,re_offset,drs_offset,cyclic_shift);
|
||||
#endif
|
||||
|
||||
#ifdef IFFT_FPGA_UE
|
||||
|
||||
if (cyclic_shift == 0) {
|
||||
for (k=0; k<12; k++) {
|
||||
if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] >= 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] >= 0))
|
||||
txdataF[symbol_offset+re_offset] = (int32_t) 1;
|
||||
else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] >= 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] < 0))
|
||||
txdataF[symbol_offset+re_offset] = (int32_t) 2;
|
||||
else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] < 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] >= 0))
|
||||
txdataF[symbol_offset+re_offset] = (int32_t) 3;
|
||||
else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] < 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] < 0))
|
||||
txdataF[symbol_offset+re_offset] = (int32_t) 4;
|
||||
|
||||
re_offset++;
|
||||
drs_offset++;
|
||||
|
||||
if (re_offset >= frame_parms->N_RB_UL*12)
|
||||
re_offset=0;
|
||||
}
|
||||
} else if(cyclic_shift == 6 ) {
|
||||
for (k=0; k<12; k++) {
|
||||
if(k%2 == 0) {
|
||||
if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] >= 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] >= 0))
|
||||
txdataF[symbol_offset+re_offset] = (int32_t) 4;
|
||||
else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] >= 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] < 0))
|
||||
txdataF[symbol_offset+re_offset] = (int32_t) 3;
|
||||
else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] < 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] >= 0))
|
||||
txdataF[symbol_offset+re_offset] = (int32_t) 2;
|
||||
else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] < 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] < 0))
|
||||
txdataF[symbol_offset+re_offset] = (int32_t) 1;
|
||||
} else {
|
||||
if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] >= 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] >= 0))
|
||||
txdataF[symbol_offset+re_offset] = (int32_t) 1;
|
||||
else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] >= 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] < 0))
|
||||
txdataF[symbol_offset+re_offset] = (int32_t) 2;
|
||||
else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] < 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] >= 0))
|
||||
txdataF[symbol_offset+re_offset] = (int32_t) 3;
|
||||
else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] < 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] < 0))
|
||||
txdataF[symbol_offset+re_offset] = (int32_t) 4;
|
||||
}
|
||||
|
||||
re_offset++;
|
||||
drs_offset++;
|
||||
|
||||
if (re_offset >= frame_parms->N_RB_UL*12)
|
||||
re_offset=0;
|
||||
}
|
||||
}
|
||||
|
||||
#else //IFFT_FPGA_UE
|
||||
|
||||
for (k=0; k<12; k++) {
|
||||
ref_re = (int32_t) ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1];
|
||||
ref_im = (int32_t) ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1];
|
||||
@@ -182,7 +128,7 @@ int generate_drs_pusch(PHY_VARS_UE *phy_vars_ue,
|
||||
alpha_ind-=12;
|
||||
|
||||
#ifdef DEBUG_DRS
|
||||
msg("symbol_offset %d, alpha_ind %d , re_offset %d : (%d,%d)\n",
|
||||
printf("symbol_offset %d, alpha_ind %d , re_offset %d : (%d,%d)\n",
|
||||
symbol_offset,
|
||||
alpha_ind,
|
||||
re_offset,
|
||||
@@ -197,21 +143,10 @@ int generate_drs_pusch(PHY_VARS_UE *phy_vars_ue,
|
||||
re_offset = 0;
|
||||
}
|
||||
|
||||
#endif // IFFT_FPGA_UE
|
||||
} else {
|
||||
re_offset+=12; // go to next RB
|
||||
|
||||
// check if we crossed the symbol boundary and skip DC
|
||||
#ifdef IFFT_FPGA_UE
|
||||
|
||||
if (re_offset >= frame_parms->N_RB_DL*12) {
|
||||
if (frame_parms->N_RB_DL&1) // odd number of RBs
|
||||
re_offset=6;
|
||||
else // even number of RBs (doesn't straddle DC)
|
||||
re_offset=0;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
if (re_offset >= frame_parms->ofdm_symbol_size) {
|
||||
if (frame_parms->N_RB_DL&1) // odd number of RBs
|
||||
@@ -220,7 +155,7 @@ int generate_drs_pusch(PHY_VARS_UE *phy_vars_ue,
|
||||
re_offset=0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,266 @@
|
||||
/*! \file PHY/LTE_TRANSPORT/if4_tools.c
|
||||
* \brief
|
||||
* \author S. Sandeep Kumar, Raymond Knopp
|
||||
* \date 2016
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \email: ee13b1025@iith.ac.in, knopp@eurecom.fr
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
|
||||
#include "PHY/defs.h"
|
||||
#include "PHY/TOOLS/alaw_lut.h"
|
||||
|
||||
#include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h"
|
||||
#include "UTIL/LOG/vcd_signal_dumper.h"
|
||||
|
||||
void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, int k) {
|
||||
LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
|
||||
int32_t **txdataF = eNB->common_vars.txdataF[0];
|
||||
int32_t **rxdataF = eNB->common_vars.rxdataF[0];
|
||||
int16_t **rxsigF = eNB->prach_vars.rxsigF;
|
||||
void *tx_buffer = eNB->ifbuffer.tx;
|
||||
|
||||
uint16_t symbol_id=0, element_id=0;
|
||||
uint16_t db_fulllength, db_halflength;
|
||||
int slotoffsetF=0, blockoffsetF=0;
|
||||
|
||||
uint16_t *data_block=NULL, *i=NULL;
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 );
|
||||
|
||||
if (packet_type == IF4p5_PDLFFT) {
|
||||
db_fulllength = 12*fp->N_RB_DL;
|
||||
db_halflength = (db_fulllength)>>1;
|
||||
slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1;
|
||||
blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1;
|
||||
|
||||
IF4p5_header_t *dl_header = (IF4p5_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES);
|
||||
data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t);
|
||||
|
||||
gen_IF4p5_dl_header(dl_header, frame, subframe);
|
||||
|
||||
for (symbol_id=0; symbol_id<fp->symbols_per_tti; symbol_id++) {
|
||||
|
||||
for (element_id=0; element_id<db_halflength; element_id++) {
|
||||
i = (uint16_t*) &txdataF[0][blockoffsetF+element_id];
|
||||
data_block[element_id] = ((uint16_t) lin2alaw[*i]) | (lin2alaw[*(i+1)]<<8);
|
||||
|
||||
i = (uint16_t*) &txdataF[0][slotoffsetF+element_id];
|
||||
data_block[element_id+db_halflength] = ((uint16_t) lin2alaw[*i]) | (lin2alaw[*(i+1)]<<8);
|
||||
}
|
||||
|
||||
dl_header->frame_status &= ~(0x000f<<26);
|
||||
dl_header->frame_status |= (symbol_id&0x000f)<<26;
|
||||
|
||||
if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice,
|
||||
symbol_id,
|
||||
&tx_buffer,
|
||||
db_fulllength,
|
||||
1,
|
||||
IF4p5_PDLFFT)) < 0) {
|
||||
perror("ETHERNET write for IF4p5_PDLFFT\n");
|
||||
}
|
||||
|
||||
slotoffsetF += fp->ofdm_symbol_size;
|
||||
blockoffsetF += fp->ofdm_symbol_size;
|
||||
}
|
||||
} else if (packet_type == IF4p5_PULFFT) {
|
||||
db_fulllength = 12*fp->N_RB_UL;
|
||||
db_halflength = (db_fulllength)>>1;
|
||||
slotoffsetF = 1;
|
||||
blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1;
|
||||
|
||||
IF4p5_header_t *ul_header = (IF4p5_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES);
|
||||
data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t);
|
||||
|
||||
gen_IF4p5_ul_header(ul_header, frame, subframe);
|
||||
|
||||
for (symbol_id=0; symbol_id<fp->symbols_per_tti; symbol_id++) {
|
||||
|
||||
for (element_id=0; element_id<db_halflength; element_id++) {
|
||||
i = (uint16_t*) &rxdataF[0][blockoffsetF+element_id];
|
||||
data_block[element_id] = ((uint16_t) lin2alaw[*i]) | (lin2alaw[*(i+1)]<<8);
|
||||
|
||||
i = (uint16_t*) &rxdataF[0][slotoffsetF+element_id];
|
||||
data_block[element_id+db_halflength] = ((uint16_t) lin2alaw[*i]) | (lin2alaw[*(i+1)]<<8);
|
||||
}
|
||||
|
||||
ul_header->frame_status &= ~(0x000f<<26);
|
||||
ul_header->frame_status |= (symbol_id&0x000f)<<26;
|
||||
|
||||
if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice,
|
||||
symbol_id,
|
||||
&tx_buffer,
|
||||
db_fulllength,
|
||||
1,
|
||||
IF4p5_PULFFT)) < 0) {
|
||||
perror("ETHERNET write for IF4p5_PULFFT\n");
|
||||
}
|
||||
|
||||
slotoffsetF += fp->ofdm_symbol_size;
|
||||
blockoffsetF += fp->ofdm_symbol_size;
|
||||
}
|
||||
} else if (packet_type == IF4p5_PRACH) {
|
||||
// FIX: hard coded prach samples length
|
||||
db_fulllength = 840*2;
|
||||
|
||||
IF4p5_header_t *prach_header = (IF4p5_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES);
|
||||
data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t);
|
||||
|
||||
gen_IF4p5_prach_header(prach_header, frame, subframe);
|
||||
|
||||
memcpy((int16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t),
|
||||
(&rxsigF[0][k]),
|
||||
db_fulllength*sizeof(int16_t));
|
||||
|
||||
if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice,
|
||||
symbol_id,
|
||||
&tx_buffer,
|
||||
db_fulllength,
|
||||
1,
|
||||
IF4p5_PRACH)) < 0) {
|
||||
perror("ETHERNET write for IF4p5_PRACH\n");
|
||||
}
|
||||
} else {
|
||||
AssertFatal(1==0, "send_IF4p5 - Unknown packet_type %x", packet_type);
|
||||
}
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 );
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_type, uint32_t *symbol_number) {
|
||||
LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
|
||||
int32_t **txdataF = eNB->common_vars.txdataF[0];
|
||||
int32_t **rxdataF = eNB->common_vars.rxdataF[0];
|
||||
int16_t **rxsigF = eNB->prach_vars.rxsigF;
|
||||
void *rx_buffer = eNB->ifbuffer.rx;
|
||||
|
||||
uint16_t element_id;
|
||||
uint16_t db_fulllength, db_halflength;
|
||||
int slotoffsetF=0, blockoffsetF=0;
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 );
|
||||
|
||||
if (eNB->node_function == NGFI_RRU_IF4p5) {
|
||||
db_fulllength = (12*fp->N_RB_DL);
|
||||
} else {
|
||||
db_fulllength = (12*fp->N_RB_UL);
|
||||
}
|
||||
db_halflength = db_fulllength>>1;
|
||||
|
||||
IF4p5_header_t *packet_header=NULL;
|
||||
uint16_t *data_block=NULL, *i=NULL;
|
||||
|
||||
if (eNB->ifdevice.trx_read_func(&eNB->ifdevice,
|
||||
(int64_t*) packet_type,
|
||||
&rx_buffer,
|
||||
db_fulllength,
|
||||
0) < 0) {
|
||||
perror("ETHERNET read");
|
||||
}
|
||||
|
||||
packet_header = (IF4p5_header_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES);
|
||||
data_block = (uint16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4p5_header_t);
|
||||
|
||||
*frame = ((packet_header->frame_status)>>6)&0xffff;
|
||||
*subframe = ((packet_header->frame_status)>>22)&0x000f;
|
||||
|
||||
|
||||
if (*packet_type == IF4p5_PDLFFT) {
|
||||
*symbol_number = ((packet_header->frame_status)>>26)&0x000f;
|
||||
|
||||
slotoffsetF = (*symbol_number)*(fp->ofdm_symbol_size) + (*subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1;
|
||||
blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1;
|
||||
|
||||
for (element_id=0; element_id<db_halflength; element_id++) {
|
||||
i = (uint16_t*) &txdataF[0][blockoffsetF+element_id];
|
||||
*i = alaw2lin[ (data_block[element_id] & 0xff) ];
|
||||
*(i+1) = alaw2lin[ (data_block[element_id]>>8) ];
|
||||
|
||||
i = (uint16_t*) &txdataF[0][slotoffsetF+element_id];
|
||||
*i = alaw2lin[ (data_block[element_id+db_halflength] & 0xff) ];
|
||||
*(i+1) = alaw2lin[ (data_block[element_id+db_halflength]>>8) ];
|
||||
}
|
||||
|
||||
} else if (*packet_type == IF4p5_PULFFT) {
|
||||
*symbol_number = ((packet_header->frame_status)>>26)&0x000f;
|
||||
|
||||
slotoffsetF = (*symbol_number)*(fp->ofdm_symbol_size) + 1;
|
||||
blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1;
|
||||
|
||||
for (element_id=0; element_id<db_halflength; element_id++) {
|
||||
i = (uint16_t*) &rxdataF[0][blockoffsetF+element_id];
|
||||
*i = alaw2lin[ (data_block[element_id] & 0xff) ];
|
||||
*(i+1) = alaw2lin[ (data_block[element_id]>>8) ];
|
||||
|
||||
i = (uint16_t*) &rxdataF[0][slotoffsetF+element_id];
|
||||
*i = alaw2lin[ (data_block[element_id+db_halflength] & 0xff) ];
|
||||
*(i+1) = alaw2lin[ (data_block[element_id+db_halflength]>>8) ];
|
||||
}
|
||||
|
||||
} else if (*packet_type == IF4p5_PRACH) {
|
||||
// FIX: hard coded prach samples length
|
||||
db_fulllength = 840*2;
|
||||
|
||||
memcpy((&rxsigF[0][0]),
|
||||
(int16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4p5_header_t),
|
||||
db_fulllength*sizeof(int16_t));
|
||||
|
||||
} else {
|
||||
AssertFatal(1==0, "recv_IF4p5 - Unknown packet_type %x", *packet_type);
|
||||
}
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 );
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
void gen_IF4p5_dl_header(IF4p5_header_t *dl_packet, int frame, int subframe) {
|
||||
dl_packet->type = IF4p5_PACKET_TYPE;
|
||||
dl_packet->sub_type = IF4p5_PDLFFT;
|
||||
|
||||
dl_packet->rsvd = 0;
|
||||
|
||||
// Set frame status
|
||||
dl_packet->frame_status = 0;
|
||||
dl_packet->frame_status |= (frame&0xffff)<<6;
|
||||
dl_packet->frame_status |= (subframe&0x000f)<<22;
|
||||
}
|
||||
|
||||
|
||||
void gen_IF4p5_ul_header(IF4p5_header_t *ul_packet, int frame, int subframe) {
|
||||
|
||||
ul_packet->type = IF4p5_PACKET_TYPE;
|
||||
ul_packet->sub_type = IF4p5_PULFFT;
|
||||
|
||||
ul_packet->rsvd = 0;
|
||||
|
||||
// Set frame status
|
||||
ul_packet->frame_status = 0;
|
||||
ul_packet->frame_status |= (frame&0xffff)<<6;
|
||||
ul_packet->frame_status |= (subframe&0x000f)<<22;
|
||||
}
|
||||
|
||||
|
||||
void gen_IF4p5_prach_header(IF4p5_header_t *prach_packet, int frame, int subframe) {
|
||||
prach_packet->type = IF4p5_PACKET_TYPE;
|
||||
prach_packet->sub_type = IF4p5_PRACH;
|
||||
|
||||
prach_packet->rsvd = 0;
|
||||
|
||||
// Set LTE Prach configuration
|
||||
prach_packet->frame_status = 0;
|
||||
prach_packet->frame_status |= (frame&0xffff)<<6;
|
||||
prach_packet->frame_status |= (subframe&0x000f)<<22;
|
||||
}
|
||||
|
||||
|
||||
void malloc_IF4p5_buffer(PHY_VARS_eNB *eNB) {
|
||||
// Keep the size large enough
|
||||
eNB->ifbuffer.tx = malloc(RAW_IF4p5_PRACH_SIZE_BYTES);
|
||||
eNB->ifbuffer.rx = malloc(RAW_IF4p5_PRACH_SIZE_BYTES);
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
/*! \file PHY/LTE_TRANSPORT/if4_tools.h
|
||||
* \brief
|
||||
* \author S. Sandeep Kumar, Raymond Knopp
|
||||
* \date 2016
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \email: ee13b1025@iith.ac.in, knopp@eurecom.fr
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
|
||||
#include "PHY/defs.h"
|
||||
|
||||
/// Macro for IF4 packet type
|
||||
#define IF4p5_PACKET_TYPE 0x080A
|
||||
#define IF4p5_PULFFT 0x0019
|
||||
#define IF4p5_PDLFFT 0x0020
|
||||
#define IF4p5_PRACH 0x0021
|
||||
|
||||
struct IF4p5_header {
|
||||
/// Type
|
||||
uint16_t type;
|
||||
/// Sub-Type
|
||||
uint16_t sub_type;
|
||||
/// Reserved
|
||||
uint32_t rsvd;
|
||||
/// Frame Status
|
||||
uint32_t frame_status;
|
||||
|
||||
} __attribute__ ((__packed__));
|
||||
|
||||
typedef struct IF4p5_header IF4p5_header_t;
|
||||
#define sizeof_IF4p5_header_t 12
|
||||
|
||||
void gen_IF4p5_dl_header(IF4p5_header_t*, int, int);
|
||||
|
||||
void gen_IF4p5_ul_header(IF4p5_header_t*, int, int);
|
||||
|
||||
void gen_IF4p5_prach_header(IF4p5_header_t*, int, int);
|
||||
|
||||
void send_IF4p5(PHY_VARS_eNB*, int, int, uint16_t, int);
|
||||
|
||||
void recv_IF4p5(PHY_VARS_eNB*, int*, int*, uint16_t*, uint32_t*);
|
||||
|
||||
void malloc_IF4p5_buffer(PHY_VARS_eNB*);
|
||||
@@ -0,0 +1,192 @@
|
||||
/*! \file PHY/LTE_TRANSPORT/if5_tools.c
|
||||
* \brief
|
||||
* \author S. Sandeep Kumar, Raymond Knopp
|
||||
* \date 2016
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \email: ee13b1025@iith.ac.in, knopp@eurecom.fr
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
|
||||
#include "PHY/defs.h"
|
||||
|
||||
#include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h"
|
||||
#include "UTIL/LOG/vcd_signal_dumper.h"
|
||||
|
||||
void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe, uint8_t *seqno, uint16_t packet_type) {
|
||||
|
||||
LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
|
||||
int32_t *txp[fp->nb_antennas_tx], *rxp[fp->nb_antennas_rx];
|
||||
int32_t *tx_buffer=NULL;
|
||||
|
||||
uint16_t packet_id=0, i=0;
|
||||
|
||||
uint32_t spp_eth = (uint32_t) eNB->ifdevice.openair0_cfg->samples_per_packet;
|
||||
uint32_t spsf = (uint32_t) eNB->ifdevice.openair0_cfg->samples_per_frame/10;
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 );
|
||||
|
||||
if (packet_type == IF5_RRH_GW_DL) {
|
||||
|
||||
for (i=0; i < fp->nb_antennas_tx; i++)
|
||||
txp[i] = (void*)&eNB->common_vars.txdata[0][i][subframe*fp->samples_per_tti];
|
||||
|
||||
for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) {
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 1 );
|
||||
eNB->ifdevice.trx_write_func(&eNB->ifdevice,
|
||||
(proc_timestamp + packet_id*spp_eth),
|
||||
(void**)txp,
|
||||
spp_eth,
|
||||
fp->nb_antennas_tx,
|
||||
0);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 0 );
|
||||
for (i=0; i < fp->nb_antennas_tx; i++)
|
||||
txp[i] += spp_eth;
|
||||
|
||||
}
|
||||
|
||||
} else if (packet_type == IF5_RRH_GW_UL) {
|
||||
|
||||
for (i=0; i < fp->nb_antennas_rx; i++)
|
||||
rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][subframe*fp->samples_per_tti];
|
||||
|
||||
for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) {
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 1 );
|
||||
eNB->ifdevice.trx_write_func(&eNB->ifdevice,
|
||||
(proc_timestamp + packet_id*spp_eth),
|
||||
(void**)rxp,
|
||||
spp_eth,
|
||||
fp->nb_antennas_rx,
|
||||
0);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 0 );
|
||||
for (i=0; i < fp->nb_antennas_rx; i++)
|
||||
rxp[i] += spp_eth;
|
||||
|
||||
}
|
||||
|
||||
} else if (packet_type == IF5_MOBIPASS) {
|
||||
uint16_t db_fulllength=640;
|
||||
|
||||
__m128i *data_block=NULL, *data_block_head=NULL;
|
||||
|
||||
__m128i *txp128;
|
||||
__m128i t0, t1;
|
||||
|
||||
tx_buffer = memalign(16, MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t));
|
||||
IF5_mobipass_header_t *header = (IF5_mobipass_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES);
|
||||
data_block_head = (__m128i *)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + 4);
|
||||
|
||||
header->flags = 0;
|
||||
header->fifo_status = 0;
|
||||
header->seqno = *seqno;
|
||||
header->ack = 0;
|
||||
header->word0 = 0;
|
||||
|
||||
txp[0] = (void*)&eNB->common_vars.txdata[0][0][subframe*eNB->frame_parms.samples_per_tti];
|
||||
txp128 = (__m128i *) txp[0];
|
||||
|
||||
for (packet_id=0; packet_id<(fp->samples_per_tti*2)/db_fulllength; packet_id++) {
|
||||
header->time_stamp = proc_timestamp + packet_id*db_fulllength;
|
||||
data_block = data_block_head;
|
||||
|
||||
for (i=0; i<db_fulllength>>3; i+=2) {
|
||||
t0 = _mm_srai_epi16(*txp128++, 4);
|
||||
t1 = _mm_srai_epi16(*txp128++, 4);
|
||||
|
||||
*data_block++ = _mm_packs_epi16(t0, t1);
|
||||
}
|
||||
|
||||
// Write the packet to the fronthaul
|
||||
if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice,
|
||||
packet_id,
|
||||
(void**)&tx_buffer,
|
||||
db_fulllength,
|
||||
1,
|
||||
IF5_MOBIPASS)) < 0) {
|
||||
perror("ETHERNET write for IF5_MOBIPASS\n");
|
||||
}
|
||||
|
||||
header->seqno += 1;
|
||||
}
|
||||
*seqno = header->seqno;
|
||||
|
||||
} else {
|
||||
AssertFatal(1==0, "send_IF5 - Unknown packet_type %x", packet_type);
|
||||
}
|
||||
|
||||
free(tx_buffer);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
void recv_IF5(PHY_VARS_eNB *eNB, openair0_timestamp *proc_timestamp, int subframe, uint16_t packet_type) {
|
||||
|
||||
LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
|
||||
int32_t *txp[fp->nb_antennas_tx], *rxp[fp->nb_antennas_rx];
|
||||
|
||||
uint16_t packet_id=0, i=0;
|
||||
|
||||
int32_t spp_eth = (int32_t) eNB->ifdevice.openair0_cfg->samples_per_packet;
|
||||
int32_t spsf = (int32_t) eNB->ifdevice.openair0_cfg->samples_per_frame/10;
|
||||
|
||||
openair0_timestamp timestamp[spsf / spp_eth];
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 );
|
||||
|
||||
if (packet_type == IF5_RRH_GW_DL) {
|
||||
|
||||
for (i=0; i < fp->nb_antennas_tx; i++)
|
||||
txp[i] = (void*)&eNB->common_vars.txdata[0][i][subframe*fp->samples_per_tti];
|
||||
|
||||
for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) {
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 1 );
|
||||
eNB->ifdevice.trx_read_func(&eNB->ifdevice,
|
||||
×tamp[packet_id],
|
||||
(void**)txp,
|
||||
spp_eth,
|
||||
fp->nb_antennas_tx);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 0 );
|
||||
for (i=0; i < fp->nb_antennas_tx; i++)
|
||||
txp[i] += spp_eth;
|
||||
|
||||
}
|
||||
|
||||
*proc_timestamp = timestamp[0];
|
||||
|
||||
} else if (packet_type == IF5_RRH_GW_UL) {
|
||||
|
||||
for (i=0; i < fp->nb_antennas_rx; i++)
|
||||
rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][subframe*fp->samples_per_tti];
|
||||
|
||||
for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) {
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 1 );
|
||||
eNB->ifdevice.trx_read_func(&eNB->ifdevice,
|
||||
×tamp[packet_id],
|
||||
(void**)rxp,
|
||||
spp_eth,
|
||||
fp->nb_antennas_rx);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 0 );
|
||||
for (i=0; i < fp->nb_antennas_rx; i++)
|
||||
rxp[i] += spp_eth;
|
||||
|
||||
}
|
||||
|
||||
*proc_timestamp = timestamp[0];
|
||||
|
||||
} else if (packet_type == IF5_MOBIPASS) {
|
||||
|
||||
|
||||
} else {
|
||||
AssertFatal(1==0, "recv_IF5 - Unknown packet_type %x", packet_type);
|
||||
}
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 0 );
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/*! \file PHY/LTE_TRANSPORT/if5_tools.h
|
||||
* \brief
|
||||
* \author S. Sandeep Kumar, Raymond Knopp
|
||||
* \date 2016
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \email: ee13b1025@iith.ac.in, knopp@eurecom.fr
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include "PHY/defs.h"
|
||||
|
||||
#define IF5_RRH_GW_DL 0x0022
|
||||
#define IF5_RRH_GW_UL 0x0023
|
||||
#define IF5_MOBIPASS 0xbffe
|
||||
|
||||
struct IF5_mobipass_header {
|
||||
///
|
||||
uint16_t flags;
|
||||
///
|
||||
uint16_t fifo_status;
|
||||
///
|
||||
uint8_t seqno;
|
||||
///
|
||||
uint8_t ack;
|
||||
///
|
||||
uint32_t word0;
|
||||
///
|
||||
uint32_t time_stamp;
|
||||
|
||||
} __attribute__ ((__packed__));
|
||||
|
||||
typedef struct IF5_mobipass_header IF5_mobipass_header_t;
|
||||
#define sizeof_IF5_mobipass_header_t 14
|
||||
|
||||
void send_IF5(PHY_VARS_eNB*, openair0_timestamp, int, uint8_t*, uint16_t);
|
||||
|
||||
void recv_IF5(PHY_VARS_eNB*, openair0_timestamp*, int, uint16_t);
|
||||
@@ -15,101 +15,98 @@
|
||||
#include "SCHED/extern.h"
|
||||
#include "defs.h"
|
||||
#include "extern.h"
|
||||
#ifdef EXMIMO
|
||||
#include "gain_control.h"
|
||||
#endif
|
||||
|
||||
#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_LMSSDR)
|
||||
|
||||
#include "common_lib.h"
|
||||
extern openair0_config_t openair0_cfg[];
|
||||
#endif
|
||||
#define DEBUG_INITIAL_SYNCH
|
||||
|
||||
int pbch_detection(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
|
||||
//#define DEBUG_INITIAL_SYNCH
|
||||
|
||||
int pbch_detection(PHY_VARS_UE *ue, runmode_t mode)
|
||||
{
|
||||
|
||||
uint8_t l,pbch_decoded,frame_mod4,pbch_tx_ant,dummy;
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms;
|
||||
char phich_resource[6];
|
||||
|
||||
uint8_t l,pbch_decoded,frame_mod4,pbch_tx_ant,dummy;
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
|
||||
char phich_resource[6];
|
||||
|
||||
#ifdef DEBUG_INITIAL_SYNCH
|
||||
LOG_I(PHY,"[UE%d] Initial sync: starting PBCH detection (rx_offset %d)\n",phy_vars_ue->Mod_id,
|
||||
phy_vars_ue->rx_offset);
|
||||
LOG_I(PHY,"[UE%d] Initial sync: starting PBCH detection (rx_offset %d)\n",ue->Mod_id,
|
||||
ue->rx_offset);
|
||||
#endif
|
||||
|
||||
for (l=0; l<frame_parms->symbols_per_tti/2; l++) {
|
||||
|
||||
slot_fep(phy_vars_ue,
|
||||
slot_fep(ue,
|
||||
l,
|
||||
0,
|
||||
phy_vars_ue->rx_offset,
|
||||
ue->rx_offset,
|
||||
0,
|
||||
1);
|
||||
}
|
||||
for (l=0; l<frame_parms->symbols_per_tti/2; l++) {
|
||||
|
||||
slot_fep(phy_vars_ue,
|
||||
slot_fep(ue,
|
||||
l,
|
||||
1,
|
||||
phy_vars_ue->rx_offset,
|
||||
ue->rx_offset,
|
||||
0,
|
||||
1);
|
||||
}
|
||||
slot_fep(phy_vars_ue,
|
||||
slot_fep(ue,
|
||||
0,
|
||||
2,
|
||||
phy_vars_ue->rx_offset,
|
||||
ue->rx_offset,
|
||||
0,
|
||||
1);
|
||||
|
||||
lte_ue_measurements(phy_vars_ue,
|
||||
phy_vars_ue->rx_offset,
|
||||
lte_ue_measurements(ue,
|
||||
ue->rx_offset,
|
||||
0,
|
||||
0);
|
||||
|
||||
|
||||
if (phy_vars_ue->lte_frame_parms.frame_type == TDD) {
|
||||
ue_rrc_measurements(phy_vars_ue,
|
||||
if (ue->frame_parms.frame_type == TDD) {
|
||||
ue_rrc_measurements(ue,
|
||||
1,
|
||||
0);
|
||||
}
|
||||
else {
|
||||
ue_rrc_measurements(phy_vars_ue,
|
||||
ue_rrc_measurements(ue,
|
||||
0,
|
||||
0);
|
||||
}
|
||||
#ifdef DEBUG_INITIAL_SYNCH
|
||||
LOG_I(PHY,"[UE %d] RX RSSI %d dBm, digital (%d, %d) dB, linear (%d, %d), avg rx power %d dB (%d lin), RX gain %d dB\n",
|
||||
phy_vars_ue->Mod_id,
|
||||
phy_vars_ue->PHY_measurements.rx_rssi_dBm[0] - ((phy_vars_ue->lte_frame_parms.nb_antennas_rx==2) ? 3 : 0),
|
||||
phy_vars_ue->PHY_measurements.rx_power_dB[0][0],
|
||||
phy_vars_ue->PHY_measurements.rx_power_dB[0][1],
|
||||
phy_vars_ue->PHY_measurements.rx_power[0][0],
|
||||
phy_vars_ue->PHY_measurements.rx_power[0][1],
|
||||
phy_vars_ue->PHY_measurements.rx_power_avg_dB[0],
|
||||
phy_vars_ue->PHY_measurements.rx_power_avg[0],
|
||||
phy_vars_ue->rx_total_gain_dB);
|
||||
ue->Mod_id,
|
||||
ue->measurements.rx_rssi_dBm[0] - ((ue->frame_parms.nb_antennas_rx==2) ? 3 : 0),
|
||||
ue->measurements.rx_power_dB[0][0],
|
||||
ue->measurements.rx_power_dB[0][1],
|
||||
ue->measurements.rx_power[0][0],
|
||||
ue->measurements.rx_power[0][1],
|
||||
ue->measurements.rx_power_avg_dB[0],
|
||||
ue->measurements.rx_power_avg[0],
|
||||
ue->rx_total_gain_dB);
|
||||
|
||||
LOG_I(PHY,"[UE %d] N0 %d dBm digital (%d, %d) dB, linear (%d, %d), avg noise power %d dB (%d lin)\n",
|
||||
phy_vars_ue->Mod_id,
|
||||
phy_vars_ue->PHY_measurements.n0_power_tot_dBm,
|
||||
phy_vars_ue->PHY_measurements.n0_power_dB[0],
|
||||
phy_vars_ue->PHY_measurements.n0_power_dB[1],
|
||||
phy_vars_ue->PHY_measurements.n0_power[0],
|
||||
phy_vars_ue->PHY_measurements.n0_power[1],
|
||||
phy_vars_ue->PHY_measurements.n0_power_avg_dB,
|
||||
phy_vars_ue->PHY_measurements.n0_power_avg);
|
||||
ue->Mod_id,
|
||||
ue->measurements.n0_power_tot_dBm,
|
||||
ue->measurements.n0_power_dB[0],
|
||||
ue->measurements.n0_power_dB[1],
|
||||
ue->measurements.n0_power[0],
|
||||
ue->measurements.n0_power[1],
|
||||
ue->measurements.n0_power_avg_dB,
|
||||
ue->measurements.n0_power_avg);
|
||||
#endif
|
||||
|
||||
pbch_decoded = 0;
|
||||
|
||||
for (frame_mod4=0; frame_mod4<4; frame_mod4++) {
|
||||
pbch_tx_ant = rx_pbch(&phy_vars_ue->lte_ue_common_vars,
|
||||
phy_vars_ue->lte_ue_pbch_vars[0],
|
||||
pbch_tx_ant = rx_pbch(&ue->common_vars,
|
||||
ue->pbch_vars[0],
|
||||
frame_parms,
|
||||
0,
|
||||
SISO,
|
||||
phy_vars_ue->high_speed_flag,
|
||||
ue->high_speed_flag,
|
||||
frame_mod4);
|
||||
|
||||
if ((pbch_tx_ant>0) && (pbch_tx_ant<=2)) {
|
||||
@@ -117,12 +114,12 @@ char phich_resource[6];
|
||||
break;
|
||||
}
|
||||
|
||||
pbch_tx_ant = rx_pbch(&phy_vars_ue->lte_ue_common_vars,
|
||||
phy_vars_ue->lte_ue_pbch_vars[0],
|
||||
pbch_tx_ant = rx_pbch(&ue->common_vars,
|
||||
ue->pbch_vars[0],
|
||||
frame_parms,
|
||||
0,
|
||||
ALAMOUTI,
|
||||
phy_vars_ue->high_speed_flag,
|
||||
ue->high_speed_flag,
|
||||
frame_mod4);
|
||||
|
||||
if ((pbch_tx_ant>0) && (pbch_tx_ant<=2)) {
|
||||
@@ -142,12 +139,12 @@ char phich_resource[6];
|
||||
|
||||
|
||||
// flip byte endian on 24-bits for MIB
|
||||
// dummy = phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[0];
|
||||
// phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[0] = phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[2];
|
||||
// phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[2] = dummy;
|
||||
// dummy = ue->pbch_vars[0]->decoded_output[0];
|
||||
// ue->pbch_vars[0]->decoded_output[0] = ue->pbch_vars[0]->decoded_output[2];
|
||||
// ue->pbch_vars[0]->decoded_output[2] = dummy;
|
||||
|
||||
// now check for Bandwidth of Cell
|
||||
dummy = (phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[2]>>5)&7;
|
||||
dummy = (ue->pbch_vars[0]->decoded_output[2]>>5)&7;
|
||||
|
||||
switch (dummy) {
|
||||
|
||||
@@ -176,15 +173,15 @@ char phich_resource[6];
|
||||
break;
|
||||
|
||||
default:
|
||||
LOG_E(PHY,"[UE%d] Initial sync: PBCH decoding: Unknown N_RB_DL\n",phy_vars_ue->Mod_id);
|
||||
LOG_E(PHY,"[UE%d] Initial sync: PBCH decoding: Unknown N_RB_DL\n",ue->Mod_id);
|
||||
return -1;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// now check for PHICH parameters
|
||||
frame_parms->phich_config_common.phich_duration = (PHICH_DURATION_t)((phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[2]>>4)&1);
|
||||
dummy = (phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[2]>>2)&3;
|
||||
frame_parms->phich_config_common.phich_duration = (PHICH_DURATION_t)((ue->pbch_vars[0]->decoded_output[2]>>4)&1);
|
||||
dummy = (ue->pbch_vars[0]->decoded_output[2]>>2)&3;
|
||||
|
||||
switch (dummy) {
|
||||
case 0:
|
||||
@@ -208,25 +205,30 @@ char phich_resource[6];
|
||||
break;
|
||||
|
||||
default:
|
||||
LOG_E(PHY,"[UE%d] Initial sync: Unknown PHICH_DURATION\n",phy_vars_ue->Mod_id);
|
||||
LOG_E(PHY,"[UE%d] Initial sync: Unknown PHICH_DURATION\n",ue->Mod_id);
|
||||
return -1;
|
||||
break;
|
||||
}
|
||||
|
||||
phy_vars_ue->frame_rx = (((phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[2]&3)<<6) + (phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[1]>>2))<<2;
|
||||
phy_vars_ue->frame_rx += frame_mod4;
|
||||
ue->proc.proc_rxtx[0].frame_rx = (((ue->pbch_vars[0]->decoded_output[2]&3)<<6) + (ue->pbch_vars[0]->decoded_output[1]>>2))<<2;
|
||||
ue->proc.proc_rxtx[0].frame_rx += frame_mod4;
|
||||
|
||||
ue->proc.proc_rxtx[1].frame_rx = (((ue->pbch_vars[0]->decoded_output[2]&3)<<6) + (ue->pbch_vars[0]->decoded_output[1]>>2))<<2;
|
||||
ue->proc.proc_rxtx[1].frame_rx += frame_mod4;
|
||||
|
||||
#ifndef USER_MODE
|
||||
// one frame delay
|
||||
phy_vars_ue->frame_rx ++;
|
||||
ue->proc.proc_rxtx[0].frame_rx ++;
|
||||
ue->proc.proc_rxtx[1].frame_rx ++;
|
||||
#endif
|
||||
phy_vars_ue->frame_tx = phy_vars_ue->frame_rx;
|
||||
ue->proc.proc_rxtx[0].frame_tx = ue->proc.proc_rxtx[0].frame_rx;
|
||||
ue->proc.proc_rxtx[1].frame_tx = ue->proc.proc_rxtx[1].frame_rx;
|
||||
#ifdef DEBUG_INITIAL_SYNCH
|
||||
LOG_I(PHY,"[UE%d] Initial sync: pbch decoded sucessfully mode1_flag %d, tx_ant %d, frame %d, N_RB_DL %d, phich_duration %d, phich_resource %s!\n",
|
||||
phy_vars_ue->Mod_id,
|
||||
ue->Mod_id,
|
||||
frame_parms->mode1_flag,
|
||||
pbch_tx_ant,
|
||||
phy_vars_ue->frame_rx,
|
||||
ue->proc.proc_rxtx[0].frame_rx,
|
||||
frame_parms->N_RB_DL,
|
||||
frame_parms->phich_config_common.phich_duration,
|
||||
phich_resource); //frame_parms->phich_config_common.phich_resource);
|
||||
@@ -242,7 +244,7 @@ char phich_string[13][4] = {"","1/6","","1/2","","","one","","","","","","two"};
|
||||
char duplex_string[2][4] = {"FDD","TDD"};
|
||||
char prefix_string[2][9] = {"NORMAL","EXTENDED"};
|
||||
|
||||
int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
|
||||
int initial_sync(PHY_VARS_UE *ue, runmode_t mode)
|
||||
{
|
||||
|
||||
int32_t sync_pos,sync_pos2,sync_pos_slot;
|
||||
@@ -250,7 +252,7 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
|
||||
uint8_t phase_fdd_ncp,phase_fdd_ecp,phase_tdd_ncp,phase_tdd_ecp;
|
||||
uint8_t flip_fdd_ncp,flip_fdd_ecp,flip_tdd_ncp,flip_tdd_ecp;
|
||||
// uint16_t Nid_cell_fdd_ncp=0,Nid_cell_fdd_ecp=0,Nid_cell_tdd_ncp=0,Nid_cell_tdd_ecp=0;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
||||
int ret=-1;
|
||||
int aarx,rx_power=0;
|
||||
/*#ifdef OAI_USRP
|
||||
@@ -262,21 +264,21 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
|
||||
frame_parms->frame_type=FDD;
|
||||
init_frame_parms(frame_parms,1);
|
||||
/*
|
||||
write_output("rxdata0.m","rxd0",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
|
||||
write_output("rxdata0.m","rxd0",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
|
||||
exit(-1);
|
||||
*/
|
||||
sync_pos = lte_sync_time(phy_vars_ue->lte_ue_common_vars.rxdata,
|
||||
sync_pos = lte_sync_time(ue->common_vars.rxdata,
|
||||
frame_parms,
|
||||
(int *)&phy_vars_ue->lte_ue_common_vars.eNb_id);
|
||||
(int *)&ue->common_vars.eNb_id);
|
||||
|
||||
// write_output("rxdata1.m","rxd1",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
|
||||
// write_output("rxdata1.m","rxd1",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
|
||||
if (sync_pos >= frame_parms->nb_prefix_samples)
|
||||
sync_pos2 = sync_pos - frame_parms->nb_prefix_samples;
|
||||
else
|
||||
sync_pos2 = sync_pos + FRAME_LENGTH_COMPLEX_SAMPLES - frame_parms->nb_prefix_samples;
|
||||
|
||||
#ifdef DEBUG_INITIAL_SYNCH
|
||||
LOG_I(PHY,"[UE%d] Initial sync : Estimated PSS position %d, Nid2 %d\n",phy_vars_ue->Mod_id,sync_pos,phy_vars_ue->lte_ue_common_vars.eNb_id);
|
||||
LOG_I(PHY,"[UE%d] Initial sync : Estimated PSS position %d, Nid2 %d\n",ue->Mod_id,sync_pos,ue->common_vars.eNb_id);
|
||||
#endif
|
||||
|
||||
// SSS detection
|
||||
@@ -285,25 +287,25 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
|
||||
sync_pos_slot = (frame_parms->samples_per_tti>>1) - frame_parms->ofdm_symbol_size - frame_parms->nb_prefix_samples;
|
||||
|
||||
if (sync_pos2 >= sync_pos_slot)
|
||||
phy_vars_ue->rx_offset = sync_pos2 - sync_pos_slot;
|
||||
ue->rx_offset = sync_pos2 - sync_pos_slot;
|
||||
else
|
||||
phy_vars_ue->rx_offset = FRAME_LENGTH_COMPLEX_SAMPLES + sync_pos2 - sync_pos_slot;
|
||||
ue->rx_offset = FRAME_LENGTH_COMPLEX_SAMPLES + sync_pos2 - sync_pos_slot;
|
||||
|
||||
if (((sync_pos2 - sync_pos_slot) >=0 ) &&
|
||||
((sync_pos2 - sync_pos_slot) < ((FRAME_LENGTH_COMPLEX_SAMPLES-frame_parms->samples_per_tti/2)))) {
|
||||
#ifdef DEBUG_INITIAL_SYNCH
|
||||
LOG_I(PHY,"Calling sss detection (FDD normal CP)\n");
|
||||
#endif
|
||||
rx_sss(phy_vars_ue,&metric_fdd_ncp,&flip_fdd_ncp,&phase_fdd_ncp);
|
||||
rx_sss(ue,&metric_fdd_ncp,&flip_fdd_ncp,&phase_fdd_ncp);
|
||||
frame_parms->nushift = frame_parms->Nid_cell%6;
|
||||
|
||||
if (flip_fdd_ncp==1)
|
||||
phy_vars_ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1);
|
||||
ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1);
|
||||
|
||||
init_frame_parms(&phy_vars_ue->lte_frame_parms,1);
|
||||
lte_gold(frame_parms,phy_vars_ue->lte_gold_table[0],frame_parms->Nid_cell);
|
||||
ret = pbch_detection(phy_vars_ue,mode);
|
||||
// write_output("rxdata2.m","rxd2",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
|
||||
init_frame_parms(&ue->frame_parms,1);
|
||||
lte_gold(frame_parms,ue->lte_gold_table[0],frame_parms->Nid_cell);
|
||||
ret = pbch_detection(ue,mode);
|
||||
// write_output("rxdata2.m","rxd2",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
|
||||
|
||||
#ifdef DEBUG_INITIAL_SYNCH
|
||||
LOG_I(PHY,"FDD Normal prefix: CellId %d metric %d, phase %d, flip %d, pbch %d\n",
|
||||
@@ -332,25 +334,25 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
|
||||
sync_pos_slot = (frame_parms->samples_per_tti>>1) - frame_parms->ofdm_symbol_size - (frame_parms->nb_prefix_samples);
|
||||
|
||||
if (sync_pos2 >= sync_pos_slot)
|
||||
phy_vars_ue->rx_offset = sync_pos2 - sync_pos_slot;
|
||||
ue->rx_offset = sync_pos2 - sync_pos_slot;
|
||||
else
|
||||
phy_vars_ue->rx_offset = FRAME_LENGTH_COMPLEX_SAMPLES + sync_pos2 - sync_pos_slot;
|
||||
ue->rx_offset = FRAME_LENGTH_COMPLEX_SAMPLES + sync_pos2 - sync_pos_slot;
|
||||
|
||||
//msg("nb_prefix_samples %d, rx_offset %d\n",frame_parms->nb_prefix_samples,phy_vars_ue->rx_offset);
|
||||
//msg("nb_prefix_samples %d, rx_offset %d\n",frame_parms->nb_prefix_samples,ue->rx_offset);
|
||||
|
||||
if (((sync_pos2 - sync_pos_slot) >=0 ) &&
|
||||
((sync_pos2 - sync_pos_slot) < ((FRAME_LENGTH_COMPLEX_SAMPLES-frame_parms->samples_per_tti/2)))) {
|
||||
|
||||
rx_sss(phy_vars_ue,&metric_fdd_ecp,&flip_fdd_ecp,&phase_fdd_ecp);
|
||||
rx_sss(ue,&metric_fdd_ecp,&flip_fdd_ecp,&phase_fdd_ecp);
|
||||
frame_parms->nushift = frame_parms->Nid_cell%6;
|
||||
|
||||
if (flip_fdd_ecp==1)
|
||||
phy_vars_ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1);
|
||||
ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1);
|
||||
|
||||
init_frame_parms(&phy_vars_ue->lte_frame_parms,1);
|
||||
lte_gold(frame_parms,phy_vars_ue->lte_gold_table[0],frame_parms->Nid_cell);
|
||||
ret = pbch_detection(phy_vars_ue,mode);
|
||||
// write_output("rxdata3.m","rxd3",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
|
||||
init_frame_parms(&ue->frame_parms,1);
|
||||
lte_gold(frame_parms,ue->lte_gold_table[0],frame_parms->Nid_cell);
|
||||
ret = pbch_detection(ue,mode);
|
||||
// write_output("rxdata3.m","rxd3",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
|
||||
#ifdef DEBUG_INITIAL_SYNCH
|
||||
LOG_I(PHY,"FDD Extended prefix: CellId %d metric %d, phase %d, flip %d, pbch %d\n",
|
||||
frame_parms->Nid_cell,metric_fdd_ecp,phase_fdd_ecp,flip_fdd_ecp,ret);
|
||||
@@ -379,37 +381,26 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
|
||||
(frame_parms->nb_prefix_samples);
|
||||
|
||||
if (sync_pos2 >= sync_pos_slot)
|
||||
phy_vars_ue->rx_offset = sync_pos2 - sync_pos_slot;
|
||||
ue->rx_offset = sync_pos2 - sync_pos_slot;
|
||||
else
|
||||
phy_vars_ue->rx_offset = (FRAME_LENGTH_COMPLEX_SAMPLES>>1) + sync_pos2 - sync_pos_slot;
|
||||
ue->rx_offset = (FRAME_LENGTH_COMPLEX_SAMPLES>>1) + sync_pos2 - sync_pos_slot;
|
||||
|
||||
/*if (((sync_pos2 - sync_pos_slot) >=0 ) &&
|
||||
((sync_pos2 - sync_pos_slot) < ((FRAME_LENGTH_COMPLEX_SAMPLES-frame_parms->samples_per_tti/2)))) {*/
|
||||
|
||||
|
||||
rx_sss(phy_vars_ue,&metric_tdd_ncp,&flip_tdd_ncp,&phase_tdd_ncp);
|
||||
rx_sss(ue,&metric_tdd_ncp,&flip_tdd_ncp,&phase_tdd_ncp);
|
||||
|
||||
if (flip_tdd_ncp==1)
|
||||
phy_vars_ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1);
|
||||
ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1);
|
||||
|
||||
frame_parms->nushift = frame_parms->Nid_cell%6;
|
||||
init_frame_parms(&phy_vars_ue->lte_frame_parms,1);
|
||||
init_frame_parms(&ue->frame_parms,1);
|
||||
|
||||
lte_gold(frame_parms,phy_vars_ue->lte_gold_table[0],frame_parms->Nid_cell);
|
||||
ret = pbch_detection(phy_vars_ue,mode);
|
||||
// write_output("rxdata4.m","rxd4",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
|
||||
lte_gold(frame_parms,ue->lte_gold_table[0],frame_parms->Nid_cell);
|
||||
ret = pbch_detection(ue,mode);
|
||||
// write_output("rxdata4.m","rxd4",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
|
||||
|
||||
#ifdef DEBUG_INITIAL_SYNCH
|
||||
LOG_I(PHY,"TDD Normal prefix: CellId %d metric %d, phase %d, flip %d, pbch %d\n",
|
||||
frame_parms->Nid_cell,metric_tdd_ncp,phase_tdd_ncp,flip_tdd_ncp,ret);
|
||||
#endif
|
||||
/*}
|
||||
else {
|
||||
#ifdef DEBUG_INITIAL_SYNCH
|
||||
LOG_I(PHY,"TDD Normal prefix: SSS error condition: sync_pos %d, sync_pos_slot %d\n", sync_pos, sync_pos_slot);
|
||||
#endif
|
||||
}*/
|
||||
|
||||
|
||||
if (ret==-1) {
|
||||
// Now TDD extended prefix
|
||||
@@ -427,110 +418,100 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
|
||||
sync_pos_slot = frame_parms->samples_per_tti + (frame_parms->ofdm_symbol_size<<1) + (frame_parms->nb_prefix_samples<<1);
|
||||
|
||||
if (sync_pos2 >= sync_pos_slot)
|
||||
phy_vars_ue->rx_offset = sync_pos2 - sync_pos_slot;
|
||||
ue->rx_offset = sync_pos2 - sync_pos_slot;
|
||||
else
|
||||
phy_vars_ue->rx_offset = (FRAME_LENGTH_COMPLEX_SAMPLES>>1) + sync_pos2 - sync_pos_slot;
|
||||
ue->rx_offset = (FRAME_LENGTH_COMPLEX_SAMPLES>>1) + sync_pos2 - sync_pos_slot;
|
||||
|
||||
/*if (((sync_pos2 - sync_pos_slot) >=0 ) &&
|
||||
((sync_pos2 - sync_pos_slot) < ((FRAME_LENGTH_COMPLEX_SAMPLES-frame_parms->samples_per_tti/2)))) {*/
|
||||
|
||||
rx_sss(phy_vars_ue,&metric_tdd_ecp,&flip_tdd_ecp,&phase_tdd_ecp);
|
||||
rx_sss(ue,&metric_tdd_ecp,&flip_tdd_ecp,&phase_tdd_ecp);
|
||||
frame_parms->nushift = frame_parms->Nid_cell%6;
|
||||
|
||||
if (flip_tdd_ecp==1)
|
||||
phy_vars_ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1);
|
||||
ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1);
|
||||
|
||||
init_frame_parms(&phy_vars_ue->lte_frame_parms,1);
|
||||
lte_gold(frame_parms,phy_vars_ue->lte_gold_table[0],frame_parms->Nid_cell);
|
||||
ret = pbch_detection(phy_vars_ue,mode);
|
||||
init_frame_parms(&ue->frame_parms,1);
|
||||
lte_gold(frame_parms,ue->lte_gold_table[0],frame_parms->Nid_cell);
|
||||
ret = pbch_detection(ue,mode);
|
||||
|
||||
// write_output("rxdata5.m","rxd5",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
|
||||
// write_output("rxdata5.m","rxd5",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
|
||||
#ifdef DEBUG_INITIAL_SYNCH
|
||||
LOG_I(PHY,"TDD Extended prefix: CellId %d metric %d, phase %d, flip %d, pbch %d\n",
|
||||
frame_parms->Nid_cell,metric_tdd_ecp,phase_tdd_ecp,flip_tdd_ecp,ret);
|
||||
#endif
|
||||
/*}
|
||||
else {
|
||||
#ifdef DEBUG_INITIAL_SYNCH
|
||||
LOG_I(PHY,"TDD Extended prefix: SSS error condition: sync_pos %d, sync_pos_slot %d\n", sync_pos, sync_pos_slot);
|
||||
#endif
|
||||
}*/
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ret==0) { // PBCH found so indicate sync to higher layers and configure frame parameters
|
||||
|
||||
#ifdef DEBUG_INITIAL_SYNCH
|
||||
LOG_I(PHY,"[UE%d] In synch, rx_offset %d samples\n",phy_vars_ue->Mod_id, phy_vars_ue->rx_offset);
|
||||
#endif
|
||||
//#ifdef DEBUG_INITIAL_SYNCH
|
||||
LOG_I(PHY,"[UE%d] In synch, rx_offset %d samples\n",ue->Mod_id, ue->rx_offset);
|
||||
//#endif
|
||||
|
||||
if (phy_vars_ue->UE_scan_carrier == 0) {
|
||||
if (phy_vars_ue->mac_enabled==1) {
|
||||
LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",phy_vars_ue->Mod_id);
|
||||
if (ue->UE_scan_carrier == 0) {
|
||||
if (ue->mac_enabled==1) {
|
||||
LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",ue->Mod_id);
|
||||
//mac_resynch();
|
||||
mac_xface->dl_phy_sync_success(phy_vars_ue->Mod_id,phy_vars_ue->frame_rx,0,1);//phy_vars_ue->lte_ue_common_vars.eNb_id);
|
||||
phy_vars_ue->UE_mode[0] = PRACH;
|
||||
mac_xface->dl_phy_sync_success(ue->Mod_id,ue->proc.proc_rxtx[0].frame_rx,0,1);//ue->common_vars.eNb_id);
|
||||
ue->UE_mode[0] = PRACH;
|
||||
}
|
||||
else {
|
||||
phy_vars_ue->UE_mode[0] = PUSCH;
|
||||
ue->UE_mode[0] = PUSCH;
|
||||
}
|
||||
|
||||
generate_pcfich_reg_mapping(frame_parms);
|
||||
generate_phich_reg_mapping(frame_parms);
|
||||
// init_prach625(frame_parms);
|
||||
|
||||
//phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors=0;
|
||||
phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors_conseq=0;
|
||||
//phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors_last=0;
|
||||
|
||||
ue->pbch_vars[0]->pdu_errors_conseq=0;
|
||||
|
||||
}
|
||||
|
||||
LOG_I(PHY,"[UE %d] Frame %d RRC Measurements => rssi %3.1f dBm (dig %3.1f dB, gain %d), N0 %d dBm, rsrp %3.1f dBm/RE, rsrq %3.1f dB\n",phy_vars_ue->Mod_id,
|
||||
phy_vars_ue->frame_rx,
|
||||
10*log10(phy_vars_ue->PHY_measurements.rssi)-phy_vars_ue->rx_total_gain_dB,
|
||||
10*log10(phy_vars_ue->PHY_measurements.rssi),
|
||||
phy_vars_ue->rx_total_gain_dB,
|
||||
phy_vars_ue->PHY_measurements.n0_power_tot_dBm,
|
||||
10*log10(phy_vars_ue->PHY_measurements.rsrp[0])-phy_vars_ue->rx_total_gain_dB,
|
||||
(10*log10(phy_vars_ue->PHY_measurements.rsrq[0])));
|
||||
LOG_I(PHY,"[UE %d] Frame %d RRC Measurements => rssi %3.1f dBm (dig %3.1f dB, gain %d), N0 %d dBm, rsrp %3.1f dBm/RE, rsrq %3.1f dB\n",ue->Mod_id,
|
||||
ue->proc.proc_rxtx[0].frame_rx,
|
||||
10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB,
|
||||
10*log10(ue->measurements.rssi),
|
||||
ue->rx_total_gain_dB,
|
||||
ue->measurements.n0_power_tot_dBm,
|
||||
10*log10(ue->measurements.rsrp[0])-ue->rx_total_gain_dB,
|
||||
(10*log10(ue->measurements.rsrq[0])));
|
||||
|
||||
|
||||
LOG_I(PHY,"[UE %d] Frame %d MIB Information => %s, %s, NidCell %d, N_RB_DL %d, PHICH DURATION %d, PHICH RESOURCE %s, TX_ANT %d\n",
|
||||
phy_vars_ue->Mod_id,
|
||||
phy_vars_ue->frame_rx,
|
||||
duplex_string[phy_vars_ue->lte_frame_parms.frame_type],
|
||||
prefix_string[phy_vars_ue->lte_frame_parms.Ncp],
|
||||
phy_vars_ue->lte_frame_parms.Nid_cell,
|
||||
phy_vars_ue->lte_frame_parms.N_RB_DL,
|
||||
phy_vars_ue->lte_frame_parms.phich_config_common.phich_duration,
|
||||
phich_string[phy_vars_ue->lte_frame_parms.phich_config_common.phich_resource],
|
||||
phy_vars_ue->lte_frame_parms.nb_antennas_tx_eNB);
|
||||
#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_LMSSDR)
|
||||
ue->Mod_id,
|
||||
ue->proc.proc_rxtx[0].frame_rx,
|
||||
duplex_string[ue->frame_parms.frame_type],
|
||||
prefix_string[ue->frame_parms.Ncp],
|
||||
ue->frame_parms.Nid_cell,
|
||||
ue->frame_parms.N_RB_DL,
|
||||
ue->frame_parms.phich_config_common.phich_duration,
|
||||
phich_string[ue->frame_parms.phich_config_common.phich_resource],
|
||||
ue->frame_parms.nb_antennas_tx_eNB);
|
||||
|
||||
#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||
LOG_I(PHY,"[UE %d] Frame %d Measured Carrier Frequency %.0f Hz (offset %d Hz)\n",
|
||||
phy_vars_ue->Mod_id,
|
||||
phy_vars_ue->frame_rx,
|
||||
openair0_cfg[0].rx_freq[0]-phy_vars_ue->lte_ue_common_vars.freq_offset,
|
||||
phy_vars_ue->lte_ue_common_vars.freq_offset);
|
||||
ue->Mod_id,
|
||||
ue->proc.proc_rxtx[0].frame_rx,
|
||||
openair0_cfg[0].rx_freq[0]-ue->common_vars.freq_offset,
|
||||
ue->common_vars.freq_offset);
|
||||
#endif
|
||||
} else {
|
||||
#ifdef DEBUG_INITIAL_SYNC
|
||||
LOG_I(PHY,"[UE%d] Initial sync : PBCH not ok\n",phy_vars_ue->Mod_id);
|
||||
LOG_I(PHY,"[UE%d] Initial sync : Estimated PSS position %d, Nid2 %d\n",phy_vars_ue->Mod_id,sync_pos,phy_vars_ue->lte_ue_common_vars.eNb_id);
|
||||
LOG_I(PHY,"[UE%d] Initial sync : PBCH not ok\n",ue->Mod_id);
|
||||
LOG_I(PHY,"[UE%d] Initial sync : Estimated PSS position %d, Nid2 %d\n",ue->Mod_id,sync_pos,ue->common_vars.eNb_id);
|
||||
/* LOG_I(PHY,"[UE%d] Initial sync: (metric fdd_ncp %d (%d), metric fdd_ecp %d (%d), metric_tdd_ncp %d (%d), metric_tdd_ecp %d (%d))\n",
|
||||
phy_vars_ue->Mod_id,
|
||||
ue->Mod_id,
|
||||
metric_fdd_ncp,Nid_cell_fdd_ncp,
|
||||
metric_fdd_ecp,Nid_cell_fdd_ecp,
|
||||
metric_tdd_ncp,Nid_cell_tdd_ncp,
|
||||
metric_tdd_ecp,Nid_cell_tdd_ecp);*/
|
||||
LOG_I(PHY,"[UE%d] Initial sync : Estimated Nid_cell %d, Frame_type %d\n",phy_vars_ue->Mod_id,
|
||||
LOG_I(PHY,"[UE%d] Initial sync : Estimated Nid_cell %d, Frame_type %d\n",ue->Mod_id,
|
||||
frame_parms->Nid_cell,frame_parms->frame_type);
|
||||
#endif
|
||||
|
||||
phy_vars_ue->UE_mode[0] = NOT_SYNCHED;
|
||||
phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors_last=phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors;
|
||||
phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors++;
|
||||
phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors_conseq++;
|
||||
ue->UE_mode[0] = NOT_SYNCHED;
|
||||
ue->pbch_vars[0]->pdu_errors_last=ue->pbch_vars[0]->pdu_errors;
|
||||
ue->pbch_vars[0]->pdu_errors++;
|
||||
ue->pbch_vars[0]->pdu_errors_conseq++;
|
||||
|
||||
}
|
||||
|
||||
@@ -540,57 +521,44 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
|
||||
|
||||
// do a measurement on the best guess of the PSS
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++)
|
||||
rx_power += signal_energy(&phy_vars_ue->lte_ue_common_vars.rxdata[aarx][sync_pos2],
|
||||
rx_power += signal_energy(&ue->common_vars.rxdata[aarx][sync_pos2],
|
||||
frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples);
|
||||
|
||||
/*
|
||||
// do a measurement on the full frame
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++)
|
||||
rx_power += signal_energy(&phy_vars_ue->lte_ue_common_vars.rxdata[aarx][0],
|
||||
rx_power += signal_energy(&ue->common_vars.rxdata[aarx][0],
|
||||
frame_parms->samples_per_tti*10);
|
||||
*/
|
||||
|
||||
// we might add a low-pass filter here later
|
||||
phy_vars_ue->PHY_measurements.rx_power_avg[0] = rx_power/frame_parms->nb_antennas_rx;
|
||||
ue->measurements.rx_power_avg[0] = rx_power/frame_parms->nb_antennas_rx;
|
||||
|
||||
phy_vars_ue->PHY_measurements.rx_power_avg_dB[0] = dB_fixed(phy_vars_ue->PHY_measurements.rx_power_avg[0]);
|
||||
ue->measurements.rx_power_avg_dB[0] = dB_fixed(ue->measurements.rx_power_avg[0]);
|
||||
|
||||
#ifdef DEBUG_INITIAL_SYNCH
|
||||
LOG_I(PHY,"[UE%d] Initial sync : Estimated power: %d dB\n",phy_vars_ue->Mod_id,phy_vars_ue->PHY_measurements.rx_power_avg_dB[0] );
|
||||
LOG_I(PHY,"[UE%d] Initial sync : Estimated power: %d dB\n",ue->Mod_id,ue->measurements.rx_power_avg_dB[0] );
|
||||
#endif
|
||||
|
||||
#ifdef EXMIMO
|
||||
if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) &&
|
||||
(mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) )
|
||||
//phy_adjust_gain(phy_vars_ue,0);
|
||||
gain_control_all(phy_vars_ue->PHY_measurements.rx_power_avg_dB[0],0);
|
||||
|
||||
#else
|
||||
#ifndef OAI_USRP
|
||||
#ifndef OAI_BLADERF
|
||||
#ifndef OAI_LMSSDR
|
||||
phy_adjust_gain(phy_vars_ue,phy_vars_ue->PHY_measurements.rx_power_avg_dB[0],0);
|
||||
#endif
|
||||
phy_adjust_gain(ue,ue->measurements.rx_power_avg_dB[0],0);
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
}
|
||||
else {
|
||||
#ifdef EXMIMO
|
||||
if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) &&
|
||||
(mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) )
|
||||
//phy_adjust_gain(phy_vars_ue,0);
|
||||
gain_control_all(dB_fixed(phy_vars_ue->PHY_measurements.rssi),0);
|
||||
|
||||
#else
|
||||
#ifndef OAI_USRP
|
||||
#ifndef OAI_BLADERF
|
||||
#ifndef OAI_LMSSDR
|
||||
phy_adjust_gain(phy_vars_ue,dB_fixed(phy_vars_ue->PHY_measurements.rssi),0);
|
||||
#endif
|
||||
phy_adjust_gain(ue,dB_fixed(ue->measurements.rssi),0);
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
// exit_fun("debug exit");
|
||||
|
||||
@@ -1024,9 +1024,10 @@ uint16_t rx_pbch_emul(PHY_VARS_UE *phy_vars_ue,
|
||||
|
||||
double bler=0.0;//, x=0.0;
|
||||
double sinr=0.0;
|
||||
uint16_t nb_rb = phy_vars_ue->lte_frame_parms.N_RB_DL;
|
||||
uint16_t nb_rb = phy_vars_ue->frame_parms.N_RB_DL;
|
||||
int16_t f;
|
||||
uint8_t CC_id=phy_vars_ue->CC_id;
|
||||
int frame_rx = phy_vars_ue->proc.proc_rxtx[0].frame_rx;
|
||||
|
||||
// compute effective sinr
|
||||
// TODO: adapt this to varible bandwidth
|
||||
@@ -1045,10 +1046,10 @@ uint16_t rx_pbch_emul(PHY_VARS_UE *phy_vars_ue,
|
||||
sinr,
|
||||
bler);
|
||||
|
||||
if (pbch_phase == (phy_vars_ue->frame_rx % 4)) {
|
||||
if (pbch_phase == (frame_rx % 4)) {
|
||||
if (uniformrandom() >= bler) {
|
||||
memcpy(phy_vars_ue->lte_ue_pbch_vars[eNB_id]->decoded_output,PHY_vars_eNB_g[eNB_id][CC_id]->pbch_pdu,PBCH_PDU_SIZE);
|
||||
return(PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.nb_antennas_tx_eNB);
|
||||
memcpy(phy_vars_ue->pbch_vars[eNB_id]->decoded_output,PHY_vars_eNB_g[eNB_id][CC_id]->pbch_pdu,PBCH_PDU_SIZE);
|
||||
return(PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.nb_antennas_tx_eNB);
|
||||
} else
|
||||
return(-1);
|
||||
} else
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
#include "PHY/defs.h"
|
||||
#include "PHY/extern.h"
|
||||
#include "assertions.h"
|
||||
|
||||
const unsigned int Ttab[4] = {32,64,128,256};
|
||||
|
||||
// This function implements the initialization of paging parameters for UE (See Section 7, 36.304)
|
||||
// It must be called after setting IMSImod1024 during UE startup and after receiving SIB2
|
||||
int init_ue_paging_info(PHY_VARS_UE *ue, long defaultPagingCycle, long nB) {
|
||||
|
||||
LTE_DL_FRAME_PARMS *fp = &ue->frame_parms;
|
||||
|
||||
unsigned int T = Ttab[defaultPagingCycle];
|
||||
unsigned int N = (nB<=2) ? T : (T>>(nB-2));
|
||||
unsigned int Ns = (nB<2) ? (1<<(2-nB)) : 1;
|
||||
unsigned int UE_ID = ue->IMSImod1024;
|
||||
unsigned int i_s = (UE_ID/N)%Ns;
|
||||
|
||||
|
||||
ue->PF = (T/N) * (UE_ID % N);
|
||||
|
||||
// This implements Section 7.2 from 36.304
|
||||
if (Ns==1)
|
||||
ue->PO = (fp->frame_type==FDD) ? 9 : 0;
|
||||
else if (Ns==2)
|
||||
ue->PO = (fp->frame_type==FDD) ? (4+(5*i_s)) : (5*i_s);
|
||||
else if (Ns==4)
|
||||
ue->PO = (fp->frame_type==FDD) ? (4*(i_s&1)+(5*(i_s>>1))) : ((i_s&1)+(5*(i_s>>1)));
|
||||
else
|
||||
AssertFatal(1==0,"init_ue_paging_info: Ns is %d\n",Ns);
|
||||
|
||||
return(0);
|
||||
}
|
||||
@@ -1025,18 +1025,19 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
// This routine demodulates the PHICH and updates PUSCH/ULSCH parameters
|
||||
|
||||
|
||||
void rx_phich(PHY_VARS_UE *phy_vars_ue,
|
||||
void rx_phich(PHY_VARS_UE *ue,
|
||||
UE_rxtx_proc_t *proc,
|
||||
uint8_t subframe,
|
||||
uint8_t eNB_id)
|
||||
{
|
||||
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms;
|
||||
LTE_UE_PDCCH **lte_ue_pdcch_vars = phy_vars_ue->lte_ue_pdcch_vars;
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
|
||||
LTE_UE_PDCCH **pdcch_vars = ue->pdcch_vars;
|
||||
|
||||
// uint8_t HI;
|
||||
uint8_t harq_pid = phich_subframe_to_harq_pid(frame_parms,phy_vars_ue->frame_rx,subframe);
|
||||
LTE_UE_ULSCH_t *ulsch = phy_vars_ue->ulsch_ue[eNB_id];
|
||||
uint8_t harq_pid = phich_subframe_to_harq_pid(frame_parms,proc->frame_rx,subframe);
|
||||
LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id];
|
||||
int16_t phich_d[24],*phich_d_ptr,HI16;
|
||||
// unsigned int i,aa;
|
||||
int8_t d[24],*dp;
|
||||
@@ -1047,16 +1048,19 @@ void rx_phich(PHY_VARS_UE *phy_vars_ue,
|
||||
uint8_t reset = 1;
|
||||
int16_t cs[12];
|
||||
uint32_t i,i2,i3,phich_quad;
|
||||
int32_t **rxdataF_comp = lte_ue_pdcch_vars[eNB_id]->rxdataF_comp;
|
||||
int32_t **rxdataF_comp = pdcch_vars[eNB_id]->rxdataF_comp;
|
||||
uint8_t Ngroup_PHICH,ngroup_PHICH,nseq_PHICH;
|
||||
uint8_t NSF_PHICH = 4;
|
||||
uint8_t pusch_subframe;
|
||||
|
||||
// check if we're expecting a PHICH in this subframe
|
||||
LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH RX\n",phy_vars_ue->Mod_id,harq_pid,phy_vars_ue->frame_rx,subframe);
|
||||
LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH RX\n",ue->Mod_id,harq_pid,proc->frame_rx,subframe);
|
||||
|
||||
if (!ulsch)
|
||||
return;
|
||||
|
||||
if (ulsch->harq_processes[harq_pid]->status == ACTIVE) {
|
||||
LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH RX ACTIVE\n",phy_vars_ue->Mod_id,harq_pid,phy_vars_ue->frame_rx,subframe);
|
||||
LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH RX ACTIVE\n",ue->Mod_id,harq_pid,proc->frame_rx,subframe);
|
||||
Ngroup_PHICH = (frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)/48;
|
||||
|
||||
if (((frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)%48) > 0)
|
||||
@@ -1317,35 +1321,35 @@ void rx_phich(PHY_VARS_UE *phy_vars_ue,
|
||||
#endif
|
||||
|
||||
if (HI16>0) { //NACK
|
||||
if (phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1) {
|
||||
if (ue->ulsch_Msg3_active[eNB_id] == 1) {
|
||||
LOG_D(PHY,"[UE %d][PUSCH %d][RAPROC] Frame %d subframe %d Msg3 PHICH, received NAK (%d) nseq %d, ngroup %d\n",
|
||||
phy_vars_ue->Mod_id,harq_pid,
|
||||
phy_vars_ue->frame_rx,
|
||||
ue->Mod_id,harq_pid,
|
||||
proc->frame_rx,
|
||||
subframe,
|
||||
HI16,
|
||||
nseq_PHICH,
|
||||
ngroup_PHICH);
|
||||
get_Msg3_alloc_ret(&phy_vars_ue->lte_frame_parms,
|
||||
get_Msg3_alloc_ret(&ue->frame_parms,
|
||||
subframe,
|
||||
phy_vars_ue->frame_rx,
|
||||
&phy_vars_ue->ulsch_ue_Msg3_frame[eNB_id],
|
||||
&phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id]);
|
||||
proc->frame_rx,
|
||||
&ue->ulsch_Msg3_frame[eNB_id],
|
||||
&ue->ulsch_Msg3_subframe[eNB_id]);
|
||||
ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
|
||||
// ulsch->harq_processes[harq_pid]->Ndi = 0;
|
||||
ulsch->harq_processes[harq_pid]->round++;
|
||||
ulsch->harq_processes[harq_pid]->rvidx = rv_table[ulsch->harq_processes[harq_pid]->round&3];
|
||||
|
||||
if (ulsch->harq_processes[harq_pid]->round>=phy_vars_ue->lte_frame_parms.maxHARQ_Msg3Tx) {
|
||||
if (ulsch->harq_processes[harq_pid]->round>=ue->frame_parms.maxHARQ_Msg3Tx) {
|
||||
ulsch->harq_processes[harq_pid]->subframe_scheduling_flag =0;
|
||||
ulsch->harq_processes[harq_pid]->status = IDLE;
|
||||
// inform MAC that Msg3 transmission has failed
|
||||
phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] = 0;
|
||||
ue->ulsch_Msg3_active[eNB_id] = 0;
|
||||
}
|
||||
} else {
|
||||
//#ifdef DEBUG_PHICH
|
||||
LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH, received NAK (%d) nseq %d, ngroup %d\n",
|
||||
phy_vars_ue->Mod_id,harq_pid,
|
||||
phy_vars_ue->frame_rx,
|
||||
ue->Mod_id,harq_pid,
|
||||
proc->frame_rx,
|
||||
subframe,
|
||||
HI16,
|
||||
nseq_PHICH,
|
||||
@@ -1362,18 +1366,18 @@ void rx_phich(PHY_VARS_UE *phy_vars_ue,
|
||||
|
||||
|
||||
} else { //ACK
|
||||
if (phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1) {
|
||||
if (ue->ulsch_Msg3_active[eNB_id] == 1) {
|
||||
LOG_D(PHY,"[UE %d][PUSCH %d][RAPROC] Frame %d subframe %d Msg3 PHICH, received ACK (%d) nseq %d, ngroup %d\n\n",
|
||||
phy_vars_ue->Mod_id,harq_pid,
|
||||
phy_vars_ue->frame_rx,
|
||||
ue->Mod_id,harq_pid,
|
||||
proc->frame_rx,
|
||||
subframe,
|
||||
HI16,
|
||||
nseq_PHICH,ngroup_PHICH);
|
||||
} else {
|
||||
//#ifdef PHICH_DEBUG
|
||||
LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH, received ACK (%d) nseq %d, ngroup %d\n\n",
|
||||
phy_vars_ue->Mod_id,harq_pid,
|
||||
phy_vars_ue->frame_rx,
|
||||
ue->Mod_id,harq_pid,
|
||||
proc->frame_rx,
|
||||
subframe, HI16,
|
||||
nseq_PHICH,ngroup_PHICH);
|
||||
//#endif
|
||||
@@ -1383,29 +1387,28 @@ void rx_phich(PHY_VARS_UE *phy_vars_ue,
|
||||
ulsch->harq_processes[harq_pid]->status = IDLE;
|
||||
ulsch->harq_processes[harq_pid]->round = 0;
|
||||
// inform MAC?
|
||||
phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] = 0;
|
||||
ue->ulsch_Msg3_active[eNB_id] = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
|
||||
unsigned char sched_subframe,
|
||||
int16_t amp,
|
||||
uint8_t sect_id,
|
||||
uint8_t abstraction_flag)
|
||||
void generate_phich_top(PHY_VARS_eNB *eNB,
|
||||
eNB_rxtx_proc_t *proc,
|
||||
int16_t amp,
|
||||
uint8_t sect_id)
|
||||
{
|
||||
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms;
|
||||
LTE_eNB_ULSCH_t **ulsch_eNB = phy_vars_eNB->ulsch_eNB;
|
||||
int32_t **txdataF = phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id];
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&eNB->frame_parms;
|
||||
LTE_eNB_ULSCH_t **ulsch = eNB->ulsch;
|
||||
int32_t **txdataF = eNB->common_vars.txdataF[sect_id];
|
||||
uint8_t harq_pid;
|
||||
uint8_t Ngroup_PHICH,ngroup_PHICH,nseq_PHICH;
|
||||
uint8_t NSF_PHICH = 4;
|
||||
uint8_t pusch_subframe;
|
||||
uint8_t UE_id;
|
||||
uint32_t pusch_frame;
|
||||
int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx;
|
||||
int subframe = proc->subframe_tx;
|
||||
|
||||
// compute Ngroup_PHICH (see formula at beginning of Section 6.9 in 36-211
|
||||
|
||||
@@ -1417,19 +1420,19 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
|
||||
if (frame_parms->Ncp == 1)
|
||||
NSF_PHICH = 2;
|
||||
|
||||
pusch_frame = phich_frame2_pusch_frame(frame_parms,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
|
||||
pusch_frame = phich_frame2_pusch_frame(frame_parms,proc->frame_tx,subframe);
|
||||
pusch_subframe = phich_subframe2_pusch_subframe(frame_parms,subframe);
|
||||
harq_pid = subframe2harq_pid(frame_parms,pusch_frame,pusch_subframe);
|
||||
|
||||
for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
|
||||
if ((ulsch_eNB[UE_id])&&(ulsch_eNB[UE_id]->rnti>0)) {
|
||||
if (ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active == 1) {
|
||||
if ((ulsch[UE_id])&&(ulsch[UE_id]->rnti>0)) {
|
||||
if (ulsch[UE_id]->harq_processes[harq_pid]->phich_active == 1) {
|
||||
|
||||
LOG_D(PHY,"[eNB][PUSCH %d/%x] Frame %d subframe %d (pusch_subframe %d,pusch_frame %d) phich active %d\n",
|
||||
harq_pid,ulsch_eNB[UE_id]->rnti,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,pusch_subframe,pusch_frame,ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active);
|
||||
harq_pid,ulsch[UE_id]->rnti,proc->frame_tx,subframe,pusch_subframe,pusch_frame,ulsch[UE_id]->harq_processes[harq_pid]->phich_active);
|
||||
|
||||
ngroup_PHICH = (ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb +
|
||||
ulsch_eNB[UE_id]->harq_processes[harq_pid]->n_DMRS)%Ngroup_PHICH;
|
||||
ngroup_PHICH = (ulsch[UE_id]->harq_processes[harq_pid]->first_rb +
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->n_DMRS)%Ngroup_PHICH;
|
||||
|
||||
if ((frame_parms->tdd_config == 0) && (frame_parms->frame_type == TDD) ) {
|
||||
|
||||
@@ -1437,28 +1440,28 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
|
||||
ngroup_PHICH += Ngroup_PHICH;
|
||||
}
|
||||
|
||||
nseq_PHICH = ((ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb/Ngroup_PHICH) +
|
||||
ulsch_eNB[UE_id]->harq_processes[harq_pid]->n_DMRS)%(2*NSF_PHICH);
|
||||
nseq_PHICH = ((ulsch[UE_id]->harq_processes[harq_pid]->first_rb/Ngroup_PHICH) +
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->n_DMRS)%(2*NSF_PHICH);
|
||||
LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Generating PHICH, ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d dci_alloc %d)\n",
|
||||
phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,
|
||||
eNB->Mod_id,harq_pid,proc->frame_tx,
|
||||
subframe,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH,
|
||||
ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK,
|
||||
ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb,
|
||||
ulsch_eNB[UE_id]->harq_processes[harq_pid]->dci_alloc);
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK,
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->first_rb,
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->dci_alloc);
|
||||
|
||||
if (ulsch_eNB[UE_id]->Msg3_active == 1) {
|
||||
if (ulsch[UE_id]->Msg3_active == 1) {
|
||||
LOG_D(PHY,"[eNB %d][PUSCH %d][RAPROC] Frame %d, subframe %d: Generating Msg3 PHICH for UE %d, ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d\n",
|
||||
phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,
|
||||
UE_id,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH,ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK,
|
||||
ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb);
|
||||
eNB->Mod_id,harq_pid,proc->frame_tx,subframe,
|
||||
UE_id,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH,ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK,
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->first_rb);
|
||||
}
|
||||
|
||||
if (abstraction_flag == 0) {
|
||||
if (eNB->abstraction_flag == 0) {
|
||||
generate_phich(frame_parms,
|
||||
amp,//amp*2,
|
||||
nseq_PHICH,
|
||||
ngroup_PHICH,
|
||||
ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK,
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK,
|
||||
subframe,
|
||||
txdataF);
|
||||
} else {
|
||||
@@ -1466,7 +1469,7 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
|
||||
generate_phich_emul(frame_parms,
|
||||
//nseq_PHICH,
|
||||
//ngroup_PHICH,
|
||||
ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK,
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK,
|
||||
subframe);
|
||||
*/
|
||||
}
|
||||
@@ -1474,29 +1477,30 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
|
||||
// if no format0 DCI was transmitted by MAC, prepare the
|
||||
// MCS parameters for the retransmission
|
||||
|
||||
if ((ulsch_eNB[UE_id]->harq_processes[harq_pid]->dci_alloc == 0) &&
|
||||
(ulsch_eNB[UE_id]->harq_processes[harq_pid]->rar_alloc == 0) ) {
|
||||
if (ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK==0 ) {
|
||||
T(T_ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION, T_INT(phy_vars_eNB->Mod_id), T_INT(phy_vars_eNB->proc[sched_subframe].frame_tx),
|
||||
T_INT(subframe), T_INT(UE_id), T_INT(ulsch_eNB[UE_id]->rnti), T_INT(harq_pid));
|
||||
|
||||
if ((ulsch[UE_id]->harq_processes[harq_pid]->dci_alloc == 0) &&
|
||||
(ulsch[UE_id]->harq_processes[harq_pid]->rar_alloc == 0) ) {
|
||||
if (ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK==0 ) {
|
||||
T(T_ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION, T_INT(eNB->Mod_id), T_INT(proc->frame_tx),
|
||||
T_INT(subframe), T_INT(UE_id), T_INT(ulsch[UE_id]->rnti), T_INT(harq_pid));
|
||||
LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d, subframe %d : PHICH NACK / (no format0 DCI) Setting subframe_scheduling_flag\n",
|
||||
phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
|
||||
ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
|
||||
ulsch_eNB[UE_id]->harq_processes[harq_pid]->rvidx = rv_table[ulsch_eNB[UE_id]->harq_processes[harq_pid]->round&3];
|
||||
ulsch_eNB[UE_id]->harq_processes[harq_pid]->O_RI = 0;
|
||||
ulsch_eNB[UE_id]->harq_processes[harq_pid]->Or2 = 0;
|
||||
ulsch_eNB[UE_id]->harq_processes[harq_pid]->Or1 = 0;
|
||||
ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format = HLC_subband_cqi_nopmi;
|
||||
eNB->Mod_id,harq_pid,proc->frame_tx,subframe);
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->rvidx = rv_table[ulsch[UE_id]->harq_processes[harq_pid]->round&3];
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->O_RI = 0;
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->Or2 = 0;
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->Or1 = 0;
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->uci_format = HLC_subband_cqi_nopmi;
|
||||
|
||||
} else {
|
||||
LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d PHICH ACK (no format0 DCI) Clearing subframe_scheduling_flag, setting round to 0\n",
|
||||
phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
|
||||
ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0;
|
||||
ulsch_eNB[UE_id]->harq_processes[harq_pid]->round=0;
|
||||
eNB->Mod_id,harq_pid,proc->frame_tx,subframe);
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0;
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->round=0;
|
||||
}
|
||||
}
|
||||
|
||||
ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active=0;
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->phich_active=0;
|
||||
} // phich_active==1
|
||||
} //ulsch_ue[UE_id] is non-null
|
||||
}// UE loop
|
||||
|
||||
@@ -11,13 +11,13 @@
|
||||
//#include "defs.h"
|
||||
#include "PHY/defs.h"
|
||||
|
||||
void generate_pilots(PHY_VARS_eNB *phy_vars_eNB,
|
||||
void generate_pilots(PHY_VARS_eNB *eNB,
|
||||
int32_t **txdataF,
|
||||
int16_t amp,
|
||||
uint16_t Ntti)
|
||||
{
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
|
||||
|
||||
uint32_t tti,tti_offset,slot_offset,Nsymb,samples_per_symbol;
|
||||
uint8_t second_pilot;
|
||||
@@ -42,7 +42,7 @@ void generate_pilots(PHY_VARS_eNB *phy_vars_eNB,
|
||||
//Generate Pilots
|
||||
|
||||
//antenna 0 symbol 0 slot 0
|
||||
lte_dl_cell_spec(phy_vars_eNB,&txdataF[0][tti_offset],
|
||||
lte_dl_cell_spec(eNB,&txdataF[0][tti_offset],
|
||||
amp,
|
||||
slot_offset,
|
||||
0,
|
||||
@@ -51,7 +51,7 @@ void generate_pilots(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
// printf("tti %d : second_pilot offset %d \n",tti,tti_offset+(second_pilot*samples_per_symbol));
|
||||
//antenna 0 symbol 3/4 slot 0
|
||||
lte_dl_cell_spec(phy_vars_eNB,&txdataF[0][tti_offset+(second_pilot*samples_per_symbol)],
|
||||
lte_dl_cell_spec(eNB,&txdataF[0][tti_offset+(second_pilot*samples_per_symbol)],
|
||||
amp,
|
||||
slot_offset,
|
||||
1,
|
||||
@@ -59,7 +59,7 @@ void generate_pilots(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
// printf("tti %d : third_pilot offset %d \n",tti,tti_offset+((Nsymb>>1)*samples_per_symbol));
|
||||
//antenna 0 symbol 0 slot 1
|
||||
lte_dl_cell_spec(phy_vars_eNB,&txdataF[0][tti_offset+((Nsymb>>1)*samples_per_symbol)],
|
||||
lte_dl_cell_spec(eNB,&txdataF[0][tti_offset+((Nsymb>>1)*samples_per_symbol)],
|
||||
amp,
|
||||
1+slot_offset,
|
||||
0,
|
||||
@@ -67,7 +67,7 @@ void generate_pilots(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
// printf("tti %d : third_pilot offset %d \n",tti,tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol));
|
||||
//antenna 0 symbol 3/4 slot 1
|
||||
lte_dl_cell_spec(phy_vars_eNB,&txdataF[0][tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol)],
|
||||
lte_dl_cell_spec(eNB,&txdataF[0][tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol)],
|
||||
amp,
|
||||
1+slot_offset,
|
||||
1,
|
||||
@@ -77,28 +77,28 @@ void generate_pilots(PHY_VARS_eNB *phy_vars_eNB,
|
||||
if (frame_parms->nb_antennas_tx > 1) {
|
||||
if (frame_parms->mode1_flag) {
|
||||
// antenna 1 symbol 0 slot 0
|
||||
lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset],
|
||||
lte_dl_cell_spec(eNB,&txdataF[1][tti_offset],
|
||||
amp,
|
||||
slot_offset,
|
||||
0,
|
||||
0);
|
||||
|
||||
// antenna 1 symbol 3 slot 0
|
||||
lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset+(second_pilot*samples_per_symbol)],
|
||||
lte_dl_cell_spec(eNB,&txdataF[1][tti_offset+(second_pilot*samples_per_symbol)],
|
||||
amp,
|
||||
slot_offset,
|
||||
1,
|
||||
0);
|
||||
|
||||
//antenna 1 symbol 0 slot 1
|
||||
lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset+(Nsymb>>1)*samples_per_symbol],
|
||||
lte_dl_cell_spec(eNB,&txdataF[1][tti_offset+(Nsymb>>1)*samples_per_symbol],
|
||||
amp,
|
||||
1+slot_offset,
|
||||
0,
|
||||
0);
|
||||
|
||||
// antenna 1 symbol 3 slot 1
|
||||
lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol)],
|
||||
lte_dl_cell_spec(eNB,&txdataF[1][tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol)],
|
||||
amp,
|
||||
1+slot_offset,
|
||||
1,
|
||||
@@ -107,28 +107,28 @@ void generate_pilots(PHY_VARS_eNB *phy_vars_eNB,
|
||||
} else {
|
||||
|
||||
// antenna 1 symbol 0 slot 0
|
||||
lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset],
|
||||
lte_dl_cell_spec(eNB,&txdataF[1][tti_offset],
|
||||
amp,
|
||||
slot_offset,
|
||||
0,
|
||||
1);
|
||||
|
||||
// antenna 1 symbol 3 slot 0
|
||||
lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset+(second_pilot*samples_per_symbol)],
|
||||
lte_dl_cell_spec(eNB,&txdataF[1][tti_offset+(second_pilot*samples_per_symbol)],
|
||||
amp,
|
||||
slot_offset,
|
||||
1,
|
||||
1);
|
||||
|
||||
//antenna 1 symbol 0 slot 1
|
||||
lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset+(Nsymb>>1)*samples_per_symbol],
|
||||
lte_dl_cell_spec(eNB,&txdataF[1][tti_offset+(Nsymb>>1)*samples_per_symbol],
|
||||
amp,
|
||||
1+slot_offset,
|
||||
0,
|
||||
1);
|
||||
|
||||
// antenna 1 symbol 3 slot 1
|
||||
lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol)],
|
||||
lte_dl_cell_spec(eNB,&txdataF[1][tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol)],
|
||||
amp,
|
||||
1+slot_offset,
|
||||
1,
|
||||
@@ -138,14 +138,14 @@ void generate_pilots(PHY_VARS_eNB *phy_vars_eNB,
|
||||
}
|
||||
}
|
||||
|
||||
int generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB,
|
||||
int generate_pilots_slot(PHY_VARS_eNB *eNB,
|
||||
int32_t **txdataF,
|
||||
int16_t amp,
|
||||
uint16_t slot,
|
||||
int first_pilot_only)
|
||||
{
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
|
||||
uint32_t slot_offset,Nsymb,samples_per_symbol;
|
||||
uint8_t second_pilot;
|
||||
|
||||
@@ -165,7 +165,7 @@ int generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB,
|
||||
//Generate Pilots
|
||||
|
||||
//antenna 0 symbol 0 slot 0
|
||||
lte_dl_cell_spec(phy_vars_eNB,
|
||||
lte_dl_cell_spec(eNB,
|
||||
&txdataF[0][slot_offset],
|
||||
amp,
|
||||
slot,
|
||||
@@ -175,7 +175,7 @@ int generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
if (first_pilot_only==0) {
|
||||
//antenna 0 symbol 3 slot 0
|
||||
lte_dl_cell_spec(phy_vars_eNB,
|
||||
lte_dl_cell_spec(eNB,
|
||||
&txdataF[0][slot_offset+(second_pilot*samples_per_symbol)],
|
||||
amp,
|
||||
slot,
|
||||
@@ -186,7 +186,7 @@ int generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB,
|
||||
if (frame_parms->nb_antennas_tx > 1) {
|
||||
if (frame_parms->mode1_flag) {
|
||||
// antenna 1 symbol 0 slot 0
|
||||
lte_dl_cell_spec(phy_vars_eNB,
|
||||
lte_dl_cell_spec(eNB,
|
||||
&txdataF[1][slot_offset],
|
||||
amp,
|
||||
slot,
|
||||
@@ -195,7 +195,7 @@ int generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
if (first_pilot_only==0) {
|
||||
// antenna 1 symbol 3 slot 0
|
||||
lte_dl_cell_spec(phy_vars_eNB,
|
||||
lte_dl_cell_spec(eNB,
|
||||
&txdataF[1][slot_offset+(second_pilot*samples_per_symbol)],
|
||||
amp,
|
||||
slot,
|
||||
@@ -205,7 +205,7 @@ int generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB,
|
||||
} else {
|
||||
|
||||
// antenna 1 symbol 0 slot 0
|
||||
lte_dl_cell_spec(phy_vars_eNB,
|
||||
lte_dl_cell_spec(eNB,
|
||||
&txdataF[1][slot_offset],
|
||||
amp,
|
||||
slot,
|
||||
@@ -214,7 +214,7 @@ int generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
if (first_pilot_only == 0) {
|
||||
// antenna 1 symbol 3 slot 0
|
||||
lte_dl_cell_spec(phy_vars_eNB,
|
||||
lte_dl_cell_spec(eNB,
|
||||
&txdataF[1][slot_offset+(second_pilot*samples_per_symbol)],
|
||||
amp,
|
||||
slot,
|
||||
|
||||
@@ -12,15 +12,16 @@
|
||||
#include "PHY/defs.h"
|
||||
|
||||
|
||||
int generate_mbsfn_pilot(PHY_VARS_eNB *phy_vars_eNB,
|
||||
int generate_mbsfn_pilot(PHY_VARS_eNB *eNB,
|
||||
eNB_rxtx_proc_t *proc,
|
||||
int32_t **txdataF,
|
||||
int16_t amp,
|
||||
uint16_t subframe)
|
||||
int16_t amp)
|
||||
|
||||
{
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
|
||||
uint32_t subframe_offset,Nsymb,samples_per_symbol;
|
||||
|
||||
int subframe = proc->subframe_tx;
|
||||
|
||||
|
||||
if (subframe<0 || subframe>= 10) {
|
||||
@@ -37,7 +38,7 @@ int generate_mbsfn_pilot(PHY_VARS_eNB *phy_vars_eNB,
|
||||
//Generate Pilots
|
||||
|
||||
//antenna 4 symbol 2 Slot 0
|
||||
lte_dl_mbsfn(phy_vars_eNB,
|
||||
lte_dl_mbsfn(eNB,
|
||||
&txdataF[0][subframe_offset+(2*samples_per_symbol)],
|
||||
amp,
|
||||
subframe,
|
||||
@@ -46,14 +47,14 @@ int generate_mbsfn_pilot(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
|
||||
//antenna 4 symbol 0 slot 1
|
||||
lte_dl_mbsfn(phy_vars_eNB,
|
||||
lte_dl_mbsfn(eNB,
|
||||
&txdataF[0][subframe_offset+(6*samples_per_symbol)],
|
||||
amp,
|
||||
subframe,
|
||||
1);
|
||||
|
||||
//antenna 4 symbol 4 slot 1
|
||||
lte_dl_mbsfn(phy_vars_eNB,
|
||||
lte_dl_mbsfn(eNB,
|
||||
&txdataF[0][subframe_offset+(10*samples_per_symbol)],
|
||||
amp,
|
||||
subframe,
|
||||
|
||||
+103
-101
@@ -20,50 +20,50 @@
|
||||
|
||||
|
||||
|
||||
void dump_mch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword,int subframe)
|
||||
void dump_mch(PHY_VARS_UE *ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword,int subframe)
|
||||
{
|
||||
|
||||
unsigned int nsymb_pmch=12;
|
||||
char fname[32],vname[32];
|
||||
int N_RB_DL=phy_vars_ue->lte_frame_parms.N_RB_DL;
|
||||
int N_RB_DL=ue->frame_parms.N_RB_DL;
|
||||
|
||||
sprintf(fname,"mch_rxF_ext0.m");
|
||||
sprintf(vname,"pmch_rxF_ext0");
|
||||
write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->rxdataF_ext[0],12*N_RB_DL*nsymb_pmch,1,1);
|
||||
write_output(fname,vname,ue->pdsch_vars_MCH[eNB_id]->rxdataF_ext[0],12*N_RB_DL*nsymb_pmch,1,1);
|
||||
sprintf(fname,"mch_ch_ext00.m");
|
||||
sprintf(vname,"pmch_ch_ext00");
|
||||
write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->dl_ch_estimates_ext[0],12*N_RB_DL*nsymb_pmch,1,1);
|
||||
write_output(fname,vname,ue->pdsch_vars_MCH[eNB_id]->dl_ch_estimates_ext[0],12*N_RB_DL*nsymb_pmch,1,1);
|
||||
/*
|
||||
write_output("dlsch%d_ch_ext01.m","dl01_ch0_ext",lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb_pmch,1,1);
|
||||
write_output("dlsch%d_ch_ext10.m","dl10_ch0_ext",lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb_pmch,1,1);
|
||||
write_output("dlsch%d_ch_ext11.m","dl11_ch0_ext",lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb_pmch,1,1);
|
||||
write_output("dlsch%d_rho.m","dl_rho",lte_ue_pdsch_vars[eNB_id]->rho[0],12*N_RB_DL*nsymb_pmch,1,1);
|
||||
write_output("dlsch%d_ch_ext01.m","dl01_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb_pmch,1,1);
|
||||
write_output("dlsch%d_ch_ext10.m","dl10_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb_pmch,1,1);
|
||||
write_output("dlsch%d_ch_ext11.m","dl11_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb_pmch,1,1);
|
||||
write_output("dlsch%d_rho.m","dl_rho",pdsch_vars[eNB_id]->rho[0],12*N_RB_DL*nsymb_pmch,1,1);
|
||||
*/
|
||||
sprintf(fname,"mch_rxF_comp0.m");
|
||||
sprintf(vname,"pmch_rxF_comp0");
|
||||
write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb_pmch,1,1);
|
||||
write_output(fname,vname,ue->pdsch_vars_MCH[eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb_pmch,1,1);
|
||||
sprintf(fname,"mch_rxF_llr.m");
|
||||
sprintf(vname,"pmch_llr");
|
||||
write_output(fname,vname, phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->llr[0],coded_bits_per_codeword,1,0);
|
||||
write_output(fname,vname, ue->pdsch_vars_MCH[eNB_id]->llr[0],coded_bits_per_codeword,1,0);
|
||||
sprintf(fname,"mch_mag1.m");
|
||||
sprintf(vname,"pmch_mag1");
|
||||
write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb_pmch,1,1);
|
||||
write_output(fname,vname,ue->pdsch_vars_MCH[eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb_pmch,1,1);
|
||||
sprintf(fname,"mch_mag2.m");
|
||||
sprintf(vname,"pmch_mag2");
|
||||
write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb_pmch,1,1);
|
||||
write_output(fname,vname,ue->pdsch_vars_MCH[eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb_pmch,1,1);
|
||||
|
||||
write_output("mch00_ch0.m","pmch00_ch0",
|
||||
&(phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][0][0]),
|
||||
phy_vars_ue->lte_frame_parms.ofdm_symbol_size*12,1,1);
|
||||
&(ue->common_vars.dl_ch_estimates[eNB_id][0][0]),
|
||||
ue->frame_parms.ofdm_symbol_size*12,1,1);
|
||||
|
||||
write_output("rxsig_mch.m","rxs_mch",
|
||||
&phy_vars_ue->lte_ue_common_vars.rxdata[0][subframe*phy_vars_ue->lte_frame_parms.samples_per_tti],
|
||||
phy_vars_ue->lte_frame_parms.samples_per_tti,1,1);
|
||||
&ue->common_vars.rxdata[0][subframe*ue->frame_parms.samples_per_tti],
|
||||
ue->frame_parms.samples_per_tti,1,1);
|
||||
|
||||
if (PHY_vars_eNB_g)
|
||||
write_output("txsig_mch.m","txs_mch",
|
||||
&PHY_vars_eNB_g[0][0]->lte_eNB_common_vars.txdata[0][0][subframe*phy_vars_ue->lte_frame_parms.samples_per_tti],
|
||||
phy_vars_ue->lte_frame_parms.samples_per_tti,1,1);
|
||||
&PHY_vars_eNB_g[0][0]->common_vars.txdata[0][0][subframe*ue->frame_parms.samples_per_tti],
|
||||
ue->frame_parms.samples_per_tti,1,1);
|
||||
}
|
||||
|
||||
int is_pmch_subframe(uint32_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_parms)
|
||||
@@ -162,11 +162,11 @@ int is_pmch_subframe(uint32_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_par
|
||||
return(0);
|
||||
}
|
||||
|
||||
void fill_eNB_dlsch_MCH(PHY_VARS_eNB *phy_vars_eNB,int mcs,int ndi,int rvidx, int abstraction_flag)
|
||||
void fill_eNB_dlsch_MCH(PHY_VARS_eNB *eNB,int mcs,int ndi,int rvidx)
|
||||
{
|
||||
|
||||
LTE_eNB_DLSCH_t *dlsch = phy_vars_eNB->dlsch_eNB_MCH;
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms;
|
||||
LTE_eNB_DLSCH_t *dlsch = eNB->dlsch_MCH;
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&eNB->frame_parms;
|
||||
|
||||
// dlsch->rnti = M_RNTI;
|
||||
dlsch->harq_processes[0]->mcs = mcs;
|
||||
@@ -199,24 +199,24 @@ void fill_eNB_dlsch_MCH(PHY_VARS_eNB *phy_vars_eNB,int mcs,int ndi,int rvidx, in
|
||||
break;
|
||||
}
|
||||
|
||||
if (abstraction_flag) {
|
||||
eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].cntl.pmch_flag=1;
|
||||
eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].num_pmch=1; // assumption: there is always one pmch in each SF
|
||||
eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].num_common_dci=0;
|
||||
eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].num_ue_spec_dci=0;
|
||||
eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].dlsch_type[0]=5;// put at the reserved position for PMCH
|
||||
eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].harq_pid[0]=0;
|
||||
eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].ue_id[0]=255;//broadcast
|
||||
eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].tbs[0]=dlsch->harq_processes[0]->TBS>>3;
|
||||
if (eNB->abstraction_flag) {
|
||||
eNB_transport_info[eNB->Mod_id][eNB->CC_id].cntl.pmch_flag=1;
|
||||
eNB_transport_info[eNB->Mod_id][eNB->CC_id].num_pmch=1; // assumption: there is always one pmch in each SF
|
||||
eNB_transport_info[eNB->Mod_id][eNB->CC_id].num_common_dci=0;
|
||||
eNB_transport_info[eNB->Mod_id][eNB->CC_id].num_ue_spec_dci=0;
|
||||
eNB_transport_info[eNB->Mod_id][eNB->CC_id].dlsch_type[0]=5;// put at the reserved position for PMCH
|
||||
eNB_transport_info[eNB->Mod_id][eNB->CC_id].harq_pid[0]=0;
|
||||
eNB_transport_info[eNB->Mod_id][eNB->CC_id].ue_id[0]=255;//broadcast
|
||||
eNB_transport_info[eNB->Mod_id][eNB->CC_id].tbs[0]=dlsch->harq_processes[0]->TBS>>3;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void fill_UE_dlsch_MCH(PHY_VARS_UE *phy_vars_ue,int mcs,int ndi,int rvidx,int eNB_id)
|
||||
void fill_UE_dlsch_MCH(PHY_VARS_UE *ue,int mcs,int ndi,int rvidx,int eNB_id)
|
||||
{
|
||||
|
||||
LTE_UE_DLSCH_t *dlsch = phy_vars_ue->dlsch_ue_MCH[eNB_id];
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms;
|
||||
LTE_UE_DLSCH_t *dlsch = ue->dlsch_MCH[eNB_id];
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
|
||||
|
||||
// dlsch->rnti = M_RNTI;
|
||||
dlsch->harq_processes[0]->mcs = mcs;
|
||||
@@ -258,59 +258,59 @@ void fill_UE_dlsch_MCH(PHY_VARS_UE *phy_vars_ue,int mcs,int ndi,int rvidx,int eN
|
||||
}
|
||||
}
|
||||
|
||||
void generate_mch(PHY_VARS_eNB *phy_vars_eNB,int sched_subframe,uint8_t *a,int abstraction_flag)
|
||||
void generate_mch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,uint8_t *a)
|
||||
{
|
||||
|
||||
int G;
|
||||
int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx;
|
||||
int subframe = proc->subframe_tx;
|
||||
|
||||
if (abstraction_flag != 0) {
|
||||
if (eNB_transport_info_TB_index[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]!=0)
|
||||
printf("[PHY][EMU] PMCH transport block position is different than zero %d \n", eNB_transport_info_TB_index[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]);
|
||||
if (eNB->abstraction_flag != 0) {
|
||||
if (eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]!=0)
|
||||
printf("[PHY][EMU] PMCH transport block position is different than zero %d \n", eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]);
|
||||
|
||||
memcpy(phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->b,
|
||||
memcpy(eNB->dlsch_MCH->harq_processes[0]->b,
|
||||
a,
|
||||
phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3);
|
||||
eNB->dlsch_MCH->harq_processes[0]->TBS>>3);
|
||||
LOG_D(PHY, "[eNB %d] dlsch_encoding_emul pmch , tbs is %d \n",
|
||||
phy_vars_eNB->Mod_id,
|
||||
phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3);
|
||||
eNB->Mod_id,
|
||||
eNB->dlsch_MCH->harq_processes[0]->TBS>>3);
|
||||
|
||||
memcpy(&eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].transport_blocks[eNB_transport_info_TB_index[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]],
|
||||
memcpy(&eNB_transport_info[eNB->Mod_id][eNB->CC_id].transport_blocks[eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]],
|
||||
a,
|
||||
phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3);
|
||||
eNB_transport_info_TB_index[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]+= phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3;//=eNB_transport_info[phy_vars_eNB->Mod_id].tbs[0];
|
||||
eNB->dlsch_MCH->harq_processes[0]->TBS>>3);
|
||||
eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]+= eNB->dlsch_MCH->harq_processes[0]->TBS>>3;//=eNB_transport_info[eNB->Mod_id].tbs[0];
|
||||
} else {
|
||||
G = get_G(&phy_vars_eNB->lte_frame_parms,
|
||||
phy_vars_eNB->lte_frame_parms.N_RB_DL,
|
||||
phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->rb_alloc,
|
||||
get_Qm(phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->mcs),1,
|
||||
2,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
|
||||
G = get_G(&eNB->frame_parms,
|
||||
eNB->frame_parms.N_RB_DL,
|
||||
eNB->dlsch_MCH->harq_processes[0]->rb_alloc,
|
||||
get_Qm(eNB->dlsch_MCH->harq_processes[0]->mcs),1,
|
||||
2,proc->frame_tx,subframe);
|
||||
|
||||
generate_mbsfn_pilot(phy_vars_eNB,
|
||||
phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||
AMP,
|
||||
subframe);
|
||||
generate_mbsfn_pilot(eNB,proc,
|
||||
eNB->common_vars.txdataF[0],
|
||||
AMP);
|
||||
|
||||
if (dlsch_encoding(a,
|
||||
&phy_vars_eNB->lte_frame_parms,
|
||||
|
||||
if (dlsch_encoding(eNB,
|
||||
a,
|
||||
1,
|
||||
phy_vars_eNB->dlsch_eNB_MCH,
|
||||
phy_vars_eNB->proc[sched_subframe].frame_tx,
|
||||
eNB->dlsch_MCH,
|
||||
proc->frame_tx,
|
||||
subframe,
|
||||
&phy_vars_eNB->dlsch_rate_matching_stats,
|
||||
&phy_vars_eNB->dlsch_turbo_encoding_stats,
|
||||
&phy_vars_eNB->dlsch_interleaving_stats
|
||||
&eNB->dlsch_rate_matching_stats,
|
||||
&eNB->dlsch_turbo_encoding_stats,
|
||||
&eNB->dlsch_interleaving_stats
|
||||
)<0)
|
||||
mac_xface->macphy_exit("problem in dlsch_encoding");
|
||||
|
||||
dlsch_scrambling(&phy_vars_eNB->lte_frame_parms,1,phy_vars_eNB->dlsch_eNB_MCH,G,0,subframe<<1);
|
||||
dlsch_scrambling(&eNB->frame_parms,1,eNB->dlsch_MCH,G,0,subframe<<1);
|
||||
|
||||
|
||||
mch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
|
||||
mch_modulation(eNB->common_vars.txdataF[0],
|
||||
AMP,
|
||||
subframe,
|
||||
&phy_vars_eNB->lte_frame_parms,
|
||||
phy_vars_eNB->dlsch_eNB_MCH);
|
||||
&eNB->frame_parms,
|
||||
eNB->dlsch_MCH);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -351,6 +351,7 @@ void mch_extract_rbs(int **rxdataF,
|
||||
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)],
|
||||
frame_parms->N_RB_DL*24);
|
||||
@@ -360,6 +361,7 @@ void mch_extract_rbs(int **rxdataF,
|
||||
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);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -932,30 +934,30 @@ void mch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
}
|
||||
|
||||
int avg_pmch[4];
|
||||
int rx_pmch(PHY_VARS_UE *phy_vars_ue,
|
||||
int rx_pmch(PHY_VARS_UE *ue,
|
||||
unsigned char eNB_id,
|
||||
uint8_t subframe,
|
||||
unsigned char symbol)
|
||||
{
|
||||
|
||||
LTE_UE_COMMON *lte_ue_common_vars = &phy_vars_ue->lte_ue_common_vars;
|
||||
LTE_UE_PDSCH **lte_ue_pdsch_vars = &phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id];
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms;
|
||||
LTE_UE_DLSCH_t **dlsch_ue = &phy_vars_ue->dlsch_ue_MCH[eNB_id];
|
||||
LTE_UE_COMMON *common_vars = &ue->common_vars;
|
||||
LTE_UE_PDSCH **pdsch_vars = &ue->pdsch_vars_MCH[eNB_id];
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
||||
LTE_UE_DLSCH_t **dlsch = &ue->dlsch_MCH[eNB_id];
|
||||
int avgs,aarx;
|
||||
|
||||
//printf("*********************mch: symbol %d\n",symbol);
|
||||
|
||||
mch_extract_rbs(lte_ue_common_vars->rxdataF,
|
||||
lte_ue_common_vars->dl_ch_estimates[eNB_id],
|
||||
lte_ue_pdsch_vars[eNB_id]->rxdataF_ext,
|
||||
lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
|
||||
mch_extract_rbs(common_vars->rxdataF,
|
||||
common_vars->dl_ch_estimates[eNB_id],
|
||||
pdsch_vars[eNB_id]->rxdataF_ext,
|
||||
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
|
||||
symbol,
|
||||
subframe,
|
||||
frame_parms);
|
||||
|
||||
if (symbol == 2) {
|
||||
mch_channel_level(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
|
||||
mch_channel_level(pdsch_vars[eNB_id]->dl_ch_estimates_ext,
|
||||
frame_parms,
|
||||
avg_pmch,
|
||||
symbol,
|
||||
@@ -967,55 +969,55 @@ int rx_pmch(PHY_VARS_UE *phy_vars_ue,
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++)
|
||||
avgs = cmax(avgs,avg_pmch[aarx]);
|
||||
|
||||
if (get_Qm(dlsch_ue[0]->harq_processes[0]->mcs)==2)
|
||||
lte_ue_pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2) ;// + 2
|
||||
if (get_Qm(dlsch[0]->harq_processes[0]->mcs)==2)
|
||||
pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2) ;// + 2
|
||||
else
|
||||
lte_ue_pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2); // + 5;// + 2
|
||||
pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2); // + 5;// + 2
|
||||
|
||||
mch_channel_compensation(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext,
|
||||
lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
|
||||
lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
|
||||
lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0,
|
||||
lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
|
||||
mch_channel_compensation(pdsch_vars[eNB_id]->rxdataF_ext,
|
||||
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
|
||||
pdsch_vars[eNB_id]->dl_ch_mag0,
|
||||
pdsch_vars[eNB_id]->dl_ch_magb0,
|
||||
pdsch_vars[eNB_id]->rxdataF_comp0,
|
||||
frame_parms,
|
||||
symbol,
|
||||
get_Qm(dlsch_ue[0]->harq_processes[0]->mcs),
|
||||
lte_ue_pdsch_vars[eNB_id]->log2_maxh);
|
||||
get_Qm(dlsch[0]->harq_processes[0]->mcs),
|
||||
pdsch_vars[eNB_id]->log2_maxh);
|
||||
|
||||
|
||||
if (frame_parms->nb_antennas_rx > 1)
|
||||
mch_detection_mrc(frame_parms,
|
||||
lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
|
||||
lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
|
||||
lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0,
|
||||
pdsch_vars[eNB_id]->rxdataF_comp0,
|
||||
pdsch_vars[eNB_id]->dl_ch_mag0,
|
||||
pdsch_vars[eNB_id]->dl_ch_magb0,
|
||||
symbol);
|
||||
|
||||
switch (get_Qm(dlsch_ue[0]->harq_processes[0]->mcs)) {
|
||||
switch (get_Qm(dlsch[0]->harq_processes[0]->mcs)) {
|
||||
case 2 :
|
||||
mch_qpsk_llr(frame_parms,
|
||||
lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
|
||||
lte_ue_pdsch_vars[eNB_id]->llr[0],
|
||||
pdsch_vars[eNB_id]->rxdataF_comp0,
|
||||
pdsch_vars[eNB_id]->llr[0],
|
||||
symbol,
|
||||
lte_ue_pdsch_vars[eNB_id]->llr128);
|
||||
pdsch_vars[eNB_id]->llr128);
|
||||
break;
|
||||
|
||||
case 4:
|
||||
mch_16qam_llr(frame_parms,
|
||||
lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
|
||||
lte_ue_pdsch_vars[eNB_id]->llr[0],
|
||||
lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
|
||||
pdsch_vars[eNB_id]->rxdataF_comp0,
|
||||
pdsch_vars[eNB_id]->llr[0],
|
||||
pdsch_vars[eNB_id]->dl_ch_mag0,
|
||||
symbol,
|
||||
lte_ue_pdsch_vars[eNB_id]->llr128);
|
||||
pdsch_vars[eNB_id]->llr128);
|
||||
break;
|
||||
|
||||
case 6:
|
||||
mch_64qam_llr(frame_parms,
|
||||
lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
|
||||
lte_ue_pdsch_vars[eNB_id]->llr[0],
|
||||
lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
|
||||
lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0,
|
||||
pdsch_vars[eNB_id]->rxdataF_comp0,
|
||||
pdsch_vars[eNB_id]->llr[0],
|
||||
pdsch_vars[eNB_id]->dl_ch_mag0,
|
||||
pdsch_vars[eNB_id]->dl_ch_magb0,
|
||||
symbol,
|
||||
lte_ue_pdsch_vars[eNB_id]->llr128);
|
||||
pdsch_vars[eNB_id]->llr128);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
+306
-222
@@ -12,6 +12,7 @@
|
||||
#include "PHY/defs.h"
|
||||
#include "PHY/extern.h"
|
||||
//#include "prach.h"
|
||||
#include "PHY/LTE_TRANSPORT/if4_tools.h"
|
||||
#include "SCHED/defs.h"
|
||||
#include "SCHED/extern.h"
|
||||
#include "UTIL/LOG/vcd_signal_dumper.h"
|
||||
@@ -566,23 +567,23 @@ int is_prach_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame, uint8_t su
|
||||
return(2==1);
|
||||
}
|
||||
|
||||
int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subframe, uint16_t Nf )
|
||||
int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint16_t Nf )
|
||||
{
|
||||
|
||||
lte_frame_type_t frame_type = phy_vars_ue->lte_frame_parms.frame_type;
|
||||
//uint8_t tdd_config = phy_vars_ue->lte_frame_parms.tdd_config;
|
||||
uint16_t rootSequenceIndex = phy_vars_ue->lte_frame_parms.prach_config_common.rootSequenceIndex;
|
||||
uint8_t prach_ConfigIndex = phy_vars_ue->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex;
|
||||
uint8_t Ncs_config = phy_vars_ue->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig;
|
||||
uint8_t restricted_set = phy_vars_ue->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag;
|
||||
//uint8_t n_ra_prboffset = phy_vars_ue->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset;
|
||||
uint8_t preamble_index = phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex;
|
||||
uint8_t tdd_mapindex = phy_vars_ue->prach_resources[eNB_id]->ra_TDD_map_index;
|
||||
int16_t *prachF = phy_vars_ue->lte_ue_prach_vars[eNB_id]->prachF;
|
||||
lte_frame_type_t frame_type = ue->frame_parms.frame_type;
|
||||
//uint8_t tdd_config = ue->frame_parms.tdd_config;
|
||||
uint16_t rootSequenceIndex = ue->frame_parms.prach_config_common.rootSequenceIndex;
|
||||
uint8_t prach_ConfigIndex = ue->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex;
|
||||
uint8_t Ncs_config = ue->frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig;
|
||||
uint8_t restricted_set = ue->frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag;
|
||||
//uint8_t n_ra_prboffset = ue->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset;
|
||||
uint8_t preamble_index = ue->prach_resources[eNB_id]->ra_PreambleIndex;
|
||||
uint8_t tdd_mapindex = ue->prach_resources[eNB_id]->ra_TDD_map_index;
|
||||
int16_t *prachF = ue->prach_vars[eNB_id]->prachF;
|
||||
static int16_t prach_tmp[45600*2] __attribute__((aligned(32)));
|
||||
int16_t *prach = prach_tmp;
|
||||
int16_t *prach2;
|
||||
int16_t amp = phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp;
|
||||
int16_t amp = ue->prach_vars[eNB_id]->amp;
|
||||
int16_t Ncp;
|
||||
uint8_t n_ra_prb;
|
||||
uint16_t NCS;
|
||||
@@ -605,23 +606,20 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra
|
||||
int i, prach_len;
|
||||
uint16_t first_nonzero_root_idx=0;
|
||||
|
||||
#ifdef BIT8_TX
|
||||
prach_start = ((subframe*phy_vars_ue->lte_frame_parms.samples_per_tti)<<1)-phy_vars_ue->N_TA_offset;
|
||||
#else
|
||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
||||
prach_start = (phy_vars_ue->rx_offset+subframe*phy_vars_ue->lte_frame_parms.samples_per_tti-openair_daq_vars.timing_advance-phy_vars_ue->N_TA_offset);
|
||||
prach_start = (ue->rx_offset+subframe*ue->frame_parms.samples_per_tti-ue->hw_timing_advance-ue->N_TA_offset);
|
||||
|
||||
if (prach_start<0)
|
||||
prach_start+=(phy_vars_ue->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
|
||||
prach_start+=(ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
|
||||
|
||||
if (prach_start>=(phy_vars_ue->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME))
|
||||
prach_start-=(phy_vars_ue->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
|
||||
if (prach_start>=(ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME))
|
||||
prach_start-=(ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
|
||||
|
||||
#else //normal case (simulation)
|
||||
prach_start = subframe*phy_vars_ue->lte_frame_parms.samples_per_tti-phy_vars_ue->N_TA_offset;
|
||||
#endif
|
||||
prach_start = subframe*ue->frame_parms.samples_per_tti-ue->N_TA_offset;
|
||||
#endif
|
||||
|
||||
|
||||
// First compute physical root sequence
|
||||
if (restricted_set == 0) {
|
||||
if (Ncs_config > 15) {
|
||||
@@ -641,7 +639,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra
|
||||
NCS = NCS_restricted[Ncs_config];
|
||||
}
|
||||
|
||||
n_ra_prb = get_prach_prb_offset(&(phy_vars_ue->lte_frame_parms), tdd_mapindex, Nf);
|
||||
n_ra_prb = get_prach_prb_offset(&(ue->frame_parms), tdd_mapindex, Nf);
|
||||
prach_root_sequence_map = (prach_fmt<4) ? prach_root_sequence_map0_3 : prach_root_sequence_map4;
|
||||
|
||||
/*
|
||||
@@ -649,7 +647,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra
|
||||
if (frame_type == TDD) { // TDD
|
||||
|
||||
if (tdd_preamble_map[prach_ConfigIndex][tdd_config].num_prach==0) {
|
||||
LOG_E( PHY, "[PHY][UE %"PRIu8"] Illegal prach_ConfigIndex %"PRIu8" for ", phy_vars_ue->Mod_id, prach_ConfigIndex );
|
||||
LOG_E( PHY, "[PHY][UE %"PRIu8"] Illegal prach_ConfigIndex %"PRIu8" for ", ue->Mod_id, prach_ConfigIndex );
|
||||
}
|
||||
|
||||
// adjust n_ra_prboffset for frequency multiplexing (p.36 36.211)
|
||||
@@ -659,7 +657,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra
|
||||
if ((f_ra&1) == 0) {
|
||||
n_ra_prb = n_ra_prboffset + 6*(f_ra>>1);
|
||||
} else {
|
||||
n_ra_prb = phy_vars_ue->lte_frame_parms.N_RB_UL - 6 - n_ra_prboffset + 6*(f_ra>>1);
|
||||
n_ra_prb = ue->frame_parms.N_RB_UL - 6 - n_ra_prboffset + 6*(f_ra>>1);
|
||||
}
|
||||
} else {
|
||||
if ((tdd_config >2) && (tdd_config<6))
|
||||
@@ -670,7 +668,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra
|
||||
if ((((Nf&1)*(2-Nsp)+t1_ra)&1) == 0) {
|
||||
n_ra_prb = 6*f_ra;
|
||||
} else {
|
||||
n_ra_prb = phy_vars_ue->lte_frame_parms.N_RB_UL - 6*(f_ra+1);
|
||||
n_ra_prb = ue->frame_parms.N_RB_UL - 6*(f_ra+1);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -686,7 +684,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra
|
||||
} else { // This is the high-speed case
|
||||
|
||||
#ifdef PRACH_DEBUG
|
||||
LOG_D(PHY,"[UE %d] High-speed mode, NCS_config %d\n",phy_vars_ue->Mod_id,Ncs_config);
|
||||
LOG_D(PHY,"[UE %d] High-speed mode, NCS_config %d\n",ue->Mod_id,Ncs_config);
|
||||
#endif
|
||||
|
||||
not_found = 1;
|
||||
@@ -756,24 +754,24 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra
|
||||
// nsymb = (frame_parms->Ncp==0) ? 14:12;
|
||||
// subframe_offset = (unsigned int)frame_parms->ofdm_symbol_size*subframe*nsymb;
|
||||
|
||||
k = (12*n_ra_prb) - 6*phy_vars_ue->lte_frame_parms.N_RB_UL;
|
||||
k = (12*n_ra_prb) - 6*ue->frame_parms.N_RB_UL;
|
||||
|
||||
if (k<0)
|
||||
k+=phy_vars_ue->lte_frame_parms.ofdm_symbol_size;
|
||||
k+=ue->frame_parms.ofdm_symbol_size;
|
||||
|
||||
k*=12;
|
||||
k+=13;
|
||||
|
||||
Xu = (int16_t*)phy_vars_ue->X_u[preamble_offset-first_nonzero_root_idx];
|
||||
Xu = (int16_t*)ue->X_u[preamble_offset-first_nonzero_root_idx];
|
||||
|
||||
/*
|
||||
k+=(12*phy_vars_ue->lte_frame_parms.first_carrier_offset);
|
||||
if (k>(12*phy_vars_ue->lte_frame_parms.ofdm_symbol_size))
|
||||
k-=(12*phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
|
||||
k+=(12*ue->frame_parms.first_carrier_offset);
|
||||
if (k>(12*ue->frame_parms.ofdm_symbol_size))
|
||||
k-=(12*ue->frame_parms.ofdm_symbol_size);
|
||||
*/
|
||||
k*=2;
|
||||
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_UL) {
|
||||
switch (ue->frame_parms.N_RB_UL) {
|
||||
case 6:
|
||||
memset((void*)prachF,0,4*1536);
|
||||
break;
|
||||
@@ -809,7 +807,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra
|
||||
prachF[k++]= ((Xu_re*ru[offset2<<1]) - (Xu_im*ru[1+(offset2<<1)]))>>15;
|
||||
prachF[k++]= ((Xu_im*ru[offset2<<1]) + (Xu_re*ru[1+(offset2<<1)]))>>15;
|
||||
|
||||
if (k==(12*2*phy_vars_ue->lte_frame_parms.ofdm_symbol_size))
|
||||
if (k==(12*2*ue->frame_parms.ofdm_symbol_size))
|
||||
k=0;
|
||||
}
|
||||
|
||||
@@ -836,7 +834,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra
|
||||
break;
|
||||
}
|
||||
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_UL) {
|
||||
switch (ue->frame_parms.N_RB_UL) {
|
||||
case 6:
|
||||
Ncp>>=4;
|
||||
prach+=4; // makes prach2 aligned to 128-bit
|
||||
@@ -862,7 +860,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra
|
||||
prach2 = prach+(Ncp<<1);
|
||||
|
||||
// do IDFT
|
||||
switch (phy_vars_ue->lte_frame_parms.N_RB_UL) {
|
||||
switch (ue->frame_parms.N_RB_UL) {
|
||||
case 6:
|
||||
if (prach_fmt == 4) {
|
||||
idft256(prachF,prach2,1);
|
||||
@@ -986,34 +984,34 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra
|
||||
} else {
|
||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
||||
int j;
|
||||
int overflow = prach_start + prach_len - LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_ue->lte_frame_parms.samples_per_tti;
|
||||
int overflow = prach_start + prach_len - LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*ue->frame_parms.samples_per_tti;
|
||||
LOG_D( PHY, "prach_start=%d, overflow=%d\n", prach_start, overflow );
|
||||
|
||||
for (i=prach_start,j=0; i<min(phy_vars_ue->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME,prach_start+prach_len); i++,j++) {
|
||||
((int16_t*)phy_vars_ue->lte_ue_common_vars.txdata[0])[2*i] = prach[2*j]<<4;
|
||||
((int16_t*)phy_vars_ue->lte_ue_common_vars.txdata[0])[2*i+1] = prach[2*j+1]<<4;
|
||||
for (i=prach_start,j=0; i<min(ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME,prach_start+prach_len); i++,j++) {
|
||||
((int16_t*)ue->common_vars.txdata[0])[2*i] = prach[2*j]<<4;
|
||||
((int16_t*)ue->common_vars.txdata[0])[2*i+1] = prach[2*j+1]<<4;
|
||||
}
|
||||
|
||||
for (i=0; i<overflow; i++,j++) {
|
||||
((int16_t*)phy_vars_ue->lte_ue_common_vars.txdata[0])[2*i] = prach[2*j]<<4;
|
||||
((int16_t*)phy_vars_ue->lte_ue_common_vars.txdata[0])[2*i+1] = prach[2*j+1]<<4;
|
||||
((int16_t*)ue->common_vars.txdata[0])[2*i] = prach[2*j]<<4;
|
||||
((int16_t*)ue->common_vars.txdata[0])[2*i+1] = prach[2*j+1]<<4;
|
||||
}
|
||||
#if defined(EXMIMO)
|
||||
// handle switch before 1st TX subframe, guarantee that the slot prior to transmission is switch on
|
||||
for (k=prach_start - (phy_vars_ue->lte_frame_parms.samples_per_tti>>1) ; k<prach_start ; k++) {
|
||||
for (k=prach_start - (ue->frame_parms.samples_per_tti>>1) ; k<prach_start ; k++) {
|
||||
if (k<0)
|
||||
phy_vars_ue->lte_ue_common_vars.txdata[0][k+phy_vars_ue->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE;
|
||||
else if (k>(phy_vars_ue->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME))
|
||||
phy_vars_ue->lte_ue_common_vars.txdata[0][k-phy_vars_ue->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE;
|
||||
ue->common_vars.txdata[0][k+ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE;
|
||||
else if (k>(ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME))
|
||||
ue->common_vars.txdata[0][k-ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE;
|
||||
else
|
||||
phy_vars_ue->lte_ue_common_vars.txdata[0][k] &= 0xFFFEFFFE;
|
||||
ue->common_vars.txdata[0][k] &= 0xFFFEFFFE;
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
|
||||
for (i=0; i<prach_len; i++) {
|
||||
((int16_t*)(&phy_vars_ue->lte_ue_common_vars.txdata[0][prach_start]))[2*i] = prach[2*i];
|
||||
((int16_t*)(&phy_vars_ue->lte_ue_common_vars.txdata[0][prach_start]))[2*i+1] = prach[2*i+1];
|
||||
((int16_t*)(&ue->common_vars.txdata[0][prach_start]))[2*i] = prach[2*i];
|
||||
((int16_t*)(&ue->common_vars.txdata[0][prach_start]))[2*i+1] = prach[2*i+1];
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -1029,8 +1027,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra
|
||||
}
|
||||
//__m128i mmtmpX0,mmtmpX1,mmtmpX2,mmtmpX3;
|
||||
|
||||
void rx_prach(PHY_VARS_eNB *phy_vars_eNB,
|
||||
uint8_t subframe,
|
||||
void rx_prach(PHY_VARS_eNB *eNB,
|
||||
uint16_t *preamble_energy_list,
|
||||
uint16_t *preamble_delay_list,
|
||||
uint16_t Nf,
|
||||
@@ -1038,16 +1035,16 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB,
|
||||
{
|
||||
|
||||
int i;
|
||||
lte_frame_type_t frame_type = phy_vars_eNB->lte_frame_parms.frame_type;
|
||||
|
||||
uint16_t rootSequenceIndex = phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex;
|
||||
uint8_t prach_ConfigIndex = phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex;
|
||||
uint8_t Ncs_config = phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig;
|
||||
uint8_t restricted_set = phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag;
|
||||
int16_t *prachF = phy_vars_eNB->lte_eNB_prach_vars.prachF;
|
||||
int16_t **rxsigF = phy_vars_eNB->lte_eNB_prach_vars.rxsigF;
|
||||
int16_t **prach_ifft = phy_vars_eNB->lte_eNB_prach_vars.prach_ifft;
|
||||
int16_t *prach[4];
|
||||
lte_frame_type_t frame_type = eNB->frame_parms.frame_type;
|
||||
int subframe = eNB->proc.subframe_prach;
|
||||
uint16_t rootSequenceIndex = eNB->frame_parms.prach_config_common.rootSequenceIndex;
|
||||
uint8_t prach_ConfigIndex = eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex;
|
||||
uint8_t Ncs_config = eNB->frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig;
|
||||
uint8_t restricted_set = eNB->frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag;
|
||||
int16_t *prachF = eNB->prach_vars.prachF;
|
||||
int16_t **rxsigF = eNB->prach_vars.rxsigF;
|
||||
int16_t **prach_ifft = eNB->prach_vars.prach_ifft;
|
||||
int16_t *prach[eNB->frame_parms.nb_antennas_rx];
|
||||
int16_t *prach2;
|
||||
uint8_t n_ra_prb;
|
||||
uint8_t preamble_index;
|
||||
@@ -1073,10 +1070,12 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB,
|
||||
int32_t lev;
|
||||
int16_t levdB;
|
||||
int fft_size,log2_ifft_size;
|
||||
uint8_t nb_ant_rx = 1; //phy_vars_eNB->lte_frame_parms.nb_antennas_rx;
|
||||
uint8_t nb_ant_rx = 1; //eNB->frame_parms.nb_antennas_rx;
|
||||
|
||||
// int en;
|
||||
|
||||
for (aa=0; aa<nb_ant_rx; aa++) {
|
||||
prach[aa] = (int16_t*)&phy_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti-phy_vars_eNB->N_TA_offset];
|
||||
prach[aa] = (int16_t*)&eNB->common_vars.rxdata[0][aa][subframe*eNB->frame_parms.samples_per_tti-eNB->N_TA_offset];
|
||||
}
|
||||
|
||||
// First compute physical root sequence
|
||||
@@ -1098,9 +1097,9 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB,
|
||||
NCS = NCS_restricted[Ncs_config];
|
||||
}
|
||||
|
||||
start_meas(&phy_vars_eNB->rx_prach);
|
||||
start_meas(&eNB->rx_prach);
|
||||
|
||||
n_ra_prb = get_prach_prb_offset(&(phy_vars_eNB->lte_frame_parms),tdd_mapindex,Nf);
|
||||
n_ra_prb = get_prach_prb_offset(&(eNB->frame_parms),tdd_mapindex,Nf);
|
||||
prach_root_sequence_map = (prach_fmt < 4) ? prach_root_sequence_map0_3 : prach_root_sequence_map4;
|
||||
|
||||
// PDP is oversampled, e.g. 1024 sample instead of 839
|
||||
@@ -1133,7 +1132,10 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB,
|
||||
break;
|
||||
}
|
||||
|
||||
switch (phy_vars_eNB->lte_frame_parms.N_RB_UL) {
|
||||
if (eNB->frame_parms.threequarter_fs == 1)
|
||||
Ncp=(Ncp*3)>>2;
|
||||
|
||||
switch (eNB->frame_parms.N_RB_UL) {
|
||||
case 6:
|
||||
Ncp>>=4;
|
||||
break;
|
||||
@@ -1155,23 +1157,167 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB,
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if ((eNB->node_function == eNodeB_3GPP) ||
|
||||
(eNB->node_function == eNodeB_3GPP_BBU) ||
|
||||
(eNB->node_function == NGFI_RRU_IF4p5)) { // compute the DFTs of the PRACH temporal resources
|
||||
// Do forward transform
|
||||
for (aa=0; aa<nb_ant_rx; aa++) {
|
||||
prach2 = prach[aa] + (Ncp<<1);
|
||||
|
||||
// do DFT
|
||||
switch (eNB->frame_parms.N_RB_UL) {
|
||||
case 6:
|
||||
if (prach_fmt == 4) {
|
||||
dft256(prach2,rxsigF[aa],1);
|
||||
} else {
|
||||
dft1536(prach2,rxsigF[aa],1);
|
||||
|
||||
if (prach_fmt>1)
|
||||
dft1536(prach2+3072,rxsigF[aa]+3072,1);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 15:
|
||||
if (prach_fmt == 4) {
|
||||
dft256(prach2,rxsigF[aa],1);
|
||||
} else {
|
||||
dft3072(prach2,rxsigF[aa]);
|
||||
|
||||
if (prach_fmt>1)
|
||||
dft3072(prach2+6144,rxsigF[aa]+6144);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 25:
|
||||
default:
|
||||
if (prach_fmt == 4) {
|
||||
dft1024(prach2,rxsigF[aa],1);
|
||||
fft_size = 1024;
|
||||
} else {
|
||||
dft6144(prach2,rxsigF[aa]);
|
||||
|
||||
if (prach_fmt>1)
|
||||
dft6144(prach2+12288,rxsigF[aa]+12288);
|
||||
|
||||
fft_size = 6144;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 50:
|
||||
if (prach_fmt == 4) {
|
||||
dft2048(prach2,rxsigF[aa],1);
|
||||
} else {
|
||||
dft12288(prach2,rxsigF[aa]);
|
||||
|
||||
if (prach_fmt>1)
|
||||
dft12288(prach2+24576,rxsigF[aa]+24576);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 75:
|
||||
if (prach_fmt == 4) {
|
||||
dft3072(prach2,rxsigF[aa]);
|
||||
} else {
|
||||
dft18432(prach2,rxsigF[aa]);
|
||||
|
||||
if (prach_fmt>1)
|
||||
dft18432(prach2+36864,rxsigF[aa]+36864);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 100:
|
||||
if (eNB->frame_parms.threequarter_fs==0) {
|
||||
if (prach_fmt == 4) {
|
||||
dft4096(prach2,rxsigF[aa],1);
|
||||
} else {
|
||||
dft24576(prach2,rxsigF[aa]);
|
||||
|
||||
if (prach_fmt>1)
|
||||
dft24576(prach2+49152,rxsigF[aa]+49152);
|
||||
}
|
||||
} else {
|
||||
if (prach_fmt == 4) {
|
||||
dft3072(prach2,rxsigF[aa]);
|
||||
} else {
|
||||
dft18432(prach2,rxsigF[aa]);
|
||||
|
||||
if (prach_fmt>1)
|
||||
dft18432(prach2+36864,rxsigF[aa]+36864);
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (eNB->node_function == NGFI_RRU_IF4p5) {
|
||||
k = (12*n_ra_prb) - 6*eNB->frame_parms.N_RB_UL;
|
||||
|
||||
if (k<0) {
|
||||
k+=(eNB->frame_parms.ofdm_symbol_size);
|
||||
}
|
||||
|
||||
k*=12;
|
||||
k+=13;
|
||||
k*=2;
|
||||
|
||||
/// **** send_IF4 of rxsigF to RCC **** ///
|
||||
send_IF4p5(eNB, eNB->proc.frame_prach, eNB->proc.subframe_prach, IF4p5_PRACH, k);
|
||||
|
||||
// en = dB_fixed(signal_energy(&rxsigF[0][k],840));
|
||||
// if (en>60)
|
||||
// printf("PRACH: Frame %d, Subframe %d => %d dB\n",eNB->proc.frame_rx,eNB->proc.subframe_rx,en);
|
||||
return;
|
||||
} else if (eNB->node_function == NGFI_RCC_IF4p5) {
|
||||
k = (12*n_ra_prb) - 6*eNB->frame_parms.N_RB_UL;
|
||||
|
||||
if (k<0) {
|
||||
k+=(eNB->frame_parms.ofdm_symbol_size);
|
||||
}
|
||||
|
||||
k*=12;
|
||||
k+=13;
|
||||
k*=2;
|
||||
|
||||
// Adjust received rxsigF offset
|
||||
memmove((&rxsigF[0][k]),
|
||||
(&rxsigF[0][0]),
|
||||
839*2*sizeof(int16_t));
|
||||
|
||||
//en = dB_fixed(signal_energy(&rxsigF[0][k],840));
|
||||
// if (en>60)
|
||||
//printf("PRACH: Frame %d, Subframe %d => %d dB\n",eNB->proc.frame_rx,eNB->proc.subframe_rx,en);
|
||||
|
||||
}
|
||||
|
||||
// in case of RCC and prach received rx_thread wakes up prach
|
||||
|
||||
// here onwards is for eNodeB_3GPP or NGFI_RCC_IF4p5
|
||||
|
||||
preamble_offset_old = 99;
|
||||
|
||||
for (preamble_index=0 ; preamble_index<64 ; preamble_index++) {
|
||||
if (restricted_set == 0) {
|
||||
// This is the relative offset in the root sequence table (5.7.2-4 from 36.211) for the given preamble index
|
||||
preamble_offset = ((NCS==0)? preamble_index : (preamble_index/(N_ZC/NCS)));
|
||||
|
||||
|
||||
if (preamble_offset != preamble_offset_old) {
|
||||
preamble_offset_old = preamble_offset;
|
||||
new_dft = 1;
|
||||
// This is the \nu corresponding to the preamble index
|
||||
preamble_shift = 0;
|
||||
}
|
||||
|
||||
|
||||
else {
|
||||
preamble_shift -= NCS;
|
||||
|
||||
|
||||
if (preamble_shift < 0)
|
||||
preamble_shift+=N_ZC;
|
||||
}
|
||||
@@ -1248,187 +1394,125 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
if (new_dft == 1) {
|
||||
new_dft = 0;
|
||||
Xu=(int16_t*)phy_vars_eNB->X_u[preamble_offset-first_nonzero_root_idx];
|
||||
Xu=(int16_t*)eNB->X_u[preamble_offset-first_nonzero_root_idx];
|
||||
|
||||
|
||||
for (aa=0; aa<nb_ant_rx; aa++) {
|
||||
prach2 = prach[aa] + (Ncp<<1);
|
||||
|
||||
k = (12*n_ra_prb) - 6*phy_vars_eNB->lte_frame_parms.N_RB_UL;
|
||||
|
||||
k = (12*n_ra_prb) - 6*eNB->frame_parms.N_RB_UL;
|
||||
|
||||
if (k<0)
|
||||
k+=(eNB->frame_parms.ofdm_symbol_size);
|
||||
|
||||
k*=12;
|
||||
k+=13; // phi + K/2
|
||||
// k+=(12*eNB->frame_parms.first_carrier_offset);
|
||||
// if (k>(12*eNB->frame_parms.ofdm_symbol_size))
|
||||
// k-=(12*eNB->frame_parms.ofdm_symbol_size);
|
||||
|
||||
// printf("First prach carrier : k %d\n",k);
|
||||
k*=2;
|
||||
|
||||
|
||||
if (k<0)
|
||||
k+=(phy_vars_eNB->lte_frame_parms.ofdm_symbol_size);
|
||||
|
||||
k*=12;
|
||||
k+=13; // phi + K/2
|
||||
// k+=(12*phy_vars_eNB->lte_frame_parms.first_carrier_offset);
|
||||
// if (k>(12*phy_vars_eNB->lte_frame_parms.ofdm_symbol_size))
|
||||
// k-=(12*phy_vars_eNB->lte_frame_parms.ofdm_symbol_size);
|
||||
|
||||
// printf("First prach carrier : k %d\n",k);
|
||||
k*=2;
|
||||
|
||||
// do DFT
|
||||
switch (phy_vars_eNB->lte_frame_parms.N_RB_UL) {
|
||||
case 6:
|
||||
if (prach_fmt == 4) {
|
||||
dft256(prach2,rxsigF[aa],1);
|
||||
} else {
|
||||
dft1536(prach2,rxsigF[aa],1);
|
||||
|
||||
if (prach_fmt>1)
|
||||
dft1536(prach2+3072,rxsigF[aa]+3072,1);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 15:
|
||||
if (prach_fmt == 4) {
|
||||
dft256(prach2,rxsigF[aa],1);
|
||||
} else {
|
||||
dft3072(prach2,rxsigF[aa]);
|
||||
|
||||
if (prach_fmt>1)
|
||||
dft3072(prach2+6144,rxsigF[aa]+6144);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 25:
|
||||
default:
|
||||
if (prach_fmt == 4) {
|
||||
dft1024(prach2,rxsigF[aa],1);
|
||||
fft_size = 1024;
|
||||
} else {
|
||||
dft6144(prach2,rxsigF[aa]);
|
||||
|
||||
if (prach_fmt>1)
|
||||
dft6144(prach2+12288,rxsigF[aa]+12288);
|
||||
|
||||
fft_size = 6144;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 50:
|
||||
if (prach_fmt == 4) {
|
||||
dft2048(prach2,rxsigF[aa],1);
|
||||
} else {
|
||||
dft12288(prach2,rxsigF[aa]);
|
||||
|
||||
if (prach_fmt>1)
|
||||
dft12288(prach2+24576,rxsigF[aa]+24576);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 75:
|
||||
if (prach_fmt == 4) {
|
||||
dft3072(prach2,rxsigF[aa]);
|
||||
} else {
|
||||
dft18432(prach2,rxsigF[aa]);
|
||||
|
||||
if (prach_fmt>1)
|
||||
dft18432(prach2+36864,rxsigF[aa]+36864);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 100:
|
||||
if (prach_fmt == 4) {
|
||||
dft4096(prach2,rxsigF[aa],1);
|
||||
} else {
|
||||
dft24576(prach2,rxsigF[aa]);
|
||||
|
||||
if (prach_fmt>1)
|
||||
dft24576(prach2+49152,rxsigF[aa]+49152);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
memset( prachF, 0, sizeof(int16_t)*2*1024 );
|
||||
|
||||
memset( prachF, 0, sizeof(int16_t)*2*1024 );
|
||||
#ifdef PRACH_DEBUG
|
||||
write_output("prach_rx0.m","prach_rx0",prach[0],6144+792,1,1);
|
||||
write_output("prach_rx0.m","prach_rx0",prach[0],6144+792,1,1);
|
||||
#endif
|
||||
// write_output("prach_rx1.m","prach_rx1",prach[1],6144+792,1,1);
|
||||
// write_output("prach_rxF0.m","prach_rxF0",rxsigF[0],24576,1,1);
|
||||
// write_output("prach_rxF1.m","prach_rxF1",rxsigF[1],6144,1,1);
|
||||
// write_output("prach_rx1.m","prach_rx1",prach[1],6144+792,1,1);
|
||||
// write_output("prach_rxF0.m","prach_rxF0",rxsigF[0],24576,1,1);
|
||||
// write_output("prach_rxF1.m","prach_rxF1",rxsigF[1],6144,1,1);
|
||||
|
||||
// Do componentwise product with Xu*
|
||||
for (offset=0; offset<(N_ZC<<1); offset+=2) {
|
||||
prachF[offset] = (int16_t)(((int32_t)Xu[offset]*rxsigF[aa][k] + (int32_t)Xu[offset+1]*rxsigF[aa][k+1])>>15);
|
||||
prachF[offset+1] = (int16_t)(((int32_t)Xu[offset]*rxsigF[aa][k+1] - (int32_t)Xu[offset+1]*rxsigF[aa][k])>>15);
|
||||
/*
|
||||
if (offset<16)
|
||||
printf("Xu[%d] %d %d, rxsigF[%d][%d] %d %d\n",offset,Xu[offset],Xu[offset+1],aa,k,rxsigF[aa][k],rxsigF[aa][k+1]);
|
||||
*/
|
||||
/*
|
||||
mmtmpX0 = _mm_madd_epi16(*(__m128i*)&Xu[offset],*(__m128i*)&rxsigF[aa][k<<1]);
|
||||
mmtmpX1 = _mm_shufflelo_epi16(*(__m128i*)&Xu[offset],_MM_SHUFFLE(2,3,0,1));
|
||||
mmtmpX1 = _mm_shufflehi_epi16(mmtmpX1,_MM_SHUFFLE(2,3,0,1));
|
||||
mmtmpX1 = _mm_sign_epi16(mmtmpX1,*(__m128i*)&conjugate[0]);
|
||||
mmtmpX1 = _mm_madd_epi16(mmtmpX1,*(__m128i*)&rxsigF[aa][k<<1]);
|
||||
mmtmpX0 = _mm_srai_epi32(mmtmpX0,15);
|
||||
mmtmpX1 = _mm_srai_epi32(mmtmpX1,15);
|
||||
mmtmpX2 = _mm_unpacklo_epi32(mmtmpX0,mmtmpX1);
|
||||
mmtmpX3 = _mm_unpackhi_epi32(mmtmpX0,mmtmpX1);
|
||||
*(__m128i*)&prachF[offset] = _mm_packs_epi32(mmtmpX2,mmtmpX3);
|
||||
*/
|
||||
k+=2;
|
||||
|
||||
if (k==(12*2*phy_vars_eNB->lte_frame_parms.ofdm_symbol_size))
|
||||
k=0;
|
||||
}
|
||||
|
||||
// Now do IFFT of size 1024 (N_ZC=839) or 256 (N_ZC=139)
|
||||
if (N_ZC == 839) {
|
||||
log2_ifft_size = 10;
|
||||
idft1024(prachF,prach_ifft[aa],1);
|
||||
} else {
|
||||
idft256(prachF,prach_ifft[aa],1);
|
||||
log2_ifft_size = 8;
|
||||
}
|
||||
for (aa=0;aa<nb_ant_rx; aa++) {
|
||||
// Do componentwise product with Xu*
|
||||
|
||||
for (offset=0; offset<(N_ZC<<1); offset+=2) {
|
||||
prachF[offset] = (int16_t)(((int32_t)Xu[offset]*rxsigF[aa][k] + (int32_t)Xu[offset+1]*rxsigF[aa][k+1])>>15);
|
||||
prachF[offset+1] = (int16_t)(((int32_t)Xu[offset]*rxsigF[aa][k+1] - (int32_t)Xu[offset+1]*rxsigF[aa][k])>>15);
|
||||
/*
|
||||
if (offset<16)
|
||||
printf("Xu[%d] %d %d, rxsigF[%d][%d] %d %d\n",offset,Xu[offset],Xu[offset+1],aa,k,rxsigF[aa][k],rxsigF[aa][k+1]);
|
||||
*/
|
||||
/*
|
||||
mmtmpX0 = _mm_madd_epi16(*(__m128i*)&Xu[offset],*(__m128i*)&rxsigF[aa][k<<1]);
|
||||
mmtmpX1 = _mm_shufflelo_epi16(*(__m128i*)&Xu[offset],_MM_SHUFFLE(2,3,0,1));
|
||||
mmtmpX1 = _mm_shufflehi_epi16(mmtmpX1,_MM_SHUFFLE(2,3,0,1));
|
||||
mmtmpX1 = _mm_sign_epi16(mmtmpX1,*(__m128i*)&conjugate[0]);
|
||||
mmtmpX1 = _mm_madd_epi16(mmtmpX1,*(__m128i*)&rxsigF[aa][k<<1]);
|
||||
mmtmpX0 = _mm_srai_epi32(mmtmpX0,15);
|
||||
mmtmpX1 = _mm_srai_epi32(mmtmpX1,15);
|
||||
mmtmpX2 = _mm_unpacklo_epi32(mmtmpX0,mmtmpX1);
|
||||
mmtmpX3 = _mm_unpackhi_epi32(mmtmpX0,mmtmpX1);
|
||||
*(__m128i*)&prachF[offset] = _mm_packs_epi32(mmtmpX2,mmtmpX3);
|
||||
*/
|
||||
k+=2;
|
||||
|
||||
if (k==(12*2*eNB->frame_parms.ofdm_symbol_size))
|
||||
k=0;
|
||||
}
|
||||
|
||||
// Now do IFFT of size 1024 (N_ZC=839) or 256 (N_ZC=139)
|
||||
if (N_ZC == 839) {
|
||||
log2_ifft_size = 10;
|
||||
idft1024(prachF,prach_ifft[aa],1);
|
||||
} else {
|
||||
idft256(prachF,prach_ifft[aa],1);
|
||||
log2_ifft_size = 8;
|
||||
}
|
||||
#ifdef PRACH_DEBUG
|
||||
write_output("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1);
|
||||
if (aa==0) write_output("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1);
|
||||
#endif
|
||||
// write_output("prach_rxF_comp1.m","prach_rxF_comp1",prachF,1024,1,1);
|
||||
|
||||
// if (aa=1) write_output("prach_rxF_comp1.m","prach_rxF_comp1",prachF,1024,1,1);
|
||||
}// antennas_rx
|
||||
|
||||
#ifdef PRACH_DEBUG
|
||||
write_output("prach_ifft0.m","prach_t0",prach_ifft[0],2048,1,1);
|
||||
|
||||
if (en>40) {
|
||||
k = (12*n_ra_prb) - 6*eNB->frame_parms.N_RB_UL;
|
||||
|
||||
if (k<0)
|
||||
k+=(eNB->frame_parms.ofdm_symbol_size);
|
||||
|
||||
k*=12;
|
||||
k+=13;
|
||||
k*=2;
|
||||
printf("Dumping prach, k = %d (n_ra_prb %d)\n",k,n_ra_prb);
|
||||
write_output("rxsigF.m","prach_rxF",&rxsigF[0][k],840,1,1);
|
||||
write_output("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1);
|
||||
write_output("prach_ifft0.m","prach_t0",prach_ifft[0],1024,1,1);
|
||||
exit(-1);
|
||||
}
|
||||
#endif
|
||||
// write_output("prach_ifft1.m","prach_t1",prach_ifft[1],2048,1,1);
|
||||
|
||||
} // new dft
|
||||
|
||||
|
||||
// check energy in nth time shift
|
||||
preamble_shift2 = ((preamble_shift==0) ? 0 : ((preamble_shift<<log2_ifft_size)/N_ZC));
|
||||
preamble_energy_list[preamble_index] = 0;
|
||||
|
||||
|
||||
for (i=0; i<NCS2; i++) {
|
||||
lev = 0;
|
||||
|
||||
|
||||
for (aa=0; aa<nb_ant_rx; aa++) {
|
||||
lev += (int32_t)prach_ifft[aa][(preamble_shift2+i)<<1]*prach_ifft[aa][(preamble_shift2+i)<<1] + (int32_t)prach_ifft[aa][1+((preamble_shift2+i)<<1)]*prach_ifft[aa][1+((preamble_shift2+i)<<1)];
|
||||
lev += (int32_t)prach_ifft[aa][(preamble_shift2+i)<<1]*prach_ifft[aa][(preamble_shift2+i)<<1] + (int32_t)prach_ifft[aa][1+((preamble_shift2+i)<<1)]*prach_ifft[aa][1+((preamble_shift2+i)<<1)];
|
||||
}
|
||||
|
||||
|
||||
levdB = dB_fixed_times10(lev);
|
||||
|
||||
|
||||
if (levdB>preamble_energy_list[preamble_index] ) {
|
||||
preamble_energy_list[preamble_index] = levdB;
|
||||
preamble_delay_list[preamble_index] = (i*fft_size)>>log2_ifft_size;
|
||||
preamble_energy_list[preamble_index] = levdB;
|
||||
preamble_delay_list[preamble_index] = (i*fft_size)>>log2_ifft_size;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#ifdef PRACH_DEBUG
|
||||
LOG_D(PHY,"[RAPROC] Preamble %d => %d dB, %d (shift %d (%d), NCS2 %d(%d), Ncp %d)\n",preamble_index,preamble_energy_list[preamble_index],preamble_delay_list[preamble_index],preamble_shift2,
|
||||
preamble_shift, NCS2,NCS,Ncp);
|
||||
preamble_shift, NCS2,NCS,Ncp);
|
||||
#endif
|
||||
// exit(-1);
|
||||
}// preamble_index
|
||||
|
||||
stop_meas(&phy_vars_eNB->rx_prach);
|
||||
|
||||
|
||||
stop_meas(&eNB->rx_prach);
|
||||
|
||||
}
|
||||
|
||||
void init_prach_tables(int N_ZC)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -64,7 +64,8 @@ LTE_eNB_ULSCH_t *new_eNB_ulsch(uint8_t max_turbo_iterations,uint8_t N_RB_UL, uin
|
||||
|
||||
LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag);
|
||||
|
||||
/** \fn dlsch_encoding(uint8_t *input_buffer,
|
||||
/** \fn dlsch_encoding(PHY_VARS_eNB *eNB,
|
||||
uint8_t *input_buffer,
|
||||
LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t num_pdcch_symbols,
|
||||
LTE_eNB_DLSCH_t *dlsch,
|
||||
@@ -76,6 +77,7 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag);
|
||||
- Channel coding (Turbo coding)
|
||||
- Rate matching (sub-block interleaving, bit collection, selection and transmission
|
||||
- Code block concatenation
|
||||
@param eNB Pointer to eNB PHY context
|
||||
@param input_buffer Pointer to input buffer for sub-frame
|
||||
@param frame_parms Pointer to frame descriptor structure
|
||||
@param num_pdcch_symbols Number of PDCCH symbols in this subframe
|
||||
@@ -87,8 +89,8 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag);
|
||||
@param i_stats Time statistics for interleaving
|
||||
@returns status
|
||||
*/
|
||||
int32_t dlsch_encoding(uint8_t *a,
|
||||
LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t dlsch_encoding(PHY_VARS_eNB *eNB,
|
||||
uint8_t *a,
|
||||
uint8_t num_pdcch_symbols,
|
||||
LTE_eNB_DLSCH_t *dlsch,
|
||||
int frame,
|
||||
@@ -97,6 +99,39 @@ int32_t dlsch_encoding(uint8_t *a,
|
||||
time_stats_t *te_stats,
|
||||
time_stats_t *i_stats);
|
||||
|
||||
/** \fn dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
|
||||
uint8_t *input_buffer,
|
||||
uint8_t num_pdcch_symbols,
|
||||
LTE_eNB_DLSCH_t *dlsch,
|
||||
int frame,
|
||||
uint8_t subframe)
|
||||
\brief This function performs a subset of the bit-coding functions for LTE as described in 36-212, Release 8.Support is limited to turbo-coded channels (DLSCH/ULSCH). This version spawns 1 worker thread. The implemented functions are:
|
||||
- CRC computation and addition
|
||||
- Code block segmentation and sub-block CRC addition
|
||||
- Channel coding (Turbo coding)
|
||||
- Rate matching (sub-block interleaving, bit collection, selection and transmission
|
||||
- Code block concatenation
|
||||
@param eNB Pointer to eNB PHY context
|
||||
@param input_buffer Pointer to input buffer for sub-frame
|
||||
@param num_pdcch_symbols Number of PDCCH symbols in this subframe
|
||||
@param dlsch Pointer to dlsch to be encoded
|
||||
@param frame Frame number
|
||||
@param subframe Subframe number
|
||||
@param rm_stats Time statistics for rate-matching
|
||||
@param te_stats Time statistics for turbo-encoding
|
||||
@param i_stats Time statistics for interleaving
|
||||
@returns status
|
||||
*/
|
||||
int32_t dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
|
||||
uint8_t *a,
|
||||
uint8_t num_pdcch_symbols,
|
||||
LTE_eNB_DLSCH_t *dlsch,
|
||||
int frame,
|
||||
uint8_t subframe,
|
||||
time_stats_t *rm_stats,
|
||||
time_stats_t *te_stats,
|
||||
time_stats_t *i_stats);
|
||||
|
||||
void dlsch_encoding_emul(PHY_VARS_eNB *phy_vars_eNB,
|
||||
uint8_t *DLSCH_pdu,
|
||||
LTE_eNB_DLSCH_t *dlsch);
|
||||
@@ -154,7 +189,9 @@ int32_t allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int16_t *qam_table_s1,
|
||||
uint32_t *re_allocated,
|
||||
uint8_t skip_dc,
|
||||
uint8_t skip_half);
|
||||
uint8_t skip_half,
|
||||
int *P1_SHIFT,
|
||||
int *P2_SHIFT);
|
||||
|
||||
|
||||
/** \fn int32_t dlsch_modulation(int32_t **txdataF,
|
||||
@@ -197,22 +234,20 @@ int mch_modulation(int32_t **txdataF,
|
||||
|
||||
/** \brief Top-level generation function for eNB TX of MBSFN
|
||||
@param phy_vars_eNB Pointer to eNB variables
|
||||
@param subframe Subframe for PMCH
|
||||
@param a Pointer to transport block
|
||||
@param abstraction_flag
|
||||
|
||||
*/
|
||||
void generate_mch(PHY_VARS_eNB *phy_vars_eNB,int subframe,uint8_t *a,int abstraction_flag);
|
||||
void generate_mch(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t *a);
|
||||
|
||||
/** \brief This function generates the frequency-domain pilots (cell-specific downlink reference signals)
|
||||
@param phy_vars_eNB Pointer to eNB variables
|
||||
@param proc Pointer to RXn-TXnp4 proc information
|
||||
@param mcs MCS for MBSFN
|
||||
@param ndi new data indicator
|
||||
@param rdvix
|
||||
@param abstraction_flag
|
||||
|
||||
*/
|
||||
void fill_eNB_dlsch_MCH(PHY_VARS_eNB *phy_vars_eNB,int mcs,int ndi,int rvidx,int abstraction_flag);
|
||||
void fill_eNB_dlsch_MCH(PHY_VARS_eNB *phy_vars_eNB,int mcs,int ndi,int rvidx);
|
||||
|
||||
/** \brief This function generates the frequency-domain pilots (cell-specific downlink reference signals)
|
||||
@param phy_vars_ue Pointer to UE variables
|
||||
@@ -269,9 +304,9 @@ int32_t generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB,
|
||||
int first_pilot_only);
|
||||
|
||||
int32_t generate_mbsfn_pilot(PHY_VARS_eNB *phy_vars_eNB,
|
||||
int32_t **txdataF,
|
||||
int16_t amp,
|
||||
uint16_t subframe);
|
||||
eNB_rxtx_proc_t *proc,
|
||||
int32_t **txdataF,
|
||||
int16_t amp);
|
||||
|
||||
int32_t generate_pss(int32_t **txdataF,
|
||||
int16_t amp,
|
||||
@@ -1008,7 +1043,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
|
||||
|
||||
uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
|
||||
uint8_t subframe,
|
||||
uint8_t dlsch_id,
|
||||
PDSCH_t dlsch_id,
|
||||
uint8_t eNB_id);
|
||||
|
||||
/** \brief This function is the top-level entry point to PDSCH demodulation, after frequency-domain transformation and channel estimation. It performs
|
||||
@@ -1297,6 +1332,7 @@ int32_t generate_srs_tx(PHY_VARS_UE *phy_vars_ue,
|
||||
*/
|
||||
|
||||
int32_t generate_drs_pusch(PHY_VARS_UE *phy_vars_ue,
|
||||
UE_rxtx_proc_t *proc,
|
||||
uint8_t eNB_id,
|
||||
int16_t amp,
|
||||
uint32_t subframe,
|
||||
@@ -1309,6 +1345,14 @@ int32_t generate_drs_pusch(PHY_VARS_UE *phy_vars_ue,
|
||||
@param frame_parms Pointer to a LTE_DL_FRAME_PARMS structure (eNB or UE)*/
|
||||
void init_ul_hopping(LTE_DL_FRAME_PARMS *frame_parms);
|
||||
|
||||
|
||||
/*!
|
||||
\brief This function implements the initialization of paging parameters for UE (See Section 7, 36.304).It must be called after setting IMSImod1024 during UE startup and after receiving SIB2
|
||||
@param ue Pointer to UE context
|
||||
@param defaultPagingCycle T from 36.304 (0=32,1=64,2=128,3=256)
|
||||
@param nB nB from 36.304 (0=4T,1=2T,2=T,3=T/2,4=T/4,5=T/8,6=T/16,7=T/32*/
|
||||
int init_ue_paging_info(PHY_VARS_UE *ue, long defaultPagingCycle, long nB);
|
||||
|
||||
int32_t compareints (const void * a, const void * b);
|
||||
|
||||
|
||||
@@ -1367,7 +1411,8 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
uint8_t subframe,
|
||||
DCI_format_t dci_format,
|
||||
PHY_VARS_UE *phy_vars_ue,
|
||||
uint16_t si_rnti,
|
||||
UE_rxtx_proc_t *proc,
|
||||
uint16_t si_rnti,
|
||||
uint16_t ra_rnti,
|
||||
uint16_t p_rnti,
|
||||
uint16_t cba_rnti,
|
||||
@@ -1375,34 +1420,32 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
uint8_t use_srs);
|
||||
|
||||
int32_t generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue,
|
||||
uint8_t eNB_id);
|
||||
UE_rxtx_proc_t *proc,
|
||||
uint8_t eNB_id);
|
||||
double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue,
|
||||
uint8_t eNB_id);
|
||||
int generate_eNB_ulsch_params_from_dci(void *dci_pdu,
|
||||
int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *PHY_vars_eNB,
|
||||
eNB_rxtx_proc_t *proc,
|
||||
void *dci_pdu,
|
||||
rnti_t rnti,
|
||||
uint8_t subframe,
|
||||
DCI_format_t dci_format,
|
||||
DCI_format_t dci_format,
|
||||
uint8_t UE_id,
|
||||
PHY_VARS_eNB *PHY_vars_eNB,
|
||||
uint16_t si_rnti,
|
||||
uint16_t si_rnti,
|
||||
uint16_t ra_rnti,
|
||||
uint16_t p_rnti,
|
||||
uint16_t cba_rnti,
|
||||
uint8_t use_srs);
|
||||
|
||||
#ifdef USER_MODE
|
||||
void dump_ulsch(PHY_VARS_eNB *phy_vars_eNb,uint8_t subframe, uint8_t UE_id);
|
||||
|
||||
void dump_dlsch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid);
|
||||
void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe);
|
||||
void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe);
|
||||
void dump_ulsch(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t UE_id);
|
||||
|
||||
|
||||
|
||||
|
||||
void dump_dlsch2(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword,int round);
|
||||
#endif
|
||||
|
||||
int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci);
|
||||
|
||||
int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t mode, int input_level_dBm);
|
||||
int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, UE_rxtx_proc_t *proc, char* buffer, int length, runmode_t mode, int input_level_dBm);
|
||||
int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length);
|
||||
|
||||
|
||||
@@ -1446,14 +1489,14 @@ void generate_RIV_tables(void);
|
||||
int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode);
|
||||
|
||||
void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
uint32_t subframe,
|
||||
uint8_t eNB_id, // this is the effective sector id
|
||||
eNB_rxtx_proc_t *proc,
|
||||
uint8_t eNB_id, // this is the effective sector id
|
||||
uint8_t UE_id,
|
||||
LTE_eNB_ULSCH_t **ulsch,
|
||||
uint8_t cooperation_flag);
|
||||
|
||||
void rx_ulsch_emul(PHY_VARS_eNB *phy_vars_eNB,
|
||||
uint8_t subframe,
|
||||
eNB_rxtx_proc_t *proc,
|
||||
uint8_t sect_id,
|
||||
uint8_t UE_index);
|
||||
|
||||
@@ -1492,6 +1535,7 @@ int32_t ulsch_encoding_emul(uint8_t *ulsch_buffer,
|
||||
/*!
|
||||
\brief Decoding of PUSCH/ACK/RI/ACK from 36-212.
|
||||
@param phy_vars_eNB Pointer to eNB top-level descriptor
|
||||
@param proc Pointer to RXTX proc variables
|
||||
@param UE_id ID of UE transmitting this PUSCH
|
||||
@param subframe Index of subframe for PUSCH
|
||||
@param control_only_flag Receive PUSCH with control information only
|
||||
@@ -1500,30 +1544,57 @@ int32_t ulsch_encoding_emul(uint8_t *ulsch_buffer,
|
||||
@returns 0 on success
|
||||
*/
|
||||
unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
|
||||
eNB_rxtx_proc_t *proc,
|
||||
uint8_t UE_id,
|
||||
uint8_t subframe,
|
||||
uint8_t control_only_flag,
|
||||
uint8_t Nbundled,
|
||||
uint8_t llr8_flag);
|
||||
|
||||
/*!
|
||||
\brief Decoding of ULSCH data component from 36-212. This one spawns 1 worker thread in parallel,half of the segments in each thread.
|
||||
@param phy_vars_eNB Pointer to eNB top-level descriptor
|
||||
@param UE_id ID of UE transmitting this PUSCH
|
||||
@param harq_pid HARQ process ID
|
||||
@param llr8_flag If 1, indicate that the 8-bit turbo decoder should be used
|
||||
@returns 0 on success
|
||||
*/
|
||||
int ulsch_decoding_data_2thread(PHY_VARS_eNB *eNB,
|
||||
int UE_id,
|
||||
int harq_pid,
|
||||
int llr8_flag);
|
||||
|
||||
/*!
|
||||
\brief Decoding of ULSCH data component from 36-212. This one is single thread.
|
||||
@param phy_vars_eNB Pointer to eNB top-level descriptor
|
||||
@param UE_id ID of UE transmitting this PUSCH
|
||||
@param harq_pid HARQ process ID
|
||||
@param llr8_flag If 1, indicate that the 8-bit turbo decoder should be used
|
||||
@returns 0 on success
|
||||
*/
|
||||
int ulsch_decoding_data(PHY_VARS_eNB *eNB,
|
||||
int UE_id,
|
||||
int harq_pid,
|
||||
int llr8_flag);
|
||||
|
||||
uint32_t ulsch_decoding_emul(PHY_VARS_eNB *phy_vars_eNB,
|
||||
uint8_t subframe,
|
||||
uint8_t UE_index,
|
||||
eNB_rxtx_proc_t *proc,
|
||||
uint8_t UE_index,
|
||||
uint16_t *crnti);
|
||||
|
||||
void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
|
||||
uint8_t subframe,
|
||||
eNB_rxtx_proc_t *proc,
|
||||
int16_t amp,
|
||||
uint8_t sect_id,
|
||||
uint8_t abstraction_flag);
|
||||
uint8_t sect_id);
|
||||
|
||||
/* \brief This routine demodulates the PHICH and updates PUSCH/ULSCH parameters.
|
||||
@param phy_vars_ue Pointer to UE variables
|
||||
@param proc Pointer to RXN_TXNp4 proc
|
||||
@param subframe Subframe of received PDCCH/PHICH
|
||||
@param eNB_id Index of eNB
|
||||
*/
|
||||
|
||||
void rx_phich(PHY_VARS_UE *phy_vars_ue,
|
||||
UE_rxtx_proc_t *proc,
|
||||
uint8_t subframe,
|
||||
uint8_t eNB_id);
|
||||
|
||||
@@ -1609,24 +1680,24 @@ void dlsch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
|
||||
void init_ncs_cell(LTE_DL_FRAME_PARMS *frame_parms,uint8_t ncs_cell[20][7]);
|
||||
|
||||
void generate_pucch(int32_t **txdataF,
|
||||
LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t ncs_cell[20][7],
|
||||
PUCCH_FMT_t fmt,
|
||||
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
||||
uint16_t n1_pucch,
|
||||
uint16_t n2_pucch,
|
||||
uint8_t shortened_format,
|
||||
uint8_t *payload,
|
||||
int16_t amp,
|
||||
uint8_t subframe);
|
||||
void generate_pucch1x(int32_t **txdataF,
|
||||
LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t ncs_cell[20][7],
|
||||
PUCCH_FMT_t fmt,
|
||||
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
||||
uint16_t n1_pucch,
|
||||
uint8_t shortened_format,
|
||||
uint8_t *payload,
|
||||
int16_t amp,
|
||||
uint8_t subframe);
|
||||
|
||||
void generate_pucch_emul(PHY_VARS_UE *phy_vars_ue,
|
||||
UE_rxtx_proc_t *proc,
|
||||
PUCCH_FMT_t format,
|
||||
uint8_t ncs1,
|
||||
uint8_t *pucch_ack_payload,
|
||||
uint8_t sr,
|
||||
uint8_t subframe);
|
||||
uint8_t sr);
|
||||
|
||||
|
||||
|
||||
uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
@@ -1641,11 +1712,12 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
uint8_t pucch1_thres);
|
||||
|
||||
int32_t rx_pucch_emul(PHY_VARS_eNB *phy_vars_eNB,
|
||||
uint8_t UE_index,
|
||||
PUCCH_FMT_t fmt,
|
||||
uint8_t n1_pucch_sel,
|
||||
uint8_t *payload,
|
||||
uint8_t subframe);
|
||||
eNB_rxtx_proc_t *proc,
|
||||
uint8_t UE_index,
|
||||
PUCCH_FMT_t fmt,
|
||||
uint8_t n1_pucch_sel,
|
||||
uint8_t *payload);
|
||||
|
||||
|
||||
|
||||
/*!
|
||||
@@ -1672,7 +1744,6 @@ int32_t generate_prach(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,
|
||||
/*!
|
||||
\brief Process PRACH waveform
|
||||
@param phy_vars_eNB Pointer to eNB top-level descriptor
|
||||
@param subframe subframe index to operate on
|
||||
@param preamble_energy_list List of energies for each candidate preamble
|
||||
@param preamble_delay_list List of delays for each candidate preamble
|
||||
@param Nf System frame number
|
||||
@@ -1680,7 +1751,7 @@ int32_t generate_prach(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,
|
||||
@returns 0 on success
|
||||
|
||||
*/
|
||||
void rx_prach(PHY_VARS_eNB *phy_vars_eNB,uint8_t subframe,uint16_t *preamble_energy_list, uint16_t *preamble_delay_list, uint16_t Nf, uint8_t tdd_mapindex);
|
||||
void rx_prach(PHY_VARS_eNB *phy_vars_eNB,uint16_t *preamble_energy_list, uint16_t *preamble_delay_list, uint16_t Nf, uint8_t tdd_mapindex);
|
||||
|
||||
/*!
|
||||
\brief Helper for MAC, returns number of available PRACH in TDD for a particular configuration index
|
||||
@@ -1715,6 +1786,9 @@ void compute_prach_seq(PRACH_CONFIG_COMMON *prach_config_common,
|
||||
|
||||
void init_prach_tables(int N_ZC);
|
||||
|
||||
void init_unscrambling_lut(void);
|
||||
void init_scrambling_lut(void);
|
||||
|
||||
/*!
|
||||
\brief Return the status of MBSFN in this frame/subframe
|
||||
@param frame Frame index
|
||||
|
||||
+313
-120
@@ -9,7 +9,7 @@
|
||||
* \warning
|
||||
*/
|
||||
#include "PHY/defs.h"
|
||||
#include "PHY/extern.h"
|
||||
#include "PHY/extern.h"
|
||||
#include "LAYER2/MAC/extern.h"
|
||||
|
||||
#include "UTIL/LOG/log.h"
|
||||
@@ -68,7 +68,7 @@ void init_ncs_cell(LTE_DL_FRAME_PARMS *frame_parms,uint8_t ncs_cell[20][7])
|
||||
}
|
||||
|
||||
#ifdef DEBUG_PUCCH_TX
|
||||
msg("[PHY] PUCCH ncs_cell init (j %d): Ns %d, l %d => ncs_cell %d\n",j,ns,l,ncs_cell[ns][l]);
|
||||
printf("[PHY] PUCCH ncs_cell init (j %d): Ns %d, l %d => ncs_cell %d\n",j,ns,l,ncs_cell[ns][l]);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -94,17 +94,16 @@ int16_t W3_im[3][6] = {{0 ,0 ,0 },
|
||||
|
||||
char pucch_format_string[6][20] = {"format 1\0","format 1a\0","format 1b\0","format 2\0","format 2a\0","format 2b\0"};
|
||||
|
||||
void generate_pucch(int32_t **txdataF,
|
||||
LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t ncs_cell[20][7],
|
||||
PUCCH_FMT_t fmt,
|
||||
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
||||
uint16_t n1_pucch,
|
||||
uint16_t n2_pucch,
|
||||
uint8_t shortened_format,
|
||||
uint8_t *payload,
|
||||
int16_t amp,
|
||||
uint8_t subframe)
|
||||
void generate_pucch1x(int32_t **txdataF,
|
||||
LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t ncs_cell[20][7],
|
||||
PUCCH_FMT_t fmt,
|
||||
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
||||
uint16_t n1_pucch,
|
||||
uint8_t shortened_format,
|
||||
uint8_t *payload,
|
||||
int16_t amp,
|
||||
uint8_t subframe)
|
||||
{
|
||||
|
||||
uint32_t u,v,n;
|
||||
@@ -123,7 +122,8 @@ void generate_pucch(int32_t **txdataF,
|
||||
|
||||
uint8_t deltaPUCCH_Shift = frame_parms->pucch_config_common.deltaPUCCH_Shift;
|
||||
uint8_t NRB2 = frame_parms->pucch_config_common.nRB_CQI;
|
||||
uint8_t Ncs1_div_deltaPUCCH_Shift = frame_parms->pucch_config_common.nCS_AN;
|
||||
uint8_t Ncs1 = frame_parms->pucch_config_common.nCS_AN;
|
||||
uint8_t Ncs1_div_deltaPUCCH_Shift = Ncs1/deltaPUCCH_Shift;
|
||||
|
||||
uint32_t u0 = (frame_parms->Nid_cell + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[subframe<<1]) % 30;
|
||||
uint32_t u1 = (frame_parms->Nid_cell + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[1+(subframe<<1)]) % 30;
|
||||
@@ -131,12 +131,12 @@ void generate_pucch(int32_t **txdataF,
|
||||
uint32_t v1=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)];
|
||||
|
||||
if ((deltaPUCCH_Shift==0) || (deltaPUCCH_Shift>3)) {
|
||||
msg("[PHY] generate_pucch: Illegal deltaPUCCH_shift %d (should be 1,2,3)\n",deltaPUCCH_Shift);
|
||||
printf("[PHY] generate_pucch: Illegal deltaPUCCH_shift %d (should be 1,2,3)\n",deltaPUCCH_Shift);
|
||||
return;
|
||||
}
|
||||
|
||||
if (Ncs1_div_deltaPUCCH_Shift > 7) {
|
||||
msg("[PHY] generate_pucch: Illegal Ncs1_div_deltaPUCCH_Shift %d (should be 0...7)\n",Ncs1_div_deltaPUCCH_Shift);
|
||||
printf("[PHY] generate_pucch: Illegal Ncs1_div_deltaPUCCH_Shift %d (should be 0...7)\n",Ncs1_div_deltaPUCCH_Shift);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -146,7 +146,7 @@ void generate_pucch(int32_t **txdataF,
|
||||
Nprime = Nprime_div_deltaPUCCH_Shift * deltaPUCCH_Shift;
|
||||
|
||||
#ifdef DEBUG_PUCCH_TX
|
||||
msg("[PHY] PUCCH: cNcs1/deltaPUCCH_Shift %d, Nprime %d, n1_pucch %d\n",thres,Nprime,n1_pucch);
|
||||
printf("[PHY] PUCCH: cNcs1/deltaPUCCH_Shift %d, Nprime %d, n1_pucch %d\n",thres,Nprime,n1_pucch);
|
||||
#endif
|
||||
|
||||
N_UL_symb = (frame_parms->Ncp==0) ? 7 : 6;
|
||||
@@ -165,7 +165,7 @@ void generate_pucch(int32_t **txdataF,
|
||||
}
|
||||
|
||||
#ifdef DEBUG_PUCCH_TX
|
||||
msg("[PHY] PUCCH: nprime0 %d nprime1 %d, %s, payload (%d,%d)\n",nprime0,nprime1,pucch_format_string[fmt],payload[0],payload[1]);
|
||||
printf("[PHY] PUCCH: nprime0 %d nprime1 %d, %s, payload (%d,%d)\n",nprime0,nprime1,pucch_format_string[fmt],payload[0],payload[1]);
|
||||
#endif
|
||||
|
||||
n_oc0 = nprime0/Nprime_div_deltaPUCCH_Shift;
|
||||
@@ -179,7 +179,7 @@ void generate_pucch(int32_t **txdataF,
|
||||
n_oc1<<=1;
|
||||
|
||||
#ifdef DEBUG_PUCCH_TX
|
||||
msg("[PHY] PUCCH: noc0 %d noc11 %d\n",n_oc0,n_oc1);
|
||||
printf("[PHY] PUCCH: noc0 %d noc11 %d\n",n_oc0,n_oc1);
|
||||
#endif
|
||||
|
||||
nprime=nprime0;
|
||||
@@ -251,7 +251,7 @@ void generate_pucch(int32_t **txdataF,
|
||||
}
|
||||
|
||||
#ifdef DEBUG_PUCCH_TX
|
||||
msg("[PHY] PUCCH: ncs[%d][%d]=%d, W_re %d, W_im %d, S %d, refs %d\n",ns,l,n_cs,W_re,W_im,S,refs);
|
||||
printf("[PHY] PUCCH: ncs[%d][%d]=%d, W_re %d, W_im %d, S %d, refs %d\n",ns,l,n_cs,W_re,W_im,S,refs);
|
||||
#endif
|
||||
alpha_ind=0;
|
||||
// compute output sequence
|
||||
@@ -300,15 +300,9 @@ void generate_pucch(int32_t **txdataF,
|
||||
break;
|
||||
|
||||
case pucch_format2:
|
||||
msg("[PHY] PUCCH format 2 not implemented\n");
|
||||
break;
|
||||
|
||||
case pucch_format2a:
|
||||
msg("[PHY] PUCCH format 2a not implemented\n");
|
||||
break;
|
||||
|
||||
case pucch_format2b:
|
||||
msg("[PHY] PUCCH format 2b not implemented\n");
|
||||
AssertFatal(1==0,"should not go here\n");
|
||||
break;
|
||||
} // switch fmt
|
||||
} else { // These are PUCCH reference symbols
|
||||
@@ -319,7 +313,7 @@ void generate_pucch(int32_t **txdataF,
|
||||
}
|
||||
|
||||
#ifdef DEBUG_PUCCH_TX
|
||||
msg("[PHY] PUCCH subframe %d z(%d,%d) => %d,%d, alpha(%d) => %d,%d\n",subframe,l,n,((int16_t *)&zptr[n])[0],((int16_t *)&zptr[n])[1],
|
||||
printf("[PHY] PUCCH subframe %d z(%d,%d) => %d,%d, alpha(%d) => %d,%d\n",subframe,l,n,((int16_t *)&zptr[n])[0],((int16_t *)&zptr[n])[1],
|
||||
alpha_ind,alpha_re[alpha_ind],alpha_im[alpha_ind]);
|
||||
#endif
|
||||
alpha_ind = (alpha_ind + n_cs)%12;
|
||||
@@ -337,13 +331,12 @@ void generate_pucch(int32_t **txdataF,
|
||||
m = (n1_pucch < thres) ? NRB2 : (((n1_pucch-thres)/(12*c/deltaPUCCH_Shift))+NRB2+((deltaPUCCH_Shift*Ncs1_div_deltaPUCCH_Shift)>>3)+rem);
|
||||
|
||||
#ifdef DEBUG_PUCCH_TX
|
||||
msg("[PHY] PUCCH: m %d\n",m);
|
||||
printf("[PHY] PUCCH: m %d\n",m);
|
||||
#endif
|
||||
nsymb = N_UL_symb<<1;
|
||||
|
||||
//for (j=0,l=0;l<(nsymb-1);l++) {
|
||||
for (j=0,l=0; l<(nsymb); l++) {
|
||||
|
||||
if ((l<(nsymb>>1)) && ((m&1) == 0))
|
||||
re_offset = (m*6) + frame_parms->first_carrier_offset;
|
||||
else if ((l<(nsymb>>1)) && ((m&1) == 1))
|
||||
@@ -366,47 +359,247 @@ void generate_pucch(int32_t **txdataF,
|
||||
re_offset = 0;
|
||||
|
||||
#ifdef DEBUG_PUCCH_TX
|
||||
msg("[PHY] PUCCH subframe %d (%d,%d,%d,%d) => %d,%d\n",subframe,l,i,re_offset-1,m,((int16_t *)&z[j])[0],((int16_t *)&z[j])[1]);
|
||||
printf("[PHY] PUCCH subframe %d (%d,%d,%d,%d) => %d,%d\n",subframe,l,i,re_offset-1,m,((int16_t *)&z[j])[0],((int16_t *)&z[j])[1]);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void generate_pucch_emul(PHY_VARS_UE *phy_vars_ue,
|
||||
void generate_pucch_emul(PHY_VARS_UE *ue,
|
||||
UE_rxtx_proc_t *proc,
|
||||
PUCCH_FMT_t format,
|
||||
uint8_t ncs1,
|
||||
uint8_t *pucch_payload,
|
||||
uint8_t sr,
|
||||
uint8_t subframe)
|
||||
uint8_t sr)
|
||||
|
||||
{
|
||||
|
||||
UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pucch_flag = format;
|
||||
UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pucch_Ncs1 = ncs1;
|
||||
int subframe = proc->subframe_tx;
|
||||
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_flag = format;
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_Ncs1 = ncs1;
|
||||
|
||||
|
||||
UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.sr = sr;
|
||||
// the value of phy_vars_ue->pucch_sel[subframe] is set by get_n1_pucch
|
||||
UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pucch_sel = phy_vars_ue->pucch_sel[subframe];
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].cntl.sr = sr;
|
||||
// the value of ue->pucch_sel[subframe] is set by get_n1_pucch
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_sel = ue->pucch_sel[subframe];
|
||||
|
||||
// LOG_I(PHY,"subframe %d emu tx pucch_sel is %d sr is %d \n", subframe, UE_transport_info[phy_vars_ue->Mod_id].cntl.pucch_sel, sr);
|
||||
// LOG_I(PHY,"subframe %d emu tx pucch_sel is %d sr is %d \n", subframe, UE_transport_info[ue->Mod_id].cntl.pucch_sel, sr);
|
||||
|
||||
if (format == pucch_format1a) {
|
||||
|
||||
phy_vars_ue->pucch_payload[0] = pucch_payload[0];
|
||||
UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pucch_payload = pucch_payload[0];
|
||||
ue->pucch_payload[0] = pucch_payload[0];
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_payload = pucch_payload[0];
|
||||
} else if (format == pucch_format1b) {
|
||||
phy_vars_ue->pucch_payload[0] = pucch_payload[0] + (pucch_payload[1]<<1);
|
||||
UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pucch_payload = pucch_payload[0] + (pucch_payload[1]<<1);
|
||||
ue->pucch_payload[0] = pucch_payload[0] + (pucch_payload[1]<<1);
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_payload = pucch_payload[0] + (pucch_payload[1]<<1);
|
||||
} else if (format == pucch_format1) {
|
||||
LOG_D(PHY,"[UE %d] Frame %d subframe %d Generating PUCCH for SR %d\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_tx,subframe,sr);
|
||||
// LOG_D(PHY,"[UE %d] Frame %d subframe %d Generating PUCCH for SR %d\n",ue->Mod_id,proc->frame_tx,subframe,sr);
|
||||
}
|
||||
|
||||
phy_vars_ue->sr[subframe] = sr;
|
||||
ue->sr[subframe] = sr;
|
||||
|
||||
}
|
||||
|
||||
uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
inline void pucch2x_scrambling(LTE_DL_FRAME_PARMS *fp,int subframe,uint16_t rnti,uint32_t B,uint8_t *btilde) __attribute__((always_inline));
|
||||
inline void pucch2x_scrambling(LTE_DL_FRAME_PARMS *fp,int subframe,uint16_t rnti,uint32_t B,uint8_t *btilde) {
|
||||
|
||||
uint32_t x1, x2, s=0;
|
||||
int i;
|
||||
uint8_t c;
|
||||
|
||||
x2 = (rnti<<14) + ((1+subframe)<<16)*(1+(fp->Nid_cell<<1)); //this is c_init in 36.211 Sec 6.3.1
|
||||
s = lte_gold_generic(&x1, &x2, 1);
|
||||
for (i=0;i<19;i++) {
|
||||
c = (uint8_t)((s>>i)&1);
|
||||
btilde[i] = (((B>>i)&1) ^ c);
|
||||
}
|
||||
}
|
||||
|
||||
inline void pucch2x_modulation(uint8_t *btilde,int16_t *d,int16_t amp) __attribute__((always_inline));
|
||||
inline void pucch2x_modulation(uint8_t *btilde,int16_t *d,int16_t amp) {
|
||||
|
||||
int i;
|
||||
|
||||
for (i=0;i<20;i++)
|
||||
d[i] = btilde[i] == 1 ? amp : -amp;
|
||||
|
||||
}
|
||||
|
||||
uint32_t pucch_code[13] = {0xFFFFF,0x5A933,0x10E5A,0x6339C,0x73CE0,
|
||||
0xFFC00,0xD8E64,0x4F6B0,0x218EC,0x1B746,
|
||||
0x0FFFF,0x33FFF,0x3FFFC};
|
||||
|
||||
void generate_pucch2x(int32_t **txdataF,
|
||||
LTE_DL_FRAME_PARMS *fp,
|
||||
uint8_t ncs_cell[20][7],
|
||||
PUCCH_FMT_t fmt,
|
||||
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
||||
uint16_t n2_pucch,
|
||||
uint8_t shortened_format,
|
||||
uint32_t *payload,
|
||||
int A,
|
||||
int B2,
|
||||
int16_t amp,
|
||||
uint8_t subframe,
|
||||
uint16_t rnti) {
|
||||
|
||||
int i,j;
|
||||
uint32_t B=0;
|
||||
uint8_t btilde[20];
|
||||
int16_t d[22];
|
||||
uint8_t deltaPUCCH_Shift = fp->pucch_config_common.deltaPUCCH_Shift;
|
||||
uint8_t NRB2 = fp->pucch_config_common.nRB_CQI;
|
||||
uint8_t Ncs1 = fp->pucch_config_common.nCS_AN;
|
||||
|
||||
uint32_t u0 = (fp->Nid_cell + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[subframe<<1]) % 30;
|
||||
uint32_t u1 = (fp->Nid_cell + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[1+(subframe<<1)]) % 30;
|
||||
uint32_t v0=fp->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[subframe<<1];
|
||||
uint32_t v1=fp->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)];
|
||||
uint32_t z[12*14],*zptr;
|
||||
uint32_t u,v,n;
|
||||
uint8_t ns,N_UL_symb,nsymb;
|
||||
uint32_t nprime,l,n_cs;
|
||||
int alpha_ind,data_ind;
|
||||
int16_t ref_re,ref_im;
|
||||
int m,re_offset,symbol_offset;
|
||||
int32_t *txptr;
|
||||
|
||||
if ((deltaPUCCH_Shift==0) || (deltaPUCCH_Shift>3)) {
|
||||
printf("[PHY] generate_pucch: Illegal deltaPUCCH_shift %d (should be 1,2,3)\n",deltaPUCCH_Shift);
|
||||
return;
|
||||
}
|
||||
|
||||
if (Ncs1 > 7) {
|
||||
printf("[PHY] generate_pucch: Illegal Ncs1 %d (should be 0...7)\n",Ncs1);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// pucch2x_encoding
|
||||
for (i=0;i<A;i++)
|
||||
if ((*payload & (1<<i)) > 0)
|
||||
B=B^pucch_code[i];
|
||||
|
||||
// scrambling
|
||||
pucch2x_scrambling(fp,subframe,rnti,B,btilde);
|
||||
// modulation
|
||||
pucch2x_modulation(btilde,d,amp);
|
||||
|
||||
// add extra symbol for 2a/2b
|
||||
d[20]=0;
|
||||
d[21]=0;
|
||||
if (fmt==pucch_format2a)
|
||||
d[20] = (B2 == 0) ? amp : -amp;
|
||||
else if (fmt==pucch_format2b) {
|
||||
switch (B2) {
|
||||
case 0:
|
||||
d[20] = amp;
|
||||
break;
|
||||
case 1:
|
||||
d[21] = -amp;
|
||||
break;
|
||||
case 2:
|
||||
d[21] = amp;
|
||||
break;
|
||||
case 3:
|
||||
d[20] = -amp;
|
||||
break;
|
||||
default:
|
||||
AssertFatal(1==0,"Illegal modulation symbol %d for PUCCH %s\n",B2,pucch_format_string[fmt]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
zptr = z;
|
||||
|
||||
#ifdef DEBUG_PUCCH_TX
|
||||
printf("[PHY] PUCCH2x: n2_pucch %d\n",n2_pucch);
|
||||
#endif
|
||||
|
||||
N_UL_symb = (fp->Ncp==0) ? 7 : 6;
|
||||
|
||||
for (ns=(subframe<<1),u=u0,v=v0; ns<(2+(subframe<<1)); ns++,u=u1,v=v1) {
|
||||
|
||||
if ((ns&1) == 0)
|
||||
nprime = (n2_pucch < 12*NRB2) ?
|
||||
n2_pucch % 12 :
|
||||
(n2_pucch+Ncs1 + 1)%12;
|
||||
else
|
||||
nprime = (n2_pucch < 12*NRB2) ?
|
||||
((12*(nprime+1)) % 13)-1 :
|
||||
(10-n2_pucch)%12;
|
||||
|
||||
//loop over symbols in slot
|
||||
for (l=0; l<N_UL_symb; l++) {
|
||||
// Compute n_cs (36.211 p. 18)
|
||||
n_cs = (ncs_cell[ns][l]+nprime)%12;
|
||||
|
||||
alpha_ind = n_cs;
|
||||
data_ind = 0;
|
||||
|
||||
for (n=0; n<12; n++) {
|
||||
|
||||
// this is r_uv^alpha(n)
|
||||
ref_re = (int16_t)(((int32_t)alpha_re[alpha_ind] * ul_ref_sigs[u][v][0][n<<1] - (int32_t)alpha_im[alpha_ind] * ul_ref_sigs[u][v][0][1+(n<<1)])>>15);
|
||||
ref_im = (int16_t)(((int32_t)alpha_re[alpha_ind] * ul_ref_sigs[u][v][0][1+(n<<1)] + (int32_t)alpha_im[alpha_ind] * ul_ref_sigs[u][v][0][n<<1])>>15);
|
||||
|
||||
if ((l<2)||(l>=(N_UL_symb-2))) { //these are PUCCH data symbols
|
||||
((int16_t *)&zptr[n])[0] = ((int32_t)d[data_ind]*ref_re - (int32_t)d[data_ind+1]*ref_im)>>15;
|
||||
((int16_t *)&zptr[n])[1] = ((int32_t)d[data_ind]*ref_im + (int32_t)d[data_ind+1]*ref_re)>>15;
|
||||
}
|
||||
else {
|
||||
((int16_t *)&zptr[n])[0] = ref_re;
|
||||
((int16_t *)&zptr[n])[1] = ref_im;
|
||||
}
|
||||
|
||||
} // n
|
||||
if ((l<2)||(l>=(N_UL_symb-2))) //these are PUCCH data symbols so increment data index
|
||||
data_ind+=2;
|
||||
} // l
|
||||
} //ns
|
||||
|
||||
m = n2_pucch/12;
|
||||
|
||||
#ifdef DEBUG_PUCCH_TX
|
||||
printf("[PHY] PUCCH: m %d\n",m);
|
||||
#endif
|
||||
nsymb = N_UL_symb<<1;
|
||||
|
||||
//for (j=0,l=0;l<(nsymb-1);l++) {
|
||||
for (j=0,l=0; l<(nsymb); l++) {
|
||||
if ((l<(nsymb>>1)) && ((m&1) == 0))
|
||||
re_offset = (m*6) + fp->first_carrier_offset;
|
||||
else if ((l<(nsymb>>1)) && ((m&1) == 1))
|
||||
re_offset = fp->first_carrier_offset + (fp->N_RB_DL - (m>>1) - 1)*12;
|
||||
else if ((m&1) == 0)
|
||||
re_offset = fp->first_carrier_offset + (fp->N_RB_DL - (m>>1) - 1)*12;
|
||||
else
|
||||
re_offset = ((m-1)*6) + fp->first_carrier_offset;
|
||||
|
||||
if (re_offset > fp->ofdm_symbol_size)
|
||||
re_offset -= (fp->ofdm_symbol_size);
|
||||
|
||||
symbol_offset = (unsigned int)fp->ofdm_symbol_size*(l+(subframe*nsymb));
|
||||
txptr = &txdataF[0][symbol_offset];
|
||||
|
||||
for (i=0; i<12; i++,j++) {
|
||||
txptr[re_offset++] = z[j];
|
||||
|
||||
if (re_offset==fp->ofdm_symbol_size)
|
||||
re_offset = 0;
|
||||
|
||||
#ifdef DEBUG_PUCCH_TX
|
||||
printf("[PHY] PUCCH subframe %d (%d,%d,%d,%d) => %d,%d\n",subframe,l,i,re_offset-1,m,((int16_t *)&z[j])[0],((int16_t *)&z[j])[1]);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
uint32_t rx_pucch(PHY_VARS_eNB *eNB,
|
||||
PUCCH_FMT_t fmt,
|
||||
uint8_t UE_id,
|
||||
uint16_t n1_pucch,
|
||||
@@ -420,15 +613,15 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
|
||||
static int first_call=1;
|
||||
LTE_eNB_COMMON *eNB_common_vars = &phy_vars_eNB->lte_eNB_common_vars;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms;
|
||||
// PUCCH_CONFIG_DEDICATED *pucch_config_dedicated = &phy_vars_eNB->pucch_config_dedicated[UE_id];
|
||||
int8_t sigma2_dB = phy_vars_eNB->PHY_measurements_eNB[0].n0_subband_power_tot_dB[0]-10;
|
||||
uint32_t *Po_PUCCH = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH);
|
||||
int32_t *Po_PUCCH_dBm = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH_dBm);
|
||||
uint32_t *Po_PUCCH1_below = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_below);
|
||||
uint32_t *Po_PUCCH1_above = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_above);
|
||||
int32_t *Po_PUCCH_update = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH_update);
|
||||
LTE_eNB_COMMON *common_vars = &eNB->common_vars;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
|
||||
// PUCCH_CONFIG_DEDICATED *pucch_config_dedicated = &eNB->pucch_config_dedicated[UE_id];
|
||||
int8_t sigma2_dB = eNB->measurements[0].n0_subband_power_tot_dB[0]-10;
|
||||
uint32_t *Po_PUCCH = &(eNB->UE_stats[UE_id].Po_PUCCH);
|
||||
int32_t *Po_PUCCH_dBm = &(eNB->UE_stats[UE_id].Po_PUCCH_dBm);
|
||||
uint32_t *Po_PUCCH1_below = &(eNB->UE_stats[UE_id].Po_PUCCH1_below);
|
||||
uint32_t *Po_PUCCH1_above = &(eNB->UE_stats[UE_id].Po_PUCCH1_above);
|
||||
int32_t *Po_PUCCH_update = &(eNB->UE_stats[UE_id].Po_PUCCH_update);
|
||||
uint32_t u,v,n,aa;
|
||||
uint32_t z[12*14];
|
||||
int16_t *zptr;
|
||||
@@ -460,8 +653,8 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
if (first_call == 1) {
|
||||
for (i=0;i<10;i++) {
|
||||
for (j=0;j<NUMBER_OF_UE_MAX;j++) {
|
||||
phy_vars_eNB->pucch1_stats_cnt[j][i]=0;
|
||||
phy_vars_eNB->pucch1ab_stats_cnt[j][i]=0;
|
||||
eNB->pucch1_stats_cnt[j][i]=0;
|
||||
eNB->pucch1ab_stats_cnt[j][i]=0;
|
||||
}
|
||||
}
|
||||
first_call=0;
|
||||
@@ -503,7 +696,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
Nprime = Nprime_div_deltaPUCCH_Shift * deltaPUCCH_Shift;
|
||||
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_D(PHY,"[eNB] PUCCH: cNcs1/deltaPUCCH_Shift %d, Nprime %d, n1_pucch %d\n",thres,Nprime,n1_pucch);
|
||||
printf("[eNB] PUCCH: cNcs1/deltaPUCCH_Shift %d, Nprime %d, n1_pucch %d\n",thres,Nprime,n1_pucch);
|
||||
#endif
|
||||
|
||||
N_UL_symb = (frame_parms->Ncp==NORMAL) ? 7 : 6;
|
||||
@@ -522,7 +715,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
}
|
||||
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_D(PHY,"PUCCH: nprime0 %d nprime1 %d\n",nprime0,nprime1);
|
||||
printf("PUCCH: nprime0 %d nprime1 %d\n",nprime0,nprime1);
|
||||
#endif
|
||||
|
||||
n_oc0 = nprime0/Nprime_div_deltaPUCCH_Shift;
|
||||
@@ -536,7 +729,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
n_oc1<<=1;
|
||||
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_D(PHY,"[eNB] PUCCH: noc0 %d noc11 %d\n",n_oc0,n_oc1);
|
||||
printf("[eNB] PUCCH: noc0 %d noc11 %d\n",n_oc0,n_oc1);
|
||||
#endif
|
||||
|
||||
nprime=nprime0;
|
||||
@@ -559,7 +752,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
//loop over symbols in slot
|
||||
for (l=0; l<N_UL_symb; l++) {
|
||||
// Compute n_cs (36.211 p. 18)
|
||||
n_cs = phy_vars_eNB->ncs_cell[ns][l];
|
||||
n_cs = eNB->ncs_cell[ns][l];
|
||||
|
||||
if (frame_parms->Ncp==0) { // normal CP
|
||||
n_cs = ((uint16_t)n_cs + (nprime*deltaPUCCH_Shift + (n_oc%deltaPUCCH_Shift))%Nprime)%12;
|
||||
@@ -615,7 +808,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
}
|
||||
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_D(PHY,"[eNB] PUCCH: ncs[%d][%d]=%d, W_re %d, W_im %d, S %d, refs %d\n",ns,l,n_cs,W_re,W_im,S,refs);
|
||||
printf("[eNB] PUCCH: ncs[%d][%d]=%d, W_re %d, W_im %d, S %d, refs %d\n",ns,l,n_cs,W_re,W_im,S,refs);
|
||||
#endif
|
||||
alpha_ind=0;
|
||||
// compute output sequence
|
||||
@@ -631,7 +824,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
zptr[1+(n<<1)] = -(tmp_re*W_im + tmp_im*W_re)>>15;
|
||||
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_D(PHY,"[eNB] PUCCH subframe %d z(%d,%d) => %d,%d, alpha(%d) => %d,%d\n",subframe,l,n,zptr[n<<1],zptr[(n<<1)+1],
|
||||
printf("[eNB] PUCCH subframe %d z(%d,%d) => %d,%d, alpha(%d) => %d,%d\n",subframe,l,n,zptr[n<<1],zptr[(n<<1)+1],
|
||||
alpha_ind,alpha_re[alpha_ind],alpha_im[alpha_ind]);
|
||||
#endif
|
||||
|
||||
@@ -650,7 +843,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
m = (n1_pucch < thres) ? NRB2 : (((n1_pucch-thres)/(12*c/deltaPUCCH_Shift))+NRB2+((deltaPUCCH_Shift*Ncs1_div_deltaPUCCH_Shift)>>3)+rem);
|
||||
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_D(PHY,"[eNB] PUCCH: m %d\n",m);
|
||||
printf("[eNB] PUCCH: m %d\n",m);
|
||||
#endif
|
||||
nsymb = N_UL_symb<<1;
|
||||
|
||||
@@ -674,7 +867,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
re_offset -= (frame_parms->ofdm_symbol_size);
|
||||
|
||||
symbol_offset = (unsigned int)frame_parms->ofdm_symbol_size*l;
|
||||
rxptr = (int16_t *)&eNB_common_vars->rxdataF[0][aa][symbol_offset];
|
||||
rxptr = (int16_t *)&common_vars->rxdataF[0][aa][symbol_offset];
|
||||
|
||||
for (i=0; i<12; i++,j+=2,re_offset++) {
|
||||
rxcomp[aa][j] = (int16_t)((rxptr[re_offset<<1]*(int32_t)zptr[j])>>15) - ((rxptr[1+(re_offset<<1)]*(int32_t)zptr[1+j])>>15);
|
||||
@@ -684,7 +877,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
re_offset = 0;
|
||||
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d,%d,%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,i,re_offset,m,j,
|
||||
printf("[eNB] PUCCH subframe %d (%d,%d,%d,%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,i,re_offset,m,j,
|
||||
rxptr[re_offset<<1],rxptr[1+(re_offset<<1)],
|
||||
zptr[j],zptr[1+j],
|
||||
rxcomp[aa][j],rxcomp[aa][1+j]);
|
||||
@@ -699,7 +892,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
if (fmt == pucch_format1) {
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_D(PHY,"Doing PUCCH detection for format 1\n");
|
||||
printf("Doing PUCCH detection for format 1\n");
|
||||
#endif
|
||||
|
||||
stat_max = 0;
|
||||
@@ -722,7 +915,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d,%d) => (%d,%d) x (%d,%d) : (%d,%d) , stat %d\n",subframe,phase,l,re,
|
||||
printf("[eNB] PUCCH subframe %d (%d,%d,%d) => (%d,%d) x (%d,%d) : (%d,%d) , stat %d\n",subframe,phase,l,re,
|
||||
rxcomp[aa][off],rxcomp[aa][1+off],
|
||||
cfo[l<<1],cfo[1+(l<<1)],
|
||||
stat_re,stat_im,stat);
|
||||
@@ -735,7 +928,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
off+=2;
|
||||
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d,%d) => (%d,%d) x (%d,%d) : (%d,%d), stat %d\n",subframe,phase,l2,re,
|
||||
printf("[eNB] PUCCH subframe %d (%d,%d,%d) => (%d,%d) x (%d,%d) : (%d,%d), stat %d\n",subframe,phase,l2,re,
|
||||
rxcomp[aa][off],rxcomp[aa][1+off],
|
||||
cfo[l2<<1],cfo[1+(l2<<1)],
|
||||
stat_re,stat_im,stat);
|
||||
@@ -759,24 +952,24 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
stat_max *= nsymb; // normalize to energy per symbol
|
||||
stat_max /= (frame_parms->N_RB_UL*12); //
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_D(PHY,"[eNB] PUCCH: stat %d, stat_max %d, phase_max %d\n", stat,stat_max,phase_max);
|
||||
printf("[eNB] PUCCH: stat %d, stat_max %d, phase_max %d\n", stat,stat_max,phase_max);
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_I(PHY,"[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (%d, %d), phase_max : %d\n",dB_fixed(stat_max),sigma2_dB,phy_vars_eNB->PHY_measurements_eNB[0].n0_subband_power_tot_dBm[6],pucch1_thres,phase_max);
|
||||
LOG_I(PHY,"[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (%d, %d), phase_max : %d\n",dB_fixed(stat_max),sigma2_dB,eNB->measurements[0].n0_subband_power_tot_dBm[6],pucch1_thres,phase_max);
|
||||
#endif
|
||||
|
||||
phy_vars_eNB->pucch1_stats[UE_id][(subframe<<10)+phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe]] = stat_max;
|
||||
phy_vars_eNB->pucch1_stats_thres[UE_id][(subframe<<10)+phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe]] = sigma2_dB+pucch1_thres;
|
||||
phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe] = (phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe]+1)&1023;
|
||||
eNB->pucch1_stats[UE_id][(subframe<<10)+eNB->pucch1_stats_cnt[UE_id][subframe]] = stat_max;
|
||||
eNB->pucch1_stats_thres[UE_id][(subframe<<10)+eNB->pucch1_stats_cnt[UE_id][subframe]] = sigma2_dB+pucch1_thres;
|
||||
eNB->pucch1_stats_cnt[UE_id][subframe] = (eNB->pucch1_stats_cnt[UE_id][subframe]+1)&1023;
|
||||
|
||||
T(T_ENB_PHY_PUCCH_1_ENERGY, T_INT(phy_vars_eNB->Mod_id), T_INT(UE_id), T_INT(frame), T_INT(subframe),
|
||||
T(T_ENB_PHY_PUCCH_1_ENERGY, T_INT(eNB->Mod_id), T_INT(UE_id), T_INT(frame), T_INT(subframe),
|
||||
T_INT(stat_max), T_INT(sigma2_dB+pucch1_thres));
|
||||
|
||||
/*
|
||||
if (phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe] == 0) {
|
||||
if (eNB->pucch1_stats_cnt[UE_id][subframe] == 0) {
|
||||
write_output("pucch_debug.m","pucch_energy",
|
||||
&phy_vars_eNB->pucch1_stats[UE_id][(subframe<<10)],
|
||||
&eNB->pucch1_stats[UE_id][(subframe<<10)],
|
||||
1024,1,2);
|
||||
AssertFatal(0,"Exiting for PUCCH 1 debug\n");
|
||||
|
||||
@@ -787,13 +980,13 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
if (sigma2_dB<(dB_fixed(stat_max)-pucch1_thres)) {
|
||||
*payload = 1;
|
||||
*Po_PUCCH1_above = ((*Po_PUCCH1_above<<9) + (stat_max<<9)+1024)>>10;
|
||||
//LOG_I(PHY,"[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (%d, %d), phase_max : %d\n",dB_fixed(stat_max),sigma2_dB,phy_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dBm,pucch1_thres,phase_max);
|
||||
//LOG_I(PHY,"[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (%d, %d), phase_max : %d\n",dB_fixed(stat_max),sigma2_dB,eNB->PHY_measurements_eNB[0].n0_power_tot_dBm,pucch1_thres,phase_max);
|
||||
}
|
||||
else {
|
||||
*payload = 0;
|
||||
*Po_PUCCH1_below = ((*Po_PUCCH1_below<<9) + (stat_max<<9)+1024)>>10;
|
||||
}
|
||||
LOG_D(PHY,"[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (I0 %d dBm, thres %d), Po_PUCCH1_below/above : %d / %d\n",dB_fixed(stat_max),sigma2_dB,phy_vars_eNB->PHY_measurements_eNB[0].n0_subband_power_tot_dBm[6],pucch1_thres,dB_fixed(*Po_PUCCH1_below),dB_fixed(*Po_PUCCH1_above));
|
||||
//printf("[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (I0 %d dBm, thres %d), Po_PUCCH1_below/above : %d / %d\n",dB_fixed(stat_max),sigma2_dB,eNB->measurements[0].n0_subband_power_tot_dBm[6],pucch1_thres,dB_fixed(*Po_PUCCH1_below),dB_fixed(*Po_PUCCH1_above));
|
||||
*Po_PUCCH_update = 1;
|
||||
if (UE_id==0) {
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_SR_ENERGY,dB_fixed(stat_max));
|
||||
@@ -829,7 +1022,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
off+=2;
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
|
||||
printf("[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
|
||||
rxcomp[aa][off],rxcomp[aa][1+off],
|
||||
cfo[l<<1],cfo[1+(l<<1)],
|
||||
stat_re,stat_im);
|
||||
@@ -850,7 +1043,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
off+=2;
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l2,re,
|
||||
printf("[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l2,re,
|
||||
rxcomp[aa][off],rxcomp[aa][1+off],
|
||||
cfo[l2<<1],cfo[1+(l2<<1)],
|
||||
stat_re,stat_im);
|
||||
@@ -859,7 +1052,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
}
|
||||
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_D(PHY,"aa%d re %d : phase %d : stat %d\n",aa,re,phase,stat);
|
||||
printf("aa%d re %d : phase %d : stat %d\n",aa,re,phase,stat);
|
||||
#endif
|
||||
|
||||
stat += ((((stat_re*stat_re)) + ((stat_im*stat_im)) +
|
||||
@@ -879,24 +1072,24 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
} //phase
|
||||
|
||||
stat_max/=(12); //normalize to energy per symbol and RE
|
||||
//#ifdef DEBUG_PUCCH_RX
|
||||
LOG_D(PHY,"[eNB] PUCCH fmt1a/b: stat_max : %d, phase_max : %d\n",stat_max,phase_max);
|
||||
//#endif
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
printf("[eNB] PUCCH fmt1a/b: stat_max : %d, phase_max : %d\n",stat_max,phase_max);
|
||||
#endif
|
||||
|
||||
stat_re=0;
|
||||
stat_im=0;
|
||||
LOG_D(PHY,"PUCCH1A : Po_PUCCH before %d dB (%d)\n",dB_fixed(*Po_PUCCH),*Po_PUCCH);
|
||||
// printf("PUCCH1A : Po_PUCCH before %d dB (%d)\n",dB_fixed(*Po_PUCCH),*Po_PUCCH);
|
||||
*Po_PUCCH = ((*Po_PUCCH>>1) + ((stat_max)>>1));
|
||||
*Po_PUCCH_dBm = dB_fixed(*Po_PUCCH/frame_parms->N_RB_UL) - phy_vars_eNB->rx_total_gain_eNB_dB;
|
||||
*Po_PUCCH_dBm = dB_fixed(*Po_PUCCH/frame_parms->N_RB_UL) - eNB->rx_total_gain_dB;
|
||||
*Po_PUCCH_update = 1;
|
||||
|
||||
LOG_D(PHY,"PUCCH1A : stat_max %d (%d,%d,%d) => Po_PUCCH %d\n",
|
||||
dB_fixed(stat_max),
|
||||
pucch1_thres+sigma2_dB,
|
||||
pucch1_thres,
|
||||
sigma2_dB,
|
||||
dB_fixed(*Po_PUCCH));
|
||||
|
||||
/*
|
||||
printf("PUCCH1A : stat_max %d (%d,%d,%d) => Po_PUCCH %d\n",
|
||||
dB_fixed(stat_max),
|
||||
pucch1_thres+sigma2_dB,
|
||||
pucch1_thres,
|
||||
sigma2_dB,
|
||||
dB_fixed(*Po_PUCCH));
|
||||
*/
|
||||
// Do detection now
|
||||
if (sigma2_dB<(dB_fixed(stat_max)-pucch1_thres)) {//
|
||||
|
||||
@@ -919,7 +1112,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
}
|
||||
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_D(PHY,"[eNB] PUCCH subframe %d l %d re %d chest1 => (%d,%d)\n",subframe,l,re,
|
||||
printf("[eNB] PUCCH subframe %d l %d re %d chest1 => (%d,%d)\n",subframe,l,re,
|
||||
chest_re,chest_im);
|
||||
#endif
|
||||
|
||||
@@ -931,7 +1124,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15))/4;
|
||||
off+=2;
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
|
||||
printf("[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
|
||||
rxcomp[aa][off],rxcomp[aa][1+off],
|
||||
cfo[l<<1],cfo[1+(l<<1)],
|
||||
stat_re,stat_im);
|
||||
@@ -946,7 +1139,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15)/4);
|
||||
off+=2;
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
|
||||
printf("[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
|
||||
rxcomp[aa][off],rxcomp[aa][1+off],
|
||||
cfo[l<<1],cfo[1+(l<<1)],
|
||||
stat_re,stat_im);
|
||||
@@ -964,7 +1157,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
}
|
||||
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_D(PHY,"[eNB] PUCCH subframe %d l %d re %d chest2 => (%d,%d)\n",subframe,l,re,
|
||||
printf("[eNB] PUCCH subframe %d l %d re %d chest2 => (%d,%d)\n",subframe,l,re,
|
||||
chest_re,chest_im);
|
||||
#endif
|
||||
|
||||
@@ -976,7 +1169,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15))/4;
|
||||
off+=2;
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_D(PHY,"[PHY][eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
|
||||
printf("[PHY][eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
|
||||
rxcomp[aa][off],rxcomp[aa][1+off],
|
||||
cfo[l<<1],cfo[1+(l<<1)],
|
||||
stat_re,stat_im);
|
||||
@@ -991,7 +1184,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15))/4;
|
||||
off+=2;
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_D(PHY,"[PHY][eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
|
||||
printf("[PHY][eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
|
||||
rxcomp[aa][off],rxcomp[aa][1+off],
|
||||
cfo[l<<1],cfo[1+(l<<1)],
|
||||
stat_re,stat_im);
|
||||
@@ -999,7 +1192,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
}
|
||||
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_D(PHY,"aa%d re %d : stat %d,%d\n",aa,re,stat_re,stat_im);
|
||||
printf("aa%d re %d : stat %d,%d\n",aa,re,stat_re,stat_im);
|
||||
#endif
|
||||
|
||||
} //re
|
||||
@@ -1007,15 +1200,15 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
#ifdef DEBUG_PUCCH_RX
|
||||
LOG_I(PHY,"PUCCH 1a/b: subframe %d : stat %d,%d (pos %d)\n",subframe,stat_re,stat_im,
|
||||
(subframe<<10) + (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe]));
|
||||
(subframe<<10) + (eNB->pucch1ab_stats_cnt[UE_id][subframe]));
|
||||
#endif
|
||||
|
||||
phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<11) + 2*(phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe])] = (stat_re);
|
||||
phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<11) + 1+2*(phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe])] = (stat_im);
|
||||
phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe] = (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe]+1)&1023;
|
||||
eNB->pucch1ab_stats[UE_id][(subframe<<11) + 2*(eNB->pucch1ab_stats_cnt[UE_id][subframe])] = (stat_re);
|
||||
eNB->pucch1ab_stats[UE_id][(subframe<<11) + 1+2*(eNB->pucch1ab_stats_cnt[UE_id][subframe])] = (stat_im);
|
||||
eNB->pucch1ab_stats_cnt[UE_id][subframe] = (eNB->pucch1ab_stats_cnt[UE_id][subframe]+1)&1023;
|
||||
|
||||
/* frame not available here - set to -1 for the moment */
|
||||
T(T_ENB_PHY_PUCCH_1AB_IQ, T_INT(phy_vars_eNB->Mod_id), T_INT(UE_id), T_INT(-1), T_INT(subframe), T_INT(stat_re), T_INT(stat_im));
|
||||
T(T_ENB_PHY_PUCCH_1AB_IQ, T_INT(eNB->Mod_id), T_INT(UE_id), T_INT(-1), T_INT(subframe), T_INT(stat_re), T_INT(stat_im));
|
||||
|
||||
|
||||
*payload = (stat_re<0) ? 1 : 0;
|
||||
@@ -1023,11 +1216,10 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
if (fmt==pucch_format1b)
|
||||
*(1+payload) = (stat_im<0) ? 1 : 0;
|
||||
} else { // insufficient energy on PUCCH so NAK
|
||||
((int16_t*)&phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<10) + (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe])])[0] = (int16_t)(stat_re);
|
||||
((int16_t*)&phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<10) + (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe])])[1] = (int16_t)(stat_im);
|
||||
phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe] = (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe]+1)&1023;
|
||||
|
||||
*payload = 0;
|
||||
((int16_t*)&eNB->pucch1ab_stats[UE_id][(subframe<<10) + (eNB->pucch1ab_stats_cnt[UE_id][subframe])])[0] = (int16_t)(stat_re);
|
||||
((int16_t*)&eNB->pucch1ab_stats[UE_id][(subframe<<10) + (eNB->pucch1ab_stats_cnt[UE_id][subframe])])[1] = (int16_t)(stat_im);
|
||||
eNB->pucch1ab_stats_cnt[UE_id][subframe] = (eNB->pucch1ab_stats_cnt[UE_id][subframe]+1)&1023;
|
||||
|
||||
if (fmt==pucch_format1b)
|
||||
*(1+payload) = 0;
|
||||
@@ -1041,22 +1233,23 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
}
|
||||
|
||||
|
||||
int32_t rx_pucch_emul(PHY_VARS_eNB *phy_vars_eNB,
|
||||
int32_t rx_pucch_emul(PHY_VARS_eNB *eNB,
|
||||
eNB_rxtx_proc_t *proc,
|
||||
uint8_t UE_index,
|
||||
PUCCH_FMT_t fmt,
|
||||
uint8_t n1_pucch_sel,
|
||||
uint8_t *payload,
|
||||
uint8_t sched_subframe)
|
||||
uint8_t *payload)
|
||||
|
||||
{
|
||||
uint8_t UE_id;
|
||||
uint16_t rnti;
|
||||
int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
|
||||
uint8_t CC_id = phy_vars_eNB->CC_id;
|
||||
int subframe = proc->subframe_rx;
|
||||
uint8_t CC_id = eNB->CC_id;
|
||||
|
||||
rnti = phy_vars_eNB->ulsch_eNB[UE_index]->rnti;
|
||||
rnti = eNB->ulsch[UE_index]->rnti;
|
||||
|
||||
for (UE_id=0; UE_id<NB_UE_INST; UE_id++) {
|
||||
if (rnti == PHY_vars_UE_g[UE_id][CC_id]->lte_ue_pdcch_vars[0]->crnti)
|
||||
if (rnti == PHY_vars_UE_g[UE_id][CC_id]->pdcch_vars[0]->crnti)
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1073,7 +1266,7 @@ int32_t rx_pucch_emul(PHY_VARS_eNB *phy_vars_eNB,
|
||||
payload[0] = PHY_vars_UE_g[UE_id][CC_id]->pucch_payload[0];
|
||||
payload[1] = PHY_vars_UE_g[UE_id][CC_id]->pucch_payload[1];
|
||||
} else
|
||||
LOG_E(PHY,"[eNB] Frame %d: Can't handle formats 2/2a/2b\n",phy_vars_eNB->proc[sched_subframe].frame_rx);
|
||||
LOG_E(PHY,"[eNB] Frame %d: Can't handle formats 2/2a/2b\n",proc->frame_rx);
|
||||
|
||||
if (PHY_vars_UE_g[UE_id][CC_id]->pucch_sel[subframe] == n1_pucch_sel)
|
||||
return(99);
|
||||
|
||||
@@ -145,27 +145,29 @@ int generate_eNB_ulsch_params_from_rar(unsigned char *rar_pdu,
|
||||
|
||||
int8_t delta_PUSCH_msg2[8] = {-6,-4,-2,0,2,4,6,8};
|
||||
|
||||
int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue,
|
||||
int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *ue,
|
||||
UE_rxtx_proc_t *proc,
|
||||
unsigned char eNB_id )
|
||||
{
|
||||
|
||||
// RA_HEADER_RAPID *rarh = (RA_HEADER_RAPID *)rar_pdu;
|
||||
uint8_t transmission_mode = phy_vars_ue->transmission_mode[eNB_id];
|
||||
unsigned char *rar_pdu = phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b;
|
||||
unsigned char subframe = phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id];
|
||||
LTE_UE_ULSCH_t *ulsch = phy_vars_ue->ulsch_ue[eNB_id];
|
||||
PHY_MEASUREMENTS *meas = &phy_vars_ue->PHY_measurements;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms;
|
||||
// int current_dlsch_cqi = phy_vars_ue->current_dlsch_cqi[eNB_id];
|
||||
uint8_t transmission_mode = ue->transmission_mode[eNB_id];
|
||||
unsigned char *rar_pdu = ue->dlsch_ra[eNB_id]->harq_processes[0]->b;
|
||||
unsigned char subframe = ue->ulsch_Msg3_subframe[eNB_id];
|
||||
LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id];
|
||||
PHY_MEASUREMENTS *meas = &ue->measurements;
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
||||
// int current_dlsch_cqi = ue->current_dlsch_cqi[eNB_id];
|
||||
|
||||
uint8_t *rar = (uint8_t *)(rar_pdu+1);
|
||||
uint8_t harq_pid = subframe2harq_pid(frame_parms,phy_vars_ue->frame_tx,subframe);
|
||||
uint8_t harq_pid = subframe2harq_pid(frame_parms,proc->frame_tx,subframe);
|
||||
uint16_t rballoc;
|
||||
uint8_t cqireq;
|
||||
uint16_t *RIV2nb_rb_LUT, *RIV2first_rb_LUT;
|
||||
uint16_t RIV_max = 0;
|
||||
|
||||
LOG_D(PHY,"[eNB][RAPROC] Frame %d: generate_ue_ulsch_params_from_rar: subframe %d (harq_pid %d)\n",phy_vars_ue->frame_tx,subframe,harq_pid);
|
||||
LOG_D(PHY,"[eNB][RAPROC] Frame %d: generate_ue_ulsch_params_from_rar: subframe %d (harq_pid %d)\n",proc->frame_tx,subframe,harq_pid);
|
||||
|
||||
switch (frame_parms->N_RB_DL) {
|
||||
case 6:
|
||||
@@ -240,10 +242,10 @@ int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue,
|
||||
}
|
||||
|
||||
ulsch->uci_format = HLC_subband_cqi_nopmi;
|
||||
fill_CQI(ulsch,meas,eNB_id,0,phy_vars_ue->lte_frame_parms.N_RB_DL,0, transmission_mode,phy_vars_ue->sinr_eff);
|
||||
fill_CQI(ulsch,meas,eNB_id,0,ue->frame_parms.N_RB_DL,0, transmission_mode,ue->sinr_eff);
|
||||
|
||||
if (((phy_vars_ue->frame_tx % 100) == 0) || (phy_vars_ue->frame_tx < 10))
|
||||
print_CQI(ulsch->o,ulsch->uci_format,eNB_id,phy_vars_ue->lte_frame_parms.N_RB_DL);
|
||||
if (((proc->frame_tx % 100) == 0) || (proc->frame_tx < 10))
|
||||
print_CQI(ulsch->o,ulsch->uci_format,eNB_id,ue->frame_parms.N_RB_DL);
|
||||
} else {
|
||||
ulsch->O_RI = 0;
|
||||
ulsch->O = 0;
|
||||
@@ -275,10 +277,10 @@ int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue,
|
||||
|
||||
// initialize power control based on PRACH power
|
||||
ulsch->f_pusch = delta_PUSCH_msg2[ulsch->harq_processes[harq_pid]->TPC] +
|
||||
mac_xface->get_deltaP_rampup(phy_vars_ue->Mod_id,phy_vars_ue->CC_id);
|
||||
mac_xface->get_deltaP_rampup(ue->Mod_id,ue->CC_id);
|
||||
LOG_D(PHY,"[UE %d][PUSCH PC] Initializing f_pusch to %d dB, TPC %d (delta_PUSCH_msg2 %d dB), deltaP_rampup %d dB\n",
|
||||
phy_vars_ue->Mod_id,ulsch->f_pusch,ulsch->harq_processes[harq_pid]->TPC,delta_PUSCH_msg2[ulsch->harq_processes[harq_pid]->TPC],
|
||||
mac_xface->get_deltaP_rampup(phy_vars_ue->Mod_id,phy_vars_ue->CC_id));
|
||||
ue->Mod_id,ulsch->f_pusch,ulsch->harq_processes[harq_pid]->TPC,delta_PUSCH_msg2[ulsch->harq_processes[harq_pid]->TPC],
|
||||
mac_xface->get_deltaP_rampup(ue->Mod_id,ue->CC_id));
|
||||
|
||||
|
||||
//#ifdef DEBUG_RAR
|
||||
|
||||
@@ -100,15 +100,15 @@ int compareints (const void * a, const void * b)
|
||||
}
|
||||
|
||||
|
||||
int32_t generate_srs_tx(PHY_VARS_UE *phy_vars_ue,
|
||||
int32_t generate_srs_tx(PHY_VARS_UE *ue,
|
||||
uint8_t eNB_id,
|
||||
int16_t amp,
|
||||
uint32_t subframe)
|
||||
{
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms;
|
||||
SOUNDINGRS_UL_CONFIG_DEDICATED *soundingrs_ul_config_dedicated=&phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id];
|
||||
int32_t *txdataF = phy_vars_ue->lte_ue_common_vars.txdataF[0];
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
|
||||
SOUNDINGRS_UL_CONFIG_DEDICATED *soundingrs_ul_config_dedicated=&ue->soundingrs_ul_config_dedicated[eNB_id];
|
||||
int32_t *txdataF = ue->common_vars.txdataF[0];
|
||||
uint16_t msrsb=0,Nb=0,nb,b,msrs0=0,k,Msc_RS,Msc_RS_idx,carrier_pos,symbol_offset;
|
||||
uint16_t *Msc_idx_ptr;
|
||||
int32_t k0;
|
||||
|
||||
@@ -61,7 +61,7 @@ int generate_sss(int32_t **txdataF,
|
||||
return(0);
|
||||
}
|
||||
|
||||
int pss_ch_est(PHY_VARS_UE *phy_vars_ue,
|
||||
int pss_ch_est(PHY_VARS_UE *ue,
|
||||
int32_t pss_ext[4][72],
|
||||
int32_t sss_ext[4][72])
|
||||
{
|
||||
@@ -69,9 +69,9 @@ int pss_ch_est(PHY_VARS_UE *phy_vars_ue,
|
||||
int16_t *pss;
|
||||
int16_t *pss_ext2,*sss_ext2,*sss_ext3,tmp_re,tmp_im,tmp_re2,tmp_im2;
|
||||
uint8_t aarx,i;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
||||
|
||||
switch (phy_vars_ue->lte_ue_common_vars.eNb_id) {
|
||||
switch (ue->common_vars.eNb_id) {
|
||||
|
||||
case 0:
|
||||
pss = &primary_synch0[10];
|
||||
@@ -125,7 +125,7 @@ int pss_ch_est(PHY_VARS_UE *phy_vars_ue,
|
||||
}
|
||||
|
||||
|
||||
int pss_sss_extract(PHY_VARS_UE *phy_vars_ue,
|
||||
int pss_sss_extract(PHY_VARS_UE *ue,
|
||||
int32_t pss_ext[4][72],
|
||||
int32_t sss_ext[4][72])
|
||||
{
|
||||
@@ -136,12 +136,12 @@ int pss_sss_extract(PHY_VARS_UE *phy_vars_ue,
|
||||
uint8_t i,aarx;
|
||||
int32_t *pss_rxF,*pss_rxF_ext;
|
||||
int32_t *sss_rxF,*sss_rxF_ext;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
||||
|
||||
int rx_offset = frame_parms->ofdm_symbol_size-3*12;
|
||||
uint8_t pss_symb,sss_symb;
|
||||
|
||||
int32_t **rxdataF = phy_vars_ue->lte_ue_common_vars.rxdataF;
|
||||
int32_t **rxdataF = ue->common_vars.rxdataF;
|
||||
|
||||
if (frame_parms->frame_type == FDD) {
|
||||
pss_symb = 6-frame_parms->Ncp;
|
||||
@@ -190,74 +190,74 @@ int16_t phase_re[7] = {16383, 25101, 30791, 32767, 30791, 25101, 16383};
|
||||
int16_t phase_im[7] = {-28378, -21063, -11208, 0, 11207, 21062, 28377};
|
||||
|
||||
|
||||
int rx_sss(PHY_VARS_UE *phy_vars_ue,int32_t *tot_metric,uint8_t *flip_max,uint8_t *phase_max)
|
||||
int rx_sss(PHY_VARS_UE *ue,int32_t *tot_metric,uint8_t *flip_max,uint8_t *phase_max)
|
||||
{
|
||||
|
||||
uint8_t i;
|
||||
int32_t pss_ext[4][72];
|
||||
int32_t sss0_ext[4][72],sss5_ext[4][72];
|
||||
uint8_t Nid2 = phy_vars_ue->lte_ue_common_vars.eNb_id;
|
||||
uint8_t Nid2 = ue->common_vars.eNb_id;
|
||||
uint8_t flip,phase;
|
||||
uint16_t Nid1;
|
||||
int16_t *sss0,*sss5;
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms;
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
|
||||
int32_t metric;
|
||||
int16_t *d0,*d5;
|
||||
|
||||
if (phy_vars_ue->lte_frame_parms.frame_type == FDD) {
|
||||
if (frame_parms->frame_type == FDD) {
|
||||
#ifdef DEBUG_SSS
|
||||
|
||||
if (phy_vars_ue->lte_frame_parms.Ncp == NORMAL)
|
||||
msg("[PHY][UE%d] Doing SSS for FDD Normal Prefix\n",phy_vars_ue->Mod_id);
|
||||
if (frame_parms->Ncp == NORMAL)
|
||||
msg("[PHY][UE%d] Doing SSS for FDD Normal Prefix\n",ue->Mod_id);
|
||||
else
|
||||
msg("[PHY][UE%d] Doing SSS for FDD Extended Prefix\n",phy_vars_ue->Mod_id);
|
||||
msg("[PHY][UE%d] Doing SSS for FDD Extended Prefix\n",ue->Mod_id);
|
||||
|
||||
#endif
|
||||
// Do FFTs for SSS/PSS
|
||||
// SSS
|
||||
slot_fep(phy_vars_ue,
|
||||
slot_fep(ue,
|
||||
(frame_parms->symbols_per_tti/2)-2, // second to last symbol of
|
||||
0, // slot 0
|
||||
phy_vars_ue->rx_offset,
|
||||
ue->rx_offset,
|
||||
0,
|
||||
1);
|
||||
// PSS
|
||||
slot_fep(phy_vars_ue,
|
||||
slot_fep(ue,
|
||||
(frame_parms->symbols_per_tti/2)-1, // last symbol of
|
||||
0, // slot 0
|
||||
phy_vars_ue->rx_offset,
|
||||
ue->rx_offset,
|
||||
0,
|
||||
1);
|
||||
} else { // TDD
|
||||
#ifdef DEBUG_SSS
|
||||
if (phy_vars_ue->lte_frame_parms.Ncp == NORMAL)
|
||||
msg("[PHY][UE%d] Doing SSS for TDD Normal Prefix\n",phy_vars_ue->Mod_id);
|
||||
if (ue->frame_parms->Ncp == NORMAL)
|
||||
msg("[PHY][UE%d] Doing SSS for TDD Normal Prefix\n",ue->Mod_id);
|
||||
else
|
||||
msg("[PHY][UE%d] Doing SSS for TDD Extended Prefix\n",phy_vars_ue->Mod_id);
|
||||
msg("[PHY][UE%d] Doing SSS for TDD Extended Prefix\n",ue->Mod_id);
|
||||
|
||||
#endif
|
||||
// SSS
|
||||
slot_fep(phy_vars_ue,
|
||||
slot_fep(ue,
|
||||
(frame_parms->symbols_per_tti>>1)-1, // last symbol of
|
||||
1, // slot 1
|
||||
phy_vars_ue->rx_offset,
|
||||
ue->rx_offset,
|
||||
0,
|
||||
1);
|
||||
// PSS
|
||||
slot_fep(phy_vars_ue,
|
||||
slot_fep(ue,
|
||||
2, // symbol 2 of
|
||||
2, // slot 2
|
||||
phy_vars_ue->rx_offset,
|
||||
ue->rx_offset,
|
||||
0,
|
||||
1);
|
||||
}
|
||||
|
||||
pss_sss_extract(phy_vars_ue,
|
||||
pss_sss_extract(ue,
|
||||
pss_ext,
|
||||
sss0_ext);
|
||||
/*
|
||||
write_output("rxsig0.m","rxs0",&phy_vars_ue->lte_ue_common_vars.rxdata[0][0],phy_vars_ue->lte_frame_parms.samples_per_tti,1,1);
|
||||
write_output("rxdataF0.m","rxF0",&phy_vars_ue->lte_ue_common_vars.rxdataF[0][0],2*14*phy_vars_ue->lte_frame_parms.ofdm_symbol_size,2,1);
|
||||
write_output("rxsig0.m","rxs0",&ue->common_vars.rxdata[0][0],ue->frame_parms.samples_per_tti,1,1);
|
||||
write_output("rxdataF0.m","rxF0",&ue->common_vars.rxdataF[0][0],2*14*ue->frame_parms.ofdm_symbol_size,2,1);
|
||||
write_output("pss_ext0.m","pssext0",pss_ext,72,1,1);
|
||||
write_output("sss0_ext0.m","sss0ext0",sss0_ext,72,1,1);
|
||||
*/
|
||||
@@ -265,44 +265,44 @@ int rx_sss(PHY_VARS_UE *phy_vars_ue,int32_t *tot_metric,uint8_t *flip_max,uint8_
|
||||
// get conjugated channel estimate from PSS (symbol 6), H* = R* \cdot PSS
|
||||
// and do channel estimation and compensation based on PSS
|
||||
|
||||
pss_ch_est(phy_vars_ue,
|
||||
pss_ch_est(ue,
|
||||
pss_ext,
|
||||
sss0_ext);
|
||||
|
||||
// write_output("sss0_comp0.m","sss0comp0",sss0_ext,72,1,1);
|
||||
|
||||
if (phy_vars_ue->lte_frame_parms.frame_type == FDD) { // FDD
|
||||
if (ue->frame_parms.frame_type == FDD) { // FDD
|
||||
|
||||
// SSS
|
||||
slot_fep(phy_vars_ue,
|
||||
slot_fep(ue,
|
||||
(frame_parms->symbols_per_tti/2)-2,
|
||||
10,
|
||||
phy_vars_ue->rx_offset,
|
||||
ue->rx_offset,
|
||||
0,1);
|
||||
// PSS
|
||||
slot_fep(phy_vars_ue,
|
||||
slot_fep(ue,
|
||||
(frame_parms->symbols_per_tti/2)-1,
|
||||
10,
|
||||
phy_vars_ue->rx_offset,
|
||||
ue->rx_offset,
|
||||
0,1);
|
||||
} else { // TDD
|
||||
// SSS
|
||||
slot_fep(phy_vars_ue,
|
||||
slot_fep(ue,
|
||||
(frame_parms->symbols_per_tti>>1)-1,
|
||||
11,
|
||||
phy_vars_ue->rx_offset,
|
||||
ue->rx_offset,
|
||||
0,
|
||||
1);
|
||||
// PSS
|
||||
slot_fep(phy_vars_ue,
|
||||
slot_fep(ue,
|
||||
2,
|
||||
12,
|
||||
phy_vars_ue->rx_offset,
|
||||
ue->rx_offset,
|
||||
0,
|
||||
1);
|
||||
}
|
||||
|
||||
pss_sss_extract(phy_vars_ue,
|
||||
pss_sss_extract(ue,
|
||||
pss_ext,
|
||||
sss5_ext);
|
||||
|
||||
@@ -310,7 +310,7 @@ int rx_sss(PHY_VARS_UE *phy_vars_ue,int32_t *tot_metric,uint8_t *flip_max,uint8_
|
||||
// get conjugated channel estimate from PSS (symbol 6), H* = R* \cdot PSS
|
||||
// and do channel estimation and compensation based on PSS
|
||||
|
||||
pss_ch_est(phy_vars_ue,
|
||||
pss_ch_est(ue,
|
||||
pss_ext,
|
||||
sss5_ext);
|
||||
|
||||
@@ -346,7 +346,7 @@ int rx_sss(PHY_VARS_UE *phy_vars_ue,int32_t *tot_metric,uint8_t *flip_max,uint8_
|
||||
// if the current metric is better than the last save it
|
||||
if (metric > *tot_metric) {
|
||||
*tot_metric = metric;
|
||||
phy_vars_ue->lte_frame_parms.Nid_cell = Nid2+(3*Nid1);
|
||||
ue->frame_parms.Nid_cell = Nid2+(3*Nid1);
|
||||
*phase_max = phase;
|
||||
*flip_max=flip;
|
||||
#ifdef DEBUG_SSS
|
||||
|
||||
@@ -41,35 +41,35 @@ void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch)
|
||||
|
||||
if (ulsch) {
|
||||
#ifdef DEBUG_ULSCH_FREE
|
||||
msg("Freeing ulsch %p\n",ulsch);
|
||||
printf("Freeing ulsch %p\n",ulsch);
|
||||
#endif
|
||||
|
||||
for (i=0; i<8; i++) {
|
||||
#ifdef DEBUG_ULSCH_FREE
|
||||
msg("Freeing ulsch process %d\n",i);
|
||||
printf("Freeing ulsch process %d\n",i);
|
||||
#endif
|
||||
|
||||
if (ulsch->harq_processes[i]) {
|
||||
#ifdef DEBUG_ULSCH_FREE
|
||||
msg("Freeing ulsch process %d (%p)\n",i,ulsch->harq_processes[i]);
|
||||
printf("Freeing ulsch process %d (%p)\n",i,ulsch->harq_processes[i]);
|
||||
#endif
|
||||
|
||||
if (ulsch->harq_processes[i]->b) {
|
||||
free16(ulsch->harq_processes[i]->b,MAX_ULSCH_PAYLOAD_BYTES);
|
||||
ulsch->harq_processes[i]->b = NULL;
|
||||
#ifdef DEBUG_ULSCH_FREE
|
||||
msg("Freeing ulsch process %d b (%p)\n",i,ulsch->harq_processes[i]->b);
|
||||
printf("Freeing ulsch process %d b (%p)\n",i,ulsch->harq_processes[i]->b);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef DEBUG_ULSCH_FREE
|
||||
msg("Freeing ulsch process %d c (%p)\n",i,ulsch->harq_processes[i]->c);
|
||||
printf("Freeing ulsch process %d c (%p)\n",i,ulsch->harq_processes[i]->c);
|
||||
#endif
|
||||
|
||||
for (r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++) {
|
||||
|
||||
#ifdef DEBUG_ULSCH_FREE
|
||||
msg("Freeing ulsch process %d c[%d] (%p)\n",i,r,ulsch->harq_processes[i]->c[r]);
|
||||
printf("Freeing ulsch process %d c[%d] (%p)\n",i,r,ulsch->harq_processes[i]->c[r]);
|
||||
#endif
|
||||
|
||||
if (ulsch->harq_processes[i]->c[r]) {
|
||||
@@ -176,7 +176,7 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag)
|
||||
|
||||
|
||||
uint32_t ulsch_encoding(uint8_t *a,
|
||||
PHY_VARS_UE *phy_vars_ue,
|
||||
PHY_VARS_UE *ue,
|
||||
uint8_t harq_pid,
|
||||
uint8_t eNB_id,
|
||||
uint8_t tmode,
|
||||
@@ -184,11 +184,11 @@ uint32_t ulsch_encoding(uint8_t *a,
|
||||
uint8_t Nbundled)
|
||||
{
|
||||
|
||||
time_stats_t *seg_stats=&phy_vars_ue->ulsch_segmentation_stats;
|
||||
time_stats_t *rm_stats=&phy_vars_ue->ulsch_rate_matching_stats;
|
||||
time_stats_t *te_stats=&phy_vars_ue->ulsch_turbo_encoding_stats;
|
||||
time_stats_t *i_stats=&phy_vars_ue->ulsch_interleaving_stats;
|
||||
time_stats_t *m_stats=&phy_vars_ue->ulsch_multiplexing_stats;
|
||||
time_stats_t *seg_stats=&ue->ulsch_segmentation_stats;
|
||||
time_stats_t *rm_stats=&ue->ulsch_rate_matching_stats;
|
||||
time_stats_t *te_stats=&ue->ulsch_turbo_encoding_stats;
|
||||
time_stats_t *i_stats=&ue->ulsch_interleaving_stats;
|
||||
time_stats_t *m_stats=&ue->ulsch_multiplexing_stats;
|
||||
|
||||
// uint16_t offset;
|
||||
uint32_t crc=1;
|
||||
@@ -207,10 +207,10 @@ uint32_t ulsch_encoding(uint8_t *a,
|
||||
uint16_t o_RCC;
|
||||
uint8_t o_flip[8];
|
||||
uint32_t wACK_idx;
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms;
|
||||
PHY_MEASUREMENTS *meas = &phy_vars_ue->PHY_measurements;
|
||||
LTE_UE_ULSCH_t *ulsch=phy_vars_ue->ulsch_ue[eNB_id];
|
||||
LTE_UE_DLSCH_t **dlsch = phy_vars_ue->dlsch_ue[eNB_id];
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
|
||||
PHY_MEASUREMENTS *meas = &ue->measurements;
|
||||
LTE_UE_ULSCH_t *ulsch=ue->ulsch[eNB_id];
|
||||
LTE_UE_DLSCH_t **dlsch = ue->dlsch[eNB_id];
|
||||
uint16_t rnti;
|
||||
|
||||
if (!ulsch) {
|
||||
@@ -237,11 +237,11 @@ uint32_t ulsch_encoding(uint8_t *a,
|
||||
|
||||
// fill CQI/PMI information
|
||||
if (ulsch->O>0) {
|
||||
rnti = phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti;
|
||||
fill_CQI(ulsch,meas,0,harq_pid,phy_vars_ue->lte_frame_parms.N_RB_DL,rnti, tmode,phy_vars_ue->sinr_eff);
|
||||
rnti = ue->pdcch_vars[eNB_id]->crnti;
|
||||
fill_CQI(ulsch,meas,0,harq_pid,ue->frame_parms.N_RB_DL,rnti, tmode,ue->sinr_eff);
|
||||
|
||||
LOG_D(PHY,"UE CQI\n");
|
||||
print_CQI(ulsch->o,ulsch->uci_format,0,phy_vars_ue->lte_frame_parms.N_RB_DL);
|
||||
print_CQI(ulsch->o,ulsch->uci_format,0,ue->frame_parms.N_RB_DL);
|
||||
|
||||
// save PUSCH pmi for later (transmission modes 4,5,6)
|
||||
if (dlsch[0]) {
|
||||
@@ -273,7 +273,7 @@ uint32_t ulsch_encoding(uint8_t *a,
|
||||
ulsch->harq_processes[harq_pid]->control_only = 0;
|
||||
|
||||
#ifdef DEBUG_ULSCH_CODING
|
||||
msg("[PHY][UE] ULSCH coding : A %d, Qm %d, mcs %d, harq_pid %d, round %d, RV %d\n",
|
||||
printf("[PHY][UE] ULSCH coding : A %d, Qm %d, mcs %d, harq_pid %d, round %d, RV %d\n",
|
||||
ulsch->harq_processes[harq_pid]->TBS,
|
||||
Q_m,
|
||||
ulsch->harq_processes[harq_pid]->mcs,
|
||||
@@ -282,22 +282,22 @@ uint32_t ulsch_encoding(uint8_t *a,
|
||||
ulsch->harq_processes[harq_pid]->rvidx);
|
||||
|
||||
for (i=0; i<ulsch->harq_processes[harq_pid]->O_ACK; i++)
|
||||
msg("ulsch_coding: o_ACK[%d] %d\n",i,ulsch->o_ACK[i]);
|
||||
printf("ulsch_coding: o_ACK[%d] %d\n",i,ulsch->o_ACK[i]);
|
||||
|
||||
for (i=0; i<ulsch->O_RI; i++)
|
||||
msg("ulsch_coding: o_RI[%d] %d\n",i,ulsch->o_RI[i]);
|
||||
printf("ulsch_coding: o_RI[%d] %d\n",i,ulsch->o_RI[i]);
|
||||
|
||||
msg("ulsch_coding: O=%d\n",ulsch->O);
|
||||
printf("ulsch_coding: O=%d\n",ulsch->O);
|
||||
|
||||
for (i=0; i<1+((8+ulsch->O)/8); i++) {
|
||||
// ulsch->o[i] = i;
|
||||
msg("ulsch_coding: O[%d] %d\n",i,ulsch->o[i]);
|
||||
printf("ulsch_coding: O[%d] %d\n",i,ulsch->o[i]);
|
||||
}
|
||||
|
||||
if ((tmode != 4))
|
||||
print_CQI(ulsch->o,wideband_cqi_rank1_2A,0,phy_vars_ue->lte_frame_parms.N_RB_DL);
|
||||
print_CQI(ulsch->o,wideband_cqi_rank1_2A,0,ue->frame_parms.N_RB_DL);
|
||||
else
|
||||
print_CQI(ulsch->o,HLC_subband_cqi_rank1_2A,0,phy_vars_ue->lte_frame_parms.N_RB_DL);
|
||||
print_CQI(ulsch->o,HLC_subband_cqi_rank1_2A,0,ue->frame_parms.N_RB_DL);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -351,20 +351,20 @@ uint32_t ulsch_encoding(uint8_t *a,
|
||||
|
||||
|
||||
#ifdef DEBUG_ULSCH_CODING
|
||||
msg("Generating Code Segment %d (%d bits)\n",r,Kr);
|
||||
printf("Generating Code Segment %d (%d bits)\n",r,Kr);
|
||||
// generate codewords
|
||||
|
||||
msg("bits_per_codeword (Kr)= %d\n",Kr);
|
||||
msg("N_RB = %d\n",ulsch->harq_processes[harq_pid]->nb_rb);
|
||||
msg("Ncp %d\n",frame_parms->Ncp);
|
||||
msg("Qm %d\n",Q_m);
|
||||
printf("bits_per_codeword (Kr)= %d\n",Kr);
|
||||
printf("N_RB = %d\n",ulsch->harq_processes[harq_pid]->nb_rb);
|
||||
printf("Ncp %d\n",frame_parms->Ncp);
|
||||
printf("Qm %d\n",Q_m);
|
||||
#endif
|
||||
|
||||
// offset=0;
|
||||
|
||||
|
||||
#ifdef DEBUG_ULSCH_CODING
|
||||
msg("Encoding ... iind %d f1 %d, f2 %d\n",iind,f1f2mat_old[iind*2],f1f2mat_old[(iind*2)+1]);
|
||||
printf("Encoding ... iind %d f1 %d, f2 %d\n",iind,f1f2mat_old[iind*2],f1f2mat_old[(iind*2)+1]);
|
||||
#endif
|
||||
start_meas(te_stats);
|
||||
threegpplte_turbo_encoder(ulsch->harq_processes[harq_pid]->c[r],
|
||||
@@ -497,7 +497,7 @@ uint32_t ulsch_encoding(uint8_t *a,
|
||||
|
||||
for (r=0; r<ulsch->harq_processes[harq_pid]->C; r++) {
|
||||
#ifdef DEBUG_ULSCH_CODING
|
||||
msg("Rate Matching, Code segment %d (coded bits (G) %d,unpunctured/repeated bits per code segment %d,mod_order %d, nb_rb %d)...\n",
|
||||
printf("Rate Matching, Code segment %d (coded bits (G) %d,unpunctured/repeated bits per code segment %d,mod_order %d, nb_rb %d)...\n",
|
||||
r,
|
||||
G,
|
||||
Kr*3,
|
||||
@@ -604,7 +604,7 @@ uint32_t ulsch_encoding(uint8_t *a,
|
||||
// Do ACK coding, Section 5.2.2.6 36.213 (p.23-24 in v8.6)
|
||||
wACK_idx = (ulsch->bundling==0) ? 4 : ((Nbundled-1)&3);
|
||||
#ifdef DEBUG_ULSCH_CODING
|
||||
msg("ulsch_coding.c: Bundling %d, Nbundled %d, wACK_idx %d\n",
|
||||
printf("ulsch_coding.c: Bundling %d, Nbundled %d, wACK_idx %d\n",
|
||||
ulsch->bundling,Nbundled,wACK_idx);
|
||||
#endif
|
||||
|
||||
@@ -836,7 +836,7 @@ uint32_t ulsch_encoding(uint8_t *a,
|
||||
for (q=0; q<Q_m; q++) {
|
||||
y[q+(Q_m*((r*Cmux) + columnset[j]))] = ulsch->q_ACK[(q+(Q_m*i))%len_ACK];
|
||||
#ifdef DEBUG_ULSCH_CODING
|
||||
msg("ulsch_coding.c: ACK %d => y[%d]=%d (i %d, r*Cmux %d, columnset %d)\n",q+(Q_m*i),
|
||||
printf("ulsch_coding.c: ACK %d => y[%d]=%d (i %d, r*Cmux %d, columnset %d)\n",q+(Q_m*i),
|
||||
q+(Q_m*((r*Cmux) + columnset[j])),ulsch->q_ACK[(q+(Q_m*i))%len_ACK],
|
||||
i,r*Cmux,columnset[j]);
|
||||
#endif
|
||||
@@ -909,68 +909,68 @@ uint32_t ulsch_encoding(uint8_t *a,
|
||||
#include "LAYER2/MAC/defs.h"
|
||||
#endif
|
||||
int ulsch_encoding_emul(uint8_t *ulsch_buffer,
|
||||
PHY_VARS_UE *phy_vars_ue,
|
||||
PHY_VARS_UE *ue,
|
||||
uint8_t eNB_id,
|
||||
uint8_t harq_pid,
|
||||
uint8_t control_only_flag)
|
||||
{
|
||||
|
||||
LTE_UE_ULSCH_t *ulsch = phy_vars_ue->ulsch_ue[eNB_id];
|
||||
LTE_UE_DLSCH_t **dlsch = phy_vars_ue->dlsch_ue[eNB_id];
|
||||
PHY_MEASUREMENTS *meas = &phy_vars_ue->PHY_measurements;
|
||||
uint8_t tmode = phy_vars_ue->transmission_mode[eNB_id];
|
||||
uint16_t rnti=phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti;
|
||||
LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id];
|
||||
LTE_UE_DLSCH_t **dlsch = ue->dlsch[eNB_id];
|
||||
PHY_MEASUREMENTS *meas = &ue->measurements;
|
||||
uint8_t tmode = ue->transmission_mode[eNB_id];
|
||||
uint16_t rnti=ue->pdcch_vars[eNB_id]->crnti;
|
||||
LOG_D(PHY,"EMUL UE ulsch_encoding for eNB %d,mod_id %d, harq_pid %d rnti %x, ACK(%d,%d) \n",
|
||||
eNB_id,phy_vars_ue->Mod_id, harq_pid, rnti,ulsch->o_ACK[0],ulsch->o_ACK[1]);
|
||||
eNB_id,ue->Mod_id, harq_pid, rnti,ulsch->o_ACK[0],ulsch->o_ACK[1]);
|
||||
|
||||
if (ulsch->O>0) {
|
||||
/*
|
||||
if(flag_LA==1)
|
||||
sinr_eff = sinr_eff_cqi_calc(phy_vars_ue, eNB_id);
|
||||
sinr_eff = sinr_eff_cqi_calc(ue, eNB_id);
|
||||
else
|
||||
sinr_eff = meas->wideband_cqi_avg[eNB_id];
|
||||
*/
|
||||
|
||||
fill_CQI(ulsch,meas,eNB_id,harq_pid,phy_vars_ue->lte_frame_parms.N_RB_DL,rnti,tmode,phy_vars_ue->sinr_eff);
|
||||
fill_CQI(ulsch,meas,eNB_id,harq_pid,ue->frame_parms.N_RB_DL,rnti,tmode,ue->sinr_eff);
|
||||
//LOG_D(PHY,"UE CQI\n");
|
||||
// print_CQI(ulsch->o,ulsch->uci_format,eNB_id);
|
||||
|
||||
// save PUSCH pmi for later (transmission modes 4,5,6)
|
||||
// msg("ulsch: saving pmi for DL %x\n",pmi2hex_2Ar1(((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi));
|
||||
// printf("ulsch: saving pmi for DL %x\n",pmi2hex_2Ar1(((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi));
|
||||
// if (ulsch->uci_format != HLC_subband_cqi_mcs_CBA)
|
||||
dlsch[0]->harq_processes[harq_pid]->pmi_alloc = ((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi;
|
||||
}
|
||||
|
||||
memcpy(phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->b,
|
||||
memcpy(ue->ulsch[eNB_id]->harq_processes[harq_pid]->b,
|
||||
ulsch_buffer,
|
||||
phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS>>3);
|
||||
ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3);
|
||||
|
||||
|
||||
//memcpy(&UE_transport_info[phy_vars_ue->Mod_id].transport_blocks[UE_transport_info_TB_index[phy_vars_ue->Mod_id]],
|
||||
memcpy(&UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].transport_blocks,
|
||||
//memcpy(&UE_transport_info[ue->Mod_id].transport_blocks[UE_transport_info_TB_index[ue->Mod_id]],
|
||||
memcpy(&UE_transport_info[ue->Mod_id][ue->CC_id].transport_blocks,
|
||||
ulsch_buffer,
|
||||
phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS>>3);
|
||||
//UE_transport_info_TB_index[phy_vars_ue->Mod_id]+=phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS>>3;
|
||||
ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3);
|
||||
//UE_transport_info_TB_index[ue->Mod_id]+=ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3;
|
||||
// navid: currently more than one eNB is not supported in the code
|
||||
UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].num_eNB = 1;
|
||||
UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].rnti[0] = phy_vars_ue->lte_ue_pdcch_vars[0]->crnti;
|
||||
UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].eNB_id[0] = eNB_id;
|
||||
UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].harq_pid[0] = harq_pid;
|
||||
UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].tbs[0] = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS>>3 ;
|
||||
// msg("\nphy_vars_ue->Mod_id%d\n",phy_vars_ue->Mod_id);
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].num_eNB = 1;
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].rnti[0] = ue->pdcch_vars[0]->crnti;
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].eNB_id[0] = eNB_id;
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].harq_pid[0] = harq_pid;
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].tbs[0] = ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3 ;
|
||||
// printf("\nue->Mod_id%d\n",ue->Mod_id);
|
||||
|
||||
UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pusch_flag = 1;
|
||||
//UE_transport_info[phy_vars_ue->Mod_id].cntl.pusch_uci = *(uint32_t *)ulsch->o;
|
||||
memcpy(UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pusch_uci,
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pusch_flag = 1;
|
||||
//UE_transport_info[ue->Mod_id].cntl.pusch_uci = *(uint32_t *)ulsch->o;
|
||||
memcpy(UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pusch_uci,
|
||||
ulsch->o,
|
||||
MAX_CQI_BYTES);
|
||||
// msg("[UE]cqi is %d \n", ((HLC_subband_cqi_rank1_2A_5MHz *)ulsch->o)->cqi1);
|
||||
// printf("[UE]cqi is %d \n", ((HLC_subband_cqi_rank1_2A_5MHz *)ulsch->o)->cqi1);
|
||||
|
||||
UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.length_uci = ulsch->O;
|
||||
UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.uci_format = ulsch->uci_format;
|
||||
UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pusch_ri = (ulsch->o_RI[0]&1)+((ulsch->o_RI[1]&1)<<1);
|
||||
UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pusch_ack = (ulsch->o_ACK[0]&1) + ((ulsch->o_ACK[1]&1)<<1);
|
||||
//msg("ack is %d %d %d\n",UE_transport_info[phy_vars_ue->Mod_id].cntl.pusch_ack, (ulsch->o_ACK[1]&1)<<1, ulsch->o_ACK[0]&1);
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].cntl.length_uci = ulsch->O;
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].cntl.uci_format = ulsch->uci_format;
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pusch_ri = (ulsch->o_RI[0]&1)+((ulsch->o_RI[1]&1)<<1);
|
||||
UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pusch_ack = (ulsch->o_ACK[0]&1) + ((ulsch->o_ACK[1]&1)<<1);
|
||||
//printf("ack is %d %d %d\n",UE_transport_info[ue->Mod_id].cntl.pusch_ack, (ulsch->o_ACK[1]&1)<<1, ulsch->o_ACK[0]&1);
|
||||
return(0);
|
||||
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -710,9 +710,9 @@ void ulsch_extract_rbs_single(int32_t **rxdataF,
|
||||
|
||||
nb_rb1 = cmin(cmax((int)(frame_parms->N_RB_UL) - (int)(2*first_rb),(int)0),(int)(2*nb_rb)); // 2 times no. RBs before the DC
|
||||
nb_rb2 = 2*nb_rb - nb_rb1; // 2 times no. RBs after the DC
|
||||
|
||||
|
||||
#ifdef DEBUG_ULSCH
|
||||
msg("ulsch_extract_rbs_single: 2*nb_rb1 = %d, 2*nb_rb2 = %d\n",nb_rb1,nb_rb2);
|
||||
printf("ulsch_extract_rbs_single: 2*nb_rb1 = %d, 2*nb_rb2 = %d\n",nb_rb1,nb_rb2);
|
||||
#endif
|
||||
|
||||
rxF_ext = &rxdataF_ext[aarx][(symbol*frame_parms->N_RB_UL*12)];
|
||||
@@ -1549,8 +1549,8 @@ void ulsch_channel_level(int32_t **drs_ch_estimates_ext,
|
||||
int32_t avgU[2];
|
||||
int32_t avgU_0[2],avgU_1[2]; // For the Distributed Alamouti Scheme
|
||||
|
||||
void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
uint32_t sched_subframe,
|
||||
void rx_ulsch(PHY_VARS_eNB *eNB,
|
||||
eNB_rxtx_proc_t *proc,
|
||||
uint8_t eNB_id, // this is the effective sector id
|
||||
uint8_t UE_id,
|
||||
LTE_eNB_ULSCH_t **ulsch,
|
||||
@@ -1558,9 +1558,9 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
{
|
||||
|
||||
// flagMag = 0;
|
||||
LTE_eNB_COMMON *eNB_common_vars = &phy_vars_eNB->lte_eNB_common_vars;
|
||||
LTE_eNB_PUSCH *eNB_pusch_vars = phy_vars_eNB->lte_eNB_pusch_vars[UE_id];
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms;
|
||||
LTE_eNB_COMMON *common_vars = &eNB->common_vars;
|
||||
LTE_eNB_PUSCH *pusch_vars = eNB->pusch_vars[UE_id];
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
|
||||
|
||||
uint32_t l,i;
|
||||
int32_t avgs;
|
||||
@@ -1576,12 +1576,12 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
uint8_t Qm;
|
||||
uint16_t rx_power_correction;
|
||||
int16_t *llrp;
|
||||
int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
|
||||
int subframe = proc->subframe_rx;
|
||||
|
||||
harq_pid = subframe2harq_pid(frame_parms,phy_vars_eNB->proc[sched_subframe].frame_rx,subframe);
|
||||
harq_pid = subframe2harq_pid(frame_parms,proc->frame_rx,subframe);
|
||||
Qm = get_Qm_ul(ulsch[UE_id]->harq_processes[harq_pid]->mcs);
|
||||
#ifdef DEBUG_ULSCH
|
||||
msg("rx_ulsch: eNB_id %d, harq_pid %d, nb_rb %d first_rb %d, cooperation %d\n",eNB_id,harq_pid,ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,ulsch[UE_id]->harq_processes[harq_pid]->first_rb,
|
||||
printf("rx_ulsch: eNB_id %d, harq_pid %d, nb_rb %d first_rb %d, cooperation %d\n",eNB_id,harq_pid,ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,ulsch[UE_id]->harq_processes[harq_pid]->first_rb,
|
||||
cooperation_flag);
|
||||
#endif //DEBUG_ULSCH
|
||||
|
||||
@@ -1595,25 +1595,24 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
for (l=0; l<(frame_parms->symbols_per_tti-ulsch[UE_id]->harq_processes[harq_pid]->srs_active); l++) {
|
||||
|
||||
#ifdef DEBUG_ULSCH
|
||||
msg("rx_ulsch : symbol %d (first_rb %d,nb_rb %d), rxdataF %p, rxdataF_ext %p\n",l,
|
||||
printf("rx_ulsch : symbol %d (first_rb %d,nb_rb %d), rxdataF %p, rxdataF_ext %p\n",l,
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->first_rb,
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,
|
||||
eNB_common_vars->rxdataF[eNB_id],
|
||||
eNB_pusch_vars->rxdataF_ext[eNB_id]);
|
||||
common_vars->rxdataF[eNB_id],
|
||||
pusch_vars->rxdataF_ext[eNB_id]);
|
||||
#endif //DEBUG_ULSCH
|
||||
|
||||
ulsch_extract_rbs_single(eNB_common_vars->rxdataF[eNB_id],
|
||||
eNB_pusch_vars->rxdataF_ext[eNB_id],
|
||||
ulsch_extract_rbs_single(common_vars->rxdataF[eNB_id],
|
||||
pusch_vars->rxdataF_ext[eNB_id],
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->first_rb,
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,
|
||||
l%(frame_parms->symbols_per_tti/2),
|
||||
l/(frame_parms->symbols_per_tti/2),
|
||||
frame_parms);
|
||||
|
||||
lte_ul_channel_estimation(phy_vars_eNB,
|
||||
lte_ul_channel_estimation(eNB,proc,
|
||||
eNB_id,
|
||||
UE_id,
|
||||
sched_subframe,
|
||||
l%(frame_parms->symbols_per_tti/2),
|
||||
l/(frame_parms->symbols_per_tti/2),
|
||||
cooperation_flag);
|
||||
@@ -1621,41 +1620,41 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
if(cooperation_flag == 2) {
|
||||
for (i=0; i<frame_parms->nb_antennas_rx; i++) {
|
||||
eNB_pusch_vars->ulsch_power_0[i] = signal_energy(eNB_pusch_vars->drs_ch_estimates_0[eNB_id][i],
|
||||
pusch_vars->ulsch_power_0[i] = signal_energy(pusch_vars->drs_ch_estimates_0[eNB_id][i],
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12)*rx_power_correction;
|
||||
eNB_pusch_vars->ulsch_power_1[i] = signal_energy(eNB_pusch_vars->drs_ch_estimates_1[eNB_id][i],
|
||||
pusch_vars->ulsch_power_1[i] = signal_energy(pusch_vars->drs_ch_estimates_1[eNB_id][i],
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12)*rx_power_correction;
|
||||
}
|
||||
} else {
|
||||
for (i=0; i<frame_parms->nb_antennas_rx; i++) {
|
||||
/*
|
||||
eNB_pusch_vars->ulsch_power[i] = signal_energy_nodc(eNB_pusch_vars->drs_ch_estimates[eNB_id][i],
|
||||
pusch_vars->ulsch_power[i] = signal_energy_nodc(pusch_vars->drs_ch_estimates[eNB_id][i],
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12)*rx_power_correction;
|
||||
|
||||
*/
|
||||
|
||||
eNB_pusch_vars->ulsch_power[i] = signal_energy_nodc(eNB_pusch_vars->drs_ch_estimates[eNB_id][i],
|
||||
pusch_vars->ulsch_power[i] = signal_energy_nodc(pusch_vars->drs_ch_estimates[eNB_id][i],
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12);
|
||||
|
||||
#ifdef LOCALIZATION
|
||||
eNB_pusch_vars->subcarrier_power = (int32_t *)malloc(ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12*sizeof(int32_t));
|
||||
eNB_pusch_vars->active_subcarrier = subcarrier_energy(eNB_pusch_vars->drs_ch_estimates[eNB_id][i],
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12, eNB_pusch_vars->subcarrier_power, rx_power_correction);
|
||||
pusch_vars->subcarrier_power = (int32_t *)malloc(ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12*sizeof(int32_t));
|
||||
pusch_vars->active_subcarrier = subcarrier_energy(pusch_vars->drs_ch_estimates[eNB_id][i],
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12, pusch_vars->subcarrier_power, rx_power_correction);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
//write_output("rxdataF_ext.m","rxF_ext",eNB_pusch_vars->rxdataF_ext[eNB_id][0],300*(frame_parms->symbols_per_tti-ulsch[UE_id]->srs_active),1,1);
|
||||
//write_output("ulsch_chest.m","drs_est",eNB_pusch_vars->drs_ch_estimates[eNB_id][0],300*(frame_parms->symbols_per_tti-ulsch[UE_id]->srs_active),1,1);
|
||||
//write_output("rxdataF_ext.m","rxF_ext",pusch_vars->rxdataF_ext[eNB_id][0],300*(frame_parms->symbols_per_tti-ulsch[UE_id]->srs_active),1,1);
|
||||
//write_output("ulsch_chest.m","drs_est",pusch_vars->drs_ch_estimates[eNB_id][0],300*(frame_parms->symbols_per_tti-ulsch[UE_id]->srs_active),1,1);
|
||||
|
||||
|
||||
if(cooperation_flag == 2) {
|
||||
ulsch_channel_level(eNB_pusch_vars->drs_ch_estimates_0[eNB_id],
|
||||
ulsch_channel_level(pusch_vars->drs_ch_estimates_0[eNB_id],
|
||||
frame_parms,
|
||||
avgU_0,
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->nb_rb);
|
||||
|
||||
// msg("[ULSCH] avg_0[0] %d\n",avgU_0[0]);
|
||||
// printf("[ULSCH] avg_0[0] %d\n",avgU_0[0]);
|
||||
|
||||
|
||||
avgs_0 = 0;
|
||||
@@ -1665,15 +1664,15 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
log2_maxh_0 = (log2_approx(avgs_0)/2)+ log2_approx(frame_parms->nb_antennas_rx-1)+3;
|
||||
#ifdef DEBUG_ULSCH
|
||||
msg("[ULSCH] log2_maxh_0 = %d (%d,%d)\n",log2_maxh_0,avgU_0[0],avgs_0);
|
||||
printf("[ULSCH] log2_maxh_0 = %d (%d,%d)\n",log2_maxh_0,avgU_0[0],avgs_0);
|
||||
#endif
|
||||
|
||||
ulsch_channel_level(eNB_pusch_vars->drs_ch_estimates_1[eNB_id],
|
||||
ulsch_channel_level(pusch_vars->drs_ch_estimates_1[eNB_id],
|
||||
frame_parms,
|
||||
avgU_1,
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->nb_rb);
|
||||
|
||||
// msg("[ULSCH] avg_1[0] %d\n",avgU_1[0]);
|
||||
// printf("[ULSCH] avg_1[0] %d\n",avgU_1[0]);
|
||||
|
||||
|
||||
avgs_1 = 0;
|
||||
@@ -1683,16 +1682,16 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
log2_maxh_1 = (log2_approx(avgs_1)/2) + log2_approx(frame_parms->nb_antennas_rx-1)+3;
|
||||
#ifdef DEBUG_ULSCH
|
||||
msg("[ULSCH] log2_maxh_1 = %d (%d,%d)\n",log2_maxh_1,avgU_1[0],avgs_1);
|
||||
printf("[ULSCH] log2_maxh_1 = %d (%d,%d)\n",log2_maxh_1,avgU_1[0],avgs_1);
|
||||
#endif
|
||||
log2_maxh = max(log2_maxh_0,log2_maxh_1);
|
||||
} else {
|
||||
ulsch_channel_level(eNB_pusch_vars->drs_ch_estimates[eNB_id],
|
||||
ulsch_channel_level(pusch_vars->drs_ch_estimates[eNB_id],
|
||||
frame_parms,
|
||||
avgU,
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->nb_rb);
|
||||
|
||||
// msg("[ULSCH] avg[0] %d\n",avgU[0]);
|
||||
// printf("[ULSCH] avg[0] %d\n",avgU[0]);
|
||||
|
||||
|
||||
avgs = 0;
|
||||
@@ -1705,7 +1704,7 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
log2_maxh = (log2_approx(avgs)/2)+ log2_approx(frame_parms->nb_antennas_rx-1)+4;
|
||||
|
||||
#ifdef DEBUG_ULSCH
|
||||
msg("[ULSCH] log2_maxh = %d (%d,%d)\n",log2_maxh,avgU[0],avgs);
|
||||
printf("[ULSCH] log2_maxh = %d (%d,%d)\n",log2_maxh,avgU[0],avgs);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -1719,15 +1718,15 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
if(cooperation_flag == 2) {
|
||||
|
||||
ulsch_channel_compensation_alamouti(
|
||||
eNB_pusch_vars->rxdataF_ext[eNB_id],
|
||||
eNB_pusch_vars->drs_ch_estimates_0[eNB_id],
|
||||
eNB_pusch_vars->drs_ch_estimates_1[eNB_id],
|
||||
eNB_pusch_vars->ul_ch_mag_0[eNB_id],
|
||||
eNB_pusch_vars->ul_ch_magb_0[eNB_id],
|
||||
eNB_pusch_vars->ul_ch_mag_1[eNB_id],
|
||||
eNB_pusch_vars->ul_ch_magb_1[eNB_id],
|
||||
eNB_pusch_vars->rxdataF_comp_0[eNB_id],
|
||||
eNB_pusch_vars->rxdataF_comp_1[eNB_id],
|
||||
pusch_vars->rxdataF_ext[eNB_id],
|
||||
pusch_vars->drs_ch_estimates_0[eNB_id],
|
||||
pusch_vars->drs_ch_estimates_1[eNB_id],
|
||||
pusch_vars->ul_ch_mag_0[eNB_id],
|
||||
pusch_vars->ul_ch_magb_0[eNB_id],
|
||||
pusch_vars->ul_ch_mag_1[eNB_id],
|
||||
pusch_vars->ul_ch_magb_1[eNB_id],
|
||||
pusch_vars->rxdataF_comp_0[eNB_id],
|
||||
pusch_vars->rxdataF_comp_1[eNB_id],
|
||||
frame_parms,
|
||||
l,
|
||||
Qm,
|
||||
@@ -1735,24 +1734,24 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
log2_maxh);
|
||||
|
||||
ulsch_alamouti(frame_parms,
|
||||
eNB_pusch_vars->rxdataF_comp[eNB_id],
|
||||
eNB_pusch_vars->rxdataF_comp_0[eNB_id],
|
||||
eNB_pusch_vars->rxdataF_comp_1[eNB_id],
|
||||
eNB_pusch_vars->ul_ch_mag[eNB_id],
|
||||
eNB_pusch_vars->ul_ch_magb[eNB_id],
|
||||
eNB_pusch_vars->ul_ch_mag_0[eNB_id],
|
||||
eNB_pusch_vars->ul_ch_magb_0[eNB_id],
|
||||
eNB_pusch_vars->ul_ch_mag_1[eNB_id],
|
||||
eNB_pusch_vars->ul_ch_magb_1[eNB_id],
|
||||
pusch_vars->rxdataF_comp[eNB_id],
|
||||
pusch_vars->rxdataF_comp_0[eNB_id],
|
||||
pusch_vars->rxdataF_comp_1[eNB_id],
|
||||
pusch_vars->ul_ch_mag[eNB_id],
|
||||
pusch_vars->ul_ch_magb[eNB_id],
|
||||
pusch_vars->ul_ch_mag_0[eNB_id],
|
||||
pusch_vars->ul_ch_magb_0[eNB_id],
|
||||
pusch_vars->ul_ch_mag_1[eNB_id],
|
||||
pusch_vars->ul_ch_magb_1[eNB_id],
|
||||
l,
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->nb_rb);
|
||||
} else {
|
||||
ulsch_channel_compensation(
|
||||
eNB_pusch_vars->rxdataF_ext[eNB_id],
|
||||
eNB_pusch_vars->drs_ch_estimates[eNB_id],
|
||||
eNB_pusch_vars->ul_ch_mag[eNB_id],
|
||||
eNB_pusch_vars->ul_ch_magb[eNB_id],
|
||||
eNB_pusch_vars->rxdataF_comp[eNB_id],
|
||||
pusch_vars->rxdataF_ext[eNB_id],
|
||||
pusch_vars->drs_ch_estimates[eNB_id],
|
||||
pusch_vars->ul_ch_mag[eNB_id],
|
||||
pusch_vars->ul_ch_magb[eNB_id],
|
||||
pusch_vars->rxdataF_comp[eNB_id],
|
||||
frame_parms,
|
||||
l,
|
||||
Qm,
|
||||
@@ -1767,7 +1766,7 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
//writing for the first time
|
||||
write_output(namepointer_log2,"xxx",log2_maxh,1,1,12);
|
||||
|
||||
write_output(namepointer_chMag,"xxx",eNB_pusch_vars->ul_ch_mag[eNB_id][0],300,1,11);
|
||||
write_output(namepointer_chMag,"xxx",pusch_vars->ul_ch_mag[eNB_id][0],300,1,11);
|
||||
|
||||
//namepointer_chMag = NULL;
|
||||
flagMag=1;
|
||||
@@ -1775,20 +1774,20 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
if (frame_parms->nb_antennas_rx > 1)
|
||||
ulsch_detection_mrc(frame_parms,
|
||||
eNB_pusch_vars->rxdataF_comp[eNB_id],
|
||||
eNB_pusch_vars->ul_ch_mag[eNB_id],
|
||||
eNB_pusch_vars->ul_ch_magb[eNB_id],
|
||||
pusch_vars->rxdataF_comp[eNB_id],
|
||||
pusch_vars->ul_ch_mag[eNB_id],
|
||||
pusch_vars->ul_ch_magb[eNB_id],
|
||||
l,
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->nb_rb);
|
||||
|
||||
#ifndef OFDMA_ULSCH
|
||||
|
||||
if ((phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0]+3)<eNB_pusch_vars->ulsch_power[0]) {
|
||||
if ((eNB->measurements->n0_power_dB[0]+3)<pusch_vars->ulsch_power[0]) {
|
||||
|
||||
freq_equalization(frame_parms,
|
||||
eNB_pusch_vars->rxdataF_comp[eNB_id],
|
||||
eNB_pusch_vars->ul_ch_mag[eNB_id],
|
||||
eNB_pusch_vars->ul_ch_magb[eNB_id],
|
||||
pusch_vars->rxdataF_comp[eNB_id],
|
||||
pusch_vars->ul_ch_mag[eNB_id],
|
||||
pusch_vars->ul_ch_magb[eNB_id],
|
||||
l,
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12,
|
||||
Qm);
|
||||
@@ -1801,24 +1800,25 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
//#ifdef DEBUG_ULSCH
|
||||
// Inverse-Transform equalized outputs
|
||||
// msg("Doing IDFTs\n");
|
||||
// printf("Doing IDFTs\n");
|
||||
lte_idft(frame_parms,
|
||||
(uint32_t*)eNB_pusch_vars->rxdataF_comp[eNB_id][0],
|
||||
(uint32_t*)pusch_vars->rxdataF_comp[eNB_id][0],
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12);
|
||||
// msg("Done\n");
|
||||
// printf("Done\n");
|
||||
//#endif //DEBUG_ULSCH
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
T(T_ENB_PHY_PUSCH_IQ, T_INT(eNB_id), T_INT(UE_id), T_INT(phy_vars_eNB->proc[sched_subframe].frame_rx),
|
||||
|
||||
llrp = (int16_t*)&pusch_vars->llr[0];
|
||||
|
||||
T(T_ENB_PHY_PUSCH_IQ, T_INT(eNB_id), T_INT(UE_id), T_INT(proc->frame_rx),
|
||||
T_INT(subframe), T_INT(ulsch[UE_id]->harq_processes[harq_pid]->nb_rb),
|
||||
T_INT(frame_parms->N_RB_UL), T_INT(frame_parms->symbols_per_tti),
|
||||
T_BUFFER(eNB_pusch_vars->rxdataF_comp[eNB_id][0],
|
||||
T_BUFFER(pusch_vars->rxdataF_comp[eNB_id][0],
|
||||
2 * /* ulsch[UE_id]->harq_processes[harq_pid]->nb_rb */ frame_parms->N_RB_UL *12*frame_parms->symbols_per_tti*2));
|
||||
|
||||
llrp = (int16_t*)&eNB_pusch_vars->llr[0];
|
||||
|
||||
for (l=0; l<frame_parms->symbols_per_tti-ulsch[UE_id]->harq_processes[harq_pid]->srs_active; l++) {
|
||||
|
||||
if (((frame_parms->Ncp == 0) && ((l==3) || (l==10)))|| // skip pilots
|
||||
@@ -1829,8 +1829,8 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
switch (Qm) {
|
||||
case 2 :
|
||||
ulsch_qpsk_llr(frame_parms,
|
||||
eNB_pusch_vars->rxdataF_comp[eNB_id],
|
||||
eNB_pusch_vars->llr,
|
||||
pusch_vars->rxdataF_comp[eNB_id],
|
||||
pusch_vars->llr,
|
||||
l,
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,
|
||||
&llrp);
|
||||
@@ -1838,26 +1838,26 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
case 4 :
|
||||
ulsch_16qam_llr(frame_parms,
|
||||
eNB_pusch_vars->rxdataF_comp[eNB_id],
|
||||
eNB_pusch_vars->llr,
|
||||
eNB_pusch_vars->ul_ch_mag[eNB_id],
|
||||
pusch_vars->rxdataF_comp[eNB_id],
|
||||
pusch_vars->llr,
|
||||
pusch_vars->ul_ch_mag[eNB_id],
|
||||
l,ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,
|
||||
&llrp);
|
||||
break;
|
||||
|
||||
case 6 :
|
||||
ulsch_64qam_llr(frame_parms,
|
||||
eNB_pusch_vars->rxdataF_comp[eNB_id],
|
||||
eNB_pusch_vars->llr,
|
||||
eNB_pusch_vars->ul_ch_mag[eNB_id],
|
||||
eNB_pusch_vars->ul_ch_magb[eNB_id],
|
||||
pusch_vars->rxdataF_comp[eNB_id],
|
||||
pusch_vars->llr,
|
||||
pusch_vars->ul_ch_mag[eNB_id],
|
||||
pusch_vars->ul_ch_magb[eNB_id],
|
||||
l,ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,
|
||||
&llrp);
|
||||
break;
|
||||
|
||||
default:
|
||||
#ifdef DEBUG_ULSCH
|
||||
msg("ulsch_demodulation.c (rx_ulsch): Unknown Qm!!!!\n");
|
||||
printf("ulsch_demodulation.c (rx_ulsch): Unknown Qm!!!!\n");
|
||||
#endif //DEBUG_ULSCH
|
||||
break;
|
||||
}
|
||||
@@ -1865,66 +1865,66 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
|
||||
|
||||
}
|
||||
|
||||
void rx_ulsch_emul(PHY_VARS_eNB *phy_vars_eNB,
|
||||
uint8_t subframe,
|
||||
void rx_ulsch_emul(PHY_VARS_eNB *eNB,
|
||||
eNB_rxtx_proc_t *proc,
|
||||
uint8_t sect_id,
|
||||
uint8_t UE_index)
|
||||
{
|
||||
msg("[PHY] EMUL eNB %d rx_ulsch_emul : subframe %d, sect_id %d, UE_index %d\n",phy_vars_eNB->Mod_id,subframe,sect_id,UE_index);
|
||||
phy_vars_eNB->lte_eNB_pusch_vars[UE_index]->ulsch_power[0] = 31622; //=45dB;
|
||||
phy_vars_eNB->lte_eNB_pusch_vars[UE_index]->ulsch_power[1] = 31622; //=45dB;
|
||||
printf("[PHY] EMUL eNB %d rx_ulsch_emul : subframe %d, sect_id %d, UE_index %d\n",eNB->Mod_id,proc->subframe_rx,sect_id,UE_index);
|
||||
eNB->pusch_vars[UE_index]->ulsch_power[0] = 31622; //=45dB;
|
||||
eNB->pusch_vars[UE_index]->ulsch_power[1] = 31622; //=45dB;
|
||||
|
||||
}
|
||||
|
||||
|
||||
void dump_ulsch(PHY_VARS_eNB *PHY_vars_eNB,uint8_t sched_subframe, uint8_t UE_id)
|
||||
void dump_ulsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,uint8_t UE_id)
|
||||
{
|
||||
|
||||
uint32_t nsymb = (PHY_vars_eNB->lte_frame_parms.Ncp == 0) ? 14 : 12;
|
||||
|
||||
uint32_t nsymb = (eNB->frame_parms.Ncp == 0) ? 14 : 12;
|
||||
uint8_t harq_pid;
|
||||
int subframe = PHY_vars_eNB->proc[sched_subframe].subframe_rx;
|
||||
int subframe = proc->subframe_rx;
|
||||
|
||||
harq_pid = subframe2harq_pid(&PHY_vars_eNB->lte_frame_parms,PHY_vars_eNB->proc[sched_subframe].frame_rx,subframe);
|
||||
harq_pid = subframe2harq_pid(&eNB->frame_parms,proc->frame_rx,subframe);
|
||||
|
||||
printf("Dumping ULSCH in subframe %d with harq_pid %d, for NB_rb %d, mcs %d, Qm %d, N_symb %d\n", subframe,harq_pid,PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb,
|
||||
PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs,get_Qm_ul(PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs),
|
||||
PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->Nsymb_pusch);
|
||||
printf("Dumping ULSCH in subframe %d with harq_pid %d, for NB_rb %d, mcs %d, Qm %d, N_symb %d\n", subframe,harq_pid,eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,
|
||||
eNB->ulsch[UE_id]->harq_processes[harq_pid]->mcs,get_Qm_ul(eNB->ulsch[UE_id]->harq_processes[harq_pid]->mcs),
|
||||
eNB->ulsch[UE_id]->harq_processes[harq_pid]->Nsymb_pusch);
|
||||
//#ifndef OAI_EMU
|
||||
write_output("/tmp/ulsch_d.m","ulsch_dseq",&PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->d[0][96],
|
||||
PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->Kplus*3,1,0);
|
||||
write_output("/tmp/rxsig0.m","rxs0", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][0],PHY_vars_eNB->lte_frame_parms.samples_per_tti*10,1,1);
|
||||
write_output("/tmp/ulsch_d.m","ulsch_dseq",&eNB->ulsch[UE_id]->harq_processes[harq_pid]->d[0][96],
|
||||
eNB->ulsch[UE_id]->harq_processes[harq_pid]->Kplus*3,1,0);
|
||||
write_output("/tmp/rxsig0.m","rxs0", &eNB->common_vars.rxdata[0][0][0],eNB->frame_parms.samples_per_tti*10,1,1);
|
||||
|
||||
if (PHY_vars_eNB->lte_frame_parms.nb_antennas_rx>1)
|
||||
write_output("/tmp/rxsig1.m","rxs1", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][1][0],PHY_vars_eNB->lte_frame_parms.samples_per_tti*10,1,1);
|
||||
if (eNB->frame_parms.nb_antennas_rx>1)
|
||||
write_output("/tmp/rxsig1.m","rxs1", &eNB->common_vars.rxdata[0][1][0],eNB->frame_parms.samples_per_tti*10,1,1);
|
||||
|
||||
write_output("/tmp/rxsigF0.m","rxsF0", &PHY_vars_eNB->lte_eNB_common_vars.rxdataF[0][0][0],PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size*nsymb,1,1);
|
||||
write_output("/tmp/rxsigF0.m","rxsF0", &eNB->common_vars.rxdataF[0][0][0],eNB->frame_parms.ofdm_symbol_size*nsymb,1,1);
|
||||
|
||||
if (PHY_vars_eNB->lte_frame_parms.nb_antennas_rx>1)
|
||||
write_output("/tmp/rxsigF1.m","rxsF1", &PHY_vars_eNB->lte_eNB_common_vars.rxdataF[0][1][0],PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size*nsymb,1,1);
|
||||
if (eNB->frame_parms.nb_antennas_rx>1)
|
||||
write_output("/tmp/rxsigF1.m","rxsF1", &eNB->common_vars.rxdataF[0][1][0],eNB->frame_parms.ofdm_symbol_size*nsymb,1,1);
|
||||
|
||||
write_output("/tmp/rxsigF0_ext.m","rxsF0_ext", &PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->rxdataF_ext[0][0][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1);
|
||||
write_output("/tmp/rxsigF0_ext.m","rxsF0_ext", &eNB->pusch_vars[UE_id]->rxdataF_ext[0][0][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1);
|
||||
|
||||
if (PHY_vars_eNB->lte_frame_parms.nb_antennas_rx>1)
|
||||
write_output("/tmp/rxsigF1_ext.m","rxsF1_ext", &PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->rxdataF_ext[1][0][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1);
|
||||
if (eNB->frame_parms.nb_antennas_rx>1)
|
||||
write_output("/tmp/rxsigF1_ext.m","rxsF1_ext", &eNB->pusch_vars[UE_id]->rxdataF_ext[1][0][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1);
|
||||
|
||||
|
||||
write_output("/tmp/srs_est0.m","srsest0",PHY_vars_eNB->lte_eNB_srs_vars[UE_id].srs_ch_estimates[0][0],PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1);
|
||||
write_output("/tmp/srs_est0.m","srsest0",eNB->srs_vars[UE_id].srs_ch_estimates[0][0],eNB->frame_parms.ofdm_symbol_size,1,1);
|
||||
|
||||
if (PHY_vars_eNB->lte_frame_parms.nb_antennas_rx>1)
|
||||
write_output("/tmp/srs_est1.m","srsest1",PHY_vars_eNB->lte_eNB_srs_vars[UE_id].srs_ch_estimates[0][1],PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1);
|
||||
if (eNB->frame_parms.nb_antennas_rx>1)
|
||||
write_output("/tmp/srs_est1.m","srsest1",eNB->srs_vars[UE_id].srs_ch_estimates[0][1],eNB->frame_parms.ofdm_symbol_size,1,1);
|
||||
|
||||
write_output("/tmp/drs_est0.m","drsest0",PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->drs_ch_estimates[0][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1);
|
||||
write_output("/tmp/drs_est0.m","drsest0",eNB->pusch_vars[UE_id]->drs_ch_estimates[0][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1);
|
||||
|
||||
if (PHY_vars_eNB->lte_frame_parms.nb_antennas_rx>1)
|
||||
write_output("/tmp/drs_est1.m","drsest1",PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->drs_ch_estimates[0][1],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1);
|
||||
if (eNB->frame_parms.nb_antennas_rx>1)
|
||||
write_output("/tmp/drs_est1.m","drsest1",eNB->pusch_vars[UE_id]->drs_ch_estimates[0][1],eNB->frame_parms.N_RB_UL*12*nsymb,1,1);
|
||||
|
||||
write_output("/tmp/ulsch_rxF_comp0.m","ulsch0_rxF_comp0",&PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->rxdataF_comp[0][0][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1);
|
||||
// write_output("ulsch_rxF_comp1.m","ulsch0_rxF_comp1",&PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->rxdataF_comp[0][1][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1);
|
||||
write_output("/tmp/ulsch_rxF_llr.m","ulsch_llr",PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->llr,
|
||||
PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb*12*get_Qm_ul(PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs)
|
||||
*PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->Nsymb_pusch,1,0);
|
||||
write_output("/tmp/ulsch_ch_mag.m","ulsch_ch_mag",&PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->ul_ch_mag[0][0][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1);
|
||||
// write_output("ulsch_ch_mag1.m","ulsch_ch_mag1",&PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->ul_ch_mag[0][1][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1);
|
||||
write_output("/tmp/ulsch_rxF_comp0.m","ulsch0_rxF_comp0",&eNB->pusch_vars[UE_id]->rxdataF_comp[0][0][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1);
|
||||
// write_output("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);
|
||||
write_output("/tmp/ulsch_rxF_llr.m","ulsch_llr",eNB->pusch_vars[UE_id]->llr,
|
||||
eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12*get_Qm_ul(eNB->ulsch[UE_id]->harq_processes[harq_pid]->mcs)
|
||||
*eNB->ulsch[UE_id]->harq_processes[harq_pid]->Nsymb_pusch,1,0);
|
||||
write_output("/tmp/ulsch_ch_mag.m","ulsch_ch_mag",&eNB->pusch_vars[UE_id]->ul_ch_mag[0][0][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1);
|
||||
// write_output("ulsch_ch_mag1.m","ulsch_ch_mag1",&eNB->pusch_vars[UE_id]->ul_ch_mag[0][1][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1);
|
||||
//#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#include "defs.h"
|
||||
#include "UTIL/LOG/vcd_signal_dumper.h"
|
||||
|
||||
//#define OFDMA_ULSCH
|
||||
|
||||
|
||||
//#define DEBUG_ULSCH_MODULATION
|
||||
|
||||
@@ -43,7 +43,7 @@ void dft_lte(int32_t *z,int32_t *d, int32_t Msc_PUSCH, uint8_t Nsymb)
|
||||
#elif defined(__arm__)
|
||||
int16x8_t norm128;
|
||||
#endif
|
||||
// msg("Doing lte_dft for Msc_PUSCH %d\n",Msc_PUSCH);
|
||||
// printf("Doing lte_dft for Msc_PUSCH %d\n",Msc_PUSCH);
|
||||
|
||||
d0 = (uint32_t *)d;
|
||||
d1 = d0+Msc_PUSCH;
|
||||
@@ -58,7 +58,7 @@ void dft_lte(int32_t *z,int32_t *d, int32_t Msc_PUSCH, uint8_t Nsymb)
|
||||
d10 = d9+Msc_PUSCH;
|
||||
d11 = d10+Msc_PUSCH;
|
||||
|
||||
// msg("symbol 0 (d0 %p, d %p)\n",d0,d);
|
||||
// printf("symbol 0 (d0 %p, d %p)\n",d0,d);
|
||||
for (i=0,ip=0; i<Msc_PUSCH; i++,ip+=4) {
|
||||
dft_in0[ip] = d0[i];
|
||||
dft_in0[ip+1] = d1[i];
|
||||
@@ -72,13 +72,13 @@ void dft_lte(int32_t *z,int32_t *d, int32_t Msc_PUSCH, uint8_t Nsymb)
|
||||
dft_in2[ip+1] = d9[i];
|
||||
dft_in2[ip+2] = d10[i];
|
||||
dft_in2[ip+3] = d11[i];
|
||||
// msg("dft%d %d: %d,%d,%d,%d\n",Msc_PUSCH,ip,d0[i],d1[i],d2[i],d3[i]);
|
||||
// printf("dft%d %d: %d,%d,%d,%d\n",Msc_PUSCH,ip,d0[i],d1[i],d2[i],d3[i]);
|
||||
|
||||
// dft_in_re2[ip+1] = d9[i];
|
||||
// dft_in_re2[ip+2] = d10[i];
|
||||
}
|
||||
|
||||
// msg("\n");
|
||||
// printf("\n");
|
||||
|
||||
switch (Msc_PUSCH) {
|
||||
case 12:
|
||||
@@ -321,10 +321,10 @@ void dft_lte(int32_t *z,int32_t *d, int32_t Msc_PUSCH, uint8_t Nsymb)
|
||||
z10 = z9+Msc_PUSCH;
|
||||
z11 = z10+Msc_PUSCH;
|
||||
|
||||
// msg("symbol0 (dft)\n");
|
||||
// printf("symbol0 (dft)\n");
|
||||
for (i=0,ip=0; i<Msc_PUSCH; i++,ip+=4) {
|
||||
z0[i] = dft_out0[ip];
|
||||
// msg("%d,%d,",((short*)&z0[i])[0],((short*)&z0[i])[1]);
|
||||
// printf("%d,%d,",((short*)&z0[i])[0],((short*)&z0[i])[1]);
|
||||
z1[i] = dft_out0[ip+1];
|
||||
z2[i] = dft_out0[ip+2];
|
||||
z3[i] = dft_out0[ip+3];
|
||||
@@ -336,11 +336,11 @@ void dft_lte(int32_t *z,int32_t *d, int32_t Msc_PUSCH, uint8_t Nsymb)
|
||||
z9[i] = dft_out2[ip+1];
|
||||
z10[i] = dft_out2[ip+2];
|
||||
z11[i] = dft_out2[ip+3];
|
||||
// msg("out dft%d %d: %d,%d,%d,%d,%d,%d,%d,%d\n",Msc_PUSCH,ip,z0[i],z1[i],z2[i],z3[i],z4[i],z5[i],z6[i],z7[i]);
|
||||
// printf("out dft%d %d: %d,%d,%d,%d,%d,%d,%d,%d\n",Msc_PUSCH,ip,z0[i],z1[i],z2[i],z3[i],z4[i],z5[i],z6[i],z7[i]);
|
||||
|
||||
}
|
||||
|
||||
// msg("\n");
|
||||
// printf("\n");
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -374,7 +374,7 @@ void ulsch_modulation(int32_t **txdataF,
|
||||
uint8_t c;
|
||||
|
||||
if (!ulsch) {
|
||||
msg("ulsch_modulation.c: Null ulsch\n");
|
||||
printf("ulsch_modulation.c: Null ulsch\n");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -382,7 +382,7 @@ void ulsch_modulation(int32_t **txdataF,
|
||||
x2 = (ulsch->rnti<<14) + (subframe<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.3.1
|
||||
|
||||
if (harq_pid > 7) {
|
||||
msg("ulsch_modulation.c: Illegal harq_pid %d\n",harq_pid);
|
||||
printf("ulsch_modulation.c: Illegal harq_pid %d\n",harq_pid);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -390,12 +390,12 @@ void ulsch_modulation(int32_t **txdataF,
|
||||
nb_rb = ulsch->harq_processes[harq_pid]->nb_rb;
|
||||
|
||||
if (nb_rb == 0) {
|
||||
msg("ulsch_modulation.c: Frame %d, Subframe %d Illegal nb_rb %d\n",frame,subframe,nb_rb);
|
||||
printf("ulsch_modulation.c: Frame %d, Subframe %d Illegal nb_rb %d\n",frame,subframe,nb_rb);
|
||||
return;
|
||||
}
|
||||
|
||||
if (first_rb >25 ) {
|
||||
msg("ulsch_modulation.c: Frame %d, Subframe %d Illegal first_rb %d\n",frame,subframe,first_rb);
|
||||
printf("ulsch_modulation.c: Frame %d, Subframe %d Illegal first_rb %d\n",frame,subframe,first_rb);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -410,12 +410,12 @@ void ulsch_modulation(int32_t **txdataF,
|
||||
Msc_PUSCH = ulsch->harq_processes[harq_pid]->nb_rb*12;
|
||||
|
||||
#ifdef DEBUG_ULSCH_MODULATION
|
||||
msg("ulsch_modulation.c: Doing modulation (rnti %x,x2 %x) for G=%d bits, harq_pid %d , nb_rb %d, Q_m %d, Nsymb_pusch %d (nsymb %d), subframe %d\n",
|
||||
printf("ulsch_modulation.c: Doing modulation (rnti %x,x2 %x) for G=%d bits, harq_pid %d , nb_rb %d, Q_m %d, Nsymb_pusch %d (nsymb %d), subframe %d\n",
|
||||
ulsch->rnti,x2,G,harq_pid,ulsch->harq_processes[harq_pid]->nb_rb,Q_m, ulsch->Nsymb_pusch,nsymb,subframe);
|
||||
#endif
|
||||
|
||||
// scrambling (Note the placeholding bits are handled in ulsch_coding.c directly!)
|
||||
//msg("ulsch bits: ");
|
||||
//printf("ulsch bits: ");
|
||||
s = lte_gold_generic(&x1, &x2, 1);
|
||||
k=0;
|
||||
|
||||
@@ -425,14 +425,14 @@ void ulsch_modulation(int32_t **txdataF,
|
||||
c = (uint8_t)((s>>j)&1);
|
||||
|
||||
if (ulsch->h[k] == PUSCH_x) {
|
||||
// msg("i %d: PUSCH_x\n",i);
|
||||
// printf("i %d: PUSCH_x\n",i);
|
||||
ulsch->b_tilde[k] = 1;
|
||||
} else if (ulsch->h[k] == PUSCH_y) {
|
||||
// msg("i %d: PUSCH_y\n",i);
|
||||
// printf("i %d: PUSCH_y\n",i);
|
||||
ulsch->b_tilde[k] = ulsch->b_tilde[k-1];
|
||||
} else {
|
||||
ulsch->b_tilde[k] = (ulsch->h[k]+c)&1;
|
||||
// msg("i %d : %d (h %d c %d)\n", (i<<5)+j,ulsch->b_tilde[k],ulsch->h[k],c);
|
||||
// printf("i %d : %d (h %d c %d)\n", (i<<5)+j,ulsch->b_tilde[k],ulsch->h[k],c);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -440,7 +440,7 @@ void ulsch_modulation(int32_t **txdataF,
|
||||
s = lte_gold_generic(&x1, &x2, 0);
|
||||
}
|
||||
|
||||
//msg("\n");
|
||||
//printf("\n");
|
||||
|
||||
|
||||
gain_lin_QPSK = (short)((amp*ONE_OVER_SQRT2_Q15)>>15);
|
||||
@@ -464,7 +464,7 @@ void ulsch_modulation(int32_t **txdataF,
|
||||
((int16_t*)&ulsch->d[i])[0] = (ulsch->b_tilde[j] == 1) ? (gain_lin_QPSK) : -gain_lin_QPSK;
|
||||
((int16_t*)&ulsch->d[i])[1] = (ulsch->b_tilde[j+1] == 1)? (-gain_lin_QPSK) : gain_lin_QPSK;
|
||||
// if (i<Msc_PUSCH)
|
||||
// msg("input %d (%p): %d,%d\n", i,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]);
|
||||
// printf("input %d (%p): %d,%d\n", i,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]);
|
||||
|
||||
// UE1, x0*
|
||||
((int16_t*)&ulsch->d[i+1])[0] = (ulsch->b_tilde[j-2] == 1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
|
||||
@@ -597,7 +597,7 @@ void ulsch_modulation(int32_t **txdataF,
|
||||
((int16_t*)&ulsch->d[i])[0] = (ulsch->b_tilde[j] == 1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
|
||||
((int16_t*)&ulsch->d[i])[1] = (ulsch->b_tilde[j+1] == 1)? (-gain_lin_QPSK) : gain_lin_QPSK;
|
||||
// if (i<Msc_PUSCH)
|
||||
// msg("input %d/%d Msc_PUSCH %d (%p): %d,%d\n", i,Msymb,Msc_PUSCH,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]);
|
||||
// printf("input %d/%d Msc_PUSCH %d (%p): %d,%d\n", i,Msymb,Msc_PUSCH,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]);
|
||||
|
||||
break;
|
||||
|
||||
@@ -621,7 +621,7 @@ void ulsch_modulation(int32_t **txdataF,
|
||||
|
||||
((int16_t*)&ulsch->d[i])[0]=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15);
|
||||
((int16_t*)&ulsch->d[i])[1]=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15);
|
||||
// msg("input(16qam) %d (%p): %d,%d\n", i,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]);
|
||||
// printf("input(16qam) %d (%p): %d,%d\n", i,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]);
|
||||
break;
|
||||
|
||||
case 6:
|
||||
@@ -681,14 +681,14 @@ void ulsch_modulation(int32_t **txdataF,
|
||||
// re_offset0++;
|
||||
}
|
||||
|
||||
// msg("re_offset0 %d\n",re_offset0);
|
||||
// printf("re_offset0 %d\n",re_offset0);
|
||||
|
||||
|
||||
for (j=0,l=0; l<(nsymb-ulsch->srs_active); l++) {
|
||||
re_offset = re_offset0;
|
||||
symbol_offset = (int)frame_parms->ofdm_symbol_size*(l+(subframe*nsymb));
|
||||
#ifdef DEBUG_ULSCH_MODULATION
|
||||
msg("symbol %d (subframe %d): symbol_offset %d\n",l,subframe,symbol_offset);
|
||||
printf("symbol %d (subframe %d): symbol_offset %d\n",l,subframe,symbol_offset);
|
||||
#endif
|
||||
txptr = &txdataF[0][symbol_offset];
|
||||
|
||||
@@ -698,10 +698,10 @@ void ulsch_modulation(int32_t **txdataF,
|
||||
// Skip reference symbols
|
||||
else {
|
||||
|
||||
// msg("copying %d REs\n",Msc_PUSCH);
|
||||
// printf("copying %d REs\n",Msc_PUSCH);
|
||||
for (i=0; i<Msc_PUSCH; i++,j++) {
|
||||
#ifdef DEBUG_ULSCH_MODULATION
|
||||
msg("re_offset %d (%p): %d,%d\n", re_offset,&ulsch->z[j],((int16_t*)&ulsch->z[j])[0],((int16_t*)&ulsch->z[j])[1]);
|
||||
printf("re_offset %d (%p): %d,%d\n", re_offset,&ulsch->z[j],((int16_t*)&ulsch->z[j])[0],((int16_t*)&ulsch->z[j])[1]);
|
||||
#endif
|
||||
txptr[re_offset++] = ulsch->z[j];
|
||||
|
||||
@@ -719,13 +719,13 @@ void ulsch_modulation(int32_t **txdataF,
|
||||
// re_offset0++;
|
||||
}
|
||||
|
||||
// msg("re_offset0 %d\n",re_offset0);
|
||||
// printf("re_offset0 %d\n",re_offset0);
|
||||
// printf("txdataF %p\n",&txdataF[0][0]);
|
||||
for (j=0,l=0; l<(nsymb-ulsch->srs_active); l++) {
|
||||
re_offset = re_offset0;
|
||||
symbol_offset = (uint32_t)frame_parms->ofdm_symbol_size*(l+(subframe*nsymb));
|
||||
#ifdef DEBUG_ULSCH_MODULATION
|
||||
msg("ulsch_mod (OFDMA) symbol %d (subframe %d): symbol_offset %d\n",l,subframe,symbol_offset);
|
||||
printf("ulsch_mod (SC-FDMA) symbol %d (subframe %d): symbol_offset %d\n",l,subframe,symbol_offset);
|
||||
#endif
|
||||
txptr = &txdataF[0][symbol_offset];
|
||||
|
||||
@@ -734,11 +734,11 @@ void ulsch_modulation(int32_t **txdataF,
|
||||
}
|
||||
// Skip reference symbols
|
||||
else {
|
||||
// msg("copying %d REs\n",Msc_PUSCH);
|
||||
// printf("copying %d REs\n",Msc_PUSCH);
|
||||
for (i=0; i<Msc_PUSCH; i++,j++) {
|
||||
|
||||
#ifdef DEBUG_ULSCH_MODULATION
|
||||
msg("re_offset %d (%p): %d,%d => %p\n", re_offset,&ulsch->z[j],((int16_t*)&ulsch->z[j])[0],((int16_t*)&ulsch->z[j])[1],&txptr[re_offset]);
|
||||
printf("re_offset %d (%p): %d,%d => %p\n", re_offset,&ulsch->z[j],((int16_t*)&ulsch->z[j])[0],((int16_t*)&ulsch->z[j])[1],&txptr[re_offset]);
|
||||
#endif //DEBUG_ULSCH_MODULATION
|
||||
txptr[re_offset++] = ulsch->z[j];
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#define SOFFSET 0
|
||||
|
||||
|
||||
int slot_fep(PHY_VARS_UE *phy_vars_ue,
|
||||
int slot_fep(PHY_VARS_UE *ue,
|
||||
unsigned char l,
|
||||
unsigned char Ns,
|
||||
int sample_offset,
|
||||
@@ -13,8 +13,8 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
|
||||
int reset_freq_est)
|
||||
{
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms;
|
||||
LTE_UE_COMMON *ue_common_vars = &phy_vars_ue->lte_ue_common_vars;
|
||||
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
|
||||
@@ -83,37 +83,37 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
|
||||
|
||||
|
||||
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
|
||||
memset(&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int));
|
||||
memset(&common_vars->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;
|
||||
|
||||
#ifdef DEBUG_FEP
|
||||
// if (phy_vars_ue->frame <100)
|
||||
printf("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\n", phy_vars_ue->frame_rx,Ns, symbol,
|
||||
// if (ue->frame <100)
|
||||
printf("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\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);
|
||||
#endif
|
||||
|
||||
if (l==0) {
|
||||
|
||||
if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size))
|
||||
memcpy((short *)&ue_common_vars->rxdata[aa][frame_length_samples],
|
||||
(short *)&ue_common_vars->rxdata[aa][0],
|
||||
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 *)&ue_common_vars->rxdata[aa][rx_offset % frame_length_samples],
|
||||
(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 *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
||||
(int16_t *)&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
||||
} else { // use dft input from RX buffer directly
|
||||
start_meas(&phy_vars_ue->rx_dft_stats);
|
||||
start_meas(&ue->rx_dft_stats);
|
||||
|
||||
dft((int16_t *)&ue_common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
|
||||
(int16_t *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
||||
stop_meas(&phy_vars_ue->rx_dft_stats);
|
||||
dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
|
||||
(int16_t *)&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
||||
stop_meas(&ue->rx_dft_stats);
|
||||
|
||||
}
|
||||
} else {
|
||||
@@ -121,54 +121,54 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
|
||||
// (frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1);
|
||||
|
||||
#ifdef DEBUG_FEP
|
||||
// if (phy_vars_ue->frame <100)
|
||||
printf("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\n", phy_vars_ue->frame_rx,Ns, symbol,
|
||||
// if (ue->frame <100)
|
||||
printf("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\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);
|
||||
#endif
|
||||
|
||||
if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size))
|
||||
memcpy((void *)&ue_common_vars->rxdata[aa][frame_length_samples],
|
||||
(void *)&ue_common_vars->rxdata[aa][0],
|
||||
memcpy((void *)&common_vars->rxdata[aa][frame_length_samples],
|
||||
(void *)&common_vars->rxdata[aa][0],
|
||||
frame_parms->ofdm_symbol_size*sizeof(int));
|
||||
|
||||
start_meas(&phy_vars_ue->rx_dft_stats);
|
||||
start_meas(&ue->rx_dft_stats);
|
||||
|
||||
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 *)&ue_common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
|
||||
(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 *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
||||
(int16_t *)&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
||||
} else { // use dft input from RX buffer directly
|
||||
|
||||
dft((int16_t *)&ue_common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
|
||||
(int16_t *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
||||
dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
|
||||
(int16_t *)&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
||||
}
|
||||
|
||||
stop_meas(&phy_vars_ue->rx_dft_stats);
|
||||
stop_meas(&ue->rx_dft_stats);
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (phy_vars_ue->perfect_ce == 0) {
|
||||
if (ue->perfect_ce == 0) {
|
||||
if ((l==0) || (l==(4-frame_parms->Ncp))) {
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx_eNB; aa++) {
|
||||
|
||||
#ifdef DEBUG_FEP
|
||||
printf("Channel estimation eNB %d, aatx %d, slot %d, symbol %d\n",eNB_id,aa,Ns,l);
|
||||
#endif
|
||||
start_meas(&phy_vars_ue->dlsch_channel_estimation_stats);
|
||||
lte_dl_channel_estimation(phy_vars_ue,eNB_id,0,
|
||||
start_meas(&ue->dlsch_channel_estimation_stats);
|
||||
lte_dl_channel_estimation(ue,eNB_id,0,
|
||||
Ns,
|
||||
aa,
|
||||
l,
|
||||
symbol);
|
||||
stop_meas(&phy_vars_ue->dlsch_channel_estimation_stats);
|
||||
stop_meas(&ue->dlsch_channel_estimation_stats);
|
||||
|
||||
for (i=0; i<phy_vars_ue->PHY_measurements.n_adj_cells; i++) {
|
||||
lte_dl_channel_estimation(phy_vars_ue,eNB_id,i+1,
|
||||
for (i=0; i<ue->measurements.n_adj_cells; i++) {
|
||||
lte_dl_channel_estimation(ue,eNB_id,i+1,
|
||||
Ns,
|
||||
aa,
|
||||
l,
|
||||
@@ -184,13 +184,13 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
|
||||
#endif
|
||||
|
||||
if (l==(4-frame_parms->Ncp)) {
|
||||
start_meas(&phy_vars_ue->dlsch_freq_offset_estimation_stats);
|
||||
lte_est_freq_offset(ue_common_vars->dl_ch_estimates[0],
|
||||
start_meas(&ue->dlsch_freq_offset_estimation_stats);
|
||||
lte_est_freq_offset(common_vars->dl_ch_estimates[0],
|
||||
frame_parms,
|
||||
l,
|
||||
&ue_common_vars->freq_offset,
|
||||
&common_vars->freq_offset,
|
||||
reset_freq_est);
|
||||
stop_meas(&phy_vars_ue->dlsch_freq_offset_estimation_stats);
|
||||
stop_meas(&ue->dlsch_freq_offset_estimation_stats);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,15 +4,15 @@
|
||||
|
||||
#define SOFFSET 0
|
||||
|
||||
int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue,
|
||||
int slot_fep_mbsfn(PHY_VARS_UE *ue,
|
||||
unsigned char l,
|
||||
int subframe,
|
||||
int sample_offset,
|
||||
int no_prefix)
|
||||
{
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms;
|
||||
LTE_UE_COMMON *ue_common_vars = &phy_vars_ue->lte_ue_common_vars;
|
||||
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;
|
||||
@@ -89,34 +89,34 @@ int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue,
|
||||
|
||||
|
||||
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
|
||||
memset(&ue_common_vars->rxdataF[aa][2*frame_parms->ofdm_symbol_size*l],0,2*frame_parms->ofdm_symbol_size*sizeof(int));
|
||||
memset(&common_vars->rxdataF[aa][2*frame_parms->ofdm_symbol_size*l],0,2*frame_parms->ofdm_symbol_size*sizeof(int));
|
||||
|
||||
if (l==0) {
|
||||
start_meas(&phy_vars_ue->rx_dft_stats);
|
||||
dft((int16_t *)&ue_common_vars->rxdata[aa][(sample_offset +
|
||||
start_meas(&ue->rx_dft_stats);
|
||||
dft((int16_t *)&common_vars->rxdata[aa][(sample_offset +
|
||||
nb_prefix_samples0 +
|
||||
subframe_offset -
|
||||
SOFFSET) % frame_length_samples],
|
||||
(int16_t *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*l],1);
|
||||
stop_meas(&phy_vars_ue->rx_dft_stats);
|
||||
(int16_t *)&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*l],1);
|
||||
stop_meas(&ue->rx_dft_stats);
|
||||
} 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 *)&ue_common_vars->rxdata[aa][frame_length_samples],
|
||||
(short *)&ue_common_vars->rxdata[aa][0],
|
||||
memcpy((short *)&common_vars->rxdata[aa][frame_length_samples],
|
||||
(short *)&common_vars->rxdata[aa][0],
|
||||
frame_parms->ofdm_symbol_size*sizeof(int));
|
||||
|
||||
start_meas(&phy_vars_ue->rx_dft_stats);
|
||||
dft((int16_t *)&ue_common_vars->rxdata[aa][(sample_offset +
|
||||
start_meas(&ue->rx_dft_stats);
|
||||
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 *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*l],1);
|
||||
stop_meas(&phy_vars_ue->rx_dft_stats);
|
||||
(int16_t *)&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*l],1);
|
||||
stop_meas(&ue->rx_dft_stats);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -125,29 +125,29 @@ int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue,
|
||||
// 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 (phy_vars_ue->perfect_ce == 0) {
|
||||
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(phy_vars_ue,
|
||||
lte_dl_mbsfn_channel_estimation(ue,
|
||||
eNB_id,
|
||||
0,
|
||||
subframe,
|
||||
l);
|
||||
/* for (i=0;i<phy_vars_ue->PHY_measurements.n_adj_cells;i++) {
|
||||
lte_dl_mbsfn_channel_estimation(phy_vars_ue,
|
||||
/* 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(phy_vars_ue,eNB_id,0,
|
||||
lte_dl_channel_estimation(ue,eNB_id,0,
|
||||
Ns,
|
||||
aa,
|
||||
l,
|
||||
symbol);
|
||||
for (i=0;i<phy_vars_ue->PHY_measurements.n_adj_cells;i++) {
|
||||
lte_dl_channel_estimation(phy_vars_ue,eNB_id,i+1,
|
||||
for (i=0;i<ue->PHY_measurements.n_adj_cells;i++) {
|
||||
lte_dl_channel_estimation(ue,eNB_id,i+1,
|
||||
Ns,
|
||||
aa,
|
||||
l,
|
||||
@@ -161,10 +161,10 @@ int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue,
|
||||
#endif
|
||||
// if ((l == 0) || (l==(4-frame_parms->Ncp)))
|
||||
/* if ((l==2)||(l==6)||(l==10))
|
||||
lte_mbsfn_est_freq_offset(ue_common_vars->dl_ch_estimates[0],
|
||||
lte_mbsfn_est_freq_offset(common_vars->dl_ch_estimates[0],
|
||||
frame_parms,
|
||||
l,
|
||||
&ue_common_vars->freq_offset); */
|
||||
&common_vars->freq_offset); */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ short conjugate75[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1} ;
|
||||
short conjugate75_2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1} ;
|
||||
short negate[8]__attribute__((aligned(16))) = {-1,-1,-1,-1,-1,-1,-1,-1};
|
||||
|
||||
void apply_7_5_kHz(PHY_VARS_UE *phy_vars_ue,int32_t*txdata,uint8_t slot)
|
||||
void apply_7_5_kHz(PHY_VARS_UE *ue,int32_t*txdata,uint8_t slot)
|
||||
{
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ void apply_7_5_kHz(PHY_VARS_UE *phy_vars_ue,int32_t*txdata,uint8_t slot)
|
||||
uint32_t slot_offset;
|
||||
// uint8_t aa;
|
||||
uint32_t i;
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms;
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
|
||||
|
||||
switch (frame_parms->N_RB_UL) {
|
||||
|
||||
@@ -63,10 +63,8 @@ void apply_7_5_kHz(PHY_VARS_UE *phy_vars_ue,int32_t*txdata,uint8_t slot)
|
||||
break;
|
||||
}
|
||||
|
||||
slot_offset = (uint32_t)slot * phy_vars_ue->lte_frame_parms.samples_per_tti/2;
|
||||
// if ((slot&1)==1)
|
||||
// slot_offset += (len/4);
|
||||
len = phy_vars_ue->lte_frame_parms.samples_per_tti/2;
|
||||
slot_offset = (uint32_t)slot * frame_parms->samples_per_tti/2;
|
||||
len = frame_parms->samples_per_tti/2;
|
||||
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
txptr128 = (__m128i *)&txdata[slot_offset];
|
||||
@@ -121,12 +119,12 @@ void apply_7_5_kHz(PHY_VARS_UE *phy_vars_ue,int32_t*txdata,uint8_t slot)
|
||||
}
|
||||
|
||||
|
||||
void remove_7_5_kHz(PHY_VARS_eNB *phy_vars_eNB,uint8_t slot)
|
||||
void remove_7_5_kHz(PHY_VARS_eNB *eNB,uint8_t slot)
|
||||
{
|
||||
|
||||
|
||||
int32_t **rxdata=phy_vars_eNB->lte_eNB_common_vars.rxdata[0];
|
||||
int32_t **rxdata_7_5kHz=phy_vars_eNB->lte_eNB_common_vars.rxdata_7_5kHz[0];
|
||||
int32_t **rxdata=eNB->common_vars.rxdata[0];
|
||||
int32_t **rxdata_7_5kHz=eNB->common_vars.rxdata_7_5kHz[0];
|
||||
uint16_t len;
|
||||
uint32_t *kHz7_5ptr;
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
@@ -140,9 +138,9 @@ void remove_7_5_kHz(PHY_VARS_eNB *phy_vars_eNB,uint8_t slot)
|
||||
uint32_t slot_offset,slot_offset2;
|
||||
uint8_t aa;
|
||||
uint32_t i;
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms;
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&eNB->frame_parms;
|
||||
|
||||
switch (phy_vars_eNB->lte_frame_parms.N_RB_UL) {
|
||||
switch (frame_parms->N_RB_UL) {
|
||||
|
||||
case 6:
|
||||
kHz7_5ptr = (frame_parms->Ncp==0) ? (uint32_t*)s6n_kHz_7_5 : (uint32_t*)s6e_kHz_7_5;
|
||||
@@ -174,12 +172,12 @@ void remove_7_5_kHz(PHY_VARS_eNB *phy_vars_eNB,uint8_t slot)
|
||||
}
|
||||
|
||||
|
||||
slot_offset = (uint32_t)slot * phy_vars_eNB->lte_frame_parms.samples_per_tti/2-phy_vars_eNB->N_TA_offset;
|
||||
slot_offset2 = (uint32_t)(slot&1) * phy_vars_eNB->lte_frame_parms.samples_per_tti/2;
|
||||
slot_offset = (uint32_t)slot * frame_parms->samples_per_tti/2-eNB->N_TA_offset;
|
||||
slot_offset2 = (uint32_t)(slot&1) * frame_parms->samples_per_tti/2;
|
||||
|
||||
len = phy_vars_eNB->lte_frame_parms.samples_per_tti/2;
|
||||
len = frame_parms->samples_per_tti/2;
|
||||
|
||||
for (aa=0; aa<phy_vars_eNB->lte_frame_parms.nb_antennas_rx; aa++) {
|
||||
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
|
||||
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
rxptr128 = (__m128i *)&rxdata[aa][slot_offset];
|
||||
@@ -242,3 +240,4 @@ void remove_7_5_kHz(PHY_VARS_eNB *phy_vars_eNB,uint8_t slot)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -57,7 +57,7 @@ int mult_cpx_conj_vector(int16_t *x1,
|
||||
|
||||
// we compute 4 cpx multiply for each loop
|
||||
for(i=0; i<(N>>2); i++) {
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
tmp_re = _mm_madd_epi16(*x1_128,*x2_128);
|
||||
tmp_im = _mm_shufflelo_epi16(*x1_128,_MM_SHUFFLE(2,3,0,1));
|
||||
tmp_im = _mm_shufflehi_epi16(tmp_im,_MM_SHUFFLE(2,3,0,1));
|
||||
|
||||
@@ -268,10 +268,10 @@ int32_t subcarrier_energy(int32_t *,uint32_t, int32_t* subcarrier_energy, uint16
|
||||
*/
|
||||
int32_t signal_energy_nodc(int32_t *,uint32_t);
|
||||
|
||||
/*!\fn double signal_energy_fp(double **, double **,uint32_t, uint32_t,uint32_t);
|
||||
/*!\fn double signal_energy_fp(double *s_re[2], double *s_im[2],uint32_t, uint32_t,uint32_t);
|
||||
\brief Computes the signal energy per subcarrier
|
||||
*/
|
||||
double signal_energy_fp(double **s_re, double **s_im, uint32_t nb_antennas, uint32_t length,uint32_t offset);
|
||||
double signal_energy_fp(double *s_re[2], double *s_im[2], uint32_t nb_antennas, uint32_t length,uint32_t offset);
|
||||
|
||||
/*!\fn double signal_energy_fp2(struct complex *, uint32_t);
|
||||
\brief Computes the signal energy per subcarrier
|
||||
|
||||
@@ -30,10 +30,10 @@
|
||||
#define print_ints(s,x) printf("%s %d %d %d %d\n",s,(x)[0],(x)[1],(x)[2],(x)[3])
|
||||
|
||||
|
||||
static int16_t conjugatedft[32] __attribute__((aligned(32))) = {-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1};
|
||||
const static int16_t conjugatedft[32] __attribute__((aligned(32))) = {-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1};
|
||||
|
||||
|
||||
static int16_t reflip[32] __attribute__((aligned(32))) = {1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1};
|
||||
const static int16_t reflip[32] __attribute__((aligned(32))) = {1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1};
|
||||
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
static inline void cmac(__m128i a,__m128i b, __m128i *re32, __m128i *im32) __attribute__((always_inline));
|
||||
@@ -446,33 +446,33 @@ static inline int16x8_t packed_cmult2(int16x8_t a,int16x8_t b, int16x8_t b2)
|
||||
|
||||
#endif
|
||||
|
||||
static int16_t W0s[16]__attribute__((aligned(32))) = {32767,0,32767,0,32767,0,32767,0,32767,0,32767,0,32767,0,32767,0};
|
||||
const static int16_t W0s[16]__attribute__((aligned(32))) = {32767,0,32767,0,32767,0,32767,0,32767,0,32767,0,32767,0,32767,0};
|
||||
|
||||
static int16_t W13s[16]__attribute__((aligned(32))) = {-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378};
|
||||
static int16_t W23s[16]__attribute__((aligned(32))) = {-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378};
|
||||
const static int16_t W13s[16]__attribute__((aligned(32))) = {-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378};
|
||||
const static int16_t W23s[16]__attribute__((aligned(32))) = {-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378};
|
||||
|
||||
static int16_t W15s[16]__attribute__((aligned(32))) = {10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163};
|
||||
static int16_t W25s[16]__attribute__((aligned(32))) = {-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260};
|
||||
static int16_t W35s[16]__attribute__((aligned(32))) = {-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260};
|
||||
static int16_t W45s[16]__attribute__((aligned(32))) = {10126,31163,10126,31163,10126,31163,10126,31163,10126,31163,10126,31163,10126,31163,10126,31163};
|
||||
const static int16_t W15s[16]__attribute__((aligned(32))) = {10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163};
|
||||
const static int16_t W25s[16]__attribute__((aligned(32))) = {-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260};
|
||||
const static int16_t W35s[16]__attribute__((aligned(32))) = {-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260};
|
||||
const static int16_t W45s[16]__attribute__((aligned(32))) = {10126,31163,10126,31163,10126,31163,10126,31163,10126,31163,10126,31163,10126,31163,10126,31163};
|
||||
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
__m128i *W0 = (__m128i *)W0s;
|
||||
__m128i *W13 = (__m128i *)W13s;
|
||||
__m128i *W23 = (__m128i *)W23s;
|
||||
__m128i *W15 = (__m128i *)W15s;
|
||||
__m128i *W25 = (__m128i *)W25s;
|
||||
__m128i *W35 = (__m128i *)W35s;
|
||||
__m128i *W45 = (__m128i *)W45s;
|
||||
const __m128i *W0 = (__m128i *)W0s;
|
||||
const __m128i *W13 = (__m128i *)W13s;
|
||||
const __m128i *W23 = (__m128i *)W23s;
|
||||
const __m128i *W15 = (__m128i *)W15s;
|
||||
const __m128i *W25 = (__m128i *)W25s;
|
||||
const __m128i *W35 = (__m128i *)W35s;
|
||||
const __m128i *W45 = (__m128i *)W45s;
|
||||
|
||||
#ifdef __AVX2__
|
||||
__m256i *W0_256 = (__m256i *)W0s;
|
||||
__m256i *W13_256 = (__m256i *)W13s;
|
||||
__m256i *W23_256 = (__m256i *)W23s;
|
||||
__m256i *W15_256 = (__m256i *)W15s;
|
||||
__m256i *W25_256 = (__m256i *)W25s;
|
||||
__m256i *W35_256 = (__m256i *)W35s;
|
||||
__m256i *W45_256 = (__m256i *)W45s;
|
||||
const __m256i *W0_256 = (__m256i *)W0s;
|
||||
const __m256i *W13_256 = (__m256i *)W13s;
|
||||
const __m256i *W23_256 = (__m256i *)W23s;
|
||||
const __m256i *W15_256 = (__m256i *)W15s;
|
||||
const __m256i *W25_256 = (__m256i *)W25s;
|
||||
const __m256i *W35_256 = (__m256i *)W35s;
|
||||
const __m256i *W45_256 = (__m256i *)W45s;
|
||||
#endif
|
||||
|
||||
#elif defined(__arm__)
|
||||
@@ -484,23 +484,23 @@ int16x8_t *W25 = (int16x8_t *)W25s;
|
||||
int16x8_t *W35 = (int16x8_t *)W35s;
|
||||
int16x8_t *W45 = (int16x8_t *)W45s;
|
||||
#endif
|
||||
static int16_t dft_norm_table[16] = {9459, //12
|
||||
6689,//24
|
||||
5461,//36
|
||||
4729,//482
|
||||
4230,//60
|
||||
23170,//72
|
||||
3344,//96
|
||||
3153,//108
|
||||
2991,//120
|
||||
18918,//sqrt(3),//144
|
||||
18918,//sqrt(3),//180
|
||||
16384,//2, //192
|
||||
18918,//sqrt(3), // 216
|
||||
16384,//2, //240
|
||||
18918,//sqrt(3), // 288
|
||||
14654
|
||||
}; //sqrt(5) //300
|
||||
const static int16_t dft_norm_table[16] = {9459, //12
|
||||
6689,//24
|
||||
5461,//36
|
||||
4729,//482
|
||||
4230,//60
|
||||
23170,//72
|
||||
3344,//96
|
||||
3153,//108
|
||||
2991,//120
|
||||
18918,//sqrt(3),//144
|
||||
18918,//sqrt(3),//180
|
||||
16384,//2, //192
|
||||
18918,//sqrt(3), // 216
|
||||
16384,//2, //240
|
||||
18918,//sqrt(3), // 288
|
||||
14654
|
||||
}; //sqrt(5) //300
|
||||
|
||||
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
@@ -2008,42 +2008,42 @@ static inline void transpose4_ooff(int16x4_t *x,int16x4_t *y,int off)
|
||||
|
||||
// 16-point optimized DFT kernel
|
||||
|
||||
int16_t tw16[24] __attribute__((aligned(32))) = { 32767,0,30272,-12540,23169 ,-23170,12539 ,-30273,
|
||||
const static int16_t tw16[24] __attribute__((aligned(32))) = { 32767,0,30272,-12540,23169 ,-23170,12539 ,-30273,
|
||||
32767,0,23169,-23170,0 ,-32767,-23170,-23170,
|
||||
32767,0,12539,-30273,-23170,-23170,-30273,12539
|
||||
};
|
||||
|
||||
int16_t tw16a[24] __attribute__((aligned(32))) = {32767,0,30272,12540,23169 ,23170,12539 ,30273,
|
||||
const static int16_t tw16a[24] __attribute__((aligned(32))) = {32767,0,30272,12540,23169 ,23170,12539 ,30273,
|
||||
32767,0,23169,23170,0 ,32767,-23170,23170,
|
||||
32767,0,12539,30273,-23170,23170,-30273,-12539
|
||||
};
|
||||
|
||||
int16_t tw16b[24] __attribute__((aligned(32))) = { 0,32767,-12540,30272,-23170,23169 ,-30273,12539,
|
||||
const static int16_t tw16b[24] __attribute__((aligned(32))) = { 0,32767,-12540,30272,-23170,23169 ,-30273,12539,
|
||||
0,32767,-23170,23169,-32767,0 ,-23170,-23170,
|
||||
0,32767,-30273,12539,-23170,-23170,12539 ,-30273
|
||||
};
|
||||
|
||||
int16_t tw16c[24] __attribute__((aligned(32))) = { 0,32767,12540,30272,23170,23169 ,30273 ,12539,
|
||||
const static int16_t tw16c[24] __attribute__((aligned(32))) = { 0,32767,12540,30272,23170,23169 ,30273 ,12539,
|
||||
0,32767,23170,23169,32767,0 ,23170 ,-23170,
|
||||
0,32767,30273,12539,23170,-23170,-12539,-30273
|
||||
};
|
||||
|
||||
int16_t tw16rep[48] __attribute__((aligned(32))) = { 32767,0,30272,-12540,23169 ,-23170,12539 ,-30273,32767,0,30272,-12540,23169 ,-23170,12539 ,-30273,
|
||||
const static int16_t tw16rep[48] __attribute__((aligned(32))) = { 32767,0,30272,-12540,23169 ,-23170,12539 ,-30273,32767,0,30272,-12540,23169 ,-23170,12539 ,-30273,
|
||||
32767,0,23169,-23170,0 ,-32767,-23170,-23170,32767,0,23169,-23170,0 ,-32767,-23170,-23170,
|
||||
32767,0,12539,-30273,-23170,-23170,-30273,12539,32767,0,12539,-30273,-23170,-23170,-30273,12539
|
||||
};
|
||||
|
||||
int16_t tw16arep[48] __attribute__((aligned(32))) = {32767,0,30272,12540,23169 ,23170,12539 ,30273,32767,0,30272,12540,23169 ,23170,12539 ,30273,
|
||||
const static int16_t tw16arep[48] __attribute__((aligned(32))) = {32767,0,30272,12540,23169 ,23170,12539 ,30273,32767,0,30272,12540,23169 ,23170,12539 ,30273,
|
||||
32767,0,23169,23170,0 ,32767,-23170,23170,32767,0,23169,23170,0 ,32767,-23170,23170,
|
||||
32767,0,12539,30273,-23170,23170,-30273,-12539,32767,0,12539,30273,-23170,23170,-30273,-12539
|
||||
};
|
||||
|
||||
int16_t tw16brep[48] __attribute__((aligned(32))) = { 0,32767,-12540,30272,-23170,23169 ,-30273,12539,0,32767,-12540,30272,-23170,23169 ,-30273,12539,
|
||||
const static int16_t tw16brep[48] __attribute__((aligned(32))) = { 0,32767,-12540,30272,-23170,23169 ,-30273,12539,0,32767,-12540,30272,-23170,23169 ,-30273,12539,
|
||||
0,32767,-23170,23169,-32767,0 ,-23170,-23170,0,32767,-23170,23169,-32767,0 ,-23170,-23170,
|
||||
0,32767,-30273,12539,-23170,-23170,12539 ,-30273,0,32767,-30273,12539,-23170,-23170,12539 ,-30273
|
||||
};
|
||||
|
||||
int16_t tw16crep[48] __attribute__((aligned(32))) = { 0,32767,12540,30272,23170,23169 ,30273 ,12539,0,32767,12540,30272,23170,23169 ,30273 ,12539,
|
||||
const static int16_t tw16crep[48] __attribute__((aligned(32))) = { 0,32767,12540,30272,23170,23169 ,30273 ,12539,0,32767,12540,30272,23170,23169 ,30273 ,12539,
|
||||
0,32767,23170,23169,32767,0 ,23170 ,-23170,0,32767,23170,23169,32767,0 ,23170 ,-23170,
|
||||
0,32767,30273,12539,23170,-23170,-12539,-30273,0,32767,30273,12539,23170,-23170,-12539,-30273
|
||||
};
|
||||
@@ -2474,7 +2474,7 @@ static inline void idft16_simd256(int16_t *x,int16_t *y)
|
||||
|
||||
// 64-point optimized DFT
|
||||
|
||||
int16_t tw64[96] __attribute__((aligned(32))) = {
|
||||
const static int16_t tw64[96] __attribute__((aligned(32))) = {
|
||||
32767,0,32609,-3212,32137,-6393,31356,-9512,
|
||||
30272,-12540,28897,-15447,27244,-18205,25329,-20788,
|
||||
23169,-23170,20787,-25330,18204,-27245,15446,-28898,
|
||||
@@ -2489,7 +2489,7 @@ int16_t tw64[96] __attribute__((aligned(32))) = {
|
||||
-30273,12539,-25330,20787,-18205,27244,-9512,31356
|
||||
};
|
||||
|
||||
int16_t tw64rep[192] __attribute__((aligned(32))) = {
|
||||
const static int16_t tw64rep[192] __attribute__((aligned(32))) = {
|
||||
32767,0,32609,-3212,32137,-6393,31356,-9512,32767,0,32609,-3212,32137,-6393,31356,-9512,
|
||||
30272,-12540,28897,-15447,27244,-18205,25329,-20788,30272,-12540,28897,-15447,27244,-18205,25329,-20788,
|
||||
23169,-23170,20787,-25330,18204,-27245,15446,-28898,23169,-23170,20787,-25330,18204,-27245,15446,-28898,
|
||||
@@ -2504,7 +2504,7 @@ int16_t tw64rep[192] __attribute__((aligned(32))) = {
|
||||
-30273,12539,-25330,20787,-18205,27244,-9512,31356,-30273,12539,-25330,20787,-18205,27244,-9512,31356
|
||||
};
|
||||
|
||||
int16_t tw64a[96] __attribute__((aligned(32))) = {
|
||||
const static int16_t tw64a[96] __attribute__((aligned(32))) = {
|
||||
32767,0,32609,3212,32137,6393,31356,9512,
|
||||
30272,12540,28897,15447,27244,18205,25329,20788,
|
||||
23169,23170,20787,25330,18204,27245,15446,28898,
|
||||
@@ -2518,7 +2518,7 @@ int16_t tw64a[96] __attribute__((aligned(32))) = {
|
||||
-23170,23170,-28898,15447,-32138,6393,-32610,-3211,
|
||||
-30273,-12539,-25330,-20787,-18205,-27244,-9512,-31356
|
||||
};
|
||||
int16_t tw64arep[192] __attribute__((aligned(32))) = {
|
||||
const static int16_t tw64arep[192] __attribute__((aligned(32))) = {
|
||||
32767,0,32609,3212,32137,6393,31356,9512,32767,0,32609,3212,32137,6393,31356,9512,
|
||||
30272,12540,28897,15447,27244,18205,25329,20788,30272,12540,28897,15447,27244,18205,25329,20788,
|
||||
23169,23170,20787,25330,18204,27245,15446,28898,23169,23170,20787,25330,18204,27245,15446,28898,
|
||||
@@ -2533,7 +2533,7 @@ int16_t tw64arep[192] __attribute__((aligned(32))) = {
|
||||
-30273,-12539,-25330,-20787,-18205,-27244,-9512,-31356,-30273,-12539,-25330,-20787,-18205,-27244,-9512,-31356
|
||||
};
|
||||
|
||||
int16_t tw64b[96] __attribute__((aligned(32))) = {
|
||||
const static int16_t tw64b[96] __attribute__((aligned(32))) = {
|
||||
0,32767,-3212,32609,-6393,32137,-9512,31356,
|
||||
-12540,30272,-15447,28897,-18205,27244,-20788,25329,
|
||||
-23170,23169,-25330,20787,-27245,18204,-28898,15446,
|
||||
@@ -2548,7 +2548,7 @@ int16_t tw64b[96] __attribute__((aligned(32))) = {
|
||||
12539,-30273,20787,-25330,27244,-18205,31356,-9512
|
||||
};
|
||||
|
||||
int16_t tw64brep[192] __attribute__((aligned(32))) = {
|
||||
const static int16_t tw64brep[192] __attribute__((aligned(32))) = {
|
||||
0,32767,-3212,32609,-6393,32137,-9512,31356,0,32767,-3212,32609,-6393,32137,-9512,31356,
|
||||
-12540,30272,-15447,28897,-18205,27244,-20788,25329,-12540,30272,-15447,28897,-18205,27244,-20788,25329,
|
||||
-23170,23169,-25330,20787,-27245,18204,-28898,15446,-23170,23169,-25330,20787,-27245,18204,-28898,15446,
|
||||
@@ -2563,7 +2563,7 @@ int16_t tw64brep[192] __attribute__((aligned(32))) = {
|
||||
12539,-30273,20787,-25330,27244,-18205,31356,-9512,12539,-30273,20787,-25330,27244,-18205,31356,-9512
|
||||
};
|
||||
|
||||
int16_t tw64c[96] __attribute__((aligned(32))) = {
|
||||
const static int16_t tw64c[96] __attribute__((aligned(32))) = {
|
||||
0,32767,3212,32609,6393,32137,9512,31356,
|
||||
12540,30272,15447,28897,18205,27244,20788,25329,
|
||||
23170,23169,25330,20787,27245,18204,28898,15446,
|
||||
@@ -2578,7 +2578,7 @@ int16_t tw64c[96] __attribute__((aligned(32))) = {
|
||||
-12539,-30273,-20787,-25330,-27244,-18205,-31356,-9512
|
||||
};
|
||||
|
||||
int16_t tw64crep[192] __attribute__((aligned(32))) = {
|
||||
const static int16_t tw64crep[192] __attribute__((aligned(32))) = {
|
||||
0,32767,3212,32609,6393,32137,9512,31356,0,32767,3212,32609,6393,32137,9512,31356,
|
||||
12540,30272,15447,28897,18205,27244,20788,25329,12540,30272,15447,28897,18205,27244,20788,25329,
|
||||
23170,23169,25330,20787,27245,18204,28898,15446,23170,23169,25330,20787,27245,18204,28898,15446,
|
||||
@@ -2599,7 +2599,7 @@ int16_t tw64crep[192] __attribute__((aligned(32))) = {
|
||||
#define simdshort_q15_t __m64
|
||||
#define shiftright_int16(a,shift) _mm_srai_epi16(a,shift)
|
||||
#define set1_int16(a) _mm_set1_epi16(a);
|
||||
#define mulhi_int16(a,b) _mm_slli_epi16(_mm_mulhi_epi16(a,b),1);
|
||||
#define mulhi_int16(a,b) _mm_mulhrs_epi16 (a,b)
|
||||
#ifdef __AVX2__
|
||||
#define simd256_q15_t __m256i
|
||||
#define shiftright_int16_simd256(a,shift) _mm256_srai_epi16(a,shift)
|
||||
@@ -6789,6 +6789,7 @@ void dft60(int16_t *x,int16_t *y,unsigned char scale)
|
||||
|
||||
for (i=0; i<60; i++) {
|
||||
y128[i] = mulhi_int16(y128[i],norm128);
|
||||
// printf("y[%d] = (%d,%d)\n",i,((int16_t*)&y128[i])[0],((int16_t*)&y128[i])[1]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18525,6 +18526,7 @@ int main(int argc, char**argv)
|
||||
simd_q15_t x[4096],y[4096],tw0,tw1,tw2,tw3;
|
||||
#endif
|
||||
int i;
|
||||
simd_q15_t *x128=x,*y128=y;
|
||||
|
||||
set_taus_seed(0);
|
||||
opp_enabled = 1;
|
||||
@@ -18564,17 +18566,22 @@ int main(int argc, char**argv)
|
||||
((int16_t *)&tw3)[5] = 0;
|
||||
((int16_t *)&tw3)[6] = 32767;
|
||||
((int16_t *)&tw3)[7] = 0;
|
||||
|
||||
*/
|
||||
for (i=0;i<300;i++) {
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
#ifndef __AVX2__
|
||||
x[i] = _mm_set1_epi32(taus());
|
||||
x[i] = _mm_srai_epi16(x[i],4);
|
||||
#else
|
||||
x[i] = _mm256_set1_epi32(taus());
|
||||
x[i] = _mm256_srai_epi16(x[i],4);
|
||||
#endif
|
||||
#elif defined(__arm__)
|
||||
x[i] = (int16x8_t)vdupq_n_s32(taus());
|
||||
x[i] = vshrq_n_s16(x[i],4);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
bfly2_tw1(x,x+1,y,y+1);
|
||||
printf("(%d,%d) (%d,%d) => (%d,%d) (%d,%d)\n",((int16_t*)&x[0])[0],((int16_t*)&x[0])[1],((int16_t*)&x[1])[0],((int16_t*)&x[1])[1],((int16_t*)&y[0])[0],((int16_t*)&y[0])[1],((int16_t*)&y[1])[0],((int16_t*)&y[1])[1]);
|
||||
printf("(%d,%d) (%d,%d) => (%d,%d) (%d,%d)\n",((int16_t*)&x[0])[0],((int16_t*)&x[0])[1],((int16_t*)&x[1])[0],((int16_t*)&x[1])[1],((int16_t*)&y[0])[2],((int16_t*)&y[0])[3],((int16_t*)&y[1])[2],((int16_t*)&y[1])[3]);
|
||||
@@ -18715,27 +18722,27 @@ int main(int argc, char**argv)
|
||||
for (i=0;i<48;i++)
|
||||
printf("%d,%d,",((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]);
|
||||
printf("\n");
|
||||
|
||||
*/
|
||||
dft60((int16_t *)x,(int16_t *)y,1);
|
||||
printf("\n\n60-point\n");
|
||||
printf("X: ");
|
||||
for (i=0;i<60;i++)
|
||||
printf("%d,%d,",((int16_t*)(&x[i]))[0],((int16_t *)(&x[i]))[1]);
|
||||
printf("%d,%d,",((int16_t*)(&x128[i]))[0],((int16_t *)(&x128[i]))[1]);
|
||||
printf("\nY:");
|
||||
for (i=0;i<60;i++)
|
||||
printf("%d,%d,",((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]);
|
||||
printf("%d,%d,",((int16_t*)(&y128[i]))[0],((int16_t *)(&y128[i]))[1]);
|
||||
printf("\n");
|
||||
|
||||
|
||||
dft72((int16_t *)x,(int16_t *)y,1);
|
||||
printf("\n\n72-point\n");
|
||||
printf("X: ");
|
||||
for (i=0;i<72;i++)
|
||||
printf("%d,%d,",((int16_t*)(&x[i]))[0],((int16_t *)(&x[i]))[1]);
|
||||
printf("%d,%d,",((int16_t*)(&x128[i]))[0],((int16_t *)(&x128[i]))[1]);
|
||||
printf("\nY:");
|
||||
for (i=0;i<72;i++)
|
||||
printf("%d: %d,%d\n",i,((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]);
|
||||
printf("%d: %d,%d\n",i,((int16_t*)(&y128[i]))[0],((int16_t *)(&y128[i]))[1]);
|
||||
printf("\n");
|
||||
|
||||
/*
|
||||
dft96((int16_t *)x,(int16_t *)y,1);
|
||||
printf("\n\n96-point\n");
|
||||
printf("X: ");
|
||||
@@ -18755,17 +18762,17 @@ int main(int argc, char**argv)
|
||||
for (i=0;i<108;i++)
|
||||
printf("%d: %d,%d\n",i,((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]);
|
||||
printf("\n");
|
||||
|
||||
*/
|
||||
dft120((int16_t *)x,(int16_t *)y,1);
|
||||
printf("\n\n120-point\n");
|
||||
printf("X: ");
|
||||
for (i=0;i<120;i++)
|
||||
printf("%d,%d,",((int16_t*)(&x[i]))[0],((int16_t *)(&x[i]))[1]);
|
||||
printf("%d,%d,",((int16_t*)(&x128[i]))[0],((int16_t *)(&x128[i]))[1]);
|
||||
printf("\nY:");
|
||||
for (i=0;i<120;i++)
|
||||
printf("%d: %d,%d\n",i,((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]);
|
||||
printf("%d: %d,%d\n",i,((int16_t*)(&y128[i]))[0],((int16_t *)(&y128[i]))[1]);
|
||||
printf("\n");
|
||||
|
||||
/*
|
||||
dft144((int16_t *)x,(int16_t *)y,1);
|
||||
printf("\n\n144-point\n");
|
||||
printf("X: ");
|
||||
|
||||
@@ -19,11 +19,11 @@ static void ia_receiver_on_off( FL_OBJECT *button, long arg)
|
||||
|
||||
if (fl_get_button(button)) {
|
||||
fl_set_object_label(button, "IA Receiver ON");
|
||||
openair_daq_vars.use_ia_receiver = 1;
|
||||
// PHY_vars_UE_g[0][0]->use_ia_receiver = 1;
|
||||
fl_set_object_color(button, FL_GREEN, FL_GREEN);
|
||||
} else {
|
||||
fl_set_object_label(button, "IA Receiver OFF");
|
||||
openair_daq_vars.use_ia_receiver = 0;
|
||||
// PHY_vars_UE_g[0][0]->use_ia_receiver = 0;
|
||||
fl_set_object_color(button, FL_RED, FL_RED);
|
||||
}
|
||||
}
|
||||
@@ -133,7 +133,7 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
|
||||
{
|
||||
int eNB_id = 0;
|
||||
int i,i2,arx,atx,ind,k;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_enb->lte_frame_parms;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_enb->frame_parms;
|
||||
int nsymb_ce = 12*frame_parms->N_RB_UL*frame_parms->symbols_per_tti;
|
||||
uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
|
||||
uint8_t nb_antennas_tx = 1; // frame_parms->nb_antennas_tx; // in LTE Rel. 8 and 9 only a single transmit antenna is assumed at the UE
|
||||
@@ -155,16 +155,16 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
|
||||
float time[FRAME_LENGTH_COMPLEX_SAMPLES];
|
||||
float time2[2048];
|
||||
float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx];
|
||||
int frame = phy_vars_enb->proc[0].frame_tx;
|
||||
int frame = phy_vars_enb->proc.proc_rxtx[0].frame_tx;
|
||||
uint32_t total_dlsch_bitrate = phy_vars_enb->total_dlsch_bitrate;
|
||||
int coded_bits_per_codeword = 0;
|
||||
uint8_t harq_pid; // in TDD config 3 it is sf-2, i.e., can be 0,1,2
|
||||
int mcs = 0;
|
||||
|
||||
// choose max MCS to compute coded_bits_per_codeword
|
||||
if (phy_vars_enb->ulsch_eNB[UE_id]!=NULL) {
|
||||
if (phy_vars_enb->ulsch[UE_id]!=NULL) {
|
||||
for (harq_pid=0; harq_pid<3; harq_pid++) {
|
||||
mcs = cmax(phy_vars_enb->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs,mcs);
|
||||
mcs = cmax(phy_vars_enb->ulsch[UE_id]->harq_processes[harq_pid]->mcs,mcs);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -174,11 +174,11 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
|
||||
llr = (float*) calloc(coded_bits_per_codeword,sizeof(float)); // init to zero
|
||||
bit = malloc(coded_bits_per_codeword*sizeof(float));
|
||||
|
||||
rxsig_t = (int16_t**) phy_vars_enb->lte_eNB_common_vars.rxdata[eNB_id];
|
||||
chest_t = (int16_t**) phy_vars_enb->lte_eNB_pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id];
|
||||
chest_f = (int16_t**) phy_vars_enb->lte_eNB_pusch_vars[UE_id]->drs_ch_estimates[eNB_id];
|
||||
pusch_llr = (int16_t*) phy_vars_enb->lte_eNB_pusch_vars[UE_id]->llr;
|
||||
pusch_comp = (int16_t*) phy_vars_enb->lte_eNB_pusch_vars[UE_id]->rxdataF_comp[eNB_id][0];
|
||||
rxsig_t = (int16_t**) phy_vars_enb->common_vars.rxdata[eNB_id];
|
||||
chest_t = (int16_t**) phy_vars_enb->pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id];
|
||||
chest_f = (int16_t**) phy_vars_enb->pusch_vars[UE_id]->drs_ch_estimates[eNB_id];
|
||||
pusch_llr = (int16_t*) phy_vars_enb->pusch_vars[UE_id]->llr;
|
||||
pusch_comp = (int16_t*) phy_vars_enb->pusch_vars[UE_id]->rxdataF_comp[eNB_id][0];
|
||||
pucch1_comp = (int32_t*) phy_vars_enb->pucch1_stats[UE_id];
|
||||
pucch1_thres = (int32_t*) phy_vars_enb->pucch1_stats_thres[UE_id];
|
||||
pucch1ab_comp = (int32_t*) phy_vars_enb->pucch1ab_stats[UE_id];
|
||||
@@ -460,7 +460,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
|
||||
uint8_t subframe)
|
||||
{
|
||||
int i,arx,atx,ind,k;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms;
|
||||
int nsymb_ce = frame_parms->ofdm_symbol_size;//*frame_parms->symbols_per_tti;
|
||||
uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
|
||||
uint8_t nb_antennas_tx = frame_parms->nb_antennas_tx_eNB;
|
||||
@@ -481,39 +481,39 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
|
||||
float **chest_t_abs;
|
||||
float time[FRAME_LENGTH_COMPLEX_SAMPLES];
|
||||
float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx];
|
||||
int frame = phy_vars_ue->frame_rx;
|
||||
int frame = phy_vars_ue->proc.proc_rxtx[0].frame_rx;
|
||||
uint32_t total_dlsch_bitrate = phy_vars_ue->bitrate[eNB_id];
|
||||
int coded_bits_per_codeword = 0;
|
||||
int mcs = 0;
|
||||
unsigned char harq_pid = 0;
|
||||
|
||||
|
||||
if (phy_vars_ue->dlsch_ue[eNB_id][0]!=NULL) {
|
||||
harq_pid = phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid;
|
||||
if (phy_vars_ue->dlsch[eNB_id][0]!=NULL) {
|
||||
harq_pid = phy_vars_ue->dlsch[eNB_id][0]->current_harq_pid;
|
||||
|
||||
if (harq_pid>=8)
|
||||
return;
|
||||
|
||||
mcs = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs;
|
||||
mcs = phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->mcs;
|
||||
|
||||
// Button 0
|
||||
if(!phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off) {
|
||||
if(!phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->dl_power_off) {
|
||||
// we are in TM5
|
||||
fl_show_object(form->button_0);
|
||||
}
|
||||
}
|
||||
|
||||
if (phy_vars_ue->lte_ue_pdcch_vars[eNB_id]!=NULL) {
|
||||
num_pdcch_symbols = phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols;
|
||||
if (phy_vars_ue->pdcch_vars[eNB_id]!=NULL) {
|
||||
num_pdcch_symbols = phy_vars_ue->pdcch_vars[eNB_id]->num_pdcch_symbols;
|
||||
}
|
||||
|
||||
// coded_bits_per_codeword = frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
|
||||
if (phy_vars_ue->dlsch_ue[eNB_id][0]!=NULL) {
|
||||
if (phy_vars_ue->dlsch[eNB_id][0]!=NULL) {
|
||||
coded_bits_per_codeword = get_G(frame_parms,
|
||||
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb,
|
||||
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even,
|
||||
phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->nb_rb,
|
||||
phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even,
|
||||
get_Qm(mcs),
|
||||
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Nl,
|
||||
phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Nl,
|
||||
num_pdcch_symbols,
|
||||
frame,
|
||||
subframe);
|
||||
@@ -535,16 +535,16 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
|
||||
llr_pdcch = (float*) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float)); // init to zero
|
||||
bit_pdcch = (float*) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float));
|
||||
|
||||
rxsig_t = (int16_t**) phy_vars_ue->lte_ue_common_vars.rxdata;
|
||||
chest_t = (int16_t**) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_id];
|
||||
chest_f = (int16_t**) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id];
|
||||
pbch_llr = (int8_t*) phy_vars_ue->lte_ue_pbch_vars[eNB_id]->llr;
|
||||
pbch_comp = (int16_t*) phy_vars_ue->lte_ue_pbch_vars[eNB_id]->rxdataF_comp[0];
|
||||
pdcch_llr = (int8_t*) phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->llr;
|
||||
pdcch_comp = (int16_t*) phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->rxdataF_comp[0];
|
||||
pdsch_llr = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0]; // stream 0
|
||||
rxsig_t = (int16_t**) phy_vars_ue->common_vars.rxdata;
|
||||
chest_t = (int16_t**) phy_vars_ue->common_vars.dl_ch_estimates_time[eNB_id];
|
||||
chest_f = (int16_t**) phy_vars_ue->common_vars.dl_ch_estimates[eNB_id];
|
||||
pbch_llr = (int8_t*) phy_vars_ue->pbch_vars[eNB_id]->llr;
|
||||
pbch_comp = (int16_t*) phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0];
|
||||
pdcch_llr = (int8_t*) phy_vars_ue->pdcch_vars[eNB_id]->llr;
|
||||
pdcch_comp = (int16_t*) phy_vars_ue->pdcch_vars[eNB_id]->rxdataF_comp[0];
|
||||
pdsch_llr = (int16_t*) phy_vars_ue->pdsch_vars[eNB_id]->llr[0]; // stream 0
|
||||
// pdsch_llr = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id]->llr[0]; // stream 0
|
||||
pdsch_comp = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0];
|
||||
pdsch_comp = (int16_t*) phy_vars_ue->pdsch_vars[eNB_id]->rxdataF_comp0[0];
|
||||
|
||||
// Received signal in time domain of receive antenna 0
|
||||
if (rxsig_t != NULL) {
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
#include "../defs.h"
|
||||
#include "../../SCHED/defs.h" // for OPENAIR_DAQ_VARS
|
||||
|
||||
extern OPENAIR_DAQ_VARS openair_daq_vars;
|
||||
|
||||
/* Forms and Objects */
|
||||
typedef struct {
|
||||
|
||||
@@ -227,7 +227,7 @@ int32_t signal_energy_nodc(int32_t *input,uint32_t length)
|
||||
}
|
||||
|
||||
#endif
|
||||
double signal_energy_fp(double **s_re,double **s_im,uint32_t nb_antennas,uint32_t length,uint32_t offset)
|
||||
double signal_energy_fp(double *s_re[2],double *s_im[2],uint32_t nb_antennas,uint32_t length,uint32_t offset)
|
||||
{
|
||||
|
||||
int32_t aa,i;
|
||||
|
||||
@@ -20,7 +20,7 @@ double get_cpu_freq_GHz(void) {
|
||||
return cpu_freq_GHz;
|
||||
}
|
||||
|
||||
void print_meas_now(time_stats_t *ts, const char* name, int subframe, FILE* file_name){
|
||||
void print_meas_now(time_stats_t *ts, const char* name, FILE* file_name){
|
||||
|
||||
if (opp_enabled) {
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ static inline void start_meas(time_stats_t *ts) __attribute__((always_inline));
|
||||
static inline void stop_meas(time_stats_t *ts) __attribute__((always_inline));
|
||||
|
||||
|
||||
void print_meas_now(time_stats_t *ts, const char* name, int subframe, FILE* file_name);
|
||||
void print_meas_now(time_stats_t *ts, const char* name, FILE* file_name);
|
||||
void print_meas(time_stats_t *ts, const char* name, time_stats_t * total_exec_time, time_stats_t * sf_exec_time);
|
||||
double get_time_meas_us(time_stats_t *ts);
|
||||
double get_cpu_freq_GHz(void);
|
||||
|
||||
+389
-158
@@ -16,17 +16,14 @@
|
||||
#include <malloc.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include "common_lib.h"
|
||||
|
||||
//#include <complex.h>
|
||||
#include "assertions.h"
|
||||
#ifdef MEX
|
||||
# define msg mexPrintf
|
||||
#else
|
||||
# ifdef OPENAIR2
|
||||
# if ENABLE_RAL
|
||||
# include "collection/hashtable/hashtable.h"
|
||||
# include "COMMON/ral_messages_types.h"
|
||||
# include "UTIL/queue.h"
|
||||
# endif
|
||||
# include "log.h"
|
||||
# define msg(aRGS...) LOG_D(PHY, ##aRGS)
|
||||
# else
|
||||
@@ -101,13 +98,11 @@ static inline void* malloc16_clear( size_t size )
|
||||
#include "PHY/TOOLS/defs.h"
|
||||
#include "platform_types.h"
|
||||
|
||||
#ifdef OPENAIR_LTE
|
||||
|
||||
//#include "PHY/LTE_ESTIMATION/defs.h"
|
||||
|
||||
#include "PHY/LTE_TRANSPORT/defs.h"
|
||||
#include <pthread.h>
|
||||
|
||||
#include "targets/ARCH/COMMON/common_lib.h"
|
||||
|
||||
#define NUM_DCI_MAX 32
|
||||
|
||||
#define NUMBER_OF_eNB_SECTORS_MAX 3
|
||||
@@ -122,8 +117,21 @@ enum transmission_access_mode {
|
||||
CANCELED_ACCESS,
|
||||
UNKNOWN_ACCESS,
|
||||
SCHEDULED_ACCESS,
|
||||
CBA_ACCESS
|
||||
};
|
||||
CBA_ACCESS};
|
||||
|
||||
typedef enum {
|
||||
eNodeB_3GPP=0, // classical eNodeB function
|
||||
eNodeB_3GPP_BBU, // eNodeB with NGFI IF5
|
||||
NGFI_RCC_IF4p5, // NGFI_RCC (NGFI radio cloud center)
|
||||
NGFI_RAU_IF4p5,
|
||||
NGFI_RRU_IF5, // NGFI_RRU (NGFI remote radio-unit,IF5)
|
||||
NGFI_RRU_IF4p5 // NGFI_RRU (NGFI remote radio-unit,IF4p5)
|
||||
} eNB_func_t;
|
||||
|
||||
typedef enum {
|
||||
synch_to_ext_device=0, // synch to RF or Ethernet device
|
||||
synch_to_other // synch to another source (timer, other CC_id)
|
||||
} eNB_timing_t;
|
||||
|
||||
typedef struct UE_SCAN_INFO_s {
|
||||
/// 10 best amplitudes (linear) for each pss signals
|
||||
@@ -132,22 +140,26 @@ typedef struct UE_SCAN_INFO_s {
|
||||
int32_t freq_offset_Hz[3][10];
|
||||
} UE_SCAN_INFO_t;
|
||||
|
||||
#if ENABLE_RAL
|
||||
typedef struct ral_threshold_phy_s {
|
||||
SLIST_ENTRY(ral_threshold_phy_s) ral_thresholds;
|
||||
ral_threshold_t threshold;
|
||||
ral_th_action_t th_action;
|
||||
ral_link_param_t link_param;
|
||||
long timer_id;
|
||||
} ral_threshold_phy_t;
|
||||
#endif
|
||||
/// Top-level PHY Data Structure for RN
|
||||
typedef struct {
|
||||
/// Module ID indicator for this instance
|
||||
uint8_t Mod_id;
|
||||
uint32_t frame;
|
||||
// phy_vars_eNB
|
||||
// phy_vars ue
|
||||
// cuurently only used to store and forward the PMCH
|
||||
uint8_t mch_avtive[10];
|
||||
uint8_t sync_area[10]; // num SF
|
||||
LTE_UE_DLSCH_t *dlsch_rn_MCH[10];
|
||||
|
||||
/// Context data structure for eNB subframe processing
|
||||
} PHY_VARS_RN;
|
||||
|
||||
/// Context data structure for RX/TX portion of subframe processing
|
||||
typedef struct {
|
||||
/// Component Carrier index
|
||||
uint8_t CC_id;
|
||||
/// subframe index
|
||||
int subframe;
|
||||
/// timestamp transmitted to HW
|
||||
openair0_timestamp timestamp_tx;
|
||||
/// subframe to act upon for transmission
|
||||
int subframe_tx;
|
||||
/// subframe to act upon for reception
|
||||
@@ -156,55 +168,246 @@ typedef struct {
|
||||
int frame_tx;
|
||||
/// frame to act upon for reception
|
||||
int frame_rx;
|
||||
/// \brief Instance count for tx processing thread.
|
||||
/// \internal This variable is protected by \ref mutex_tx.
|
||||
int instance_cnt_tx;
|
||||
/// \brief Instance count for rx processing thread.
|
||||
/// \internal This variable is protected by \ref mutex_rx.
|
||||
int instance_cnt_rx;
|
||||
/// pthread structure for tx processing thread
|
||||
pthread_t pthread_tx;
|
||||
/// pthread structure for rx processing thread
|
||||
pthread_t pthread_rx;
|
||||
/// \brief Instance count for RXn-TXnp4 processing thread.
|
||||
/// \internal This variable is protected by \ref mutex_rxtx.
|
||||
int instance_cnt_rxtx;
|
||||
/// pthread structure for RXn-TXnp4 processing thread
|
||||
pthread_t pthread_rxtx;
|
||||
/// pthread attributes for RXn-TXnp4 processing thread
|
||||
pthread_attr_t attr_rxtx;
|
||||
/// condition variable for tx processing thread
|
||||
pthread_cond_t cond_tx;
|
||||
/// condition variable for rx processing thread
|
||||
pthread_cond_t cond_rx;
|
||||
/// mutex for tx processing thread
|
||||
pthread_mutex_t mutex_tx;
|
||||
/// mutex for tx processing thread
|
||||
pthread_mutex_t mutex_rx;
|
||||
pthread_cond_t cond_rxtx;
|
||||
/// mutex for RXn-TXnp4 processing thread
|
||||
pthread_mutex_t mutex_rxtx;
|
||||
/// scheduling parameters for RXn-TXnp4 thread
|
||||
struct sched_param sched_param_rxtx;
|
||||
} eNB_rxtx_proc_t;
|
||||
|
||||
typedef struct {
|
||||
struct PHY_VARS_eNB_s *eNB;
|
||||
int UE_id;
|
||||
int harq_pid;
|
||||
int llr8_flag;
|
||||
int ret;
|
||||
} td_params;
|
||||
|
||||
typedef struct {
|
||||
struct PHY_VARS_eNB_s *eNB;
|
||||
LTE_eNB_DLSCH_t *dlsch;
|
||||
int G;
|
||||
} te_params;
|
||||
|
||||
/// Context data structure for eNB subframe processing
|
||||
typedef struct eNB_proc_t_s {
|
||||
/// Component Carrier index
|
||||
uint8_t CC_id;
|
||||
/// thread index
|
||||
int thread_index;
|
||||
/// timestamp received from HW
|
||||
openair0_timestamp timestamp_rx;
|
||||
/// subframe to act upon for reception
|
||||
int subframe_rx;
|
||||
/// subframe to act upon for PRACH
|
||||
int subframe_prach;
|
||||
/// frame to act upon for reception
|
||||
int frame_rx;
|
||||
/// frame to act upon for PRACH
|
||||
int frame_prach;
|
||||
/// \internal This variable is protected by \ref mutex_fep.
|
||||
int instance_cnt_fep;
|
||||
/// \internal This variable is protected by \ref mutex_td.
|
||||
int instance_cnt_td;
|
||||
/// \internal This variable is protected by \ref mutex_te.
|
||||
int instance_cnt_te;
|
||||
/// \brief Instance count for FH processing thread.
|
||||
/// \internal This variable is protected by \ref mutex_FH.
|
||||
int instance_cnt_FH;
|
||||
/// \brief Instance count for rx processing thread.
|
||||
/// \internal This variable is protected by \ref mutex_prach.
|
||||
int instance_cnt_prach;
|
||||
/// \internal This variable is protected by \ref mutex_asynch_rxtx.
|
||||
int instance_cnt_asynch_rxtx;
|
||||
/// pthread structure for FH processing thread
|
||||
pthread_t pthread_FH;
|
||||
/// pthread structure for eNB single processing thread
|
||||
pthread_t pthread_single;
|
||||
/// pthread structure for asychronous RX/TX processing thread
|
||||
pthread_t pthread_asynch_rxtx;
|
||||
/// flag to indicate first RX acquisition
|
||||
int first_rx;
|
||||
/// flag to indicate first TX transmission
|
||||
int first_tx;
|
||||
/// pthread attributes for parallel fep thread
|
||||
pthread_attr_t attr_fep;
|
||||
/// pthread attributes for parallel turbo-decoder thread
|
||||
pthread_attr_t attr_td;
|
||||
/// pthread attributes for parallel turbo-encoder thread
|
||||
pthread_attr_t attr_te;
|
||||
/// pthread attributes for FH processing thread
|
||||
pthread_attr_t attr_FH;
|
||||
/// pthread attributes for single eNB processing thread
|
||||
pthread_attr_t attr_single;
|
||||
/// pthread attributes for prach processing thread
|
||||
pthread_attr_t attr_prach;
|
||||
/// pthread attributes for asynchronous RX thread
|
||||
pthread_attr_t attr_asynch_rxtx;
|
||||
/// scheduling parameters for parallel fep thread
|
||||
struct sched_param sched_param_fep;
|
||||
/// scheduling parameters for parallel turbo-decoder thread
|
||||
struct sched_param sched_param_td;
|
||||
/// scheduling parameters for parallel turbo-encoder thread
|
||||
struct sched_param sched_param_te;
|
||||
/// scheduling parameters for FH thread
|
||||
struct sched_param sched_param_FH;
|
||||
/// scheduling parameters for single eNB thread
|
||||
struct sched_param sched_param_single;
|
||||
/// scheduling parameters for prach thread
|
||||
struct sched_param sched_param_prach;
|
||||
/// scheduling parameters for asynch_rxtx thread
|
||||
struct sched_param sched_param_asynch_rxtx;
|
||||
/// pthread structure for parallel fep thread
|
||||
pthread_t pthread_fep;
|
||||
/// pthread structure for parallel turbo-decoder thread
|
||||
pthread_t pthread_td;
|
||||
/// pthread structure for parallel turbo-encoder thread
|
||||
pthread_t pthread_te;
|
||||
/// pthread structure for PRACH thread
|
||||
pthread_t pthread_prach;
|
||||
/// condition variable for parallel fep thread
|
||||
pthread_cond_t cond_fep;
|
||||
/// condition variable for parallel turbo-decoder thread
|
||||
pthread_cond_t cond_td;
|
||||
/// condition variable for parallel turbo-encoder thread
|
||||
pthread_cond_t cond_te;
|
||||
/// condition variable for FH thread
|
||||
pthread_cond_t cond_FH;
|
||||
/// condition variable for PRACH processing thread;
|
||||
pthread_cond_t cond_prach;
|
||||
/// condition variable for asynch RX/TX thread
|
||||
pthread_cond_t cond_asynch_rxtx;
|
||||
/// mutex for parallel fep thread
|
||||
pthread_mutex_t mutex_fep;
|
||||
/// mutex for parallel turbo-decoder thread
|
||||
pthread_mutex_t mutex_td;
|
||||
/// mutex for parallel turbo-encoder thread
|
||||
pthread_mutex_t mutex_te;
|
||||
/// mutex for FH
|
||||
pthread_mutex_t mutex_FH;
|
||||
/// mutex for PRACH thread
|
||||
pthread_mutex_t mutex_prach;
|
||||
/// mutex for asynch RX/TX thread
|
||||
pthread_mutex_t mutex_asynch_rxtx;
|
||||
/// parameters for turbo-decoding worker thread
|
||||
td_params tdp;
|
||||
/// parameters for turbo-encoding worker thread
|
||||
te_params tep;
|
||||
/// set of scheduling variables RXn-TXnp4 threads
|
||||
eNB_rxtx_proc_t proc_rxtx[2];
|
||||
/// number of slave threads
|
||||
int num_slaves;
|
||||
/// array of pointers to slaves
|
||||
struct eNB_proc_t_s **slave_proc;
|
||||
} eNB_proc_t;
|
||||
|
||||
//! \brief Number of eNB TX and RX threads.
|
||||
//! This number must be equal to the number of LTE subframes (10). Each thread is responsible for a single subframe.
|
||||
#define NUM_ENB_THREADS 10
|
||||
|
||||
/// Context data structure for RX/TX portion of subframe processing
|
||||
typedef struct {
|
||||
/// Component Carrier index
|
||||
uint8_t CC_id;
|
||||
/// timestamp transmitted to HW
|
||||
openair0_timestamp timestamp_tx;
|
||||
/// subframe to act upon for transmission
|
||||
int subframe_tx;
|
||||
/// subframe to act upon for reception
|
||||
int subframe_rx;
|
||||
/// frame to act upon for transmission
|
||||
int frame_tx;
|
||||
/// frame to act upon for reception
|
||||
int frame_rx;
|
||||
/// \brief Instance count for RXn-TXnp4 processing thread.
|
||||
/// \internal This variable is protected by \ref mutex_rxtx.
|
||||
int instance_cnt_rxtx;
|
||||
/// pthread structure for RXn-TXnp4 processing thread
|
||||
pthread_t pthread_rxtx;
|
||||
/// pthread attributes for RXn-TXnp4 processing thread
|
||||
pthread_attr_t attr_rxtx;
|
||||
/// condition variable for tx processing thread
|
||||
pthread_cond_t cond_rxtx;
|
||||
/// mutex for RXn-TXnp4 processing thread
|
||||
pthread_mutex_t mutex_rxtx;
|
||||
/// scheduling parameters for RXn-TXnp4 thread
|
||||
struct sched_param sched_param_rxtx;
|
||||
} UE_rxtx_proc_t;
|
||||
|
||||
/// Context data structure for eNB subframe processing
|
||||
typedef struct {
|
||||
/// Component Carrier index
|
||||
uint8_t CC_id;
|
||||
/// Last RX timestamp
|
||||
openair0_timestamp timestamp_rx;
|
||||
/// pthread attributes for main UE thread
|
||||
pthread_attr_t attr_ue;
|
||||
/// scheduling parameters for main UE thread
|
||||
struct sched_param sched_param_ue;
|
||||
/// pthread descriptor main UE thread
|
||||
pthread_t pthread_ue;
|
||||
/// \brief Instance count for synch thread.
|
||||
/// \internal This variable is protected by \ref mutex_synch.
|
||||
int instance_cnt_synch;
|
||||
/// pthread attributes for synch processing thread
|
||||
pthread_attr_t attr_synch;
|
||||
/// scheduling parameters for synch thread
|
||||
struct sched_param sched_param_synch;
|
||||
/// pthread descriptor synch thread
|
||||
pthread_t pthread_synch;
|
||||
/// condition variable for UE synch thread;
|
||||
pthread_cond_t cond_synch;
|
||||
/// mutex for UE synch thread
|
||||
pthread_mutex_t mutex_synch;
|
||||
/// set of scheduling variables RXn-TXnp4 threads
|
||||
UE_rxtx_proc_t proc_rxtx[2];
|
||||
} UE_proc_t;
|
||||
|
||||
/// Top-level PHY Data Structure for eNB
|
||||
typedef struct PHY_VARS_eNB_s {
|
||||
/// Module ID indicator for this instance
|
||||
module_id_t Mod_id;
|
||||
uint8_t CC_id;
|
||||
eNB_proc_t proc[NUM_ENB_THREADS];
|
||||
eNB_proc_t proc;
|
||||
eNB_func_t node_function;
|
||||
eNB_timing_t node_timing;
|
||||
int single_thread_flag;
|
||||
openair0_rf_map rf_map;
|
||||
int abstraction_flag;
|
||||
void (*do_prach)(struct PHY_VARS_eNB_s *eNB);
|
||||
void (*fep)(struct PHY_VARS_eNB_s *eNB);
|
||||
int (*td)(struct PHY_VARS_eNB_s *eNB,int UE_id,int harq_pid,int llr8_flag);
|
||||
int (*te)(struct PHY_VARS_eNB_s *,uint8_t *,uint8_t,LTE_eNB_DLSCH_t *,int,uint8_t,time_stats_t *,time_stats_t *,time_stats_t *);
|
||||
void (*proc_uespec_rx)(struct PHY_VARS_eNB_s *eNB,eNB_rxtx_proc_t *proc,const relaying_type_t r_type);
|
||||
void (*proc_tx)(struct PHY_VARS_eNB_s *eNB,eNB_rxtx_proc_t *proc,relaying_type_t r_type,PHY_VARS_RN *rn);
|
||||
void (*tx_fh)(struct PHY_VARS_eNB_s *eNB,eNB_rxtx_proc_t *proc);
|
||||
void (*rx_fh)(struct PHY_VARS_eNB_s *eNB,int *frame, int *subframe);
|
||||
int (*start_rf)(struct PHY_VARS_eNB_s *eNB);
|
||||
int (*start_if)(struct PHY_VARS_eNB_s *eNB);
|
||||
void (*fh_asynch)(struct PHY_VARS_eNB_s *eNB,int *frame, int *subframe);
|
||||
uint8_t local_flag;
|
||||
uint32_t rx_total_gain_eNB_dB;
|
||||
LTE_DL_FRAME_PARMS lte_frame_parms;
|
||||
PHY_MEASUREMENTS_eNB PHY_measurements_eNB[NUMBER_OF_eNB_SECTORS_MAX]; /// Measurement variables
|
||||
LTE_eNB_COMMON lte_eNB_common_vars;
|
||||
LTE_eNB_SRS lte_eNB_srs_vars[NUMBER_OF_UE_MAX];
|
||||
LTE_eNB_PBCH lte_eNB_pbch;
|
||||
uint32_t rx_total_gain_dB;
|
||||
LTE_DL_FRAME_PARMS frame_parms;
|
||||
PHY_MEASUREMENTS_eNB measurements[NUMBER_OF_eNB_SECTORS_MAX]; /// Measurement variables
|
||||
LTE_eNB_COMMON common_vars;
|
||||
LTE_eNB_SRS srs_vars[NUMBER_OF_UE_MAX];
|
||||
LTE_eNB_PBCH pbch;
|
||||
/// \brief ?.
|
||||
/// - first index: UE [0..NUMBER_OF_UE_MAX[ (hard coded)
|
||||
/// - second index: UE [0..NUMBER_OF_UE_MAX[
|
||||
LTE_eNB_PUSCH *lte_eNB_pusch_vars[NUMBER_OF_UE_MAX];
|
||||
LTE_eNB_PRACH lte_eNB_prach_vars;
|
||||
LTE_eNB_DLSCH_t *dlsch_eNB[NUMBER_OF_UE_MAX][2]; // Nusers times two spatial streams
|
||||
// old: LTE_eNB_DLSCH_t **dlsch_eNB[2]; // Nusers times two spatial streams
|
||||
LTE_eNB_ULSCH_t *ulsch_eNB[NUMBER_OF_UE_MAX+1]; // Nusers + number of RA
|
||||
LTE_eNB_DLSCH_t *dlsch_eNB_SI,*dlsch_eNB_ra;
|
||||
LTE_eNB_DLSCH_t *dlsch_eNB_MCH;
|
||||
LTE_eNB_UE_stats eNB_UE_stats[NUMBER_OF_UE_MAX];
|
||||
LTE_eNB_UE_stats *eNB_UE_stats_ptr[NUMBER_OF_UE_MAX];
|
||||
LTE_eNB_PUSCH *pusch_vars[NUMBER_OF_UE_MAX];
|
||||
LTE_eNB_PRACH prach_vars;
|
||||
LTE_eNB_DLSCH_t *dlsch[NUMBER_OF_UE_MAX][2]; // Nusers times two spatial streams
|
||||
LTE_eNB_ULSCH_t *ulsch[NUMBER_OF_UE_MAX+1]; // Nusers + number of RA
|
||||
LTE_eNB_DLSCH_t *dlsch_SI,*dlsch_ra;
|
||||
LTE_eNB_DLSCH_t *dlsch_MCH;
|
||||
LTE_eNB_UE_stats UE_stats[NUMBER_OF_UE_MAX];
|
||||
LTE_eNB_UE_stats *UE_stats_ptr[NUMBER_OF_UE_MAX];
|
||||
|
||||
/// cell-specific reference symbols
|
||||
uint32_t lte_gold_table[20][2][14];
|
||||
@@ -301,6 +504,15 @@ typedef struct PHY_VARS_eNB_s {
|
||||
MU_MIMO_mode mu_mimo_mode[NUMBER_OF_UE_MAX];
|
||||
|
||||
|
||||
/// target_ue_dl_mcs : only for debug purposes
|
||||
uint32_t target_ue_dl_mcs;
|
||||
/// target_ue_ul_mcs : only for debug purposes
|
||||
uint32_t target_ue_ul_mcs;
|
||||
/// target_ue_dl_rballoc : only for debug purposes
|
||||
uint32_t ue_dl_rb_alloc;
|
||||
/// target ul PRBs : only for debug
|
||||
uint32_t ue_ul_nb_rb;
|
||||
|
||||
///check for Total Transmissions
|
||||
uint32_t check_for_total_transmissions;
|
||||
|
||||
@@ -318,14 +530,11 @@ typedef struct PHY_VARS_eNB_s {
|
||||
uint32_t total_transmitted_bits;
|
||||
uint32_t total_system_throughput;
|
||||
|
||||
int hw_timing_advance;
|
||||
|
||||
time_stats_t phy_proc;
|
||||
time_stats_t phy_proc_tx;
|
||||
time_stats_t phy_proc_rx;
|
||||
/*
|
||||
time_stats_t phy_proc_sf[10]; // for each subframe
|
||||
time_stats_t phy_proc_tx_sf[10];
|
||||
time_stats_t phy_proc_rx_sf[10];
|
||||
*/
|
||||
time_stats_t rx_prach;
|
||||
|
||||
time_stats_t ofdm_mod_stats;
|
||||
@@ -370,22 +579,16 @@ typedef struct PHY_VARS_eNB_s {
|
||||
int32_t pusch_stats_mcs[NUMBER_OF_UE_MAX][10240];
|
||||
int32_t pusch_stats_bsr[NUMBER_OF_UE_MAX][10240];
|
||||
int32_t pusch_stats_BO[NUMBER_OF_UE_MAX][10240];
|
||||
#if ENABLE_RAL
|
||||
hash_table_t *ral_thresholds_timed;
|
||||
SLIST_HEAD(ral_thresholds_gen_poll_enb_s, ral_threshold_phy_t) ral_thresholds_gen_polled[RAL_LINK_PARAM_GEN_MAX];
|
||||
SLIST_HEAD(ral_thresholds_lte_poll_enb_s, ral_threshold_phy_t) ral_thresholds_lte_polled[RAL_LINK_PARAM_LTE_MAX];
|
||||
#endif
|
||||
|
||||
/// RF and Interface devices per CC
|
||||
openair0_device rfdevice;
|
||||
openair0_device ifdevice;
|
||||
/// Pointer for ifdevice buffer struct
|
||||
if_buffer_t ifbuffer;
|
||||
|
||||
} PHY_VARS_eNB;
|
||||
|
||||
#define debug_msg if (((mac_xface->frame%100) == 0) || (mac_xface->frame < 50)) msg
|
||||
//#define debug_msg msg
|
||||
|
||||
/*
|
||||
typedef enum {
|
||||
max_gain=0,med_gain,byp_gain
|
||||
} rx_gain_t;
|
||||
*/
|
||||
|
||||
/// Top-level PHY Data Structure for UE
|
||||
typedef struct {
|
||||
@@ -393,6 +596,8 @@ typedef struct {
|
||||
uint8_t Mod_id;
|
||||
/// \brief Component carrier ID for this PHY instance
|
||||
uint8_t CC_id;
|
||||
/// \brief Mapping of CC_id antennas to cards
|
||||
openair0_rf_map rf_map;
|
||||
//uint8_t local_flag;
|
||||
/// \brief Indicator of current run mode of UE (normal_txrx, rx_calib_ue, no_L2_connect, debug_prach)
|
||||
runmode_t mode;
|
||||
@@ -402,34 +607,10 @@ typedef struct {
|
||||
int UE_scan_carrier;
|
||||
/// \brief Indicator that UE is synchronized to an eNB
|
||||
int is_synchronized;
|
||||
/// \brief Instance count of TX processing thread (-1 means ready, 0 means busy)
|
||||
int instance_cnt_tx;
|
||||
/// \brief Instance count of RX processing thread (-1 means ready, 0 means busy)
|
||||
int instance_cnt_rx;
|
||||
/// \brief Instance count of initial synchronization thread (-1 means ready, 0 means busy).
|
||||
/// Protected by mutex \ref mutex_synch and condition \ref cond_synch.
|
||||
int instance_cnt_synch;
|
||||
/// \brief Condition variable for TX processing thread
|
||||
pthread_cond_t cond_tx;
|
||||
/// \brief Condition variable for RX processing thread
|
||||
pthread_cond_t cond_rx;
|
||||
/// \brief Condition variable for initial synchronization thread.
|
||||
/// The corresponding mutex is \ref mutex_synch.
|
||||
pthread_cond_t cond_synch;
|
||||
/// \brief Mutex for TX processing thread
|
||||
pthread_mutex_t mutex_tx;
|
||||
/// \brief Mutex for RX processing thread
|
||||
pthread_mutex_t mutex_rx;
|
||||
/// \brief Mutex for initial synchronization thread.
|
||||
/// Used to protect \ref instance_cnt_synch.
|
||||
/// \sa cond_synch
|
||||
pthread_mutex_t mutex_synch;
|
||||
/// \brief Pthread structure for RX processing thread
|
||||
pthread_t thread_rx;
|
||||
/// \brief Pthread structure for TX processing thread
|
||||
pthread_t thread_tx;
|
||||
/// \brief Pthread structure to RX processing thread
|
||||
pthread_t thread_synch;
|
||||
/// Data structure for UE process scheduling
|
||||
UE_proc_t proc;
|
||||
/// Flag to indicate the UE shouldn't do timing correction at all
|
||||
int no_timing_correction;
|
||||
/// \brief Total gain of the TX chain (16-bit baseband I/Q to antenna)
|
||||
uint32_t tx_total_gain_dB;
|
||||
/// \brief Total gain of the RX chain (antenna to baseband I/Q) This is a function of rx_gain_mode (and the corresponding gain) and the rx_gain of the card.
|
||||
@@ -441,15 +622,11 @@ typedef struct {
|
||||
/// \brief Total gains with bypassed RF gain stage (ExpressMIMO2/Lime)
|
||||
uint32_t rx_gain_byp[4];
|
||||
/// \brief Current transmit power
|
||||
int8_t tx_power_dBm;
|
||||
int8_t tx_power_dBm[10];
|
||||
/// \brief Total number of REs in current transmission
|
||||
int tx_total_RE;
|
||||
int tx_total_RE[10];
|
||||
/// \brief Maximum transmit power
|
||||
int8_t tx_power_max_dBm;
|
||||
/// \brief Frame counters for TX and RX processing
|
||||
uint32_t frame_rx,frame_tx;
|
||||
/// \brief Slot counters for TX and RX processing
|
||||
uint32_t slot_tx,slot_rx;
|
||||
/// \brief Number of eNB seen by UE
|
||||
uint8_t n_connected_eNB;
|
||||
/// \brief indicator that Handover procedure has been initiated
|
||||
@@ -457,29 +634,35 @@ typedef struct {
|
||||
/// \brief indicator that Handover procedure has been triggered
|
||||
uint8_t ho_triggered;
|
||||
/// \brief Measurement variables.
|
||||
PHY_MEASUREMENTS PHY_measurements;
|
||||
LTE_DL_FRAME_PARMS lte_frame_parms;
|
||||
PHY_MEASUREMENTS measurements;
|
||||
LTE_DL_FRAME_PARMS frame_parms;
|
||||
/// \brief Frame parame before ho used to recover if ho fails.
|
||||
LTE_DL_FRAME_PARMS lte_frame_parms_before_ho;
|
||||
LTE_UE_COMMON lte_ue_common_vars;
|
||||
LTE_DL_FRAME_PARMS frame_parms_before_ho;
|
||||
LTE_UE_COMMON common_vars;
|
||||
|
||||
LTE_UE_PDSCH *lte_ue_pdsch_vars[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
||||
LTE_UE_PDSCH_FLP *lte_ue_pdsch_vars_flp[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
||||
LTE_UE_PDSCH *lte_ue_pdsch_vars_SI[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
||||
LTE_UE_PDSCH *lte_ue_pdsch_vars_ra[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
||||
LTE_UE_PDSCH *lte_ue_pdsch_vars_MCH[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
LTE_UE_PBCH *lte_ue_pbch_vars[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
LTE_UE_PDCCH *lte_ue_pdcch_vars[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
LTE_UE_PRACH *lte_ue_prach_vars[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
LTE_UE_DLSCH_t *dlsch_ue[NUMBER_OF_CONNECTED_eNB_MAX][2];
|
||||
LTE_UE_ULSCH_t *ulsch_ue[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
LTE_UE_DLSCH_t *dlsch_ue_col[NUMBER_OF_CONNECTED_eNB_MAX][2];
|
||||
LTE_UE_DLSCH_t *ulsch_ue_col[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
LTE_UE_DLSCH_t *dlsch_ue_SI[NUMBER_OF_CONNECTED_eNB_MAX],*dlsch_ue_ra[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
LTE_UE_DLSCH_t *dlsch_ue_MCH[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
LTE_UE_PDSCH *pdsch_vars[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
||||
LTE_UE_PDSCH_FLP *pdsch_vars_flp[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
||||
LTE_UE_PDSCH *pdsch_vars_SI[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
||||
LTE_UE_PDSCH *pdsch_vars_ra[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
||||
LTE_UE_PDSCH *pdsch_vars_p[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
||||
LTE_UE_PDSCH *pdsch_vars_MCH[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
LTE_UE_PBCH *pbch_vars[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
LTE_UE_PDCCH *pdcch_vars[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
LTE_UE_PRACH *prach_vars[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
LTE_UE_DLSCH_t *dlsch[NUMBER_OF_CONNECTED_eNB_MAX][2];
|
||||
LTE_UE_ULSCH_t *ulsch[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
LTE_UE_DLSCH_t *dlsch_SI[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
LTE_UE_DLSCH_t *dlsch_ra[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
LTE_UE_DLSCH_t *dlsch_p[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
LTE_UE_DLSCH_t *dlsch_MCH[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
// This is for SIC in the UE, to store the reencoded data
|
||||
LTE_eNB_DLSCH_t *dlsch_eNB[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
|
||||
//Paging parameters
|
||||
uint32_t IMSImod1024;
|
||||
uint32_t PF;
|
||||
uint32_t PO;
|
||||
|
||||
// For abstraction-purposes only
|
||||
uint8_t sr[10];
|
||||
uint8_t pucch_sel[10];
|
||||
@@ -500,15 +683,17 @@ typedef struct {
|
||||
uint32_t high_speed_flag;
|
||||
uint32_t perfect_ce;
|
||||
int16_t ch_est_alpha;
|
||||
int generate_ul_signal[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
|
||||
UE_SCAN_INFO_t scan_info[NB_BANDS_MAX];
|
||||
|
||||
char ulsch_no_allocation_counter[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
|
||||
unsigned char ulsch_ue_Msg3_active[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
uint32_t ulsch_ue_Msg3_frame[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
unsigned char ulsch_ue_Msg3_subframe[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
// unsigned char Msg3_timer[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
//unsigned char *Msg3_ptr[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
|
||||
|
||||
unsigned char ulsch_Msg3_active[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
uint32_t ulsch_Msg3_frame[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
unsigned char ulsch_Msg3_subframe[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
PRACH_RESOURCES_t *prach_resources[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
int turbo_iterations, turbo_cntl_iterations;
|
||||
/// \brief ?.
|
||||
@@ -532,6 +717,8 @@ typedef struct {
|
||||
int dlsch_SI_errors[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
int dlsch_ra_received[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
int dlsch_ra_errors[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
int dlsch_p_received[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
int dlsch_p_errors[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
int dlsch_mch_received_sf[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
int dlsch_mch_received[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
int dlsch_mcch_received[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX];
|
||||
@@ -548,6 +735,7 @@ typedef struct {
|
||||
// uint8_t prach_timer;
|
||||
int rx_offset; /// Timing offset
|
||||
int timing_advance; ///timing advance signalled from eNB
|
||||
int hw_timing_advance;
|
||||
int N_TA_offset; ///timing offset used in TDD
|
||||
/// Flag to tell if UE is secondary user (cognitive mode)
|
||||
unsigned char is_secondary_ue;
|
||||
@@ -616,6 +804,8 @@ typedef struct {
|
||||
time_stats_t phy_proc_tx;
|
||||
time_stats_t phy_proc_rx;
|
||||
|
||||
uint32_t use_ia_receiver;
|
||||
|
||||
time_stats_t ofdm_mod_stats;
|
||||
time_stats_t ulsch_encoding_stats;
|
||||
time_stats_t ulsch_modulation_stats;
|
||||
@@ -649,26 +839,75 @@ typedef struct {
|
||||
time_stats_t dlsch_tc_intl2_stats;
|
||||
time_stats_t tx_prach;
|
||||
|
||||
#if ENABLE_RAL
|
||||
hash_table_t *ral_thresholds_timed;
|
||||
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
|
||||
/// RF and Interface devices per CC
|
||||
openair0_device rfdevice;
|
||||
|
||||
} PHY_VARS_UE;
|
||||
|
||||
/// Top-level PHY Data Structure for RN
|
||||
typedef struct {
|
||||
/// Module ID indicator for this instance
|
||||
uint8_t Mod_id;
|
||||
uint32_t frame;
|
||||
// phy_vars_eNB
|
||||
// phy_vars ue
|
||||
// cuurently only used to store and forward the PMCH
|
||||
uint8_t mch_avtive[10];
|
||||
uint8_t sync_area[10]; // num SF
|
||||
LTE_UE_DLSCH_t *dlsch_rn_MCH[10];
|
||||
void exit_fun(const char* s);
|
||||
|
||||
inline int wait_on_condition(pthread_mutex_t *mutex,pthread_cond_t *cond,int *instance_cnt,char *name) {
|
||||
|
||||
if (pthread_mutex_lock(mutex) != 0) {
|
||||
LOG_E( PHY, "[SCHED][eNB] error locking mutex for %s\n",name);
|
||||
exit_fun("nothing to add");
|
||||
return(-1);
|
||||
}
|
||||
|
||||
while (*instance_cnt < 0) {
|
||||
// most of the time the thread is waiting here
|
||||
// proc->instance_cnt_rxtx is -1
|
||||
pthread_cond_wait(cond,mutex); // this unlocks mutex_rxtx while waiting and then locks it again
|
||||
}
|
||||
|
||||
if (pthread_mutex_unlock(mutex) != 0) {
|
||||
LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for %s\n",name);
|
||||
exit_fun("nothing to add");
|
||||
return(-1);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
inline int wait_on_busy_condition(pthread_mutex_t *mutex,pthread_cond_t *cond,int *instance_cnt,char *name) {
|
||||
|
||||
if (pthread_mutex_lock(mutex) != 0) {
|
||||
LOG_E( PHY, "[SCHED][eNB] error locking mutex for %s\n",name);
|
||||
exit_fun("nothing to add");
|
||||
return(-1);
|
||||
}
|
||||
|
||||
while (*instance_cnt == 0) {
|
||||
// most of the time the thread will skip this
|
||||
// waits only if proc->instance_cnt_rxtx is 0
|
||||
pthread_cond_wait(cond,mutex); // this unlocks mutex_rxtx while waiting and then locks it again
|
||||
}
|
||||
|
||||
if (pthread_mutex_unlock(mutex) != 0) {
|
||||
LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for %s\n",name);
|
||||
exit_fun("nothing to add");
|
||||
return(-1);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
inline int release_thread(pthread_mutex_t *mutex,int *instance_cnt,char *name) {
|
||||
|
||||
if (pthread_mutex_lock(mutex) != 0) {
|
||||
LOG_E( PHY, "[SCHED][eNB] error locking mutex for %s\n",name);
|
||||
exit_fun("nothing to add");
|
||||
return(-1);
|
||||
}
|
||||
|
||||
*instance_cnt=*instance_cnt-1;
|
||||
|
||||
if (pthread_mutex_unlock(mutex) != 0) {
|
||||
LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for %s\n",name);
|
||||
exit_fun("nothing to add");
|
||||
return(-1);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
} PHY_VARS_RN;
|
||||
|
||||
#include "PHY/INIT/defs.h"
|
||||
#include "PHY/LTE_REFSIG/defs.h"
|
||||
@@ -677,13 +916,5 @@ typedef struct {
|
||||
#include "PHY/LTE_ESTIMATION/defs.h"
|
||||
|
||||
#include "SIMULATION/ETH_TRANSPORT/defs.h"
|
||||
#endif //OPENAIR_LTE
|
||||
|
||||
|
||||
#endif // __PHY_DEFS__H__
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -83,6 +83,12 @@ extern double p_qam64[8];
|
||||
extern double beta1_dlsch[6][MCS_COUNT];
|
||||
extern double beta2_dlsch[6][MCS_COUNT];
|
||||
|
||||
extern char eNB_functions[6][20];
|
||||
extern char eNB_timing[2][20];
|
||||
|
||||
|
||||
extern int16_t unscrambling_lut[65536*16];
|
||||
extern uint8_t scrambling_lut[65536*16];
|
||||
|
||||
#endif /*__PHY_EXTERN_H__ */
|
||||
|
||||
|
||||
@@ -578,34 +578,34 @@ typedef struct {
|
||||
int32_t **txdataF[3];
|
||||
/// \brief Holds the received data in time domain.
|
||||
/// Should point to the same memory as PHY_vars->rx_vars[a].RX_DMA_BUFFER.
|
||||
/// - first index: eNB id [0..2] (hard coded)
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna [0..nb_antennas_rx[
|
||||
/// - third index: sample [0..]
|
||||
int32_t **rxdata[3];
|
||||
/// \brief Holds the last subframe of received data in time domain after removal of 7.5kHz frequency offset.
|
||||
/// - first index: eNB id [0..2] (hard coded)
|
||||
/// - first index: secotr id [0..2] (hard coded)
|
||||
/// - second index: rx antenna [0..nb_antennas_rx[
|
||||
/// - third index: sample [0..samples_per_tti[
|
||||
int32_t **rxdata_7_5kHz[3];
|
||||
/// \brief Holds the received data in the frequency domain.
|
||||
/// - first index: eNB id [0..2] (hard coded)
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..2*ofdm_symbol_size*frame_parms->symbols_per_tti[
|
||||
int32_t **rxdataF[3];
|
||||
/// \brief Holds output of the sync correlator.
|
||||
/// - first index: eNB id [0..2] (hard coded)
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: sample [0..samples_per_tti*10[
|
||||
uint32_t *sync_corr[3];
|
||||
} LTE_eNB_COMMON;
|
||||
|
||||
typedef struct {
|
||||
/// \brief Hold the channel estimates in frequency domain based on SRS.
|
||||
/// - first index: eNB id [0..2] (hard coded)
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..ofdm_symbol_size[
|
||||
int32_t **srs_ch_estimates[3];
|
||||
/// \brief Hold the channel estimates in time domain based on SRS.
|
||||
/// - first index: eNB id [0..2] (hard coded)
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..2*ofdm_symbol_size[
|
||||
int32_t **srs_ch_estimates_time[3];
|
||||
@@ -616,54 +616,54 @@ typedef struct {
|
||||
|
||||
typedef struct {
|
||||
/// \brief Holds the received data in the frequency domain for the allocated RBs in repeated format.
|
||||
/// - first index: eNB id [0..2] (hard coded)
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..2*ofdm_symbol_size[
|
||||
/// - third index (definition from phy_init_lte_eNB()): ? [0..24*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
/// \warning inconsistent third index definition
|
||||
int32_t **rxdataF_ext[3];
|
||||
/// \brief Holds the received data in the frequency domain for the allocated RBs in normal format.
|
||||
/// - first index: eNB id [0..2] (hard coded)
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index (definition from phy_init_lte_eNB()): ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **rxdataF_ext2[3];
|
||||
/// \brief Hold the channel estimates in time domain based on DRS.
|
||||
/// - first index: eNB id [0..2] (hard coded)
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..4*ofdm_symbol_size[
|
||||
int32_t **drs_ch_estimates_time[3];
|
||||
/// \brief Hold the channel estimates in frequency domain based on DRS.
|
||||
/// - first index: eNB id [0..2] (hard coded)
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **drs_ch_estimates[3];
|
||||
/// \brief Hold the channel estimates for UE0 in case of Distributed Alamouti Scheme.
|
||||
/// - first index: eNB id [0..2] (hard coded)
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **drs_ch_estimates_0[3];
|
||||
/// \brief Hold the channel estimates for UE1 in case of Distributed Almouti Scheme.
|
||||
/// - first index: eNB id [0..2] (hard coded)
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **drs_ch_estimates_1[3];
|
||||
/// \brief Holds the compensated signal.
|
||||
/// - first index: eNB id [0..2] (hard coded)
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **rxdataF_comp[3];
|
||||
/// \brief Hold the compensated data (y)*(h0*) in case of Distributed Alamouti Scheme.
|
||||
/// - first index: eNB id [0..2] (hard coded)
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **rxdataF_comp_0[3];
|
||||
/// \brief Hold the compensated data (y*)*(h1) in case of Distributed Alamouti Scheme.
|
||||
/// - first index: eNB id [0..2] (hard coded)
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **rxdataF_comp_1[3];
|
||||
/// \brief ?.
|
||||
/// - first index: eNB id [0..2] (hard coded)
|
||||
/// - first index: sector id [0..2] (hard coded)
|
||||
/// - second index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **ul_ch_mag[3];
|
||||
|
||||
@@ -111,6 +111,13 @@ double beta2_dlsch[6][MCS_COUNT] = { {2.52163, 0.83231, 0.77472, 1.36536, 1.1682
|
||||
|
||||
*/
|
||||
|
||||
char eNB_functions[6][20]={"eNodeB_3GPP","eNodeB_3GPP_BBU","NGFI_RCC_IF4p5","NGFI_RAI_IF4p5","NGFI_RRU_IF5","NGFI_RRU_IF4p5",};
|
||||
char eNB_timing[2][20]={"synch_to_ext_device","synch_to_other"};
|
||||
|
||||
/// lookup table for unscrambling in RX
|
||||
int16_t unscrambling_lut[65536*16] __attribute__((aligned(32)));
|
||||
/// lookup table for scrambling in TX
|
||||
uint8_t scrambling_lut[65536*16] __attribute__((aligned(32)));
|
||||
|
||||
|
||||
#endif /*__PHY_VARS_H__ */
|
||||
|
||||
Reference in New Issue
Block a user