clean up of ulsch ue structures
This commit is contained in:
@@ -19,6 +19,8 @@
|
|||||||
* contact@openairinterface.org
|
* contact@openairinterface.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
#include <pthread.h>
|
||||||
#include <openair1/PHY/impl_defs_top.h>
|
#include <openair1/PHY/impl_defs_top.h>
|
||||||
#include "executables/nr-uesoftmodem.h"
|
#include "executables/nr-uesoftmodem.h"
|
||||||
#include "PHY/phy_extern_nr_ue.h"
|
#include "PHY/phy_extern_nr_ue.h"
|
||||||
|
|||||||
@@ -470,8 +470,10 @@ void init_nr_ue_transport(PHY_VARS_NR_UE *ue,
|
|||||||
for (int k=0; k<RX_NB_TH_MAX; k++) {
|
for (int k=0; k<RX_NB_TH_MAX; k++) {
|
||||||
AssertFatal((ue->dlsch[k][i][j] = new_nr_ue_dlsch(1,NR_MAX_DLSCH_HARQ_PROCESSES,NSOFT,MAX_LDPC_ITERATIONS,ue->frame_parms.N_RB_DL, abstraction_flag))!=NULL,"Can't get ue dlsch structures\n");
|
AssertFatal((ue->dlsch[k][i][j] = new_nr_ue_dlsch(1,NR_MAX_DLSCH_HARQ_PROCESSES,NSOFT,MAX_LDPC_ITERATIONS,ue->frame_parms.N_RB_DL, abstraction_flag))!=NULL,"Can't get ue dlsch structures\n");
|
||||||
LOG_D(PHY,"dlsch[%d][%d][%d] => %p\n",k,i,j,ue->dlsch[k][i][j]);
|
LOG_D(PHY,"dlsch[%d][%d][%d] => %p\n",k,i,j,ue->dlsch[k][i][j]);
|
||||||
AssertFatal((ue->ulsch[k][i][j] = new_nr_ue_ulsch(ue->frame_parms.N_RB_UL, NR_MAX_ULSCH_HARQ_PROCESSES, abstraction_flag))!=NULL,"Can't get ue ulsch structures\n");
|
if (j==0) {
|
||||||
LOG_D(PHY,"ulsch[%d][%d][%d] => %p\n",k,i,j,ue->ulsch[k][i][j]);
|
AssertFatal((ue->ulsch[k][i] = new_nr_ue_ulsch(ue->frame_parms.N_RB_UL, NR_MAX_ULSCH_HARQ_PROCESSES, abstraction_flag))!=NULL,"Can't get ue ulsch structures\n");
|
||||||
|
LOG_D(PHY,"ulsch[%d][%d] => %p\n",k,i,ue->ulsch[k][i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -320,98 +320,16 @@ void nr_layer_mapping(int16_t **mod_symbs,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void nr_ue_layer_mapping(NR_UE_ULSCH_t **ulsch_ue,
|
void nr_ue_layer_mapping(int16_t *mod_symbs,
|
||||||
uint8_t n_layers,
|
uint8_t n_layers,
|
||||||
uint16_t n_symbs,
|
uint16_t n_symbs,
|
||||||
int16_t **tx_layers)
|
int16_t **tx_layers) {
|
||||||
{
|
|
||||||
int16_t *mod_symbs;
|
|
||||||
|
|
||||||
switch (n_layers) {
|
for (int i=0; i<n_symbs/n_layers; i++) {
|
||||||
|
for (int l=0; l<n_layers; l++) {
|
||||||
case 1:
|
tx_layers[l][i<<1] = (mod_symbs[(n_layers*i+l)<<1]*AMP)>>15;
|
||||||
mod_symbs = (int16_t *)ulsch_ue[0]->d_mod;
|
tx_layers[l][(i<<1)+1] = (mod_symbs[((n_layers*i+l)<<1)+1]*AMP)>>15;
|
||||||
for (int i=0; i<n_symbs; i++) {
|
}
|
||||||
tx_layers[0][i<<1] = (mod_symbs[i<<1]*AMP)>>15;
|
|
||||||
tx_layers[0][(i<<1)+1] = (mod_symbs[(i<<1)+1]*AMP)>>15;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
case 3:
|
|
||||||
case 4:
|
|
||||||
mod_symbs = (int16_t *)ulsch_ue[0]->d_mod;
|
|
||||||
|
|
||||||
for (int i=0; i<n_symbs/n_layers; i++) {
|
|
||||||
for (int l=0; l<n_layers; l++) {
|
|
||||||
tx_layers[l][i<<1] = (mod_symbs[(n_layers*i+l)<<1]*AMP)>>15;
|
|
||||||
tx_layers[l][(i<<1)+1] = (mod_symbs[((n_layers*i+l)<<1)+1]*AMP)>>15;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 5:
|
|
||||||
mod_symbs = (int16_t *)ulsch_ue[0]->d_mod;
|
|
||||||
|
|
||||||
for (int i=0; i<n_symbs>>1; i++)
|
|
||||||
for (int l=0; l<2; l++) {
|
|
||||||
tx_layers[l][i<<1] = (mod_symbs[((i<<1)+l)<<1]*AMP)>>15;
|
|
||||||
tx_layers[l][(i<<1)+1] = (mod_symbs[(((i<<1)+l)<<1)+1]*AMP)>>15;
|
|
||||||
}
|
|
||||||
|
|
||||||
mod_symbs = (int16_t *)ulsch_ue[1]->d_mod;
|
|
||||||
|
|
||||||
for (int i=0; i<n_symbs/3; i++)
|
|
||||||
for (int l=2; l<5; l++) {
|
|
||||||
tx_layers[l][i<<1] = (mod_symbs[(3*i+l)<<1]*AMP)>>15;
|
|
||||||
tx_layers[l][(i<<1)+1] = (mod_symbs[((3*i+l)<<1)+1]*AMP)>>15;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 6:
|
|
||||||
for (int q=0; q<2; q++) {
|
|
||||||
mod_symbs = (int16_t *)ulsch_ue[q]->d_mod;
|
|
||||||
|
|
||||||
for (int i=0; i<n_symbs/3; i++)
|
|
||||||
for (int l=0; l<3; l++) {
|
|
||||||
tx_layers[l][i<<1] = (mod_symbs[(3*i+l)<<1]*AMP)>>15;
|
|
||||||
tx_layers[l][(i<<1)+1] = (mod_symbs[((3*i+l)<<1)+1]*AMP)>>15;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 7:
|
|
||||||
mod_symbs = (int16_t *)ulsch_ue[1]->d_mod;
|
|
||||||
|
|
||||||
for (int i=0; i<n_symbs/3; i++)
|
|
||||||
for (int l=0; l<3; l++) {
|
|
||||||
tx_layers[l][i<<1] = (mod_symbs[(3*i+l)<<1]*AMP)>>15;
|
|
||||||
tx_layers[l][(i<<1)+1] = (mod_symbs[((3*i+l)<<1)+1]*AMP)>>15;
|
|
||||||
}
|
|
||||||
|
|
||||||
mod_symbs = (int16_t *)ulsch_ue[0]->d_mod;
|
|
||||||
|
|
||||||
for (int i=0; i<n_symbs/4; i++)
|
|
||||||
for (int l=3; l<7; l++) {
|
|
||||||
tx_layers[l][i<<1] = (mod_symbs[((i<<2)+l)<<1]*AMP)>>15;
|
|
||||||
tx_layers[l][(i<<1)+1] = (mod_symbs[(((i<<2)+l)<<1)+1]*AMP)>>15;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 8:
|
|
||||||
for (int q=0; q<2; q++) {
|
|
||||||
mod_symbs = (int16_t *)ulsch_ue[q]->d_mod;
|
|
||||||
|
|
||||||
for (int i=0; i<n_symbs>>2; i++)
|
|
||||||
for (int l=0; l<3; l++) {
|
|
||||||
tx_layers[l][i<<1] = (mod_symbs[((i<<2)+l)<<1]*AMP)>>15;
|
|
||||||
tx_layers[l][(i<<1)+1] = (mod_symbs[(((i<<2)+l)<<1)+1]*AMP)>>15;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
AssertFatal(0, "Invalid number of layers %d\n", n_layers);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ void nr_layer_mapping(int16_t **mod_symbs,
|
|||||||
@param[out] tx_layers, modulated symbols for each layer
|
@param[out] tx_layers, modulated symbols for each layer
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void nr_ue_layer_mapping(NR_UE_ULSCH_t **ulsch_ue,
|
void nr_ue_layer_mapping(int16_t *mod_symbs,
|
||||||
uint8_t n_layers,
|
uint8_t n_layers,
|
||||||
uint16_t n_symbs,
|
uint16_t n_symbs,
|
||||||
int16_t **tx_layers);
|
int16_t **tx_layers);
|
||||||
|
|||||||
@@ -449,7 +449,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
|||||||
uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(2);
|
uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(2);
|
||||||
uci_pdu->harq->harq_list[1].harq_value = !(index&0x01);
|
uci_pdu->harq->harq_list[1].harq_value = !(index&0x01);
|
||||||
uci_pdu->harq->harq_list[0].harq_value = !((index>>1)&0x01);
|
uci_pdu->harq->harq_list[0].harq_value = !((index>>1)&0x01);
|
||||||
LOG_D(PHY, "[DLSCH/PDSCH/PUCCH] %d.%d HARQ values %d (0 pass, 1 fail) and %d with confidence level %d (0 is good, 1 is bad), xrt_mag %d xrt_mag_next %d n0 %d (%d,%d) pucch0_thres %d, cqi %d, SNRtimes10 %d,sync_pos %d\n",
|
LOG_D(PHY, "[DLSCH/PDSCH/PUCCH] %d.%d HARQ values %d and %d (0 pass, 1 fail) with confidence level %d (0 is good, 1 is bad), xrt_mag %d xrt_mag_next %d n0 %d (%d,%d) pucch0_thres %d, cqi %d, SNRtimes10 %d,sync_pos %d\n",
|
||||||
frame,slot,uci_pdu->harq->harq_list[1].harq_value,uci_pdu->harq->harq_list[0].harq_value,uci_pdu->harq->harq_confidence_level,xrtmag_dBtimes10,xrtmag_next_dBtimes10,max_n0,uci_stats->pucch0_n00,uci_stats->pucch0_n01,uci_stats->pucch0_thres,cqi,SNRtimes10,gNB->ulsch_stats[0].sync_pos);
|
frame,slot,uci_pdu->harq->harq_list[1].harq_value,uci_pdu->harq->harq_list[0].harq_value,uci_pdu->harq->harq_confidence_level,xrtmag_dBtimes10,xrtmag_next_dBtimes10,max_n0,uci_stats->pucch0_n00,uci_stats->pucch0_n01,uci_stats->pucch0_thres,cqi,SNRtimes10,gNB->ulsch_stats[0].sync_pos);
|
||||||
if (pucch_pdu->sr_flag == 1) {
|
if (pucch_pdu->sr_flag == 1) {
|
||||||
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
|
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
|
||||||
|
|||||||
@@ -88,9 +88,9 @@ typedef struct {
|
|||||||
/// LDPC-code outputs
|
/// LDPC-code outputs
|
||||||
uint8_t *d[MAX_NUM_NR_ULSCH_SEGMENTS];
|
uint8_t *d[MAX_NUM_NR_ULSCH_SEGMENTS];
|
||||||
/// LDPC-code outputs (TS 36.212 V15.4.0, Sec 5.3.2 p. 17)
|
/// LDPC-code outputs (TS 36.212 V15.4.0, Sec 5.3.2 p. 17)
|
||||||
uint8_t *e;
|
uint8_t *e;
|
||||||
/// Rate matching (Interleaving) outputs (TS 36.212 V15.4.0, Sec 5.4.2.2 p. 30)
|
/// Rate matching (Interleaving) outputs (TS 36.212 V15.4.0, Sec 5.4.2.2 p. 30)
|
||||||
uint8_t *f;
|
uint8_t *f;
|
||||||
/// Number of code segments
|
/// Number of code segments
|
||||||
uint32_t C;
|
uint32_t C;
|
||||||
/// Number of bits in code segments
|
/// Number of bits in code segments
|
||||||
@@ -122,55 +122,15 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
/// SRS active flag
|
/// SRS active flag
|
||||||
uint8_t srs_active;
|
uint8_t srs_active;
|
||||||
//#if defined(UPGRADE_RAT_NR)
|
|
||||||
#if 1
|
|
||||||
// Pointers to HARQ processes for the ULSCH
|
// Pointers to HARQ processes for the ULSCH
|
||||||
NR_UL_UE_HARQ_t *harq_processes[NR_MAX_ULSCH_HARQ_PROCESSES];
|
NR_UL_UE_HARQ_t *harq_processes[NR_MAX_ULSCH_HARQ_PROCESSES];
|
||||||
int harq_process_id[NR_MAX_SLOTS_PER_FRAME];
|
int harq_process_id[NR_MAX_SLOTS_PER_FRAME];
|
||||||
// UL number of harq processes
|
// UL number of harq processes
|
||||||
uint8_t number_harq_processes_for_pusch;
|
uint8_t number_harq_processes_for_pusch;
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
/// Pointer to CQI data (+1 for 8 bits crc)
|
|
||||||
uint8_t o[1+MAX_CQI_BYTES];
|
|
||||||
/// Length of CQI data (bits)
|
|
||||||
uint8_t O;
|
|
||||||
/// Format of CQI data
|
|
||||||
UCI_format_t uci_format;
|
|
||||||
/// Rank information
|
|
||||||
uint8_t o_RI[2];
|
|
||||||
/// Length of rank information (bits)
|
|
||||||
uint8_t O_RI;
|
|
||||||
/// Pointer to ACK
|
|
||||||
uint8_t o_ACK[4];
|
|
||||||
*/
|
|
||||||
/// Minimum number of CQI bits for PUSCH (36-212 r8.6, Sec 5.2.4.1 p. 37)
|
/// Minimum number of CQI bits for PUSCH (36-212 r8.6, Sec 5.2.4.1 p. 37)
|
||||||
uint8_t O_CQI_MIN;
|
uint8_t O_CQI_MIN;
|
||||||
/// ACK/NAK Bundling flag
|
/// ACK/NAK Bundling flag
|
||||||
uint8_t bundling;
|
uint8_t bundling;
|
||||||
/// Concatenated "g"-sequences (for definition see 36-212 V15.4.0 2018-12, p.31)
|
|
||||||
uint8_t g[MAX_NUM_NR_CHANNEL_BITS];
|
|
||||||
/// Interleaved "h"-sequences (for definition see 36-212 V8.6 2009-03, p.17-18)
|
|
||||||
uint8_t h[MAX_NUM_NR_CHANNEL_BITS];
|
|
||||||
/// Scrambled "b"-sequences (for definition see 36-211 V8.6 2009-03, p.14)
|
|
||||||
uint8_t b_tilde[MAX_NUM_NR_CHANNEL_BITS];
|
|
||||||
/// Modulated "d"-sequences (for definition see 36-211 V8.6 2009-03, p.14)
|
|
||||||
int32_t d_mod[MAX_NUM_NR_RE] __attribute__ ((aligned(16)));
|
|
||||||
/// Transform-coded "y"-sequences (for definition see 38-211 V15.3.0 2018-09, subsection 6.3.1.4)
|
|
||||||
int32_t y[MAX_NUM_NR_RE] __attribute__ ((aligned(16)));
|
|
||||||
/*
|
|
||||||
/// "q" sequences for CQI/PMI (for definition see 36-212 V8.6 2009-03, p.27)
|
|
||||||
uint8_t q[MAX_CQI_PAYLOAD];
|
|
||||||
|
|
||||||
/// coded and interleaved CQI bits
|
|
||||||
uint8_t o_w[(MAX_CQI_BITS+8)*3];
|
|
||||||
/// coded CQI bits
|
|
||||||
uint8_t o_d[96+((MAX_CQI_BITS+8)*3)];
|
|
||||||
/// coded ACK bits
|
|
||||||
uint8_t q_ACK[MAX_ACK_PAYLOAD];
|
|
||||||
/// coded RI bits
|
|
||||||
uint8_t q_RI[MAX_RI_PAYLOAD];
|
|
||||||
*/
|
|
||||||
/// beta_offset_cqi times 8
|
/// beta_offset_cqi times 8
|
||||||
uint16_t beta_offset_cqi_times8;
|
uint16_t beta_offset_cqi_times8;
|
||||||
/// beta_offset_ri times 8
|
/// beta_offset_ri times 8
|
||||||
|
|||||||
@@ -221,43 +221,23 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
|
|||||||
unsigned int G)
|
unsigned int G)
|
||||||
{
|
{
|
||||||
start_meas(&ue->ulsch_encoding_stats);
|
start_meas(&ue->ulsch_encoding_stats);
|
||||||
/////////////////////////parameters and variables declaration/////////////////////////
|
|
||||||
///////////
|
|
||||||
|
|
||||||
unsigned int crc;
|
|
||||||
NR_UL_UE_HARQ_t *harq_process;
|
|
||||||
uint16_t nb_rb ;
|
|
||||||
uint32_t A, F;
|
|
||||||
uint32_t *pz;
|
|
||||||
uint8_t mod_order;
|
|
||||||
uint16_t Kr,r;
|
|
||||||
uint32_t r_offset;
|
|
||||||
uint32_t E,Kb;
|
|
||||||
uint8_t Ilbrm;
|
|
||||||
uint32_t Tbslbrm;
|
|
||||||
uint16_t R;
|
|
||||||
float Coderate;
|
|
||||||
|
|
||||||
///////////
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////parameters and variables initialization/////////////////////////
|
/////////////////////////parameters and variables initialization/////////////////////////
|
||||||
///////////
|
///////////
|
||||||
|
|
||||||
crc = 1;
|
unsigned int crc = 1;
|
||||||
harq_process = ulsch->harq_processes[harq_pid];
|
NR_UL_UE_HARQ_t *harq_process = ulsch->harq_processes[harq_pid];
|
||||||
nb_rb = harq_process->pusch_pdu.rb_size;
|
uint16_t nb_rb = harq_process->pusch_pdu.rb_size;
|
||||||
A = harq_process->pusch_pdu.pusch_data.tb_size*8;
|
uint32_t A = harq_process->pusch_pdu.pusch_data.tb_size*8;
|
||||||
pz = &harq_process->Z;
|
uint32_t *pz = &harq_process->Z;
|
||||||
mod_order = nr_get_Qm_ul(harq_process->pusch_pdu.mcs_index, harq_process->pusch_pdu.mcs_table);
|
uint8_t mod_order = nr_get_Qm_ul(harq_process->pusch_pdu.mcs_index, harq_process->pusch_pdu.mcs_table);
|
||||||
R = nr_get_code_rate_ul(harq_process->pusch_pdu.mcs_index, harq_process->pusch_pdu.mcs_table);
|
uint16_t R = nr_get_code_rate_ul(harq_process->pusch_pdu.mcs_index, harq_process->pusch_pdu.mcs_table);
|
||||||
Kr=0;
|
uint16_t Kr=0;
|
||||||
r_offset=0;
|
uint32_t r_offset=0;
|
||||||
F=0;
|
uint32_t F=0;
|
||||||
Ilbrm = 0;
|
uint8_t Ilbrm = 0;
|
||||||
Tbslbrm = 950984; //max tbs
|
uint32_t Tbslbrm = 950984; //max tbs
|
||||||
Coderate = 0.0;
|
float Coderate = 0.0;
|
||||||
///////////
|
///////////
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@@ -333,14 +313,14 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_SEGMENTATION, VCD_FUNCTION_IN);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_SEGMENTATION, VCD_FUNCTION_IN);
|
||||||
start_meas(&ue->ulsch_segmentation_stats);
|
start_meas(&ue->ulsch_segmentation_stats);
|
||||||
Kb=nr_segmentation(harq_process->b,
|
uint32_t Kb=nr_segmentation(harq_process->b,
|
||||||
harq_process->c,
|
harq_process->c,
|
||||||
harq_process->B,
|
harq_process->B,
|
||||||
&harq_process->C,
|
&harq_process->C,
|
||||||
&harq_process->K,
|
&harq_process->K,
|
||||||
pz,
|
pz,
|
||||||
&harq_process->F,
|
&harq_process->F,
|
||||||
harq_process->BG);
|
harq_process->BG);
|
||||||
stop_meas(&ue->ulsch_segmentation_stats);
|
stop_meas(&ue->ulsch_segmentation_stats);
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_SEGMENTATION, VCD_FUNCTION_OUT);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_SEGMENTATION, VCD_FUNCTION_OUT);
|
||||||
|
|
||||||
@@ -357,7 +337,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
|
|||||||
//printf("segment Z %d k %d Kr %d BG %d\n", *pz,harq_process->K,Kr,BG);
|
//printf("segment Z %d k %d Kr %d BG %d\n", *pz,harq_process->K,Kr,BG);
|
||||||
|
|
||||||
//start_meas(te_stats);
|
//start_meas(te_stats);
|
||||||
for (r=0; r<harq_process->C; r++) {
|
for (int r=0; r<harq_process->C; r++) {
|
||||||
//channel_input[r] = &harq_process->d[r][0];
|
//channel_input[r] = &harq_process->d[r][0];
|
||||||
#ifdef DEBUG_ULSCH_CODING
|
#ifdef DEBUG_ULSCH_CODING
|
||||||
printf("Encoder: B %d F %d \n",harq_process->B, harq_process->F);
|
printf("Encoder: B %d F %d \n",harq_process->B, harq_process->F);
|
||||||
@@ -392,8 +372,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
|
|||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_LDPC_ENCODER_OPTIM, VCD_FUNCTION_IN);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_LDPC_ENCODER_OPTIM, VCD_FUNCTION_IN);
|
||||||
|
|
||||||
start_meas(&ue->ulsch_ldpc_encoding_stats);
|
start_meas(&ue->ulsch_ldpc_encoding_stats);
|
||||||
for(int j = 0; j < (harq_process->C/8 + 1); j++)
|
for(int j = 0; j < (harq_process->C/8 + 1); j++) {
|
||||||
{
|
|
||||||
impp.macro_num = j;
|
impp.macro_num = j;
|
||||||
nrLDPC_encoder(harq_process->c,harq_process->d,*pz,Kb,Kr,harq_process->BG,&impp);
|
nrLDPC_encoder(harq_process->c,harq_process->d,*pz,Kb,Kr,harq_process->BG,&impp);
|
||||||
}
|
}
|
||||||
@@ -416,14 +395,13 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
|
|||||||
F = harq_process->F;
|
F = harq_process->F;
|
||||||
Kr = harq_process->K;
|
Kr = harq_process->K;
|
||||||
|
|
||||||
for (r=0; r<harq_process->C; r++) { // looping over C segments
|
for (int r=0; r<harq_process->C; r++) { // looping over C segments
|
||||||
|
|
||||||
if (harq_process->F>0) {
|
if (harq_process->F>0) {
|
||||||
for (int k=(Kr-F-2*(*pz)); k<Kr-2*(*pz); k++) {
|
for (int k=(Kr-F-2*(*pz)); k<Kr-2*(*pz); k++) {
|
||||||
harq_process->d[r][k] = NR_NULL;
|
harq_process->d[r][k] = NR_NULL;
|
||||||
//if (k<(Kr-F+8))
|
//if (k<(Kr-F+8))
|
||||||
//printf("r %d filler bits [%d] = %d \n", r,k, harq_process->d[r][k]);
|
//printf("r %d filler bits [%d] = %d \n", r,k, harq_process->d[r][k]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -438,7 +416,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
|
|||||||
///////////////////////// d---->| Rate matching bit selection |---->e /////////////////////////
|
///////////////////////// d---->| Rate matching bit selection |---->e /////////////////////////
|
||||||
///////////
|
///////////
|
||||||
|
|
||||||
E = nr_get_E(G, harq_process->C, mod_order, harq_process->pusch_pdu.nrOfLayers, r);
|
uint32_t E = nr_get_E(G, harq_process->C, mod_order, harq_process->pusch_pdu.nrOfLayers, r);
|
||||||
|
|
||||||
Tbslbrm = nr_compute_tbslbrm(0,nb_rb,harq_process->pusch_pdu.nrOfLayers);
|
Tbslbrm = nr_compute_tbslbrm(0,nb_rb,harq_process->pusch_pdu.nrOfLayers);
|
||||||
|
|
||||||
@@ -481,9 +459,9 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
start_meas(&ue->ulsch_interleaving_stats);
|
start_meas(&ue->ulsch_interleaving_stats);
|
||||||
nr_interleaving_ldpc(E,
|
nr_interleaving_ldpc(E,
|
||||||
mod_order,
|
mod_order,
|
||||||
harq_process->e+r_offset,
|
harq_process->e+r_offset,
|
||||||
harq_process->f+r_offset);
|
harq_process->f+r_offset);
|
||||||
stop_meas(&ue->ulsch_interleaving_stats);
|
stop_meas(&ue->ulsch_interleaving_stats);
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_INTERLEAVING_LDPC, VCD_FUNCTION_OUT);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_INTERLEAVING_LDPC, VCD_FUNCTION_OUT);
|
||||||
@@ -505,8 +483,6 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(ulsch->g,harq_process->f,G); // g is the concatenated code block
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_UE_ULSCH_ENCODING, VCD_FUNCTION_OUT);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_UE_ULSCH_ENCODING, VCD_FUNCTION_OUT);
|
||||||
|
|
||||||
stop_meas(&ue->ulsch_encoding_stats);
|
stop_meas(&ue->ulsch_encoding_stats);
|
||||||
|
|||||||
@@ -93,17 +93,16 @@ void nr_pusch_codeword_scrambling(uint8_t *in,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
|
void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
|
||||||
unsigned char harq_pid,
|
unsigned char harq_pid,
|
||||||
uint32_t frame,
|
uint32_t frame,
|
||||||
uint8_t slot,
|
uint8_t slot,
|
||||||
uint8_t thread_id,
|
uint8_t thread_id,
|
||||||
int gNB_id) {
|
int gNB_id) {
|
||||||
|
|
||||||
LOG_D(PHY,"nr_ue_ulsch_procedures hard_id %d %d.%d\n",harq_pid,frame,slot);
|
LOG_D(PHY,"nr_ue_ulsch_procedures hard_id %d %d.%d\n",harq_pid,frame,slot);
|
||||||
|
|
||||||
uint32_t available_bits;
|
uint32_t available_bits;
|
||||||
uint8_t cwd_index, l;
|
uint32_t scrambled_output[NR_MAX_PDSCH_ENCODED_LENGTH>>5];
|
||||||
uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>5];
|
|
||||||
int16_t **tx_layers;
|
int16_t **tx_layers;
|
||||||
int32_t **txdataF;
|
int32_t **txdataF;
|
||||||
int8_t Wf[2], Wt[2];
|
int8_t Wf[2], Wt[2];
|
||||||
@@ -115,96 +114,96 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
|
|||||||
NR_DL_FRAME_PARMS *frame_parms = &UE->frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms = &UE->frame_parms;
|
||||||
NR_UE_PUSCH *pusch_ue = UE->pusch_vars[thread_id][gNB_id];
|
NR_UE_PUSCH *pusch_ue = UE->pusch_vars[thread_id][gNB_id];
|
||||||
|
|
||||||
uint8_t num_of_codewords = 1; // tmp assumption
|
|
||||||
int Nid_cell = 0;
|
int Nid_cell = 0;
|
||||||
int N_PRB_oh = 0; // higher layer (RRC) parameter xOverhead in PUSCH-ServingCellConfig
|
int N_PRB_oh = 0; // higher layer (RRC) parameter xOverhead in PUSCH-ServingCellConfig
|
||||||
uint16_t number_dmrs_symbols = 0;
|
uint16_t number_dmrs_symbols = 0;
|
||||||
|
|
||||||
for (cwd_index = 0;cwd_index < num_of_codewords; cwd_index++) {
|
NR_UE_ULSCH_t *ulsch_ue = UE->ulsch[thread_id][gNB_id];
|
||||||
|
NR_UL_UE_HARQ_t *harq_process_ul_ue = ulsch_ue->harq_processes[harq_pid];
|
||||||
|
nfapi_nr_ue_pusch_pdu_t *pusch_pdu = &harq_process_ul_ue->pusch_pdu;
|
||||||
|
|
||||||
NR_UE_ULSCH_t *ulsch_ue = UE->ulsch[thread_id][gNB_id][cwd_index];
|
int start_symbol = pusch_pdu->start_symbol_index;
|
||||||
NR_UL_UE_HARQ_t *harq_process_ul_ue = ulsch_ue->harq_processes[harq_pid];
|
uint16_t ul_dmrs_symb_pos = pusch_pdu->ul_dmrs_symb_pos;
|
||||||
nfapi_nr_ue_pusch_pdu_t *pusch_pdu = &harq_process_ul_ue->pusch_pdu;
|
uint8_t number_of_symbols = pusch_pdu->nr_of_symbols;
|
||||||
|
uint8_t dmrs_type = pusch_pdu->dmrs_config_type;
|
||||||
|
uint16_t start_rb = pusch_pdu->rb_start;
|
||||||
|
uint16_t nb_rb = pusch_pdu->rb_size;
|
||||||
|
uint8_t Nl = pusch_pdu->nrOfLayers;
|
||||||
|
uint8_t mod_order = pusch_pdu->qam_mod_order;
|
||||||
|
uint16_t rnti = pusch_pdu->rnti;
|
||||||
|
uint8_t cdm_grps_no_data = pusch_pdu->num_dmrs_cdm_grps_no_data;
|
||||||
|
uint16_t start_sc = frame_parms->first_carrier_offset + (start_rb+pusch_pdu->bwp_start)*NR_NB_SC_PER_RB;
|
||||||
|
|
||||||
int start_symbol = pusch_pdu->start_symbol_index;
|
if (start_sc >= frame_parms->ofdm_symbol_size)
|
||||||
uint16_t ul_dmrs_symb_pos = pusch_pdu->ul_dmrs_symb_pos;
|
start_sc -= frame_parms->ofdm_symbol_size;
|
||||||
uint8_t number_of_symbols = pusch_pdu->nr_of_symbols;
|
|
||||||
uint8_t dmrs_type = pusch_pdu->dmrs_config_type;
|
|
||||||
uint16_t start_rb = pusch_pdu->rb_start;
|
|
||||||
uint16_t nb_rb = pusch_pdu->rb_size;
|
|
||||||
uint8_t Nl = pusch_pdu->nrOfLayers;
|
|
||||||
uint8_t mod_order = pusch_pdu->qam_mod_order;
|
|
||||||
uint16_t rnti = pusch_pdu->rnti;
|
|
||||||
uint8_t cdm_grps_no_data = pusch_pdu->num_dmrs_cdm_grps_no_data;
|
|
||||||
uint16_t start_sc = frame_parms->first_carrier_offset + (start_rb+pusch_pdu->bwp_start)*NR_NB_SC_PER_RB;
|
|
||||||
|
|
||||||
if (start_sc >= frame_parms->ofdm_symbol_size)
|
ulsch_ue->Nid_cell = Nid_cell;
|
||||||
start_sc -= frame_parms->ofdm_symbol_size;
|
|
||||||
|
|
||||||
ulsch_ue->Nid_cell = Nid_cell;
|
for (int i = start_symbol; i < start_symbol + number_of_symbols; i++) {
|
||||||
|
if((ul_dmrs_symb_pos >> i) & 0x01)
|
||||||
|
number_dmrs_symbols += 1;
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = start_symbol; i < start_symbol + number_of_symbols; i++) {
|
nb_dmrs_re_per_rb = ((dmrs_type == pusch_dmrs_type1) ? 6:4)*cdm_grps_no_data;
|
||||||
if((ul_dmrs_symb_pos >> i) & 0x01)
|
|
||||||
number_dmrs_symbols += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
nb_dmrs_re_per_rb = ((dmrs_type == pusch_dmrs_type1) ? 6:4)*cdm_grps_no_data;
|
LOG_D(PHY,"ulsch %x : start_rb %d bwp_start %d start_sc %d start_symbol %d num_symbols %d cdmgrpsnodata %d num_dmrs %d dmrs_re_per_rb %d\n",
|
||||||
|
rnti,start_rb,pusch_pdu->bwp_start,start_sc,start_symbol,number_of_symbols,cdm_grps_no_data,number_dmrs_symbols,nb_dmrs_re_per_rb);
|
||||||
|
|
||||||
LOG_D(PHY,"ulsch %x : start_rb %d bwp_start %d start_sc %d start_symbol %d num_symbols %d cdmgrpsnodata %d num_dmrs %d dmrs_re_per_rb %d\n",
|
// TbD num_of_mod_symbols is set but never used
|
||||||
rnti,start_rb,pusch_pdu->bwp_start,start_sc,start_symbol,number_of_symbols,cdm_grps_no_data,number_dmrs_symbols,nb_dmrs_re_per_rb);
|
N_RE_prime = NR_NB_SC_PER_RB*number_of_symbols - nb_dmrs_re_per_rb*number_dmrs_symbols - N_PRB_oh;
|
||||||
|
harq_process_ul_ue->num_of_mod_symbols = N_RE_prime*nb_rb;
|
||||||
|
|
||||||
// TbD num_of_mod_symbols is set but never used
|
/////////////////////////ULSCH coding/////////////////////////
|
||||||
N_RE_prime = NR_NB_SC_PER_RB*number_of_symbols - nb_dmrs_re_per_rb*number_dmrs_symbols - N_PRB_oh;
|
///////////
|
||||||
harq_process_ul_ue->num_of_mod_symbols = N_RE_prime*nb_rb*num_of_codewords;
|
|
||||||
|
|
||||||
/////////////////////////ULSCH coding/////////////////////////
|
unsigned int G = nr_get_G(nb_rb, number_of_symbols,
|
||||||
///////////
|
nb_dmrs_re_per_rb, number_dmrs_symbols, mod_order, Nl);
|
||||||
|
|
||||||
unsigned int G = nr_get_G(nb_rb, number_of_symbols,
|
|
||||||
nb_dmrs_re_per_rb, number_dmrs_symbols, mod_order, Nl);
|
|
||||||
|
|
||||||
|
|
||||||
trace_NRpdu(DIRECTION_UPLINK,
|
trace_NRpdu(DIRECTION_UPLINK,
|
||||||
ulsch_ue->harq_processes[harq_pid]->a,
|
harq_process_ul_ue->a,
|
||||||
ulsch_ue->harq_processes[harq_pid]->pusch_pdu.pusch_data.tb_size,
|
harq_process_ul_ue->pusch_pdu.pusch_data.tb_size,
|
||||||
0, WS_C_RNTI, rnti, frame, slot, 0, 0);
|
0, WS_C_RNTI, rnti, frame, slot, 0, 0);
|
||||||
|
|
||||||
if (nr_ulsch_encoding(UE, ulsch_ue, frame_parms, harq_pid, G) == -1)
|
if (nr_ulsch_encoding(UE, ulsch_ue, frame_parms, harq_pid, G) == -1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
///////////
|
///////////
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
/////////////////////////ULSCH scrambling/////////////////////////
|
/////////////////////////ULSCH scrambling/////////////////////////
|
||||||
///////////
|
///////////
|
||||||
|
|
||||||
available_bits = G;
|
available_bits = G;
|
||||||
|
|
||||||
memset(scrambled_output[cwd_index], 0, ((available_bits>>5)+1)*sizeof(uint32_t));
|
memset(scrambled_output, 0, ((available_bits>>5)+1)*sizeof(uint32_t));
|
||||||
|
|
||||||
nr_pusch_codeword_scrambling(ulsch_ue->g,
|
nr_pusch_codeword_scrambling(harq_process_ul_ue->f,
|
||||||
available_bits,
|
available_bits,
|
||||||
ulsch_ue->Nid_cell,
|
ulsch_ue->Nid_cell,
|
||||||
rnti,
|
rnti,
|
||||||
scrambled_output[cwd_index]); // assume one codeword for the moment
|
scrambled_output); // assume one codeword for the moment
|
||||||
|
|
||||||
|
|
||||||
/////////////
|
/////////////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
/////////////////////////ULSCH modulation/////////////////////////
|
/////////////////////////ULSCH modulation/////////////////////////
|
||||||
///////////
|
///////////
|
||||||
|
|
||||||
nr_modulation(scrambled_output[cwd_index], // assume one codeword for the moment
|
int max_num_re = number_of_symbols*nb_rb*NR_NB_SC_PER_RB;
|
||||||
available_bits,
|
int32_t d_mod[max_num_re] __attribute__ ((aligned(16)));
|
||||||
mod_order,
|
|
||||||
(int16_t *)ulsch_ue->d_mod);
|
nr_modulation(scrambled_output, // assume one codeword for the moment
|
||||||
|
available_bits,
|
||||||
|
mod_order,
|
||||||
|
(int16_t *)d_mod);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
///////////
|
///////////
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
/////////////////////////DMRS Modulation/////////////////////////
|
/////////////////////////DMRS Modulation/////////////////////////
|
||||||
///////////
|
///////////
|
||||||
@@ -246,7 +245,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
|
|||||||
|
|
||||||
tx_layers = (int16_t **)pusch_ue->txdataF_layers;
|
tx_layers = (int16_t **)pusch_ue->txdataF_layers;
|
||||||
|
|
||||||
nr_ue_layer_mapping(UE->ulsch[thread_id][gNB_id],
|
nr_ue_layer_mapping((int16_t *)d_mod,
|
||||||
Nl,
|
Nl,
|
||||||
available_bits/mod_order,
|
available_bits/mod_order,
|
||||||
tx_layers);
|
tx_layers);
|
||||||
@@ -264,13 +263,16 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
|
|||||||
uint8_t u = 0, v = 0;
|
uint8_t u = 0, v = 0;
|
||||||
int16_t *dmrs_seq = NULL;
|
int16_t *dmrs_seq = NULL;
|
||||||
|
|
||||||
|
/// Transform-coded "y"-sequences (for definition see 38-211 V15.3.0 2018-09, subsection 6.3.1.4)
|
||||||
|
int32_t y[max_num_re] __attribute__ ((aligned(16)));
|
||||||
|
|
||||||
// if transform precoding is enbaled (value 0)
|
// if transform precoding is enbaled (value 0)
|
||||||
if (pusch_pdu->transform_precoding == 0) {
|
if (pusch_pdu->transform_precoding == 0) {
|
||||||
|
|
||||||
uint32_t nb_re_pusch=nb_rb * NR_NB_SC_PER_RB;
|
uint32_t nb_re_pusch=nb_rb * NR_NB_SC_PER_RB;
|
||||||
uint32_t y_offset = 0;
|
uint32_t y_offset = 0;
|
||||||
uint16_t num_dmrs_res_per_symbol = nb_rb*(NR_NB_SC_PER_RB/2);
|
uint16_t num_dmrs_res_per_symbol = nb_rb*(NR_NB_SC_PER_RB/2);
|
||||||
|
|
||||||
// Calculate index to dmrs seq array based on number of DMRS Subcarriers on this symbol
|
// Calculate index to dmrs seq array based on number of DMRS Subcarriers on this symbol
|
||||||
index = get_index_for_dmrs_lowpapr_seq(num_dmrs_res_per_symbol);
|
index = get_index_for_dmrs_lowpapr_seq(num_dmrs_res_per_symbol);
|
||||||
u = pusch_pdu->dfts_ofdm.low_papr_group_number;
|
u = pusch_pdu->dfts_ofdm.low_papr_group_number;
|
||||||
@@ -279,60 +281,52 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
|
|||||||
|
|
||||||
AssertFatal(index >= 0, "Num RBs not configured according to 3GPP 38.211 section 6.3.1.4. For PUSCH with transform precoding, num RBs cannot be multiple of any other primenumber other than 2,3,5\n");
|
AssertFatal(index >= 0, "Num RBs not configured according to 3GPP 38.211 section 6.3.1.4. For PUSCH with transform precoding, num RBs cannot be multiple of any other primenumber other than 2,3,5\n");
|
||||||
AssertFatal(dmrs_seq != NULL, "DMRS low PAPR seq not found, check if DMRS sequences are generated");
|
AssertFatal(dmrs_seq != NULL, "DMRS low PAPR seq not found, check if DMRS sequences are generated");
|
||||||
|
|
||||||
LOG_D(PHY,"Transform Precoding params. u: %d, v: %d, index for dmrsseq: %d\n", u, v, index);
|
LOG_D(PHY,"Transform Precoding params. u: %d, v: %d, index for dmrsseq: %d\n", u, v, index);
|
||||||
|
|
||||||
for (l = start_symbol; l < start_symbol + number_of_symbols; l++) {
|
for (int l = start_symbol; l < start_symbol + number_of_symbols; l++) {
|
||||||
|
|
||||||
if((ul_dmrs_symb_pos >> l) & 0x01)
|
if((ul_dmrs_symb_pos >> l) & 0x01)
|
||||||
/* In the symbol with DMRS no data would be transmitted CDM groups is 2*/
|
/* In the symbol with DMRS no data would be transmitted CDM groups is 2*/
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
nr_dft(&ulsch_ue->y[y_offset], &((int32_t*)tx_layers[0])[y_offset], nb_re_pusch);
|
nr_dft(&y[y_offset], &((int32_t*)tx_layers[0])[y_offset], nb_re_pusch);
|
||||||
|
|
||||||
y_offset = y_offset + nb_re_pusch;
|
y_offset = y_offset + nb_re_pusch;
|
||||||
|
|
||||||
LOG_D(PHY,"Transform precoding being done on data- symbol: %d, nb_re_pusch: %d, y_offset: %d\n", l, nb_re_pusch, y_offset);
|
LOG_D(PHY,"Transform precoding being done on data- symbol: %d, nb_re_pusch: %d, y_offset: %d\n", l, nb_re_pusch, y_offset);
|
||||||
|
|
||||||
#ifdef DEBUG_PUSCH_MAPPING
|
#ifdef DEBUG_PUSCH_MAPPING
|
||||||
printf("NR_ULSCH_UE: y_offset %d\t nb_re_pusch %d \t Symbol %d \t nb_rb %d \n",
|
printf("NR_ULSCH_UE: y_offset %d\t nb_re_pusch %d \t Symbol %d \t nb_rb %d \n",
|
||||||
y_offset, nb_re_pusch, l, nb_rb);
|
y_offset, nb_re_pusch, l, nb_rb);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_DFT_IDFT
|
#ifdef DEBUG_DFT_IDFT
|
||||||
int32_t debug_symbols[MAX_NUM_NR_RE] __attribute__ ((aligned(16)));
|
int32_t debug_symbols[max_num_re] __attribute__ ((aligned(16)));
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
printf("NR_ULSCH_UE: available_bits: %d, mod_order: %d", available_bits,mod_order);
|
printf("NR_ULSCH_UE: available_bits: %d, mod_order: %d", available_bits,mod_order);
|
||||||
|
|
||||||
for (int ll = 0; ll < (available_bits/mod_order); ll++) {
|
for (int ll = 0; ll < (available_bits/mod_order); ll++) {
|
||||||
debug_symbols[ll] = ulsch_ue->y[ll];
|
debug_symbols[ll] = y[ll];
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("NR_ULSCH_UE: numSym: %d, num_dmrs_sym: %d", number_of_symbols,number_dmrs_symbols);
|
|
||||||
for (int ll = 0; ll < (number_of_symbols-number_dmrs_symbols); ll++) {
|
|
||||||
|
|
||||||
nr_idft(&debug_symbols[offset], nb_re_pusch);
|
printf("NR_ULSCH_UE: numSym: %d, num_dmrs_sym: %d", number_of_symbols,number_dmrs_symbols);
|
||||||
|
for (int ll = 0; ll < (number_of_symbols-number_dmrs_symbols); ll++) {
|
||||||
offset = offset + nb_re_pusch;
|
nr_idft(&debug_symbols[offset], nb_re_pusch);
|
||||||
|
offset = offset + nb_re_pusch;
|
||||||
}
|
}
|
||||||
LOG_M("preDFT_all_symbols.m","UE_preDFT", tx_layers[0],number_of_symbols*nb_re_pusch,1,1);
|
LOG_M("preDFT_all_symbols.m","UE_preDFT", tx_layers[0],number_of_symbols*nb_re_pusch,1,1);
|
||||||
LOG_M("postDFT_all_symbols.m","UE_postDFT", ulsch_ue->y,number_of_symbols*nb_re_pusch,1,1);
|
LOG_M("postDFT_all_symbols.m","UE_postDFT", y,number_of_symbols*nb_re_pusch,1,1);
|
||||||
LOG_M("DEBUG_IDFT_SYMBOLS.m","UE_Debug_IDFT", debug_symbols,number_of_symbols*nb_re_pusch,1,1);
|
LOG_M("DEBUG_IDFT_SYMBOLS.m","UE_Debug_IDFT", debug_symbols,number_of_symbols*nb_re_pusch,1,1);
|
||||||
LOG_M("UE_DMRS_SEQ.m","UE_DMRS_SEQ", dmrs_seq,nb_re_pusch,1,1);
|
LOG_M("UE_DMRS_SEQ.m","UE_DMRS_SEQ", dmrs_seq,nb_re_pusch,1,1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
memcpy(ulsch_ue->y, tx_layers[0], (available_bits/mod_order)*sizeof(int32_t));
|
memcpy(y, tx_layers[0], (available_bits/mod_order)*sizeof(int32_t));
|
||||||
|
|
||||||
|
|
||||||
///////////
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////ULSCH RE mapping/////////////////////////
|
/////////////////////////ULSCH RE mapping/////////////////////////
|
||||||
///////////
|
///////////
|
||||||
|
|
||||||
@@ -344,18 +338,16 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
|
|||||||
uint16_t m = 0;
|
uint16_t m = 0;
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG_PUSCH_MAPPING
|
#ifdef DEBUG_PUSCH_MAPPING
|
||||||
printf("NR_ULSCH_UE: Value of CELL ID %d /t, u %d \n", frame_parms->Nid_cell, u);
|
printf("NR_ULSCH_UE: Value of CELL ID %d /t, u %d \n", frame_parms->Nid_cell, u);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// DMRS params for this ap
|
// DMRS params for this ap
|
||||||
get_Wt(Wt, ap, dmrs_type);
|
get_Wt(Wt, ap, dmrs_type);
|
||||||
get_Wf(Wf, ap, dmrs_type);
|
get_Wf(Wf, ap, dmrs_type);
|
||||||
delta = get_delta(ap, dmrs_type);
|
delta = get_delta(ap, dmrs_type);
|
||||||
|
|
||||||
for (l=start_symbol; l<start_symbol+number_of_symbols; l++) {
|
for (int l=start_symbol; l<start_symbol+number_of_symbols; l++) {
|
||||||
|
|
||||||
uint16_t k = start_sc;
|
uint16_t k = start_sc;
|
||||||
uint16_t n = 0;
|
uint16_t n = 0;
|
||||||
@@ -376,14 +368,11 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
|
|||||||
|
|
||||||
// TODO: performance improvement, we can skip the modulation of DMRS symbols outside the bandwidth part
|
// TODO: performance improvement, we can skip the modulation of DMRS symbols outside the bandwidth part
|
||||||
// Perform this on gold sequence, not required when SC FDMA operation is done,
|
// Perform this on gold sequence, not required when SC FDMA operation is done,
|
||||||
LOG_D(PHY,"DMRS in symbol %d\n",l);
|
LOG_D(PHY,"DMRS in symbol %d\n",l);
|
||||||
nr_modulation(pusch_dmrs[l][0], n_dmrs*2, DMRS_MOD_ORDER, mod_dmrs); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated
|
nr_modulation(pusch_dmrs[l][0], n_dmrs*2, DMRS_MOD_ORDER, mod_dmrs); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
dmrs_idx = 0;
|
dmrs_idx = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
} else if (pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
|
} else if (pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
|
||||||
|
|
||||||
AssertFatal(pusch_pdu->transform_precoding == 1, "PTRS NOT SUPPORTED IF TRANSFORM PRECODING IS ENABLED\n");
|
AssertFatal(pusch_pdu->transform_precoding == 1, "PTRS NOT SUPPORTED IF TRANSFORM PRECODING IS ENABLED\n");
|
||||||
@@ -405,15 +394,15 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
|
|||||||
if (k == ((start_sc+get_dmrs_freq_idx_ul(n, k_prime, delta, dmrs_type))%frame_parms->ofdm_symbol_size))
|
if (k == ((start_sc+get_dmrs_freq_idx_ul(n, k_prime, delta, dmrs_type))%frame_parms->ofdm_symbol_size))
|
||||||
is_dmrs = 1;
|
is_dmrs = 1;
|
||||||
} else if (is_ptrs_sym) {
|
} else if (is_ptrs_sym) {
|
||||||
is_ptrs = is_ptrs_subcarrier(k,
|
is_ptrs = is_ptrs_subcarrier(k,
|
||||||
rnti,
|
rnti,
|
||||||
ap,
|
ap,
|
||||||
dmrs_type,
|
dmrs_type,
|
||||||
K_ptrs,
|
K_ptrs,
|
||||||
nb_rb,
|
nb_rb,
|
||||||
pusch_pdu->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset,
|
pusch_pdu->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset,
|
||||||
start_sc,
|
start_sc,
|
||||||
frame_parms->ofdm_symbol_size);
|
frame_parms->ofdm_symbol_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_dmrs == 1) {
|
if (is_dmrs == 1) {
|
||||||
@@ -422,19 +411,19 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
|
|||||||
|
|
||||||
((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*dmrs_seq[2*dmrs_idx]) >> 15;
|
((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*dmrs_seq[2*dmrs_idx]) >> 15;
|
||||||
((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*dmrs_seq[(2*dmrs_idx) + 1]) >> 15;
|
((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*dmrs_seq[(2*dmrs_idx) + 1]) >> 15;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*mod_dmrs[dmrs_idx<<1]) >> 15;
|
((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*mod_dmrs[dmrs_idx<<1]) >> 15;
|
||||||
((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15;
|
((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_PUSCH_MAPPING
|
#ifdef DEBUG_PUSCH_MAPPING
|
||||||
printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t dmrs: %d %d\n",
|
printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t dmrs: %d %d\n",
|
||||||
dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[(sample_offsetF)<<1],
|
dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[(sample_offsetF)<<1],
|
||||||
((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1]);
|
((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
dmrs_idx++;
|
dmrs_idx++;
|
||||||
@@ -451,14 +440,14 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
|
|||||||
|
|
||||||
} else if (!is_dmrs_sym || allowed_xlsch_re_in_dmrs_symbol(k, start_sc, frame_parms->ofdm_symbol_size, cdm_grps_no_data, dmrs_type)) {
|
} else if (!is_dmrs_sym || allowed_xlsch_re_in_dmrs_symbol(k, start_sc, frame_parms->ofdm_symbol_size, cdm_grps_no_data, dmrs_type)) {
|
||||||
|
|
||||||
((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = ((int16_t *) ulsch_ue->y)[m<<1];
|
((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = ((int16_t *) y)[m<<1];
|
||||||
((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = ((int16_t *) ulsch_ue->y)[(m<<1) + 1];
|
((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = ((int16_t *) y)[(m<<1) + 1];
|
||||||
|
|
||||||
#ifdef DEBUG_PUSCH_MAPPING
|
#ifdef DEBUG_PUSCH_MAPPING
|
||||||
printf("m %d\t l %d \t k %d \t txdataF: %d %d\n",
|
printf("m %d\t l %d \t k %d \t txdataF: %d %d\n",
|
||||||
m, l, k, ((int16_t*)txdataF[ap])[(sample_offsetF)<<1],
|
m, l, k, ((int16_t*)txdataF[ap])[(sample_offsetF)<<1],
|
||||||
((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1]);
|
((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m++;
|
m++;
|
||||||
|
|
||||||
@@ -474,10 +463,9 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
NR_UL_UE_HARQ_t *harq_process_ulsch=NULL;
|
NR_UL_UE_HARQ_t *harq_process_ulsch=NULL;
|
||||||
harq_process_ulsch = UE->ulsch[thread_id][gNB_id][0]->harq_processes[harq_pid];
|
harq_process_ulsch = UE->ulsch[thread_id][gNB_id]->harq_processes[harq_pid];
|
||||||
harq_process_ulsch->status = SCH_IDLE;
|
harq_process_ulsch->status = SCH_IDLE;
|
||||||
|
|
||||||
///////////
|
///////////
|
||||||
|
|||||||
@@ -818,7 +818,7 @@ typedef struct {
|
|||||||
NR_UE_PUSCH *pusch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX];
|
NR_UE_PUSCH *pusch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX];
|
||||||
NR_UE_PUCCH *pucch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX];
|
NR_UE_PUCCH *pucch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX];
|
||||||
NR_UE_DLSCH_t *dlsch[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX][NR_MAX_NB_CODEWORDS]; // two RxTx Threads
|
NR_UE_DLSCH_t *dlsch[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX][NR_MAX_NB_CODEWORDS]; // two RxTx Threads
|
||||||
NR_UE_ULSCH_t *ulsch[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX][NR_MAX_NB_CODEWORDS]; // two code words
|
NR_UE_ULSCH_t *ulsch[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX];
|
||||||
NR_UE_DLSCH_t *dlsch_SI[NUMBER_OF_CONNECTED_gNB_MAX];
|
NR_UE_DLSCH_t *dlsch_SI[NUMBER_OF_CONNECTED_gNB_MAX];
|
||||||
NR_UE_DLSCH_t *dlsch_ra[NUMBER_OF_CONNECTED_gNB_MAX];
|
NR_UE_DLSCH_t *dlsch_ra[NUMBER_OF_CONNECTED_gNB_MAX];
|
||||||
NR_UE_DLSCH_t *dlsch_p[NUMBER_OF_CONNECTED_gNB_MAX];
|
NR_UE_DLSCH_t *dlsch_p[NUMBER_OF_CONNECTED_gNB_MAX];
|
||||||
|
|||||||
@@ -107,8 +107,6 @@
|
|||||||
#define MAX_NUM_NR_ULSCH_SEGMENTS 34
|
#define MAX_NUM_NR_ULSCH_SEGMENTS 34
|
||||||
#define MAX_NR_ULSCH_PAYLOAD_BYTES (MAX_NUM_NR_ULSCH_SEGMENTS*1056)
|
#define MAX_NR_ULSCH_PAYLOAD_BYTES (MAX_NUM_NR_ULSCH_SEGMENTS*1056)
|
||||||
|
|
||||||
#define MAX_NUM_NR_CHANNEL_BITS (14*273*12*8) // 14 symbols, 273 RB
|
|
||||||
#define MAX_NUM_NR_RE (14*273*12)
|
|
||||||
#define NR_RX_NB_TH 1
|
#define NR_RX_NB_TH 1
|
||||||
#define NR_NB_TH_SLOT 2
|
#define NR_NB_TH_SLOT 2
|
||||||
|
|
||||||
|
|||||||
@@ -224,7 +224,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
|
|||||||
thread_id = scheduled_response->thread_id;
|
thread_id = scheduled_response->thread_id;
|
||||||
NR_UE_DLSCH_t *dlsch0 = NULL;
|
NR_UE_DLSCH_t *dlsch0 = NULL;
|
||||||
NR_UE_PDCCH *pdcch_vars = PHY_vars_UE_g[module_id][cc_id]->pdcch_vars[thread_id][0];
|
NR_UE_PDCCH *pdcch_vars = PHY_vars_UE_g[module_id][cc_id]->pdcch_vars[thread_id][0];
|
||||||
NR_UE_ULSCH_t *ulsch0 = PHY_vars_UE_g[module_id][cc_id]->ulsch[thread_id][0][0];
|
NR_UE_ULSCH_t *ulsch = PHY_vars_UE_g[module_id][cc_id]->ulsch[thread_id][0];
|
||||||
NR_UE_PUCCH *pucch_vars = PHY_vars_UE_g[module_id][cc_id]->pucch_vars[thread_id][0];
|
NR_UE_PUCCH *pucch_vars = PHY_vars_UE_g[module_id][cc_id]->pucch_vars[thread_id][0];
|
||||||
|
|
||||||
if(scheduled_response->dl_config != NULL){
|
if(scheduled_response->dl_config != NULL){
|
||||||
@@ -343,7 +343,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
|
|||||||
// pusch config pdu
|
// pusch config pdu
|
||||||
pusch_config_pdu = &ul_config->ul_config_list[i].pusch_config_pdu;
|
pusch_config_pdu = &ul_config->ul_config_list[i].pusch_config_pdu;
|
||||||
current_harq_pid = pusch_config_pdu->pusch_data.harq_process_id;
|
current_harq_pid = pusch_config_pdu->pusch_data.harq_process_id;
|
||||||
NR_UL_UE_HARQ_t *harq_process_ul_ue = ulsch0->harq_processes[current_harq_pid];
|
NR_UL_UE_HARQ_t *harq_process_ul_ue = ulsch->harq_processes[current_harq_pid];
|
||||||
harq_process_ul_ue->status = 0;
|
harq_process_ul_ue->status = 0;
|
||||||
|
|
||||||
if (harq_process_ul_ue){
|
if (harq_process_ul_ue){
|
||||||
@@ -352,7 +352,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
|
|||||||
|
|
||||||
memcpy(pusch_pdu, pusch_config_pdu, sizeof(nfapi_nr_ue_pusch_pdu_t));
|
memcpy(pusch_pdu, pusch_config_pdu, sizeof(nfapi_nr_ue_pusch_pdu_t));
|
||||||
|
|
||||||
ulsch0->f_pusch = pusch_config_pdu->absolute_delta_PUSCH;
|
ulsch->f_pusch = pusch_config_pdu->absolute_delta_PUSCH;
|
||||||
|
|
||||||
if (scheduled_response->tx_request) {
|
if (scheduled_response->tx_request) {
|
||||||
for (int j=0; j<scheduled_response->tx_request->number_of_pdus; j++) {
|
for (int j=0; j<scheduled_response->tx_request->number_of_pdus; j++) {
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ void config_uplink_harq_process(PHY_VARS_NR_UE *ue, int gNB_id, int thread_id, i
|
|||||||
|
|
||||||
memset(ulsch,0,sizeof(NR_UE_ULSCH_t));
|
memset(ulsch,0,sizeof(NR_UE_ULSCH_t));
|
||||||
|
|
||||||
ue->ulsch[thread_id][gNB_id][code_word_idx] = ulsch;
|
ue->ulsch[thread_id][gNB_id] = ulsch;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
LOG_E(PHY, "Fatal memory allocation problem at line %d in function %s of file %s \n", __LINE__ , __func__, __FILE__);
|
LOG_E(PHY, "Fatal memory allocation problem at line %d in function %s of file %s \n", __LINE__ , __func__, __FILE__);
|
||||||
@@ -148,7 +148,7 @@ void config_uplink_harq_process(PHY_VARS_NR_UE *ue, int gNB_id, int thread_id, i
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int slot_tx = 0; slot_tx < NR_MAX_SLOTS_PER_FRAME; slot_tx++) {
|
for (int slot_tx = 0; slot_tx < NR_MAX_SLOTS_PER_FRAME; slot_tx++) {
|
||||||
ue->ulsch[thread_id][gNB_id][code_word_idx]->harq_process_id[slot_tx] = NR_MAX_HARQ_PROCESSES;
|
ue->ulsch[thread_id][gNB_id]->harq_process_id[slot_tx] = NR_MAX_HARQ_PROCESSES;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,7 +167,7 @@ void config_uplink_harq_process(PHY_VARS_NR_UE *ue, int gNB_id, int thread_id, i
|
|||||||
|
|
||||||
void release_uplink_harq_process(PHY_VARS_NR_UE *ue, int gNB_id, int thread_id, int code_word_idx)
|
void release_uplink_harq_process(PHY_VARS_NR_UE *ue, int gNB_id, int thread_id, int code_word_idx)
|
||||||
{
|
{
|
||||||
NR_UE_ULSCH_t *ulsch = ue->ulsch[thread_id][gNB_id][code_word_idx];
|
NR_UE_ULSCH_t *ulsch = ue->ulsch[thread_id][gNB_id];
|
||||||
|
|
||||||
for (int process_id = 0; process_id < ulsch->number_harq_processes_for_pusch; process_id++) {
|
for (int process_id = 0; process_id < ulsch->number_harq_processes_for_pusch; process_id++) {
|
||||||
|
|
||||||
@@ -178,7 +178,7 @@ void release_uplink_harq_process(PHY_VARS_NR_UE *ue, int gNB_id, int thread_id,
|
|||||||
|
|
||||||
free16(ulsch, sizeof(NR_UE_ULSCH_t));
|
free16(ulsch, sizeof(NR_UE_ULSCH_t));
|
||||||
|
|
||||||
ue->ulsch[thread_id][gNB_id][code_word_idx] = NULL;
|
ue->ulsch[thread_id][gNB_id] = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
|
|||||||
@@ -291,8 +291,8 @@ void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
if (ue->UE_mode[gNB_id] <= PUSCH){
|
if (ue->UE_mode[gNB_id] <= PUSCH){
|
||||||
|
|
||||||
for (uint8_t harq_pid = 0; harq_pid < ue->ulsch[proc->thread_id][gNB_id][0]->number_harq_processes_for_pusch; harq_pid++) {
|
for (uint8_t harq_pid = 0; harq_pid < ue->ulsch[proc->thread_id][gNB_id]->number_harq_processes_for_pusch; harq_pid++) {
|
||||||
if (ue->ulsch[proc->thread_id][gNB_id][0]->harq_processes[harq_pid]->status == ACTIVE)
|
if (ue->ulsch[proc->thread_id][gNB_id]->harq_processes[harq_pid]->status == ACTIVE)
|
||||||
nr_ue_ulsch_procedures(ue, harq_pid, frame_tx, slot_tx, proc->thread_id, gNB_id);
|
nr_ue_ulsch_procedures(ue, harq_pid, frame_tx, slot_tx, proc->thread_id, gNB_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -407,15 +407,10 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (sf = 0; sf < 2; sf++) {
|
for (sf = 0; sf < 2; sf++) {
|
||||||
for (i = 0; i < 2; i++) {
|
UE->ulsch[sf][0] = new_nr_ue_ulsch(N_RB_UL, 8, 0);
|
||||||
|
if (!UE->ulsch[sf][0]) {
|
||||||
UE->ulsch[sf][0][i] = new_nr_ue_ulsch(N_RB_UL, 8, 0);
|
printf("Can't get ue ulsch structures.\n");
|
||||||
|
exit(-1);
|
||||||
if (!UE->ulsch[sf][0][i]) {
|
|
||||||
printf("Can't get ue ulsch structures.\n");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -435,7 +430,7 @@ int main(int argc, char **argv)
|
|||||||
NR_UL_gNB_HARQ_t *harq_process_gNB = ulsch_gNB->harq_processes[harq_pid];
|
NR_UL_gNB_HARQ_t *harq_process_gNB = ulsch_gNB->harq_processes[harq_pid];
|
||||||
nfapi_nr_pusch_pdu_t *rel15_ul = &harq_process_gNB->ulsch_pdu;
|
nfapi_nr_pusch_pdu_t *rel15_ul = &harq_process_gNB->ulsch_pdu;
|
||||||
|
|
||||||
NR_UE_ULSCH_t *ulsch_ue = UE->ulsch[0][0][0];
|
NR_UE_ULSCH_t *ulsch_ue = UE->ulsch[0][0];
|
||||||
|
|
||||||
mod_order = nr_get_Qm_ul(Imcs, 0);
|
mod_order = nr_get_Qm_ul(Imcs, 0);
|
||||||
code_rate = nr_get_code_rate_ul(Imcs, 0);
|
code_rate = nr_get_code_rate_ul(Imcs, 0);
|
||||||
@@ -532,7 +527,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (ulsch_ue->g[i] == 0)
|
if (ulsch_ue->harq_processes[harq_pid]->f[i] == 0)
|
||||||
modulated_input[i] = 1.0; ///sqrt(2); //QPSK
|
modulated_input[i] = 1.0; ///sqrt(2); //QPSK
|
||||||
else
|
else
|
||||||
modulated_input[i] = -1.0; ///sqrt(2);
|
modulated_input[i] = -1.0; ///sqrt(2);
|
||||||
|
|||||||
@@ -814,7 +814,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
nfapi_nr_pusch_pdu_t *pusch_pdu = &UL_tti_req->pdus_list[0].pusch_pdu;
|
nfapi_nr_pusch_pdu_t *pusch_pdu = &UL_tti_req->pdus_list[0].pusch_pdu;
|
||||||
|
|
||||||
NR_UE_ULSCH_t **ulsch_ue = UE->ulsch[0][0];
|
NR_UE_ULSCH_t *ulsch_ue = UE->ulsch[0][0];
|
||||||
|
|
||||||
unsigned char *estimated_output_bit;
|
unsigned char *estimated_output_bit;
|
||||||
unsigned char *test_input_bit;
|
unsigned char *test_input_bit;
|
||||||
@@ -1045,7 +1045,7 @@ int main(int argc, char **argv)
|
|||||||
memset((void*)roundStats,0,50*sizeof(roundStats[0]));
|
memset((void*)roundStats,0,50*sizeof(roundStats[0]));
|
||||||
while (round<max_rounds && crc_status) {
|
while (round<max_rounds && crc_status) {
|
||||||
round_trials[round][snrRun]++;
|
round_trials[round][snrRun]++;
|
||||||
ulsch_ue[0]->harq_processes[harq_pid]->round = round;
|
ulsch_ue->harq_processes[harq_pid]->round = round;
|
||||||
gNB->ulsch[0][0]->harq_processes[harq_pid]->round = round;
|
gNB->ulsch[0][0]->harq_processes[harq_pid]->round = round;
|
||||||
rv_index = nr_rv_round_map[round];
|
rv_index = nr_rv_round_map[round];
|
||||||
|
|
||||||
@@ -1187,7 +1187,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
//nr_fill_ulsch(gNB,frame,slot,pusch_pdu); // Not needed as its its already filled as apart of "nr_schedule_response(Sched_INFO);"
|
//nr_fill_ulsch(gNB,frame,slot,pusch_pdu); // Not needed as its its already filled as apart of "nr_schedule_response(Sched_INFO);"
|
||||||
|
|
||||||
for (int i=0;i<(TBS/8);i++) ulsch_ue[0]->harq_processes[harq_pid]->a[i]=i&0xff;
|
for (int i=0;i<(TBS/8);i++) ulsch_ue->harq_processes[harq_pid]->a[i]=i&0xff;
|
||||||
if (input_fd == NULL) {
|
if (input_fd == NULL) {
|
||||||
|
|
||||||
// set FAPI parameters for UE, put them in the scheduled response and call
|
// set FAPI parameters for UE, put them in the scheduled response and call
|
||||||
@@ -1388,8 +1388,8 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
for (i = 0; i < available_bits; i++) {
|
for (i = 0; i < available_bits; i++) {
|
||||||
|
|
||||||
if(((ulsch_ue[0]->g[i] == 0) && (gNB->pusch_vars[UE_id]->llr[i] <= 0)) ||
|
if(((ulsch_ue->harq_processes[harq_pid]->f[i] == 0) && (gNB->pusch_vars[UE_id]->llr[i] <= 0)) ||
|
||||||
((ulsch_ue[0]->g[i] == 1) && (gNB->pusch_vars[UE_id]->llr[i] >= 0)))
|
((ulsch_ue->harq_processes[harq_pid]->f[i] == 1) && (gNB->pusch_vars[UE_id]->llr[i] >= 0)))
|
||||||
{
|
{
|
||||||
/*if(errors_scrambling == 0)
|
/*if(errors_scrambling == 0)
|
||||||
printf("\x1B[34m" "[frame %d][trial %d]\t1st bit in error in unscrambling = %d\n" "\x1B[0m", frame, trial, i);*/
|
printf("\x1B[34m" "[frame %d][trial %d]\t1st bit in error in unscrambling = %d\n" "\x1B[0m", frame, trial, i);*/
|
||||||
@@ -1407,7 +1407,7 @@ int main(int argc, char **argv)
|
|||||||
for (i = 0; i < TBS; i++) {
|
for (i = 0; i < TBS; i++) {
|
||||||
|
|
||||||
estimated_output_bit[i] = (ulsch_gNB->harq_processes[harq_pid]->b[i/8] & (1 << (i & 7))) >> (i & 7);
|
estimated_output_bit[i] = (ulsch_gNB->harq_processes[harq_pid]->b[i/8] & (1 << (i & 7))) >> (i & 7);
|
||||||
test_input_bit[i] = (ulsch_ue[0]->harq_processes[harq_pid]->b[i/8] & (1 << (i & 7))) >> (i & 7);
|
test_input_bit[i] = (ulsch_ue->harq_processes[harq_pid]->b[i/8] & (1 << (i & 7))) >> (i & 7);
|
||||||
|
|
||||||
if (estimated_output_bit[i] != test_input_bit[i]) {
|
if (estimated_output_bit[i] != test_input_bit[i]) {
|
||||||
/*if(errors_decoding == 0)
|
/*if(errors_decoding == 0)
|
||||||
@@ -1416,13 +1416,13 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (n_trials == 1) {
|
if (n_trials == 1) {
|
||||||
for (int r=0;r<ulsch_ue[0]->harq_processes[harq_pid]->C;r++)
|
for (int r=0;r<ulsch_ue->harq_processes[harq_pid]->C;r++)
|
||||||
for (int i=0;i<ulsch_ue[0]->harq_processes[harq_pid]->K>>3;i++) {
|
for (int i=0;i<ulsch_ue->harq_processes[harq_pid]->K>>3;i++) {
|
||||||
if ((ulsch_ue[0]->harq_processes[harq_pid]->c[r][i]^ulsch_gNB->harq_processes[harq_pid]->c[r][i]) != 0) printf("************");
|
if ((ulsch_ue->harq_processes[harq_pid]->c[r][i]^ulsch_gNB->harq_processes[harq_pid]->c[r][i]) != 0) printf("************");
|
||||||
/*printf("r %d: in[%d] %x, out[%d] %x (%x)\n",r,
|
/*printf("r %d: in[%d] %x, out[%d] %x (%x)\n",r,
|
||||||
i,ulsch_ue[0]->harq_processes[harq_pid]->c[r][i],
|
i,ulsch_ue->harq_processes[harq_pid]->c[r][i],
|
||||||
i,ulsch_gNB->harq_processes[harq_pid]->c[r][i],
|
i,ulsch_gNB->harq_processes[harq_pid]->c[r][i],
|
||||||
ulsch_ue[0]->harq_processes[harq_pid]->c[r][i]^ulsch_gNB->harq_processes[harq_pid]->c[r][i]);*/
|
ulsch_ue->harq_processes[harq_pid]->c[r][i]^ulsch_gNB->harq_processes[harq_pid]->c[r][i]);*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (errors_decoding > 0 && error_flag == 0) {
|
if (errors_decoding > 0 && error_flag == 0) {
|
||||||
|
|||||||
Reference in New Issue
Block a user