PDCCH DMRS generation/modulation
This commit is contained in:
@@ -1245,6 +1245,7 @@ set(PHY_SRC_UE
|
|||||||
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_pss.c
|
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_pss.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_sss.c
|
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_sss.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_pbch.c
|
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_pbch.c
|
||||||
|
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dci.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold.c
|
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold.c
|
||||||
${OPENAIR1_DIR}/PHY/TOOLS/file_output.c
|
${OPENAIR1_DIR}/PHY/TOOLS/file_output.c
|
||||||
${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c
|
${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c
|
||||||
|
|||||||
@@ -88,6 +88,7 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
|
|||||||
LTE_eNB_PUSCH** const pusch_vars = gNB->pusch_vars;
|
LTE_eNB_PUSCH** const pusch_vars = gNB->pusch_vars;
|
||||||
LTE_eNB_SRS* const srs_vars = gNB->srs_vars;
|
LTE_eNB_SRS* const srs_vars = gNB->srs_vars;
|
||||||
LTE_eNB_PRACH* const prach_vars = &gNB->prach_vars;
|
LTE_eNB_PRACH* const prach_vars = &gNB->prach_vars;
|
||||||
|
uint32_t ***pdcch_dmrs = gNB->nr_gold_pdcch_dmrs;
|
||||||
|
|
||||||
int i, UE_id;
|
int i, UE_id;
|
||||||
|
|
||||||
@@ -118,6 +119,12 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
|
|||||||
nr_init_pbch_dmrs(gNB);
|
nr_init_pbch_dmrs(gNB);
|
||||||
// Polar encoder init for PBCH
|
// Polar encoder init for PBCH
|
||||||
nr_polar_init(&fp->pbch_polar_params, 1);
|
nr_polar_init(&fp->pbch_polar_params, 1);
|
||||||
|
//PDCCH DMRS init
|
||||||
|
pdcch_dmrs = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t**));
|
||||||
|
for (int slot=0; slot<fp->slots_per_frame; slot++)
|
||||||
|
pdcch_dmrs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot);
|
||||||
|
|
||||||
|
nr_init_pdcch_dmrs(gNB, cfg->sch_config.physical_cell_id.value);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
lte_gold(fp,gNB->lte_gold_table,fp->Nid_cell);
|
lte_gold(fp,gNB->lte_gold_table,fp->Nid_cell);
|
||||||
@@ -271,10 +278,12 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
|
|||||||
{
|
{
|
||||||
// NR_DL_FRAME_PARMS* const fp = &gNB->frame_parms;
|
// NR_DL_FRAME_PARMS* const fp = &gNB->frame_parms;
|
||||||
nfapi_config_request_t *cfg = &gNB->gNB_config;
|
nfapi_config_request_t *cfg = &gNB->gNB_config;
|
||||||
|
NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
|
||||||
NR_gNB_COMMON* const common_vars = &gNB->common_vars;
|
NR_gNB_COMMON* const common_vars = &gNB->common_vars;
|
||||||
LTE_eNB_PUSCH** const pusch_vars = gNB->pusch_vars;
|
LTE_eNB_PUSCH** const pusch_vars = gNB->pusch_vars;
|
||||||
LTE_eNB_SRS* const srs_vars = gNB->srs_vars;
|
LTE_eNB_SRS* const srs_vars = gNB->srs_vars;
|
||||||
LTE_eNB_PRACH* const prach_vars = &gNB->prach_vars;
|
LTE_eNB_PRACH* const prach_vars = &gNB->prach_vars;
|
||||||
|
uint32_t ***pdcch_dmrs = gNB->nr_gold_pdcch_dmrs;
|
||||||
|
|
||||||
int i, UE_id;
|
int i, UE_id;
|
||||||
|
|
||||||
@@ -287,6 +296,12 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
|
|||||||
free_and_zero(common_vars->txdataF);
|
free_and_zero(common_vars->txdataF);
|
||||||
free_and_zero(common_vars->rxdataF);
|
free_and_zero(common_vars->rxdataF);
|
||||||
|
|
||||||
|
// PDCCH DMRS sequences
|
||||||
|
pdcch_dmrs = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t**));
|
||||||
|
for (int slot=0; slot<fp->slots_per_frame; slot++)
|
||||||
|
free_and_zero(pdcch_dmrs[slot]);
|
||||||
|
free_and_zero(pdcch_dmrs);
|
||||||
|
|
||||||
// Channel estimates for SRS
|
// Channel estimates for SRS
|
||||||
for (UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) {
|
for (UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) {
|
||||||
for (i=0; i<64; i++) {
|
for (i=0; i<64; i++) {
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ int nr_init_frame_parms(nfapi_config_request_t* config,
|
|||||||
AssertFatal(1==0,"Invalid numerology index %d", mu);
|
AssertFatal(1==0,"Invalid numerology index %d", mu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
frame_parms->slots_per_frame = 10* frame_parms->slots_per_subframe;
|
||||||
frame_parms->symbols_per_slot = ((Ncp == NORMAL)? 14 : 12); // to redefine for different slot formats
|
frame_parms->symbols_per_slot = ((Ncp == NORMAL)? 14 : 12); // to redefine for different slot formats
|
||||||
frame_parms->samples_per_subframe_wCP = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_slot * frame_parms->slots_per_subframe;
|
frame_parms->samples_per_subframe_wCP = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_slot * frame_parms->slots_per_subframe;
|
||||||
frame_parms->samples_per_frame_wCP = 10 * frame_parms->samples_per_subframe_wCP;
|
frame_parms->samples_per_frame_wCP = 10 * frame_parms->samples_per_subframe_wCP;
|
||||||
@@ -289,6 +289,7 @@ int nr_init_frame_parms_ue(nfapi_config_request_t* config,
|
|||||||
frame_parms->samples_per_subframe = 30720 * frame_parms->ttis_per_subframe;
|
frame_parms->samples_per_subframe = 30720 * frame_parms->ttis_per_subframe;
|
||||||
frame_parms->first_carrier_offset = 2048-600;
|
frame_parms->first_carrier_offset = 2048-600;
|
||||||
|
|
||||||
|
frame_parms->slots_per_frame = 10* frame_parms->slots_per_subframe;
|
||||||
frame_parms->symbols_per_slot = ((Ncp == NORMAL)? 14 : 12); // to redefine for different slot formats
|
frame_parms->symbols_per_slot = ((Ncp == NORMAL)? 14 : 12); // to redefine for different slot formats
|
||||||
frame_parms->samples_per_subframe_wCP = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_slot * frame_parms->slots_per_subframe;
|
frame_parms->samples_per_subframe_wCP = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_slot * frame_parms->slots_per_subframe;
|
||||||
frame_parms->samples_per_frame_wCP = 10 * frame_parms->samples_per_subframe_wCP;
|
frame_parms->samples_per_frame_wCP = 10 * frame_parms->samples_per_subframe_wCP;
|
||||||
|
|||||||
@@ -24,9 +24,10 @@
|
|||||||
void nr_init_pbch_dmrs(PHY_VARS_gNB* gNB)
|
void nr_init_pbch_dmrs(PHY_VARS_gNB* gNB)
|
||||||
{
|
{
|
||||||
|
|
||||||
unsigned int n, x1, x2;
|
uint32_t x1, x2;
|
||||||
unsigned char Nid, i_ssb, i_ssb2;
|
uint8_t Nid, i_ssb, i_ssb2;
|
||||||
unsigned char Lmax, l, n_hf, N_hf;
|
uint8_t Lmax, l, n_hf, N_hf;
|
||||||
|
uint8_t reset = 1;
|
||||||
nfapi_config_request_t *cfg = &gNB->gNB_config;
|
nfapi_config_request_t *cfg = &gNB->gNB_config;
|
||||||
NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
|
NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
|
||||||
|
|
||||||
@@ -36,32 +37,40 @@ void nr_init_pbch_dmrs(PHY_VARS_gNB* gNB)
|
|||||||
N_hf = (Lmax == 4)? 2:1;
|
N_hf = (Lmax == 4)? 2:1;
|
||||||
|
|
||||||
for (n_hf = 0; n_hf < N_hf; n_hf++) {
|
for (n_hf = 0; n_hf < N_hf; n_hf++) {
|
||||||
|
|
||||||
for (l = 0; l < Lmax ; l++) {
|
for (l = 0; l < Lmax ; l++) {
|
||||||
i_ssb = l & (Lmax-1);
|
i_ssb = l & (Lmax-1);
|
||||||
i_ssb2 = (i_ssb<<2) + n_hf;
|
i_ssb2 = (i_ssb<<2) + n_hf;
|
||||||
|
|
||||||
x1 = 1 + (1<<31);
|
|
||||||
x2 = (1<<11) * (i_ssb2 + 1) * ((Nid>>2) + 1) + (1<<6) * (i_ssb2 + 1) + (Nid&3);
|
x2 = (1<<11) * (i_ssb2 + 1) * ((Nid>>2) + 1) + (1<<6) * (i_ssb2 + 1) + (Nid&3);
|
||||||
x2 = x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31);
|
|
||||||
|
|
||||||
// skip first 50 double words (1600 bits)
|
for (uint8_t n=0; n<NR_PBCH_DMRS_LENGTH_DWORD; n++) {
|
||||||
for (n = 1; n < 50; n++) {
|
gNB->nr_gold_pbch_dmrs[n_hf][l][n] = lte_gold_generic(&x1, &x2, reset);
|
||||||
x1 = (x1>>1) ^ (x1>>4);
|
reset = 0;
|
||||||
x1 = x1 ^ (x1<<31) ^ (x1<<28);
|
|
||||||
x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4);
|
|
||||||
x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (n=0; n<NR_PBCH_DMRS_LENGTH_DWORD; n++) {
|
|
||||||
x1 = (x1>>1) ^ (x1>>4);
|
|
||||||
x1 = x1 ^ (x1<<31) ^ (x1<<28);
|
|
||||||
x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4);
|
|
||||||
x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28);
|
|
||||||
gNB->nr_gold_pbch_dmrs[n_hf][l][n] = x1 ^ x2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void nr_init_pdcch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid)
|
||||||
|
{
|
||||||
|
|
||||||
|
uint32_t n, x1, x2;
|
||||||
|
uint8_t reset = 1;
|
||||||
|
NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
|
||||||
|
uint32_t ***pdcch_dmrs = gNB->nr_gold_pdcch_dmrs;
|
||||||
|
|
||||||
|
for (uint8_t slot=0; fp->slots_per_frame; slot++) {
|
||||||
|
for (uint8_t symb=0; fp->symbols_per_slot; symb++) {
|
||||||
|
|
||||||
|
x2 = ((1<<17) * (14*slot+symb+1) * ((Nid<<1)+1) + (Nid<<1))%(1<<31);
|
||||||
|
|
||||||
|
for (uint32_t n=0; n<NR_MAX_PDCCH_DMRS_LENGTH_DWORD; n++) {
|
||||||
|
pdcch_dmrs[slot][symb][n] = lte_gold_generic(&x1, &x2, reset);
|
||||||
|
reset = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -25,12 +25,18 @@
|
|||||||
#define __NR_REFSIG__H__
|
#define __NR_REFSIG__H__
|
||||||
|
|
||||||
#include "PHY/defs_gNB.h"
|
#include "PHY/defs_gNB.h"
|
||||||
|
#include "PHY/LTE_REFSIG/lte_refsig.h"
|
||||||
|
|
||||||
|
|
||||||
/*!\brief This function generates the NR Gold sequence (38-211, Sec 5.2.1) for the PBCH DMRS.
|
/*!\brief This function generates the NR Gold sequence (38-211, Sec 5.2.1) for the PBCH DMRS.
|
||||||
@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
|
||||||
*/
|
*/
|
||||||
void nr_init_pbch_dmrs(PHY_VARS_gNB* gNB);
|
void nr_init_pbch_dmrs(PHY_VARS_gNB* gNB);
|
||||||
|
/*!\brief This function generates the NR Gold sequence (38-211, Sec 5.2.1) for the PDCCH DMRS.
|
||||||
|
@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
|
||||||
|
*/
|
||||||
|
void nr_init_pdcch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -32,6 +32,11 @@
|
|||||||
|
|
||||||
#include "nr_dci.h"
|
#include "nr_dci.h"
|
||||||
|
|
||||||
|
#define DEBUG_PDCCH_DMRS
|
||||||
|
#define DEBUG_DCI
|
||||||
|
|
||||||
|
extern short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT];
|
||||||
|
|
||||||
uint8_t nr_get_dci_size(nr_dci_format_e format,
|
uint8_t nr_get_dci_size(nr_dci_format_e format,
|
||||||
nr_rnti_type_e rnti,
|
nr_rnti_type_e rnti,
|
||||||
NR_BWP_PARMS* bwp,
|
NR_BWP_PARMS* bwp,
|
||||||
@@ -126,10 +131,23 @@ uint8_t nr_get_dci_size(nr_dci_format_e format,
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint8_t nr_generate_dci_top(NR_DCI_ALLOC_t dci_alloc,
|
uint8_t nr_generate_dci_top(NR_DCI_ALLOC_t dci_alloc,
|
||||||
|
uint32_t *gold_pdcch_dmrs,
|
||||||
int32_t** txdataF,
|
int32_t** txdataF,
|
||||||
int16_t amp,
|
int16_t amp,
|
||||||
NR_DL_FRAME_PARMS* frame_parms,
|
NR_DL_FRAME_PARMS* frame_parms,
|
||||||
nfapi_config_request_t* config)
|
nfapi_config_request_t* config)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
uint16_t mod_dmrs[NR_MAX_PDCCH_DMRS_LENGTH<<2];
|
||||||
|
|
||||||
|
/// DMRS BPSK modulation
|
||||||
|
for (int m=0; m<NR_MAX_PDCCH_DMRS_LENGTH; m++) {
|
||||||
|
mod_dmrs[m<<1] = nr_mod_table[((NR_MOD_TABLE_BPSK_OFFSET + ((gold_pdcch_dmrs[m>>5]&(1<<(m&0x1f)))>>(m&0x1f)))<<1)];
|
||||||
|
mod_dmrs[(m<<1)+1] = nr_mod_table[((NR_MOD_TABLE_BPSK_OFFSET + ((gold_pdcch_dmrs[m>>5]&(1<<(m&0x1f)))>>(m&0x1f)))<<1) + 1];
|
||||||
|
#ifdef DEBUG_PBCH_DMRS
|
||||||
|
printf("m %d mod_dmrs %d %d\n", m, mod_dmrs[2*m], mod_dmrs[2*m+1]);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,9 +76,12 @@ typedef struct {
|
|||||||
} nr_pdcch_coreset_params_t;
|
} nr_pdcch_coreset_params_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
uint8_t first_slot;
|
||||||
|
uint8_t nb_slots;
|
||||||
|
uint8_t sfn_mod2;
|
||||||
nr_pdcch_ss_params_t ss_params;
|
nr_pdcch_ss_params_t ss_params;
|
||||||
nr_pdcch_coreset_params_t coreset_params;
|
nr_pdcch_coreset_params_t coreset_params;
|
||||||
} nr_pdcch_params_t;
|
} nr_pdcch_vars_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/// Length of DCI in bits
|
/// Length of DCI in bits
|
||||||
@@ -100,10 +103,11 @@ typedef struct {
|
|||||||
|
|
||||||
uint8_t nr_get_dci_size(nr_dci_format_e format,
|
uint8_t nr_get_dci_size(nr_dci_format_e format,
|
||||||
nr_rnti_type_e rnti,
|
nr_rnti_type_e rnti,
|
||||||
NR_BWP_PARMS bwp,
|
NR_BWP_PARMS* bwp,
|
||||||
nfapi_config_request_t* config);
|
nfapi_config_request_t* config);
|
||||||
|
|
||||||
uint8_t nr_generate_dci_top(NR_DCI_ALLOC_t dci_alloc,
|
uint8_t nr_generate_dci_top(NR_DCI_ALLOC_t dci_alloc,
|
||||||
|
uint32_t *gold_pdcch_dmrs,
|
||||||
int32_t** txdataF,
|
int32_t** txdataF,
|
||||||
int16_t amp,
|
int16_t amp,
|
||||||
NR_DL_FRAME_PARMS* frame_parms,
|
NR_DL_FRAME_PARMS* frame_parms,
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs,
|
|||||||
{
|
{
|
||||||
int k,l;
|
int k,l;
|
||||||
int16_t a;
|
int16_t a;
|
||||||
int16_t mod_dmrs[2 * NR_PBCH_DMRS_LENGTH];
|
int16_t mod_dmrs[NR_PBCH_DMRS_LENGTH<<2];
|
||||||
|
|
||||||
LOG_I(PHY, "PBCH DMRS mapping started at symbol %d shift %d\n", ssb_start_symbol+1, nushift);
|
LOG_I(PHY, "PBCH DMRS mapping started at symbol %d shift %d\n", ssb_start_symbol+1, nushift);
|
||||||
|
|
||||||
|
|||||||
@@ -290,6 +290,9 @@ typedef struct PHY_VARS_gNB_s {
|
|||||||
/// PBCH DMRS sequence
|
/// PBCH DMRS sequence
|
||||||
uint32_t nr_gold_pbch_dmrs[2][64][NR_PBCH_DMRS_LENGTH_DWORD];
|
uint32_t nr_gold_pbch_dmrs[2][64][NR_PBCH_DMRS_LENGTH_DWORD];
|
||||||
|
|
||||||
|
/// PDCCH DMRS sequence
|
||||||
|
uint32_t **nr_gold_pdcch_dmrs[NR_MAX_PDCCH_DMRS_LENGTH_DWORD];
|
||||||
|
|
||||||
/// Indicator set to 0 after first SR
|
/// Indicator set to 0 after first SR
|
||||||
uint8_t first_sr[NUMBER_OF_UE_MAX];
|
uint8_t first_sr[NUMBER_OF_UE_MAX];
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,9 @@
|
|||||||
#define NR_PBCH_DMRS_LENGTH 144
|
#define NR_PBCH_DMRS_LENGTH 144
|
||||||
#define NR_PBCH_DMRS_LENGTH_DWORD 5 // roundup(NR_PBCH_DMRS_LENGTH/32)
|
#define NR_PBCH_DMRS_LENGTH_DWORD 5 // roundup(NR_PBCH_DMRS_LENGTH/32)
|
||||||
|
|
||||||
|
#define NR_MAX_PDCCH_DMRS_LENGTH 100
|
||||||
|
#define NR_MAX_PDCCH_DMRS_LENGTH_DWORD 5
|
||||||
|
|
||||||
#define NR_MAX_NUM_BWP 4
|
#define NR_MAX_NUM_BWP 4
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@@ -129,6 +132,8 @@ typedef struct NR_DL_FRAME_PARMS {
|
|||||||
uint16_t symbols_per_slot;
|
uint16_t symbols_per_slot;
|
||||||
/// Number of slots per subframe
|
/// Number of slots per subframe
|
||||||
uint16_t slots_per_subframe;
|
uint16_t slots_per_subframe;
|
||||||
|
/// Number of slots per frame
|
||||||
|
uint16_t slots_per_frame;
|
||||||
/// Number of samples in a subframe
|
/// Number of samples in a subframe
|
||||||
uint32_t samples_per_subframe;
|
uint32_t samples_per_subframe;
|
||||||
/// Number of OFDM/SC-FDMA symbols in one subframe (to be modified to account for potential different in UL/DL)
|
/// Number of OFDM/SC-FDMA symbols in one subframe (to be modified to account for potential different in UL/DL)
|
||||||
|
|||||||
@@ -55,15 +55,15 @@ nr_subframe_t nr_subframe_select(nfapi_config_request_t *cfg,unsigned char subfr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void nr_fill_pdcch_params(nr_pdcch_params_t *pdcch_params,
|
void nr_get_coreset_and_ss_params(nr_pdcch_vars_t *pdcch_vars,
|
||||||
nfapi_config_request_t* config,
|
uint8_t mu,
|
||||||
uint8_t ssb_idx)
|
uint8_t ssb_idx)
|
||||||
{
|
{
|
||||||
nr_pdcch_coreset_params_t *coreset_params = &pdcch_params->coreset_params;
|
nr_pdcch_coreset_params_t *coreset_params = &pdcch_vars->coreset_params;
|
||||||
nr_pdcch_ss_params_t *ss_params = &pdcch_params->ss_params;
|
nr_pdcch_ss_params_t *ss_params = &pdcch_vars->ss_params;
|
||||||
|
|
||||||
// the switch case below assumes that only the cases where the SSB and the PDCCH have the same SCS are supported along with type 1 PDCCH/ mux pattern 1 and FR1
|
// the switch case below assumes that only the cases where the SSB and the PDCCH have the same SCS are supported along with type 1 PDCCH/ mux pattern 1 and FR1
|
||||||
switch(config->subframe_config.numerology_index_mu.value) {
|
switch(mu) {
|
||||||
|
|
||||||
case NR_MU_0:
|
case NR_MU_0:
|
||||||
break;
|
break;
|
||||||
@@ -87,7 +87,25 @@ void nr_fill_pdcch_params(nr_pdcch_params_t *pdcch_params,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
AssertFatal(1==0,"Invalid PDCCH numerology index %d", config->subframe_config.numerology_index_mu.value);
|
AssertFatal(1==0,"Invalid PDCCH numerology index %d\n", mu);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void nr_get_pdcch_type_0_monitoring_period(nr_pdcch_vars_t *pdcch_vars,
|
||||||
|
uint8_t mu,
|
||||||
|
uint8_t nb_slots_per_frame,
|
||||||
|
uint8_t ssb_idx)
|
||||||
|
{
|
||||||
|
uint8_t O = pdcch_vars->ss_params.param_O, M = pdcch_vars->ss_params.param_M;
|
||||||
|
|
||||||
|
if (pdcch_vars->coreset_params.mux_pattern == nr_pdcch_mux_pattern_type_1) {
|
||||||
|
pdcch_vars->nb_slots = 2;
|
||||||
|
pdcch_vars->sfn_mod2 = ((uint8_t)(floor( (O*pow(2, mu) + floor(ssb_idx*M)) / nb_slots_per_frame )) & 1)? 1 : 0;
|
||||||
|
pdcch_vars->first_slot = (uint8_t)(O*pow(2, mu) + floor(ssb_idx*M)) % nb_slots_per_frame;
|
||||||
|
}
|
||||||
|
else { //nr_pdcch_mux_pattern_type_2, nr_pdcch_mux_pattern_type_3
|
||||||
|
pdcch_vars->nb_slots = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ extern uint8_t nfapi_mode;
|
|||||||
int return_ssb_type(nfapi_config_request_t *cfg)
|
int return_ssb_type(nfapi_config_request_t *cfg)
|
||||||
{
|
{
|
||||||
int mu = cfg->subframe_config.numerology_index_mu.value;
|
int mu = cfg->subframe_config.numerology_index_mu.value;
|
||||||
nr_numerology_index_e ssb_type;
|
nr_ssb_type_e ssb_type;
|
||||||
|
|
||||||
switch(mu) {
|
switch(mu) {
|
||||||
|
|
||||||
@@ -181,5 +181,9 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
|
|||||||
nr_common_signal_procedures(gNB,frame, subframe);
|
nr_common_signal_procedures(gNB,frame, subframe);
|
||||||
//if (frame == 9)
|
//if (frame == 9)
|
||||||
//write_output("txdataF.m","txdataF",gNB->common_vars.txdataF[aa],fp->samples_per_frame_wCP, 1, 1);
|
//write_output("txdataF.m","txdataF",gNB->common_vars.txdataF[aa],fp->samples_per_frame_wCP, 1, 1);
|
||||||
|
|
||||||
|
//temporary DCI generation test
|
||||||
|
NR_DCI_ALLOC_t dci_alloc;
|
||||||
|
nr_generate_dci_top(dci_alloc, gNB->nr_gold_pdcch_dmrs[0][0],gNB->common_vars.txdataF, 512, fp, cfg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,8 +41,12 @@ void nr_feptx_ofdm(RU_t *ru);
|
|||||||
void nr_feptx_ofdm_2thread(RU_t *ru);
|
void nr_feptx_ofdm_2thread(RU_t *ru);
|
||||||
void nr_feptx0(RU_t *ru,int slot);
|
void nr_feptx0(RU_t *ru,int slot);
|
||||||
|
|
||||||
void nr_fill_pdcch_params(nr_pdcch_params_t *pdcch_params,
|
void nr_get_coreset_and_ss_params(nr_pdcch_vars_t *pdcch_params,
|
||||||
nfapi_config_request_t* config,
|
uint8_t mu,
|
||||||
uint8_t ssb_idx);
|
uint8_t ssb_idx);
|
||||||
|
void nr_get_pdcch_type_0_monitoring_period(nr_pdcch_vars_t *pdcch_vars,
|
||||||
|
uint8_t mu,
|
||||||
|
uint8_t nb_slots_per_frame,
|
||||||
|
uint8_t ssb_idx);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user