use layer number and not dmrs port number to index pdsch channel estimates (plus some code improvement)
This commit is contained in:
@@ -1613,6 +1613,7 @@ void NFAPI_NR_DMRS_TYPE2_average_prb(NR_DL_FRAME_PARMS *frame_parms,
|
||||
}
|
||||
int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
const UE_nr_rxtx_proc_t *proc,
|
||||
int nl,
|
||||
unsigned short p,
|
||||
unsigned char symbol,
|
||||
unsigned char nscid,
|
||||
@@ -1682,7 +1683,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
#endif
|
||||
|
||||
c16_t *rxF = &rxdataF[aarx][symbol_offset + nushift];
|
||||
c16_t *dl_ch = (c16_t *)&dl_ch_estimates[p * ue->frame_parms.nb_antennas_rx + aarx][ch_offset];
|
||||
c16_t *dl_ch = (c16_t *)&dl_ch_estimates[nl * ue->frame_parms.nb_antennas_rx + aarx][ch_offset];
|
||||
memset(dl_ch, 0, sizeof(*dl_ch) * ue->frame_parms.ofdm_symbol_size);
|
||||
|
||||
if (config_type == NFAPI_NR_DMRS_TYPE1 && ue->chest_freq == 0) {
|
||||
@@ -1724,7 +1725,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
}
|
||||
|
||||
#ifdef DEBUG_PDSCH
|
||||
dl_ch = (c16_t *)&dl_ch_estimates[p * ue->frame_parms.nb_antennas_rx + aarx][ch_offset];
|
||||
dl_ch = (c16_t *)&dl_ch_estimates[nl * ue->frame_parms.nb_antennas_rx + aarx][ch_offset];
|
||||
for (uint16_t idxP = 0; idxP < ceil((float)nb_rb_pdsch * 12 / 8); idxP++) {
|
||||
for (uint8_t idxI = 0; idxI < 8; idxI++) {
|
||||
printf("%4d\t%4d\t", dl_ch[idxP * 8 + idxI].r, dl_ch[idxP * 8 + idxI].i);
|
||||
|
||||
@@ -77,6 +77,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
|
||||
int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
const UE_nr_rxtx_proc_t *proc,
|
||||
int nl,
|
||||
unsigned short p,
|
||||
unsigned char symbol,
|
||||
unsigned char nscid,
|
||||
|
||||
@@ -181,24 +181,24 @@ static void nr_dlsch_channel_level_median(uint32_t rx_size_symbol,
|
||||
@param phy_measurements Pointer to UE PHY measurements
|
||||
*/
|
||||
|
||||
void nr_dlsch_channel_compensation(uint32_t rx_size_symbol,
|
||||
int nbRx,
|
||||
c16_t rxdataF_ext[][rx_size_symbol],
|
||||
int32_t dl_ch_estimates_ext[][rx_size_symbol],
|
||||
int32_t dl_ch_mag[][nbRx][rx_size_symbol],
|
||||
int32_t dl_ch_magb[][nbRx][rx_size_symbol],
|
||||
int32_t dl_ch_magr[][nbRx][rx_size_symbol],
|
||||
int32_t rxdataF_comp[][nbRx][rx_size_symbol * NR_SYMBOLS_PER_SLOT],
|
||||
int ***rho,
|
||||
NR_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t n_layers,
|
||||
unsigned char symbol,
|
||||
int length,
|
||||
uint8_t first_symbol_flag,
|
||||
unsigned char mod_order,
|
||||
unsigned short nb_rb,
|
||||
unsigned char output_shift,
|
||||
PHY_NR_MEASUREMENTS *measurements);
|
||||
static void nr_dlsch_channel_compensation(uint32_t rx_size_symbol,
|
||||
int nbRx,
|
||||
c16_t rxdataF_ext[][rx_size_symbol],
|
||||
int32_t dl_ch_estimates_ext[][rx_size_symbol],
|
||||
int32_t dl_ch_mag[][nbRx][rx_size_symbol],
|
||||
int32_t dl_ch_magb[][nbRx][rx_size_symbol],
|
||||
int32_t dl_ch_magr[][nbRx][rx_size_symbol],
|
||||
int32_t rxdataF_comp[][nbRx][rx_size_symbol * NR_SYMBOLS_PER_SLOT],
|
||||
int ***rho,
|
||||
NR_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t n_layers,
|
||||
unsigned char symbol,
|
||||
int length,
|
||||
bool first_symbol_flag,
|
||||
unsigned char mod_order,
|
||||
unsigned short nb_rb,
|
||||
unsigned char output_shift,
|
||||
PHY_NR_MEASUREMENTS *measurements);
|
||||
|
||||
/** \brief This function computes the average channel level over all allocated RBs and antennas (TX/RX) in order to compute output shift for compensated signal
|
||||
@param dl_ch_estimates_ext Channel estimates in allocated RBs
|
||||
@@ -242,7 +242,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
||||
const UE_nr_rxtx_proc_t *proc,
|
||||
NR_UE_DLSCH_t dlsch[2],
|
||||
unsigned char symbol,
|
||||
unsigned char first_symbol_flag,
|
||||
bool first_symbol_flag,
|
||||
unsigned char harq_pid,
|
||||
uint32_t pdsch_est_size,
|
||||
int32_t dl_ch_estimates[][pdsch_est_size],
|
||||
@@ -434,7 +434,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
||||
//----------------------------------------------------------
|
||||
if (meas_enabled)
|
||||
start_meas(&meas);
|
||||
if (first_symbol_flag == 1) {
|
||||
if (first_symbol_flag) {
|
||||
int32_t avg[MAX_ANT][MAX_ANT];
|
||||
nr_dlsch_channel_level(rx_size_symbol, dl_ch_estimates_ext, frame_parms, nl, avg, symbol, nb_re_pdsch, nb_rb_pdsch);
|
||||
int avgs = 0;
|
||||
@@ -734,24 +734,24 @@ void nr_dlsch_deinterleaving(uint8_t symbol,
|
||||
// Pre-processing for LLR computation
|
||||
//==============================================================================================
|
||||
|
||||
void nr_dlsch_channel_compensation(uint32_t rx_size_symbol,
|
||||
int nbRx,
|
||||
c16_t rxdataF_ext[][rx_size_symbol],
|
||||
int32_t dl_ch_estimates_ext[][rx_size_symbol],
|
||||
int32_t dl_ch_mag[][nbRx][rx_size_symbol],
|
||||
int32_t dl_ch_magb[][nbRx][rx_size_symbol],
|
||||
int32_t dl_ch_magr[][nbRx][rx_size_symbol],
|
||||
int32_t rxdataF_comp[][nbRx][rx_size_symbol * NR_SYMBOLS_PER_SLOT],
|
||||
int ***rho,
|
||||
NR_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t n_layers,
|
||||
unsigned char symbol,
|
||||
int length,
|
||||
uint8_t first_symbol_flag,
|
||||
unsigned char mod_order,
|
||||
unsigned short nb_rb,
|
||||
unsigned char output_shift,
|
||||
PHY_NR_MEASUREMENTS *measurements)
|
||||
static void nr_dlsch_channel_compensation(uint32_t rx_size_symbol,
|
||||
int nbRx,
|
||||
c16_t rxdataF_ext[][rx_size_symbol],
|
||||
int32_t dl_ch_estimates_ext[][rx_size_symbol],
|
||||
int32_t dl_ch_mag[][nbRx][rx_size_symbol],
|
||||
int32_t dl_ch_magb[][nbRx][rx_size_symbol],
|
||||
int32_t dl_ch_magr[][nbRx][rx_size_symbol],
|
||||
int32_t rxdataF_comp[][nbRx][rx_size_symbol * NR_SYMBOLS_PER_SLOT],
|
||||
int ***rho,
|
||||
NR_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t n_layers,
|
||||
unsigned char symbol,
|
||||
int length,
|
||||
bool first_symbol_flag,
|
||||
unsigned char mod_order,
|
||||
unsigned short nb_rb,
|
||||
unsigned char output_shift,
|
||||
PHY_NR_MEASUREMENTS *measurements)
|
||||
{
|
||||
|
||||
|
||||
@@ -1034,7 +1034,7 @@ void nr_dlsch_channel_compensation(uint32_t rx_size_symbol,
|
||||
dl_ch128_2+=3;
|
||||
rho128+=3;
|
||||
}
|
||||
if (first_symbol_flag==1) {
|
||||
if (first_symbol_flag) {
|
||||
//rho_nm = H_arx_n.conj(H_arx_m)
|
||||
//rho_rx_corr[arx][nm] = |H_arx_n|^2.|H_arx_m|^2 &rho[aarx][l*n_layers+atx][symbol*nb_rb*12]
|
||||
measurements->rx_correlation[0][aarx][l * n_layers + atx] = signal_energy(&rho[aarx][l * n_layers + atx][symbol * nb_rb * 12],length);
|
||||
|
||||
@@ -397,7 +397,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
||||
const UE_nr_rxtx_proc_t *proc,
|
||||
NR_UE_DLSCH_t dlsch[2],
|
||||
unsigned char symbol,
|
||||
unsigned char first_symbol_flag,
|
||||
bool first_symbol_flag,
|
||||
unsigned char harq_pid,
|
||||
uint32_t pdsch_est_size,
|
||||
int32_t dl_ch_estimates[][pdsch_est_size],
|
||||
|
||||
@@ -489,8 +489,6 @@ static int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
|
||||
{
|
||||
int frame_rx = proc->frame_rx;
|
||||
int nr_slot_rx = proc->nr_slot_rx;
|
||||
int m;
|
||||
int first_symbol_flag=0;
|
||||
|
||||
// We handle only one CW now
|
||||
if (!(NR_MAX_NB_LAYERS>4)) {
|
||||
@@ -523,13 +521,14 @@ static int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
|
||||
__attribute__((aligned(32))) int32_t rxdataF_comp[dlsch[0].Nl][ue->frame_parms.nb_antennas_rx][rx_size_symbol * NR_SYMBOLS_PER_SLOT];
|
||||
memset(rxdataF_comp, 0, sizeof(rxdataF_comp));
|
||||
|
||||
for (m = s0; m < (s0 +s1); m++) {
|
||||
for (int m = s0; m < (s0 +s1); m++) {
|
||||
if (dlsch0->dlsch_config.dlDmrsSymbPos & (1 << m)) {
|
||||
for (uint8_t aatx=0; aatx<dlsch0->Nl; aatx++) {//for MIMO Config: it shall loop over no_layers
|
||||
LOG_D(PHY,"PDSCH Channel estimation gNB id %d, PDSCH antenna port %d, slot %d, symbol %d\n",0,aatx,nr_slot_rx,m);
|
||||
for (int nl = 0; nl < dlsch0->Nl; nl++) { //for MIMO Config: it shall loop over no_layers
|
||||
LOG_D(PHY,"PDSCH Channel estimation layer %d, slot %d, symbol %d\n", nl, nr_slot_rx, m);
|
||||
nr_pdsch_channel_estimation(ue,
|
||||
proc,
|
||||
get_dmrs_port(aatx,dlsch0->dlsch_config.dmrs_ports),
|
||||
nl,
|
||||
get_dmrs_port(nl,dlsch0->dlsch_config.dmrs_ports),
|
||||
m,
|
||||
dlsch0->dlsch_config.nscid,
|
||||
dlsch0->dlsch_config.dlDmrsScramblingId,
|
||||
@@ -546,9 +545,9 @@ static int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
|
||||
int nr_frame_rx = proc->frame_rx;
|
||||
char filename[100];
|
||||
for (uint8_t aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
|
||||
sprintf(filename,"PDSCH_CHANNEL_frame%d_slot%d_sym%d_port%d_rx%d.m", nr_frame_rx, nr_slot_rx, m, aatx,aarx);
|
||||
sprintf(filename,"PDSCH_CHANNEL_frame%d_slot%d_sym%d_port%d_rx%d.m", nr_frame_rx, nr_slot_rx, m, nl, aarx);
|
||||
int **dl_ch_estimates = ue->pdsch_vars[gNB_id]->dl_ch_estimates;
|
||||
LOG_M(filename,"channel_F",&dl_ch_estimates[aatx*ue->frame_parms.nb_antennas_rx+aarx][ue->frame_parms.ofdm_symbol_size*m],ue->frame_parms.ofdm_symbol_size, 1, 1);
|
||||
LOG_M(filename,"channel_F",&dl_ch_estimates[nl*ue->frame_parms.nb_antennas_rx+aarx][ue->frame_parms.ofdm_symbol_size*m],ue->frame_parms.ofdm_symbol_size, 1, 1);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -582,12 +581,10 @@ static int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
|
||||
|
||||
int32_t log2_maxh = 0;
|
||||
start_meas(&ue->rx_pdsch_stats);
|
||||
for (m = s0; m < (s1 + s0); m++) {
|
||||
|
||||
if (m==first_symbol_with_data)
|
||||
first_symbol_flag = 1;
|
||||
else
|
||||
first_symbol_flag = 0;
|
||||
for (int m = s0; m < (s1 + s0); m++) {
|
||||
bool first_symbol_flag = false;
|
||||
if (m == first_symbol_with_data)
|
||||
first_symbol_flag = true;
|
||||
|
||||
uint8_t slot = 0;
|
||||
if(m >= ue->frame_parms.symbols_per_slot>>1)
|
||||
|
||||
Reference in New Issue
Block a user