Add traces on gNB PHY UL and related requirement: FD PUSH IQ, FD DMRS, and UL Channel estimates wi/wo interpolation

- The required memories have been created and initialized in:
  openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
- Those memories: memory for DMRS signals, memory for channel estimates
  based on DMRS positions, memory to store slot grid with channel
  coefficients based on DMRS positions after interpolation, and memory
  to store extracted data including PUSCH + DMRS.
- The input parameters to nr_pusch_channel_estimation() has been updated
  to get the pointer to the added memories of pusch_dmrs_slot_mem and
  pusch_ch_est_dmrs_pos_slot_mem
  (openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h)
- The DMRS grid of NR slot and the estimated channel coefficients at
  DMRS locations are logged to created memories in:
  openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
- The function inner_rx in
  openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c is updated to log
  the extracted ULSCH PRBs and the interpolated channel coefficients.
- The T-macro() has been called in
  (openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c) to trace added
  traces: T_GNB_PHY_UL_FD_DMRS, T_GNB_PHY_UL_FD_CHAN_EST_DMRS_POS,
  T_GNB_PHY_UL_FD_PUSCH_IQ, T_GNB_PHY_UL_FD_CHAN_EST_DMRS_INTERPL
This commit is contained in:
Abdo-Gaber
2025-07-23 11:18:33 +02:00
committed by Bartosz Podrygajlo
parent a942e7e5ab
commit 8caf326134
3 changed files with 288 additions and 5 deletions
@@ -64,6 +64,8 @@ typedef struct puschAntennaProc_s {
c16_t ***rxdataF;
task_ans_t *ans;
scopeData_t *scope;
c16_t *pusch_ch_est_dmrs_pos_slot_mem;
int dmrs_symbol_start_idx;
} puschAntennaProc_t;
__attribute__((always_inline)) inline c16_t c32x16cumulVectVectWithSteps(c16_t *in1,
@@ -149,6 +151,9 @@ static void nr_pusch_antenna_processing(void *arg)
int re_offset = k0;
LOG_D(PHY, "PUSCH estimation DMRS type 1, Freq-domain interpolation");
int pilot_cnt = 0;
#if T_TRACER
int ch_est_cnt = 0; // To trace channel coefficients
#endif
for (int n = 0; n < 3 * nb_rb_pusch; n++) {
// LS estimation
@@ -165,6 +170,17 @@ static void nr_pusch_antenna_processing(void *arg)
for (int k = pilot_cnt << 1; k < (pilot_cnt << 1) + 4; k++) {
ul_ls_est[k] = ch16;
}
//------------------Write channel parameters to Memory for data recording ------------------//
#if T_TRACER
if (T_ACTIVE(T_GNB_PHY_UL_FD_CHAN_EST_DMRS_POS)) {
// Trace channel coefficients
c16_t *pusch_ch_est_dmrs_pos_slot_mem = rdata->pusch_ch_est_dmrs_pos_slot_mem;
int dmrs_symbol_start_idx = rdata->dmrs_symbol_start_idx;
pusch_ch_est_dmrs_pos_slot_mem[dmrs_symbol_start_idx + delta + ch_est_cnt] = ch16; // 0, 2, 4, 6, 8, location of REs
pusch_ch_est_dmrs_pos_slot_mem[dmrs_symbol_start_idx + delta + ch_est_cnt + 2] = ch16; // 0, 2, 4, 6, 8, location of REs
}
ch_est_cnt += 4;
#endif
pilot_cnt += 2;
}
c16_t ch_estimates_time[frame_parms->ofdm_symbol_size] __attribute__((aligned(32)));
@@ -459,7 +475,9 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
unsigned short bwp_start_subcarrier,
nfapi_nr_pusch_pdu_t *pusch_pdu,
int *max_ch,
uint32_t *nvar)
uint32_t *nvar,
c16_t *pusch_dmrs_slot_mem,
c16_t *pusch_ch_est_dmrs_pos_slot_mem)
{
c16_t pilot[3280] __attribute__((aligned(32)));
@@ -519,6 +537,20 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
LOG_I(PHY, "In %s: %d + j*(%d)\n", __FUNCTION__, pilot[i].r, pilot[i].i);
}
#endif
//------------------Write DMRS to Memory for Data Recording ------------------//
int dmrs_symbol_start_idx = symbol * pusch_pdu->nrOfLayers * nb_rb_pusch * NR_NB_SC_PER_RB + nl * nb_rb_pusch * NR_NB_SC_PER_RB;
#if T_TRACER
if (T_ACTIVE(T_GNB_PHY_UL_FD_DMRS)) {
// used by T-Tracer to trace DMRS slot grid
int dmrs_delta = 0; // intialize it to zero currently, derive it later from above functions
for (int i = 0; i < (6 * nb_rb_pusch); i++) {
// the generated DMRs is a complex conjugate of mod table, so flip the sign of imag. part
pusch_dmrs_slot_mem[dmrs_symbol_start_idx + dmrs_delta + i * 2].r = pilot[i].r; // 0, 2, 4, 6, 8, location of REs
pusch_dmrs_slot_mem[dmrs_symbol_start_idx + dmrs_delta + i * 2].i = -pilot[i].i; // 0, 2, 4, 6, 8, location of REs
}
}
#endif
int nest_count = 0;
@@ -573,6 +605,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
rdata->rxdataF = gNB->common_vars.rxdataF;
rdata->scope = gNB->scopeData;
rdata->ans = &ans;
rdata->pusch_ch_est_dmrs_pos_slot_mem = pusch_ch_est_dmrs_pos_slot_mem;
rdata->dmrs_symbol_start_idx = dmrs_symbol_start_idx;
// Call the nr_pusch_antenna_processing function
if (job_id == num_jobs - 1) {
// Run the last job inline
@@ -51,7 +51,9 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
unsigned short bwp_start_subcarrier,
nfapi_nr_pusch_pdu_t *pusch_pdu,
int *max_ch,
uint32_t *nvar);
uint32_t *nvar,
c16_t *pusch_dmrs_slot_mem,
c16_t *pusch_ch_est_dmrs_pos_slot_mem);
void dump_nr_I0_stats(FILE *fd,PHY_VARS_gNB *gNB);
@@ -10,9 +10,19 @@
#include "common/utils/nr/nr_common.h"
#include <openair1/PHY/TOOLS/phy_scope_interface.h>
#include "PHY/sse_intrin.h"
#include "T.h"
#include <sys/time.h>
#include "PHY/log_tools.h"
#define INVALID_VALUE 255
#if T_TRACER
static void copy_c16_data_to_slot_memory(c16_t *src, c16_t *dst_slot, int nb_re_pusch, int symbol)
{
memcpy(&dst_slot[nb_re_pusch * symbol], src, nb_re_pusch * sizeof(c16_t));
}
#endif
void nr_idft(int32_t *z, uint32_t Msc_PUSCH)
{
@@ -928,7 +938,9 @@ static void inner_rx(PHY_VARS_gNB *gNB,
int length,
int symbol,
int output_shift,
uint32_t nvar)
uint32_t nvar,
c16_t *rxFext_slot,
c16_t *chFext_slot)
{
int nb_layer = rel15_ul->nrOfLayers;
int nb_rx_ant = frame_parms->nb_antennas_rx;
@@ -959,6 +971,16 @@ static void inner_rx(PHY_VARS_gNB *gNB,
dmrs_symbol_flag,
rel15_ul,
frame_parms);
#if T_TRACER
int nb_re_pusch = NR_NB_SC_PER_RB * rel15_ul->rb_size;
// Assume assume Tx and Rx = 1
if (T_ACTIVE(T_GNB_PHY_UL_FD_PUSCH_IQ)) {
copy_c16_data_to_slot_memory(rxFext[aarx], rxFext_slot, nb_re_pusch, symbol);
}
if (T_ACTIVE(T_GNB_PHY_UL_FD_CHAN_EST_DMRS_INTERPL)) {
copy_c16_data_to_slot_memory(chFext[aatx][aarx], chFext_slot, nb_re_pusch, symbol);
}
#endif
}
}
c16_t rho[nb_layer][nb_layer][buffer_length] __attribute__((aligned(32)));
@@ -1067,6 +1089,8 @@ typedef struct puschSymbolProc_s {
uint32_t nvar;
int beam_nb;
task_ans_t *ans;
c16_t *pusch_ch_est_dmrs_interpl_slot_mem;
c16_t *rxFext_slot_mem;
} puschSymbolProc_t;
static void nr_pusch_symbol_processing(void *arg)
@@ -1102,7 +1126,9 @@ static void nr_pusch_symbol_processing(void *arg)
gNB->pusch_vars[ulsch_id].ul_valid_re_per_slot[symbol],
symbol,
gNB->pusch_vars[ulsch_id].log2_maxh,
rdata->nvar);
rdata->nvar,
rdata->rxFext_slot_mem,
rdata->pusch_ch_est_dmrs_interpl_slot_mem);
int nb_re_pusch = gNB->pusch_vars[ulsch_id].ul_valid_re_per_slot[symbol];
// layer de-mapping
@@ -1165,6 +1191,38 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
LOG_D(PHY,"pusch %d.%d : bwp_start_subcarrier %d, rb_start %d, first_carrier_offset %d\n", frame,slot,bwp_start_subcarrier, rel15_ul->rb_start, frame_parms->first_carrier_offset);
LOG_D(PHY,"pusch %d.%d : ul_dmrs_symb_pos %x\n",frame,slot,rel15_ul->ul_dmrs_symb_pos);
// Memories to store data for data recording
int buffer_length_slot = rel15_ul->rb_size * NR_NB_SC_PER_RB * 14; // 14 OFDM Symbols per slot
int nb_rx_ant = frame_parms->nb_antennas_rx;
int nb_layer = rel15_ul->nrOfLayers;
// Initialize memory for DMRS signals
c16_t pusch_dmrs_slot_mem[nb_layer * buffer_length_slot] __attribute__((aligned(32)));
// Initialize memory for channel estimates based on DMRS positions
c16_t pusch_ch_est_dmrs_pos_slot_mem[buffer_length_slot * nb_layer * nb_rx_ant] __attribute__((aligned(32)));
// memory to store slot grid with channel coefficients based on DMRS positions after interpolation
c16_t pusch_ch_est_dmrs_interpl_slot_mem[buffer_length_slot * nb_layer * nb_rx_ant] __attribute__((aligned(32)));
// memory to store extracted data including PUSCH + DMRS
c16_t rxFext_slot_mem[nb_rx_ant * buffer_length_slot] __attribute__((aligned(32)));
#if T_TRACER
// Initialize memory for DMRS signals
if (T_ACTIVE(T_GNB_PHY_UL_FD_DMRS))
memset(pusch_dmrs_slot_mem, 0, sizeof(c16_t) * nb_layer * buffer_length_slot);
// Initialize memory for channel estimates based on DMRS positions
if (T_ACTIVE(T_GNB_PHY_UL_FD_CHAN_EST_DMRS_POS))
memset(pusch_ch_est_dmrs_pos_slot_mem, 0, sizeof(c16_t) * buffer_length_slot * nb_layer * nb_rx_ant);
// memory to store slot grid with channel coefficients based on DMRS positions after interpolation
if (T_ACTIVE(T_GNB_PHY_UL_FD_CHAN_EST_DMRS_INTERPL))
memset(pusch_ch_est_dmrs_interpl_slot_mem, 0, sizeof(c16_t) * buffer_length_slot * nb_layer * nb_rx_ant);
// memory to store extracted data including PUSCH + DMRS
if (T_ACTIVE(T_GNB_PHY_UL_FD_PUSCH_IQ))
memset(rxFext_slot_mem, 0, sizeof(c16_t) * buffer_length_slot * nb_rx_ant);
#endif
//----------------------------------------------------------
//------------------- Channel estimation -------------------
//----------------------------------------------------------
@@ -1190,7 +1248,9 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
bwp_start_subcarrier,
rel15_ul,
&max_ch,
&nvar_tmp);
&nvar_tmp,
pusch_dmrs_slot_mem,
pusch_ch_est_dmrs_pos_slot_mem);
nvar += nvar_tmp;
}
// measure the SNR from the channel estimation
@@ -1417,6 +1477,8 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
rdata->scramblingSequence = scramblingSequence;
rdata->nvar = nvar;
rdata->beam_nb = beam_nb;
rdata->rxFext_slot_mem = rxFext_slot_mem;
rdata->pusch_ch_est_dmrs_interpl_slot_mem = pusch_ch_est_dmrs_interpl_slot_mem;
if (rel15_ul->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
nr_pusch_symbol_processing(rdata);
@@ -1431,6 +1493,191 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
}
} // symbol loop
#if T_TRACER
// Get Time Stamp for T-tracer messages
char trace_time_stamp_str[30];
get_time_stamp_usec(trace_time_stamp_str);
// trace_time_stamp_str = 8 bytes timestamp = YYYYMMDD
// + 9 bytes timestamp = HHMMSSMMM
// Not Ready for MIMO
int dmrs_port = get_dmrs_port(0, rel15_ul->dmrs_ports);
if (T_ACTIVE(T_GNB_PHY_UL_FD_DMRS)) {
// Log GNB_PHY_UL_FD_DMRS using T-Tracer if activated
// FORMAT = int,frame : int,slot : int,datetime_yyyymmdd : int,datetime_hhmmssmmm :
// int,frame_type : int,freq_range : int,subcarrier_spacing : int,cyclic_prefix : int,symbols_per_slot :
// int,Nid_cell : int,rnti :
// int,rb_size : int,rb_start : int,start_symbol_index : int,nr_of_symbols :
// int,qam_mod_order : int,mcs_index : int,mcs_table : int,nrOfLayers :
// int,transform_precoding : int,dmrs_config_type : int,ul_dmrs_symb_pos : int,number_dmrs_symbols : int,dmrs_port :
// int,dmrs_nscid : int,nb_antennas_rx : int,number_of_bits : buffer,data
T(T_GNB_PHY_UL_FD_DMRS,
T_INT((int)frame),
T_INT((int)slot),
T_INT((int)split_time_stamp_and_convert_to_int(trace_time_stamp_str, 0, 8)),
T_INT((int)split_time_stamp_and_convert_to_int(trace_time_stamp_str, 8, 9)),
T_INT((int)frame_parms->frame_type), // Frame type (0 FDD, 1 TDD) frame_structure
T_INT((int)frame_parms->freq_range), // Frequency range (0 FR1, 1 FR2)
T_INT((int)rel15_ul->subcarrier_spacing), // Subcarrier spacing (0 15kHz, 1 30kHz, 2 60kHz)
T_INT((int)rel15_ul->cyclic_prefix), // Normal or extended prefix (0 normal, 1 extended)
T_INT((int)frame_parms->symbols_per_slot), // Number of symbols per slot
T_INT((int)frame_parms->Nid_cell),
T_INT((int)rel15_ul->rnti),
T_INT((int)rel15_ul->rb_size),
T_INT((int)rel15_ul->rb_start),
T_INT((int)rel15_ul->start_symbol_index), // start_ofdm_symbol
T_INT((int)rel15_ul->nr_of_symbols), // num_ofdm_symbols
T_INT((int)rel15_ul->qam_mod_order), // modulation
T_INT((int)rel15_ul->mcs_index), // mcs
T_INT((int)rel15_ul->mcs_table), // mcs_table_index
T_INT((int)rel15_ul->nrOfLayers), // num_layer
T_INT((int)rel15_ul->transform_precoding), // transformPrecoder_enabled = 0, transformPrecoder_disabled = 1
T_INT((int)rel15_ul->dmrs_config_type), // dmrs_resource_map_config: pusch_dmrs_type1 = 0, pusch_dmrs_type2 = 1
T_INT((int)rel15_ul->ul_dmrs_symb_pos), // used to derive the DMRS symbol positions
T_INT((int)number_dmrs_symbols),
// dmrs_start_ofdm_symbol
// dmrs_duration_num_ofdm_symbols
// dmrs_num_add_positions
T_INT((int)dmrs_port), // dmrs_antenna_port
T_INT((int)rel15_ul->scid), // dmrs_nscid
T_INT((int)frame_parms->nb_antennas_rx), // rx antenna
T_INT(0), // number_of_bits
T_BUFFER((c16_t *)(&(pusch_dmrs_slot_mem[0])), rel15_ul->rb_size * NR_NB_SC_PER_RB * rel15_ul->nr_of_symbols * 4));
}
if (T_ACTIVE(T_GNB_PHY_UL_FD_CHAN_EST_DMRS_POS)) {
// Log GNB_PHY_UL_FD_CHAN_EST_DMRS_POS using T-Tracer if activated
// FORMAT = int,frame : int,slot : int,datetime_yyyymmdd : int,datetime_hhmmssmmm :
// int,frame_type : int,freq_range : int,subcarrier_spacing : int,cyclic_prefix : int,symbols_per_slot :
// int,Nid_cell : int,rnti :
// int,rb_size : int,rb_start : int,start_symbol_index : int,nr_of_symbols :
// int,qam_mod_order : int,mcs_index : int,mcs_table : int,nrOfLayers :
// int,transform_precoding : int,dmrs_config_type : int,ul_dmrs_symb_pos : int,number_dmrs_symbols : int,dmrs_port :
// int,dmrs_nscid : int,nb_antennas_rx : int,number_of_bits : buffer,data
T(T_GNB_PHY_UL_FD_CHAN_EST_DMRS_POS,
T_INT((int)frame),
T_INT((int)slot),
T_INT((int)split_time_stamp_and_convert_to_int(trace_time_stamp_str, 0, 8)),
T_INT((int)split_time_stamp_and_convert_to_int(trace_time_stamp_str, 8, 9)),
T_INT((int)frame_parms->frame_type), // Frame type (0 FDD, 1 TDD) frame_structure
T_INT((int)frame_parms->freq_range), // Frequency range (0 FR1, 1 FR2)
T_INT((int)rel15_ul->subcarrier_spacing), // Subcarrier spacing (0 15kHz, 1 30kHz, 2 60kHz)
T_INT((int)rel15_ul->cyclic_prefix), // Normal or extended prefix (0 normal, 1 extended)
T_INT((int)frame_parms->symbols_per_slot), // Number of symbols per slot
T_INT((int)frame_parms->Nid_cell),
T_INT((int)rel15_ul->rnti),
T_INT((int)rel15_ul->rb_size),
T_INT((int)rel15_ul->rb_start),
T_INT((int)rel15_ul->start_symbol_index), // start_ofdm_symbol
T_INT((int)rel15_ul->nr_of_symbols), // num_ofdm_symbols
T_INT((int)rel15_ul->qam_mod_order), // modulation
T_INT((int)rel15_ul->mcs_index), // mcs
T_INT((int)rel15_ul->mcs_table), // mcs_table_index
T_INT((int)rel15_ul->nrOfLayers), // num_layer
T_INT((int)rel15_ul->transform_precoding), // transformPrecoder_enabled = 0, transformPrecoder_disabled = 1
T_INT((int)rel15_ul->dmrs_config_type), // dmrs_resource_map_config: pusch_dmrs_type1 = 0, pusch_dmrs_type2 = 1
T_INT((int)rel15_ul->ul_dmrs_symb_pos), // used to derive the DMRS symbol positions
T_INT((int)number_dmrs_symbols),
// dmrs_start_ofdm_symbol
// dmrs_duration_num_ofdm_symbols
// dmrs_num_add_positions
T_INT((int)dmrs_port), // dmrs_antenna_port
T_INT((int)rel15_ul->scid), // dmrs_nscid
T_INT((int)frame_parms->nb_antennas_rx), // rx antenna
T_INT(0), // number_of_bits
T_BUFFER((c16_t *)(&(pusch_ch_est_dmrs_pos_slot_mem[0])), rel15_ul->rb_size * NR_NB_SC_PER_RB * rel15_ul->nr_of_symbols * 4));
}
if (T_ACTIVE(T_GNB_PHY_UL_FD_PUSCH_IQ)) {
// Log GNB_PHY_UL_FD_PUSCH_IQ using T-Tracer if activated
// FORMAT = int,frame : int,slot : int,datetime_yyyymmdd : int,datetime_hhmmssmmm :
// int,frame_type : int,freq_range : int,subcarrier_spacing : int,cyclic_prefix : int,symbols_per_slot :
// int,Nid_cell : int,rnti :
// int,rb_size : int,rb_start : int,start_symbol_index : int,nr_of_symbols :
// int,qam_mod_order : int,mcs_index : int,mcs_table : int,nrOfLayers :
// int,transform_precoding : int,dmrs_config_type : int,ul_dmrs_symb_pos : int,number_dmrs_symbols : int,dmrs_port :
// int,dmrs_nscid : int,nb_antennas_rx : int,number_of_bits : buffer,data
T(T_GNB_PHY_UL_FD_PUSCH_IQ,
T_INT((int)frame),
T_INT((int)slot),
T_INT((int)split_time_stamp_and_convert_to_int(trace_time_stamp_str, 0, 8)),
T_INT((int)split_time_stamp_and_convert_to_int(trace_time_stamp_str, 8, 9)),
T_INT((int)frame_parms->frame_type), // Frame type (0 FDD, 1 TDD) frame_structure
T_INT((int)frame_parms->freq_range), // Frequency range (0 FR1, 1 FR2)
T_INT((int)rel15_ul->subcarrier_spacing), // Subcarrier spacing (0 15kHz, 1 30kHz, 2 60kHz)
T_INT((int)rel15_ul->cyclic_prefix), // Normal or extended prefix (0 normal, 1 extended)
T_INT((int)frame_parms->symbols_per_slot), // Number of symbols per slot
T_INT((int)frame_parms->Nid_cell),
T_INT((int)rel15_ul->rnti),
T_INT((int)rel15_ul->rb_size),
T_INT((int)rel15_ul->rb_start),
T_INT((int)rel15_ul->start_symbol_index), // start_ofdm_symbol
T_INT((int)rel15_ul->nr_of_symbols), // num_ofdm_symbols
T_INT((int)rel15_ul->qam_mod_order), // modulation
T_INT((int)rel15_ul->mcs_index), // mcs
T_INT((int)rel15_ul->mcs_table), // mcs_table_index
T_INT((int)rel15_ul->nrOfLayers), // num_layer
T_INT((int)rel15_ul->transform_precoding), // transformPrecoder_enabled = 0, transformPrecoder_disabled = 1
T_INT((int)rel15_ul->dmrs_config_type), // dmrs_resource_map_config: pusch_dmrs_type1 = 0, pusch_dmrs_type2 = 1
T_INT((int)rel15_ul->ul_dmrs_symb_pos), // used to derive the DMRS symbol positions
T_INT((int)number_dmrs_symbols),
// dmrs_start_ofdm_symbol
// dmrs_duration_num_ofdm_symbols
// dmrs_num_add_positions
T_INT((int)dmrs_port), // dmrs_antenna_port
T_INT((int)rel15_ul->scid), // dmrs_nscid
T_INT((int)frame_parms->nb_antennas_rx), // rx antenna
T_INT(0), // number_of_bits
T_BUFFER((c16_t *)(&(rxFext_slot_mem[0])),
rel15_ul->rb_size * NR_NB_SC_PER_RB * rel15_ul->nr_of_symbols * frame_parms->nb_antennas_rx * 4));
}
if (T_ACTIVE(T_GNB_PHY_UL_FD_CHAN_EST_DMRS_INTERPL)) {
// Log pusch_ch_est_dmrs_interpl_slot_mem using T-Tracer if activated
// FORMAT = int,frame : int,slot : int,datetime_yyyymmdd : int,datetime_hhmmssmmm :
// int,frame_type : int,freq_range : int,subcarrier_spacing : int,cyclic_prefix : int,symbols_per_slot :
// int,Nid_cell : int,rnti :
// int,rb_size : int,rb_start : int,start_symbol_index : int,nr_of_symbols :
// int,qam_mod_order : int,mcs_index : int,mcs_table : int,nrOfLayers :
// int,transform_precoding : int,dmrs_config_type : int,ul_dmrs_symb_pos : int,number_dmrs_symbols : int,dmrs_port :
// int,dmrs_nscid : int,nb_antennas_rx : int,number_of_bits : buffer,data
T(T_GNB_PHY_UL_FD_CHAN_EST_DMRS_INTERPL,
T_INT((int)frame),
T_INT((int)slot),
T_INT((int)split_time_stamp_and_convert_to_int(trace_time_stamp_str, 0, 8)),
T_INT((int)split_time_stamp_and_convert_to_int(trace_time_stamp_str, 8, 9)),
T_INT((int)frame_parms->frame_type), // Frame type (0 FDD, 1 TDD) frame_structure
T_INT((int)frame_parms->freq_range), // Frequency range (0 FR1, 1 FR2)
T_INT((int)rel15_ul->subcarrier_spacing), // Subcarrier spacing (0 15kHz, 1 30kHz, 2 60kHz)
T_INT((int)rel15_ul->cyclic_prefix), // Normal or extended prefix (0 normal, 1 extended)
T_INT((int)frame_parms->symbols_per_slot), // Number of symbols per slot
T_INT((int)frame_parms->Nid_cell),
T_INT((int)rel15_ul->rnti),
T_INT((int)rel15_ul->rb_size),
T_INT((int)rel15_ul->rb_start),
T_INT((int)rel15_ul->start_symbol_index), // start_ofdm_symbol
T_INT((int)rel15_ul->nr_of_symbols), // num_ofdm_symbols
T_INT((int)rel15_ul->qam_mod_order), // modulation
T_INT((int)rel15_ul->mcs_index), // mcs
T_INT((int)rel15_ul->mcs_table), // mcs_table_index
T_INT((int)rel15_ul->nrOfLayers), // num_layer
T_INT((int)rel15_ul->transform_precoding), // transformPrecoder_enabled = 0, transformPrecoder_disabled = 1
T_INT((int)rel15_ul->dmrs_config_type), // dmrs_resource_map_config: pusch_dmrs_type1 = 0, pusch_dmrs_type2 = 1
T_INT((int)rel15_ul->ul_dmrs_symb_pos), // used to derive the DMRS symbol positions
T_INT((int)number_dmrs_symbols),
// dmrs_start_ofdm_symbol
// dmrs_duration_num_ofdm_symbols
// dmrs_num_add_positions
T_INT((int)dmrs_port), // dmrs_antenna_port
T_INT((int)rel15_ul->scid), // dmrs_nscid
T_INT((int)frame_parms->nb_antennas_rx), // rx antenna
T_INT(0), // number_of_bits
T_BUFFER(
(c16_t *)pusch_ch_est_dmrs_interpl_slot_mem,
rel15_ul->rb_size * NR_NB_SC_PER_RB * rel15_ul->nr_of_symbols * frame_parms->nb_antennas_rx * rel15_ul->nrOfLayers * 4));
}
#endif
join_task_ans(&ans);
stop_meas(&gNB->rx_pusch_symbol_processing_stats);