reworking UL antenna port definitions at gNB
This commit is contained in:
+20
-15
@@ -121,6 +121,7 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
|
|||||||
int i;
|
int i;
|
||||||
int Ptx=cfg->carrier_config.num_tx_ant.value;
|
int Ptx=cfg->carrier_config.num_tx_ant.value;
|
||||||
int Prx=cfg->carrier_config.num_rx_ant.value;
|
int Prx=cfg->carrier_config.num_rx_ant.value;
|
||||||
|
int max_ul_mimo_layers = 4;
|
||||||
|
|
||||||
AssertFatal(Ptx>0 && Ptx<9,"Ptx %d is not supported\n",Ptx);
|
AssertFatal(Ptx>0 && Ptx<9,"Ptx %d is not supported\n",Ptx);
|
||||||
AssertFatal(Prx>0 && Prx<9,"Prx %d is not supported\n",Prx);
|
AssertFatal(Prx>0 && Prx<9,"Prx %d is not supported\n",Prx);
|
||||||
@@ -295,27 +296,30 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
|
|||||||
init_prach_list(gNB);
|
init_prach_list(gNB);
|
||||||
|
|
||||||
int N_RB_UL = cfg->carrier_config.ul_grid_size[cfg->ssb_config.scs_common.value].value;
|
int N_RB_UL = cfg->carrier_config.ul_grid_size[cfg->ssb_config.scs_common.value].value;
|
||||||
|
int n_buf = Prx*max_ul_mimo_layers;
|
||||||
|
|
||||||
for (int ULSCH_id=0; ULSCH_id<gNB->number_of_nr_ulsch_max; ULSCH_id++) {
|
for (int ULSCH_id=0; ULSCH_id<gNB->number_of_nr_ulsch_max; ULSCH_id++) {
|
||||||
pusch_vars[ULSCH_id] = (NR_gNB_PUSCH *)malloc16_clear( sizeof(NR_gNB_PUSCH) );
|
pusch_vars[ULSCH_id] = (NR_gNB_PUSCH *)malloc16_clear( sizeof(NR_gNB_PUSCH) );
|
||||||
pusch_vars[ULSCH_id]->rxdataF_ext = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
pusch_vars[ULSCH_id]->rxdataF_ext = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
||||||
pusch_vars[ULSCH_id]->rxdataF_ext2 = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
pusch_vars[ULSCH_id]->rxdataF_ext2 = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
||||||
pusch_vars[ULSCH_id]->ul_ch_estimates = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
pusch_vars[ULSCH_id]->ul_ch_estimates = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
|
||||||
pusch_vars[ULSCH_id]->ul_ch_estimates_ext = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
pusch_vars[ULSCH_id]->ul_ch_estimates_ext = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
|
||||||
pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
|
||||||
pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
|
||||||
pusch_vars[ULSCH_id]->ptrs_phase_per_slot = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
pusch_vars[ULSCH_id]->ptrs_phase_per_slot = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
|
||||||
pusch_vars[ULSCH_id]->ul_ch_estimates_time = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
pusch_vars[ULSCH_id]->ul_ch_estimates_time = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
|
||||||
pusch_vars[ULSCH_id]->rxdataF_comp = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
pusch_vars[ULSCH_id]->rxdataF_comp = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
|
||||||
pusch_vars[ULSCH_id]->ul_ch_mag0 = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
pusch_vars[ULSCH_id]->ul_ch_mag0 = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
|
||||||
pusch_vars[ULSCH_id]->ul_ch_magb0 = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
pusch_vars[ULSCH_id]->ul_ch_magb0 = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
|
||||||
pusch_vars[ULSCH_id]->ul_ch_mag = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
pusch_vars[ULSCH_id]->ul_ch_mag = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
|
||||||
pusch_vars[ULSCH_id]->ul_ch_magb = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
|
pusch_vars[ULSCH_id]->ul_ch_magb = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
|
||||||
pusch_vars[ULSCH_id]->rho = (int32_t **)malloc16_clear(Prx*sizeof(int32_t*) );
|
pusch_vars[ULSCH_id]->rho = (int32_t **)malloc16_clear(n_buf*sizeof(int32_t*) );
|
||||||
|
|
||||||
for (i=0; i<Prx; i++) {
|
for (i=0; i<Prx; i++) {
|
||||||
pusch_vars[ULSCH_id]->rxdataF_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
|
pusch_vars[ULSCH_id]->rxdataF_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
|
||||||
pusch_vars[ULSCH_id]->rxdataF_ext2[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
|
pusch_vars[ULSCH_id]->rxdataF_ext2[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
|
||||||
|
}
|
||||||
|
for (i=0; i<n_buf; i++) {
|
||||||
pusch_vars[ULSCH_id]->ul_ch_estimates[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2*fp->symbols_per_slot );
|
pusch_vars[ULSCH_id]->ul_ch_estimates[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2*fp->symbols_per_slot );
|
||||||
pusch_vars[ULSCH_id]->ul_ch_estimates_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
|
pusch_vars[ULSCH_id]->ul_ch_estimates_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
|
||||||
pusch_vars[ULSCH_id]->ul_ch_estimates_time[i] = (int32_t *)malloc16_clear( 2*sizeof(int32_t)*fp->ofdm_symbol_size );
|
pusch_vars[ULSCH_id]->ul_ch_estimates_time[i] = (int32_t *)malloc16_clear( 2*sizeof(int32_t)*fp->ofdm_symbol_size );
|
||||||
@@ -341,7 +345,7 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
|
void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
|
||||||
{
|
{
|
||||||
//NR_DL_FRAME_PARMS* const fp = &gNB->frame_parms;
|
NR_DL_FRAME_PARMS* const fp = &gNB->frame_parms;
|
||||||
NR_gNB_COMMON *const common_vars = &gNB->common_vars;
|
NR_gNB_COMMON *const common_vars = &gNB->common_vars;
|
||||||
NR_gNB_PUSCH **const pusch_vars = gNB->pusch_vars;
|
NR_gNB_PUSCH **const pusch_vars = gNB->pusch_vars;
|
||||||
/*LTE_eNB_SRS *const srs_vars = gNB->srs_vars;
|
/*LTE_eNB_SRS *const srs_vars = gNB->srs_vars;
|
||||||
@@ -382,9 +386,11 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
|
|||||||
free_and_zero(prach_vars->rxsigF[0]);
|
free_and_zero(prach_vars->rxsigF[0]);
|
||||||
*/
|
*/
|
||||||
for (int ULSCH_id=0; ULSCH_id<gNB->number_of_nr_ulsch_max; ULSCH_id++) {
|
for (int ULSCH_id=0; ULSCH_id<gNB->number_of_nr_ulsch_max; ULSCH_id++) {
|
||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < fp->nb_antennas_rx; i++) {
|
||||||
free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext[i]);
|
free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext[i]);
|
||||||
free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext2[i]);
|
free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext2[i]);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 4*fp->nb_antennas_rx; i++) {
|
||||||
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates[i]);
|
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates[i]);
|
||||||
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_ext[i]);
|
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_ext[i]);
|
||||||
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_time[i]);
|
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_time[i]);
|
||||||
@@ -398,7 +404,6 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
|
|||||||
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_magb[i]);
|
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_magb[i]);
|
||||||
free_and_zero(pusch_vars[ULSCH_id]->rho[i]);
|
free_and_zero(pusch_vars[ULSCH_id]->rho[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext);
|
free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext);
|
||||||
free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext2);
|
free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext2);
|
||||||
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates);
|
free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates);
|
||||||
|
|||||||
@@ -198,9 +198,8 @@ int nr_init_frame_parms(nfapi_nr_config_request_scf_t* cfg,
|
|||||||
|
|
||||||
fp->slots_per_frame = 10* fp->slots_per_subframe;
|
fp->slots_per_frame = 10* fp->slots_per_subframe;
|
||||||
|
|
||||||
fp->nb_antenna_ports_gNB = 1; // It corresponds to the number of common antenna ports
|
|
||||||
fp->nb_antennas_rx = cfg->carrier_config.num_rx_ant.value; // It denotes the number of rx antennas at gNB
|
fp->nb_antennas_rx = cfg->carrier_config.num_rx_ant.value; // It denotes the number of rx antennas at gNB
|
||||||
fp->nb_antennas_tx = cfg->carrier_config.num_tx_ant.value; // It corresponds to pdsch_AntennaPorts
|
fp->nb_antennas_tx = cfg->carrier_config.num_tx_ant.value; // It corresponds to pdsch_AntennaPorts (logical antenna ports)
|
||||||
|
|
||||||
fp->symbols_per_slot = ((Ncp == NORMAL)? 14 : 12); // to redefine for different slot formats
|
fp->symbols_per_slot = ((Ncp == NORMAL)? 14 : 12); // to redefine for different slot formats
|
||||||
fp->samples_per_subframe_wCP = fp->ofdm_symbol_size * fp->symbols_per_slot * fp->slots_per_subframe;
|
fp->samples_per_subframe_wCP = fp->ofdm_symbol_size * fp->symbols_per_slot * fp->slots_per_subframe;
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB,int first_symb,int num_symb) {
|
|||||||
//
|
//
|
||||||
// Todo:
|
// Todo:
|
||||||
// - averaging IIR filter for RX power and noise
|
// - averaging IIR filter for RX power and noise
|
||||||
void nr_gnb_measurements(PHY_VARS_gNB *gNB, uint8_t ulsch_id, unsigned char harq_pid, unsigned char symbol){
|
void nr_gnb_measurements(PHY_VARS_gNB *gNB, uint8_t ulsch_id, unsigned char harq_pid, unsigned char symbol, uint8_t nrOfLayers){
|
||||||
|
|
||||||
int rx_power_tot[NUMBER_OF_NR_ULSCH_MAX];
|
int rx_power_tot[NUMBER_OF_NR_ULSCH_MAX];
|
||||||
int rx_power[NUMBER_OF_NR_ULSCH_MAX][NB_ANTENNAS_RX];
|
int rx_power[NUMBER_OF_NR_ULSCH_MAX][NB_ANTENNAS_RX];
|
||||||
@@ -169,7 +169,7 @@ void nr_gnb_measurements(PHY_VARS_gNB *gNB, uint8_t ulsch_id, unsigned char harq
|
|||||||
|
|
||||||
rx_power[ulsch_id][aarx] = 0;
|
rx_power[ulsch_id][aarx] = 0;
|
||||||
|
|
||||||
for (int aatx = 0; aatx < fp->nb_antennas_tx; aatx++){
|
for (int aatx = 0; aatx < nrOfLayers; aatx++){
|
||||||
|
|
||||||
meas->rx_spatial_power[ulsch_id][aatx][aarx] = (signal_energy_nodc(&gNB->pusch_vars[ulsch_id]->ul_ch_estimates[aarx][ch_offset], N_RB_UL * NR_NB_SC_PER_RB));
|
meas->rx_spatial_power[ulsch_id][aatx][aarx] = (signal_energy_nodc(&gNB->pusch_vars[ulsch_id]->ul_ch_estimates[aarx][ch_offset], N_RB_UL * NR_NB_SC_PER_RB));
|
||||||
|
|
||||||
|
|||||||
@@ -130,7 +130,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
//------------------generate DMRS------------------//
|
//------------------generate DMRS------------------//
|
||||||
|
|
||||||
if (pusch_pdu->transform_precoding == transform_precoder_disabled) {
|
if (pusch_pdu->transform_precoding == transform_precoder_disabled) {
|
||||||
nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch_dmrs[pusch_pdu->scid][Ns][symbol], &pilot[0], 1000, 0, nb_rb_pusch, (pusch_pdu->bwp_start + pusch_pdu->rb_start)*NR_NB_SC_PER_RB, pusch_pdu->dmrs_config_type);
|
nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch_dmrs[pusch_pdu->scid][Ns][symbol], &pilot[0], 1000, 0, nb_rb_pusch,
|
||||||
|
(pusch_pdu->bwp_start + pusch_pdu->rb_start)*NR_NB_SC_PER_RB, pusch_pdu->dmrs_config_type);
|
||||||
}
|
}
|
||||||
else { // if transform precoding or SC-FDMA is enabled in Uplink
|
else { // if transform precoding or SC-FDMA is enabled in Uplink
|
||||||
|
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ void dump_nr_I0_stats(FILE *fd,PHY_VARS_gNB *gNB);
|
|||||||
|
|
||||||
void gNB_I0_measurements(PHY_VARS_gNB *gNB,int first_symb,int num_symb);
|
void gNB_I0_measurements(PHY_VARS_gNB *gNB,int first_symb,int num_symb);
|
||||||
|
|
||||||
void nr_gnb_measurements(PHY_VARS_gNB *gNB, uint8_t ulsch_id, unsigned char harq_pid, unsigned char symbol);
|
void nr_gnb_measurements(PHY_VARS_gNB *gNB, uint8_t ulsch_id, unsigned char harq_pid, unsigned char symbol, uint8_t nrOfLayers);
|
||||||
|
|
||||||
int nr_est_timing_advance_pusch(PHY_VARS_gNB* phy_vars_gNB, int UE_id);
|
int nr_est_timing_advance_pusch(PHY_VARS_gNB* phy_vars_gNB, int UE_id);
|
||||||
|
|
||||||
|
|||||||
@@ -178,6 +178,7 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
|
|||||||
int32_t *avg,
|
int32_t *avg,
|
||||||
uint8_t symbol,
|
uint8_t symbol,
|
||||||
uint32_t len,
|
uint32_t len,
|
||||||
|
uint8_t nrOfLayers,
|
||||||
unsigned short nb_rb);
|
unsigned short nb_rb);
|
||||||
|
|
||||||
/** \brief This function performs channel compensation (matched filtering) on the received RBs for this allocation. In addition, it computes the squared-magnitude of the channel with weightings for 16QAM/64QAM detection as well as dual-stream detection (cross-correlation)
|
/** \brief This function performs channel compensation (matched filtering) on the received RBs for this allocation. In addition, it computes the squared-magnitude of the channel with weightings for 16QAM/64QAM detection as well as dual-stream detection (cross-correlation)
|
||||||
@@ -202,6 +203,7 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
|
|||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
uint8_t is_dmrs_symbol,
|
uint8_t is_dmrs_symbol,
|
||||||
unsigned char mod_order,
|
unsigned char mod_order,
|
||||||
|
uint8_t nrOfLayers,
|
||||||
unsigned short nb_rb,
|
unsigned short nb_rb,
|
||||||
unsigned char output_shift);
|
unsigned char output_shift);
|
||||||
|
|
||||||
|
|||||||
@@ -467,6 +467,7 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
|
|||||||
int32_t *avg,
|
int32_t *avg,
|
||||||
uint8_t symbol,
|
uint8_t symbol,
|
||||||
uint32_t len,
|
uint32_t len,
|
||||||
|
uint8_t nrOfLayers,
|
||||||
unsigned short nb_rb)
|
unsigned short nb_rb)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -474,7 +475,6 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
|
|||||||
|
|
||||||
short rb;
|
short rb;
|
||||||
unsigned char aatx, aarx;
|
unsigned char aatx, aarx;
|
||||||
char nb_antennas_ue_tx = 1;
|
|
||||||
__m128i *ul_ch128, avg128U;
|
__m128i *ul_ch128, avg128U;
|
||||||
|
|
||||||
int16_t x = factor2(len);
|
int16_t x = factor2(len);
|
||||||
@@ -486,7 +486,7 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
|
|||||||
int off = 0;
|
int off = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (aatx = 0; aatx < nb_antennas_ue_tx; aatx++)
|
for (aatx = 0; aatx < nrOfLayers; aatx++)
|
||||||
for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
||||||
//clear average level
|
//clear average level
|
||||||
avg128U = _mm_setzero_si128();
|
avg128U = _mm_setzero_si128();
|
||||||
@@ -519,7 +519,7 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
|
|||||||
|
|
||||||
symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
|
symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
|
||||||
|
|
||||||
for (aatx=0; aatx<frame_parms->nb_antenna_ports_gNB; aatx++) {
|
for (aatx=0; aatx<nrOfLayers; aatx++) {
|
||||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||||
//clear average level
|
//clear average level
|
||||||
avg128U = vdupq_n_s32(0);
|
avg128U = vdupq_n_s32(0);
|
||||||
@@ -535,7 +535,7 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
|
|||||||
avg128U = vqaddq_s32(avg128U, vmull_s16(ul_ch128[2], ul_ch128[2]));
|
avg128U = vqaddq_s32(avg128U, vmull_s16(ul_ch128[2], ul_ch128[2]));
|
||||||
avg128U = vqaddq_s32(avg128U, vmull_s16(ul_ch128[3], ul_ch128[3]));
|
avg128U = vqaddq_s32(avg128U, vmull_s16(ul_ch128[3], ul_ch128[3]));
|
||||||
|
|
||||||
if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_gNB!=1)) {
|
if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(nrOfLayers!=1)) {
|
||||||
ul_ch128+=4;
|
ul_ch128+=4;
|
||||||
} else {
|
} else {
|
||||||
avg128U = vqaddq_s32(avg128U, vmull_s16(ul_ch128[4], ul_ch128[4]));
|
avg128U = vqaddq_s32(avg128U, vmull_s16(ul_ch128[4], ul_ch128[4]));
|
||||||
@@ -576,6 +576,7 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
|
|||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
uint8_t is_dmrs_symbol,
|
uint8_t is_dmrs_symbol,
|
||||||
unsigned char mod_order,
|
unsigned char mod_order,
|
||||||
|
uint8_t nrOfLayers,
|
||||||
unsigned short nb_rb,
|
unsigned short nb_rb,
|
||||||
unsigned char output_shift) {
|
unsigned char output_shift) {
|
||||||
|
|
||||||
@@ -627,12 +628,11 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
|
|||||||
|
|
||||||
unsigned short rb;
|
unsigned short rb;
|
||||||
unsigned char aatx,aarx;
|
unsigned char aatx,aarx;
|
||||||
char nb_antennas_ue_tx = 1;
|
|
||||||
__m128i *ul_ch128,*ul_ch128_2,*ul_ch_mag128,*ul_ch_mag128b,*rxdataF128,*rxdataF_comp128,*rho128;
|
__m128i *ul_ch128,*ul_ch128_2,*ul_ch_mag128,*ul_ch_mag128b,*rxdataF128,*rxdataF_comp128,*rho128;
|
||||||
__m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b;
|
__m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b;
|
||||||
QAM_amp128b = _mm_setzero_si128();
|
QAM_amp128b = _mm_setzero_si128();
|
||||||
|
|
||||||
for (aatx=0; aatx<nb_antennas_ue_tx; aatx++) {
|
for (aatx=0; aatx<nrOfLayers; aatx++) {
|
||||||
|
|
||||||
if (mod_order == 4) {
|
if (mod_order == 4) {
|
||||||
QAM_amp128 = _mm_set1_epi16(QAM16_n1); // 2/sqrt(10)
|
QAM_amp128 = _mm_set1_epi16(QAM16_n1); // 2/sqrt(10)
|
||||||
@@ -884,7 +884,7 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
|
|||||||
symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
|
symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
|
||||||
|
|
||||||
if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) {
|
if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) {
|
||||||
if (frame_parms->nb_antenna_ports_gNB==1) { // 10 out of 12 so don't reduce size
|
if (nrOfLayers==1) { // 10 out of 12 so don't reduce size
|
||||||
nb_rb=1+(5*nb_rb/6);
|
nb_rb=1+(5*nb_rb/6);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -892,7 +892,7 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (aatx=0; aatx<frame_parms->nb_antenna_ports_gNB; aatx++) {
|
for (aatx=0; aatx<nrOfLayers; aatx++) {
|
||||||
if (mod_order == 4) {
|
if (mod_order == 4) {
|
||||||
QAM_amp128 = vmovq_n_s16(QAM16_n1); // 2/sqrt(10)
|
QAM_amp128 = vmovq_n_s16(QAM16_n1); // 2/sqrt(10)
|
||||||
QAM_amp128b = vmovq_n_s16(0);
|
QAM_amp128b = vmovq_n_s16(0);
|
||||||
@@ -1166,10 +1166,10 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
|
|||||||
uint8_t aarx, aatx;
|
uint8_t aarx, aatx;
|
||||||
uint32_t nb_re_pusch, bwp_start_subcarrier;
|
uint32_t nb_re_pusch, bwp_start_subcarrier;
|
||||||
int avgs;
|
int avgs;
|
||||||
int avg[4];
|
|
||||||
char nb_antennas_ue_tx = 1;
|
|
||||||
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
||||||
nfapi_nr_pusch_pdu_t *rel15_ul = &gNB->ulsch[ulsch_id][0]->harq_processes[harq_pid]->ulsch_pdu;
|
nfapi_nr_pusch_pdu_t *rel15_ul = &gNB->ulsch[ulsch_id][0]->harq_processes[harq_pid]->ulsch_pdu;
|
||||||
|
int avg[frame_parms->nb_antennas_rx*rel15_ul->nrOfLayers];
|
||||||
|
|
||||||
gNB->pusch_vars[ulsch_id]->dmrs_symbol = INVALID_VALUE;
|
gNB->pusch_vars[ulsch_id]->dmrs_symbol = INVALID_VALUE;
|
||||||
gNB->pusch_vars[ulsch_id]->cl_done = 0;
|
gNB->pusch_vars[ulsch_id]->cl_done = 0;
|
||||||
@@ -1188,7 +1188,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
|
|||||||
if (dmrs_symbol_flag == 1) {
|
if (dmrs_symbol_flag == 1) {
|
||||||
if (gNB->pusch_vars[ulsch_id]->dmrs_symbol == INVALID_VALUE)
|
if (gNB->pusch_vars[ulsch_id]->dmrs_symbol == INVALID_VALUE)
|
||||||
gNB->pusch_vars[ulsch_id]->dmrs_symbol = symbol;
|
gNB->pusch_vars[ulsch_id]->dmrs_symbol = symbol;
|
||||||
|
z
|
||||||
nr_pusch_channel_estimation(gNB,
|
nr_pusch_channel_estimation(gNB,
|
||||||
slot,
|
slot,
|
||||||
0, // p
|
0, // p
|
||||||
@@ -1197,7 +1197,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
|
|||||||
bwp_start_subcarrier,
|
bwp_start_subcarrier,
|
||||||
rel15_ul);
|
rel15_ul);
|
||||||
|
|
||||||
nr_gnb_measurements(gNB, ulsch_id, harq_pid, symbol);
|
nr_gnb_measurements(gNB, ulsch_id, harq_pid, symbol,rel15_ul->nrOfLayers);
|
||||||
|
|
||||||
for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
||||||
if (symbol == rel15_ul->start_symbol_index) {
|
if (symbol == rel15_ul->start_symbol_index) {
|
||||||
@@ -1278,11 +1278,12 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
|
|||||||
avg,
|
avg,
|
||||||
symbol,
|
symbol,
|
||||||
nb_re_pusch,
|
nb_re_pusch,
|
||||||
|
rel15_ul->nrOfLayers,
|
||||||
rel15_ul->rb_size);
|
rel15_ul->rb_size);
|
||||||
|
|
||||||
avgs = 0;
|
avgs = 0;
|
||||||
|
|
||||||
for (aatx=0;aatx<nb_antennas_ue_tx;aatx++)
|
for (aatx=0;aatx<rel15_ul->nrOfLayers;aatx++)
|
||||||
for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++)
|
for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++)
|
||||||
avgs = cmax(avgs,avg[(aatx<<1)+aarx]);
|
avgs = cmax(avgs,avg[(aatx<<1)+aarx]);
|
||||||
|
|
||||||
@@ -1299,11 +1300,12 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
|
|||||||
gNB->pusch_vars[ulsch_id]->ul_ch_mag0,
|
gNB->pusch_vars[ulsch_id]->ul_ch_mag0,
|
||||||
gNB->pusch_vars[ulsch_id]->ul_ch_magb0,
|
gNB->pusch_vars[ulsch_id]->ul_ch_magb0,
|
||||||
gNB->pusch_vars[ulsch_id]->rxdataF_comp,
|
gNB->pusch_vars[ulsch_id]->rxdataF_comp,
|
||||||
(nb_antennas_ue_tx>1) ? gNB->pusch_vars[ulsch_id]->rho : NULL,
|
(rel15_ul->nrOfLayers>1) ? gNB->pusch_vars[ulsch_id]->rho : NULL,
|
||||||
frame_parms,
|
frame_parms,
|
||||||
symbol,
|
symbol,
|
||||||
dmrs_symbol_flag,
|
dmrs_symbol_flag,
|
||||||
rel15_ul->qam_mod_order,
|
rel15_ul->qam_mod_order,
|
||||||
|
rel15_ul->nrOfLayers,
|
||||||
rel15_ul->rb_size,
|
rel15_ul->rb_size,
|
||||||
gNB->pusch_vars[ulsch_id]->log2_maxh);
|
gNB->pusch_vars[ulsch_id]->log2_maxh);
|
||||||
stop_meas(&gNB->ulsch_channel_compensation_stats);
|
stop_meas(&gNB->ulsch_channel_compensation_stats);
|
||||||
|
|||||||
@@ -557,8 +557,8 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
|
|||||||
NR_gNB_PUCCH_t *pucch = gNB->pucch[i];
|
NR_gNB_PUCCH_t *pucch = gNB->pucch[i];
|
||||||
if (pucch) {
|
if (pucch) {
|
||||||
if ((pucch->active == 1) &&
|
if ((pucch->active == 1) &&
|
||||||
(pucch->frame == frame_rx) &&
|
(pucch->frame == frame_rx) &&
|
||||||
(pucch->slot == slot_rx) ) {
|
(pucch->slot == slot_rx) ) {
|
||||||
|
|
||||||
pucch_decode_done = 1;
|
pucch_decode_done = 1;
|
||||||
|
|
||||||
@@ -579,7 +579,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
|
|||||||
LOG_D(PHY,"frame %d, slot %d: PUCCH signal energy %d\n",frame_rx,slot_rx,power_rxF);
|
LOG_D(PHY,"frame %d, slot %d: PUCCH signal energy %d\n",frame_rx,slot_rx,power_rxF);
|
||||||
|
|
||||||
nr_decode_pucch0(gNB,
|
nr_decode_pucch0(gNB,
|
||||||
frame_rx,
|
frame_rx,
|
||||||
slot_rx,
|
slot_rx,
|
||||||
uci_pdu_format0,
|
uci_pdu_format0,
|
||||||
pucch_pdu);
|
pucch_pdu);
|
||||||
@@ -621,9 +621,9 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
|
|||||||
(ulsch->rnti > 0)) {
|
(ulsch->rnti > 0)) {
|
||||||
// for for an active HARQ process
|
// for for an active HARQ process
|
||||||
for (harq_pid=0;harq_pid<NR_MAX_ULSCH_HARQ_PROCESSES;harq_pid++) {
|
for (harq_pid=0;harq_pid<NR_MAX_ULSCH_HARQ_PROCESSES;harq_pid++) {
|
||||||
ulsch_harq = ulsch->harq_processes[harq_pid];
|
ulsch_harq = ulsch->harq_processes[harq_pid];
|
||||||
AssertFatal(ulsch_harq!=NULL,"harq_pid %d is not allocated\n",harq_pid);
|
AssertFatal(ulsch_harq!=NULL,"harq_pid %d is not allocated\n",harq_pid);
|
||||||
if ((ulsch_harq->status == NR_ACTIVE) &&
|
if ((ulsch_harq->status == NR_ACTIVE) &&
|
||||||
(ulsch_harq->frame == frame_rx) &&
|
(ulsch_harq->frame == frame_rx) &&
|
||||||
(ulsch_harq->slot == slot_rx) &&
|
(ulsch_harq->slot == slot_rx) &&
|
||||||
(ulsch_harq->handled == 0)){
|
(ulsch_harq->handled == 0)){
|
||||||
|
|||||||
Reference in New Issue
Block a user