Commit 06ef3119 authored by Sakthivel Velumani's avatar Sakthivel Velumani

Moved PDSCH, rxdataF to stack

--Removed NR_UE_PDSCH global structure
--Changed UE scope to accomodate local PDSCH data
--Removed common_vars.rxdataF from global structure
parent cfe698eb
...@@ -865,6 +865,7 @@ void *UE_thread(void *arg) { ...@@ -865,6 +865,7 @@ void *UE_thread(void *arg) {
bool syncRunning=false; bool syncRunning=false;
const int nb_slot_frame = UE->frame_parms.slots_per_frame; const int nb_slot_frame = UE->frame_parms.slots_per_frame;
int absolute_slot=0, decoded_frame_rx=INT_MAX, trashed_frames=0; int absolute_slot=0, decoded_frame_rx=INT_MAX, trashed_frames=0;
UE->phy_sim_mode = false;
while (!oai_exit) { while (!oai_exit) {
if (UE->lost_sync) { if (UE->lost_sync) {
......
This diff is collapsed.
...@@ -418,10 +418,10 @@ void reset_DLSCH_struct(const PHY_VARS_gNB *gNB, processingData_L1tx_t *msg); ...@@ -418,10 +418,10 @@ void reset_DLSCH_struct(const PHY_VARS_gNB *gNB, processingData_L1tx_t *msg);
void RCconfig_nrUE_prs(void *cfg); void RCconfig_nrUE_prs(void *cfg);
void init_nr_prs_ue_vars(PHY_VARS_NR_UE *ue); void init_nr_prs_ue_vars(PHY_VARS_NR_UE *ue);
void nr_init_dl_harq_processes(NR_DL_UE_HARQ_t* harq_list, int number_of_processes, int num_rb); void nr_init_dl_harq_processes(NR_DL_UE_HARQ_t harq_list[2][NR_MAX_DLSCH_HARQ_PROCESSES], int number_of_processes, int num_rb);
void nr_init_ul_harq_processes(NR_UL_UE_HARQ_t *harq_list, int number_of_processes, int num_rb, int num_ant_tx); void nr_init_ul_harq_processes(NR_UL_UE_HARQ_t harq_list[NR_MAX_ULSCH_HARQ_PROCESSES], int number_of_processes, int num_rb, int num_ant_tx);
void free_nr_ue_dl_harq(NR_DL_UE_HARQ_t* harq_list, int number_of_processes, int num_rb); void free_nr_ue_dl_harq(NR_DL_UE_HARQ_t harq_list[2][NR_MAX_DLSCH_HARQ_PROCESSES], int number_of_processes, int num_rb);
void free_nr_ue_ul_harq(NR_UL_UE_HARQ_t *harq_list, int number_of_processes, int num_rb, int num_ant_tx); void free_nr_ue_ul_harq(NR_UL_UE_HARQ_t harq_list[NR_MAX_ULSCH_HARQ_PROCESSES], int number_of_processes, int num_rb, int num_ant_tx);
/** @} */ /** @} */
#endif #endif
......
...@@ -51,14 +51,16 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue, ...@@ -51,14 +51,16 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
int nr_slot_fep(PHY_VARS_NR_UE *phy_vars_ue, int nr_slot_fep(PHY_VARS_NR_UE *phy_vars_ue,
UE_nr_rxtx_proc_t *proc, UE_nr_rxtx_proc_t *proc,
unsigned char l, unsigned char l,
unsigned char Ns); unsigned char Ns,
int32_t rxdataF[][phy_vars_ue->frame_parms.samples_per_slot_wCP]);
int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue, int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc, UE_nr_rxtx_proc_t *proc,
unsigned char symbol, unsigned char symbol,
unsigned char Ns, unsigned char Ns,
int sample_offset, int sample_offset,
bool pbch_decoded); bool pbch_decoded,
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue, int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue,
unsigned char l, unsigned char l,
......
...@@ -37,7 +37,8 @@ ...@@ -37,7 +37,8 @@
int nr_slot_fep(PHY_VARS_NR_UE *ue, int nr_slot_fep(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc, UE_nr_rxtx_proc_t *proc,
unsigned char symbol, unsigned char symbol,
unsigned char Ns) unsigned char Ns,
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
{ {
NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
NR_UE_COMMON *common_vars = &ue->common_vars; NR_UE_COMMON *common_vars = &ue->common_vars;
...@@ -75,7 +76,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, ...@@ -75,7 +76,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
//#endif //#endif
for (unsigned char aa=0; aa<frame_parms->nb_antennas_rx; aa++) { for (unsigned char aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
memset(&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int32_t)); memset(&rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int32_t));
int16_t *rxdata_ptr = (int16_t *)&common_vars->rxdata[aa][rx_offset]; int16_t *rxdata_ptr = (int16_t *)&common_vars->rxdata[aa][rx_offset];
...@@ -92,7 +93,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, ...@@ -92,7 +93,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
dft(dftsize, dft(dftsize,
rxdata_ptr, rxdata_ptr,
(int16_t *)&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], (int16_t *)&rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
1); 1);
stop_meas(&ue->rx_dft_stats); stop_meas(&ue->rx_dft_stats);
...@@ -108,7 +109,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, ...@@ -108,7 +109,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
#endif #endif
c16_t *shift_rot = frame_parms->timeshift_symbol_rotation; c16_t *shift_rot = frame_parms->timeshift_symbol_rotation;
c16_t *this_symbol = (c16_t *)&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol]; c16_t *this_symbol = (c16_t *)&rxdataF[aa][frame_parms->ofdm_symbol_size*symbol];
if (frame_parms->N_RB_DL & 1) { if (frame_parms->N_RB_DL & 1) {
rotate_cpx_vector(this_symbol, &rot2, this_symbol, rotate_cpx_vector(this_symbol, &rot2, this_symbol,
...@@ -151,7 +152,8 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue, ...@@ -151,7 +152,8 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
unsigned char symbol, unsigned char symbol,
unsigned char Ns, unsigned char Ns,
int sample_offset, int sample_offset,
bool pbch_decoded) bool pbch_decoded,
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
{ {
NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
NR_UE_COMMON *common_vars = &ue->common_vars; NR_UE_COMMON *common_vars = &ue->common_vars;
...@@ -189,7 +191,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue, ...@@ -189,7 +191,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
#endif #endif
for (unsigned char aa=0; aa<frame_parms->nb_antennas_rx; aa++) { for (unsigned char aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
memset(&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int32_t)); memset(&rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int32_t));
int16_t *rxdata_ptr; int16_t *rxdata_ptr;
rx_offset%=frame_length_samples*2; rx_offset%=frame_length_samples*2;
...@@ -225,7 +227,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue, ...@@ -225,7 +227,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
dft(dftsize, dft(dftsize,
rxdata_ptr, rxdata_ptr,
(int16_t *)&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], (int16_t *)&rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
1); 1);
stop_meas(&ue->rx_dft_stats); stop_meas(&ue->rx_dft_stats);
...@@ -240,7 +242,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue, ...@@ -240,7 +242,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
symbol+symb_offset,rot2.r,rot2.i); symbol+symb_offset,rot2.r,rot2.i);
#endif #endif
c16_t *this_symbol = (c16_t *)&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol]; c16_t *this_symbol = (c16_t *)&rxdataF[aa][frame_parms->ofdm_symbol_size*symbol];
rotate_cpx_vector(this_symbol, &rot2, this_symbol, frame_parms->ofdm_symbol_size, 15); rotate_cpx_vector(this_symbol, &rot2, this_symbol, frame_parms->ofdm_symbol_size, 15);
} }
......
...@@ -341,7 +341,7 @@ int8_t get_valid_dmrs_idx_for_channel_est(uint16_t dmrs_symb_pos, uint8_t count ...@@ -341,7 +341,7 @@ int8_t get_valid_dmrs_idx_for_channel_est(uint16_t dmrs_symb_pos, uint8_t count
/* perform averaging of channel estimates and store result in first symbol buffer */ /* perform averaging of channel estimates and store result in first symbol buffer */
void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms, void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms,
int **ch_est, int32_t **ch_estimates,
uint8_t num_symbols, uint8_t num_symbols,
uint8_t start_symbol, uint8_t start_symbol,
uint16_t dmrs_bitmap, uint16_t dmrs_bitmap,
...@@ -356,9 +356,9 @@ void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms, ...@@ -356,9 +356,9 @@ void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms,
AssertFatal(first_dmrs_symb > -1, "No DMRS symbol present in this slot\n"); AssertFatal(first_dmrs_symb > -1, "No DMRS symbol present in this slot\n");
for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) { for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
for (int symb = first_dmrs_symb+1; symb < total_symbols; symb++) { for (int symb = first_dmrs_symb+1; symb < total_symbols; symb++) {
ul_ch128_0 = (__m128i *)&ch_est[aarx][first_dmrs_symb*frame_parms->ofdm_symbol_size]; ul_ch128_0 = (__m128i *)&ch_estimates[aarx][first_dmrs_symb*frame_parms->ofdm_symbol_size];
if ((dmrs_bitmap >> symb) & 0x01) { if ((dmrs_bitmap >> symb) & 0x01) {
ul_ch128_1 = (__m128i *)&ch_est[aarx][symb*frame_parms->ofdm_symbol_size]; ul_ch128_1 = (__m128i *)&ch_estimates[aarx][symb*frame_parms->ofdm_symbol_size];
for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) { for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) {
ul_ch128_0[0] = _mm_adds_epi16(ul_ch128_0[0], ul_ch128_1[0]); ul_ch128_0[0] = _mm_adds_epi16(ul_ch128_0[0], ul_ch128_1[0]);
ul_ch128_0[1] = _mm_adds_epi16(ul_ch128_0[1], ul_ch128_1[1]); ul_ch128_0[1] = _mm_adds_epi16(ul_ch128_0[1], ul_ch128_1[1]);
...@@ -368,7 +368,7 @@ void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms, ...@@ -368,7 +368,7 @@ void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms,
} }
} }
} }
ul_ch128_0 = (__m128i *)&ch_est[aarx][first_dmrs_symb*frame_parms->ofdm_symbol_size]; ul_ch128_0 = (__m128i *)&ch_estimates[aarx][first_dmrs_symb*frame_parms->ofdm_symbol_size];
if (num_dmrs_symb == 2) { if (num_dmrs_symb == 2) {
for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) { for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) {
ul_ch128_0[0] = _mm_srai_epi16(ul_ch128_0[0], 1); ul_ch128_0[0] = _mm_srai_epi16(ul_ch128_0[0], 1);
...@@ -384,7 +384,7 @@ void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms, ...@@ -384,7 +384,7 @@ void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms,
ul_ch128_0 += 3; ul_ch128_0 += 3;
} }
} else if (num_dmrs_symb == 3) { } else if (num_dmrs_symb == 3) {
ul_ch16_0 = (int16_t *)&ch_est[aarx][first_dmrs_symb*frame_parms->ofdm_symbol_size]; ul_ch16_0 = (int16_t *)&ch_estimates[aarx][first_dmrs_symb*frame_parms->ofdm_symbol_size];
for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) { for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) {
ul_ch16_0[0] /= 3; ul_ch16_0[0] /= 3;
ul_ch16_0[1] /= 3; ul_ch16_0[1] /= 3;
......
...@@ -66,7 +66,7 @@ int8_t get_next_dmrs_symbol_in_slot(uint16_t ul_dmrs_symb_pos, uint8_t counter, ...@@ -66,7 +66,7 @@ int8_t get_next_dmrs_symbol_in_slot(uint16_t ul_dmrs_symb_pos, uint8_t counter,
uint8_t get_dmrs_symbols_in_slot(uint16_t l_prime_mask, uint16_t nb_symb); uint8_t get_dmrs_symbols_in_slot(uint16_t l_prime_mask, uint16_t nb_symb);
int8_t get_valid_dmrs_idx_for_channel_est(uint16_t dmrs_symb_pos, uint8_t counter); int8_t get_valid_dmrs_idx_for_channel_est(uint16_t dmrs_symb_pos, uint8_t counter);
void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms, void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms,
int **ch_est, int32_t **ch_estimates,
uint8_t num_symbols, uint8_t num_symbols,
uint8_t start_symbol, uint8_t start_symbol,
uint16_t dmrs_bitmap, uint16_t dmrs_bitmap,
......
...@@ -96,7 +96,7 @@ int pss_ch_est_nr(PHY_VARS_NR_UE *ue, ...@@ -96,7 +96,7 @@ int pss_ch_est_nr(PHY_VARS_NR_UE *ue,
int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR], int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR],
int32_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR]); int32_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR]);
int rx_sss_nr(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int32_t *tot_metric, uint8_t *phase_max, int *freq_offset_sss); int rx_sss_nr(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int32_t *tot_metric, uint8_t *phase_max, int *freq_offset_sss, int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
#undef INIT_VARIABLES_SSS_NR_H #undef INIT_VARIABLES_SSS_NR_H
#undef EXTERN #undef EXTERN
......
...@@ -66,10 +66,10 @@ int nr_prs_channel_estimation(uint8_t gNB_id, ...@@ -66,10 +66,10 @@ int nr_prs_channel_estimation(uint8_t gNB_id,
uint8_t rep_num, uint8_t rep_num,
PHY_VARS_NR_UE *ue, PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc, UE_nr_rxtx_proc_t *proc,
NR_DL_FRAME_PARMS *frame_params) NR_DL_FRAME_PARMS *frame_params,
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
{ {
uint8_t rxAnt = 0, idx = 0; uint8_t rxAnt = 0, idx = 0;
int32_t **rxdataF = ue->common_vars.rxdataF;
prs_config_t *prs_cfg = &ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg; prs_config_t *prs_cfg = &ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg;
prs_meas_t **prs_meas = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_meas; prs_meas_t **prs_meas = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_meas;
c16_t ch_tmp_buf[ ue->frame_parms.ofdm_symbol_size] __attribute__((aligned(32))); c16_t ch_tmp_buf[ ue->frame_parms.ofdm_symbol_size] __attribute__((aligned(32)));
...@@ -571,7 +571,8 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, ...@@ -571,7 +571,8 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
unsigned char Ns, unsigned char Ns,
unsigned char symbol, unsigned char symbol,
int dmrss, int dmrss,
NR_UE_SSB *current_ssb) NR_UE_SSB *current_ssb,
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
{ {
int pilot[200] __attribute__((aligned(16))); int pilot[200] __attribute__((aligned(16)));
unsigned short k; unsigned short k;
...@@ -583,7 +584,6 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, ...@@ -583,7 +584,6 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
uint8_t nushift; uint8_t nushift;
uint8_t ssb_index=current_ssb->i_ssb; uint8_t ssb_index=current_ssb->i_ssb;
uint8_t n_hf=current_ssb->n_hf; uint8_t n_hf=current_ssb->n_hf;
int **rxdataF=ue->common_vars.rxdataF;
nushift = ue->frame_parms.Nid_cell%4; nushift = ue->frame_parms.Nid_cell%4;
ue->frame_parms.nushift = nushift; ue->frame_parms.nushift = nushift;
...@@ -735,7 +735,8 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, ...@@ -735,7 +735,8 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
unsigned char symbol, unsigned char symbol,
int dmrss, int dmrss,
uint8_t ssb_index, uint8_t ssb_index,
uint8_t n_hf) uint8_t n_hf,
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
{ {
int pilot[200] __attribute__((aligned(16))); int pilot[200] __attribute__((aligned(16)));
unsigned short k; unsigned short k;
...@@ -745,8 +746,6 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, ...@@ -745,8 +746,6 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
//int slot_pbch; //int slot_pbch;
uint8_t nushift; uint8_t nushift;
int **rxdataF=ue->common_vars.rxdataF;
nushift = ue->frame_parms.Nid_cell%4; nushift = ue->frame_parms.Nid_cell%4;
ue->frame_parms.nushift = nushift; ue->frame_parms.nushift = nushift;
unsigned int ssb_offset = ue->frame_parms.first_carrier_offset + ue->frame_parms.ssb_start_subcarrier; unsigned int ssb_offset = ue->frame_parms.first_carrier_offset + ue->frame_parms.ssb_start_subcarrier;
...@@ -1001,7 +1000,8 @@ void nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, ...@@ -1001,7 +1000,8 @@ void nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
uint16_t first_carrier_offset, uint16_t first_carrier_offset,
uint16_t BWPStart, uint16_t BWPStart,
int32_t pdcch_est_size, int32_t pdcch_est_size,
int32_t pdcch_dl_ch_estimates[][pdcch_est_size]) int32_t pdcch_dl_ch_estimates[][pdcch_est_size],
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
{ {
unsigned char aarx; unsigned char aarx;
...@@ -1010,8 +1010,6 @@ void nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, ...@@ -1010,8 +1010,6 @@ void nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
int16_t ch[2],*pil,*rxF,*dl_ch; int16_t ch[2],*pil,*rxF,*dl_ch;
int ch_offset,symbol_offset; int ch_offset,symbol_offset;
int **rxdataF=ue->common_vars.rxdataF;
ch_offset = ue->frame_parms.ofdm_symbol_size*symbol; ch_offset = ue->frame_parms.ofdm_symbol_size*symbol;
symbol_offset = ue->frame_parms.ofdm_symbol_size*symbol; symbol_offset = ue->frame_parms.ofdm_symbol_size*symbol;
...@@ -1249,7 +1247,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, ...@@ -1249,7 +1247,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
unsigned short BWPStart, unsigned short BWPStart,
uint8_t config_type, uint8_t config_type,
unsigned short bwp_start_subcarrier, unsigned short bwp_start_subcarrier,
unsigned short nb_rb_pdsch) unsigned short nb_rb_pdsch,
uint32_t pdsch_est_size,
int32_t dl_ch_estimates[][pdsch_est_size],
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
{ {
int pilot[3280] __attribute__((aligned(16))); int pilot[3280] __attribute__((aligned(16)));
unsigned char aarx; unsigned char aarx;
...@@ -1260,9 +1261,6 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, ...@@ -1260,9 +1261,6 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
int ch_offset,symbol_offset; int ch_offset,symbol_offset;
uint8_t nushift; uint8_t nushift;
int **dl_ch_estimates = ue->pdsch_vars[gNB_id]->dl_ch_estimates;
int **rxdataF=ue->common_vars.rxdataF;
ch_offset = ue->frame_parms.ofdm_symbol_size*symbol; ch_offset = ue->frame_parms.ofdm_symbol_size*symbol;
symbol_offset = ue->frame_parms.ofdm_symbol_size*symbol; symbol_offset = ue->frame_parms.ofdm_symbol_size*symbol;
...@@ -2030,7 +2028,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, ...@@ -2030,7 +2028,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
* NAME : nr_pdsch_ptrs_processing * NAME : nr_pdsch_ptrs_processing
* *
* PARAMETERS : PHY_VARS_NR_UE : ue data structure * PARAMETERS : PHY_VARS_NR_UE : ue data structure
* NR_UE_PDSCH : pdsch_vars pointer * c16_t : ptrs_phase_per_slot array
* int32_t : ptrs_re_per_slot array
* uint32_t : rx_size,
* int32_t : rxdataF_comp, array
* NR_DL_FRAME_PARMS : frame_parms pointer * NR_DL_FRAME_PARMS : frame_parms pointer
* NR_DL_UE_HARQ_t : dlsch0_harq pointer * NR_DL_UE_HARQ_t : dlsch0_harq pointer
* NR_DL_UE_HARQ_t : dlsch1_harq pointer * NR_DL_UE_HARQ_t : dlsch1_harq pointer
...@@ -2049,7 +2050,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, ...@@ -2049,7 +2050,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
* 3) Compensate signal with PTRS estimation for slot * 3) Compensate signal with PTRS estimation for slot
*********************************************************************/ *********************************************************************/
void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue, void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
NR_UE_PDSCH **pdsch_vars, c16_t ptrs_phase_per_slot[][14],
int32_t ptrs_re_per_slot[][14],
uint32_t rx_size,
int32_t rxdataF_comp[][rx_size],
NR_DL_FRAME_PARMS *frame_parms, NR_DL_FRAME_PARMS *frame_parms,
NR_DL_UE_HARQ_t *dlsch0_harq, NR_DL_UE_HARQ_t *dlsch0_harq,
NR_DL_UE_HARQ_t *dlsch1_harq, NR_DL_UE_HARQ_t *dlsch1_harq,
...@@ -2104,8 +2108,8 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue, ...@@ -2104,8 +2108,8 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
} }
/* loop over antennas */ /* loop over antennas */
for (int aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { for (int aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
c16_t *phase_per_symbol = (c16_t*)pdsch_vars[gNB_id]->ptrs_phase_per_slot[aarx]; c16_t *phase_per_symbol = (c16_t*)ptrs_phase_per_slot[aarx];
ptrs_re_symbol = (int32_t*)pdsch_vars[gNB_id]->ptrs_re_per_slot[aarx]; ptrs_re_symbol = (int32_t*)ptrs_re_per_slot[aarx];
ptrs_re_symbol[symbol] = 0; ptrs_re_symbol[symbol] = 0;
phase_per_symbol[symbol].i = 0; // Imag phase_per_symbol[symbol].i = 0; // Imag
/* set DMRS estimates to 0 angle with magnitude 1 */ /* set DMRS estimates to 0 angle with magnitude 1 */
...@@ -2141,7 +2145,7 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue, ...@@ -2141,7 +2145,7 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
rnti, rnti,
nr_slot_rx, nr_slot_rx,
symbol,frame_parms->ofdm_symbol_size, symbol,frame_parms->ofdm_symbol_size,
(int16_t*)&pdsch_vars[gNB_id]->rxdataF_comp0[aarx][(symbol * nb_re_pdsch)], (int16_t*)&rxdataF_comp[aarx][(symbol * nb_re_pdsch)],
ue->nr_gold_pdsch[gNB_id][nr_slot_rx][symbol][0], ue->nr_gold_pdsch[gNB_id][nr_slot_rx][symbol][0],
(int16_t*)&phase_per_symbol[symbol], (int16_t*)&phase_per_symbol[symbol],
&ptrs_re_symbol[symbol]); &ptrs_re_symbol[symbol]);
...@@ -2161,9 +2165,9 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue, ...@@ -2161,9 +2165,9 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
} }
} }
#ifdef DEBUG_DL_PTRS #ifdef DEBUG_DL_PTRS
LOG_M("ptrsEst.m","est",pdsch_vars[gNB_id]->ptrs_phase_per_slot[aarx],frame_parms->symbols_per_slot,1,1 ); LOG_M("ptrsEst.m","est",ptrs_phase_per_slot[aarx],frame_parms->symbols_per_slot,1,1 );
LOG_M("rxdataF_bf_ptrs_comp.m","bf_ptrs_cmp", LOG_M("rxdataF_bf_ptrs_comp.m","bf_ptrs_cmp",
&pdsch_vars[gNB_id]->rxdataF_comp0[aarx][(*startSymbIndex) * NR_NB_SC_PER_RB * (*nb_rb) ], &rxdataF_comp[aarx][(*startSymbIndex) * NR_NB_SC_PER_RB * (*nb_rb) ],
(*nb_rb) * NR_NB_SC_PER_RB * (*nbSymb),1,1); (*nb_rb) * NR_NB_SC_PER_RB * (*nbSymb),1,1);
#endif #endif
/*------------------------------------------------------------------------------------------------------- */ /*------------------------------------------------------------------------------------------------------- */
...@@ -2176,9 +2180,9 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue, ...@@ -2176,9 +2180,9 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
#ifdef DEBUG_DL_PTRS #ifdef DEBUG_DL_PTRS
printf("[PHY][DL][PTRS]: Rotate Symbol %2d with %d + j* %d\n", i, phase_per_symbol[i].r,phase_per_symbol[i].i); printf("[PHY][DL][PTRS]: Rotate Symbol %2d with %d + j* %d\n", i, phase_per_symbol[i].r,phase_per_symbol[i].i);
#endif #endif
rotate_cpx_vector((c16_t*)&pdsch_vars[gNB_id]->rxdataF_comp0[aarx][(i * (*nb_rb) * NR_NB_SC_PER_RB)], rotate_cpx_vector((c16_t*)&rxdataF_comp[aarx][(i * (*nb_rb) * NR_NB_SC_PER_RB)],
&phase_per_symbol[i], &phase_per_symbol[i],
(c16_t*)&pdsch_vars[gNB_id]->rxdataF_comp0[aarx][(i * (*nb_rb) * NR_NB_SC_PER_RB)], (c16_t*)&rxdataF_comp[aarx][(i * (*nb_rb) * NR_NB_SC_PER_RB)],
((*nb_rb) * NR_NB_SC_PER_RB), 15); ((*nb_rb) * NR_NB_SC_PER_RB), 15);
}// if not DMRS Symbol }// if not DMRS Symbol
}// symbol loop }// symbol loop
......
...@@ -38,7 +38,8 @@ int nr_prs_channel_estimation(uint8_t gNB_id, ...@@ -38,7 +38,8 @@ int nr_prs_channel_estimation(uint8_t gNB_id,
uint8_t rep_num, uint8_t rep_num,
PHY_VARS_NR_UE *ue, PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc, UE_nr_rxtx_proc_t *proc,
NR_DL_FRAME_PARMS *frame_params); NR_DL_FRAME_PARMS *frame_params,
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
/* Generic function to find the peak of channel estimation buffer */ /* Generic function to find the peak of channel estimation buffer */
void peak_estimator(int32_t *buffer, int32_t buf_len, int32_t *peak_idx, int32_t *peak_val); void peak_estimator(int32_t *buffer, int32_t buf_len, int32_t *peak_idx, int32_t *peak_val);
...@@ -59,7 +60,8 @@ void nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, ...@@ -59,7 +60,8 @@ void nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
uint16_t first_carrier_offset, uint16_t first_carrier_offset,
uint16_t BWPStart, uint16_t BWPStart,
int32_t pdcch_est_size, int32_t pdcch_est_size,
int32_t pdcch_dl_ch_estimates[][pdcch_est_size]); int32_t pdcch_dl_ch_estimates[][pdcch_est_size],
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc, UE_nr_rxtx_proc_t *proc,
...@@ -67,19 +69,21 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, ...@@ -67,19 +69,21 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
unsigned char Ns, unsigned char Ns,
unsigned char symbol, unsigned char symbol,
int dmrss, int dmrss,
NR_UE_SSB *current_ssb); NR_UE_SSB *current_ssb,
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
int estimateSz, int estimateSz,
struct complex16 dl_ch_estimates [][estimateSz], struct complex16 dl_ch_estimates [][estimateSz],
struct complex16 dl_ch_estimates_time [][estimateSz], struct complex16 dl_ch_estimates_time [][estimateSz],
UE_nr_rxtx_proc_t *proc, UE_nr_rxtx_proc_t *proc,
uint8_t gNB_id, uint8_t gNB_id,
unsigned char Ns, unsigned char Ns,
unsigned char symbol, unsigned char symbol,
int dmrss, int dmrss,
uint8_t ssb_index, uint8_t ssb_index,
uint8_t n_hf); uint8_t n_hf,
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc, UE_nr_rxtx_proc_t *proc,
...@@ -93,7 +97,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, ...@@ -93,7 +97,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
unsigned short BWPStart, unsigned short BWPStart,
uint8_t config_type, uint8_t config_type,
unsigned short bwp_start_subcarrier, unsigned short bwp_start_subcarrier,
unsigned short nb_rb_pdsch); unsigned short nb_rb_pdsch,
uint32_t pdsch_est_size,
int32_t pdsch_dl_ch_estimates[][pdsch_est_size],
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms, void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
PHY_VARS_NR_UE *ue, PHY_VARS_NR_UE *ue,
...@@ -107,24 +114,30 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms, ...@@ -107,24 +114,30 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
void nr_ue_measurements(PHY_VARS_NR_UE *ue, void nr_ue_measurements(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc, UE_nr_rxtx_proc_t *proc,
uint8_t slot, NR_UE_DLSCH_t *dlsch,
NR_UE_DLSCH_t *dlsch); uint32_t pdsch_est_size,
int32_t dl_ch_estimates[][pdsch_est_size]);
void nr_ue_ssb_rsrp_measurements(PHY_VARS_NR_UE *ue, void nr_ue_ssb_rsrp_measurements(PHY_VARS_NR_UE *ue,
uint8_t gNB_index, uint8_t gNB_index,
UE_nr_rxtx_proc_t *proc, UE_nr_rxtx_proc_t *proc,
uint8_t slot); uint8_t slot,
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
void nr_ue_rrc_measurements(PHY_VARS_NR_UE *ue, void nr_ue_rrc_measurements(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc, UE_nr_rxtx_proc_t *proc,
uint8_t slot); uint8_t slot,
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
void phy_adjust_gain_nr(PHY_VARS_NR_UE *ue, void phy_adjust_gain_nr(PHY_VARS_NR_UE *ue,
uint32_t rx_power_fil_dB, uint32_t rx_power_fil_dB,
uint8_t gNB_id); uint8_t gNB_id);
void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue, void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
NR_UE_PDSCH **pdsch_vars, c16_t ptrs_phase_per_slot[][14],
int32_t ptrs_re_per_slot[][14],
uint32_t rx_size,
int32_t rxdataF_comp[][rx_size],
NR_DL_FRAME_PARMS *frame_parms, NR_DL_FRAME_PARMS *frame_parms,
NR_DL_UE_HARQ_t *dlsch0_harq, NR_DL_UE_HARQ_t *dlsch0_harq,
NR_DL_UE_HARQ_t *dlsch1_harq, NR_DL_UE_HARQ_t *dlsch1_harq,
......
...@@ -76,9 +76,11 @@ float_t get_nr_RSRP(module_id_t Mod_id,uint8_t CC_id,uint8_t gNB_index) ...@@ -76,9 +76,11 @@ float_t get_nr_RSRP(module_id_t Mod_id,uint8_t CC_id,uint8_t gNB_index)
void nr_ue_measurements(PHY_VARS_NR_UE *ue, void nr_ue_measurements(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc, UE_nr_rxtx_proc_t *proc,
uint8_t slot, NR_UE_DLSCH_t *dlsch,
NR_UE_DLSCH_t *dlsch) uint32_t pdsch_est_size,
int32_t dl_ch_estimates[][pdsch_est_size])
{ {
int slot = proc->nr_slot_rx;
int aarx, aatx, gNB_id = 0; int aarx, aatx, gNB_id = 0;
NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
int ch_offset = frame_parms->ofdm_symbol_size*2; int ch_offset = frame_parms->ofdm_symbol_size*2;
...@@ -97,7 +99,7 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue, ...@@ -97,7 +99,7 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue,
for (aatx = 0; aatx < frame_parms->nb_antenna_ports_gNB; aatx++){ for (aatx = 0; aatx < frame_parms->nb_antenna_ports_gNB; aatx++){
ue->measurements.rx_spatial_power[gNB_id][aatx][aarx] = (signal_energy_nodc(&ue->pdsch_vars[0]->dl_ch_estimates[gNB_id][ch_offset], N_RB_DL*NR_NB_SC_PER_RB)); ue->measurements.rx_spatial_power[gNB_id][aatx][aarx] = (signal_energy_nodc(&dl_ch_estimates[gNB_id][ch_offset], N_RB_DL*NR_NB_SC_PER_RB));
if (ue->measurements.rx_spatial_power[gNB_id][aatx][aarx]<0) if (ue->measurements.rx_spatial_power[gNB_id][aatx][aarx]<0)
ue->measurements.rx_spatial_power[gNB_id][aatx][aarx] = 0; ue->measurements.rx_spatial_power[gNB_id][aatx][aarx] = 0;
...@@ -170,7 +172,8 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue, ...@@ -170,7 +172,8 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue,
void nr_ue_ssb_rsrp_measurements(PHY_VARS_NR_UE *ue, void nr_ue_ssb_rsrp_measurements(PHY_VARS_NR_UE *ue,
int ssb_index, int ssb_index,
UE_nr_rxtx_proc_t *proc, UE_nr_rxtx_proc_t *proc,
uint8_t slot) { uint8_t slot,
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) {
int k_start = 56; int k_start = 56;
int k_end = 183; int k_end = 183;
...@@ -192,7 +195,7 @@ void nr_ue_ssb_rsrp_measurements(PHY_VARS_NR_UE *ue, ...@@ -192,7 +195,7 @@ void nr_ue_ssb_rsrp_measurements(PHY_VARS_NR_UE *ue,
for (int aarx = 0; aarx < ue->frame_parms.nb_antennas_rx; aarx++) { for (int aarx = 0; aarx < ue->frame_parms.nb_antennas_rx; aarx++) {
int16_t *rxF_sss = (int16_t *)&ue->common_vars.rxdataF[aarx][(l_sss*ue->frame_parms.ofdm_symbol_size) + ssb_offset]; int16_t *rxF_sss = (int16_t *)&rxdataF[aarx][(l_sss*ue->frame_parms.ofdm_symbol_size) + ssb_offset];
for(int k = k_start; k < k_end; k++){ for(int k = k_start; k < k_end; k++){
...@@ -225,7 +228,8 @@ void nr_ue_ssb_rsrp_measurements(PHY_VARS_NR_UE *ue, ...@@ -225,7 +228,8 @@ void nr_ue_ssb_rsrp_measurements(PHY_VARS_NR_UE *ue,
// - psd_awgn (AWGN power spectral density): dBm/Hz // - psd_awgn (AWGN power spectral density): dBm/Hz
void nr_ue_rrc_measurements(PHY_VARS_NR_UE *ue, void nr_ue_rrc_measurements(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc, UE_nr_rxtx_proc_t *proc,
uint8_t slot){ uint8_t slot,
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]){
uint8_t k; uint8_t k;
int aarx, nb_nulls; int aarx, nb_nulls;
...@@ -246,7 +250,7 @@ void nr_ue_rrc_measurements(PHY_VARS_NR_UE *ue, ...@@ -246,7 +250,7 @@ void nr_ue_rrc_measurements(PHY_VARS_NR_UE *ue,
nb_nulls = 0; nb_nulls = 0;
ue->measurements.n0_power[aarx] = 0; ue->measurements.n0_power[aarx] = 0;
rxF_sss = (int16_t *)&ue->common_vars.rxdataF[aarx][(l_sss*ue->frame_parms.ofdm_symbol_size) + ssb_offset]; rxF_sss = (int16_t *)&rxdataF[aarx][(l_sss*ue->frame_parms.ofdm_symbol_size) + ssb_offset];
//-ve spectrum from SSS //-ve spectrum from SSS
for(k = k_left; k < k_left + k_length; k++){ for(k = k_left; k < k_left + k_length; k++){
......
...@@ -190,9 +190,9 @@ int nr_get_csi_rs_signal(const PHY_VARS_NR_UE *ue, ...@@ -190,9 +190,9 @@ int nr_get_csi_rs_signal(const PHY_VARS_NR_UE *ue,
const uint8_t *l_overline, const uint8_t *l_overline,
int32_t csi_rs_received_signal[][ue->frame_parms.samples_per_slot_wCP], int32_t csi_rs_received_signal[][ue->frame_parms.samples_per_slot_wCP],
uint32_t *rsrp, uint32_t *rsrp,
int *rsrp_dBm) { int *rsrp_dBm,
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) {
int32_t **rxdataF = ue->common_vars.rxdataF;
const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
uint16_t meas_count = 0; uint16_t meas_count = 0;
uint32_t rsrp_sum = 0; uint32_t rsrp_sum = 0;
...@@ -729,9 +729,9 @@ int nr_csi_rs_cqi_estimation(const uint32_t precoded_sinr, ...@@ -729,9 +729,9 @@ int nr_csi_rs_cqi_estimation(const uint32_t precoded_sinr,
int nr_csi_im_power_estimation(const PHY_VARS_NR_UE *ue, int nr_csi_im_power_estimation(const PHY_VARS_NR_UE *ue,
const UE_nr_rxtx_proc_t *proc, const UE_nr_rxtx_proc_t *proc,
const fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu, const fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu,
uint32_t *interference_plus_noise_power) { uint32_t *interference_plus_noise_power,
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) {
int32_t **rxdataF = ue->common_vars.rxdataF;
const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
const uint16_t end_rb = csiim_config_pdu->start_rb + csiim_config_pdu->nr_of_rbs > csiim_config_pdu->bwp_size ? const uint16_t end_rb = csiim_config_pdu->start_rb + csiim_config_pdu->nr_of_rbs > csiim_config_pdu->bwp_size ?
...@@ -800,7 +800,7 @@ int nr_csi_im_power_estimation(const PHY_VARS_NR_UE *ue, ...@@ -800,7 +800,7 @@ int nr_csi_im_power_estimation(const PHY_VARS_NR_UE *ue,
return 0; return 0;
} }
int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id) { int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id, int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) {
if(!ue->csiim_vars[gNB_id]->active) { if(!ue->csiim_vars[gNB_id]->active) {
return -1; return -1;
...@@ -818,13 +818,13 @@ int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t ...@@ -818,13 +818,13 @@ int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t
LOG_I(NR_PHY, "csiim_config_pdu->l_csiim = %i.%i.%i.%i\n", csiim_config_pdu->l_csiim[0], csiim_config_pdu->l_csiim[1], csiim_config_pdu->l_csiim[2], csiim_config_pdu->l_csiim[3]); LOG_I(NR_PHY, "csiim_config_pdu->l_csiim = %i.%i.%i.%i\n", csiim_config_pdu->l_csiim[0], csiim_config_pdu->l_csiim[1], csiim_config_pdu->l_csiim[2], csiim_config_pdu->l_csiim[3]);
#endif #endif
nr_csi_im_power_estimation(ue, proc, csiim_config_pdu, &ue->nr_csi_info->interference_plus_noise_power); nr_csi_im_power_estimation(ue, proc, csiim_config_pdu, &ue->nr_csi_info->interference_plus_noise_power, rxdataF);
ue->nr_csi_info->csi_im_meas_computed = true; ue->nr_csi_info->csi_im_meas_computed = true;
return 0; return 0;
} }
int nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id) { int nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id, int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) {
if(!ue->csirs_vars[gNB_id]->active) { if(!ue->csirs_vars[gNB_id]->active) {
return -1; return -1;
...@@ -901,7 +901,8 @@ int nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t ...@@ -901,7 +901,8 @@ int nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t
l_overline, l_overline,
csi_rs_received_signal, csi_rs_received_signal,
&rsrp, &rsrp,
&rsrp_dBm); &rsrp_dBm,
rxdataF);
nr_csi_rs_channel_estimation(ue, nr_csi_rs_channel_estimation(ue,
proc, proc,
......
...@@ -340,7 +340,8 @@ void nr_pdcch_channel_level(int32_t rx_size, ...@@ -340,7 +340,8 @@ void nr_pdcch_channel_level(int32_t rx_size,
// This function will extract the mapped DM-RS PDCCH REs as per 38.211 Section 7.4.1.3.2 (Mapping to physical resources) // This function will extract the mapped DM-RS PDCCH REs as per 38.211 Section 7.4.1.3.2 (Mapping to physical resources)
void nr_pdcch_extract_rbs_single(int32_t **rxdataF, void nr_pdcch_extract_rbs_single(uint32_t rxdataF_sz,
int32_t rxdataF[][rxdataF_sz],
int32_t est_size, int32_t est_size,
int32_t dl_ch_estimates[][est_size], int32_t dl_ch_estimates[][est_size],
int32_t rx_size, int32_t rx_size,
...@@ -671,11 +672,11 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue, ...@@ -671,11 +672,11 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
int32_t pdcch_est_size, int32_t pdcch_est_size,
int32_t pdcch_dl_ch_estimates[][pdcch_est_size], int32_t pdcch_dl_ch_estimates[][pdcch_est_size],
int16_t *pdcch_e_rx, int16_t *pdcch_e_rx,
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15) { fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15,
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) {
uint32_t frame = proc->frame_rx; uint32_t frame = proc->frame_rx;
uint32_t slot = proc->nr_slot_rx; uint32_t slot = proc->nr_slot_rx;
NR_UE_COMMON *common_vars = &ue->common_vars;
NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
uint8_t log2_maxh, aarx; uint8_t log2_maxh, aarx;
...@@ -703,7 +704,8 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue, ...@@ -703,7 +704,8 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
for (int s=rel15->coreset.StartSymbolIndex; s<(rel15->coreset.StartSymbolIndex+rel15->coreset.duration); s++) { for (int s=rel15->coreset.StartSymbolIndex; s<(rel15->coreset.StartSymbolIndex+rel15->coreset.duration); s++) {
LOG_D(PHY,"in nr_pdcch_extract_rbs_single(rxdataF -> rxdataF_ext || dl_ch_estimates -> dl_ch_estimates_ext)\n"); LOG_D(PHY,"in nr_pdcch_extract_rbs_single(rxdataF -> rxdataF_ext || dl_ch_estimates -> dl_ch_estimates_ext)\n");
nr_pdcch_extract_rbs_single(common_vars->rxdataF, nr_pdcch_extract_rbs_single(ue->frame_parms.samples_per_slot_wCP,
rxdataF,
pdcch_est_size, pdcch_est_size,
pdcch_dl_ch_estimates, pdcch_dl_ch_estimates,
rx_size, rx_size,
......
...@@ -101,7 +101,7 @@ void free_list(NR_UE_SSB *node) { ...@@ -101,7 +101,7 @@ void free_list(NR_UE_SSB *node) {
} }
int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_initial_symbol, nr_phy_data_t *phy_data) int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_initial_symbol, nr_phy_data_t *phy_data, int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
{ {
NR_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; NR_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
int ret =-1; int ret =-1;
...@@ -127,7 +127,7 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini ...@@ -127,7 +127,7 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini
start_meas(&ue->dlsch_channel_estimation_stats); start_meas(&ue->dlsch_channel_estimation_stats);
// computing correlation between received DMRS symbols and transmitted sequence for current i_ssb and n_hf // computing correlation between received DMRS symbols and transmitted sequence for current i_ssb and n_hf
for(int i=pbch_initial_symbol; i<pbch_initial_symbol+3;i++) for(int i=pbch_initial_symbol; i<pbch_initial_symbol+3;i++)
nr_pbch_dmrs_correlation(ue,proc,0,0,i,i-pbch_initial_symbol,current_ssb); nr_pbch_dmrs_correlation(ue,proc,0,0,i,i-pbch_initial_symbol,current_ssb,rxdataF);
stop_meas(&ue->dlsch_channel_estimation_stats); stop_meas(&ue->dlsch_channel_estimation_stats);
current_ssb->metric = current_ssb->c_re*current_ssb->c_re + current_ssb->c_im*current_ssb->c_im; current_ssb->metric = current_ssb->c_re*current_ssb->c_re + current_ssb->c_im*current_ssb->c_im;
...@@ -152,7 +152,7 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini ...@@ -152,7 +152,7 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini
for(int i=pbch_initial_symbol; i<pbch_initial_symbol+3;i++) for(int i=pbch_initial_symbol; i<pbch_initial_symbol+3;i++)
nr_pbch_channel_estimation(ue,estimateSz, dl_ch_estimates, dl_ch_estimates_time, nr_pbch_channel_estimation(ue,estimateSz, dl_ch_estimates, dl_ch_estimates_time,
proc,0,0,i,i-pbch_initial_symbol,temp_ptr->i_ssb,temp_ptr->n_hf); proc,0,0,i,i-pbch_initial_symbol,temp_ptr->i_ssb,temp_ptr->n_hf,rxdataF);
stop_meas(&ue->dlsch_channel_estimation_stats); stop_meas(&ue->dlsch_channel_estimation_stats);
fapiPbch_t result; fapiPbch_t result;
...@@ -166,7 +166,8 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini ...@@ -166,7 +166,8 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini
temp_ptr->i_ssb, temp_ptr->i_ssb,
SISO, SISO,
phy_data, phy_data,
&result); &result,
rxdataF);
if (DUMP_PBCH_CH_ESTIMATES && (ret == 0)) { if (DUMP_PBCH_CH_ESTIMATES && (ret == 0)) {
write_output("pbch_ch_estimates.m", "pbch_ch_estimates", dl_ch_estimates, frame_parms->nb_antennas_rx*estimateSz, 1, 1); write_output("pbch_ch_estimates.m", "pbch_ch_estimates", dl_ch_estimates, frame_parms->nb_antennas_rx*estimateSz, 1, 1);
...@@ -242,6 +243,8 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc, ...@@ -242,6 +243,8 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
* sync_pos SS/PBCH block * sync_pos SS/PBCH block
*/ */
const uint32_t rxdataF_sz = ue->frame_parms.samples_per_slot_wCP;
__attribute__ ((aligned(32))) int32_t rxdataF[ue->frame_parms.nb_antennas_rx][rxdataF_sz];
cnt++; cnt++;
if (1){ // (cnt>100) if (1){ // (cnt>100)
cnt =0; cnt =0;
...@@ -304,14 +307,15 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc, ...@@ -304,14 +307,15 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
i, i,
0, 0,
is*fp->samples_per_frame+ue->ssb_offset, is*fp->samples_per_frame+ue->ssb_offset,
false); false,
rxdataF);
#ifdef DEBUG_INITIAL_SYNCH #ifdef DEBUG_INITIAL_SYNCH
LOG_I(PHY,"Calling sss detection (normal CP)\n"); LOG_I(PHY,"Calling sss detection (normal CP)\n");
#endif #endif
int freq_offset_sss = 0; int freq_offset_sss = 0;
ret = rx_sss_nr(ue, proc, &metric_tdd_ncp, &phase_tdd_ncp, &freq_offset_sss); ret = rx_sss_nr(ue, proc, &metric_tdd_ncp, &phase_tdd_ncp, &freq_offset_sss, rxdataF);
// digital compensation of FFO for SSB symbols // digital compensation of FFO for SSB symbols
if (ue->UE_fo_compensation){ if (ue->UE_fo_compensation){
...@@ -341,7 +345,7 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc, ...@@ -341,7 +345,7 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
if (ret==0) { //we got sss channel if (ret==0) { //we got sss channel
nr_gold_pbch(ue); nr_gold_pbch(ue);
ret = nr_pbch_detection(proc, ue, 1, &phy_data); // start pbch detection at first symbol after pss ret = nr_pbch_detection(proc, ue, 1, &phy_data, rxdataF); // start pbch detection at first symbol after pss
} }
if (ret == 0) { if (ret == 0) {
...@@ -541,7 +545,8 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc, ...@@ -541,7 +545,8 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
l, // the UE PHY has no notion of the symbols to be monitored in the search space l, // the UE PHY has no notion of the symbols to be monitored in the search space
phy_pdcch_config->slot, phy_pdcch_config->slot,
is*fp->samples_per_frame+phy_pdcch_config->sfn*fp->samples_per_frame+ue->rx_offset, is*fp->samples_per_frame+phy_pdcch_config->sfn*fp->samples_per_frame+ue->rx_offset,
true); true,
rxdataF);
nr_pdcch_channel_estimation(ue, nr_pdcch_channel_estimation(ue,
proc, proc,
...@@ -552,10 +557,11 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc, ...@@ -552,10 +557,11 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
fp->first_carrier_offset, fp->first_carrier_offset,
phy_pdcch_config->pdcch_config[n_ss].BWPStart, phy_pdcch_config->pdcch_config[n_ss].BWPStart,
pdcch_est_size, pdcch_est_size,
pdcch_dl_ch_estimates); pdcch_dl_ch_estimates,
rxdataF);
} }
int dci_cnt = nr_ue_pdcch_procedures(gnb_id, ue, proc, pdcch_est_size, pdcch_dl_ch_estimates, &phy_data, n_ss); int dci_cnt = nr_ue_pdcch_procedures(gnb_id, ue, proc, pdcch_est_size, pdcch_dl_ch_estimates, &phy_data, n_ss, rxdataF);
if (dci_cnt>0){ if (dci_cnt>0){
NR_UE_DLSCH_t *dlsch = phy_data.dlsch; NR_UE_DLSCH_t *dlsch = phy_data.dlsch;
if (dlsch[0].active == 1) { if (dlsch[0].active == 1) {
...@@ -568,22 +574,51 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc, ...@@ -568,22 +574,51 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
m, m,
phy_pdcch_config->slot, // same slot and offset as pdcch phy_pdcch_config->slot, // same slot and offset as pdcch
is*fp->samples_per_frame+phy_pdcch_config->sfn*fp->samples_per_frame+ue->rx_offset, is*fp->samples_per_frame+phy_pdcch_config->sfn*fp->samples_per_frame+ue->rx_offset,
true); true,
rxdataF);
} }
uint8_t nb_re_dmrs;
if (dlsch[0].dlsch_config.dmrsConfigType == NFAPI_NR_DMRS_TYPE1) {
nb_re_dmrs = 6*dlsch[0].dlsch_config.n_dmrs_cdm_groups;
}
else {
nb_re_dmrs = 4*dlsch[0].dlsch_config.n_dmrs_cdm_groups;
}
uint16_t dmrs_len = get_num_dmrs(dlsch[0].dlsch_config.dlDmrsSymbPos);
const uint32_t rx_llr_size = nr_get_G(dlsch[0].dlsch_config.number_rbs,
dlsch[0].dlsch_config.number_symbols,
nb_re_dmrs,
dmrs_len,
dlsch[0].dlsch_config.qamModOrder,
dlsch[0].Nl);
const uint32_t rx_llr_layer_size = (rx_llr_size + dlsch[0].Nl - 1) / dlsch[0].Nl;
int16_t* llr[2];
int16_t* layer_llr[NR_MAX_NB_LAYERS];
llr[0] = (int16_t *)malloc16_clear(rx_llr_size*sizeof(int16_t));
for (int i=0; i<NR_MAX_NB_LAYERS; i++)
layer_llr[i] = (int16_t *)malloc16_clear(rx_llr_layer_size*sizeof(int16_t));
int ret = nr_ue_pdsch_procedures(ue, int ret = nr_ue_pdsch_procedures(ue,
proc, proc,
gnb_id, gnb_id,
dlsch); phy_data.dlsch,
llr,
layer_llr,
rxdataF);
if (ret >= 0) if (ret >= 0)
dec = nr_ue_dlsch_procedures(ue, dec = nr_ue_dlsch_procedures(ue,
proc, proc,
gnb_id, gnb_id,
dlsch, phy_data.dlsch,
NULL); llr);
// deactivate dlsch once dlsch proc is done // deactivate dlsch once dlsch proc is done
dlsch->active = 0; dlsch[0].active = 0;
free(llr[0]);
for (int i=0; i<NR_MAX_NB_LAYERS; i++)
free(layer_llr[i]);
} }
} }
} }
......
...@@ -49,7 +49,8 @@ ...@@ -49,7 +49,8 @@
#define PBCH_MAX_RE (PBCH_MAX_RE_PER_SYMBOL*4) #define PBCH_MAX_RE (PBCH_MAX_RE_PER_SYMBOL*4)
#define print_shorts(s,x) printf("%s : %d,%d,%d,%d,%d,%d,%d,%d\n",s,((int16_t*)x)[0],((int16_t*)x)[1],((int16_t*)x)[2],((int16_t*)x)[3],((int16_t*)x)[4],((int16_t*)x)[5],((int16_t*)x)[6],((int16_t*)x)[7]) #define print_shorts(s,x) printf("%s : %d,%d,%d,%d,%d,%d,%d,%d\n",s,((int16_t*)x)[0],((int16_t*)x)[1],((int16_t*)x)[2],((int16_t*)x)[3],((int16_t*)x)[4],((int16_t*)x)[5],((int16_t*)x)[6],((int16_t*)x)[7])
static uint16_t nr_pbch_extract(int **rxdataF, static uint16_t nr_pbch_extract(uint32_t rxdataF_sz,
int32_t rxdataF[][rxdataF_sz],
const int estimateSz, const int estimateSz,
struct complex16 dl_ch_estimates[][estimateSz], struct complex16 dl_ch_estimates[][estimateSz],
struct complex16 rxdataF_ext[][PBCH_MAX_RE_PER_SYMBOL], struct complex16 rxdataF_ext[][PBCH_MAX_RE_PER_SYMBOL],
...@@ -392,9 +393,9 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, ...@@ -392,9 +393,9 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
uint8_t i_ssb, uint8_t i_ssb,
MIMO_mode_t mimo_mode, MIMO_mode_t mimo_mode,
nr_phy_data_t *phy_data, nr_phy_data_t *phy_data,
fapiPbch_t *result) { fapiPbch_t *result,
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) {
NR_UE_COMMON *nr_ue_common_vars = &ue->common_vars;
int max_h=0; int max_h=0;
int symbol; int symbol;
//uint8_t pbch_a[64]; //uint8_t pbch_a[64];
...@@ -424,7 +425,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, ...@@ -424,7 +425,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
#ifdef DEBUG_PBCH #ifdef DEBUG_PBCH
//printf("address dataf %p",nr_ue_common_vars->rxdataF); //printf("address dataf %p",nr_ue_common_vars->rxdataF);
write_output("rxdataF0_pbch.m","rxF0pbch", write_output("rxdataF0_pbch.m","rxF0pbch",
&nr_ue_common_vars->rxdataF[0][(symbol_offset+1)*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size*3,1,1); &rxdataF[0][(symbol_offset+1)*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size*3,1,1);
#endif #endif
// symbol refers to symbol within SSB. symbol_offset is the offset of the SSB wrt start of slot // symbol refers to symbol within SSB. symbol_offset is the offset of the SSB wrt start of slot
double log2_maxh = 0; double log2_maxh = 0;
...@@ -434,7 +435,8 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, ...@@ -434,7 +435,8 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
__attribute__ ((aligned(32))) struct complex16 rxdataF_ext[frame_parms->nb_antennas_rx][PBCH_MAX_RE_PER_SYMBOL]; __attribute__ ((aligned(32))) struct complex16 rxdataF_ext[frame_parms->nb_antennas_rx][PBCH_MAX_RE_PER_SYMBOL];
__attribute__ ((aligned(32))) struct complex16 dl_ch_estimates_ext[frame_parms->nb_antennas_rx][PBCH_MAX_RE_PER_SYMBOL]; __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates_ext[frame_parms->nb_antennas_rx][PBCH_MAX_RE_PER_SYMBOL];
memset(dl_ch_estimates_ext,0, sizeof dl_ch_estimates_ext); memset(dl_ch_estimates_ext,0, sizeof dl_ch_estimates_ext);
nr_pbch_extract(nr_ue_common_vars->rxdataF, nr_pbch_extract(ue->frame_parms.samples_per_slot_wCP,
rxdataF,
estimateSz, estimateSz,
dl_ch_estimates, dl_ch_estimates,
rxdataF_ext, rxdataF_ext,
......
...@@ -543,10 +543,12 @@ void nr_dlsch_256qam_llr(NR_DL_FRAME_PARMS *frame_parms, ...@@ -543,10 +543,12 @@ void nr_dlsch_256qam_llr(NR_DL_FRAME_PARMS *frame_parms,
@param n_dmrs_cdm_groups @param n_dmrs_cdm_groups
@param frame_parms Pointer to frame descriptor @param frame_parms Pointer to frame descriptor
*/ */
void nr_dlsch_extract_rbs(int **rxdataF, void nr_dlsch_extract_rbs(uint32_t rxdataF_sz,
int **dl_ch_estimates, int rxdataF[][rxdataF_sz],
int **rxdataF_ext, uint32_t rx_size,
int **dl_ch_estimates_ext, int32_t dl_ch_estimates[][rx_size],
int32_t rxdataF_ext[][rx_size],
int32_t dl_ch_estimates_ext[][rx_size],
unsigned char symbol, unsigned char symbol,
uint8_t pilots, uint8_t pilots,
uint8_t config_type, uint8_t config_type,
...@@ -558,7 +560,6 @@ void nr_dlsch_extract_rbs(int **rxdataF, ...@@ -558,7 +560,6 @@ void nr_dlsch_extract_rbs(int **rxdataF,
uint16_t dlDmrsSymbPos, uint16_t dlDmrsSymbPos,
int chest_time_type); int chest_time_type);
/** \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)
@param rxdataF_ext Frequency-domain received signal in RBs to be demodulated @param rxdataF_ext Frequency-domain received signal in RBs to be demodulated
@param dl_ch_estimates_ext Frequency-domain channel estimates in RBs to be demodulated @param dl_ch_estimates_ext Frequency-domain channel estimates in RBs to be demodulated
...@@ -574,22 +575,23 @@ void nr_dlsch_extract_rbs(int **rxdataF, ...@@ -574,22 +575,23 @@ void nr_dlsch_extract_rbs(int **rxdataF,
@param output_shift Rescaling for compensated output (should be energy-normalizing) @param output_shift Rescaling for compensated output (should be energy-normalizing)
@param phy_measurements Pointer to UE PHY measurements @param phy_measurements Pointer to UE PHY measurements
*/ */
void nr_dlsch_channel_compensation(int32_t **rxdataF_ext, void nr_dlsch_channel_compensation(uint32_t rx_size,
int32_t **dl_ch_estimates_ext, int32_t rxdataF_ext[][rx_size],
int32_t **dl_ch_mag, int32_t dl_ch_estimates_ext[][rx_size],
int32_t **dl_ch_magb, int32_t dl_ch_mag[][rx_size],
int32_t **dl_ch_magr, int32_t dl_ch_magb[][rx_size],
int32_t **rxdataF_comp, int32_t dl_ch_magr[][rx_size],
int32_t ***rho, int32_t rxdataF_comp[][rx_size],
NR_DL_FRAME_PARMS *frame_parms, int ***rho,
uint8_t nb_aatx, NR_DL_FRAME_PARMS *frame_parms,
uint8_t symbol, uint8_t nb_aatx,
int length, unsigned char symbol,
uint8_t first_symbol_flag, int length,
uint8_t mod_order, uint8_t first_symbol_flag,
uint16_t nb_rb, unsigned char mod_order,
uint8_t output_shift, unsigned short nb_rb,
PHY_NR_MEASUREMENTS *phy_measurements); unsigned char output_shift,
PHY_NR_MEASUREMENTS *measurements);
void nr_dlsch_channel_compensation_core(int **rxdataF_ext, void nr_dlsch_channel_compensation_core(int **rxdataF_ext,
int **dl_ch_estimates_ext, int **dl_ch_estimates_ext,
...@@ -611,18 +613,20 @@ void nr_dlsch_deinterleaving(uint8_t symbol, ...@@ -611,18 +613,20 @@ void nr_dlsch_deinterleaving(uint8_t symbol,
uint16_t *llr_deint, uint16_t *llr_deint,
uint16_t nb_rb_pdsch); uint16_t nb_rb_pdsch);
void nr_dlsch_channel_level_median(int **dl_ch_estimates_ext, void nr_dlsch_channel_level_median(uint32_t rx_size,
int32_t *median, int32_t dl_ch_estimates[][rx_size],
int n_tx, int32_t *median,
int n_rx, int n_tx,
int length, int n_rx,
int start_point); int length,
int start_point);
void nr_dlsch_detection_mrc(int **rxdataF_comp, void nr_dlsch_detection_mrc(uint32_t rx_size,
int32_t rxdataF_comp[][rx_size],
int ***rho, int ***rho,
int **dl_ch_mag, int32_t dl_ch_mag[][rx_size],
int **dl_ch_magb, int32_t dl_ch_magb[][rx_size],
int **dl_ch_magr, int32_t dl_ch_magr[][rx_size],
short n_tx, short n_tx,
short n_rx, short n_rx,
unsigned char symbol, unsigned char symbol,
...@@ -647,23 +651,24 @@ void nr_a_sum_b(__m128i *input_x, ...@@ -647,23 +651,24 @@ void nr_a_sum_b(__m128i *input_x,
@param pilots_flag Flag to indicate pilots in symbol @param pilots_flag Flag to indicate pilots in symbol
@param nb_rb Number of allocated RBs @param nb_rb Number of allocated RBs
*/ */
void nr_dlsch_channel_level(int **dl_ch_estimates_ext, void nr_dlsch_channel_level(uint32_t rx_size,
NR_DL_FRAME_PARMS *frame_parms, int32_t dl_ch_estimates[][rx_size],
uint8_t n_tx, NR_DL_FRAME_PARMS *frame_parms,
int32_t *avg, uint8_t n_tx,
uint8_t symbol, int32_t *avg,
uint32_t len, uint8_t symbol,
unsigned short nb_rb); uint32_t len,
unsigned short nb_rb);
void nr_dlsch_scale_channel(int32_t **dl_ch_estimates_ext, void nr_dlsch_scale_channel(uint32_t rx_size,
NR_DL_FRAME_PARMS *frame_parms, int32_t dl_ch_estimates[][rx_size],
uint8_t n_tx, NR_DL_FRAME_PARMS *frame_parms,
uint8_t n_rx, uint8_t n_tx,
uint8_t symbol, uint8_t n_rx,
uint8_t start_symbol, uint8_t symbol,
uint32_t len, uint8_t pilots,
uint16_t nb_rb); uint32_t len,
unsigned short nb_rb);
/** \brief This is the top-level entry point for DLSCH decoding in UE. It should be replicated on several /** \brief This is the top-level entry point for DLSCH decoding in UE. It should be replicated on several
threads (on multi-core machines) corresponding to different HARQ processes. The routine first threads (on multi-core machines) corresponding to different HARQ processes. The routine first
...@@ -751,7 +756,8 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue, ...@@ -751,7 +756,8 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
int32_t pdcch_est_size, int32_t pdcch_est_size,
int32_t pdcch_dl_ch_estimates[][pdcch_est_size], int32_t pdcch_dl_ch_estimates[][pdcch_est_size],
int16_t *pdcch_e_rx, int16_t *pdcch_e_rx,
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15); fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15,
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
/*! \brief Performs detection of SSS to find cell ID and other framing parameters (FDD/TDD, normal/extended prefix) /*! \brief Performs detection of SSS to find cell ID and other framing parameters (FDD/TDD, normal/extended prefix)
...@@ -777,12 +783,14 @@ int nr_rx_pbch(PHY_VARS_NR_UE *ue, ...@@ -777,12 +783,14 @@ int nr_rx_pbch(PHY_VARS_NR_UE *ue,
uint8_t i_ssb, uint8_t i_ssb,
MIMO_mode_t mimo_mode, MIMO_mode_t mimo_mode,
nr_phy_data_t *phy_data, nr_phy_data_t *phy_data,
fapiPbch_t* result); fapiPbch_t* result,
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
int nr_pbch_detection(UE_nr_rxtx_proc_t *proc, int nr_pbch_detection(UE_nr_rxtx_proc_t *proc,
PHY_VARS_NR_UE *ue, PHY_VARS_NR_UE *ue,
int pbch_initial_symbol, int pbch_initial_symbol,
nr_phy_data_t *phy_data); nr_phy_data_t *phy_data,
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
#ifndef modOrder #ifndef modOrder
...@@ -862,14 +870,31 @@ uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue, ...@@ -862,14 +870,31 @@ uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
*/ */
int nr_rx_pdsch(PHY_VARS_NR_UE *ue, int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc, UE_nr_rxtx_proc_t *proc,
NR_UE_DLSCH_t *dlsch, NR_UE_DLSCH_t dlsch[2],
unsigned char gNB_id, unsigned char gNB_id,
unsigned char gNB_id_i, //if this == ue->n_connected_eNB, we assume MU interference unsigned char gNB_id_i,
uint32_t frame, uint32_t frame,
uint8_t nr_slot_rx, uint8_t nr_slot_rx,
unsigned char symbol, unsigned char symbol,
unsigned char first_symbol_flag, unsigned char first_symbol_flag,
unsigned char harq_pid); unsigned char harq_pid,
uint32_t pdsch_est_size,
int32_t dl_ch_estimates[][pdsch_est_size],
int16_t *llr[2],
int16_t *layer_llr[NR_MAX_NB_LAYERS],
c16_t ptrs_phase_per_slot[][NR_SYMBOLS_PER_SLOT],
int32_t ptrs_re_per_slot[][NR_SYMBOLS_PER_SLOT],
uint32_t dl_valid_re[NR_SYMBOLS_PER_SLOT],
uint32_t rx_size,
int32_t dl_ch_estimates_ext[][rx_size],
int32_t rxdataF_ext[][rx_size],
int32_t rxdataF_comp[][rx_size],
int32_t dl_ch_mag[][rx_size],
int32_t dl_ch_magb[][rx_size],
int32_t dl_ch_magr[][rx_size],
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP],
uint32_t llr_offset[NR_SYMBOLS_PER_SLOT],
int32_t *log2_maxh);
int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t slot); int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t slot);
......
...@@ -318,13 +318,13 @@ int do_pss_sss_extract_nr(PHY_VARS_NR_UE *ue, ...@@ -318,13 +318,13 @@ int do_pss_sss_extract_nr(PHY_VARS_NR_UE *ue,
int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR], int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR],
int32_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR], int32_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR],
uint8_t doPss, uint8_t doSss, uint8_t doPss, uint8_t doSss,
uint8_t subframe) // add flag to indicate extracting only PSS, only SSS, or both uint8_t subframe,
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) // add flag to indicate extracting only PSS, only SSS, or both
{ {
uint8_t aarx; uint8_t aarx;
int32_t *pss_rxF,*pss_rxF_ext; int32_t *pss_rxF,*pss_rxF_ext;
int32_t *sss_rxF,*sss_rxF_ext; int32_t *sss_rxF,*sss_rxF_ext;
uint8_t pss_symbol, sss_symbol; uint8_t pss_symbol, sss_symbol;
int32_t **rxdataF;
NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
...@@ -332,8 +332,6 @@ int do_pss_sss_extract_nr(PHY_VARS_NR_UE *ue, ...@@ -332,8 +332,6 @@ int do_pss_sss_extract_nr(PHY_VARS_NR_UE *ue,
pss_symbol = 0; pss_symbol = 0;
sss_symbol = SSS_SYMBOL_NB-PSS_SYMBOL_NB; sss_symbol = SSS_SYMBOL_NB-PSS_SYMBOL_NB;
rxdataF = ue->common_vars.rxdataF;
unsigned int ofdm_symbol_size = frame_parms->ofdm_symbol_size; unsigned int ofdm_symbol_size = frame_parms->ofdm_symbol_size;
pss_rxF = &rxdataF[aarx][pss_symbol*ofdm_symbol_size]; pss_rxF = &rxdataF[aarx][pss_symbol*ofdm_symbol_size];
...@@ -402,9 +400,10 @@ int pss_sss_extract_nr(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -402,9 +400,10 @@ int pss_sss_extract_nr(PHY_VARS_NR_UE *phy_vars_ue,
UE_nr_rxtx_proc_t *proc, UE_nr_rxtx_proc_t *proc,
int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR], int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR],
int32_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR], int32_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR],
uint8_t subframe) uint8_t subframe,
int32_t rxdataF[][phy_vars_ue->frame_parms.samples_per_slot_wCP])
{ {
return do_pss_sss_extract_nr(phy_vars_ue, proc, pss_ext, sss_ext, 1 /* doPss */, 1 /* doSss */, subframe); return do_pss_sss_extract_nr(phy_vars_ue, proc, pss_ext, sss_ext, 1 /* doPss */, 1 /* doSss */, subframe, rxdataF);
} }
/******************************************************************* /*******************************************************************
...@@ -420,7 +419,7 @@ int pss_sss_extract_nr(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -420,7 +419,7 @@ int pss_sss_extract_nr(PHY_VARS_NR_UE *phy_vars_ue,
* *
*********************************************************************/ *********************************************************************/
int rx_sss_nr(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int32_t *tot_metric, uint8_t *phase_max, int *freq_offset_sss) int rx_sss_nr(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int32_t *tot_metric, uint8_t *phase_max, int *freq_offset_sss, int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
{ {
uint8_t i; uint8_t i;
int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR]; int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR];
...@@ -439,7 +438,8 @@ int rx_sss_nr(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int32_t *tot_metric, ...@@ -439,7 +438,8 @@ int rx_sss_nr(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int32_t *tot_metric,
proc, proc,
pss_ext, pss_ext,
sss_ext, sss_ext,
0); /* subframe */ 0,
rxdataF); /* subframe */
#ifdef DEBUG_PLOT_SSS #ifdef DEBUG_PLOT_SSS
......
...@@ -788,13 +788,19 @@ static void ueChannelResponse (scopeGraphData_t **data, OAIgraph_t *graph, PHY_ ...@@ -788,13 +788,19 @@ static void ueChannelResponse (scopeGraphData_t **data, OAIgraph_t *graph, PHY_
} }
static void ueFreqWaterFall (scopeGraphData_t **data, OAIgraph_t *graph,PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id ) { static void ueFreqWaterFall (scopeGraphData_t **data, OAIgraph_t *graph,PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id ) {
NR_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->frame_parms;
//use 1st antenna //use 1st antenna
if (!data[commonRxdataF])
return;
const int sz = data[commonRxdataF]->lineSz;
scopeSample_t *rxdataF = (scopeSample_t *)(data[commonRxdataF]+1);
genericWaterFall(graph, genericWaterFall(graph,
(scopeSample_t *)phy_vars_ue->common_vars.rxdataF[0], rxdataF,
frame_parms->samples_per_slot_wCP, sz,
phy_vars_ue->frame_parms.slots_per_frame, 1,
"X axis: one frame frequency" ); "X axis: one slot frequency" );
} }
/* /*
static void uePbchFrequencyResp (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { static void uePbchFrequencyResp (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
...@@ -925,70 +931,48 @@ static void uePcchIQ (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_U ...@@ -925,70 +931,48 @@ static void uePcchIQ (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_U
} }
static void uePdschLLR (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { static void uePdschLLR (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// PDSCH LLRs // PDSCH LLRs
if (!phy_vars_ue->pdsch_vars[eNB_id]->llr[0]) if (!data[pdschLlr])
return; return;
int num_re = 4500; const int sz = data[pdschLlr]->lineSz;
int Qm = 2;
int coded_bits_per_codeword = num_re*Qm;
int newsz = 0;
float *llr, *bit; float *llr, *bit;
int nx = sz;
int16_t *pdsch_llr = (int16_t *)(data[pdschLlr]+1);
#ifndef WEBSRVSCOPE
oai_xygraph_getbuff(graph, &bit, &llr, coded_bits_per_codeword*RX_NB_TH_MAX, 0);
#endif
int base=0;
for (int thr=0 ; thr < RX_NB_TH_MAX ; thr ++ ) {
int16_t *pdsch_llr = (int16_t *) phy_vars_ue->pdsch_vars[eNB_id]->llr[0]; // stream 0
#ifdef WEBSRVSCOPE #ifdef WEBSRVSCOPE
newsz += websrv_cpllrbuff_tomsg(graph, pdsch_llr, coded_bits_per_codeword, 0, thr, RX_NB_TH_MAX); nx = websrv_cpllrbuff_tomsg(graph, pdsch_llr, sz, UE_id, 0, 0);
#else #else
for (int i=0; i<coded_bits_per_codeword; i++) { oai_xygraph_getbuff(graph, &bit, &llr, sz, 0);
llr[base+i] = (float) pdsch_llr[i];
bit[base+i] = (float) base+i; for (int i=0; i<sz; i++) {
} llr[i] = (float) pdsch_llr[i];
newsz += coded_bits_per_codeword;
#endif
base+=coded_bits_per_codeword;
} }
#endif
AssertFatal(base <= coded_bits_per_codeword*RX_NB_TH_MAX, "");
//fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword); //fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword);
oai_xygraph(graph, bit, llr, newsz, 0, 10); oai_xygraph(graph, bit, llr, nx, 0, 10);
} }
static void uePdschIQ (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { static void uePdschIQ (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// PDSCH I/Q of MF Output // PDSCH I/Q of MF Output
if (!phy_vars_ue->pdsch_vars[eNB_id]->rxdataF_comp0[0]) if (!data[pdschRxdataF_comp])
return; return;
NR_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms; const int sz=data[pdschRxdataF_comp]->lineSz;
int sz=7*2*frame_parms->N_RB_DL*12; // size of the malloced buffer int nz = sz;
int newsz = 0;
float *I, *Q; float *I, *Q;
int base=0; scopeSample_t *pdsch_comp = (scopeSample_t *) (data[pdschRxdataF_comp]+1);
#ifndef WEBSRVSCOPE
oai_xygraph_getbuff(graph, &I, &Q, sz * RX_NB_TH_MAX, 0);
memset(I+base, 0, sz*RX_NB_TH_MAX * sizeof(*I));
memset(Q+base, 0, sz*RX_NB_TH_MAX * sizeof(*Q));
#endif
for (int thr=0 ; thr < RX_NB_TH_MAX ; thr ++ ) {
scopeSample_t *pdsch_comp = (scopeSample_t *) phy_vars_ue->pdsch_vars[eNB_id]->rxdataF_comp0[0];
#ifdef WEBSRVSCOPE #ifdef WEBSRVSCOPE
newsz += websrv_cpiqbuff_tomsg(graph, pdsch_comp, sz, 0, base); nz += websrv_cpiqbuff_tomsg(graph, pdsch_comp, sz, 0, 0);
#else #else
for (int s=0; s<sz; s++) { oai_xygraph_getbuff(graph, &I, &Q, sz, 0);
I[s+base] += pdsch_comp[s].r;
Q[s+base] += pdsch_comp[s].i; for (int s=0; s<sz; s++) {
} I[s] = pdsch_comp[s].r;
newsz += sz; Q[s] = pdsch_comp[s].i;
#endif
base+=sz;
} }
#endif
AssertFatal(base <= sz*RX_NB_TH_MAX, ""); oai_xygraph(graph, I, Q, nz, 0, 10);
oai_xygraph(graph, I, Q, newsz, 0, 10);
} }
static void uePdschThroughput (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { static void uePdschThroughput (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
/* /*
...@@ -1153,19 +1137,23 @@ static void *nrUEscopeThread(void *arg) { ...@@ -1153,19 +1137,23 @@ static void *nrUEscopeThread(void *arg) {
} }
#endif #endif
pthread_mutex_t UEcopyDataMutex;
void UEcopyData(PHY_VARS_NR_UE *ue, enum UEdataType type, void *dataIn, int elementSz, int colSz, int lineSz) { void UEcopyData(PHY_VARS_NR_UE *ue, enum UEdataType type, void *dataIn, int elementSz, int colSz, int lineSz) {
// Local static copy of the scope data bufs // Local static copy of the scope data bufs
// The active data buf is alterned to avoid interference between the Scope thread (display) and the Rx thread (data input) // The active data buf is alterned to avoid interference between the Scope thread (display) and the Rx thread (data input)
// Index of "2" could be set to the number of Rx threads + 1 // Index of "2" could be set to the number of Rx threads + 1
static scopeGraphData_t *copyDataBufs[UEdataTypeNumberOfItems][2] = {0}; static scopeGraphData_t *copyDataBufs[UEdataTypeNumberOfItems][3] = {0};
static int copyDataBufsIdx[UEdataTypeNumberOfItems] = {0}; static int copyDataBufsIdx[UEdataTypeNumberOfItems] = {0};
scopeData_t *tmp=(scopeData_t *)ue->scopeData; scopeData_t *tmp=(scopeData_t *)ue->scopeData;
if (tmp) { if (tmp) {
// Begin of critical zone between UE Rx threads that might copy new data at the same time: might require a mutex // Begin of critical zone between UE Rx threads that might copy new data at the same time:
int newCopyDataIdx = (copyDataBufsIdx[type]==0)?1:0; pthread_mutex_lock(&UEcopyDataMutex);
int newCopyDataIdx = (copyDataBufsIdx[type]<2)?copyDataBufsIdx[type]+1:0;
copyDataBufsIdx[type] = newCopyDataIdx; copyDataBufsIdx[type] = newCopyDataIdx;
pthread_mutex_unlock(&UEcopyDataMutex);
// End of critical zone between UE Rx threads // End of critical zone between UE Rx threads
// New data will be copied in a different buffer than the live one // New data will be copied in a different buffer than the live one
...@@ -1204,6 +1192,7 @@ STATICFORXSCOPE void nrUEinitScope(PHY_VARS_NR_UE *ue) ...@@ -1204,6 +1192,7 @@ STATICFORXSCOPE void nrUEinitScope(PHY_VARS_NR_UE *ue)
pthread_t forms_thread; pthread_t forms_thread;
threadCreate(&forms_thread, nrUEscopeThread, ue, "scope", -1, OAI_PRIORITY_RT_LOW); threadCreate(&forms_thread, nrUEscopeThread, ue, "scope", -1, OAI_PRIORITY_RT_LOW);
#endif #endif
pthread_mutex_init(&UEcopyDataMutex, NULL);
} }
void nrscope_autoinit(void *dataptr) { void nrscope_autoinit(void *dataptr) {
......
...@@ -47,6 +47,9 @@ enum UEdataType { ...@@ -47,6 +47,9 @@ enum UEdataType {
pbchRxdataF_comp, pbchRxdataF_comp,
pdcchLlr, pdcchLlr,
pdcchRxdataF_comp, pdcchRxdataF_comp,
pdschLlr,
pdschRxdataF_comp,
commonRxdataF,
UEdataTypeNumberOfItems UEdataTypeNumberOfItems
}; };
......
...@@ -232,11 +232,6 @@ typedef struct { ...@@ -232,11 +232,6 @@ typedef struct {
/// - second index: sample [0..2*FRAME_LENGTH_COMPLEX_SAMPLES+2048[ /// - second index: sample [0..2*FRAME_LENGTH_COMPLEX_SAMPLES+2048[
int32_t **rxdata; int32_t **rxdata;
/// \brief Holds the received data in the frequency domain.
/// - first index: rx antenna [0..nb_antennas_rx[
/// - second index: symbol [0..28*ofdm_symbol_size[
int32_t **rxdataF;
/// holds output of the sync correlator /// holds output of the sync correlator
int32_t *sync_corr; int32_t *sync_corr;
/// estimated frequency offset (in radians) for all subcarriers /// estimated frequency offset (in radians) for all subcarriers
...@@ -245,97 +240,6 @@ typedef struct { ...@@ -245,97 +240,6 @@ typedef struct {
int32_t eNb_id; int32_t eNb_id;
} NR_UE_COMMON; } NR_UE_COMMON;
typedef struct {
/// \brief Received frequency-domain signal after extraction.
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
/// - second index: ? [0..168*N_RB_DL[
int32_t **rxdataF_ext;
/// \brief Received frequency-domain ue specific pilots.
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
/// - second index: ? [0..12*N_RB_DL[
int32_t **rxdataF_uespec_pilots;
/// \brief Received frequency-domain signal after extraction and channel compensation.
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
/// - second index: ? [0..168*N_RB_DL[
int32_t **rxdataF_comp0;
/// \brief Hold the channel estimates in frequency domain.
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
/// - second index: samples? [0..symbols_per_tti*(ofdm_symbol_size+LTE_CE_FILTER_LENGTH)[
int32_t **dl_ch_estimates;
/// \brief Downlink channel estimates extracted in PRBS.
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
/// - second index: ? [0..168*N_RB_DL[
int32_t **dl_ch_estimates_ext;
/// \brief Downlink beamforming channel estimates in frequency domain.
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
/// - second index: samples? [0..symbols_per_tti*(ofdm_symbol_size+LTE_CE_FILTER_LENGTH)[
int32_t **dl_bf_ch_estimates;
/// \brief Downlink beamforming channel estimates.
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
/// - second index: ? [0..168*N_RB_DL[
int32_t **dl_bf_ch_estimates_ext;
/// \brief Downlink PMIs extracted in PRBS and grouped in subbands.
/// - first index: ressource block [0..N_RB_DL[
uint8_t *pmi_ext;
/// \brief Magnitude of Downlink Channel first layer (16QAM level/First 64QAM level).
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
/// - second index: ? [0..168*N_RB_DL[
int32_t **dl_ch_mag0;
/// \brief Magnitude of Downlink Channel, first layer (2nd 64QAM level).
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
/// - second index: ? [0..168*N_RB_DL[
int32_t **dl_ch_magb0;
/// \brief Magnitude of Downlink Channel, first layer (256QAM level).
int32_t **dl_ch_magr0;
/// \brief Cross-correlation Matrix of the gNB Tx channel signals.
/// - first index: aatx*n_rx+aarx for all aatx=[0..n_tx[ and aarx=[0..nb_rx[
/// - second index: symbol [0..]
int32_t ***rho;
/// \brief Pointers to llr vectors (2 TBs).
/// - first index: ? [0..1] (hard coded)
/// - second index: ? [0..1179743] (hard coded)
int16_t *llr[2];
/// Pointers to layer llr vectors (4 layers).
int16_t *layer_llr[4];
/// \f$\log_2(\max|H_i|^2)\f$
int16_t log2_maxh;
/// \f$\log_2(\max|H_i|^2)\f$ //this is for TM3-4 layer1 channel compensation
int16_t log2_maxh0;
/// \f$\log_2(\max|H_i|^2)\f$ //this is for TM3-4 layer2 channel commpensation
int16_t log2_maxh1;
/// \brief LLR shifts for subband scaling.
/// - first index: ? [0..168*N_RB_DL[
uint8_t *llr_shifts;
/// \brief Pointer to LLR shifts.
/// - first index: ? [0..168*N_RB_DL[
uint8_t *llr_shifts_p;
/// \brief Pointers to llr vectors (128-bit alignment).
/// - first index: ? [0..0] (hard coded)
/// - second index: ? [0..]
int16_t **llr128;
/// \brief Pointers to llr vectors (128-bit alignment).
/// - first index: ? [0..0] (hard coded)
/// - second index: ? [0..]
int16_t **llr128_2ndstream;
//uint32_t *rb_alloc;
//uint8_t Qm[2];
//MIMO_mode_t mimo_mode;
// llr offset per ofdm symbol
uint32_t llr_offset[14];
// llr length per ofdm symbol
uint32_t llr_length[14];
// llr offset per ofdm symbol
uint32_t dl_valid_re[14];
/// \brief Estimated phase error based upon PTRS on each symbol .
/// - first index: ? [0..7] Number of Antenna
/// - second index: ? [0...14] smybol per slot
int32_t **ptrs_phase_per_slot;
/// \brief Estimated phase error based upon PTRS on each symbol .
/// - first index: ? [0..7] Number of Antenna
/// - second index: ? [0...14] smybol per slot
int32_t **ptrs_re_per_slot;
} NR_UE_PDSCH;
#define NR_PRS_IDFT_OVERSAMP_FACTOR 1 // IDFT oversampling factor for NR PRS channel estimates in time domain, ALLOWED value 16x, and 1x is default(ie. IDFT size is frame_params->ofdm_symbol_size) #define NR_PRS_IDFT_OVERSAMP_FACTOR 1 // IDFT oversampling factor for NR PRS channel estimates in time domain, ALLOWED value 16x, and 1x is default(ie. IDFT size is frame_params->ofdm_symbol_size)
typedef struct { typedef struct {
prs_config_t prs_cfg; prs_config_t prs_cfg;
...@@ -532,7 +436,6 @@ typedef struct { ...@@ -532,7 +436,6 @@ typedef struct {
fapi_nr_config_request_t nrUE_config; fapi_nr_config_request_t nrUE_config;
NR_UE_PDSCH *pdsch_vars[NUMBER_OF_CONNECTED_gNB_MAX+1];
NR_UE_PBCH *pbch_vars[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_PBCH *pbch_vars[NUMBER_OF_CONNECTED_gNB_MAX];
NR_UE_PRACH *prach_vars[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_PRACH *prach_vars[NUMBER_OF_CONNECTED_gNB_MAX];
NR_UE_CSI_IM *csiim_vars[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_CSI_IM *csiim_vars[NUMBER_OF_CONNECTED_gNB_MAX];
...@@ -540,7 +443,7 @@ typedef struct { ...@@ -540,7 +443,7 @@ typedef struct {
NR_UE_SRS *srs_vars[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_SRS *srs_vars[NUMBER_OF_CONNECTED_gNB_MAX];
NR_UE_PRS *prs_vars[NR_MAX_PRS_COMB_SIZE]; NR_UE_PRS *prs_vars[NR_MAX_PRS_COMB_SIZE];
uint8_t prs_active_gNBs; uint8_t prs_active_gNBs;
NR_DL_UE_HARQ_t dl_harq_processes[NR_MAX_NB_LAYERS>4 ? 2:1][NR_MAX_DLSCH_HARQ_PROCESSES]; NR_DL_UE_HARQ_t dl_harq_processes[2][NR_MAX_DLSCH_HARQ_PROCESSES];
NR_UL_UE_HARQ_t ul_harq_processes[NR_MAX_ULSCH_HARQ_PROCESSES]; NR_UL_UE_HARQ_t ul_harq_processes[NR_MAX_ULSCH_HARQ_PROCESSES];
//Paging parameters //Paging parameters
...@@ -750,6 +653,14 @@ typedef struct { ...@@ -750,6 +653,14 @@ typedef struct {
int dl_errors; int dl_errors;
int dl_stats[8]; int dl_stats[8];
void* scopeData; void* scopeData;
// Pointers to hold PDSCH data only for phy simulators
void *phy_sim_rxdataF;
void *phy_sim_pdsch_llr;
void *phy_sim_pdsch_rxdataF_ext;
void *phy_sim_pdsch_rxdataF_comp;
void *phy_sim_pdsch_dl_ch_estimates;
void *phy_sim_pdsch_dl_ch_estimates_ext;
bool phy_sim_mode;
} PHY_VARS_NR_UE; } PHY_VARS_NR_UE;
typedef struct nr_phy_data_tx_s { typedef struct nr_phy_data_tx_s {
...@@ -759,7 +670,7 @@ typedef struct nr_phy_data_tx_s { ...@@ -759,7 +670,7 @@ typedef struct nr_phy_data_tx_s {
typedef struct nr_phy_data_s { typedef struct nr_phy_data_s {
NR_UE_PDCCH_CONFIG phy_pdcch_config; NR_UE_PDCCH_CONFIG phy_pdcch_config;
NR_UE_DLSCH_t dlsch[NR_MAX_NB_LAYERS>4 ? 2:1]; NR_UE_DLSCH_t dlsch[2];
} nr_phy_data_t; } nr_phy_data_t;
/* this structure is used to pass both UE phy vars and /* this structure is used to pass both UE phy vars and
* proc to the function UE_thread_rxn_txnp4 * proc to the function UE_thread_rxn_txnp4
......
...@@ -175,13 +175,16 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind, ...@@ -175,13 +175,16 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind,
bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc, UE_nr_rxtx_proc_t *proc,
int gNB_id, int gNB_id,
NR_UE_DLSCH_t *dlsch0, NR_UE_DLSCH_t dlsch[2],
NR_UE_DLSCH_t *dlsch1); int16_t* llr[2]);
int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc, UE_nr_rxtx_proc_t *proc,
int gNB_id, int gNB_id,
NR_UE_DLSCH_t *dlsch); NR_UE_DLSCH_t dlsch[2],
int16_t *llr[2],
int16_t *layer_llr[NR_MAX_NB_LAYERS],
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
int nr_ue_pdcch_procedures(uint8_t gNB_id, int nr_ue_pdcch_procedures(uint8_t gNB_id,
PHY_VARS_NR_UE *ue, PHY_VARS_NR_UE *ue,
...@@ -189,11 +192,12 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id, ...@@ -189,11 +192,12 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
int32_t pdcch_est_size, int32_t pdcch_est_size,
int32_t pdcch_dl_ch_estimates[][pdcch_est_size], int32_t pdcch_dl_ch_estimates[][pdcch_est_size],
nr_phy_data_t *phy_data, nr_phy_data_t *phy_data,
int n_ss); int n_ss,
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id); int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id, int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
int nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id); int nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id, int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
#endif #endif
...@@ -65,6 +65,11 @@ ...@@ -65,6 +65,11 @@
/*************** FUNCTIONS ****************************************/ /*************** FUNCTIONS ****************************************/
/** \brief This function update uplink harq context and return transmission type (new transmission or retransmission)
@param ulsch uplink harq context
@param harq process identifier harq_pid
@returns retransmission or new transmission */
harq_result_t uplink_harq_process(NR_UE_ULSCH_t *ulsch, int harq_pid, NR_UL_UE_HARQ_t harq_processes[NR_MAX_ULSCH_HARQ_PROCESSES], int ndi, uint8_t rnti_type); harq_result_t uplink_harq_process(NR_UE_ULSCH_t *ulsch, int harq_pid, NR_UL_UE_HARQ_t harq_processes[NR_MAX_ULSCH_HARQ_PROCESSES], int ndi, uint8_t rnti_type);
/** \brief This function initialises downlink HARQ status /** \brief This function initialises downlink HARQ status
......
This diff is collapsed.
...@@ -410,7 +410,7 @@ int main(int argc, char **argv) ...@@ -410,7 +410,7 @@ int main(int argc, char **argv)
nr_ue_dlsch_init(dlsch_ue, num_codeword, 5); nr_ue_dlsch_init(dlsch_ue, num_codeword, 5);
for (int i=0; i < num_codeword; i++) for (int i=0; i < num_codeword; i++)
dlsch_ue[0].rnti = n_rnti; dlsch_ue[0].rnti = n_rnti;
nr_init_dl_harq_processes(UE->dl_harq_processes[0], 8, nb_rb); nr_init_dl_harq_processes(UE->dl_harq_processes, 8, nb_rb);
unsigned char harq_pid = 0; //dlsch->harq_ids[subframe]; unsigned char harq_pid = 0; //dlsch->harq_ids[subframe];
processingData_L1tx_t msgDataTx; processingData_L1tx_t msgDataTx;
...@@ -616,9 +616,7 @@ int main(int argc, char **argv) ...@@ -616,9 +616,7 @@ int main(int argc, char **argv)
free(RC.gNB[0]); free(RC.gNB[0]);
free(RC.gNB); free(RC.gNB);
int num_cw = NR_MAX_NB_LAYERS > 4? 2:1; free_nr_ue_dl_harq(UE->dl_harq_processes, 8, nb_rb);
for (int i = 0; i < num_cw; i++)
free_nr_ue_dl_harq(UE->dl_harq_processes[i], 8, nb_rb);
term_nr_ue_signal(UE, 1); term_nr_ue_signal(UE, 1);
free(UE); free(UE);
......
...@@ -957,6 +957,7 @@ int main(int argc, char **argv) ...@@ -957,6 +957,7 @@ int main(int argc, char **argv)
memcpy(&UE->frame_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS)); memcpy(&UE->frame_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS));
UE->frame_parms.nb_antennas_rx = n_rx; UE->frame_parms.nb_antennas_rx = n_rx;
UE->max_ldpc_iterations = max_ldpc_iterations; UE->max_ldpc_iterations = max_ldpc_iterations;
UE->phy_sim_mode = true;
if (run_initial_sync==1) UE->is_synchronized = 0; if (run_initial_sync==1) UE->is_synchronized = 0;
else {UE->is_synchronized = 1; UE->UE_mode[0]=PUSCH;} else {UE->is_synchronized = 1; UE->UE_mode[0]=PUSCH;}
...@@ -1049,6 +1050,14 @@ int main(int argc, char **argv) ...@@ -1049,6 +1050,14 @@ int main(int argc, char **argv)
msgDataTx->frame = frame; msgDataTx->frame = frame;
memset(msgDataTx->ssb, 0, 64*sizeof(NR_gNB_SSB_t)); memset(msgDataTx->ssb, 0, 64*sizeof(NR_gNB_SSB_t));
// Buffers to store internal memory of slot process
UE->phy_sim_rxdataF = calloc(frame_parms->samples_per_slot_wCP*sizeof(int32_t), frame_parms->nb_antennas_rx);
UE->phy_sim_pdsch_llr = calloc((8*(3*8*8448))*sizeof(int16_t), 1); //Max length
UE->phy_sim_pdsch_rxdataF_ext = calloc(14*frame_parms->N_RB_DL*12*sizeof(int32_t), frame_parms->nb_antennas_rx);
UE->phy_sim_pdsch_rxdataF_comp = calloc(14*frame_parms->N_RB_DL*12*sizeof(int32_t), frame_parms->nb_antennas_rx);
UE->phy_sim_pdsch_dl_ch_estimates = calloc(14*frame_parms->ofdm_symbol_size*sizeof(int32_t), frame_parms->nb_antennas_rx);
UE->phy_sim_pdsch_dl_ch_estimates_ext = calloc(14*frame_parms->N_RB_DL*12*sizeof(int32_t), frame_parms->nb_antennas_rx);
for (SNR = snr0; SNR < snr1; SNR += .2) { for (SNR = snr0; SNR < snr1; SNR += .2) {
varArray_t *table_tx=initVarArray(1000,sizeof(double)); varArray_t *table_tx=initVarArray(1000,sizeof(double));
...@@ -1278,8 +1287,7 @@ int main(int argc, char **argv) ...@@ -1278,8 +1287,7 @@ int main(int argc, char **argv)
if (dlsch0->last_iteration_cnt >= dlsch0->max_ldpc_iterations+1) if (dlsch0->last_iteration_cnt >= dlsch0->max_ldpc_iterations+1)
n_errors[round]++; n_errors[round]++;
NR_UE_PDSCH **pdsch_vars = UE->pdsch_vars; int16_t *UE_llr = (int16_t*)UE->phy_sim_pdsch_llr;
int16_t *UE_llr = pdsch_vars[0]->llr[0];
TBS = dlsch0->dlsch_config.TBS;//rel15->TBSize[0]; TBS = dlsch0->dlsch_config.TBS;//rel15->TBSize[0];
uint16_t length_dmrs = get_num_dmrs(rel15->dlDmrsSymbPos); uint16_t length_dmrs = get_num_dmrs(rel15->dlDmrsSymbPos);
...@@ -1417,11 +1425,11 @@ int main(int argc, char **argv) ...@@ -1417,11 +1425,11 @@ int main(int argc, char **argv)
LOG_M("rxsig0.m","rxs0", UE->common_vars.rxdata[0], frame_length_complex_samples, 1, 1); LOG_M("rxsig0.m","rxs0", UE->common_vars.rxdata[0], frame_length_complex_samples, 1, 1);
if (UE->frame_parms.nb_antennas_rx>1) if (UE->frame_parms.nb_antennas_rx>1)
LOG_M("rxsig1.m","rxs1", UE->common_vars.rxdata[1], frame_length_complex_samples, 1, 1); LOG_M("rxsig1.m","rxs1", UE->common_vars.rxdata[1], frame_length_complex_samples, 1, 1);
LOG_M("rxF0.m","rxF0", UE->common_vars.rxdataF[0], frame_parms->samples_per_slot_wCP, 1, 1); LOG_M("rxF0.m","rxF0", UE->phy_sim_rxdataF, frame_parms->samples_per_slot_wCP, 1, 1);
LOG_M("rxF_ext.m","rxFe",&UE->pdsch_vars[0]->rxdataF_ext[0][0],g_rbSize*12*14,1,1); LOG_M("rxF_ext.m","rxFe",UE->phy_sim_pdsch_rxdataF_ext,g_rbSize*12*14,1,1);
LOG_M("chestF0.m","chF0",&UE->pdsch_vars[0]->dl_ch_estimates_ext[0][0],g_rbSize*12*14,1,1); LOG_M("chestF0.m","chF0",UE->phy_sim_pdsch_dl_ch_estimates_ext,g_rbSize*12*14,1,1);
write_output("rxF_comp.m","rxFc",&UE->pdsch_vars[0]->rxdataF_comp0[0][0],N_RB_DL*12*14,1,1); write_output("rxF_comp.m","rxFc",UE->phy_sim_pdsch_rxdataF_comp,N_RB_DL*12*14,1,1);
LOG_M("rxF_llr.m","rxFllr",UE->pdsch_vars[0]->llr[0],available_bits,1,0); LOG_M("rxF_llr.m","rxFllr",UE->phy_sim_pdsch_llr,available_bits,1,0);
break; break;
} }
...@@ -1452,6 +1460,12 @@ int main(int argc, char **argv) ...@@ -1452,6 +1460,12 @@ int main(int argc, char **argv)
free(txdata); free(txdata);
free(test_input_bit); free(test_input_bit);
free(estimated_output_bit); free(estimated_output_bit);
free(UE->phy_sim_rxdataF);
free(UE->phy_sim_pdsch_llr);
free(UE->phy_sim_pdsch_rxdataF_ext);
free(UE->phy_sim_pdsch_rxdataF_comp);
free(UE->phy_sim_pdsch_dl_ch_estimates);
free(UE->phy_sim_pdsch_dl_ch_estimates_ext);
if (output_fd) if (output_fd)
fclose(output_fd); fclose(output_fd);
......
...@@ -87,22 +87,26 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id, ...@@ -87,22 +87,26 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
int32_t pdcch_est_size, int32_t pdcch_est_size,
int32_t pdcch_dl_ch_estimates[][pdcch_est_size], int32_t pdcch_dl_ch_estimates[][pdcch_est_size],
nr_phy_data_t *phy_data, nr_phy_data_t *phy_data,
int n_ss) { int n_ss,
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) {
return 0; return 0;
} }
int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc, UE_nr_rxtx_proc_t *proc,
int eNB_id, int gNB_id,
NR_UE_DLSCH_t *dlsch) { NR_UE_DLSCH_t dlsch[2],
int16_t *llr[2],
int16_t *layer_llr[NR_MAX_NB_LAYERS],
int32_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) {
return 0; return 0;
} }
bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc, UE_nr_rxtx_proc_t *proc,
int gNB_id, int gNB_id,
NR_UE_DLSCH_t *dlsch0, NR_UE_DLSCH_t dlsch[2],
NR_UE_DLSCH_t *dlsch1) { int16_t *llr[2]) {
return false; return false;
} }
...@@ -592,6 +596,8 @@ int main(int argc, char **argv) ...@@ -592,6 +596,8 @@ int main(int argc, char **argv)
processingData_L1tx_t msgDataTx; processingData_L1tx_t msgDataTx;
// generate signal // generate signal
const uint32_t rxdataF_sz = UE->frame_parms.samples_per_slot_wCP;
__attribute__ ((aligned(32))) int32_t rxdataF[UE->frame_parms.nb_antennas_rx][rxdataF_sz];
if (input_fd==NULL) { if (input_fd==NULL) {
for (i=0; i<frame_parms->Lmax; i++) { for (i=0; i<frame_parms->Lmax; i++) {
...@@ -760,10 +766,11 @@ int main(int argc, char **argv) ...@@ -760,10 +766,11 @@ int main(int argc, char **argv)
nr_slot_fep(UE, nr_slot_fep(UE,
&proc, &proc,
i%frame_parms->symbols_per_slot, i%frame_parms->symbols_per_slot,
ssb_slot); ssb_slot,
rxdataF);
nr_pbch_channel_estimation(UE,estimateSz, dl_ch_estimates, dl_ch_estimates_time, &proc, nr_pbch_channel_estimation(UE,estimateSz, dl_ch_estimates, dl_ch_estimates_time, &proc,
0,ssb_slot,i%frame_parms->symbols_per_slot,i-(UE->symbol_offset+1),ssb_index%8,n_hf); 0,ssb_slot,i%frame_parms->symbols_per_slot,i-(UE->symbol_offset+1),ssb_index%8,n_hf,rxdataF);
} }
fapiPbch_t result; fapiPbch_t result;
...@@ -776,7 +783,8 @@ int main(int argc, char **argv) ...@@ -776,7 +783,8 @@ int main(int argc, char **argv)
ssb_index%8, ssb_index%8,
SISO, SISO,
&phy_data, &phy_data,
&result); &result,
rxdataF);
if (ret==0) { if (ret==0) {
//UE->rx_ind.rx_indication_body->mib_pdu.ssb_index; //not yet detected automatically //UE->rx_ind.rx_indication_body->mib_pdu.ssb_index; //not yet detected automatically
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment