mirror of
https://gitlab.eurecom.fr/oai/openairinterface5g.git
synced 2026-07-13 04:30:28 +00:00
Compare commits
4 Commits
23796f054f
...
uplink_mu_
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8142f982c6 | ||
|
|
e45118aa93 | ||
|
|
a9b87040a0 | ||
|
|
fbf467cf89 |
@@ -2063,6 +2063,19 @@ target_link_libraries(nr_srssim PRIVATE
|
||||
m pthread ITTI dl nr_ue_phy_meas physim_common softmodem_common
|
||||
)
|
||||
|
||||
add_executable(nr_ulsim_mu_mimo
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulsim_mu_mimo.c
|
||||
${NFAPI_USER_DIR}/nfapi.c
|
||||
${NFAPI_USER_DIR}/gnb_ind_vars.c
|
||||
${PHY_INTERFACE_DIR}/queue_t.c
|
||||
)
|
||||
|
||||
target_link_libraries(nr_ulsim_mu_mimo PRIVATE
|
||||
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_UE_NR MAC_NR_COMMON CONFIG_LIB L2_NR -Wl,--end-group
|
||||
m pthread ${T_LIB} ITTI dl nr_ue_phy_meas physim_common softmodem_common
|
||||
)
|
||||
target_link_libraries(nr_ulsim_mu_mimo PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
|
||||
if(CUDA_ENABLE)
|
||||
if (TARGET oai_cuda_lib)
|
||||
target_link_libraries(nr_dlsim PRIVATE oai_cuda_lib)
|
||||
@@ -2119,7 +2132,7 @@ if (${T_TRACER})
|
||||
lte-softmodem lte-uesoftmodem nr-softmodem
|
||||
nr-uesoftmodem dlsim dlsim_tm4 dlsim_tm7
|
||||
ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim
|
||||
syncsim nr_ulsim nr_dlsim nr_dlschsim nr_pbchsim nr_pucchsim
|
||||
syncsim nr_ulsim nr_ulsim_mu_mimo nr_dlsim nr_dlschsim nr_pbchsim nr_pucchsim
|
||||
nr_ulschsim ldpctest polartest smallblocktest nr_srssim
|
||||
#all "add_library" definitions
|
||||
ITTI lte_rrc nr_rrc s1ap x2ap m2ap m3ap f1ap
|
||||
|
||||
@@ -70,7 +70,7 @@ static inline const char *rnti_types(nr_rnti_type_t rr)
|
||||
#define MAX_GSCN_BAND 620 // n78 has the highest GSCN range of 619
|
||||
#define NR_SYMBOLS_PER_SLOT 14
|
||||
#define NR_SYMBOLS_PER_SLOT_EXTENDED_CP 12
|
||||
#define NR_MAX_NB_LAYERS 4 // 8
|
||||
#define NR_MAX_NB_LAYERS 8
|
||||
#define NR_MAX_CSI_PORTS 12
|
||||
|
||||
// Since the IQ samples are represented by SQ15 R+I (see https://en.wikipedia.org/wiki/Q_(number_format)) we need to compensate when
|
||||
|
||||
@@ -100,7 +100,7 @@ void phy_init_nr_gNB(PHY_VARS_gNB *gNB)
|
||||
|
||||
int Ptx = cfg->carrier_config.num_tx_ant.value;
|
||||
int Prx = cfg->carrier_config.num_rx_ant.value;
|
||||
int max_ul_mimo_layers = 4;
|
||||
int max_ul_mimo_layers = NR_MAX_NB_LAYERS;
|
||||
|
||||
AssertFatal(Ptx > 0 && Ptx < 9,"Ptx %d is not supported\n", Ptx);
|
||||
AssertFatal(Prx > 0 && Prx < 9,"Prx %d is not supported\n", Prx);
|
||||
@@ -206,7 +206,7 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
|
||||
{
|
||||
const int Ptx = gNB->gNB_config.carrier_config.num_tx_ant.value;
|
||||
const int Prx = gNB->gNB_config.carrier_config.num_rx_ant.value;
|
||||
const int max_ul_mimo_layers = 4; // taken from phy_init_nr_gNB()
|
||||
const int max_ul_mimo_layers = NR_MAX_NB_LAYERS;
|
||||
const int n_buf = Prx * max_ul_mimo_layers;
|
||||
|
||||
PHY_MEASUREMENTS_gNB *meas = &gNB->measurements;
|
||||
|
||||
@@ -446,11 +446,11 @@ static void nr_pusch_antenna_processing(void *arg)
|
||||
completed_task_ans(rdata->ans);
|
||||
}
|
||||
|
||||
|
||||
int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
||||
unsigned char Ns,
|
||||
int nl,
|
||||
unsigned short p,
|
||||
uint8_t lp,
|
||||
unsigned char symbol,
|
||||
int ul_id,
|
||||
int beam_nb,
|
||||
@@ -486,7 +486,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
||||
gold,
|
||||
pilot,
|
||||
(1000 + p),
|
||||
0,
|
||||
lp % 2,
|
||||
nb_rb_pusch,
|
||||
(pusch_pdu->bwp_start + pusch_pdu->rb_start) * NR_NB_SC_PER_RB,
|
||||
pusch_pdu->dmrs_config_type,
|
||||
|
||||
@@ -28,6 +28,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
||||
unsigned char Ns,
|
||||
int nl,
|
||||
unsigned short p,
|
||||
uint8_t lp,
|
||||
unsigned char symbol,
|
||||
int ul_id,
|
||||
int beam_nb,
|
||||
|
||||
@@ -240,7 +240,8 @@ void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t num_symbols,
|
||||
uint8_t start_symbol,
|
||||
uint16_t dmrs_bitmap,
|
||||
uint16_t num_rbs)
|
||||
uint16_t num_rbs,
|
||||
uint8_t nb_layers)
|
||||
{
|
||||
simde__m128i *ul_ch128_0;
|
||||
simde__m128i *ul_ch128_1;
|
||||
@@ -249,64 +250,68 @@ void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms,
|
||||
int num_dmrs_symb = count_bits64_with_mask(dmrs_bitmap, start_symbol, 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 = (simde__m128i *)&ch_estimates[aarx][first_dmrs_symb*frame_parms->ofdm_symbol_size];
|
||||
if ((dmrs_bitmap >> symb) & 0x01) {
|
||||
ul_ch128_1 = (simde__m128i *)&ch_estimates[aarx][symb*frame_parms->ofdm_symbol_size];
|
||||
for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) {
|
||||
ul_ch128_0[0] = simde_mm_adds_epi16(ul_ch128_0[0], ul_ch128_1[0]);
|
||||
ul_ch128_0[1] = simde_mm_adds_epi16(ul_ch128_0[1], ul_ch128_1[1]);
|
||||
ul_ch128_0[2] = simde_mm_adds_epi16(ul_ch128_0[2], ul_ch128_1[2]);
|
||||
ul_ch128_0 += 3;
|
||||
ul_ch128_1 += 3;
|
||||
for (int nl = 0; nl < nb_layers; nl++) {
|
||||
for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
||||
int ch_offset = nl * frame_parms->nb_antennas_rx + aarx;
|
||||
for (int symb = first_dmrs_symb + 1; symb < total_symbols; symb++) {
|
||||
ul_ch128_0 = (simde__m128i *)&ch_estimates[ch_offset][first_dmrs_symb * frame_parms->ofdm_symbol_size];
|
||||
if ((dmrs_bitmap >> symb) & 0x01) {
|
||||
ul_ch128_1 = (simde__m128i *)&ch_estimates[ch_offset][symb * frame_parms->ofdm_symbol_size];
|
||||
for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) {
|
||||
ul_ch128_0[0] = simde_mm_adds_epi16(ul_ch128_0[0], ul_ch128_1[0]);
|
||||
ul_ch128_0[1] = simde_mm_adds_epi16(ul_ch128_0[1], ul_ch128_1[1]);
|
||||
ul_ch128_0[2] = simde_mm_adds_epi16(ul_ch128_0[2], ul_ch128_1[2]);
|
||||
ul_ch128_0 += 3;
|
||||
ul_ch128_1 += 3;
|
||||
}
|
||||
}
|
||||
}
|
||||
ul_ch128_0 = (simde__m128i *)&ch_estimates[ch_offset][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] = simde_mm_srai_epi16(ul_ch128_0[0], 1);
|
||||
ul_ch128_0[1] = simde_mm_srai_epi16(ul_ch128_0[1], 1);
|
||||
ul_ch128_0[2] = simde_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] = simde_mm_srai_epi16(ul_ch128_0[0], 2);
|
||||
ul_ch128_0[1] = simde_mm_srai_epi16(ul_ch128_0[1], 2);
|
||||
ul_ch128_0[2] = simde_mm_srai_epi16(ul_ch128_0[2], 2);
|
||||
ul_ch128_0 += 3;
|
||||
}
|
||||
} else if (num_dmrs_symb == 3) {
|
||||
ul_ch16_0 = (int16_t *)&ch_estimates[ch_offset][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");
|
||||
}
|
||||
ul_ch128_0 = (simde__m128i *)&ch_estimates[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] = simde_mm_srai_epi16(ul_ch128_0[0], 1);
|
||||
ul_ch128_0[1] = simde_mm_srai_epi16(ul_ch128_0[1], 1);
|
||||
ul_ch128_0[2] = simde_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] = simde_mm_srai_epi16(ul_ch128_0[0], 2);
|
||||
ul_ch128_0[1] = simde_mm_srai_epi16(ul_ch128_0[1], 2);
|
||||
ul_ch128_0[2] = simde_mm_srai_epi16(ul_ch128_0[2], 2);
|
||||
ul_ch128_0 += 3;
|
||||
}
|
||||
} else if (num_dmrs_symb == 3) {
|
||||
ul_ch16_0 = (int16_t *)&ch_estimates[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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,7 +37,8 @@ void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t num_symbols,
|
||||
uint8_t start_symbol,
|
||||
uint16_t dmrs_bitmap,
|
||||
uint16_t num_rbs);
|
||||
uint16_t num_rbs,
|
||||
uint8_t nb_layers);
|
||||
|
||||
int8_t get_num_dmrs_re_per_rb(const uint8_t dmrs_type, const uint8_t num_cdm_grp_no_data);
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ int nr_pusch_dmrs_rx(nr_prefix_type_t Ncp,
|
||||
#ifdef DEBUG_PUSCH
|
||||
printf("nr_pusch_dmrs_rx dmrs config type %d port %d nb_pusch_rb %d\n", dmrs_type, p, nb_pusch_rb);
|
||||
printf("wf[%d] = %d wt[%d]= %d\n", i&1, wf[p-1000][i&1], lp, wt[p-1000][lp]);
|
||||
printf("i %d idx %d pusch mod_dmrs %d %d\n", i, idx, output[k].r, output[k].i);
|
||||
printf("i %d k %d pusch mod_dmrs %d %d\n", i, k, output[k].r, output[k].i);
|
||||
#endif
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -165,16 +165,14 @@ static int get_nb_re_pusch (NR_DL_FRAME_PARMS *frame_parms, nfapi_nr_pusch_pdu_t
|
||||
{
|
||||
uint8_t dmrs_symbol_flag = (rel15_ul->ul_dmrs_symb_pos >> symbol) & 0x01;
|
||||
if (dmrs_symbol_flag == 1) {
|
||||
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");
|
||||
|
||||
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 2 both odd and even REs have no data
|
||||
return(rel15_ul->rb_size *(12 - (rel15_ul->num_dmrs_cdm_grps_no_data*6)));
|
||||
}
|
||||
else return(rel15_ul->rb_size *(12 - (rel15_ul->num_dmrs_cdm_grps_no_data*4)));
|
||||
} else return(rel15_ul->rb_size * NR_NB_SC_PER_RB);
|
||||
} else
|
||||
return (rel15_ul->rb_size * NR_NB_SC_PER_RB);
|
||||
}
|
||||
|
||||
static void nr_ulsch_channel_compensation(uint32_t buffer_length,
|
||||
@@ -922,15 +920,15 @@ static void inner_rx(PHY_VARS_gNB *gNB,
|
||||
#endif
|
||||
}
|
||||
}
|
||||
c16_t rho[nb_layer][nb_layer][buffer_length] __attribute__((aligned(32)));
|
||||
c16_t rxF_ch_maga [nb_layer][buffer_length] __attribute__((aligned(32)));
|
||||
c16_t rxF_ch_magb [nb_layer][buffer_length] __attribute__((aligned(32)));
|
||||
c16_t rxF_ch_magc [nb_layer][buffer_length] __attribute__((aligned(32)));
|
||||
c16_t(*rho)[nb_layer][buffer_length] = memalign(32, nb_layer * nb_layer * buffer_length * sizeof(c16_t));
|
||||
c16_t(*rxF_ch_maga)[buffer_length] = memalign(32, nb_layer * buffer_length * sizeof(c16_t));
|
||||
c16_t(*rxF_ch_magb)[buffer_length] = memalign(32, nb_layer * buffer_length * sizeof(c16_t));
|
||||
c16_t(*rxF_ch_magc)[buffer_length] = memalign(32, nb_layer * buffer_length * sizeof(c16_t));
|
||||
|
||||
memset(rho, 0, sizeof(rho));
|
||||
memset(rxF_ch_maga, 0, sizeof(rxF_ch_maga));
|
||||
memset(rxF_ch_magb, 0, sizeof(rxF_ch_magb));
|
||||
memset(rxF_ch_magc, 0, sizeof(rxF_ch_magc));
|
||||
memset(rho, 0, nb_layer * nb_layer * buffer_length * sizeof(c16_t));
|
||||
memset(rxF_ch_maga, 0, nb_layer * buffer_length * sizeof(c16_t));
|
||||
memset(rxF_ch_magb, 0, nb_layer * buffer_length * sizeof(c16_t));
|
||||
memset(rxF_ch_magc, 0, nb_layer * buffer_length * sizeof(c16_t));
|
||||
for (int i = 0; i < nb_layer; i++)
|
||||
memset(&pusch_vars->rxdataF_comp[i*nb_rx_ant][symbol * buffer_length], 0, sizeof(int32_t) * buffer_length);
|
||||
|
||||
@@ -1011,6 +1009,10 @@ static void inner_rx(PHY_VARS_gNB *gNB,
|
||||
pusch_vars->ul_valid_re_per_slot[symbol],
|
||||
symbol,
|
||||
rel15_ul->qam_mod_order);
|
||||
free(rho);
|
||||
free(rxF_ch_maga);
|
||||
free(rxF_ch_magb);
|
||||
free(rxF_ch_magc);
|
||||
}
|
||||
|
||||
typedef struct puschSymbolProc_s {
|
||||
@@ -1167,6 +1169,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
|
||||
int max_ch = 0;
|
||||
uint32_t nvar = 0;
|
||||
int end_symbol = rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols;
|
||||
uint8_t dmrs_symb_idx = 0;
|
||||
for (uint8_t symbol = rel15_ul->start_symbol_index; symbol < end_symbol; symbol++) {
|
||||
uint8_t dmrs_symbol_flag = (rel15_ul->ul_dmrs_symb_pos >> symbol) & 0x01;
|
||||
LOG_D(PHY, "symbol %d, dmrs_symbol_flag :%d\n", symbol, dmrs_symbol_flag);
|
||||
@@ -1178,6 +1181,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
|
||||
slot,
|
||||
nl,
|
||||
get_dmrs_port(nl, rel15_ul->dmrs_ports),
|
||||
dmrs_symb_idx,
|
||||
symbol,
|
||||
ulsch_id,
|
||||
beam_nb,
|
||||
@@ -1189,10 +1193,12 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
|
||||
pusch_ch_est_dmrs_pos_slot_mem);
|
||||
nvar += nvar_tmp;
|
||||
}
|
||||
dmrs_symb_idx++;
|
||||
}
|
||||
}
|
||||
|
||||
nvar /= (rel15_ul->nr_of_symbols * rel15_ul->nrOfLayers * frame_parms->nb_antennas_rx);
|
||||
if (dmrs_symb_idx > 0)
|
||||
nvar /= (dmrs_symb_idx * rel15_ul->nrOfLayers);
|
||||
|
||||
allocCast2D(n0_subband_power,
|
||||
unsigned int,
|
||||
@@ -1244,7 +1250,8 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
|
||||
rel15_ul->nr_of_symbols,
|
||||
rel15_ul->start_symbol_index,
|
||||
rel15_ul->ul_dmrs_symb_pos,
|
||||
rel15_ul->rb_size);
|
||||
rel15_ul->rb_size,
|
||||
rel15_ul->nrOfLayers);
|
||||
|
||||
stop_meas(&gNB->ulsch_channel_estimation_stats);
|
||||
|
||||
|
||||
@@ -271,7 +271,7 @@ typedef struct {
|
||||
unsigned int dmrs_scrambling_id;
|
||||
unsigned int scid;
|
||||
unsigned int dmrs_port;
|
||||
int Wt;
|
||||
int *Wt;
|
||||
int *Wf;
|
||||
unsigned int dmrs_symb_pos;
|
||||
unsigned int ptrs_symb_pos;
|
||||
@@ -455,6 +455,7 @@ static void map_symbols(const nr_phy_pxsch_params_t p,
|
||||
// for all symbols
|
||||
const unsigned int n_dmrs = (p.bwp_start + p.start_rb + p.nb_rb) * ((p.dmrs_type == pusch_dmrs_type1) ? 6 : 4);
|
||||
const c16_t *cur_data = data;
|
||||
uint8_t dmrs_symb_idx = 0;
|
||||
for (int l = p.start_symbol; l < p.start_symbol + p.num_symbols; l++) {
|
||||
const bool dmrs_symbol = is_dmrs_symbol(l, p.dmrs_symb_pos);
|
||||
const bool ptrs_symbol = is_ptrs_symbol(l, p.ptrs_symb_pos);
|
||||
@@ -468,10 +469,11 @@ static void map_symbols(const nr_phy_pxsch_params_t p,
|
||||
c16_t mod_dmrs[ALNARS_16_4(n_dmrs)] __attribute((aligned(16)));
|
||||
if (p.transform_precoding == transformPrecoder_disabled) {
|
||||
nr_modulation(gold, n_dmrs * 2, DMRS_MOD_ORDER, (int16_t *)mod_dmrs);
|
||||
dmrs_amp_mult(p.Wt, p.Wf, mod_dmrs, mod_dmrs_amp, n_dmrs, p.dmrs_type, p.num_cdm_no_data);
|
||||
dmrs_amp_mult(p.Wt[dmrs_symb_idx % 2], p.Wf, mod_dmrs, mod_dmrs_amp, n_dmrs, p.dmrs_type, p.num_cdm_no_data);
|
||||
} else {
|
||||
dmrs_amp_mult(p.Wt, p.Wf, dmrs_seq, mod_dmrs_amp, n_dmrs, p.dmrs_type, p.num_cdm_no_data);
|
||||
dmrs_amp_mult(p.Wt[dmrs_symb_idx % 2], p.Wf, dmrs_seq, mod_dmrs_amp, n_dmrs, p.dmrs_type, p.num_cdm_no_data);
|
||||
}
|
||||
dmrs_symb_idx++;
|
||||
} else if ((p.pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) && ptrs_symbol) {
|
||||
AssertFatal(p.transform_precoding == transformPrecoder_disabled, "PTRS NOT SUPPORTED IF TRANSFORM PRECODING IS ENABLED\n");
|
||||
c16_t mod_ptrs[ALNARS_16_4(p.nb_rb)] __attribute((aligned(16)));
|
||||
@@ -1172,8 +1174,6 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
|
||||
|
||||
LOG_D(PHY, "nr_ue_ulsch_procedures_slot hard_id %d %d.%d\n", harq_pid, frame, slot);
|
||||
|
||||
int l_prime[2];
|
||||
|
||||
NR_DL_FRAME_PARMS *frame_parms = &UE->frame_parms;
|
||||
|
||||
int N_PRB_oh = 0; // higher layer (RRC) parameter xOverhead in PUSCH-ServingCellConfig
|
||||
@@ -1378,8 +1378,6 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
|
||||
|
||||
//////////////////////// ULSCH transform precoding ////////////////////////
|
||||
|
||||
l_prime[0] = 0; // single symbol ap 0
|
||||
|
||||
uint8_t u = 0, v = 0;
|
||||
c16_t *dmrs_seq = NULL;
|
||||
/// Transform-coded "y"-sequences (for definition see 38-211 V15.3.0 2018-09, subsection 6.3.1.4)
|
||||
@@ -1472,7 +1470,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
|
||||
.dmrs_scrambling_id = pusch_pdu->ul_dmrs_scrambling_id,
|
||||
.scid = pusch_pdu->scid,
|
||||
.dmrs_port = dmrs_port,
|
||||
.Wt = Wt[l_prime[0]],
|
||||
.Wt = Wt,
|
||||
.Wf = Wf,
|
||||
.dmrs_symb_pos = ul_dmrs_symb_pos,
|
||||
.ptrs_symb_pos = ulsch_ue->ptrs_symbols,
|
||||
|
||||
@@ -645,7 +645,8 @@ static int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
|
||||
dlschCfg->number_symbols,
|
||||
dlschCfg->start_symbol,
|
||||
dlschCfg->dlDmrsSymbPos,
|
||||
freq_alloc.num_rbs);
|
||||
freq_alloc.num_rbs,
|
||||
dlsch0->Nl);
|
||||
}
|
||||
|
||||
uint16_t first_symbol_with_data = dlschCfg->start_symbol;
|
||||
|
||||
@@ -535,7 +535,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
case 'y':
|
||||
n_tx = atoi(optarg);
|
||||
if ((n_tx == 0) || (n_tx > 4)) {
|
||||
if ((n_tx == 0) || (n_tx > 8)) {
|
||||
printf("Unsupported number of tx antennas %d\n", n_tx);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
1102
openair1/SIMULATION/NR_PHY/ulsim_mu_mimo.c
Normal file
1102
openair1/SIMULATION/NR_PHY/ulsim_mu_mimo.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -222,7 +222,7 @@ if(PACKAGING_PHYSIM)
|
||||
--------------------------------------------------------
|
||||
Coding focused: polartest, smallblocktest, ldpctest
|
||||
Downlink PHY: nr_dlschsim, nr_psbchsim, nr_dlsim
|
||||
Uplink PHY: nr_pucchsim nr_prachsim nr_ulschsim nr_ulsim
|
||||
Uplink PHY: nr_pucchsim nr_prachsim nr_ulschsim nr_ulsim nr_ulsim_mu_mimo
|
||||
--------------------------------------------------------
|
||||
polartest: test polar codes which are used in 5G control channels, validates encoding, decoding and error correction performance*
|
||||
smallblocktest: generic test for small channel coding blocks, validates encoding and decoding for small transport blocks
|
||||
@@ -233,7 +233,8 @@ if(PACKAGING_PHYSIM)
|
||||
nr_dlsim: simulates NR downlink, including multiple downlink channels and measurements of BLER/throughput
|
||||
nr_prachsim: simulates the Physical Random Access Channel, including UE initial access, preamble detection and timing alignment
|
||||
nr_ulschsim: simulates the Uplink Shared Channel, including LDPC encoding, modulation, transmission and decoding
|
||||
nr_ulsim: simulates the NR uplink simulation, including PUCCH, PUSCH and PRACH")
|
||||
nr_ulsim: simulates the NR uplink simulation, including PUCCH, PUSCH and PRACH
|
||||
nr_ulsim_mu_mimo: simulates the NR uplink simulation with PUSCH multi user MIMO")
|
||||
|
||||
if(PACKAGING_RPM)
|
||||
set(CPACK_RPM_PACKAGE_OAI-PHYSIM_SUMMARY "OpenAirInterface PhySim package")
|
||||
@@ -254,7 +255,7 @@ if(PACKAGING_PHYSIM)
|
||||
install(FILES "${CMAKE_SOURCE_DIR}/doc/physical-simulators.md" DESTINATION share/doc/ COMPONENT oai-physim)
|
||||
|
||||
#Add the targets to the package
|
||||
install(TARGETS polartest smallblocktest ldpctest nr_dlschsim nr_psbchsim nr_pucchsim nr_dlsim nr_prachsim nr_ulschsim nr_ulsim
|
||||
install(TARGETS polartest smallblocktest ldpctest nr_dlschsim nr_psbchsim nr_pucchsim nr_dlsim nr_prachsim nr_ulschsim nr_ulsim nr_ulsim_mu_mimo
|
||||
COMPONENT oai-physim
|
||||
RUNTIME DESTINATION /usr/bin
|
||||
LIBRARY DESTINATION /usr/lib
|
||||
|
||||
Reference in New Issue
Block a user