Commit 83ee05c0 authored by Melissa's avatar Melissa

Merge branch 'episys/sl_demodulation_update_for_16QAM' into 'episys/master-sl'

Update 16QAM operation for mcs 10 to 16

See merge request aburger/openairinterface5g!243
parents d2febea8 b8d49eac
...@@ -166,7 +166,13 @@ int write_file_matlab(const char *fname, ...@@ -166,7 +166,13 @@ int write_file_matlab(const char *fname,
fprintf(fp,"%"PRIu32"\n",((uint32_t *)data)[i]); fprintf(fp,"%"PRIu32"\n",((uint32_t *)data)[i]);
} }
break; break;
case 14: case 14:
for (i=0; i<length<<1; i+=(2*dec)) {
fprintf(fp,"%d+%dj\n",((short *)data)[i],((short *)data)[i+1]);
}
break;
case 15: case 15:
for (i=0; i<length<<1; i+=(2*dec)) { for (i=0; i<length<<1; i+=(2*dec)) {
fprintf(fp,"%d + j*(%d)\n",((short *)data)[i],((short *)data)[i+1]); fprintf(fp,"%d + j*(%d)\n",((short *)data)[i],((short *)data)[i+1]);
......
...@@ -621,8 +621,10 @@ void term_nr_ue_transport(PHY_VARS_NR_UE *ue) ...@@ -621,8 +621,10 @@ void term_nr_ue_transport(PHY_VARS_NR_UE *ue)
{ {
const int N_RB_DL = ue->frame_parms.N_RB_DL; const int N_RB_DL = ue->frame_parms.N_RB_DL;
const int N_RB_SL = ue->frame_parms.N_RB_SL; const int N_RB_SL = ue->frame_parms.N_RB_SL;
int num_layers = get_softmodem_params()->sl_mode == 2 ? NR_MAX_NB_LAYERS_SL : NR_MAX_NB_LAYERS;
int num_codeword = num_layers > 4 ? 2 : 1;
for (int i = 0; i < NUMBER_OF_CONNECTED_gNB_MAX; i++) { for (int i = 0; i < NUMBER_OF_CONNECTED_gNB_MAX; i++) {
for (int j = 0; j < 2; j++) { for (int j = 0; j < num_codeword; j++) {
for (int k = 0; k < RX_NB_TH_MAX; k++) { for (int k = 0; k < RX_NB_TH_MAX; k++) {
free_nr_ue_dlsch(&ue->dlsch[k][i][j], N_RB_DL); free_nr_ue_dlsch(&ue->dlsch[k][i][j], N_RB_DL);
if (get_softmodem_params()->sl_mode == 2 || get_softmodem_params()->sl_mode == 1) { if (get_softmodem_params()->sl_mode == 2 || get_softmodem_params()->sl_mode == 1) {
......
...@@ -128,10 +128,7 @@ void nr_modulation(uint32_t *in, ...@@ -128,10 +128,7 @@ void nr_modulation(uint32_t *in,
uint8_t* in_bytes = (uint8_t*) in; uint8_t* in_bytes = (uint8_t*) in;
uint64_t* in64 = (uint64_t*) in; uint64_t* in64 = (uint64_t*) in;
int64_t* out64 = (int64_t*) out; int64_t* out64 = (int64_t*) out;
uint8_t idx; uint32_t i;
uint32_t i,j;
uint32_t bit_cnt;
uint64_t x,x1,x2;
#if defined(__SSE2__) #if defined(__SSE2__)
__m128i *nr_mod_table128; __m128i *nr_mod_table128;
...@@ -152,7 +149,7 @@ void nr_modulation(uint32_t *in, ...@@ -152,7 +149,7 @@ void nr_modulation(uint32_t *in,
i = i*8/2; i = i*8/2;
nr_mod_table32 = (int32_t*) nr_qpsk_mod_table; nr_mod_table32 = (int32_t*) nr_qpsk_mod_table;
while (i<length/2) { while (i<length/2) {
idx = ((in_bytes[(i*2)/8]>>((i*2)&0x7)) & mask); const int idx = ((in_bytes[(i * 2) / 8] >> ((i * 2) & 0x7)) & mask);
out32[i] = nr_mod_table32[idx]; out32[i] = nr_mod_table32[idx];
i++; i++;
} }
...@@ -161,7 +158,7 @@ void nr_modulation(uint32_t *in, ...@@ -161,7 +158,7 @@ void nr_modulation(uint32_t *in,
case 2: case 2:
nr_mod_table32 = (int32_t*) nr_qpsk_mod_table; nr_mod_table32 = (int32_t*) nr_qpsk_mod_table;
for (i=0; i<length/mod_order; i++) { for (i=0; i<length/mod_order; i++) {
idx = ((in[i*2/32]>>((i*2)&0x1f)) & mask); const int idx = ((in[i * 2 / 32] >> ((i * 2) & 0x1f)) & mask);
out32[i] = nr_mod_table32[idx]; out32[i] = nr_mod_table32[idx];
} }
return; return;
...@@ -174,66 +171,68 @@ void nr_modulation(uint32_t *in, ...@@ -174,66 +171,68 @@ void nr_modulation(uint32_t *in,
// the bits that are left out // the bits that are left out
i = i*8/4; i = i*8/4;
while (i<length/4) { while (i<length/4) {
idx = ((in_bytes[(i*4)/8]>>((i*4)&0x7)) & mask); const int idx = ((in_bytes[(i * 4) / 8] >> ((i * 4) & 0x7)) & mask);
out32[i] = nr_16qam_mod_table[idx]; out32[i] = nr_16qam_mod_table[idx];
i++; i++;
} }
return; return;
case 6: case 6:
j = 0; for (i = 0; i < length - 3 * 64; i += 3 * 64) {
for (i=0; i<length/192; i++) { uint64_t x = *in64++;
x = in64[i*3]; uint64_t x1 = x & 0xfff;
x1 = x&4095; *out64++ = nr_64qam_mod_table[x1];
out64[j++] = nr_64qam_mod_table[x1]; x1 = (x >> 12) & 0xfff;
x1 = (x>>12)&4095; *out64++ = nr_64qam_mod_table[x1];
out64[j++] = nr_64qam_mod_table[x1]; x1 = (x >> 24) & 0xfff;
x1 = (x>>24)&4095; *out64++ = nr_64qam_mod_table[x1];
out64[j++] = nr_64qam_mod_table[x1]; x1 = (x >> 36) & 0xfff;
x1 = (x>>36)&4095; *out64++ = nr_64qam_mod_table[x1];
out64[j++] = nr_64qam_mod_table[x1]; x1 = (x >> 48) & 0xfff;
x1 = (x>>48)&4095; *out64++ = nr_64qam_mod_table[x1];
out64[j++] = nr_64qam_mod_table[x1]; uint64_t x2 = (x >> 60);
x2 = (x>>60); x = *in64++;
x = in64[i*3+1];
x2 |= x<<4; x2 |= x<<4;
x1 = x2&4095; x1 = x2 & 0xfff;
out64[j++] = nr_64qam_mod_table[x1]; *out64++ = nr_64qam_mod_table[x1];
x1 = (x2>>12)&4095; x1 = (x2 >> 12) & 0xfff;
out64[j++] = nr_64qam_mod_table[x1]; *out64++ = nr_64qam_mod_table[x1];
x1 = (x2>>24)&4095; x1 = (x2 >> 24) & 0xfff;
out64[j++] = nr_64qam_mod_table[x1]; *out64++ = nr_64qam_mod_table[x1];
x1 = (x2>>36)&4095; x1 = (x2 >> 36) & 0xfff;
out64[j++] = nr_64qam_mod_table[x1]; *out64++ = nr_64qam_mod_table[x1];
x1 = (x2>>48)&4095; x1 = (x2 >> 48) & 0xfff;
out64[j++] = nr_64qam_mod_table[x1]; *out64++ = nr_64qam_mod_table[x1];
x2 = ((x>>56)&0xf0) | (x2>>60); x2 = ((x>>56)&0xf0) | (x2>>60);
x = in64[i*3+2]; x = *in64++;
x2 |= x<<8; x2 |= x<<8;
x1 = x2&4095; x1 = x2 & 0xfff;
out64[j++] = nr_64qam_mod_table[x1]; *out64++ = nr_64qam_mod_table[x1];
x1 = (x2>>12)&4095; x1 = (x2 >> 12) & 0xfff;
out64[j++] = nr_64qam_mod_table[x1]; *out64++ = nr_64qam_mod_table[x1];
x1 = (x2>>24)&4095; x1 = (x2 >> 24) & 0xfff;
out64[j++] = nr_64qam_mod_table[x1]; *out64++ = nr_64qam_mod_table[x1];
x1 = (x2>>36)&4095; x1 = (x2 >> 36) & 0xfff;
out64[j++] = nr_64qam_mod_table[x1]; *out64++ = nr_64qam_mod_table[x1];
x1 = (x2>>48)&4095; x1 = (x2 >> 48) & 0xfff;
out64[j++] = nr_64qam_mod_table[x1]; *out64++ = nr_64qam_mod_table[x1];
x2 = ((x>>52)&0xff0) | (x2>>60); x2 = ((x>>52)&0xff0) | (x2>>60);
out64[j++] = nr_64qam_mod_table[x2]; *out64++ = nr_64qam_mod_table[x2];
} }
i *= 24; while (i + 24 <= length) {
bit_cnt = i * 8; uint32_t xx = 0;
while (bit_cnt < length) { memcpy(&xx, in_bytes + i / 8, 3);
uint32_t xx; uint64_t x1 = xx & 0xfff;
memcpy(&xx, in_bytes+i, sizeof(xx)); *out64++ = nr_64qam_mod_table[x1];
x1 = xx & 4095; x1 = (xx >> 12) & 0xfff;
out64[j++] = nr_64qam_mod_table[x1]; *out64++ = nr_64qam_mod_table[x1];
x1 = (xx >> 12) & 4095; i += 24;
out64[j++] = nr_64qam_mod_table[x1]; }
i += 3; if (i != length) {
bit_cnt += 24; uint32_t xx = 0;
memcpy(&xx, in_bytes + i / 8, 2);
uint64_t x1 = xx & 0xfff;
*out64++ = nr_64qam_mod_table[x1];
} }
return; return;
......
...@@ -336,7 +336,7 @@ void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms, ...@@ -336,7 +336,7 @@ void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms,
c16_t rot2 = frame_parms->symbol_rotation[link_type][symbol + symb_offset]; c16_t rot2 = frame_parms->symbol_rotation[link_type][symbol + symb_offset];
rot2.i=-rot2.i; rot2.i=-rot2.i;
LOG_I(PHY,"slot %d, symb_offset %d rotating by %d.%d\n",slot,symb_offset,rot2.r,rot2.i); LOG_D(PHY,"slot %d, symb_offset %d rotating by %d.%d\n",slot,symb_offset,rot2.r,rot2.i);
c16_t *shift_rot = frame_parms->timeshift_symbol_rotation; c16_t *shift_rot = frame_parms->timeshift_symbol_rotation;
c16_t *this_symbol = (c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)]; c16_t *this_symbol = (c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)];
......
...@@ -301,10 +301,10 @@ void free_ul_reference_signal_sequences(void) ...@@ -301,10 +301,10 @@ void free_ul_reference_signal_sequences(void)
for (Msc_RS=0; Msc_RS < SRS_SB_CONF; Msc_RS++) { for (Msc_RS=0; Msc_RS < SRS_SB_CONF; Msc_RS++) {
for (u=0; u < U_GROUP_NUMBER; u++) { for (u=0; u < U_GROUP_NUMBER; u++) {
for (v=0; v < V_BASE_SEQUENCE_NUMBER; v++) { for (v=0; v < V_BASE_SEQUENCE_NUMBER; v++) {
if (rv_ul_ref_sig[u][v][Msc_RS]) if ((rv_ul_ref_sig) && (rv_ul_ref_sig[u][v][Msc_RS]))
free_and_zero(rv_ul_ref_sig[u][v][Msc_RS]); free_and_zero(rv_ul_ref_sig[u][v][Msc_RS]);
if ((v==0) && (Msc_RS < MAX_INDEX_DMRS_UL_ALLOCATED_REs)) if ((v==0) && (Msc_RS < MAX_INDEX_DMRS_UL_ALLOCATED_REs))
if (dmrs_lowpaprtype1_ul_ref_sig[u][v][Msc_RS]) if ((dmrs_lowpaprtype1_ul_ref_sig) && (dmrs_lowpaprtype1_ul_ref_sig[u][v][Msc_RS]))
free_and_zero(dmrs_lowpaprtype1_ul_ref_sig[u][v][Msc_RS]); free_and_zero(dmrs_lowpaprtype1_ul_ref_sig[u][v][Msc_RS]);
} }
} }
......
...@@ -40,6 +40,12 @@ uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16 ...@@ -40,6 +40,12 @@ uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16
return(G); return(G);
} }
uint32_t nr_get_G_sl(uint16_t nb_rb, uint16_t nb_re_sci1, uint16_t nb_re_sci2, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs, uint8_t Qm, uint8_t Nl) {
uint32_t G;
G = (((NR_NB_SC_PER_RB * nb_symb_sch)-(nb_re_dmrs * length_dmrs)) * nb_rb - nb_re_sci1 - nb_re_sci2) * Qm * Nl;
return(G);
}
uint32_t nr_get_E(uint32_t G, uint8_t C, uint8_t Qm, uint8_t Nl, uint8_t r) { uint32_t nr_get_E(uint32_t G, uint8_t C, uint8_t Qm, uint8_t Nl, uint8_t r) {
uint32_t E; uint32_t E;
uint8_t Cprime = C; //assume CBGTI not present uint8_t Cprime = C; //assume CBGTI not present
......
...@@ -58,6 +58,8 @@ double nr_cyclic_shift_hopping(uint32_t n_id, ...@@ -58,6 +58,8 @@ double nr_cyclic_shift_hopping(uint32_t n_id,
/** \brief Computes available bits G. */ /** \brief Computes available bits G. */
uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch, uint8_t nb_re_dmrs, uint16_t length_dmrs, uint8_t Qm, uint8_t Nl); uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch, uint8_t nb_re_dmrs, uint16_t length_dmrs, uint8_t Qm, uint8_t Nl);
uint32_t nr_get_G_sl(uint16_t nb_rb, uint16_t nb_re_sci1, uint16_t nb_re_sci2, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs, uint8_t Qm, uint8_t Nl);
uint32_t nr_get_E(uint32_t G, uint8_t C, uint8_t Qm, uint8_t Nl, uint8_t r); uint32_t nr_get_E(uint32_t G, uint8_t C, uint8_t Qm, uint8_t Nl, uint8_t r);
void compute_nr_prach_seq(uint8_t short_sequence, void compute_nr_prach_seq(uint8_t short_sequence,
......
...@@ -377,7 +377,6 @@ uint32_t nr_slsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -377,7 +377,6 @@ uint32_t nr_slsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
A = (harq_process->TBS) << 3; A = (harq_process->TBS) << 3;
ret = dlsch->max_ldpc_iterations + 1; ret = dlsch->max_ldpc_iterations + 1;
dlsch->last_iteration_cnt = ret; dlsch->last_iteration_cnt = ret;
harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, dmrs_length, harq_process->Qm,harq_process->Nl);
G = harq_process->G; G = harq_process->G;
// target_code_rate is in 0.1 units // target_code_rate is in 0.1 units
......
...@@ -82,7 +82,7 @@ void nr_slsch_extract_rbs(int32_t **rxdataF, ...@@ -82,7 +82,7 @@ void nr_slsch_extract_rbs(int32_t **rxdataF,
for (aatx = 0; aatx < pssch_pdu->nrOfLayers; aatx++) { for (aatx = 0; aatx < pssch_pdu->nrOfLayers; aatx++) {
sl_ch0 = &pssch_vars->sl_ch_estimates[aatx * frame_parms->nb_antennas_rx + aarx][validDmrsEst * frame_parms->ofdm_symbol_size]; // update channel estimates if new dmrs symbol are available sl_ch0 = &pssch_vars->sl_ch_estimates[aatx * frame_parms->nb_antennas_rx + aarx][validDmrsEst * frame_parms->ofdm_symbol_size]; // update channel estimates if new dmrs symbol are available
sl_ch0_ext = &pssch_vars->sl_ch_estimates_ext[aatx * frame_parms->nb_antennas_rx + aarx][symbol * nb_re_pssch2]; sl_ch0_ext = &pssch_vars->sl_ch_estimates_ext[aatx * frame_parms->nb_antennas_rx + aarx][symbol * nb_re_pssch2];
memcpy1((void*)sl_ch0_ext, (void*)sl_ch0, (nb_re_pssch - nb_re_sci1) * sizeof(int32_t)); memcpy1((void*)sl_ch0_ext, (void*)&sl_ch0[start_re], (nb_re_pssch - nb_re_sci1) * sizeof(int32_t));
} }
} else { // DMRS case } else { // DMRS case
......
...@@ -158,7 +158,7 @@ uint32_t get_B_multiplexed_value(NR_DL_FRAME_PARMS* fp, NR_DL_UE_HARQ_t *harq) { ...@@ -158,7 +158,7 @@ uint32_t get_B_multiplexed_value(NR_DL_FRAME_PARMS* fp, NR_DL_UE_HARQ_t *harq) {
uint8_t nb_dmrs_re_per_rb = 6 * harq->n_dmrs_cdm_groups; uint8_t nb_dmrs_re_per_rb = 6 * harq->n_dmrs_cdm_groups;
unsigned int G_slsch_bits = nr_get_G(nb_rb, number_of_symbols, nb_dmrs_re_per_rb, length_dmrs, mod_order, Nl); unsigned int G_slsch_bits = harq->G;
uint32_t B_mul = G_slsch_bits + harq->B_sci2 * Nl; uint32_t B_mul = G_slsch_bits + harq->B_sci2 * Nl;
return B_mul; return B_mul;
} }
...@@ -178,7 +178,6 @@ void nr_ue_set_slsch_rx(PHY_VARS_NR_UE *ue, unsigned char harq_pid) ...@@ -178,7 +178,6 @@ void nr_ue_set_slsch_rx(PHY_VARS_NR_UE *ue, unsigned char harq_pid)
uint16_t nb_symb_sch = 12; uint16_t nb_symb_sch = 12;
uint16_t nb_symb_cch = 3; // Assumption there are three SLCCH symbols uint16_t nb_symb_cch = 3; // Assumption there are three SLCCH symbols
uint8_t dmrsConfigType = 0; uint8_t dmrsConfigType = 0;
uint8_t nb_re_dmrs = 6;
uint8_t Nl = 1; // number of layers uint8_t Nl = 1; // number of layers
uint8_t Imcs = ue->frame_parms.Imcs; uint8_t Imcs = ue->frame_parms.Imcs;
uint16_t dmrsSymbPos = 16 + 1024; // symbol 4 and 10 uint16_t dmrsSymbPos = 16 + 1024; // symbol 4 and 10
...@@ -204,6 +203,13 @@ void nr_ue_set_slsch_rx(PHY_VARS_NR_UE *ue, unsigned char harq_pid) ...@@ -204,6 +203,13 @@ void nr_ue_set_slsch_rx(PHY_VARS_NR_UE *ue, unsigned char harq_pid)
harq->codeword = 0; harq->codeword = 0;
harq->start_symbol = start_symbol; harq->start_symbol = start_symbol;
uint8_t nb_re_dmrs = 6;
if (harq->dmrsConfigType == NFAPI_NR_DMRS_TYPE1) {
nb_re_dmrs = 6 * harq->n_dmrs_cdm_groups;
} else {
nb_re_dmrs = 4 * harq->n_dmrs_cdm_groups;
}
uint16_t nb_re_sci1 = nb_symb_cch * NB_RB_SCI1 * NR_NB_SC_PER_RB; uint16_t nb_re_sci1 = nb_symb_cch * NB_RB_SCI1 * NR_NB_SC_PER_RB;
uint8_t N_PRB_oh = 0; uint8_t N_PRB_oh = 0;
uint16_t nb_symb_psfch = 0; uint16_t nb_symb_psfch = 0;
...@@ -215,6 +221,7 @@ void nr_ue_set_slsch_rx(PHY_VARS_NR_UE *ue, unsigned char harq_pid) ...@@ -215,6 +221,7 @@ void nr_ue_set_slsch_rx(PHY_VARS_NR_UE *ue, unsigned char harq_pid)
uint16_t nb_re_sci2 = harq->B_sci2 / SCI2_mod_order; uint16_t nb_re_sci2 = harq->B_sci2 / SCI2_mod_order;
unsigned int TBS = nr_compute_tbs_sl(mod_order, code_rate, nb_rb, nb_re_sci1, nb_re_sci2, nb_symb_sch, nb_re_dmrs * length_dmrs, 0, 0, Nl); unsigned int TBS = nr_compute_tbs_sl(mod_order, code_rate, nb_rb, nb_re_sci1, nb_re_sci2, nb_symb_sch, nb_re_dmrs * length_dmrs, 0, 0, Nl);
harq->TBS = TBS >> 3; harq->TBS = TBS >> 3;
harq->G = nr_get_G_sl(nb_rb, nb_re_sci1, nb_re_sci2, harq->nb_symbols, nb_re_dmrs, length_dmrs, harq->Qm, harq->Nl);
LOG_I(NR_PHY, "mcs %u polar_encoder_output_len %u, code_rate %d, TBS %d\n", Imcs, harq->B_sci2, code_rate, TBS); LOG_I(NR_PHY, "mcs %u polar_encoder_output_len %u, code_rate %d, TBS %d\n", Imcs, harq->B_sci2, code_rate, TBS);
harq->status = ACTIVE; harq->status = ACTIVE;
...@@ -222,6 +229,7 @@ void nr_ue_set_slsch_rx(PHY_VARS_NR_UE *ue, unsigned char harq_pid) ...@@ -222,6 +229,7 @@ void nr_ue_set_slsch_rx(PHY_VARS_NR_UE *ue, unsigned char harq_pid)
rel16_sl_rx->mcs_index = Imcs; rel16_sl_rx->mcs_index = Imcs;
rel16_sl_rx->pssch_data.rv_index = 0; rel16_sl_rx->pssch_data.rv_index = 0;
rel16_sl_rx->target_code_rate = code_rate; rel16_sl_rx->target_code_rate = code_rate;
rel16_sl_rx->qam_mod_order = mod_order;
rel16_sl_rx->pssch_data.sci2_size = SCI2_LEN_SIZE >> 3; rel16_sl_rx->pssch_data.sci2_size = SCI2_LEN_SIZE >> 3;
rel16_sl_rx->maintenance_parms_v3.ldpcBaseGraph = get_BG(TBS, code_rate); rel16_sl_rx->maintenance_parms_v3.ldpcBaseGraph = get_BG(TBS, code_rate);
rel16_sl_rx->nr_of_symbols = nb_symb_sch; // number of symbols per slot rel16_sl_rx->nr_of_symbols = nb_symb_sch; // number of symbols per slot
...@@ -246,7 +254,6 @@ void nr_ue_set_slsch(NR_DL_FRAME_PARMS *fp, ...@@ -246,7 +254,6 @@ void nr_ue_set_slsch(NR_DL_FRAME_PARMS *fp,
uint8_t N_PRB_oh = 0; uint8_t N_PRB_oh = 0;
uint16_t nb_symb_sch = 12; uint16_t nb_symb_sch = 12;
uint16_t nb_symb_cch = 3; // Assumption there are three SLCCH symbols uint16_t nb_symb_cch = 3; // Assumption there are three SLCCH symbols
uint8_t nb_re_dmrs = 6;
int nb_rb = get_PRB(fp->N_RB_SL); int nb_rb = get_PRB(fp->N_RB_SL);
uint8_t Imcs = fp->Imcs; uint8_t Imcs = fp->Imcs;
uint8_t Nl = 1; // number of layers uint8_t Nl = 1; // number of layers
...@@ -266,15 +273,12 @@ void nr_ue_set_slsch(NR_DL_FRAME_PARMS *fp, ...@@ -266,15 +273,12 @@ void nr_ue_set_slsch(NR_DL_FRAME_PARMS *fp,
uint16_t code_rate = nr_get_code_rate_ul(Imcs, 0); uint16_t code_rate = nr_get_code_rate_ul(Imcs, 0);
uint8_t mod_order = nr_get_Qm_ul(Imcs, 0); uint8_t mod_order = nr_get_Qm_ul(Imcs, 0);
uint16_t nb_symb_psfch = 0; uint16_t nb_symb_psfch = 0;
uint16_t N_RE_prime = NR_NB_SC_PER_RB * (nb_symb_sch - nb_symb_psfch) - nb_re_dmrs - N_PRB_oh;
uint16_t nb_re_sci1 = nb_symb_cch * NB_RB_SCI1 * NR_NB_SC_PER_RB;
harq->pssch_pdu.mcs_index = Imcs; harq->pssch_pdu.mcs_index = Imcs;
harq->pssch_pdu.nrOfLayers = Nl; harq->pssch_pdu.nrOfLayers = Nl;
harq->pssch_pdu.rb_size = nb_rb; harq->pssch_pdu.rb_size = nb_rb;
harq->pssch_pdu.nr_of_symbols = nb_symb_sch; harq->pssch_pdu.nr_of_symbols = nb_symb_sch;
harq->pssch_pdu.dmrs_config_type = dmrsConfigType; harq->pssch_pdu.dmrs_config_type = dmrsConfigType;
harq->num_of_mod_symbols = N_RE_prime * nb_rb * nb_codewords; harq->num_of_mod_symbols = NR_NB_SC_PER_RB * nb_rb * nb_codewords / 2;//symbol 4 without drms res.
harq->pssch_pdu.pssch_data.rv_index = 0; harq->pssch_pdu.pssch_data.rv_index = 0;
harq->pssch_pdu.pssch_data.sci2_size = SCI2_LEN_SIZE >> 3; harq->pssch_pdu.pssch_data.sci2_size = SCI2_LEN_SIZE >> 3;
harq->pssch_pdu.target_code_rate = code_rate; harq->pssch_pdu.target_code_rate = code_rate;
...@@ -285,10 +289,21 @@ void nr_ue_set_slsch(NR_DL_FRAME_PARMS *fp, ...@@ -285,10 +289,21 @@ void nr_ue_set_slsch(NR_DL_FRAME_PARMS *fp,
harq->pssch_pdu.transform_precoding = transformPrecoder_disabled; harq->pssch_pdu.transform_precoding = transformPrecoder_disabled;
harq->first_tx = 1; harq->first_tx = 1;
uint8_t nb_re_dmrs = 6;
if (harq->pssch_pdu.dmrs_config_type == NFAPI_NR_DMRS_TYPE1) {
nb_re_dmrs = 6 * harq->pssch_pdu.num_dmrs_cdm_grps_no_data;
} else {
nb_re_dmrs = 4 * harq->pssch_pdu.num_dmrs_cdm_grps_no_data;
}
uint16_t N_RE_prime = NR_NB_SC_PER_RB * (nb_symb_sch - nb_symb_psfch) - nb_re_dmrs - N_PRB_oh;
uint16_t nb_re_sci1 = nb_symb_cch * NB_RB_SCI1 * NR_NB_SC_PER_RB;
uint16_t polar_encoder_output_len = polar_encoder_output_length(code_rate, harq->num_of_mod_symbols); uint16_t polar_encoder_output_len = polar_encoder_output_length(code_rate, harq->num_of_mod_symbols);
uint8_t SCI2_mod_order = 2; uint8_t SCI2_mod_order = 2;
uint16_t nb_re_sci2 = polar_encoder_output_len / SCI2_mod_order; uint16_t nb_re_sci2 = polar_encoder_output_len / SCI2_mod_order;
unsigned int TBS = nr_compute_tbs_sl(mod_order, code_rate, nb_rb, nb_re_sci1, nb_re_sci2, nb_symb_sch, nb_re_dmrs * length_dmrs, 0, 0, Nl); unsigned int TBS = nr_compute_tbs_sl(mod_order, code_rate, nb_rb, nb_re_sci1, nb_re_sci2, nb_symb_sch, nb_re_dmrs * length_dmrs, 0, 0, Nl);
harq->G = nr_get_G_sl(nb_rb, nb_re_sci1, nb_re_sci2, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, Nl);
LOG_D(NR_PHY, "mcs %u polar_encoder_output_len %u, code_rate %d, TBS %d\n", Imcs, polar_encoder_output_len, code_rate, TBS); LOG_D(NR_PHY, "mcs %u polar_encoder_output_len %u, code_rate %d, TBS %d\n", Imcs, polar_encoder_output_len, code_rate, TBS);
harq->pssch_pdu.pssch_data.tb_size = TBS >> 3; harq->pssch_pdu.pssch_data.tb_size = TBS >> 3;
...@@ -341,8 +356,7 @@ void nr_ue_slsch_tx_procedures(PHY_VARS_NR_UE *txUE, ...@@ -341,8 +356,7 @@ void nr_ue_slsch_tx_procedures(PHY_VARS_NR_UE *txUE,
nb_dmrs_re_per_rb = 6 * cdm_grps_no_data; nb_dmrs_re_per_rb = 6 * cdm_grps_no_data;
/////////////////////////SLSCH data and SCI2 encoding///////////////////////// /////////////////////////SLSCH data and SCI2 encoding/////////////////////////
unsigned int G_slsch_bits = nr_get_G(nb_rb, number_of_symbols, unsigned int G_slsch_bits = harq_process_ul_ue->G;
nb_dmrs_re_per_rb, length_dmrs, mod_order, Nl);
if (nr_slsch_encoding(txUE, slsch_ue, frame_parms, harq_pid, G_slsch_bits) == -1) if (nr_slsch_encoding(txUE, slsch_ue, frame_parms, harq_pid, G_slsch_bits) == -1)
return; return;
...@@ -366,8 +380,9 @@ void nr_ue_slsch_tx_procedures(PHY_VARS_NR_UE *txUE, ...@@ -366,8 +380,9 @@ void nr_ue_slsch_tx_procedures(PHY_VARS_NR_UE *txUE,
/////////////////////////SLSCH scrambling///////////////////////// /////////////////////////SLSCH scrambling/////////////////////////
uint16_t Nidx = slsch_ue->Nidx; uint16_t Nidx = slsch_ue->Nidx;
uint32_t scrambled_output[(harq_process_ul_ue->B_multiplexed >> 5) + 1]; // +1 because size can be not modulo 4
memset(scrambled_output, 0, ((harq_process_ul_ue->B_multiplexed >> 5) + 1) * sizeof(uint32_t)); uint32_t scrambled_output[harq_process_ul_ue->B_multiplexed / (8 * sizeof(uint32_t)) + 1];
memset(scrambled_output, 0, sizeof(scrambled_output));
nr_pusch_codeword_scrambling_sl(harq_process_ul_ue->f_multiplexed, nr_pusch_codeword_scrambling_sl(harq_process_ul_ue->f_multiplexed,
harq_process_ul_ue->B_multiplexed, harq_process_ul_ue->B_multiplexed,
...@@ -717,7 +732,7 @@ uint32_t nr_ue_slsch_rx_procedures(PHY_VARS_NR_UE *rxUE, ...@@ -717,7 +732,7 @@ uint32_t nr_ue_slsch_rx_procedures(PHY_VARS_NR_UE *rxUE,
uint16_t pssch_start_rb = slsch_ue_rx_harq->start_rb; uint16_t pssch_start_rb = slsch_ue_rx_harq->start_rb;
uint16_t start_sym = slsch_ue_rx_harq->start_symbol; uint16_t start_sym = slsch_ue_rx_harq->start_symbol;
uint8_t nb_symb_sch = slsch_ue_rx_harq->nb_symbols; uint8_t nb_symb_sch = slsch_ue_rx_harq->nb_symbols;
uint8_t mod_order = nr_get_Qm_ul(slsch_ue_rx_harq->mcs, 0); uint8_t mod_order = slsch_ue_rx_harq->pssch_pdu.qam_mod_order;
uint16_t dmrs_pos = slsch_ue_rx_harq->dlDmrsSymbPos; uint16_t dmrs_pos = slsch_ue_rx_harq->dlDmrsSymbPos;
uint8_t dmrs_config = slsch_ue_rx_harq->dmrsConfigType; uint8_t dmrs_config = slsch_ue_rx_harq->dmrsConfigType;
uint8_t SCI2_mod_order = 2; uint8_t SCI2_mod_order = 2;
...@@ -727,9 +742,7 @@ uint32_t nr_ue_slsch_rx_procedures(PHY_VARS_NR_UE *rxUE, ...@@ -727,9 +742,7 @@ uint32_t nr_ue_slsch_rx_procedures(PHY_VARS_NR_UE *rxUE,
uint8_t nb_re_dmrs = 6 * slsch_ue_rx_harq->n_dmrs_cdm_groups; uint8_t nb_re_dmrs = 6 * slsch_ue_rx_harq->n_dmrs_cdm_groups;
uint32_t dmrs_data_re = 12 - nb_re_dmrs; uint32_t dmrs_data_re = 12 - nb_re_dmrs;
uint16_t length_dmrs = get_num_dmrs(dmrs_pos); uint16_t length_dmrs = get_num_dmrs(dmrs_pos);
unsigned int G = nr_get_G(nb_rb, nb_symb_sch, unsigned int G = slsch_ue_rx_harq->G;
nb_re_dmrs, length_dmrs, mod_order,
Nl);
uint16_t num_data_symbs = (G << 1) / mod_order; uint16_t num_data_symbs = (G << 1) / mod_order;
uint32_t M_SCI2_bits = slsch_ue_rx->harq_processes[0]->B_sci2 * Nl; uint32_t M_SCI2_bits = slsch_ue_rx->harq_processes[0]->B_sci2 * Nl;
uint16_t num_sci2_symbs = (M_SCI2_bits << 1) / SCI2_mod_order; uint16_t num_sci2_symbs = (M_SCI2_bits << 1) / SCI2_mod_order;
...@@ -740,7 +753,7 @@ uint32_t nr_ue_slsch_rx_procedures(PHY_VARS_NR_UE *rxUE, ...@@ -740,7 +753,7 @@ uint32_t nr_ue_slsch_rx_procedures(PHY_VARS_NR_UE *rxUE,
int32_t median[16]; int32_t median[16];
uint32_t rxdataF_ext_offset = 0; uint32_t rxdataF_ext_offset = 0;
uint32_t sci2_offset = 0; uint32_t sci2_offset = 0;
uint32_t data_offset = num_sci2_samples; uint32_t data_offset = num_sci2_symbs;
uint32_t diff_re_comp; uint32_t diff_re_comp;
/////////////// Channel Estimation /////////////////////// /////////////// Channel Estimation ///////////////////////
...@@ -788,7 +801,7 @@ uint32_t nr_ue_slsch_rx_procedures(PHY_VARS_NR_UE *rxUE, ...@@ -788,7 +801,7 @@ uint32_t nr_ue_slsch_rx_procedures(PHY_VARS_NR_UE *rxUE,
if (1 <= sym && sym <= 3) { if (1 <= sym && sym <= 3) {
nb_re_sci1 = NR_NB_SC_PER_RB * NB_RB_SCI1; nb_re_sci1 = NR_NB_SC_PER_RB * NB_RB_SCI1;
} }
uint32_t allocatable_sci2_re = min(nb_re_SCI2, NR_NB_SC_PER_RB * nb_rb / 2 - nb_re_sci1); uint32_t allocatable_sci2_re = min(nb_re_SCI2, (NR_NB_SC_PER_RB * nb_rb - nb_re_sci1) / 2);
if (sym==first_symbol_with_data) if (sym==first_symbol_with_data)
first_symbol_flag = 1; first_symbol_flag = 1;
...@@ -974,28 +987,28 @@ uint32_t nr_ue_slsch_rx_procedures(PHY_VARS_NR_UE *rxUE, ...@@ -974,28 +987,28 @@ uint32_t nr_ue_slsch_rx_procedures(PHY_VARS_NR_UE *rxUE,
for (int aatx = 0; aatx < Nl; aatx++) { for (int aatx = 0; aatx < Nl; aatx++) {
if (pilots == 0) { if (pilots == 0) {
nr_slsch_compute_llr(&rxUE->pssch_vars[UE_id]->rxdataF_comp[aatx*rxUE->frame_parms.nb_antennas_rx][sym * nb_rb * NR_NB_SC_PER_RB], nr_slsch_compute_llr(&rxUE->pssch_vars[UE_id]->rxdataF_comp[aatx*rxUE->frame_parms.nb_antennas_rx][sym * nb_rb * NR_NB_SC_PER_RB],
&rxUE->pssch_vars[UE_id]->sl_ch_mag0[aatx*rxUE->frame_parms.nb_antennas_rx][sym * nb_rb * NR_NB_SC_PER_RB], &rxUE->pssch_vars[UE_id]->sl_ch_mag0[aatx*rxUE->frame_parms.nb_antennas_rx][0],
&rxUE->pssch_vars[UE_id]->sl_ch_magb0[aatx*rxUE->frame_parms.nb_antennas_rx][sym * nb_rb * NR_NB_SC_PER_RB], &rxUE->pssch_vars[UE_id]->sl_ch_magb0[aatx*rxUE->frame_parms.nb_antennas_rx][0],
&ulsch_llr_layers[aatx*rxUE->frame_parms.nb_antennas_rx][sym * nb_rb * NR_NB_SC_PER_RB], &ulsch_llr_layers[aatx*rxUE->frame_parms.nb_antennas_rx][sym * nb_rb * NR_NB_SC_PER_RB],
(nb_rb * NR_NB_SC_PER_RB - nb_re_sci1) / NR_NB_SC_PER_RB, nb_rb,
nb_rb * NR_NB_SC_PER_RB - nb_re_sci1, nb_rb * NR_NB_SC_PER_RB - nb_re_sci1,
sym, sym,
mod_order); mod_order);
memcpy(&ulsch_llr_layers_adj[aatx*rxUE->frame_parms.nb_antennas_rx][data_offset * 2], memcpy(&ulsch_llr_layers_adj[aatx*rxUE->frame_parms.nb_antennas_rx][data_offset],
&ulsch_llr_layers[aatx*rxUE->frame_parms.nb_antennas_rx][sym * nb_rb * NR_NB_SC_PER_RB], &ulsch_llr_layers[aatx*rxUE->frame_parms.nb_antennas_rx][sym * nb_rb * NR_NB_SC_PER_RB],
sizeof(uint32_t) * (nb_rb * NR_NB_SC_PER_RB - nb_re_sci1)); sizeof(uint32_t) * (nb_rb * NR_NB_SC_PER_RB - nb_re_sci1) * mod_order / 2);
rxdataF_ext_offset += nb_rb * NR_NB_SC_PER_RB - nb_re_sci1; rxdataF_ext_offset += nb_rb * NR_NB_SC_PER_RB - nb_re_sci1;
data_offset += nb_rb * NR_NB_SC_PER_RB - nb_re_sci1; data_offset += (nb_rb * NR_NB_SC_PER_RB - nb_re_sci1) * mod_order;
} else { } else {
if (allocatable_sci2_re > 0) { if (allocatable_sci2_re > 0) {
nr_slsch_compute_llr(&rxUE->pssch_vars[UE_id]->rxdataF_comp[aatx*rxUE->frame_parms.nb_antennas_rx][sym * nb_rb * NR_NB_SC_PER_RB], nr_slsch_compute_llr(&rxUE->pssch_vars[UE_id]->rxdataF_comp[aatx*rxUE->frame_parms.nb_antennas_rx][sym * nb_rb * NR_NB_SC_PER_RB],
&rxUE->pssch_vars[UE_id]->sl_ch_mag0[aatx*rxUE->frame_parms.nb_antennas_rx][sym * nb_rb * NR_NB_SC_PER_RB], &rxUE->pssch_vars[UE_id]->sl_ch_mag0[aatx*rxUE->frame_parms.nb_antennas_rx][0],
&rxUE->pssch_vars[UE_id]->sl_ch_magb0[aatx*rxUE->frame_parms.nb_antennas_rx][sym * nb_rb * NR_NB_SC_PER_RB], &rxUE->pssch_vars[UE_id]->sl_ch_magb0[aatx*rxUE->frame_parms.nb_antennas_rx][0],
&ulsch_llr_layers[aatx*rxUE->frame_parms.nb_antennas_rx][sym * nb_rb * NR_NB_SC_PER_RB], &ulsch_llr_layers[aatx*rxUE->frame_parms.nb_antennas_rx][sym * nb_rb * NR_NB_SC_PER_RB],
allocatable_sci2_re / 6, nb_rb,
allocatable_sci2_re, allocatable_sci2_re,
sym, sym,
SCI2_mod_order); SCI2_mod_order);
...@@ -1006,24 +1019,24 @@ uint32_t nr_ue_slsch_rx_procedures(PHY_VARS_NR_UE *rxUE, ...@@ -1006,24 +1019,24 @@ uint32_t nr_ue_slsch_rx_procedures(PHY_VARS_NR_UE *rxUE,
sci2_offset += allocatable_sci2_re; sci2_offset += allocatable_sci2_re;
} }
uint32_t diff_re = NR_NB_SC_PER_RB * nb_rb / 2 - nb_re_sci1 - allocatable_sci2_re; uint32_t diff_re = (NR_NB_SC_PER_RB * nb_rb - nb_re_sci1)/ 2 - allocatable_sci2_re;
if (diff_re > 0) { if (diff_re > 0) {
uint32_t offset = allocatable_sci2_re; uint32_t offset = allocatable_sci2_re;
nr_slsch_compute_llr(&rxUE->pssch_vars[UE_id]->rxdataF_comp[aatx*rxUE->frame_parms.nb_antennas_rx][sym * nb_rb * NR_NB_SC_PER_RB + offset], nr_slsch_compute_llr(&rxUE->pssch_vars[UE_id]->rxdataF_comp[aatx*rxUE->frame_parms.nb_antennas_rx][sym * nb_rb * NR_NB_SC_PER_RB + offset],
&rxUE->pssch_vars[UE_id]->sl_ch_mag0[aatx*rxUE->frame_parms.nb_antennas_rx][sym * nb_rb * NR_NB_SC_PER_RB + offset], &rxUE->pssch_vars[UE_id]->sl_ch_mag0[aatx*rxUE->frame_parms.nb_antennas_rx][0],
&rxUE->pssch_vars[UE_id]->sl_ch_magb0[aatx*rxUE->frame_parms.nb_antennas_rx][sym * nb_rb * NR_NB_SC_PER_RB + offset], &rxUE->pssch_vars[UE_id]->sl_ch_magb0[aatx*rxUE->frame_parms.nb_antennas_rx][0],
&ulsch_llr_layers[aatx*rxUE->frame_parms.nb_antennas_rx][sym * nb_rb * NR_NB_SC_PER_RB + offset], &ulsch_llr_layers[aatx*rxUE->frame_parms.nb_antennas_rx][sym * nb_rb * NR_NB_SC_PER_RB + offset],
diff_re / NR_NB_SC_PER_RB, nb_rb,
diff_re, diff_re,
sym, sym,
mod_order); mod_order);
memcpy(&ulsch_llr_layers_adj[aatx*rxUE->frame_parms.nb_antennas_rx][data_offset * 2], memcpy(&ulsch_llr_layers_adj[aatx*rxUE->frame_parms.nb_antennas_rx][data_offset],
&ulsch_llr_layers[aatx*rxUE->frame_parms.nb_antennas_rx][sym * nb_rb * NR_NB_SC_PER_RB + offset], &ulsch_llr_layers[aatx*rxUE->frame_parms.nb_antennas_rx][sym * nb_rb * NR_NB_SC_PER_RB + offset],
sizeof(uint32_t) * diff_re); sizeof(uint32_t) * diff_re * mod_order / 2);
data_offset += diff_re; data_offset += diff_re * mod_order;
} }
rxdataF_ext_offset += nb_rb * NR_NB_SC_PER_RB - nb_re_sci1; rxdataF_ext_offset += nb_rb * NR_NB_SC_PER_RB - nb_re_sci1;
if (allocatable_sci2_re > 0) { if (allocatable_sci2_re > 0) {
......
...@@ -184,8 +184,9 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, ...@@ -184,8 +184,9 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
/////////// ///////////
uint32_t available_bits = G; uint32_t available_bits = G;
uint32_t scrambled_output[(available_bits>>5)+1]; // +1 because size can be not modulo 4
memset(scrambled_output, 0, ((available_bits>>5)+1)*sizeof(uint32_t)); uint32_t scrambled_output[available_bits / (8 * sizeof(uint32_t)) + 1];
memset(scrambled_output, 0, sizeof(scrambled_output));
nr_pusch_codeword_scrambling(harq_process_ul_ue->f, nr_pusch_codeword_scrambling(harq_process_ul_ue->f,
available_bits, available_bits,
......
...@@ -377,19 +377,11 @@ void free_context_synchro_nr(void) ...@@ -377,19 +377,11 @@ void free_context_synchro_nr(void)
free(synchroF_tmp); free(synchroF_tmp);
synchroF_tmp = NULL; synchroF_tmp = NULL;
} }
else {
LOG_E(PHY,"Fatal memory deallocation problem \n");
assert(0);
}
if (synchro_tmp != NULL) { if (synchro_tmp != NULL) {
free(synchro_tmp); free(synchro_tmp);
synchro_tmp = NULL; synchro_tmp = NULL;
} }
else {
LOG_E(PHY,"Fatal memory deallocation problem \n");
assert(0);
}
#endif #endif
......
...@@ -55,6 +55,7 @@ ...@@ -55,6 +55,7 @@
#include "PHY/impl_defs_top.h" #include "PHY/impl_defs_top.h"
#include "PHY/MODULATION/modulation_common.h" #include "PHY/MODULATION/modulation_common.h"
#define LDPC_MAX_LIMIT 31
#define DEBUG_NR_PSSCHSIM #define DEBUG_NR_PSSCHSIM
// typedef struct { // typedef struct {
...@@ -108,11 +109,12 @@ int N_RB_SL = 106; ...@@ -108,11 +109,12 @@ int N_RB_SL = 106;
int mu = 1; int mu = 1;
int loglvl = OAILOG_WARNING; int loglvl = OAILOG_WARNING;
int seed = 0; int seed = 0;
int mcs = 0;
static void get_sim_cl_opts(int argc, char **argv) static void get_sim_cl_opts(int argc, char **argv)
{ {
char c; char c;
while ((c = getopt(argc, argv, "F:g:hIL:l:m:M:n:N:o:O:p:P:r:R:s:S:x:y:z:")) != -1) { while ((c = getopt(argc, argv, "F:g:hIL:l:m:M:n:N:o:O:p:P:r:R:s:S:t:x:y:z:")) != -1) {
switch (c) { switch (c) {
case 'F': case 'F':
input_fd = fopen(optarg, "r"); input_fd = fopen(optarg, "r");
...@@ -187,6 +189,10 @@ static void get_sim_cl_opts(int argc, char **argv) ...@@ -187,6 +189,10 @@ static void get_sim_cl_opts(int argc, char **argv)
snr1set = 1; snr1set = 1;
break; break;
case 't':
mcs = atoi(optarg);
break;
case 'y': case 'y':
n_tx = atoi(optarg); n_tx = atoi(optarg);
if ((n_tx == 0) || (n_tx > 2)) { if ((n_tx == 0) || (n_tx > 2)) {
...@@ -357,14 +363,19 @@ int main(int argc, char **argv) ...@@ -357,14 +363,19 @@ int main(int argc, char **argv)
load_nrLDPClib(NULL); load_nrLDPClib(NULL);
PHY_VARS_NR_UE *txUE = malloc(sizeof(PHY_VARS_NR_UE)); PHY_VARS_NR_UE *txUE = malloc(sizeof(PHY_VARS_NR_UE));
txUE->sync_ref= true;
txUE->frame_parms.N_RB_SL = N_RB_SL; txUE->frame_parms.N_RB_SL = N_RB_SL;
txUE->frame_parms.Ncp = NORMAL; txUE->frame_parms.Ncp = NORMAL;
txUE->frame_parms.nb_antennas_tx = 1; txUE->frame_parms.nb_antennas_tx = 1;
txUE->frame_parms.nb_antennas_rx = n_rx; txUE->frame_parms.nb_antennas_rx = n_rx;
txUE->frame_parms.Imcs = mcs;
txUE->max_ldpc_iterations = 5; txUE->max_ldpc_iterations = 5;
PHY_VARS_NR_UE *rxUE = malloc(sizeof(PHY_VARS_NR_UE)); PHY_VARS_NR_UE *rxUE = malloc(sizeof(PHY_VARS_NR_UE));
rxUE->sync_ref= false;
rxUE->frame_parms.nb_antennas_tx = n_tx; rxUE->frame_parms.nb_antennas_tx = n_tx;
rxUE->frame_parms.nb_antennas_rx = 1; rxUE->frame_parms.nb_antennas_rx = 1;
rxUE->frame_parms.Imcs = mcs;
initTpool("n", &rxUE->threadPool, true); initTpool("n", &rxUE->threadPool, true);
initNotifiedFIFO(&rxUE->respDecode); initNotifiedFIFO(&rxUE->respDecode);
...@@ -433,6 +444,8 @@ int main(int argc, char **argv) ...@@ -433,6 +444,8 @@ int main(int argc, char **argv)
unsigned int errors_bit = 0; unsigned int errors_bit = 0;
unsigned int n_errors = 0; unsigned int n_errors = 0;
unsigned int n_false_positive = 0; unsigned int n_false_positive = 0;
unsigned int errors_bit_delta = 0;
unsigned int num_bytes_to_check = 80;
//double modulated_input[HNA_SIZE]; //double modulated_input[HNA_SIZE];
unsigned char test_input_bit[HNA_SIZE]; unsigned char test_input_bit[HNA_SIZE];
//short channel_output_uncoded[HNA_SIZE]; //short channel_output_uncoded[HNA_SIZE];
...@@ -453,7 +466,6 @@ int main(int argc, char **argv) ...@@ -453,7 +466,6 @@ int main(int argc, char **argv)
errors_bit = 0; errors_bit = 0;
for (int trial = 0; trial < n_trials; trial++) { for (int trial = 0; trial < n_trials; trial++) {
for (int i = 0; i < frame_length_complex_samples; i++) { for (int i = 0; i < frame_length_complex_samples; i++) {
for (int aa = 0; aa < txUE->frame_parms.nb_antennas_tx; aa++) { for (int aa = 0; aa < txUE->frame_parms.nb_antennas_tx; aa++) {
r_re[aa][i] = ((double)(((short *)txdata[aa]))[(i << 1)]); r_re[aa][i] = ((double)(((short *)txdata[aa]))[(i << 1)]);
...@@ -494,36 +506,41 @@ int main(int argc, char **argv) ...@@ -494,36 +506,41 @@ int main(int argc, char **argv)
txUE->slsch[0][0]->Nidx, txUE->slsch[0][0]->Nidx,
&proc); &proc);
if (ret) bool polar_decoded = (ret < LDPC_MAX_LIMIT) ? true : false;
n_errors++; if (ret != -1) {
errors_bit_delta = 0;
bool payload_type_string = true; bool payload_type_string = false;
for (int i = 0; i < 200; i++) { for (int i = 0; i < num_bytes_to_check; i++) {
estimated_output_bit[i] = (harq_process_rxUE->b[i / 8] & (1 << (i & 7))) >> (i & 7); estimated_output_bit[i] = (harq_process_rxUE->b[i / 8] & (1 << (i & 7))) >> (i & 7);
test_input_bit[i] = (txUE->slsch[0][0]->harq_processes[harq_pid]->a[i / 8] & (1 << (i & 7))) >> (i & 7); // Further correct for multiple segments test_input_bit[i] = (txUE->slsch[0][0]->harq_processes[harq_pid]->a[i / 8] & (1 << (i & 7))) >> (i & 7); // Further correct for multiple segments
#ifdef DEBUG_NR_PSSCHSIM #ifdef DEBUG_NR_PSSCHSIM
if (i % 8 == 0) { if (i % 8 == 0) {
if (payload_type_string) { if (payload_type_string) {
printf("TxByte : %c vs %c : RxByte\n", txUE->slsch[0][0]->harq_processes[harq_pid]->a[i / 8], harq_process_rxUE->b[i / 8]); printf("TxByte : %c vs %c : RxByte\n", txUE->slsch[0][0]->harq_processes[harq_pid]->a[i / 8], harq_process_rxUE->b[i / 8]);
} else { } else {
printf("TxByte : %2u vs %2u : RxByte\n", txUE->slsch[0][0]->harq_processes[harq_pid]->a[i / 8], harq_process_rxUE->b[i / 8]); printf("TxByte : %2u vs %2u : RxByte\n", txUE->slsch[0][0]->harq_processes[harq_pid]->a[i / 8], harq_process_rxUE->b[i / 8]);
}
}
#endif
if (estimated_output_bit[i] != test_input_bit[i]) {
errors_bit_delta++;
} }
} }
#endif if (errors_bit_delta > 0) {
if (estimated_output_bit[i] != test_input_bit[i]) { n_false_positive++;
errors_bit++; printf("errors_bit %u (trial %d)\n", errors_bit_delta, trial);
} }
} if ((errors_bit_delta > 0) || (polar_decoded == false)) {
if (errors_bit > 0) { n_errors++;
n_false_positive++; }
printf("errors_bit %u (trial %d)\n", errors_bit, trial); errors_bit += errors_bit_delta;
} }
} // trial } // trial
printf("*****************************************\n"); printf("*****************************************\n");
printf("SNR %f, BLER %f BER %f\n", SNR, printf("SNR %f, BLER %f BER %f\n", SNR,
(float) n_errors / (float) n_trials, (float) n_errors / (float) n_trials,
(float) errors_bit / (float) (n_trials * 200)); (float) errors_bit / (float) (n_trials * num_bytes_to_check));
printf("*****************************************\n"); printf("*****************************************\n");
printf("\n"); printf("\n");
...@@ -532,11 +549,15 @@ int main(int argc, char **argv) ...@@ -532,11 +549,15 @@ int main(int argc, char **argv)
printf("\n"); printf("\n");
break; break;
} }
else {
printf("PSSCH test NG due to number of error bits: %u\n", errors_bit);
printf("\n");
}
printf("\n"); printf("\n");
} // snr } // snr
//term_nr_ue_transport(txUE); term_nr_ue_transport(txUE);
term_nr_ue_transport(rxUE); term_nr_ue_transport(rxUE);
term_nr_ue_signal(rxUE, 1); term_nr_ue_signal(rxUE, 1);
term_nr_ue_signal(txUE, 1); term_nr_ue_signal(txUE, 1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment