Made channel estimation techniques configurable
This commit is contained in:
@@ -600,7 +600,8 @@ void init_gNB(int single_thread_flag,int wait_for_sync) {
|
|||||||
gNB->UL_INFO.cqi_ind.cqi_raw_pdu_list = gNB->cqi_raw_pdu_list;*/
|
gNB->UL_INFO.cqi_ind.cqi_raw_pdu_list = gNB->cqi_raw_pdu_list;*/
|
||||||
|
|
||||||
gNB->prach_energy_counter = 0;
|
gNB->prach_energy_counter = 0;
|
||||||
gNB->prb_interpolation = get_softmodem_params()->prb_interpolation;
|
gNB->chest_time = get_softmodem_params()->chest_time;
|
||||||
|
gNB->chest_freq = get_softmodem_params()->chest_freq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -317,8 +317,8 @@ void set_options(int CC_id, PHY_VARS_NR_UE *UE){
|
|||||||
UE->rf_map.card = card_offset;
|
UE->rf_map.card = card_offset;
|
||||||
UE->rf_map.chain = CC_id + chain_offset;
|
UE->rf_map.chain = CC_id + chain_offset;
|
||||||
|
|
||||||
LOG_I(PHY,"Set UE mode %d, UE_fo_compensation %d, UE_scan_carrier %d, UE_no_timing_correction %d \n, do_prb_interpolation %d\n",
|
LOG_I(PHY,"Set UE mode %d, UE_fo_compensation %d, UE_scan_carrier %d, UE_no_timing_correction %d \n, chest-freq %d\n",
|
||||||
UE->mode, UE->UE_fo_compensation, UE->UE_scan_carrier, UE->no_timing_correction, UE->prb_interpolation);
|
UE->mode, UE->UE_fo_compensation, UE->UE_scan_carrier, UE->no_timing_correction, UE->chest_freq);
|
||||||
|
|
||||||
// Set FP variables
|
// Set FP variables
|
||||||
|
|
||||||
|
|||||||
@@ -69,7 +69,8 @@
|
|||||||
{"T" , CONFIG_HLP_TDD, PARAMFLAG_BOOL, iptr:&tddflag, defintval:0, TYPE_INT, 0}, \
|
{"T" , CONFIG_HLP_TDD, PARAMFLAG_BOOL, iptr:&tddflag, defintval:0, TYPE_INT, 0}, \
|
||||||
{"if_freq" , CONFIG_HLP_IF_FREQ, 0, u64ptr:&(UE->if_freq), defuintval:0, TYPE_UINT64,0}, \
|
{"if_freq" , CONFIG_HLP_IF_FREQ, 0, u64ptr:&(UE->if_freq), defuintval:0, TYPE_UINT64,0}, \
|
||||||
{"if_freq_off" , CONFIG_HLP_IF_FREQ_OFF, 0, iptr:&(UE->if_freq_off), defuintval:0, TYPE_INT, 0}, \
|
{"if_freq_off" , CONFIG_HLP_IF_FREQ_OFF, 0, iptr:&(UE->if_freq_off), defuintval:0, TYPE_INT, 0}, \
|
||||||
{"do-prb-interpolation", CONFIG_HLP_PRBINTER, PARAMFLAG_BOOL, iptr:&(UE->prb_interpolation), defintval:0, TYPE_INT, 0}, \
|
{"chest-freq", CONFIG_HLP_CHESTFREQ, 0, iptr:&(UE->chest_freq), defintval:0, TYPE_INT, 0}, \
|
||||||
|
{"chest-time", CONFIG_HLP_CHESTTIME, 0, iptr:&(UE->chest_time), defintval:0, TYPE_INT, 0}, \
|
||||||
{"ue-timing-correction-disable", CONFIG_HLP_DISABLETIMECORR, PARAMFLAG_BOOL, iptr:&(UE->no_timing_correction), defintval:0, TYPE_INT, 0}, \
|
{"ue-timing-correction-disable", CONFIG_HLP_DISABLETIMECORR, PARAMFLAG_BOOL, iptr:&(UE->no_timing_correction), defintval:0, TYPE_INT, 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -72,7 +72,8 @@ extern "C"
|
|||||||
#define CONFIG_HLP_DLMCS "Set the maximum downlink MCS\n"
|
#define CONFIG_HLP_DLMCS "Set the maximum downlink MCS\n"
|
||||||
#define CONFIG_HLP_STMON "Enable processing timing measurement of lte softmodem on per subframe basis \n"
|
#define CONFIG_HLP_STMON "Enable processing timing measurement of lte softmodem on per subframe basis \n"
|
||||||
#define CONFIG_HLP_256QAM "Use the 256 QAM mcs table for PDSCH\n"
|
#define CONFIG_HLP_256QAM "Use the 256 QAM mcs table for PDSCH\n"
|
||||||
#define CONFIG_HLP_PRBINTER "Do PRB based averaging of channel estimates. Frequency domain linear interpolation by default\n"
|
#define CONFIG_HLP_CHESTFREQ "Set channel estimation type in frequency domain. 0-Linear interpolation (default). 1-PRB based averaging of channel estimates in frequency. \n"
|
||||||
|
#define CONFIG_HLP_CHESTTIME "Set channel estimation type in time domain. 0-Symbols take estimates of the last preceding DMRS symbol (default). 1-Symbol based averaging of channel estimates in time. \n"
|
||||||
|
|
||||||
#define CONFIG_HLP_NONSTOP "Go back to frame sync mode after 100 consecutive PBCH failures\n"
|
#define CONFIG_HLP_NONSTOP "Go back to frame sync mode after 100 consecutive PBCH failures\n"
|
||||||
//#define CONFIG_HLP_NUMUES "Set the number of UEs for the emulation"
|
//#define CONFIG_HLP_NUMUES "Set the number of UEs for the emulation"
|
||||||
@@ -122,7 +123,9 @@ extern "C"
|
|||||||
#define TUNE_OFFSET softmodem_params.tune_offset
|
#define TUNE_OFFSET softmodem_params.tune_offset
|
||||||
#define SEND_DMRSSYNC softmodem_params.send_dmrs_sync
|
#define SEND_DMRSSYNC softmodem_params.send_dmrs_sync
|
||||||
#define USIM_TEST softmodem_params.usim_test
|
#define USIM_TEST softmodem_params.usim_test
|
||||||
#define PRB_INTERPOLATION softmodem_params.prb_interpolation
|
#define USE_256QAM_TABLE softmodem_params.use_256qam_table
|
||||||
|
#define CHEST_FREQ softmodem_params.chest_freq
|
||||||
|
#define CHEST_TIME softmodem_params.chest_time
|
||||||
#define NFAPI softmodem_params.nfapi
|
#define NFAPI softmodem_params.nfapi
|
||||||
#define NSA softmodem_params.nsa
|
#define NSA softmodem_params.nsa
|
||||||
#define NODE_NUMBER softmodem_params.node_number
|
#define NODE_NUMBER softmodem_params.node_number
|
||||||
@@ -160,10 +163,12 @@ extern int usrp_tx_thread;
|
|||||||
{"rfsim", CONFIG_HLP_RFSIM, PARAMFLAG_BOOL, uptr:&rfsim, defintval:0, TYPE_INT, 0}, \
|
{"rfsim", CONFIG_HLP_RFSIM, PARAMFLAG_BOOL, uptr:&rfsim, defintval:0, TYPE_INT, 0}, \
|
||||||
{"nokrnmod", CONFIG_HLP_NOKRNMOD, PARAMFLAG_BOOL, uptr:&nokrnmod, defintval:0, TYPE_INT, 0}, \
|
{"nokrnmod", CONFIG_HLP_NOKRNMOD, PARAMFLAG_BOOL, uptr:&nokrnmod, defintval:0, TYPE_INT, 0}, \
|
||||||
{"nbiot-disable", CONFIG_HLP_DISABLNBIOT, PARAMFLAG_BOOL, uptr:&nonbiot, defuintval:0, TYPE_INT, 0}, \
|
{"nbiot-disable", CONFIG_HLP_DISABLNBIOT, PARAMFLAG_BOOL, uptr:&nonbiot, defuintval:0, TYPE_INT, 0}, \
|
||||||
|
{"use-256qam-table", CONFIG_HLP_256QAM, PARAMFLAG_BOOL, iptr:&USE_256QAM_TABLE, defintval:0, TYPE_INT, 0}, \
|
||||||
|
{"chest-freq", CONFIG_HLP_CHESTFREQ, 0, iptr:&CHEST_FREQ, defintval:0, TYPE_INT, 0}, \
|
||||||
|
{"chest-time", CONFIG_HLP_CHESTTIME, 0, iptr:&CHEST_TIME, defintval:0, TYPE_INT, 0}, \
|
||||||
{"nsa", CONFIG_HLP_NSA, PARAMFLAG_BOOL, iptr:&NSA, defintval:0, TYPE_INT, 0}, \
|
{"nsa", CONFIG_HLP_NSA, PARAMFLAG_BOOL, iptr:&NSA, defintval:0, TYPE_INT, 0}, \
|
||||||
{"node-number", NULL, 0, u16ptr:&NODE_NUMBER, defuintval:0, TYPE_UINT16, 0}, \
|
{"node-number", NULL, 0, u16ptr:&NODE_NUMBER, defuintval:0, TYPE_UINT16, 0}, \
|
||||||
{"usrp-tx-thread-config", CONFIG_HLP_USRP_THREAD, 0, iptr:&usrp_tx_thread, defstrval:0, TYPE_INT, 0}, \
|
{"usrp-tx-thread-config", CONFIG_HLP_USRP_THREAD, 0, iptr:&usrp_tx_thread, defstrval:0, TYPE_INT, 0}, \
|
||||||
{"do-prb-interpolation", CONFIG_HLP_PRBINTER, PARAMFLAG_BOOL, iptr:&PRB_INTERPOLATION, defintval:0, TYPE_INT, 0}, \
|
|
||||||
{"nfapi", CONFIG_HLP_NFAPI, 0, u8ptr:&nfapi_mode, defintval:0, TYPE_UINT8, 0}, \
|
{"nfapi", CONFIG_HLP_NFAPI, 0, u8ptr:&nfapi_mode, defintval:0, TYPE_UINT8, 0}, \
|
||||||
{"non-stop", CONFIG_HLP_NONSTOP, PARAMFLAG_BOOL, iptr:&NON_STOP, defintval:0, TYPE_INT, 0}, \
|
{"non-stop", CONFIG_HLP_NONSTOP, PARAMFLAG_BOOL, iptr:&NON_STOP, defintval:0, TYPE_INT, 0}, \
|
||||||
{"emulate-l1", CONFIG_L1_EMULATOR, PARAMFLAG_BOOL, iptr:&EMULATE_L1, defintval:0, TYPE_INT, 0}, \
|
{"emulate-l1", CONFIG_L1_EMULATOR, PARAMFLAG_BOOL, iptr:&EMULATE_L1, defintval:0, TYPE_INT, 0}, \
|
||||||
@@ -251,7 +256,9 @@ typedef struct {
|
|||||||
double tune_offset;
|
double tune_offset;
|
||||||
int hw_timing_advance;
|
int hw_timing_advance;
|
||||||
uint32_t send_dmrs_sync;
|
uint32_t send_dmrs_sync;
|
||||||
int prb_interpolation;
|
int use_256qam_table;
|
||||||
|
int chest_time;
|
||||||
|
int chest_freq;
|
||||||
uint8_t nfapi;
|
uint8_t nfapi;
|
||||||
int nsa;
|
int nsa;
|
||||||
uint16_t node_number;
|
uint16_t node_number;
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
int16_t *fl,*fm,*fr,*fml,*fmr,*fmm,*fdcl,*fdcr,*fdclh,*fdcrh;
|
int16_t *fl,*fm,*fr,*fml,*fmr,*fmm,*fdcl,*fdcr,*fdclh,*fdcrh;
|
||||||
int ch_offset,symbol_offset ;
|
int ch_offset,symbol_offset ;
|
||||||
int32_t **ul_ch_estimates_time = gNB->pusch_vars[ul_id]->ul_ch_estimates_time;
|
int32_t **ul_ch_estimates_time = gNB->pusch_vars[ul_id]->ul_ch_estimates_time;
|
||||||
|
int chest_freq = gNB->chest_freq;
|
||||||
__m128i *ul_ch_128;
|
__m128i *ul_ch_128;
|
||||||
|
|
||||||
#ifdef DEBUG_CH
|
#ifdef DEBUG_CH
|
||||||
@@ -225,8 +226,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
LOG_I(PHY, "In %s ul_ch addr %p nushift %d\n", __FUNCTION__, ul_ch, nushift);
|
LOG_I(PHY, "In %s ul_ch addr %p nushift %d\n", __FUNCTION__, ul_ch, nushift);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1 && gNB->prb_interpolation == 0) {
|
if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1 && chest_freq == 0){
|
||||||
|
|
||||||
LOG_D(PHY,"PUSCH estimation DMRS type 1, Freq-domain interpolation");
|
LOG_D(PHY,"PUSCH estimation DMRS type 1, Freq-domain interpolation");
|
||||||
|
|
||||||
// For configuration type 1: k = 4*n + 2*k' + delta,
|
// For configuration type 1: k = 4*n + 2*k' + delta,
|
||||||
@@ -329,7 +329,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else if (pusch_pdu->dmrs_config_type == pusch_dmrs_type2 && gNB->prb_interpolation == 0) { //pusch_dmrs_type2 |p_r,p_l,d,d,d,d,p_r,p_l,d,d,d,d|
|
else if (pusch_pdu->dmrs_config_type == pusch_dmrs_type2 && chest_freq == 0) { //pusch_dmrs_type2 |p_r,p_l,d,d,d,d,p_r,p_l,d,d,d,d|
|
||||||
LOG_D(PHY,"PUSCH estimation DMRS type 2, Freq-domain interpolation");
|
LOG_D(PHY,"PUSCH estimation DMRS type 2, Freq-domain interpolation");
|
||||||
// Treat first DMRS specially (left edge)
|
// Treat first DMRS specially (left edge)
|
||||||
|
|
||||||
|
|||||||
@@ -338,3 +338,81 @@ int8_t get_valid_dmrs_idx_for_channel_est(uint16_t dmrs_symb_pos, uint8_t count
|
|||||||
}
|
}
|
||||||
return symbIdx;
|
return symbIdx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* perform averaging of channel estimates and store result in first symbol buffer */
|
||||||
|
void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms,
|
||||||
|
int **ch_est,
|
||||||
|
uint8_t num_symbols,
|
||||||
|
uint8_t start_symbol,
|
||||||
|
uint16_t dmrs_bitmap,
|
||||||
|
uint16_t num_rbs)
|
||||||
|
{
|
||||||
|
__m128i *ul_ch128_0;
|
||||||
|
__m128i *ul_ch128_1;
|
||||||
|
int16_t *ul_ch16_0;
|
||||||
|
int total_symbols = start_symbol + num_symbols;
|
||||||
|
int num_dmrs_symb = get_dmrs_symbols_in_slot(dmrs_bitmap, total_symbols);
|
||||||
|
int first_dmrs_symb = get_next_dmrs_symbol_in_slot(dmrs_bitmap, start_symbol, total_symbols);
|
||||||
|
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 symb = first_dmrs_symb+1; symb < total_symbols; symb++) {
|
||||||
|
ul_ch128_0 = (__m128i *)&ch_est[aarx][first_dmrs_symb*frame_parms->ofdm_symbol_size];
|
||||||
|
if ((dmrs_bitmap >> symb) & 0x01) {
|
||||||
|
ul_ch128_1 = (__m128i *)&ch_est[aarx][symb*frame_parms->ofdm_symbol_size];
|
||||||
|
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[1] = _mm_adds_epi16(ul_ch128_0[1], ul_ch128_1[1]);
|
||||||
|
ul_ch128_0[2] = _mm_adds_epi16(ul_ch128_0[2], ul_ch128_1[2]);
|
||||||
|
ul_ch128_0 += 3;
|
||||||
|
ul_ch128_1 += 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ul_ch128_0 = (__m128i *)&ch_est[aarx][first_dmrs_symb*frame_parms->ofdm_symbol_size];
|
||||||
|
if (num_dmrs_symb == 2) {
|
||||||
|
for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) {
|
||||||
|
ul_ch128_0[0] = _mm_srai_epi16(ul_ch128_0[0], 1);
|
||||||
|
ul_ch128_0[1] = _mm_srai_epi16(ul_ch128_0[1], 1);
|
||||||
|
ul_ch128_0[2] = _mm_srai_epi16(ul_ch128_0[2], 1);
|
||||||
|
ul_ch128_0 += 3;
|
||||||
|
}
|
||||||
|
} else if (num_dmrs_symb == 4) {
|
||||||
|
for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) {
|
||||||
|
ul_ch128_0[0] = _mm_srai_epi16(ul_ch128_0[0], 2);
|
||||||
|
ul_ch128_0[1] = _mm_srai_epi16(ul_ch128_0[1], 2);
|
||||||
|
ul_ch128_0[2] = _mm_srai_epi16(ul_ch128_0[2], 2);
|
||||||
|
ul_ch128_0 += 3;
|
||||||
|
}
|
||||||
|
} else if (num_dmrs_symb == 3) {
|
||||||
|
ul_ch16_0 = (int16_t *)&ch_est[aarx][first_dmrs_symb*frame_parms->ofdm_symbol_size];
|
||||||
|
for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) {
|
||||||
|
ul_ch16_0[0] /= 3;
|
||||||
|
ul_ch16_0[1] /= 3;
|
||||||
|
ul_ch16_0[2] /= 3;
|
||||||
|
ul_ch16_0[3] /= 3;
|
||||||
|
ul_ch16_0[4] /= 3;
|
||||||
|
ul_ch16_0[5] /= 3;
|
||||||
|
ul_ch16_0[6] /= 3;
|
||||||
|
ul_ch16_0[7] /= 3;
|
||||||
|
ul_ch16_0[8] /= 3;
|
||||||
|
ul_ch16_0[9] /= 3;
|
||||||
|
ul_ch16_0[10] /= 3;
|
||||||
|
ul_ch16_0[11] /= 3;
|
||||||
|
ul_ch16_0[12] /= 3;
|
||||||
|
ul_ch16_0[13] /= 3;
|
||||||
|
ul_ch16_0[14] /= 3;
|
||||||
|
ul_ch16_0[15] /= 3;
|
||||||
|
ul_ch16_0[16] /= 3;
|
||||||
|
ul_ch16_0[17] /= 3;
|
||||||
|
ul_ch16_0[18] /= 3;
|
||||||
|
ul_ch16_0[19] /= 3;
|
||||||
|
ul_ch16_0[20] /= 3;
|
||||||
|
ul_ch16_0[21] /= 3;
|
||||||
|
ul_ch16_0[22] /= 3;
|
||||||
|
ul_ch16_0[23] /= 3;
|
||||||
|
ul_ch16_0 += 24;
|
||||||
|
}
|
||||||
|
} else AssertFatal((num_dmrs_symb < 5) && (num_dmrs_symb > 0), "Illegal number of DMRS symbols in the slot\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -65,6 +65,12 @@ void nr_gen_ref_conj_symbols(uint32_t *in, uint32_t length, int16_t *output, uin
|
|||||||
int8_t get_next_dmrs_symbol_in_slot(uint16_t ul_dmrs_symb_pos, uint8_t counter, uint8_t end_symbol);
|
int8_t get_next_dmrs_symbol_in_slot(uint16_t ul_dmrs_symb_pos, uint8_t counter, uint8_t end_symbol);
|
||||||
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,
|
||||||
|
int **ch_est,
|
||||||
|
uint8_t num_symbols,
|
||||||
|
uint8_t start_symbol,
|
||||||
|
uint16_t dmrs_bitmap,
|
||||||
|
uint16_t num_rbs);
|
||||||
|
|
||||||
static inline uint8_t is_dmrs_symbol(uint8_t l, uint16_t dmrsSymbMask ) { return ((dmrsSymbMask >> l) & 0x1); }
|
static inline uint8_t is_dmrs_symbol(uint8_t l, uint16_t dmrsSymbMask ) { return ((dmrsSymbMask >> l) & 0x1); }
|
||||||
#undef EXTERN
|
#undef EXTERN
|
||||||
|
|||||||
@@ -2050,12 +2050,16 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nr_chest_time_domain_avg(frame_parms,
|
if (gNB->chest_time == 1) { // averaging time domain channel estimates
|
||||||
gNB->pusch_vars[ulsch_id]->ul_ch_estimates,
|
nr_chest_time_domain_avg(frame_parms,
|
||||||
rel15_ul->nr_of_symbols,
|
gNB->pusch_vars[ulsch_id]->ul_ch_estimates,
|
||||||
rel15_ul->start_symbol_index,
|
rel15_ul->nr_of_symbols,
|
||||||
rel15_ul->ul_dmrs_symb_pos,
|
rel15_ul->start_symbol_index,
|
||||||
rel15_ul->rb_size);
|
rel15_ul->ul_dmrs_symb_pos,
|
||||||
|
rel15_ul->rb_size);
|
||||||
|
|
||||||
|
gNB->pusch_vars[ulsch_id]->dmrs_symbol = get_next_dmrs_symbol_in_slot(rel15_ul->ul_dmrs_symb_pos, rel15_ul->start_symbol_index, rel15_ul->nr_of_symbols);
|
||||||
|
}
|
||||||
stop_meas(&gNB->ulsch_channel_estimation_stats);
|
stop_meas(&gNB->ulsch_channel_estimation_stats);
|
||||||
|
|
||||||
#ifdef __AVX2__
|
#ifdef __AVX2__
|
||||||
@@ -2065,13 +2069,15 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
|
|||||||
#endif
|
#endif
|
||||||
uint32_t rxdataF_ext_offset = 0;
|
uint32_t rxdataF_ext_offset = 0;
|
||||||
|
|
||||||
gNB->pusch_vars[ulsch_id]->dmrs_symbol = get_first_dmrs_symbol(rel15_ul->ul_dmrs_symb_pos, rel15_ul->start_symbol_index, rel15_ul->nr_of_symbols);
|
|
||||||
for(uint8_t symbol = rel15_ul->start_symbol_index; symbol < (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols); symbol++) {
|
for(uint8_t symbol = rel15_ul->start_symbol_index; symbol < (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols); symbol++) {
|
||||||
uint8_t dmrs_symbol_flag = (rel15_ul->ul_dmrs_symb_pos >> symbol) & 0x01;
|
uint8_t dmrs_symbol_flag = (rel15_ul->ul_dmrs_symb_pos >> symbol) & 0x01;
|
||||||
if (dmrs_symbol_flag == 1) {
|
if (dmrs_symbol_flag == 1) {
|
||||||
if ((rel15_ul->ul_dmrs_symb_pos >> ((symbol + 1) % frame_parms->symbols_per_slot)) & 0x01)
|
if ((rel15_ul->ul_dmrs_symb_pos >> ((symbol + 1) % frame_parms->symbols_per_slot)) & 0x01)
|
||||||
AssertFatal(1==0,"Double DMRS configuration is not yet supported\n");
|
AssertFatal(1==0,"Double DMRS configuration is not yet supported\n");
|
||||||
|
|
||||||
|
if (gNB->chest_time == 0) // Non averaging time domain channel estimates
|
||||||
|
gNB->pusch_vars[ulsch_id]->dmrs_symbol = symbol;
|
||||||
|
|
||||||
if (rel15_ul->dmrs_config_type == 0) {
|
if (rel15_ul->dmrs_config_type == 0) {
|
||||||
// if no data in dmrs cdm group is 1 only even REs have no data
|
// if no data in dmrs cdm group is 1 only even REs have no data
|
||||||
// if no data in dmrs cdm group is 2 both odd and even REs have no data
|
// if no data in dmrs cdm group is 2 both odd and even REs have no data
|
||||||
|
|||||||
@@ -808,7 +808,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
|||||||
printf("rxF addr %p p %d\n", rxF,p);
|
printf("rxF addr %p p %d\n", rxF,p);
|
||||||
printf("dl_ch addr %p nushift %d\n",dl_ch,nushift);
|
printf("dl_ch addr %p nushift %d\n",dl_ch,nushift);
|
||||||
#endif
|
#endif
|
||||||
if (config_type == NFAPI_NR_DMRS_TYPE1 && ue->prb_interpolation == 0) {
|
if (config_type == NFAPI_NR_DMRS_TYPE1 && ue->chest_freq == 0) {
|
||||||
|
|
||||||
// Treat first 2 pilots specially (left edge)
|
// Treat first 2 pilots specially (left edge)
|
||||||
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||||
@@ -985,7 +985,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
|||||||
8);
|
8);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (config_type == NFAPI_NR_DMRS_TYPE2 && ue->prb_interpolation == 0){ //pdsch_dmrs_type2 |dmrs_r,dmrs_l,0,0,0,0,dmrs_r,dmrs_l,0,0,0,0|
|
} else if (config_type == NFAPI_NR_DMRS_TYPE2 && ue->chest_freq == 0){ //pdsch_dmrs_type2 |dmrs_r,dmrs_l,0,0,0,0,dmrs_r,dmrs_l,0,0,0,0|
|
||||||
|
|
||||||
// Treat first 4 pilots specially (left edge)
|
// Treat first 4 pilots specially (left edge)
|
||||||
ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||||
|
|||||||
@@ -319,7 +319,8 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
dlsch0_harq->n_dmrs_cdm_groups,
|
dlsch0_harq->n_dmrs_cdm_groups,
|
||||||
dlsch0_harq->Nl,
|
dlsch0_harq->Nl,
|
||||||
frame_parms,
|
frame_parms,
|
||||||
dlsch0_harq->dlDmrsSymbPos);
|
dlsch0_harq->dlDmrsSymbPos,
|
||||||
|
ue->chest_time);
|
||||||
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
if (cpumeas(CPUMEAS_GETSTATE))
|
if (cpumeas(CPUMEAS_GETSTATE))
|
||||||
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d type %d: Pilot/Data extraction %5.2f \n",
|
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d type %d: Pilot/Data extraction %5.2f \n",
|
||||||
@@ -1610,7 +1611,8 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
|
|||||||
unsigned short nb_rb_pdsch,
|
unsigned short nb_rb_pdsch,
|
||||||
uint8_t n_dmrs_cdm_groups,
|
uint8_t n_dmrs_cdm_groups,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
uint16_t dlDmrsSymbPos)
|
uint16_t dlDmrsSymbPos,
|
||||||
|
int chest_time_type)
|
||||||
{
|
{
|
||||||
if (config_type == NFAPI_NR_DMRS_TYPE1) {
|
if (config_type == NFAPI_NR_DMRS_TYPE1) {
|
||||||
AssertFatal(n_dmrs_cdm_groups == 1 || n_dmrs_cdm_groups == 2,
|
AssertFatal(n_dmrs_cdm_groups == 1 || n_dmrs_cdm_groups == 2,
|
||||||
@@ -1621,7 +1623,12 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
|
|||||||
}
|
}
|
||||||
|
|
||||||
const unsigned short start_re = (frame_parms->first_carrier_offset + start_rb * NR_NB_SC_PER_RB) % frame_parms->ofdm_symbol_size;
|
const unsigned short start_re = (frame_parms->first_carrier_offset + start_rb * NR_NB_SC_PER_RB) % frame_parms->ofdm_symbol_size;
|
||||||
const int8_t validDmrsEst = get_valid_dmrs_idx_for_channel_est(dlDmrsSymbPos, symbol);
|
int8_t validDmrsEst;
|
||||||
|
|
||||||
|
if (chest_time_type == 0)
|
||||||
|
validDmrsEst = get_valid_dmrs_idx_for_channel_est(dlDmrsSymbPos,symbol);
|
||||||
|
else
|
||||||
|
validDmrsEst = get_next_dmrs_symbol_in_slot(dlDmrsSymbPos,0,14); // get first dmrs symbol index
|
||||||
|
|
||||||
for (unsigned char aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
for (unsigned char aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
||||||
|
|
||||||
@@ -1708,7 +1715,8 @@ void nr_dlsch_extract_rbs(int **rxdataF,
|
|||||||
uint8_t n_dmrs_cdm_groups,
|
uint8_t n_dmrs_cdm_groups,
|
||||||
uint8_t Nl,
|
uint8_t Nl,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
uint16_t dlDmrsSymbPos)
|
uint16_t dlDmrsSymbPos,
|
||||||
|
int chest_time_type)
|
||||||
{
|
{
|
||||||
|
|
||||||
unsigned short k,rb;
|
unsigned short k,rb;
|
||||||
@@ -1726,7 +1734,10 @@ void nr_dlsch_extract_rbs(int **rxdataF,
|
|||||||
nushift = (n_dmrs_cdm_groups -1)<<1;//delta in Table 7.4.1.1.2-2
|
nushift = (n_dmrs_cdm_groups -1)<<1;//delta in Table 7.4.1.1.2-2
|
||||||
}
|
}
|
||||||
|
|
||||||
validDmrsEst = get_valid_dmrs_idx_for_channel_est(dlDmrsSymbPos,symbol);
|
if (chest_time_type == 0)
|
||||||
|
validDmrsEst = get_valid_dmrs_idx_for_channel_est(dlDmrsSymbPos,symbol);
|
||||||
|
else
|
||||||
|
validDmrsEst = get_next_dmrs_symbol_in_slot(dlDmrsSymbPos,0,14); // get first dmrs symbol index
|
||||||
|
|
||||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||||
|
|
||||||
|
|||||||
@@ -709,7 +709,8 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
|
|||||||
unsigned short nb_rb_pdsch,
|
unsigned short nb_rb_pdsch,
|
||||||
uint8_t n_dmrs_cdm_groups,
|
uint8_t n_dmrs_cdm_groups,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
uint16_t dlDmrsSymbPos);
|
uint16_t dlDmrsSymbPos,
|
||||||
|
int chest_time_type);
|
||||||
|
|
||||||
/** \fn dlsch_extract_rbs_multiple(int32_t **rxdataF,
|
/** \fn dlsch_extract_rbs_multiple(int32_t **rxdataF,
|
||||||
int32_t **dl_ch_estimates,
|
int32_t **dl_ch_estimates,
|
||||||
@@ -747,7 +748,8 @@ void nr_dlsch_extract_rbs(int **rxdataF,
|
|||||||
uint8_t n_dmrs_cdm_groups,
|
uint8_t n_dmrs_cdm_groups,
|
||||||
uint8_t Nl,
|
uint8_t Nl,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
uint16_t dlDmrsSymbPos);
|
uint16_t dlDmrsSymbPos,
|
||||||
|
int chest_time_type);
|
||||||
|
|
||||||
/** \fn dlsch_extract_rbs_TM7(int32_t **rxdataF,
|
/** \fn dlsch_extract_rbs_TM7(int32_t **rxdataF,
|
||||||
int32_t **dl_bf_ch_estimates,
|
int32_t **dl_bf_ch_estimates,
|
||||||
|
|||||||
@@ -826,8 +826,11 @@ typedef struct PHY_VARS_gNB_s {
|
|||||||
int **dl_precoder_SgNB[3];
|
int **dl_precoder_SgNB[3];
|
||||||
char log2_maxp; /// holds the maximum channel/precoder coefficient
|
char log2_maxp; /// holds the maximum channel/precoder coefficient
|
||||||
|
|
||||||
int prb_interpolation;
|
|
||||||
int max_ldpc_iterations;
|
int max_ldpc_iterations;
|
||||||
|
/// indicate the channel estimation technique in time domain
|
||||||
|
int chest_time;
|
||||||
|
/// indicate the channel estimation technique in freq domain
|
||||||
|
int chest_freq;
|
||||||
|
|
||||||
/// if ==0 enables phy only test mode
|
/// if ==0 enables phy only test mode
|
||||||
int mac_enabled;
|
int mac_enabled;
|
||||||
|
|||||||
@@ -777,7 +777,8 @@ typedef struct {
|
|||||||
uint32_t perfect_ce;
|
uint32_t perfect_ce;
|
||||||
// flag to activate PRB based averaging of channel estimates
|
// flag to activate PRB based averaging of channel estimates
|
||||||
// when off, defaults to frequency domain interpolation
|
// when off, defaults to frequency domain interpolation
|
||||||
int prb_interpolation;
|
int chest_freq;
|
||||||
|
int chest_time;
|
||||||
int generate_ul_signal[NUMBER_OF_CONNECTED_gNB_MAX];
|
int generate_ul_signal[NUMBER_OF_CONNECTED_gNB_MAX];
|
||||||
|
|
||||||
UE_NR_SCAN_INFO_t scan_info[NB_BANDS_MAX];
|
UE_NR_SCAN_INFO_t scan_info[NB_BANDS_MAX];
|
||||||
|
|||||||
@@ -36,6 +36,7 @@
|
|||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
#include "defs.h"
|
#include "defs.h"
|
||||||
#include "PHY/defs_nr_UE.h"
|
#include "PHY/defs_nr_UE.h"
|
||||||
|
#include "PHY/NR_REFSIG/dmrs_nr.h"
|
||||||
#include "PHY/phy_extern_nr_ue.h"
|
#include "PHY/phy_extern_nr_ue.h"
|
||||||
#include "PHY/MODULATION/modulation_UE.h"
|
#include "PHY/MODULATION/modulation_UE.h"
|
||||||
#include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h"
|
#include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h"
|
||||||
@@ -611,6 +612,15 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int gNB_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ue->chest_time == 1) { // averaging time domain channel estimates
|
||||||
|
nr_chest_time_domain_avg(&ue->frame_parms,
|
||||||
|
ue->pdsch_vars[proc->thread_id][gNB_id]->dl_ch_estimates,
|
||||||
|
dlsch0_harq->nb_symbols,
|
||||||
|
dlsch0_harq->start_symbol,
|
||||||
|
dlsch0_harq->dlDmrsSymbPos,
|
||||||
|
pdsch_nb_rb);
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t first_symbol_with_data = s0;
|
uint16_t first_symbol_with_data = s0;
|
||||||
uint32_t dmrs_data_re;
|
uint32_t dmrs_data_re;
|
||||||
|
|
||||||
|
|||||||
@@ -66,6 +66,7 @@
|
|||||||
#include "NR_RRCReconfiguration.h"
|
#include "NR_RRCReconfiguration.h"
|
||||||
#define inMicroS(a) (((double)(a))/(get_cpu_freq_GHz()*1000.0))
|
#define inMicroS(a) (((double)(a))/(get_cpu_freq_GHz()*1000.0))
|
||||||
#include "SIMULATION/LTE_PHY/common_sim.h"
|
#include "SIMULATION/LTE_PHY/common_sim.h"
|
||||||
|
#include "PHY/NR_REFSIG/dmrs_nr.h"
|
||||||
|
|
||||||
#include <openair2/LAYER2/MAC/mac_vars.h>
|
#include <openair2/LAYER2/MAC/mac_vars.h>
|
||||||
#include <openair2/RRC/LTE/rrc_vars.h>
|
#include <openair2/RRC/LTE/rrc_vars.h>
|
||||||
@@ -434,7 +435,7 @@ int main(int argc, char **argv)
|
|||||||
uint16_t rbSize = 106;
|
uint16_t rbSize = 106;
|
||||||
uint8_t mcsIndex = 9;
|
uint8_t mcsIndex = 9;
|
||||||
uint8_t dlsch_threads = 0;
|
uint8_t dlsch_threads = 0;
|
||||||
int prb_inter = 0;
|
int chest_type[2] = {0};
|
||||||
uint8_t max_ldpc_iterations = 5;
|
uint8_t max_ldpc_iterations = 5;
|
||||||
if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == 0) {
|
if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == 0) {
|
||||||
exit_fun("[NR_DLSIM] Error, configuration module init failed\n");
|
exit_fun("[NR_DLSIM] Error, configuration module init failed\n");
|
||||||
@@ -446,7 +447,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
FILE *scg_fd=NULL;
|
FILE *scg_fd=NULL;
|
||||||
|
|
||||||
while ((c = getopt (argc, argv, "f:hA:pf:g:in:s:S:t:x:y:z:M:N:F:GR:dPIL:Ea:b:d:e:q:m:w:T:U:X:")) != -1) {
|
while ((c = getopt (argc, argv, "f:hA:pf:g:i:n:s:S:t:x:y:z:M:N:F:GR:dPI:L:Ea:b:d:e:m:w:T:U:qX:Y")) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'f':
|
case 'f':
|
||||||
scg_fd = fopen(optarg,"r");
|
scg_fd = fopen(optarg,"r");
|
||||||
@@ -503,7 +504,9 @@ int main(int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'i':
|
case 'i':
|
||||||
prb_inter=1;
|
for(i=0; i < atoi(optarg); i++){
|
||||||
|
chest_type[i] = atoi(argv[optind++]);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'n':
|
case 'n':
|
||||||
@@ -590,9 +593,7 @@ int main(int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'I':
|
case 'I':
|
||||||
run_initial_sync=1;
|
max_ldpc_iterations = atoi(optarg);
|
||||||
//target_error_rate=0.1;
|
|
||||||
slot = 0;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'L':
|
case 'L':
|
||||||
@@ -637,10 +638,6 @@ int main(int argc, char **argv)
|
|||||||
output_fd = fopen("txdata.dat", "w+");
|
output_fd = fopen("txdata.dat", "w+");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'Q':
|
|
||||||
max_ldpc_iterations = atoi(optarg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'T':
|
case 'T':
|
||||||
enable_ptrs=1;
|
enable_ptrs=1;
|
||||||
for(i=0; i < atoi(optarg); i++) {
|
for(i=0; i < atoi(optarg); i++) {
|
||||||
@@ -660,6 +657,12 @@ int main(int argc, char **argv)
|
|||||||
gNBthreads[sizeof(gNBthreads)-1]=0;
|
gNBthreads[sizeof(gNBthreads)-1]=0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'Y':
|
||||||
|
run_initial_sync=1;
|
||||||
|
//target_error_rate=0.1;
|
||||||
|
slot = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
case 'h':
|
case 'h':
|
||||||
printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n",
|
printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n",
|
||||||
@@ -675,7 +678,7 @@ int main(int argc, char **argv)
|
|||||||
printf("-g [A,B,C,D,E,F,G,R] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models or R for MIMO model (ignores delay spread and Ricean factor)\n");
|
printf("-g [A,B,C,D,E,F,G,R] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models or R for MIMO model (ignores delay spread and Ricean factor)\n");
|
||||||
printf("-y Number of TX antennas used in gNB\n");
|
printf("-y Number of TX antennas used in gNB\n");
|
||||||
printf("-z Number of RX antennas used in UE\n");
|
printf("-z Number of RX antennas used in UE\n");
|
||||||
printf("-i Activate PRB based averaging for channel estimation. Frequncy domain interpolation by default.\n");
|
printf("-i Change channel estimation technique. Arguments list: Frequency domain {0:Linear interpolation, 1:PRB based averaging}, Time domain {0:Estimates of last DMRS symbol, 1:Average of DMRS symbols}\n");
|
||||||
//printf("-j Relative strength of second intefering gNB (in dB) - cell_id mod 3 = 2\n");
|
//printf("-j Relative strength of second intefering gNB (in dB) - cell_id mod 3 = 2\n");
|
||||||
printf("-R N_RB_DL\n");
|
printf("-R N_RB_DL\n");
|
||||||
printf("-O oversampling factor (1,2,4,8,16)\n");
|
printf("-O oversampling factor (1,2,4,8,16)\n");
|
||||||
@@ -692,13 +695,14 @@ int main(int argc, char **argv)
|
|||||||
printf("-e MSC index\n");
|
printf("-e MSC index\n");
|
||||||
printf("-q MCS Table index\n");
|
printf("-q MCS Table index\n");
|
||||||
printf("-t Acceptable effective throughput (in percentage)\n");
|
printf("-t Acceptable effective throughput (in percentage)\n");
|
||||||
|
printf("-I Maximum LDPC decoder iterations\n");
|
||||||
printf("-T Enable PTRS, arguments list L_PTRS{0,1,2} K_PTRS{2,4}, e.g. -T 2 0 2 \n");
|
printf("-T Enable PTRS, arguments list L_PTRS{0,1,2} K_PTRS{2,4}, e.g. -T 2 0 2 \n");
|
||||||
printf("-Q Maximum LDPC decoder iterations\n");
|
|
||||||
printf("-U Change DMRS Config, arguments list DMRS TYPE{0=A,1=B} DMRS AddPos{0:2} DMRS ConfType{1:2}, e.g. -U 3 0 2 1 \n");
|
printf("-U Change DMRS Config, arguments list DMRS TYPE{0=A,1=B} DMRS AddPos{0:2} DMRS ConfType{1:2}, e.g. -U 3 0 2 1 \n");
|
||||||
printf("-P Print DLSCH performances\n");
|
printf("-P Print DLSCH performances\n");
|
||||||
printf("-w Write txdata to binary file (one frame)\n");
|
printf("-w Write txdata to binary file (one frame)\n");
|
||||||
printf("-d number of dlsch threads, 0: no dlsch parallelization\n");
|
printf("-d number of dlsch threads, 0: no dlsch parallelization\n");
|
||||||
printf("-X gNB thread pool configuration, n => no threads");
|
printf("-X gNB thread pool configuration, n => no threads\n");
|
||||||
|
printf("-Y Run initial sync in UE\n");
|
||||||
exit (-1);
|
exit (-1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -989,7 +993,8 @@ int main(int argc, char **argv)
|
|||||||
UE->if_inst->phy_config_request = nr_ue_phy_config_request;
|
UE->if_inst->phy_config_request = nr_ue_phy_config_request;
|
||||||
UE->if_inst->dl_indication = nr_ue_dl_indication;
|
UE->if_inst->dl_indication = nr_ue_dl_indication;
|
||||||
UE->if_inst->ul_indication = dummy_nr_ue_ul_indication;
|
UE->if_inst->ul_indication = dummy_nr_ue_ul_indication;
|
||||||
UE->prb_interpolation = prb_inter;
|
UE->chest_freq = chest_type[0];
|
||||||
|
UE->chest_time = chest_type[1];
|
||||||
|
|
||||||
UE_mac->if_module = nr_ue_if_module_init(0);
|
UE_mac->if_module = nr_ue_if_module_init(0);
|
||||||
|
|
||||||
|
|||||||
@@ -314,13 +314,13 @@ int main(int argc, char **argv)
|
|||||||
double effTP[100];
|
double effTP[100];
|
||||||
float eff_tp_check = 100;
|
float eff_tp_check = 100;
|
||||||
uint8_t snrRun;
|
uint8_t snrRun;
|
||||||
int prb_inter = 0;
|
int chest_type[2] = {0};
|
||||||
|
|
||||||
int enable_ptrs = 0;
|
int enable_ptrs = 0;
|
||||||
int modify_dmrs = 0;
|
int modify_dmrs = 0;
|
||||||
/* L_PTRS = ptrs_arg[0], K_PTRS = ptrs_arg[1] */
|
/* L_PTRS = ptrs_arg[0], K_PTRS = ptrs_arg[1] */
|
||||||
int ptrs_arg[2] = {-1,-1};// Invalid values
|
int ptrs_arg[2] = {-1,-1};// Invalid values
|
||||||
int dmrs_arg[3] = {-1,-1,-1};// Invalid values
|
int dmrs_arg[4] = {-1,-1,-1,-1};// Invalid values
|
||||||
uint16_t ptrsSymPos = 0;
|
uint16_t ptrsSymPos = 0;
|
||||||
uint16_t ptrsSymbPerSlot = 0;
|
uint16_t ptrsSymbPerSlot = 0;
|
||||||
uint16_t ptrsRePerSymb = 0;
|
uint16_t ptrsRePerSymb = 0;
|
||||||
@@ -348,7 +348,7 @@ int main(int argc, char **argv)
|
|||||||
/* initialize the sin-cos table */
|
/* initialize the sin-cos table */
|
||||||
InitSinLUT();
|
InitSinLUT();
|
||||||
|
|
||||||
while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:ikl:m:n:p:r:s:t:u:w:y:z:B:F:G:H:I:M:N:PR:S:T:U:L:Z:W:")) != -1) {
|
while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:i:kl:m:n:p:q:r:s:t:u:w:y:z:F:G:H:I:M:N:PR:S:T:U:L:Z:W:")) != -1) {
|
||||||
printf("handling optarg %c\n",c);
|
printf("handling optarg %c\n",c);
|
||||||
switch (c) {
|
switch (c) {
|
||||||
|
|
||||||
@@ -441,7 +441,9 @@ int main(int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'i':
|
case 'i':
|
||||||
prb_inter=1;
|
for(i=0; i < atoi(optarg); i++){
|
||||||
|
chest_type[i] = atoi(argv[optind++]);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'k':
|
case 'k':
|
||||||
@@ -468,6 +470,10 @@ int main(int argc, char **argv)
|
|||||||
case 'p':
|
case 'p':
|
||||||
extended_prefix_flag = 1;
|
extended_prefix_flag = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'q':
|
||||||
|
mcs_table = atoi(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
case 'r':
|
case 'r':
|
||||||
nb_rb = atoi(optarg);
|
nb_rb = atoi(optarg);
|
||||||
@@ -520,10 +526,6 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'B':
|
|
||||||
mcs_table = atoi(optarg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'F':
|
case 'F':
|
||||||
input_fd = fopen(optarg, "r");
|
input_fd = fopen(optarg, "r");
|
||||||
if (input_fd == NULL) {
|
if (input_fd == NULL) {
|
||||||
@@ -605,20 +607,20 @@ int main(int argc, char **argv)
|
|||||||
printf("-f Number of frames to simulate\n");
|
printf("-f Number of frames to simulate\n");
|
||||||
printf("-g [A,B,C,D,E,F,G] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models (ignores delay spread and Ricean factor)\n");
|
printf("-g [A,B,C,D,E,F,G] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models (ignores delay spread and Ricean factor)\n");
|
||||||
printf("-h This message\n");
|
printf("-h This message\n");
|
||||||
printf("-i Activate PRB based averaging for channel estimation. Frequncy domain interpolation by default.\n");
|
printf("-i Change channel estimation technique. Arguments list: Frequency domain {0:Linear interpolation, 1:PRB based averaging}, Time domain {0:Estimates of last DMRS symbol, 1:Average of DMRS symbols}\n");
|
||||||
//printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n");
|
//printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n");
|
||||||
printf("-s Starting SNR, runs from SNR0 to SNR0 + 10 dB if ending SNR isn't given\n");
|
printf("-s Starting SNR, runs from SNR0 to SNR0 + 10 dB if ending SNR isn't given\n");
|
||||||
printf("-m MCS value\n");
|
printf("-m MCS value\n");
|
||||||
printf("-n Number of trials to simulate\n");
|
printf("-n Number of trials to simulate\n");
|
||||||
printf("-p Use extended prefix mode\n");
|
printf("-p Use extended prefix mode\n");
|
||||||
//printf("-t Delay spread for multipath channel\n");
|
printf("-q MCS table\n");
|
||||||
|
printf("-t Delay spread for multipath channel\n");
|
||||||
printf("-u Set the numerology\n");
|
printf("-u Set the numerology\n");
|
||||||
printf("-w Start PRB for PUSCH\n");
|
printf("-w Start PRB for PUSCH\n");
|
||||||
//printf("-x Transmission mode (1,2,6 for the moment)\n");
|
//printf("-x Transmission mode (1,2,6 for the moment)\n");
|
||||||
printf("-y Number of TX antennas used at UE\n");
|
printf("-y Number of TX antennas used at UE\n");
|
||||||
printf("-z Number of RX antennas used at gNB\n");
|
printf("-z Number of RX antennas used at gNB\n");
|
||||||
printf("-A Interpolation_filname Run with Abstraction to generate Scatter plot using interpolation polynomial in file\n");
|
printf("-A Interpolation_filname Run with Abstraction to generate Scatter plot using interpolation polynomial in file\n");
|
||||||
printf("-B MCS table\n");
|
|
||||||
//printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n");
|
//printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n");
|
||||||
printf("-F Input filename (.txt format) for RX conformance testing\n");
|
printf("-F Input filename (.txt format) for RX conformance testing\n");
|
||||||
printf("-G Offset of samples to read from file (0 default)\n");
|
printf("-G Offset of samples to read from file (0 default)\n");
|
||||||
@@ -632,7 +634,7 @@ int main(int argc, char **argv)
|
|||||||
printf("-S Ending SNR, runs from SNR0 to SNR1\n");
|
printf("-S Ending SNR, runs from SNR0 to SNR1\n");
|
||||||
printf("-P Print ULSCH performances\n");
|
printf("-P Print ULSCH performances\n");
|
||||||
printf("-T Enable PTRS, arguments list L_PTRS{0,1,2} K_PTRS{2,4}, e.g. -T 2 0 2 \n");
|
printf("-T Enable PTRS, arguments list L_PTRS{0,1,2} K_PTRS{2,4}, e.g. -T 2 0 2 \n");
|
||||||
printf("-U Change DMRS Config, arguments list DMRS TYPE{0=A,1=B} DMRS AddPos{0:3}, e.g. -U 2 0 2 \n");
|
printf("-U Change DMRS Config, arguments list: DMRS Mapping Type{0=A,1=B}, DMRS AddPos{0:3}, DMRS Config Type{1,2}, Number of CDM groups without data{1,2,3} e.g. -U 4 0 2 0 1 \n");
|
||||||
printf("-Q If -F used, read parameters from file\n");
|
printf("-Q If -F used, read parameters from file\n");
|
||||||
printf("-Z If -Z is used, SC-FDMA or transform precoding is enabled in Uplink \n");
|
printf("-Z If -Z is used, SC-FDMA or transform precoding is enabled in Uplink \n");
|
||||||
printf("-W Num of layer for PUSCH\n");
|
printf("-W Num of layer for PUSCH\n");
|
||||||
@@ -727,7 +729,6 @@ int main(int argc, char **argv)
|
|||||||
gNB->UL_INFO.crc_ind.crc_list = (nfapi_nr_crc_t *)malloc(NB_UE_INST*sizeof(nfapi_nr_crc_t));
|
gNB->UL_INFO.crc_ind.crc_list = (nfapi_nr_crc_t *)malloc(NB_UE_INST*sizeof(nfapi_nr_crc_t));
|
||||||
gNB->UL_INFO.rx_ind.number_of_pdus = 0;
|
gNB->UL_INFO.rx_ind.number_of_pdus = 0;
|
||||||
gNB->UL_INFO.crc_ind.number_crcs = 0;
|
gNB->UL_INFO.crc_ind.number_crcs = 0;
|
||||||
gNB->prb_interpolation = prb_inter;
|
|
||||||
gNB->max_ldpc_iterations = max_ldpc_iterations;
|
gNB->max_ldpc_iterations = max_ldpc_iterations;
|
||||||
frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH)
|
frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH)
|
||||||
|
|
||||||
@@ -792,6 +793,8 @@ int main(int argc, char **argv)
|
|||||||
cfg->carrier_config.num_tx_ant.value = 1;
|
cfg->carrier_config.num_tx_ant.value = 1;
|
||||||
cfg->carrier_config.num_rx_ant.value = n_rx;
|
cfg->carrier_config.num_rx_ant.value = n_rx;
|
||||||
// nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu,0,0x01);
|
// nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu,0,0x01);
|
||||||
|
gNB->chest_freq = chest_type[0];
|
||||||
|
gNB->chest_time = chest_type[1];
|
||||||
phy_init_nr_gNB(gNB,0,1);
|
phy_init_nr_gNB(gNB,0,1);
|
||||||
N_RB_DL = gNB->frame_parms.N_RB_DL;
|
N_RB_DL = gNB->frame_parms.N_RB_DL;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user