Fix DMRS RE allocation: 1- allowed_xlsch_re_in_dmrs_symbol 2- Double DMRS 3- w_t and w_f
This commit is contained in:
@@ -37,6 +37,7 @@
|
|||||||
|
|
||||||
uint8_t allowed_xlsch_re_in_dmrs_symbol(uint16_t k,
|
uint8_t allowed_xlsch_re_in_dmrs_symbol(uint16_t k,
|
||||||
uint16_t start_sc,
|
uint16_t start_sc,
|
||||||
|
uint16_t ofdm_symbol_size,
|
||||||
uint8_t numDmrsCdmGrpsNoData,
|
uint8_t numDmrsCdmGrpsNoData,
|
||||||
uint8_t dmrs_type) {
|
uint8_t dmrs_type) {
|
||||||
uint8_t delta;
|
uint8_t delta;
|
||||||
@@ -44,7 +45,7 @@ uint8_t allowed_xlsch_re_in_dmrs_symbol(uint16_t k,
|
|||||||
if (k>start_sc)
|
if (k>start_sc)
|
||||||
diff = k-start_sc;
|
diff = k-start_sc;
|
||||||
else
|
else
|
||||||
diff = start_sc-k;
|
diff = (ofdm_symbol_size-start_sc)+k;
|
||||||
for (int i = 0; i<numDmrsCdmGrpsNoData; i++){
|
for (int i = 0; i<numDmrsCdmGrpsNoData; i++){
|
||||||
if (dmrs_type==NFAPI_NR_DMRS_TYPE1) {
|
if (dmrs_type==NFAPI_NR_DMRS_TYPE1) {
|
||||||
delta = i;
|
delta = i;
|
||||||
@@ -53,7 +54,7 @@ uint8_t allowed_xlsch_re_in_dmrs_symbol(uint16_t k,
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
delta = i<<1;
|
delta = i<<1;
|
||||||
if ( (((diff)%6) == delta) || (((k-start_sc)%6) == (delta+1)) )
|
if (((diff%6) == delta) || ((diff%6) == (delta+1)))
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ uint16_t get_dmrs_freq_idx_ul(uint16_t n, uint8_t k_prime, uint8_t delta, uint8_
|
|||||||
|
|
||||||
uint8_t allowed_xlsch_re_in_dmrs_symbol(uint16_t k,
|
uint8_t allowed_xlsch_re_in_dmrs_symbol(uint16_t k,
|
||||||
uint16_t start_sc,
|
uint16_t start_sc,
|
||||||
|
uint16_t ofdm_symbol_size,
|
||||||
uint8_t numDmrsCdmGrpsNoData,
|
uint8_t numDmrsCdmGrpsNoData,
|
||||||
uint8_t dmrs_type);
|
uint8_t dmrs_type);
|
||||||
|
|
||||||
|
|||||||
@@ -140,7 +140,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
|||||||
uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>5];
|
uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>5];
|
||||||
int16_t **mod_symbs = (int16_t**)dlsch->mod_symbs;
|
int16_t **mod_symbs = (int16_t**)dlsch->mod_symbs;
|
||||||
int16_t **tx_layers = (int16_t**)dlsch->txdataF;
|
int16_t **tx_layers = (int16_t**)dlsch->txdataF;
|
||||||
int8_t Wf[2], Wt[2], l0, l_prime[2], delta;
|
int8_t Wf[2], Wt[2], l0, l_prime, delta;
|
||||||
uint8_t dmrs_Type = rel15->dmrsConfigType;
|
uint8_t dmrs_Type = rel15->dmrsConfigType;
|
||||||
int nb_re_dmrs;
|
int nb_re_dmrs;
|
||||||
uint16_t n_dmrs;
|
uint16_t n_dmrs;
|
||||||
@@ -251,14 +251,13 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
/// DMRS QPSK modulation
|
/// DMRS QPSK modulation
|
||||||
|
|
||||||
|
|
||||||
l0 = get_l0(rel15->dlDmrsSymbPos);
|
|
||||||
for (int l=rel15->StartSymbolIndex; l<rel15->StartSymbolIndex+rel15->NrOfSymbols; l++) {
|
for (int l=rel15->StartSymbolIndex; l<rel15->StartSymbolIndex+rel15->NrOfSymbols; l++) {
|
||||||
if (rel15->dlDmrsSymbPos & (1 << l))
|
if (rel15->dlDmrsSymbPos & (1 << l))
|
||||||
nr_modulation(pdsch_dmrs[l][0], n_dmrs, DMRS_MOD_ORDER, mod_dmrs[l]); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated
|
nr_modulation(pdsch_dmrs[l][0], n_dmrs, DMRS_MOD_ORDER, mod_dmrs[l]); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_DLSCH
|
#ifdef DEBUG_DLSCH
|
||||||
|
l0 = get_l0(rel15->dlDmrsSymbPos);
|
||||||
printf("DMRS modulation (single symbol %d, %d symbols, type %d):\n", l0, n_dmrs>>1, dmrs_Type);
|
printf("DMRS modulation (single symbol %d, %d symbols, type %d):\n", l0, n_dmrs>>1, dmrs_Type);
|
||||||
for (int i=0; i<n_dmrs>>4; i++) {
|
for (int i=0; i<n_dmrs>>4; i++) {
|
||||||
for (int j=0; j<8; j++) {
|
for (int j=0; j<8; j++) {
|
||||||
@@ -286,11 +285,12 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
|||||||
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);
|
||||||
l_prime[0] = 0; // single symbol ap 0
|
l_prime = 0; // single symbol ap 0
|
||||||
uint8_t dmrs_symbol = l0+l_prime[0];
|
l0 = get_l0(rel15->dlDmrsSymbPos);
|
||||||
|
uint8_t dmrs_symbol = l0+l_prime;
|
||||||
#ifdef DEBUG_DLSCH_MAPPING
|
#ifdef DEBUG_DLSCH_MAPPING
|
||||||
printf("DMRS Type %d params for ap %d: Wt %d %d \t Wf %d %d \t delta %d \t l_prime %d \t l0 %d\tDMRS symbol %d\n",
|
printf("DMRS Type %d params for ap %d: Wt %d %d \t Wf %d %d \t delta %d \t l_prime %d \t l0 %d\tDMRS symbol %d\n",
|
||||||
1+dmrs_Type,ap, Wt[0], Wt[1], Wf[0], Wf[1], delta, l_prime[0], l0, dmrs_symbol);
|
1+dmrs_Type,ap, Wt[0], Wt[1], Wf[0], Wf[1], delta, l_prime, l0, dmrs_symbol);
|
||||||
#endif
|
#endif
|
||||||
uint8_t k_prime=0;
|
uint8_t k_prime=0;
|
||||||
uint16_t m=0, n=0, dmrs_idx=0, k=0;
|
uint16_t m=0, n=0, dmrs_idx=0, k=0;
|
||||||
@@ -309,8 +309,15 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
if ((rel15->dlDmrsSymbPos & (1 << l)) && (k == ((start_sc+get_dmrs_freq_idx(n, k_prime, delta, dmrs_Type))%(frame_parms->ofdm_symbol_size)))) {
|
if ((rel15->dlDmrsSymbPos & (1 << l)) && (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) + (2*txdataF_offset)] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[l][dmrs_idx<<1]) >> 15;
|
if (l==(l0+1)) //take into account the double DMRS symbols
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[l][(dmrs_idx<<1) + 1]) >> 15;
|
l_prime = 1;
|
||||||
|
else if (l>(l0+1)){//new DMRS pair
|
||||||
|
l0 = l;
|
||||||
|
l_prime = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (Wt[l_prime]*Wf[k_prime]*amp*mod_dmrs[l][dmrs_idx<<1]) >> 15;
|
||||||
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (Wt[l_prime]*Wf[k_prime]*amp*mod_dmrs[l][(dmrs_idx<<1) + 1]) >> 15;
|
||||||
#ifdef DEBUG_DLSCH_MAPPING
|
#ifdef DEBUG_DLSCH_MAPPING
|
||||||
printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n",
|
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) + (2*txdataF_offset)],
|
dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
|
||||||
@@ -323,7 +330,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
|||||||
}
|
}
|
||||||
|
|
||||||
else {
|
else {
|
||||||
if( (!(rel15->dlDmrsSymbPos & (1 << l))) || allowed_xlsch_re_in_dmrs_symbol(k,start_sc,rel15->numDmrsCdmGrpsNoData,dmrs_Type)) {
|
if( (!(rel15->dlDmrsSymbPos & (1 << l))) || allowed_xlsch_re_in_dmrs_symbol(k,start_sc,frame_parms->ofdm_symbol_size,rel15->numDmrsCdmGrpsNoData,dmrs_Type)) {
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (amp * tx_layers[ap][m<<1]) >> 15;
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (amp * tx_layers[ap][m<<1]) >> 15;
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15;
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15;
|
||||||
#ifdef DEBUG_DLSCH_MAPPING
|
#ifdef DEBUG_DLSCH_MAPPING
|
||||||
|
|||||||
@@ -67,12 +67,12 @@ void get_antenna_ports(uint8_t *ap, uint8_t n_symbs, uint8_t config) {
|
|||||||
|
|
||||||
void get_Wt(int8_t *Wt, uint8_t ap, uint8_t config) {
|
void get_Wt(int8_t *Wt, uint8_t ap, uint8_t config) {
|
||||||
for (int i=0; i<2; i++)
|
for (int i=0; i<2; i++)
|
||||||
*(Wt+i)=(config==NFAPI_NR_DMRS_TYPE1)?(pdsch_dmrs_1[ap][3+i]):(pdsch_dmrs_2[ap][3+i]);
|
*(Wt+i)=(config==NFAPI_NR_DMRS_TYPE1)?(pdsch_dmrs_1[ap][5+i]):(pdsch_dmrs_2[ap][5+i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_Wf(int8_t *Wf, uint8_t ap, uint8_t config) {
|
void get_Wf(int8_t *Wf, uint8_t ap, uint8_t config) {
|
||||||
for (int i=0; i<2; i++)
|
for (int i=0; i<2; i++)
|
||||||
*(Wf+i)=(config==NFAPI_NR_DMRS_TYPE1)?(pdsch_dmrs_1[ap][5+i]):(pdsch_dmrs_2[ap][5+i]);
|
*(Wf+i)=(config==NFAPI_NR_DMRS_TYPE1)?(pdsch_dmrs_1[ap][3+i]):(pdsch_dmrs_2[ap][3+i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t get_delta(uint8_t ap, uint8_t config) {
|
uint8_t get_delta(uint8_t ap, uint8_t config) {
|
||||||
|
|||||||
@@ -360,7 +360,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
|
|||||||
|
|
||||||
ptrs_idx++;
|
ptrs_idx++;
|
||||||
|
|
||||||
} else if (!is_dmrs_sym || allowed_xlsch_re_in_dmrs_symbol(k, start_sc, 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 *) ulsch_ue->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 *) ulsch_ue->y)[(m<<1) + 1];
|
||||||
|
|||||||
Reference in New Issue
Block a user