Compare commits

...

4 Commits

Author SHA1 Message Date
Rakesh Mundlamuri
8142f982c6 Fix time domain averaging to average over number of layers 2026-04-08 18:23:18 +05:30
Rakesh Mundlamuri
e45118aa93 Fix Wt (orthogonal code) multiplication for PUSCH DMRS length 2
Also fixes noise power computation removing the duplicate division over
number of antennas
2026-04-08 15:55:54 +05:30
Rakesh Mundlamuri
a9b87040a0 Add ulsim_mu_mimo PHY simulator to test multi user MIMO scenarios 2026-04-07 17:27:22 +05:30
Rakesh Mundlamuri
fbf467cf89 Fixes to support 8 PUSCH DMRS antenna ports
Note that MMSE receiver for 4 and 8 antenna ports is still missing
2026-04-03 19:22:40 +05:30
14 changed files with 1221 additions and 92 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View File

@@ -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,

View File

@@ -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,

View File

@@ -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");
}
}

View File

@@ -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);

View File

@@ -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 {

View File

@@ -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);

View File

@@ -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,

View File

@@ -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;

View File

@@ -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);
}

File diff suppressed because it is too large Load Diff

View File

@@ -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