fix blocking bugs in command nr_dlsim -n100 -e27 -s35 -b 273 -R273 -x4 -y4 -z4
use a better complex vector multiplication function
This commit is contained in:
@@ -589,20 +589,21 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
||||
symbol,
|
||||
nb_re_pdsch);
|
||||
if (nl >= 2) // Apply MMSE for 2, 3, and 4 Tx layers
|
||||
nr_dlsch_mmse(rx_size_symbol,
|
||||
n_rx,
|
||||
nl,
|
||||
rxdataF_comp,
|
||||
dl_ch_mag,
|
||||
dl_ch_magb,
|
||||
dl_ch_magr,
|
||||
dl_ch_estimates_ext,
|
||||
nb_rb_pdsch,
|
||||
dlsch_config->qamModOrder,
|
||||
*log2_maxh,
|
||||
symbol,
|
||||
nb_re_pdsch,
|
||||
nvar);
|
||||
if (nb_re_pdsch)
|
||||
nr_dlsch_mmse(rx_size_symbol,
|
||||
n_rx,
|
||||
nl,
|
||||
rxdataF_comp,
|
||||
dl_ch_mag,
|
||||
dl_ch_magb,
|
||||
dl_ch_magr,
|
||||
dl_ch_estimates_ext,
|
||||
nb_rb_pdsch,
|
||||
dlsch_config->qamModOrder,
|
||||
*log2_maxh,
|
||||
symbol,
|
||||
nb_re_pdsch,
|
||||
nvar);
|
||||
}
|
||||
stop_meas_nr_ue_phy(ue, DLSCH_MRC_MMSE_STATS);
|
||||
|
||||
|
||||
@@ -141,14 +141,13 @@ void nr_64qam_llr(int32_t *rxdataF_comp, int32_t *ch_mag, int32_t *ch_mag2, int1
|
||||
int32_t *llr_32 = (int32_t *)llr;
|
||||
|
||||
#ifndef USE_128BIT
|
||||
simde__m256i xmm0, xmm1, xmm2;
|
||||
for (int i = 0; i < (nb_re >> 3); i++) {
|
||||
xmm0 = *rxF;
|
||||
simde__m256i xmm0 = simde_mm256_loadu_si256(rxF);
|
||||
// registers of even index in xmm0-> |y_R|, registers of odd index in xmm0-> |y_I|
|
||||
xmm1 = simde_mm256_abs_epi16(xmm0);
|
||||
simde__m256i xmm1 = simde_mm256_abs_epi16(xmm0);
|
||||
// registers of even index in xmm0-> |y_R|-|h|^2, registers of odd index in xmm0-> |y_I|-|h|^2
|
||||
xmm1 = simde_mm256_subs_epi16(*ch_maga, xmm1);
|
||||
xmm2 = simde_mm256_abs_epi16(xmm1);
|
||||
simde__m256i xmm2 = simde_mm256_abs_epi16(xmm1);
|
||||
xmm2 = simde_mm256_subs_epi16(*ch_magb, xmm2);
|
||||
// xmm0 |1st 4th 7th 10th 13th 16th 19th 22ed|
|
||||
// xmm1 |2ed 5th 8th 11th 14th 17th 20th 23rd|
|
||||
|
||||
@@ -505,8 +505,8 @@ static int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
|
||||
dlsch0->Nl);
|
||||
|
||||
const uint32_t pdsch_est_size = ((ue->frame_parms.symbols_per_slot * ue->frame_parms.ofdm_symbol_size + 15) / 16) * 16;
|
||||
__attribute__((aligned(32))) int32_t pdsch_dl_ch_estimates[ue->frame_parms.nb_antennas_rx * dlsch0->Nl][pdsch_est_size];
|
||||
memset(pdsch_dl_ch_estimates, 0, sizeof(int32_t) * ue->frame_parms.nb_antennas_rx * dlsch0->Nl * pdsch_est_size);
|
||||
fourDimArray_t *toFree = NULL;
|
||||
allocCast2D(pdsch_dl_ch_estimates, int32_t, toFree, ue->frame_parms.nb_antennas_rx * dlsch0->Nl, pdsch_est_size, false);
|
||||
|
||||
c16_t ptrs_phase_per_slot[ue->frame_parms.nb_antennas_rx][NR_SYMBOLS_PER_SLOT];
|
||||
memset(ptrs_phase_per_slot, 0, sizeof(ptrs_phase_per_slot));
|
||||
@@ -515,8 +515,14 @@ static int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
|
||||
memset(ptrs_re_per_slot, 0, sizeof(ptrs_re_per_slot));
|
||||
|
||||
const uint32_t rx_size_symbol = (dlsch[0].dlsch_config.number_rbs * NR_NB_SC_PER_RB + 15) & ~15;
|
||||
__attribute__((aligned(32))) int32_t rxdataF_comp[dlsch[0].Nl][ue->frame_parms.nb_antennas_rx][rx_size_symbol * NR_SYMBOLS_PER_SLOT];
|
||||
memset(rxdataF_comp, 0, sizeof(rxdataF_comp));
|
||||
fourDimArray_t *toFree2 = NULL;
|
||||
allocCast3D(rxdataF_comp,
|
||||
int32_t,
|
||||
toFree2,
|
||||
dlsch[0].Nl,
|
||||
ue->frame_parms.nb_antennas_rx,
|
||||
rx_size_symbol * NR_SYMBOLS_PER_SLOT,
|
||||
false);
|
||||
|
||||
uint32_t nvar = 0;
|
||||
|
||||
@@ -620,6 +626,8 @@ static int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
|
||||
return -1;
|
||||
} // CRNTI active
|
||||
stop_meas_nr_ue_phy(ue, RX_PDSCH_STATS);
|
||||
free(toFree);
|
||||
free(toFree2);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -858,15 +858,12 @@ int main(int argc, char **argv)
|
||||
UE_mac->if_module = nr_ue_if_module_init(0);
|
||||
|
||||
unsigned int available_bits=0;
|
||||
unsigned char *estimated_output_bit;
|
||||
unsigned char *test_input_bit;
|
||||
unsigned char *estimated_output_bit=NULL;
|
||||
unsigned char *test_input_bit=NULL;
|
||||
unsigned int errors_bit = 0;
|
||||
|
||||
initFloatingCoresTpool(dlsch_threads, &nrUE_params.Tpool, false, "UE-tpool");
|
||||
|
||||
test_input_bit = (unsigned char *) malloc16(sizeof(unsigned char) * 16 * 68 * 384);
|
||||
estimated_output_bit = (unsigned char *) malloc16(sizeof(unsigned char) * 16 * 68 * 384);
|
||||
|
||||
// generate signal
|
||||
AssertFatal(input_fd==NULL,"Not ready for input signal file\n");
|
||||
|
||||
@@ -905,13 +902,14 @@ int main(int argc, char **argv)
|
||||
gNB->msgDataTx = msgDataTx;
|
||||
|
||||
// Buffers to store internal memory of slot process
|
||||
int rx_size = (((14 * frame_parms->N_RB_DL * 12 * sizeof(int32_t)) + 15) >> 4) << 4;
|
||||
UE->phy_sim_rxdataF = calloc(sizeof(int32_t *) * frame_parms->nb_antennas_rx * g_nrOfLayers, frame_parms->samples_per_slot_wCP * sizeof(int32_t));
|
||||
int rx_size = (((14 * UE->frame_parms.N_RB_DL * 12 * sizeof(int32_t)) + 15) >> 4) << 4;
|
||||
UE->phy_sim_rxdataF = calloc(sizeof(int32_t *) * UE->frame_parms.nb_antennas_rx * g_nrOfLayers,
|
||||
UE->frame_parms.samples_per_slot_wCP * sizeof(int32_t));
|
||||
UE->phy_sim_pdsch_llr = calloc(1, (8 * (3 * 8 * 8448)) * sizeof(int16_t)); // Max length
|
||||
UE->phy_sim_pdsch_rxdataF_ext = calloc(sizeof(int32_t *) * frame_parms->nb_antennas_rx * g_nrOfLayers, rx_size);
|
||||
UE->phy_sim_pdsch_rxdataF_comp = calloc(sizeof(int32_t *) * frame_parms->nb_antennas_rx * g_nrOfLayers, rx_size);
|
||||
UE->phy_sim_pdsch_dl_ch_estimates = calloc(sizeof(int32_t *) * frame_parms->nb_antennas_rx * g_nrOfLayers, rx_size);
|
||||
UE->phy_sim_pdsch_dl_ch_estimates_ext = calloc(sizeof(int32_t *) * frame_parms->nb_antennas_rx * g_nrOfLayers, rx_size);
|
||||
UE->phy_sim_pdsch_rxdataF_ext = calloc(sizeof(int32_t *) * UE->frame_parms.nb_antennas_rx * g_nrOfLayers, rx_size);
|
||||
UE->phy_sim_pdsch_rxdataF_comp = calloc(sizeof(int32_t *) * UE->frame_parms.nb_antennas_rx * g_nrOfLayers, rx_size);
|
||||
UE->phy_sim_pdsch_dl_ch_estimates = calloc(sizeof(int32_t *) * UE->frame_parms.nb_antennas_rx * g_nrOfLayers, rx_size);
|
||||
UE->phy_sim_pdsch_dl_ch_estimates_ext = calloc(sizeof(int32_t *) * UE->frame_parms.nb_antennas_rx * g_nrOfLayers, rx_size);
|
||||
int a_segments = MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER*NR_MAX_NB_LAYERS; //number of segments to be allocated
|
||||
if (g_rbSize != 273) {
|
||||
a_segments = a_segments*g_rbSize;
|
||||
@@ -1118,7 +1116,17 @@ int main(int argc, char **argv)
|
||||
|
||||
// Apply MIMO Channel
|
||||
multipath_channel(gNB2UE, s_re, s_im, r_re, r_im, slot_length, 0, (n_trials == 1) ? 1 : 0);
|
||||
add_noise(UE->common_vars.rxdata, (const double **) r_re, (const double **) r_im, sigma2, slot_length, slot_offset, ts, delay, pdu_bit_map, 0x1, frame_parms->nb_antennas_rx);
|
||||
add_noise(UE->common_vars.rxdata,
|
||||
(const double **)r_re,
|
||||
(const double **)r_im,
|
||||
sigma2,
|
||||
slot_length,
|
||||
slot_offset,
|
||||
ts,
|
||||
delay,
|
||||
pdu_bit_map,
|
||||
0x1,
|
||||
UE->frame_parms.nb_antennas_rx);
|
||||
dl_config.sfn = frame;
|
||||
dl_config.slot = slot;
|
||||
ue_dci_configuration(UE_mac, &dl_config, frame, slot);
|
||||
@@ -1168,6 +1176,10 @@ int main(int argc, char **argv)
|
||||
round++;
|
||||
} // round
|
||||
|
||||
if (test_input_bit == NULL) {
|
||||
test_input_bit = (unsigned char *)malloc16(sizeof(unsigned char) * TBS);
|
||||
estimated_output_bit = (unsigned char *)malloc16(sizeof(unsigned char) * TBS);
|
||||
}
|
||||
for (i = 0; i < TBS; i++) {
|
||||
|
||||
estimated_output_bit[i] = (UE->phy_sim_dlsch_b[i/8] & (1 << (i & 7))) >> (i & 7);
|
||||
@@ -1226,10 +1238,11 @@ int main(int argc, char **argv)
|
||||
fprintf(csv_file,"%.2f,%.4f,%.2f,%u\n", roundStats, effRate, effRate / TBS * 100, TBS);
|
||||
}
|
||||
if (print_perf==1) {
|
||||
printf("\ngNB TX function statistics (per %d us slot, NPRB %d, mcs %d, block %d)\n",
|
||||
printf("\ngNB TX function statistics (per %d us slot, NPRB %d, mcs %d, C %d, block %d)\n",
|
||||
1000 >> *scc->ssbSubcarrierSpacing,
|
||||
g_rbSize,
|
||||
g_mcsIndex,
|
||||
UE->dl_harq_processes[0][slot].C,
|
||||
msgDataTx->dlsch[0][0].harq_process.pdsch_pdu.pdsch_pdu_rel15.TBSize[0] << 3);
|
||||
printDistribution(&gNB->phy_proc_tx,table_tx,"PHY proc tx");
|
||||
printStatIndent2(&gNB->dlsch_encoding_stats,"DLSCH encoding time");
|
||||
|
||||
Reference in New Issue
Block a user