Data + DMRS RE mapping
This commit is contained in:
committed by
Thomas Schlichter
parent
714452baef
commit
bb4cf0df90
@@ -740,6 +740,14 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
|
|||||||
///////////
|
///////////
|
||||||
|
|
||||||
// default values until overwritten by RRCConnectionReconfiguration
|
// default values until overwritten by RRCConnectionReconfiguration
|
||||||
|
|
||||||
|
for (i=0;i<MAX_NR_OF_UL_ALLOCATIONS;i++){
|
||||||
|
ue->pusch_config.pusch_TimeDomainResourceAllocation[i] = (PUSCH_TimeDomainResourceAllocation_t *)malloc16(sizeof(PUSCH_TimeDomainResourceAllocation_t));
|
||||||
|
ue->pusch_config.pusch_TimeDomainResourceAllocation[i]->mappingType = typeA;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//------------- config DMRS parameters--------------//
|
//------------- config DMRS parameters--------------//
|
||||||
ue->dmrs_UplinkConfig.pusch_dmrs_type = pusch_dmrs_type1;
|
ue->dmrs_UplinkConfig.pusch_dmrs_type = pusch_dmrs_type1;
|
||||||
ue->dmrs_UplinkConfig.pusch_dmrs_AdditionalPosition = pusch_dmrs_pos0;
|
ue->dmrs_UplinkConfig.pusch_dmrs_AdditionalPosition = pusch_dmrs_pos0;
|
||||||
@@ -780,7 +788,7 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
|
|||||||
for (i=0; i<fp->nb_antennas_tx; i++) {
|
for (i=0; i<fp->nb_antennas_tx; i++) {
|
||||||
|
|
||||||
common_vars->txdata[i] = (int32_t*)malloc16_clear( fp->samples_per_subframe*10*sizeof(int32_t) );
|
common_vars->txdata[i] = (int32_t*)malloc16_clear( fp->samples_per_subframe*10*sizeof(int32_t) );
|
||||||
common_vars->txdataF[i] = (int32_t *)malloc16_clear( fp->ofdm_symbol_size*fp->symbols_per_slot*10*sizeof(int32_t) );
|
common_vars->txdataF[i] = (int32_t *)malloc16_clear( fp->ofdm_symbol_size*fp->symbols_per_slot*fp->slots_per_frame*sizeof(int32_t) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// init RX buffers
|
// init RX buffers
|
||||||
|
|||||||
@@ -65,10 +65,6 @@ void nr_pdsch_codeword_scrambling(uint8_t *in,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint16_t get_pdsch_dmrs_idx(uint8_t n, uint8_t k_prime, uint8_t delta, uint8_t dmrs_type) {
|
|
||||||
uint16_t dmrs_idx = (dmrs_type)? (6*n+k_prime+delta):((n<<2)+(k_prime<<1)+delta);
|
|
||||||
return dmrs_idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t *dlsch,
|
uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t *dlsch,
|
||||||
NR_gNB_DCI_ALLOC_t *dci_alloc,
|
NR_gNB_DCI_ALLOC_t *dci_alloc,
|
||||||
@@ -176,7 +172,7 @@ for (int l=0; l<rel15->nb_layers; l++)
|
|||||||
uint8_t dmrs_type = config->pdsch_config.dmrs_type.value;
|
uint8_t dmrs_type = config->pdsch_config.dmrs_type.value;
|
||||||
uint8_t mapping_type = config->pdsch_config.mapping_type.value;
|
uint8_t mapping_type = config->pdsch_config.mapping_type.value;
|
||||||
|
|
||||||
l0 = get_l0(mapping_type, 2);//config->pdsch_config.dmrs_typeA_position.value);
|
l0 = get_l0(mapping_type, 2, 0);//config->pdsch_config.dmrs_typeA_position.value);
|
||||||
nr_modulation(pdsch_dmrs[l0][0], n_dmrs, 2, mod_dmrs); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated
|
nr_modulation(pdsch_dmrs[l0][0], n_dmrs, 2, mod_dmrs); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated
|
||||||
|
|
||||||
#ifdef DEBUG_DLSCH
|
#ifdef DEBUG_DLSCH
|
||||||
@@ -220,7 +216,7 @@ ap, Wt[0], Wt[1], Wf[0], Wf[1], delta, l_prime[0], l0, dmrs_symbol);
|
|||||||
for (int l=rel15->start_symbol; l<rel15->start_symbol+rel15->nb_symbols; l++) {
|
for (int l=rel15->start_symbol; l<rel15->start_symbol+rel15->nb_symbols; l++) {
|
||||||
k = start_sc;
|
k = start_sc;
|
||||||
for (int i=0; i<rel15->n_prb*NR_NB_SC_PER_RB; i++) {
|
for (int i=0; i<rel15->n_prb*NR_NB_SC_PER_RB; i++) {
|
||||||
if ((l == dmrs_symbol) && (k == ((start_sc+get_pdsch_dmrs_idx(n, k_prime, delta, dmrs_type))%(frame_parms->ofdm_symbol_size)))) {
|
if ((l == dmrs_symbol) && (k == ((start_sc+get_dmrs_freq_idx(n, k_prime, delta, dmrs_type))%(frame_parms->ofdm_symbol_size)))) {
|
||||||
((int16_t*)txdataF[ap])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[dmrs_idx<<1]) >> 15;
|
((int16_t*)txdataF[ap])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[dmrs_idx<<1]) >> 15;
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15;
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15;
|
||||||
#ifdef DEBUG_DLSCH_MAPPING
|
#ifdef DEBUG_DLSCH_MAPPING
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
|
|
||||||
|
|
||||||
/*Table 7.4.1.1.2-1 and 7.4.1.1.2-2 38211 Columns: ap - CDM group - Delta - Wf(0) - Wf(1) - Wt(0) - Wt(1)*/
|
/*Table 7.4.1.1.2-1 and 7.4.1.1.2-2 38211 Columns: ap - CDM group - Delta - Wf(0) - Wf(1) - Wt(0) - Wt(1)*/
|
||||||
|
/*Table 6.4.1.1.3-1 is identical to Table 7.4.1.1.2-1 and Table 6.4.1.1.3-2 is identical to Table 7.4.1.1.2-2. UL DMRS can reuse these tables*/
|
||||||
int8_t pdsch_dmrs_1[8][7] = {{0,0,0,1,1,1,1},
|
int8_t pdsch_dmrs_1[8][7] = {{0,0,0,1,1,1,1},
|
||||||
{1,0,0,1,-1,1,1},
|
{1,0,0,1,-1,1,1},
|
||||||
{2,1,1,1,1,1,1},
|
{2,1,1,1,1,1,1},
|
||||||
@@ -84,6 +85,16 @@ uint8_t get_delta(uint8_t ap, uint8_t config) {
|
|||||||
return ((config==NFAPI_NR_DMRS_TYPE1)?(pdsch_dmrs_1[ap][2]):(pdsch_dmrs_2[ap][2]));
|
return ((config==NFAPI_NR_DMRS_TYPE1)?(pdsch_dmrs_1[ap][2]):(pdsch_dmrs_2[ap][2]));
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t get_l0(uint8_t mapping_type, uint8_t dmrs_typeA_position) {
|
uint16_t get_dmrs_freq_idx(uint8_t n, uint8_t k_prime, uint8_t delta, uint8_t dmrs_type) {
|
||||||
return ((mapping_type==NFAPI_NR_PDSCH_MAPPING_TYPE_A)?dmrs_typeA_position:0);
|
uint16_t dmrs_idx = (dmrs_type)? (6*n+k_prime+delta):((n<<2)+(k_prime<<1)+delta);
|
||||||
|
return dmrs_idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t get_l0(uint8_t mapping_type, uint8_t dmrs_typeA_position, int ul_flag) {
|
||||||
|
|
||||||
|
if (ul_flag)
|
||||||
|
return ((mapping_type==NFAPI_NR_PDSCH_MAPPING_TYPE_A)?dmrs_typeA_position:0);
|
||||||
|
else
|
||||||
|
return ((mapping_type==typeA)?dmrs_typeA_position:0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,4 +45,6 @@ void get_Wf(int8_t *Wf, uint8_t ap, uint8_t config);
|
|||||||
|
|
||||||
uint8_t get_delta(uint8_t ap, uint8_t config);
|
uint8_t get_delta(uint8_t ap, uint8_t config);
|
||||||
|
|
||||||
uint8_t get_l0(uint8_t mapping_type, uint8_t dmrs_typeA_position);
|
uint16_t get_dmrs_freq_idx(uint8_t n, uint8_t k_prime, uint8_t delta, uint8_t dmrs_type);
|
||||||
|
|
||||||
|
uint8_t get_l0(uint8_t mapping_type, uint8_t dmrs_typeA_position, int ul_flag);
|
||||||
|
|||||||
@@ -130,7 +130,9 @@ int main(int argc, char **argv) {
|
|||||||
double SNR, SNR_lin, snr0 = -2.0, snr1 = 2.0;
|
double SNR, SNR_lin, snr0 = -2.0, snr1 = 2.0;
|
||||||
double snr_step = 0.1;
|
double snr_step = 0.1;
|
||||||
uint8_t snr1set = 0;
|
uint8_t snr1set = 0;
|
||||||
|
int slot = 0;
|
||||||
int **txdata;
|
int **txdata;
|
||||||
|
int32_t **txdataF;
|
||||||
double **s_re, **s_im, **r_re, **r_im;
|
double **s_re, **s_im, **r_re, **r_im;
|
||||||
FILE *output_fd = NULL;
|
FILE *output_fd = NULL;
|
||||||
//uint8_t write_output_file = 0;
|
//uint8_t write_output_file = 0;
|
||||||
@@ -155,9 +157,11 @@ int main(int argc, char **argv) {
|
|||||||
float target_error_rate = 0.01;
|
float target_error_rate = 0.01;
|
||||||
uint64_t SSB_positions=0x01;
|
uint64_t SSB_positions=0x01;
|
||||||
uint16_t nb_symb_sch = 12;
|
uint16_t nb_symb_sch = 12;
|
||||||
|
int start_symbol = 14 - nb_symb_sch;
|
||||||
uint16_t nb_rb = 50;
|
uint16_t nb_rb = 50;
|
||||||
uint8_t Imcs = 9;
|
uint8_t Imcs = 9;
|
||||||
int eNB_id = 0;
|
int eNB_id = 0;
|
||||||
|
int ap;
|
||||||
|
|
||||||
cpuf = get_cpu_freq_GHz();
|
cpuf = get_cpu_freq_GHz();
|
||||||
|
|
||||||
@@ -434,7 +438,7 @@ int main(int argc, char **argv) {
|
|||||||
uint8_t is_crnti = 0, llr8_flag = 0;
|
uint8_t is_crnti = 0, llr8_flag = 0;
|
||||||
unsigned int TBS = 8424;
|
unsigned int TBS = 8424;
|
||||||
unsigned int available_bits;
|
unsigned int available_bits;
|
||||||
uint8_t nb_re_dmrs = 6;
|
uint8_t nb_re_dmrs = UE->dmrs_UplinkConfig.pusch_maxLength*(UE->dmrs_UplinkConfig.pusch_dmrs_type == pusch_dmrs_type1)?6:4;
|
||||||
uint16_t length_dmrs = 1;
|
uint16_t length_dmrs = 1;
|
||||||
uint8_t N_PRB_oh;
|
uint8_t N_PRB_oh;
|
||||||
uint16_t N_RE_prime;
|
uint16_t N_RE_prime;
|
||||||
@@ -443,6 +447,10 @@ int main(int argc, char **argv) {
|
|||||||
uint8_t rvidx = 0;
|
uint8_t rvidx = 0;
|
||||||
uint8_t UE_id = 1;
|
uint8_t UE_id = 1;
|
||||||
uint8_t cwd;
|
uint8_t cwd;
|
||||||
|
uint16_t start_sc, start_rb;
|
||||||
|
int8_t Wf[2], Wt[2], l0, l_prime[2], delta;
|
||||||
|
uint32_t ***pusch_dmrs;
|
||||||
|
|
||||||
|
|
||||||
NR_gNB_ULSCH_t *ulsch_gNB = gNB->ulsch[UE_id][0];
|
NR_gNB_ULSCH_t *ulsch_gNB = gNB->ulsch[UE_id][0];
|
||||||
nfapi_nr_ul_config_ulsch_pdu_rel15_t *rel15_ul = &ulsch_gNB->harq_processes[harq_pid]->ulsch_pdu.ulsch_pdu_rel15;
|
nfapi_nr_ul_config_ulsch_pdu_rel15_t *rel15_ul = &ulsch_gNB->harq_processes[harq_pid]->ulsch_pdu.ulsch_pdu_rel15;
|
||||||
@@ -482,6 +490,10 @@ int main(int argc, char **argv) {
|
|||||||
uint32_t scrambling_index;
|
uint32_t scrambling_index;
|
||||||
int16_t **tx_layers;
|
int16_t **tx_layers;
|
||||||
int32_t *mod_symbols[MAX_NUM_NR_RE];
|
int32_t *mod_symbols[MAX_NUM_NR_RE];
|
||||||
|
uint16_t n_dmrs;
|
||||||
|
uint8_t dmrs_type;
|
||||||
|
uint8_t mapping_type;
|
||||||
|
int amp;
|
||||||
|
|
||||||
|
|
||||||
test_input = (unsigned char *) malloc16(sizeof(unsigned char) * TBS / 8);
|
test_input = (unsigned char *) malloc16(sizeof(unsigned char) * TBS / 8);
|
||||||
@@ -573,16 +585,96 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/////////////////////////DMRS Modulation/////////////////////////
|
||||||
|
///////////
|
||||||
|
|
||||||
|
pusch_dmrs = UE->nr_gold_pusch_dmrs[slot];
|
||||||
|
n_dmrs = (nb_rb*nb_re_dmrs);
|
||||||
|
int16_t mod_dmrs[n_dmrs<<1];
|
||||||
|
dmrs_type = UE->dmrs_UplinkConfig.pusch_dmrs_type;
|
||||||
|
mapping_type = UE->pusch_config.pusch_TimeDomainResourceAllocation[0]->mappingType;
|
||||||
|
|
||||||
|
l0 = get_l0(mapping_type, 2, 1);
|
||||||
|
nr_modulation(pusch_dmrs[l0][0], n_dmrs, 2, mod_dmrs); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated
|
||||||
|
|
||||||
|
|
||||||
|
///////////
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
/////////////////////////ULSCH layer mapping/////////////////////////
|
/////////////////////////ULSCH layer mapping/////////////////////////
|
||||||
///////////
|
///////////
|
||||||
|
|
||||||
tx_layers = (int16_t **)pusch_ue->txdataF_layers;
|
tx_layers = (int16_t **)pusch_ue->txdataF_layers;
|
||||||
|
|
||||||
nr_layer_mapping((int16_t **)mod_symbols,
|
nr_layer_mapping((int16_t **)mod_symbols,
|
||||||
Nl,
|
harq_process_ul_ue->Nl,
|
||||||
available_bits/mod_order,
|
available_bits/mod_order,
|
||||||
tx_layers);
|
tx_layers);
|
||||||
|
|
||||||
|
///////////
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/////////////////////////ULSCH RE mapping/////////////////////////
|
||||||
|
///////////
|
||||||
|
|
||||||
|
txdataF = UE->common_vars.txdataF;
|
||||||
|
amp = AMP;
|
||||||
|
|
||||||
|
start_rb = 10;
|
||||||
|
start_sc = frame_parms->first_carrier_offset + start_rb*NR_NB_SC_PER_RB;
|
||||||
|
|
||||||
|
if (start_sc >= frame_parms->ofdm_symbol_size)
|
||||||
|
start_sc -= frame_parms->ofdm_symbol_size;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for (ap=0; ap<harq_process_ul_ue->Nl; ap++) {
|
||||||
|
|
||||||
|
// DMRS params for this ap
|
||||||
|
get_Wt(Wt, ap, dmrs_type);
|
||||||
|
get_Wf(Wf, ap, dmrs_type);
|
||||||
|
delta = get_delta(ap, dmrs_type);
|
||||||
|
l_prime[0] = 0; // single symbol ap 0
|
||||||
|
uint8_t dmrs_symbol = l0+l_prime[0]; // Assuming dmrs-AdditionalPosition = 0
|
||||||
|
|
||||||
|
uint8_t k_prime=0, l;
|
||||||
|
uint16_t m=0, n=0, dmrs_idx=0, k=0;
|
||||||
|
|
||||||
|
for (l=start_symbol; l<start_symbol+nb_symb_sch; l++) {
|
||||||
|
k = start_sc;
|
||||||
|
for (i=0; i<nb_rb*NR_NB_SC_PER_RB; i++) {
|
||||||
|
if ((l == dmrs_symbol) && (k == ((start_sc+get_dmrs_freq_idx(n, k_prime, delta, dmrs_type))%(frame_parms->ofdm_symbol_size)))) {
|
||||||
|
((int16_t*)txdataF[ap])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[dmrs_idx<<1]) >> 15;
|
||||||
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15;
|
||||||
|
#ifdef DEBUG_PUSCH_MAPPING
|
||||||
|
printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n",
|
||||||
|
dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[(l*frame_parms->ofdm_symbol_size + k)<<1],
|
||||||
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1]);
|
||||||
|
#endif
|
||||||
|
dmrs_idx++;
|
||||||
|
k_prime++;
|
||||||
|
k_prime&=1;
|
||||||
|
n+=(k_prime)?0:1;
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
|
||||||
|
((int16_t*)txdataF[ap])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * tx_layers[ap][m<<1]) >> 15;
|
||||||
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15;
|
||||||
|
#ifdef DEBUG_PUSCH_MAPPING
|
||||||
|
printf("m %d\t l %d \t k %d \t txdataF: %d %d\n",
|
||||||
|
m, l, k, ((int16_t*)txdataF[ap])[(l*frame_parms->ofdm_symbol_size + k)<<1],
|
||||||
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1]);
|
||||||
|
#endif
|
||||||
|
m++;
|
||||||
|
}
|
||||||
|
if (++k >= frame_parms->ofdm_symbol_size)
|
||||||
|
k -= frame_parms->ofdm_symbol_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
///////////
|
///////////
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user