Use gold cache for PDCCH decoding, scrambling, unscrambling
This commit is contained in:
committed by
Robert Schmidt
parent
0316431e27
commit
99c8dd420a
@@ -143,31 +143,11 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB)
|
|||||||
gNB->max_nb_pdsch = MAX_MOBILES_PER_GNB;
|
gNB->max_nb_pdsch = MAX_MOBILES_PER_GNB;
|
||||||
init_delay_table(fp->ofdm_symbol_size, MAX_DELAY_COMP, NR_MAX_OFDM_SYMBOL_SIZE, fp->delay_table);
|
init_delay_table(fp->ofdm_symbol_size, MAX_DELAY_COMP, NR_MAX_OFDM_SYMBOL_SIZE, fp->delay_table);
|
||||||
|
|
||||||
//PDCCH DMRS init
|
|
||||||
gNB->nr_gold_pdcch_dmrs = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **));
|
|
||||||
uint32_t ***pdcch_dmrs = gNB->nr_gold_pdcch_dmrs;
|
|
||||||
AssertFatal(pdcch_dmrs!=NULL, "NR init: pdcch_dmrs malloc failed\n");
|
|
||||||
|
|
||||||
gNB->bad_pucch = 0;
|
gNB->bad_pucch = 0;
|
||||||
if (gNB->TX_AMP == 0)
|
if (gNB->TX_AMP == 0)
|
||||||
gNB->TX_AMP = AMP;
|
gNB->TX_AMP = AMP;
|
||||||
// ceil(((NB_RB<<1)*3)/32) // 3 RE *2(QPSK)
|
// ceil(((NB_RB<<1)*3)/32) // 3 RE *2(QPSK)
|
||||||
int pdcch_dmrs_init_length = (((fp->N_RB_DL<<1)*3)>>5)+1;
|
|
||||||
|
|
||||||
for (int slot=0; slot<fp->slots_per_frame; slot++) {
|
|
||||||
pdcch_dmrs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *));
|
|
||||||
AssertFatal(pdcch_dmrs[slot]!=NULL, "NR init: pdcch_dmrs for slot %d - malloc failed\n", slot);
|
|
||||||
|
|
||||||
for (int symb=0; symb<fp->symbols_per_slot; symb++) {
|
|
||||||
pdcch_dmrs[slot][symb] = (uint32_t *)malloc16(pdcch_dmrs_init_length*sizeof(uint32_t));
|
|
||||||
LOG_D(PHY,"pdcch_dmrs[%d][%d] %p\n",slot,symb,pdcch_dmrs[slot][symb]);
|
|
||||||
AssertFatal(pdcch_dmrs[slot][symb]!=NULL, "NR init: pdcch_dmrs for slot %d symbol %d - malloc failed\n", slot, symb);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
nr_generate_modulation_table();
|
nr_generate_modulation_table();
|
||||||
gNB->pdcch_gold_init = cfg->cell_config.phy_cell_id.value;
|
|
||||||
nr_init_pdcch_dmrs(gNB, cfg->cell_config.phy_cell_id.value);
|
|
||||||
nr_init_pbch_interleaver(gNB->nr_pbch_interleaver);
|
nr_init_pbch_interleaver(gNB->nr_pbch_interleaver);
|
||||||
|
|
||||||
//PDSCH DMRS init
|
//PDSCH DMRS init
|
||||||
@@ -340,14 +320,6 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
|
|||||||
free_and_zero(meas->n0_subband_power);
|
free_and_zero(meas->n0_subband_power);
|
||||||
free_and_zero(meas->n0_subband_power_dB);
|
free_and_zero(meas->n0_subband_power_dB);
|
||||||
|
|
||||||
uint32_t ***pdcch_dmrs = gNB->nr_gold_pdcch_dmrs;
|
|
||||||
for (int slot = 0; slot < fp->slots_per_frame; slot++) {
|
|
||||||
for (int symb = 0; symb < fp->symbols_per_slot; symb++)
|
|
||||||
free_and_zero(pdcch_dmrs[slot][symb]);
|
|
||||||
free_and_zero(pdcch_dmrs[slot]);
|
|
||||||
}
|
|
||||||
free_and_zero(pdcch_dmrs);
|
|
||||||
|
|
||||||
uint32_t ****pdsch_dmrs = gNB->nr_gold_pdsch_dmrs;
|
uint32_t ****pdsch_dmrs = gNB->nr_gold_pdsch_dmrs;
|
||||||
for (int slot = 0; slot < fp->slots_per_frame; slot++) {
|
for (int slot = 0; slot < fp->slots_per_frame; slot++) {
|
||||||
for (int symb = 0; symb < fp->symbols_per_slot; symb++) {
|
for (int symb = 0; symb < fp->symbols_per_slot; symb++) {
|
||||||
|
|||||||
@@ -304,23 +304,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
|
|||||||
common_vars->rxdata[i] = malloc16_clear(num_samples * sizeof(c16_t));
|
common_vars->rxdata[i] = malloc16_clear(num_samples * sizeof(c16_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
// ceil(((NB_RB<<1)*3)/32) // 3 RE *2(QPSK)
|
|
||||||
int pdcch_dmrs_init_length = (((fp->N_RB_DL<<1)*3)>>5)+1;
|
|
||||||
//PDCCH DMRS init (gNB offset = 0)
|
|
||||||
ue->nr_gold_pdcch[0] = malloc16(fp->slots_per_frame * sizeof(uint32_t **));
|
|
||||||
uint32_t ***pdcch_dmrs = ue->nr_gold_pdcch[0];
|
|
||||||
AssertFatal(pdcch_dmrs!=NULL, "NR init: pdcch_dmrs malloc failed\n");
|
|
||||||
|
|
||||||
for (int slot=0; slot<fp->slots_per_frame; slot++) {
|
|
||||||
pdcch_dmrs[slot] = malloc16(fp->symbols_per_slot * sizeof(uint32_t *));
|
|
||||||
AssertFatal(pdcch_dmrs[slot]!=NULL, "NR init: pdcch_dmrs for slot %d - malloc failed\n", slot);
|
|
||||||
|
|
||||||
for (int symb=0; symb<fp->symbols_per_slot; symb++) {
|
|
||||||
pdcch_dmrs[slot][symb] = malloc16(pdcch_dmrs_init_length * sizeof(uint32_t));
|
|
||||||
AssertFatal(pdcch_dmrs[slot][symb]!=NULL, "NR init: pdcch_dmrs for slot %d symbol %d - malloc failed\n", slot, symb);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ceil(((NB_RB*6(k)*2(QPSK)/32) // 3 RE *2(QPSK)
|
// ceil(((NB_RB*6(k)*2(QPSK)/32) // 3 RE *2(QPSK)
|
||||||
int pdsch_dmrs_init_length = ((fp->N_RB_DL*12)>>5)+1;
|
int pdsch_dmrs_init_length = ((fp->N_RB_DL*12)>>5)+1;
|
||||||
|
|
||||||
@@ -425,13 +408,6 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
|
|||||||
}
|
}
|
||||||
free_and_zero(common_vars->rxdata);
|
free_and_zero(common_vars->rxdata);
|
||||||
|
|
||||||
for (int slot = 0; slot < fp->slots_per_frame; slot++) {
|
|
||||||
for (int symb = 0; symb < fp->symbols_per_slot; symb++)
|
|
||||||
free_and_zero(ue->nr_gold_pdcch[0][slot][symb]);
|
|
||||||
free_and_zero(ue->nr_gold_pdcch[0][slot]);
|
|
||||||
}
|
|
||||||
free_and_zero(ue->nr_gold_pdcch[0]);
|
|
||||||
|
|
||||||
for (int slot=0; slot<fp->slots_per_frame; slot++) {
|
for (int slot=0; slot<fp->slots_per_frame; slot++) {
|
||||||
for (int symb=0; symb<fp->symbols_per_slot; symb++) {
|
for (int symb=0; symb<fp->symbols_per_slot; symb++) {
|
||||||
for (int q=0; q<NR_NB_NSCID; q++)
|
for (int q=0; q<NR_NB_NSCID; q++)
|
||||||
|
|||||||
@@ -21,28 +21,6 @@
|
|||||||
|
|
||||||
#include "nr_refsig.h"
|
#include "nr_refsig.h"
|
||||||
|
|
||||||
void nr_init_pdcch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid)
|
|
||||||
{
|
|
||||||
NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
|
|
||||||
uint32_t ***pdcch_dmrs = gNB->nr_gold_pdcch_dmrs;
|
|
||||||
int pdcch_dmrs_init_length = (((fp->N_RB_DL << 1) * 3) >> 5) + 1;
|
|
||||||
|
|
||||||
for (int slot = 0; slot < fp->slots_per_frame; slot++) {
|
|
||||||
for (int symb = 0; symb < fp->symbols_per_slot; symb++) {
|
|
||||||
uint8_t reset = 1;
|
|
||||||
uint32_t x1 = 0;
|
|
||||||
uint64_t temp_x2 = ((1UL << 17) * (fp->symbols_per_slot * slot + symb + 1) * ((Nid << 1) + 1) + (Nid << 1));
|
|
||||||
uint32_t x2 = temp_x2 % (1U << 31);
|
|
||||||
LOG_D(PHY,"PDCCH DMRS slot %d, symb %d, Nid %d, x2 %x\n", slot, symb, Nid, x2);
|
|
||||||
for (uint32_t n = 0; n < pdcch_dmrs_init_length; n++) {
|
|
||||||
pdcch_dmrs[slot][symb][n] = lte_gold_generic(&x1, &x2, reset);
|
|
||||||
reset = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void nr_init_pdsch_dmrs(PHY_VARS_gNB* gNB, uint8_t nscid, uint32_t Nid)
|
void nr_init_pdsch_dmrs(PHY_VARS_gNB* gNB, uint8_t nscid, uint32_t Nid)
|
||||||
{
|
{
|
||||||
NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
|
NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
|
||||||
|
|||||||
@@ -22,27 +22,6 @@
|
|||||||
#include "refsig_defs_ue.h"
|
#include "refsig_defs_ue.h"
|
||||||
#include "openair1/PHY/LTE_TRANSPORT/transport_proto.h" // for lte_gold_generic()
|
#include "openair1/PHY/LTE_TRANSPORT/transport_proto.h" // for lte_gold_generic()
|
||||||
|
|
||||||
void nr_gold_pdcch(PHY_VARS_NR_UE* ue,
|
|
||||||
unsigned short nid)
|
|
||||||
{
|
|
||||||
int pdcch_dmrs_init_length = (((ue->frame_parms.N_RB_DL << 1) * 3) >> 5) + 1;
|
|
||||||
for (int ns = 0; ns < ue->frame_parms.slots_per_frame; ns++) {
|
|
||||||
for (int l = 0; l < ue->frame_parms.symbols_per_slot; l++) {
|
|
||||||
uint8_t reset = 1;
|
|
||||||
uint64_t x2tmp0 = ((ue->frame_parms.symbols_per_slot * ns + l + 1) * ((nid << 1) + 1));
|
|
||||||
x2tmp0 <<= 17;
|
|
||||||
x2tmp0 += (nid << 1);
|
|
||||||
uint32_t x1 = 0;
|
|
||||||
uint32_t x2 = x2tmp0 % (1U << 31); //cinit
|
|
||||||
LOG_D(PHY,"PDCCH DMRS slot %d, symb %d, Nid %d, x2 %x\n", ns, l, nid, x2);
|
|
||||||
for (int n = 0; n < pdcch_dmrs_init_length; n++) {
|
|
||||||
ue->nr_gold_pdcch[0][ns][l][n] = lte_gold_generic(&x1, &x2, reset);
|
|
||||||
reset = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
|
void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
|
||||||
int nscid,
|
int nscid,
|
||||||
uint32_t nid)
|
uint32_t nid)
|
||||||
|
|||||||
@@ -39,7 +39,6 @@ void nr_init_prs(PHY_VARS_gNB* gNB);
|
|||||||
@param PHY_VARS_gNB* gNB structure provides configuration, frame parameters and the pointers to the 32 bits sequence storage tables
|
@param PHY_VARS_gNB* gNB structure provides configuration, frame parameters and the pointers to the 32 bits sequence storage tables
|
||||||
@param Nid is used for the initialization of x2, Physical cell Id by default or upper layer configured pdcch_scrambling_ID
|
@param Nid is used for the initialization of x2, Physical cell Id by default or upper layer configured pdcch_scrambling_ID
|
||||||
*/
|
*/
|
||||||
void nr_init_pdcch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid);
|
|
||||||
void nr_init_pdsch_dmrs(PHY_VARS_gNB* gNB, uint8_t nscid, uint32_t Nid);
|
void nr_init_pdsch_dmrs(PHY_VARS_gNB* gNB, uint8_t nscid, uint32_t Nid);
|
||||||
void nr_init_csi_rs(const NR_DL_FRAME_PARMS *fp, uint32_t ***csi_rs, uint32_t Nid);
|
void nr_init_csi_rs(const NR_DL_FRAME_PARMS *fp, uint32_t ***csi_rs, uint32_t Nid);
|
||||||
|
|
||||||
|
|||||||
@@ -26,5 +26,6 @@
|
|||||||
|
|
||||||
uint32_t *gold_cache(uint32_t key, int length);
|
uint32_t *gold_cache(uint32_t key, int length);
|
||||||
uint32_t *nr_gold_pbch(int Lmax, int Nid, int n_hf, int ssb);
|
uint32_t *nr_gold_pbch(int Lmax, int Nid, int n_hf, int ssb);
|
||||||
|
uint32_t *nr_gold_pdcch(int N_RB_DL, int symbols_per_slot, unsigned short n_idDMRS, int ns, int l);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -172,3 +172,14 @@ uint32_t *nr_gold_pbch(int Lmax, int Nid, int n_hf, int l)
|
|||||||
uint32_t x2 = (1 << 11) * (i_ssb2 + 1) * ((Nid >> 2) + 1) + (1 << 6) * (i_ssb2 + 1) + (Nid & 3);
|
uint32_t x2 = (1 << 11) * (i_ssb2 + 1) * ((Nid >> 2) + 1) + (1 << 6) * (i_ssb2 + 1) + (Nid & 3);
|
||||||
return gold_cache(x2, NR_PBCH_DMRS_LENGTH_DWORD);
|
return gold_cache(x2, NR_PBCH_DMRS_LENGTH_DWORD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t *nr_gold_pdcch(int N_RB_DL, int symbols_per_slot, unsigned short nid, int ns, int l)
|
||||||
|
{
|
||||||
|
int pdcch_dmrs_init_length = (((N_RB_DL << 1) * 3) >> 5) + 1;
|
||||||
|
uint64_t x2tmp0 = (((uint64_t)symbols_per_slot * ns + l + 1) * ((nid << 1) + 1));
|
||||||
|
x2tmp0 <<= 17;
|
||||||
|
x2tmp0 += (nid << 1);
|
||||||
|
uint32_t x2 = x2tmp0 % (1U << 31); // cinit
|
||||||
|
LOG_D(PHY, "PDCCH DMRS slot %d, symb %d, Nid %d, x2 %x\n", ns, l, nid, x2);
|
||||||
|
return gold_cache(x2, pdcch_dmrs_init_length);
|
||||||
|
}
|
||||||
|
|||||||
@@ -51,9 +51,6 @@ int nr_pdsch_dmrs_rx(const PHY_VARS_NR_UE *ue,
|
|||||||
unsigned short nb_pdsch_rb,
|
unsigned short nb_pdsch_rb,
|
||||||
uint8_t config_type);
|
uint8_t config_type);
|
||||||
|
|
||||||
void nr_gold_pdcch(PHY_VARS_NR_UE* ue,
|
|
||||||
unsigned short n_idDMRS);
|
|
||||||
|
|
||||||
void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
|
void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
|
||||||
int nscid,
|
int nscid,
|
||||||
uint32_t nid);
|
uint32_t nid);
|
||||||
|
|||||||
@@ -41,29 +41,13 @@
|
|||||||
//#define DEBUG_DCI
|
//#define DEBUG_DCI
|
||||||
//#define DEBUG_CHANNEL_CODING
|
//#define DEBUG_CHANNEL_CODING
|
||||||
|
|
||||||
void nr_pdcch_scrambling(uint32_t *in,
|
static void nr_pdcch_scrambling(uint32_t *in, uint32_t size, uint32_t Nid, uint32_t scrambling_RNTI, uint32_t *out)
|
||||||
uint32_t size,
|
{
|
||||||
uint32_t Nid,
|
int roundedSz = ((size + 31) / 32);
|
||||||
uint32_t scrambling_RNTI,
|
uint32_t *seq = gold_cache((scrambling_RNTI << 16) + Nid, roundedSz);
|
||||||
uint32_t *out) {
|
LOG_D(NR_PHY_DCI, "PDCCH scrambling_RNTI %x \n", scrambling_RNTI);
|
||||||
uint8_t reset;
|
for (int i = 0; i < roundedSz; i++)
|
||||||
uint32_t x1 = 0, x2 = 0, s = 0;
|
out[i] = in[i] ^ seq[i];
|
||||||
reset = 1;
|
|
||||||
x2 = (scrambling_RNTI<<16) + Nid;
|
|
||||||
LOG_D(NR_PHY_DCI, "PDCCH Scrambling x2 %x : scrambling_RNTI %x \n", x2, scrambling_RNTI);
|
|
||||||
for (int i=0; i<size; i++) {
|
|
||||||
if ((i&0x1f)==0) {
|
|
||||||
s = lte_gold_generic(&x1, &x2, reset);
|
|
||||||
reset = 0;
|
|
||||||
|
|
||||||
if (i) {
|
|
||||||
in++;
|
|
||||||
out++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
(*out) ^= ((((*in)>>(i&0x1f))&1) ^ ((s>>(i&0x1f))&1))<<(i&0x1f);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void nr_generate_dci(PHY_VARS_gNB *gNB,
|
void nr_generate_dci(PHY_VARS_gNB *gNB,
|
||||||
@@ -95,13 +79,6 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
|
|||||||
* in time: by its first slot and its first symbol*/
|
* in time: by its first slot and its first symbol*/
|
||||||
const nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu_rel15->dci_pdu[d];
|
const nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu_rel15->dci_pdu[d];
|
||||||
|
|
||||||
if(dci_pdu->ScramblingId != gNB->pdcch_gold_init) {
|
|
||||||
gNB->pdcch_gold_init = dci_pdu->ScramblingId;
|
|
||||||
nr_init_pdcch_dmrs(gNB, dci_pdu->ScramblingId);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t **gold_pdcch_dmrs = gNB->nr_gold_pdcch_dmrs[slot];
|
|
||||||
|
|
||||||
cset_start_symb = pdcch_pdu_rel15->StartSymbolIndex;
|
cset_start_symb = pdcch_pdu_rel15->StartSymbolIndex;
|
||||||
cset_nsymb = pdcch_pdu_rel15->DurationSymbols;
|
cset_nsymb = pdcch_pdu_rel15->DurationSymbols;
|
||||||
dci_idx = 0;
|
dci_idx = 0;
|
||||||
@@ -131,9 +108,10 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
/// DMRS QPSK modulation
|
/// DMRS QPSK modulation
|
||||||
for (int symb=cset_start_symb; symb<cset_start_symb + pdcch_pdu_rel15->DurationSymbols; symb++) {
|
for (int symb=cset_start_symb; symb<cset_start_symb + pdcch_pdu_rel15->DurationSymbols; symb++) {
|
||||||
|
const uint32_t *gold = nr_gold_pdcch(frame_parms->N_RB_DL, frame_parms->symbols_per_slot, dci_pdu->ScramblingId, slot, symb);
|
||||||
|
nr_modulation(gold, dmrs_length, DMRS_MOD_ORDER,
|
||||||
|
mod_dmrs[symb]); // Qm = 2 as DMRS is QPSK modulated
|
||||||
|
|
||||||
nr_modulation(gold_pdcch_dmrs[symb], dmrs_length, DMRS_MOD_ORDER, mod_dmrs[symb]); //Qm = 2 as DMRS is QPSK modulated
|
|
||||||
|
|
||||||
#ifdef DEBUG_PDCCH_DMRS
|
#ifdef DEBUG_PDCCH_DMRS
|
||||||
if(dci_pdu->RNTI!=0xFFFF) {
|
if(dci_pdu->RNTI!=0xFFFF) {
|
||||||
for (int i=0; i<dmrs_length>>1; i++)
|
for (int i=0; i<dmrs_length>>1; i++)
|
||||||
|
|||||||
@@ -32,12 +32,6 @@ void nr_generate_dci_top(processingData_L1tx_t *msgTx,
|
|||||||
int16_t amp,
|
int16_t amp,
|
||||||
NR_DL_FRAME_PARMS *frame_parms);
|
NR_DL_FRAME_PARMS *frame_parms);
|
||||||
|
|
||||||
void nr_pdcch_scrambling(uint32_t *in,
|
|
||||||
uint32_t size,
|
|
||||||
uint32_t Nid,
|
|
||||||
uint32_t n_RNTI,
|
|
||||||
uint32_t *out);
|
|
||||||
|
|
||||||
int16_t find_nr_pdcch(int frame,int slot, PHY_VARS_gNB *gNB,find_type_t type);
|
int16_t find_nr_pdcch(int frame,int slot, PHY_VARS_gNB *gNB,find_type_t type);
|
||||||
|
|
||||||
void nr_fill_dci(PHY_VARS_gNB *gNB,
|
void nr_fill_dci(PHY_VARS_gNB *gNB,
|
||||||
|
|||||||
@@ -842,9 +842,7 @@ void nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
|||||||
c16_t pdcch_dl_ch_estimates[][pdcch_est_size],
|
c16_t pdcch_dl_ch_estimates[][pdcch_est_size],
|
||||||
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
|
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
|
||||||
{
|
{
|
||||||
|
int slot = proc->nr_slot_rx;
|
||||||
int Ns = proc->nr_slot_rx;
|
|
||||||
int gNB_id = proc->gNB_id;
|
|
||||||
unsigned char aarx;
|
unsigned char aarx;
|
||||||
unsigned short k;
|
unsigned short k;
|
||||||
unsigned int pilot_cnt;
|
unsigned int pilot_cnt;
|
||||||
@@ -868,8 +866,13 @@ void nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
|||||||
unsigned short coreset_start_subcarrier = first_carrier_offset+(BWPStart + coreset_start_rb)*12;
|
unsigned short coreset_start_subcarrier = first_carrier_offset+(BWPStart + coreset_start_rb)*12;
|
||||||
|
|
||||||
#ifdef DEBUG_PDCCH
|
#ifdef DEBUG_PDCCH
|
||||||
printf("PDCCH Channel Estimation : gNB_id %d ch_offset %d, OFDM size %d, Ncp=%d, Ns=%d, symbol %d\n",
|
printf("PDCCH Channel Estimation : gNB_id %d ch_offset %d, OFDM size %d, Ncp=%d, slot=%d, symbol %d\n",
|
||||||
gNB_id,ch_offset,ue->frame_parms.ofdm_symbol_size,ue->frame_parms.Ncp,Ns,symbol);
|
gNB_id,
|
||||||
|
ch_offset,
|
||||||
|
ue->frame_parms.ofdm_symbol_size,
|
||||||
|
ue->frame_parms.Ncp,
|
||||||
|
slot,
|
||||||
|
symbol);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CH_INTERP
|
#if CH_INTERP
|
||||||
@@ -879,19 +882,18 @@ void nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
unsigned short scrambling_id = coreset->pdcch_dmrs_scrambling_id;
|
unsigned short scrambling_id = coreset->pdcch_dmrs_scrambling_id;
|
||||||
// checking if re-initialization of scrambling IDs is needed (should be done here but scrambling ID for PDCCH is not taken from RRC)
|
|
||||||
if (scrambling_id != ue->scramblingID_pdcch){
|
|
||||||
ue->scramblingID_pdcch = scrambling_id;
|
|
||||||
nr_gold_pdcch(ue,ue->scramblingID_pdcch);
|
|
||||||
}
|
|
||||||
|
|
||||||
int dmrs_ref = 0;
|
int dmrs_ref = 0;
|
||||||
if (coreset->CoreSetType == NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG)
|
if (coreset->CoreSetType == NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG)
|
||||||
dmrs_ref = BWPStart;
|
dmrs_ref = BWPStart;
|
||||||
// generate pilot
|
// generate pilot
|
||||||
int pilot[(nb_rb_coreset + dmrs_ref) * 3] __attribute__((aligned(16)));
|
int pilot[(nb_rb_coreset + dmrs_ref) * 3] __attribute__((aligned(16)));
|
||||||
// Note: pilot returned by the following function is already the complex conjugate of the transmitted DMRS
|
// Note: pilot returned by the following function is already the complex conjugate of the transmitted DMRS
|
||||||
nr_pdcch_dmrs_rx(ue, Ns, ue->nr_gold_pdcch[gNB_id][Ns][symbol], (c16_t *)pilot, 2000, (nb_rb_coreset + dmrs_ref));
|
nr_pdcch_dmrs_rx(ue,
|
||||||
|
slot,
|
||||||
|
nr_gold_pdcch(ue->frame_parms.N_RB_DL, ue->frame_parms.symbols_per_slot, scrambling_id, slot, symbol),
|
||||||
|
(c16_t *)pilot,
|
||||||
|
2000,
|
||||||
|
(nb_rb_coreset + dmrs_ref));
|
||||||
|
|
||||||
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
|
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
|
||||||
|
|
||||||
|
|||||||
@@ -39,6 +39,7 @@
|
|||||||
#include "PHY/sse_intrin.h"
|
#include "PHY/sse_intrin.h"
|
||||||
#include "common/utils/nr/nr_common.h"
|
#include "common/utils/nr/nr_common.h"
|
||||||
#include <openair1/PHY/TOOLS/phy_scope_interface.h>
|
#include <openair1/PHY/TOOLS/phy_scope_interface.h>
|
||||||
|
#include "openair1/PHY/NR_REFSIG/nr_refsig_common.h"
|
||||||
|
|
||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
#include "T.h"
|
#include "T.h"
|
||||||
@@ -655,25 +656,13 @@ static void nr_pdcch_unscrambling(c16_t *e_rx,
|
|||||||
uint16_t pdcch_DMRS_scrambling_id,
|
uint16_t pdcch_DMRS_scrambling_id,
|
||||||
int16_t *z2)
|
int16_t *z2)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
uint8_t reset;
|
|
||||||
uint32_t x1 = 0, x2 = 0, s = 0;
|
|
||||||
uint16_t n_id; //{0,1,...,65535}
|
|
||||||
uint32_t rnti = (uint32_t) scrambling_RNTI;
|
uint32_t rnti = (uint32_t) scrambling_RNTI;
|
||||||
reset = 1;
|
uint16_t n_id = pdcch_DMRS_scrambling_id;
|
||||||
// x1 is set in first call to lte_gold_generic
|
uint32_t *seq = gold_cache(((rnti << 16) + n_id) % (1U << 31), length / 32); // this is c_init in 38.211 v15.1.0 Section 7.3.2.3
|
||||||
n_id = pdcch_DMRS_scrambling_id;
|
LOG_D(NR_PHY_DCI, "PDCCH Unscrambling: scrambling_RNTI %x\n", rnti);
|
||||||
x2 = ((rnti << 16) + n_id) % (1U << 31); // this is c_init in 38.211 v15.1.0 Section 7.3.2.3
|
|
||||||
|
|
||||||
LOG_D(NR_PHY_DCI, "PDCCH Unscrambling x2 %x : scrambling_RNTI %x\n", x2, rnti);
|
|
||||||
int16_t *ptr = &e_rx[0].r;
|
int16_t *ptr = &e_rx[0].r;
|
||||||
for (i = 0; i < length; i++) {
|
for (int i = 0; i < length; i++) {
|
||||||
if ((i & 0x1f) == 0) {
|
if (seq[i / 32] & (1UL << (i % 32)))
|
||||||
s = lte_gold_generic(&x1, &x2, reset);
|
|
||||||
reset = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (((s >> (i % 32)) & 1) == 1)
|
|
||||||
z2[i] = -ptr[i];
|
z2[i] = -ptr[i];
|
||||||
else
|
else
|
||||||
z2[i] = ptr[i];
|
z2[i] = ptr[i];
|
||||||
|
|||||||
@@ -407,10 +407,6 @@ nr_initial_sync_t nr_initial_sync(UE_nr_rxtx_proc_t *proc,
|
|||||||
// the n_frames we got sync
|
// the n_frames we got sync
|
||||||
ue->init_sync_frame = n_frames - 1 - res.syncRes.frame_id;
|
ue->init_sync_frame = n_frames - 1 - res.syncRes.frame_id;
|
||||||
|
|
||||||
// compute the scramblingID_pdcch and the gold pdcch
|
|
||||||
ue->scramblingID_pdcch = fp->Nid_cell;
|
|
||||||
nr_gold_pdcch(ue, fp->Nid_cell);
|
|
||||||
|
|
||||||
// compute the scrambling IDs for PDSCH DMRS
|
// compute the scrambling IDs for PDSCH DMRS
|
||||||
for (int i = 0; i < NR_NB_NSCID; i++) {
|
for (int i = 0; i < NR_NB_NSCID; i++) {
|
||||||
ue->scramblingID_dlsch[i] = fp->Nid_cell;
|
ue->scramblingID_dlsch[i] = fp->Nid_cell;
|
||||||
|
|||||||
@@ -609,9 +609,6 @@ typedef struct PHY_VARS_gNB_s {
|
|||||||
/// PBCH interleaver
|
/// PBCH interleaver
|
||||||
uint8_t nr_pbch_interleaver[NR_POLAR_PBCH_PAYLOAD_BITS];
|
uint8_t nr_pbch_interleaver[NR_POLAR_PBCH_PAYLOAD_BITS];
|
||||||
|
|
||||||
/// PDCCH DMRS sequence
|
|
||||||
uint32_t ***nr_gold_pdcch_dmrs;
|
|
||||||
|
|
||||||
/// PDSCH DMRS sequence
|
/// PDSCH DMRS sequence
|
||||||
uint32_t ****nr_gold_pdsch_dmrs;
|
uint32_t ****nr_gold_pdsch_dmrs;
|
||||||
|
|
||||||
@@ -638,7 +635,6 @@ typedef struct PHY_VARS_gNB_s {
|
|||||||
/// counter to average prach energh over first 100 prach opportunities
|
/// counter to average prach energh over first 100 prach opportunities
|
||||||
int prach_energy_counter;
|
int prach_energy_counter;
|
||||||
|
|
||||||
int pdcch_gold_init;
|
|
||||||
int pdsch_gold_init[2];
|
int pdsch_gold_init[2];
|
||||||
int pusch_gold_init[2];
|
int pusch_gold_init[2];
|
||||||
|
|
||||||
|
|||||||
@@ -417,12 +417,6 @@ typedef struct PHY_VARS_NR_UE_s {
|
|||||||
// Scrambling IDs used in PUSCH DMRS
|
// Scrambling IDs used in PUSCH DMRS
|
||||||
uint16_t scramblingID_ulsch[2];
|
uint16_t scramblingID_ulsch[2];
|
||||||
|
|
||||||
/// PDCCH DMRS
|
|
||||||
uint32_t ***nr_gold_pdcch[NUMBER_OF_CONNECTED_eNB_MAX];
|
|
||||||
|
|
||||||
// Scrambling IDs used in PDCCH DMRS
|
|
||||||
uint16_t scramblingID_pdcch;
|
|
||||||
|
|
||||||
/// PUSCH DMRS sequence
|
/// PUSCH DMRS sequence
|
||||||
uint32_t ****nr_gold_pusch_dmrs;
|
uint32_t ****nr_gold_pusch_dmrs;
|
||||||
|
|
||||||
|
|||||||
@@ -840,10 +840,6 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
init_nr_ue_transport(UE);
|
init_nr_ue_transport(UE);
|
||||||
|
|
||||||
// compute the scramblingID_pdcch and the gold pdcch
|
|
||||||
UE->scramblingID_pdcch = frame_parms->Nid_cell;
|
|
||||||
nr_gold_pdcch(UE, frame_parms->Nid_cell);
|
|
||||||
|
|
||||||
// compute the scrambling IDs for PDSCH DMRS
|
// compute the scrambling IDs for PDSCH DMRS
|
||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < 2; i++) {
|
||||||
UE->scramblingID_dlsch[i] = frame_parms->Nid_cell;
|
UE->scramblingID_dlsch[i] = frame_parms->Nid_cell;
|
||||||
|
|||||||
Reference in New Issue
Block a user