Adding channel compensation dual stream correlation and layer demapping for nr IA decoder
This commit is contained in:
@@ -592,7 +592,8 @@ void phy_init_nr_ue__PDSCH( NR_UE_PDSCH* const pdsch, const NR_DL_FRAME_PARMS* c
|
|||||||
AssertFatal( pdsch, "pdsch==0" );
|
AssertFatal( pdsch, "pdsch==0" );
|
||||||
|
|
||||||
pdsch->pmi_ext = (uint8_t*)malloc16_clear( fp->N_RB_DL );
|
pdsch->pmi_ext = (uint8_t*)malloc16_clear( fp->N_RB_DL );
|
||||||
pdsch->llr[0] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
|
pdsch->llr[0] = (int16_t*)malloc16_clear( (8*(3*8*6144))*sizeof(int16_t) );
|
||||||
|
pdsch->layer_llr[0] = (int16_t*)malloc16_clear( (8*(3*8*6144))*sizeof(int16_t) );
|
||||||
pdsch->llr128 = (int16_t**)malloc16_clear( sizeof(int16_t*) );
|
pdsch->llr128 = (int16_t**)malloc16_clear( sizeof(int16_t*) );
|
||||||
// FIXME! no further allocation for (int16_t*)pdsch->llr128 !!! expect SIGSEGV
|
// FIXME! no further allocation for (int16_t*)pdsch->llr128 !!! expect SIGSEGV
|
||||||
// FK, 11-3-2015: this is only as a temporary pointer, no memory is stored there
|
// FK, 11-3-2015: this is only as a temporary pointer, no memory is stored there
|
||||||
@@ -761,7 +762,8 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
|
|||||||
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
||||||
(*pdsch_vars_th)[th_id][eNB_id]->llr_shifts = (uint8_t*)malloc16_clear(7*2*fp->N_RB_DL*12);
|
(*pdsch_vars_th)[th_id][eNB_id]->llr_shifts = (uint8_t*)malloc16_clear(7*2*fp->N_RB_DL*12);
|
||||||
(*pdsch_vars_th)[th_id][eNB_id]->llr_shifts_p = (*pdsch_vars_th)[0][eNB_id]->llr_shifts;
|
(*pdsch_vars_th)[th_id][eNB_id]->llr_shifts_p = (*pdsch_vars_th)[0][eNB_id]->llr_shifts;
|
||||||
(*pdsch_vars_th)[th_id][eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*8448)+12))*sizeof(int16_t) );
|
(*pdsch_vars_th)[th_id][eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*(3*8*8448))*sizeof(int16_t) );
|
||||||
|
(*pdsch_vars_th)[th_id][eNB_id]->layer_llr[1] = (int16_t*)malloc16_clear( (8*(3*8*8448))*sizeof(int16_t) );
|
||||||
(*pdsch_vars_th)[th_id][eNB_id]->llr128_2ndstream = (int16_t**)malloc16_clear( sizeof(int16_t*) );
|
(*pdsch_vars_th)[th_id][eNB_id]->llr128_2ndstream = (int16_t**)malloc16_clear( sizeof(int16_t*) );
|
||||||
(*pdsch_vars_th)[th_id][eNB_id]->rho = (int32_t**)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t*) );
|
(*pdsch_vars_th)[th_id][eNB_id]->rho = (int32_t**)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||||
}
|
}
|
||||||
@@ -882,7 +884,8 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
|
|||||||
if (abstraction_flag == 0) {
|
if (abstraction_flag == 0) {
|
||||||
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
||||||
//phy_init_lte_ue__PDSCH( (*pdsch_vars_th)[th_id][eNB_id], fp );
|
//phy_init_lte_ue__PDSCH( (*pdsch_vars_th)[th_id][eNB_id], fp );
|
||||||
(*pdsch_vars_th)[th_id][eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*8448)+12))*sizeof(int16_t) );
|
(*pdsch_vars_th)[th_id][eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*(3*8*8448))*sizeof(int16_t) );
|
||||||
|
(*pdsch_vars_th)[th_id][eNB_id]->layer_llr[1] = (int16_t*)malloc16_clear( (8*(3*8*8448))*sizeof(int16_t) );
|
||||||
}
|
}
|
||||||
|
|
||||||
} else { //abstraction == 1
|
} else { //abstraction == 1
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1137,12 +1137,12 @@ int nr_dlsch_qpsk_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
short **llr16p)
|
short **llr16p)
|
||||||
{
|
{
|
||||||
|
|
||||||
int16_t *rxF=(int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
|
int16_t *rxF=(int16_t*)&rxdataF_comp[0][(symbol*nb_rb*12)];
|
||||||
int16_t *rxF_i=(int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)];
|
int16_t *rxF_i=(int16_t*)&rxdataF_comp_i[0][(symbol*nb_rb*12)];
|
||||||
int16_t *rho=(int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)];
|
int16_t *rho=(int16_t*)&rho_i[0][(symbol*nb_rb*12)];
|
||||||
int16_t *llr16;
|
int16_t *llr16;
|
||||||
int len;
|
int len;
|
||||||
uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
|
//uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
|
||||||
|
|
||||||
if (first_symbol_flag == 1) {
|
if (first_symbol_flag == 1) {
|
||||||
llr16 = (int16_t*)dlsch_llr;
|
llr16 = (int16_t*)dlsch_llr;
|
||||||
@@ -1152,18 +1152,10 @@ int nr_dlsch_qpsk_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
|
|
||||||
AssertFatal(llr16!=NULL,"nr_dlsch_qpsk_qpsk_llr: llr is null, symbol %d\n",symbol);
|
AssertFatal(llr16!=NULL,"nr_dlsch_qpsk_qpsk_llr: llr is null, symbol %d\n",symbol);
|
||||||
|
|
||||||
if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
|
if (symbol ==2) //to update from config
|
||||||
// if symbol has pilots
|
len = nb_rb*6;
|
||||||
if (frame_parms->nb_antenna_ports_eNB!=1)
|
else
|
||||||
// in 2 antenna ports we have 8 REs per symbol per RB
|
len = nb_rb*12;
|
||||||
len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
|
|
||||||
else
|
|
||||||
// for 1 antenna port we have 10 REs per symbol per RB
|
|
||||||
len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
|
|
||||||
} else {
|
|
||||||
// symbol has no pilots
|
|
||||||
len = (nb_rb*12) - pbch_pss_sss_adjust;
|
|
||||||
}
|
|
||||||
|
|
||||||
// printf("nr_dlsch_qpsk_qpsk_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
|
// printf("nr_dlsch_qpsk_qpsk_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
|
||||||
// printf("qpsk_qpsk: len %d, llr16 %p\n",len,llr16);
|
// printf("qpsk_qpsk: len %d, llr16 %p\n",len,llr16);
|
||||||
@@ -2986,14 +2978,14 @@ int nr_dlsch_16qam_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
int16_t **llr16p)
|
int16_t **llr16p)
|
||||||
{
|
{
|
||||||
|
|
||||||
int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
|
int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*nb_rb*12)];
|
||||||
int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)];
|
int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*nb_rb*12)];
|
||||||
int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)];
|
int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*nb_rb*12)];
|
||||||
int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)];
|
int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*nb_rb*12)];
|
||||||
int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)];
|
int16_t *rho = (int16_t*)&rho_i[0][(symbol*nb_rb*12)];
|
||||||
int16_t *llr16;
|
int16_t *llr16;
|
||||||
int len;
|
int len;
|
||||||
uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
|
//uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
|
||||||
|
|
||||||
// first symbol has different structure due to more pilots
|
// first symbol has different structure due to more pilots
|
||||||
if (first_symbol_flag == 1) {
|
if (first_symbol_flag == 1) {
|
||||||
@@ -3005,18 +2997,10 @@ int nr_dlsch_16qam_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
|
|
||||||
AssertFatal(llr16!=NULL,"nr_dlsch_16qam_16qam_llr: llr is null, symbol %d\n",symbol);
|
AssertFatal(llr16!=NULL,"nr_dlsch_16qam_16qam_llr: llr is null, symbol %d\n",symbol);
|
||||||
|
|
||||||
if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
|
if (symbol ==2) //to update from config
|
||||||
// if symbol has pilots
|
len = nb_rb*6;
|
||||||
if (frame_parms->nb_antenna_ports_eNB!=1)
|
else
|
||||||
// in 2 antenna ports we have 8 REs per symbol per RB
|
len = nb_rb*12;
|
||||||
len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
|
|
||||||
else
|
|
||||||
// for 1 antenna port we have 10 REs per symbol per RB
|
|
||||||
len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
|
|
||||||
} else {
|
|
||||||
// symbol has no pilots
|
|
||||||
len = (nb_rb*12) - pbch_pss_sss_adjust;
|
|
||||||
}
|
|
||||||
|
|
||||||
// printf("symbol %d: qam16_llr, len %d (llr16 %p)\n",symbol,len,llr16);
|
// printf("symbol %d: qam16_llr, len %d (llr16 %p)\n",symbol,len,llr16);
|
||||||
|
|
||||||
|
|||||||
@@ -753,18 +753,20 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
|
|||||||
@param high_speed_flag
|
@param high_speed_flag
|
||||||
@param frame_parms Pointer to frame descriptor
|
@param frame_parms Pointer to frame descriptor
|
||||||
*/
|
*/
|
||||||
uint16_t dlsch_extract_rbs_dual(int32_t **rxdataF,
|
unsigned short nr_dlsch_extract_rbs_dual(int **rxdataF,
|
||||||
int32_t **dl_ch_estimates,
|
int **dl_ch_estimates,
|
||||||
int32_t **rxdataF_ext,
|
int **rxdataF_ext,
|
||||||
int32_t **dl_ch_estimates_ext,
|
int **dl_ch_estimates_ext,
|
||||||
uint16_t pmi,
|
unsigned short pmi,
|
||||||
uint8_t *pmi_ext,
|
unsigned char *pmi_ext,
|
||||||
uint32_t *rb_alloc,
|
unsigned int *rb_alloc,
|
||||||
uint8_t symbol,
|
unsigned char symbol,
|
||||||
uint8_t subframe,
|
unsigned short start_rb,
|
||||||
uint32_t high_speed_flag,
|
unsigned short nb_rb_pdsch,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
unsigned char nr_tti_rx,
|
||||||
MIMO_mode_t mimo_mode);
|
uint32_t high_speed_flag,
|
||||||
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
|
MIMO_mode_t mimo_mode);
|
||||||
|
|
||||||
/** \fn dlsch_extract_rbs_TM7(int32_t **rxdataF,
|
/** \fn dlsch_extract_rbs_TM7(int32_t **rxdataF,
|
||||||
int32_t **dl_bf_ch_estimates,
|
int32_t **dl_bf_ch_estimates,
|
||||||
@@ -826,6 +828,19 @@ void nr_dlsch_channel_compensation(int32_t **rxdataF_ext,
|
|||||||
uint8_t output_shift,
|
uint8_t output_shift,
|
||||||
PHY_NR_MEASUREMENTS *phy_measurements);
|
PHY_NR_MEASUREMENTS *phy_measurements);
|
||||||
|
|
||||||
|
void nr_dlsch_channel_compensation_core(int **rxdataF_ext,
|
||||||
|
int **dl_ch_estimates_ext,
|
||||||
|
int **dl_ch_mag,
|
||||||
|
int **dl_ch_magb,
|
||||||
|
int **rxdataF_comp,
|
||||||
|
int **rho,
|
||||||
|
unsigned char n_tx,
|
||||||
|
unsigned char n_rx,
|
||||||
|
unsigned char mod_order,
|
||||||
|
unsigned char output_shift,
|
||||||
|
int length,
|
||||||
|
int start_point);
|
||||||
|
|
||||||
void nr_dlsch_deinterleaving(uint8_t symbol,
|
void nr_dlsch_deinterleaving(uint8_t symbol,
|
||||||
uint16_t L,
|
uint16_t L,
|
||||||
uint16_t *llr,
|
uint16_t *llr,
|
||||||
@@ -881,6 +896,26 @@ void dlsch_channel_level_TM34_meas(int *ch00,
|
|||||||
int *avg_1,
|
int *avg_1,
|
||||||
unsigned short nb_rb);
|
unsigned short nb_rb);
|
||||||
|
|
||||||
|
void nr_dlsch_channel_level_median(int **dl_ch_estimates_ext,
|
||||||
|
int32_t *median,
|
||||||
|
int n_tx,
|
||||||
|
int n_rx,
|
||||||
|
int length,
|
||||||
|
int start_point);
|
||||||
|
|
||||||
|
void nr_dlsch_detection_mrc_core(int **rxdataF_comp,
|
||||||
|
int **rxdataF_comp_i,
|
||||||
|
int **rho,
|
||||||
|
int **rho_i,
|
||||||
|
int **dl_ch_mag,
|
||||||
|
int **dl_ch_magb,
|
||||||
|
int **dl_ch_mag_i,
|
||||||
|
int **dl_ch_magb_i,
|
||||||
|
unsigned char n_tx,
|
||||||
|
unsigned char n_rx,
|
||||||
|
int length,
|
||||||
|
int start_point);
|
||||||
|
|
||||||
void det_HhH(int32_t *after_mf_00,
|
void det_HhH(int32_t *after_mf_00,
|
||||||
int32_t *after_mf_01,
|
int32_t *after_mf_01,
|
||||||
int32_t *after_mf_10,
|
int32_t *after_mf_10,
|
||||||
|
|||||||
@@ -510,6 +510,8 @@ typedef struct {
|
|||||||
/// - first index: ? [0..1] (hard coded)
|
/// - first index: ? [0..1] (hard coded)
|
||||||
/// - second index: ? [0..1179743] (hard coded)
|
/// - second index: ? [0..1179743] (hard coded)
|
||||||
int16_t *llr[2];
|
int16_t *llr[2];
|
||||||
|
/// Pointers to layer llr vectors (4 layers).
|
||||||
|
int16_t *layer_llr[4];
|
||||||
/// \f$\log_2(\max|H_i|^2)\f$
|
/// \f$\log_2(\max|H_i|^2)\f$
|
||||||
int16_t log2_maxh;
|
int16_t log2_maxh;
|
||||||
/// \f$\log_2(\max|H_i|^2)\f$ //this is for TM3-4 layer1 channel compensation
|
/// \f$\log_2(\max|H_i|^2)\f$ //this is for TM3-4 layer1 channel compensation
|
||||||
|
|||||||
Reference in New Issue
Block a user