Merge remote-tracking branch 'origin/develop' into tdd25period_for_MR
This commit is contained in:
@@ -307,62 +307,76 @@ void nr_interleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f)
|
||||
|
||||
|
||||
void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, int16_t *e,int16_t *f)
|
||||
{
|
||||
{
|
||||
|
||||
int16_t *e1,*e2,*e3,*e4,*e5,*e6,*e7;
|
||||
|
||||
switch(Qm) {
|
||||
case 2:
|
||||
e1=e+(E/2);
|
||||
for (int j = 0,j2=0; j< E/2; j+=2,j2+=4){
|
||||
e[j] = f[j2];
|
||||
e1[j] = f[j2+1];
|
||||
e[j+1] = f[j2+2];
|
||||
e1[j+1] = f[j2+3];
|
||||
{
|
||||
AssertFatal(E%2==0,"");
|
||||
int16_t *e1=e+(E/2);
|
||||
int16_t *end=f+E-1;
|
||||
while( f<end ){
|
||||
*e++ = *f++;
|
||||
*e1++ = *f++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
e1=e+(E/4);
|
||||
e2=e1+(E/4);
|
||||
e3=e2+(E/4);
|
||||
for (int j = 0,j2=0; j< E/4; j++,j2+=4){
|
||||
e[j] = f[j2];
|
||||
e1[j] = f[j2+1];
|
||||
e2[j] = f[j2+2];
|
||||
e3[j] = f[j2+3];
|
||||
{
|
||||
AssertFatal(E%4==0,"");
|
||||
int16_t *e1=e+(E/4);
|
||||
int16_t *e2=e1+(E/4);
|
||||
int16_t *e3=e2+(E/4);
|
||||
int16_t *end=f+E-3;
|
||||
while( f<end ){
|
||||
*e++ = *f++;
|
||||
*e1++ = *f++;
|
||||
*e2++ = *f++;
|
||||
*e3++ = *f++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
e1=e+(E/6);
|
||||
e2=e1+(E/6);
|
||||
e3=e2+(E/6);
|
||||
e4=e3+(E/6);
|
||||
e5=e4+(E/6);
|
||||
for (int j = 0,j2=0; j< E/6; j++,j2+=6){
|
||||
e[j] = f[j2];
|
||||
e1[j] = f[j2+1];
|
||||
e2[j] = f[j2+2];
|
||||
e3[j] = f[j2+3];
|
||||
e4[j] = f[j2+4];
|
||||
e5[j] = f[j2+5];
|
||||
{
|
||||
AssertFatal(E%6==0,"");
|
||||
int16_t *e1=e+(E/6);
|
||||
int16_t *e2=e1+(E/6);
|
||||
int16_t *e3=e2+(E/6);
|
||||
int16_t *e4=e3+(E/6);
|
||||
int16_t *e5=e4+(E/6);
|
||||
int16_t *end=f+E-5;
|
||||
while( f<end ){
|
||||
*e++ = *f++;
|
||||
*e1++ = *f++;
|
||||
*e2++ = *f++;
|
||||
*e3++ = *f++;
|
||||
*e4++ = *f++;
|
||||
*e5++ = *f++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 8:
|
||||
e1=e+(E/8);
|
||||
e2=e1+(E/8);
|
||||
e3=e2+(E/8);
|
||||
e4=e3+(E/8);
|
||||
e5=e4+(E/8);
|
||||
e6=e5+(E/8);
|
||||
e7=e6+(E/8);
|
||||
for (int j = 0,j2=0; j< E/8; j++,j2+=8){
|
||||
e[j] = f[j2];
|
||||
e1[j] = f[j2+1];
|
||||
e2[j] = f[j2+2];
|
||||
e3[j] = f[j2+3];
|
||||
e4[j] = f[j2+4];
|
||||
e5[j] = f[j2+5];
|
||||
e6[j] = f[j2+6];
|
||||
e7[j] = f[j2+7];
|
||||
{
|
||||
AssertFatal(E%8==0,"");
|
||||
int16_t *e1=e+(E/8);
|
||||
int16_t *e2=e1+(E/8);
|
||||
int16_t *e3=e2+(E/8);
|
||||
int16_t *e4=e3+(E/8);
|
||||
int16_t *e5=e4+(E/8);
|
||||
int16_t *e6=e5+(E/8);
|
||||
int16_t *e7=e6+(E/8);
|
||||
int16_t *end=f+E-7;
|
||||
while( f<end ){
|
||||
*e++ = *f++;
|
||||
*e1++ = *f++;
|
||||
*e2++ = *f++;
|
||||
*e3++ = *f++;
|
||||
*e4++ = *f++;
|
||||
*e5++ = *f++;
|
||||
*e6++ = *f++;
|
||||
*e7++ = *f++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -87,7 +87,7 @@ if ((Kprime%Kb) > 0)
|
||||
else
|
||||
Z = (Kprime/Kb);
|
||||
|
||||
LOG_D(PHY,"nr segmetation B %u Bprime %u Kprime %u z %u \n", B, Bprime, Kprime, Z);
|
||||
LOG_D(PHY,"nr segmentation B %u Bprime %u Kprime %u z %u \n", B, Bprime, Kprime, Z);
|
||||
|
||||
if (Z <= 2) {
|
||||
*K = 2;
|
||||
|
||||
@@ -159,7 +159,7 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
|
||||
NR_UE_COMMON *const common_vars = &ue->common_vars;
|
||||
NR_UE_PBCH **const pbch_vars = ue->pbch_vars;
|
||||
NR_UE_PRACH **const prach_vars = ue->prach_vars;
|
||||
int i,j,slot,symb, gNB_id, th_id;
|
||||
int i,slot,symb, gNB_id, th_id;
|
||||
|
||||
NR_UE_SRS **const srs_vars = ue->srs_vars;
|
||||
|
||||
@@ -359,35 +359,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
|
||||
ue->nr_srs_info->srs_estimated_channel_time_shifted[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
|
||||
}
|
||||
|
||||
// 100 PRBs * 12 REs/PRB * 4 PDCCH SYMBOLS * 2 LLRs/RE
|
||||
for (th_id=0; th_id<RX_NB_TH_MAX; th_id++) {
|
||||
ue->pdcch_vars[th_id][gNB_id]->llr = (int16_t *)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
|
||||
ue->pdcch_vars[th_id][gNB_id]->llr16 = (int16_t *)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
|
||||
ue->pdcch_vars[th_id][gNB_id]->wbar = (int16_t *)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
|
||||
ue->pdcch_vars[th_id][gNB_id]->e_rx = (int16_t *)malloc16_clear( 4*2*100*12 );
|
||||
ue->pdcch_vars[th_id][gNB_id]->rxdataF_comp = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
|
||||
ue->pdcch_vars[th_id][gNB_id]->rho = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
|
||||
ue->pdcch_vars[th_id][gNB_id]->rxdataF_ext = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
|
||||
ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates_ext = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
|
||||
// Channel estimates
|
||||
ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates = (int32_t **)malloc16_clear(4*fp->nb_antennas_rx*sizeof(int32_t *));
|
||||
ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates_time = (int32_t **)malloc16_clear(4*fp->nb_antennas_rx*sizeof(int32_t *));
|
||||
|
||||
for (i=0; i<fp->nb_antennas_rx; i++) {
|
||||
ue->pdcch_vars[th_id][gNB_id]->rho[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*(100*12*4));
|
||||
|
||||
for (j=0; j<4; j++) {
|
||||
int idx = (j*fp->nb_antennas_rx)+i;
|
||||
ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->symbols_per_slot*(fp->ofdm_symbol_size+LTE_CE_FILTER_LENGTH) );
|
||||
ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates_time[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 );
|
||||
// size_t num = 7*2*fp->N_RB_DL*12;
|
||||
size_t num = 4*273*12; // 4 symbols, 100 PRBs, 12 REs per PRB
|
||||
ue->pdcch_vars[th_id][gNB_id]->rxdataF_comp[idx] = (int32_t *)malloc16_clear(sizeof(int32_t) * num);
|
||||
ue->pdcch_vars[th_id][gNB_id]->rxdataF_ext[idx] = (int32_t *)malloc16_clear(sizeof(int32_t) * num);
|
||||
ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates_ext[idx] = (int32_t *)malloc16_clear(sizeof(int32_t) * num);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// RACH
|
||||
prach_vars[gNB_id]->prachF = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) );
|
||||
@@ -485,27 +456,6 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
|
||||
for (int gNB_id = 0; gNB_id < ue->n_connected_gNB; gNB_id++) {
|
||||
|
||||
for (int th_id = 0; th_id < RX_NB_TH_MAX; th_id++) {
|
||||
for (int i = 0; i < fp->nb_antennas_rx; i++) {
|
||||
for (int j = 0; j < 4; j++) {
|
||||
int idx = j * fp->nb_antennas_rx + i;
|
||||
free_and_zero(ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates[idx]);
|
||||
free_and_zero(ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates_time[idx]);
|
||||
free_and_zero(ue->pdcch_vars[th_id][gNB_id]->rxdataF_comp[idx]);
|
||||
free_and_zero(ue->pdcch_vars[th_id][gNB_id]->rxdataF_ext[idx]);
|
||||
free_and_zero(ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates_ext[idx]);
|
||||
}
|
||||
free_and_zero(ue->pdcch_vars[th_id][gNB_id]->rho[i]);
|
||||
}
|
||||
free_and_zero(ue->pdcch_vars[th_id][gNB_id]->llr);
|
||||
free_and_zero(ue->pdcch_vars[th_id][gNB_id]->llr16);
|
||||
free_and_zero(ue->pdcch_vars[th_id][gNB_id]->wbar);
|
||||
free_and_zero(ue->pdcch_vars[th_id][gNB_id]->e_rx);
|
||||
free_and_zero(ue->pdcch_vars[th_id][gNB_id]->rxdataF_comp);
|
||||
free_and_zero(ue->pdcch_vars[th_id][gNB_id]->rho);
|
||||
free_and_zero(ue->pdcch_vars[th_id][gNB_id]->rxdataF_ext);
|
||||
free_and_zero(ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates_ext);
|
||||
free_and_zero(ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates);
|
||||
free_and_zero(ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates_time);
|
||||
|
||||
free_and_zero(ue->pdcch_vars[th_id][gNB_id]);
|
||||
}
|
||||
|
||||
@@ -102,7 +102,7 @@ int lte_est_freq_offset(int **dl_ch_estimates,
|
||||
{
|
||||
|
||||
int ch_offset, omega, dl_ch_shift;
|
||||
struct complex16 omega_cpx;
|
||||
c16_t omega_cpx;
|
||||
double phase_offset;
|
||||
int freq_offset_est;
|
||||
unsigned char aa;
|
||||
@@ -142,8 +142,8 @@ int lte_est_freq_offset(int **dl_ch_estimates,
|
||||
// printf("Computing freq_offset\n");
|
||||
omega = dot_product(dl_ch,dl_ch_prev,(frame_parms->N_RB_DL/2 - 1)*12,dl_ch_shift);
|
||||
//omega = dot_product(dl_ch,dl_ch_prev,frame_parms->ofdm_symbol_size,15);
|
||||
omega_cpx.r = ((struct complex16*) &omega)->r;
|
||||
omega_cpx.i = ((struct complex16*) &omega)->i;
|
||||
omega_cpx.r = ((c16_t*) &omega)->r;
|
||||
omega_cpx.i = ((c16_t*) &omega)->i;
|
||||
|
||||
dl_ch = (int16_t *)&dl_ch_estimates[aa][(((frame_parms->N_RB_DL/2) + 1)*12) + ch_offset];
|
||||
|
||||
@@ -155,8 +155,8 @@ int lte_est_freq_offset(int **dl_ch_estimates,
|
||||
// calculate omega = angle(conj(dl_ch)*dl_ch_prev))
|
||||
omega = dot_product(dl_ch,dl_ch_prev,((frame_parms->N_RB_DL/2) - 1)*12,dl_ch_shift);
|
||||
|
||||
omega_cpx.r += ((struct complex16*) &omega)->r;
|
||||
omega_cpx.i += ((struct complex16*) &omega)->i;
|
||||
omega_cpx.r += ((c16_t*) &omega)->r;
|
||||
omega_cpx.i += ((c16_t*) &omega)->i;
|
||||
|
||||
// phase_offset += atan2((double)omega_cpx->i,(double)omega_cpx->r);
|
||||
phase_offset += atan2((double)omega_cpx.i,(double)omega_cpx.r);
|
||||
@@ -195,7 +195,7 @@ int lte_mbsfn_est_freq_offset(int **dl_ch_estimates,
|
||||
{
|
||||
|
||||
int ch_offset, omega, dl_ch_shift;
|
||||
struct complex16 *omega_cpx;
|
||||
c16_t *omega_cpx;
|
||||
double phase_offset;
|
||||
int freq_offset_est;
|
||||
unsigned char aa;
|
||||
@@ -234,7 +234,7 @@ int lte_mbsfn_est_freq_offset(int **dl_ch_estimates,
|
||||
// printf("Computing freq_offset\n");
|
||||
omega = dot_product(dl_ch,dl_ch_prev,(frame_parms->N_RB_DL/2 - 1)*12,dl_ch_shift);
|
||||
//omega = dot_product(dl_ch,dl_ch_prev,frame_parms->ofdm_symbol_size,15);
|
||||
omega_cpx = (struct complex16*) ω
|
||||
omega_cpx = (c16_t*) ω
|
||||
|
||||
// printf("omega (%d,%d)\n",omega_cpx->r,omega_cpx->i);
|
||||
|
||||
@@ -247,8 +247,8 @@ int lte_mbsfn_est_freq_offset(int **dl_ch_estimates,
|
||||
|
||||
// calculate omega = angle(conj(dl_ch)*dl_ch_prev))
|
||||
omega = dot_product(dl_ch,dl_ch_prev,((frame_parms->N_RB_DL/2) - 1)*12,dl_ch_shift);
|
||||
omega_cpx->r += ((struct complex16*) &omega)->r;
|
||||
omega_cpx->i += ((struct complex16*) &omega)->i;
|
||||
omega_cpx->r += ((c16_t*) &omega)->r;
|
||||
omega_cpx->i += ((c16_t*) &omega)->i;
|
||||
// phase_offset += atan2((double)omega_cpx->i,(double)omega_cpx->r);
|
||||
phase_offset += atan2((double)omega_cpx->i,(double)omega_cpx->r);
|
||||
// printf("omega (%d,%d) -> %f\n",omega_cpx->r,omega_cpx->i,phase_offset);
|
||||
|
||||
@@ -34,9 +34,9 @@
|
||||
// Note: this is for prototype of generate_drs_pusch (OTA synchronization of RRUs)
|
||||
#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
|
||||
|
||||
static struct complex16 *primary_synch0_time __attribute__((aligned(32)));
|
||||
static struct complex16 *primary_synch1_time __attribute__((aligned(32)));
|
||||
static struct complex16 *primary_synch2_time __attribute__((aligned(32)));
|
||||
static c16_t *primary_synch0_time __attribute__((aligned(32)));
|
||||
static c16_t *primary_synch1_time __attribute__((aligned(32)));
|
||||
static c16_t *primary_synch2_time __attribute__((aligned(32)));
|
||||
|
||||
static void doIdft(int size, short *in, short *out) {
|
||||
switch (size) {
|
||||
@@ -67,7 +67,7 @@ static void doIdft(int size, short *in, short *out) {
|
||||
}
|
||||
}
|
||||
|
||||
static void copyPrimary( struct complex16 *out, struct complex16 *in, int ofdmSize) {
|
||||
static void copyPrimary( c16_t *out, struct complex16 *in, int ofdmSize) {
|
||||
int k=ofdmSize-36;
|
||||
|
||||
for (int i=0; i<72; i++) {
|
||||
@@ -83,20 +83,20 @@ static void copyPrimary( struct complex16 *out, struct complex16 *in, int ofdmSi
|
||||
}
|
||||
|
||||
int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) { // LTE_UE_COMMON *common_vars
|
||||
struct complex16 syncF_tmp[2048]__attribute__((aligned(32)))= {{0}};
|
||||
c16_t syncF_tmp[2048]__attribute__((aligned(32)))= {{0}};
|
||||
int sz=frame_parms->ofdm_symbol_size*sizeof(*primary_synch0_time);
|
||||
AssertFatal( NULL != (primary_synch0_time = (struct complex16 *)malloc16(sz)),"");
|
||||
AssertFatal( NULL != (primary_synch0_time = (c16_t *)malloc16(sz)),"");
|
||||
bzero(primary_synch0_time,sz);
|
||||
AssertFatal( NULL != (primary_synch1_time = (struct complex16 *)malloc16(sz)),"");
|
||||
AssertFatal( NULL != (primary_synch1_time = (c16_t *)malloc16(sz)),"");
|
||||
bzero(primary_synch1_time,sz);
|
||||
AssertFatal( NULL != (primary_synch2_time = (struct complex16 *)malloc16(sz)),"");
|
||||
AssertFatal( NULL != (primary_synch2_time = (c16_t *)malloc16(sz)),"");
|
||||
bzero(primary_synch2_time,sz);
|
||||
// generate oversampled sync_time sequences
|
||||
copyPrimary( syncF_tmp, (struct complex16 *) primary_synch0, frame_parms->ofdm_symbol_size);
|
||||
copyPrimary( syncF_tmp, (c16_t *) primary_synch0, frame_parms->ofdm_symbol_size);
|
||||
doIdft(frame_parms->N_RB_DL, (short *)syncF_tmp,(short *)primary_synch0_time);
|
||||
copyPrimary( syncF_tmp, (struct complex16 *) primary_synch1, frame_parms->ofdm_symbol_size);
|
||||
copyPrimary( syncF_tmp, (c16_t *) primary_synch1, frame_parms->ofdm_symbol_size);
|
||||
doIdft(frame_parms->N_RB_DL, (short *)syncF_tmp,(short *)primary_synch1_time);
|
||||
copyPrimary( syncF_tmp, (struct complex16 *) primary_synch2, frame_parms->ofdm_symbol_size);
|
||||
copyPrimary( syncF_tmp, (c16_t *) primary_synch2, frame_parms->ofdm_symbol_size);
|
||||
doIdft(frame_parms->N_RB_DL, (short *)syncF_tmp,(short *)primary_synch2_time);
|
||||
|
||||
if ( LOG_DUMPFLAG(DEBUG_LTEESTIM)){
|
||||
|
||||
@@ -2237,7 +2237,7 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
|
||||
int P1_SHIFT[13],P2_SHIFT[13];
|
||||
int offset,nushiftmod3;
|
||||
|
||||
uint8_t get_pmi_temp;
|
||||
int get_pmi_temp;
|
||||
|
||||
MIMO_mode_t mimo_mode = -1;
|
||||
uint8_t mprime=0,Ns;
|
||||
|
||||
@@ -56,7 +56,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
|
||||
uint8_t ce_level
|
||||
) {
|
||||
int i;
|
||||
lte_frame_type_t frame_type;
|
||||
frame_type_t frame_type;
|
||||
uint16_t rootSequenceIndex;
|
||||
uint8_t prach_ConfigIndex;
|
||||
uint8_t Ncs_config;
|
||||
|
||||
@@ -399,7 +399,7 @@ void compute_prach_seq(uint16_t rootSequenceIndex,
|
||||
uint8_t prach_ConfigIndex,
|
||||
uint8_t zeroCorrelationZoneConfig,
|
||||
uint8_t highSpeedFlag,
|
||||
lte_frame_type_t frame_type,
|
||||
frame_type_t frame_type,
|
||||
uint32_t X_u[64][839]) {
|
||||
// Compute DFT of x_u => X_u[k] = x_u(inv(u)*k)^* X_u[k] = exp(j\pi u*inv(u)*k*(inv(u)*k+1)/N_ZC)
|
||||
unsigned int k,inv_u,i,NCS=0,num_preambles;
|
||||
|
||||
@@ -81,7 +81,7 @@ void compute_prach_seq(uint16_t rootSequenceIndex,
|
||||
uint8_t prach_ConfigIndex,
|
||||
uint8_t zeroCorrelationZoneConfig,
|
||||
uint8_t highSpeedFlag,
|
||||
lte_frame_type_t frame_type,
|
||||
frame_type_t frame_type,
|
||||
uint32_t X_u[64][839]);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -224,7 +224,7 @@ uint8_t get_num_prach_tdd(module_id_t Mod_id);
|
||||
@returns 0-1 accordingly
|
||||
*/
|
||||
/*
|
||||
uint8_t get_prach_fmt(uint8_t prach_ConfigIndex,lte_frame_type_t frame_type);
|
||||
uint8_t get_prach_fmt(uint8_t prach_ConfigIndex,frame_type_t frame_type);
|
||||
*/
|
||||
|
||||
/*!
|
||||
@@ -247,7 +247,7 @@ void compute_prach_seq(uint16_t rootSequenceIndex,
|
||||
uint8_t prach_ConfigIndex,
|
||||
uint8_t zeroCorrelationZoneConfig,
|
||||
uint8_t highSpeedFlag,
|
||||
lte_frame_type_t frame_type,
|
||||
frame_type_t frame_type,
|
||||
uint32_t X_u[64][839]);
|
||||
|
||||
|
||||
@@ -299,7 +299,7 @@ uint64_t pmi2hex_2Ar1(uint32_t pmi);
|
||||
|
||||
uint64_t pmi2hex_2Ar2(uint32_t pmi);
|
||||
|
||||
uint8_t get_pmi(uint8_t N_RB_DL,MIMO_mode_t mode, uint32_t pmi_alloc,uint16_t rb);
|
||||
uint8_t get_pmi(int N_RB_DL,MIMO_mode_t mode, uint32_t pmi_alloc,uint16_t rb);
|
||||
|
||||
// DL power control functions
|
||||
double get_pa_dB(uint8_t pa);
|
||||
|
||||
@@ -64,7 +64,7 @@ extern uint16_t beta_cqi[16];
|
||||
extern uint16_t beta_ri[16];
|
||||
extern uint16_t beta_ack[16];
|
||||
|
||||
void extract_dci1A_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted)
|
||||
void extract_dci1A_info(uint8_t N_RB_DL, frame_type_t frame_type, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted)
|
||||
{
|
||||
uint8_t harq_pid=0;
|
||||
uint32_t rballoc=0;
|
||||
@@ -182,7 +182,7 @@ void extract_dci1A_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, void *dci_
|
||||
pdci_info_extarcted->dai = dai;
|
||||
}
|
||||
|
||||
void extract_dci1C_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted)
|
||||
void extract_dci1C_info(uint8_t N_RB_DL, frame_type_t frame_type, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted)
|
||||
{
|
||||
|
||||
uint32_t rballoc=0;
|
||||
@@ -222,7 +222,7 @@ void extract_dci1C_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, void *dci_
|
||||
pdci_info_extarcted->Ngap = Ngap;
|
||||
}
|
||||
|
||||
void extract_dci1_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted)
|
||||
void extract_dci1_info(uint8_t N_RB_DL, frame_type_t frame_type, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted)
|
||||
{
|
||||
|
||||
uint32_t rballoc=0;
|
||||
@@ -329,7 +329,7 @@ void extract_dci1_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, void *dci_p
|
||||
|
||||
}
|
||||
|
||||
void extract_dci2_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, uint8_t nb_antenna_ports_eNB, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted)
|
||||
void extract_dci2_info(uint8_t N_RB_DL, frame_type_t frame_type, uint8_t nb_antenna_ports_eNB, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted)
|
||||
{
|
||||
|
||||
uint32_t rballoc=0;
|
||||
@@ -615,7 +615,7 @@ void extract_dci2_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, uint8_t nb_
|
||||
|
||||
}
|
||||
|
||||
void extract_dci2A_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, uint8_t nb_antenna_ports_eNB, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted)
|
||||
void extract_dci2A_info(uint8_t N_RB_DL, frame_type_t frame_type, uint8_t nb_antenna_ports_eNB, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted)
|
||||
{
|
||||
|
||||
uint32_t rballoc=0;
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
|
||||
|
||||
uint8_t get_pmi(uint8_t N_RB_DL, MIMO_mode_t mode, uint32_t pmi_alloc,uint16_t rb)
|
||||
uint8_t get_pmi(int N_RB_DL, MIMO_mode_t mode, uint32_t pmi_alloc,uint16_t rb)
|
||||
{
|
||||
/*
|
||||
MIMO_mode_t mode = dlsch_harq->mimo_mode;
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
//#define PRACH_DEBUG 1
|
||||
|
||||
int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint16_t Nf ) {
|
||||
lte_frame_type_t frame_type = ue->frame_parms.frame_type;
|
||||
frame_type_t frame_type = ue->frame_parms.frame_type;
|
||||
//uint8_t tdd_config = ue->frame_parms.tdd_config;
|
||||
uint16_t rootSequenceIndex = ue->frame_parms.prach_config_common.rootSequenceIndex;
|
||||
uint8_t prach_ConfigIndex = ue->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex;
|
||||
|
||||
@@ -1550,16 +1550,6 @@ uint64_t cqi2hex(uint32_t cqi);
|
||||
|
||||
uint16_t computeRIV(uint16_t N_RB_DL,uint16_t RBstart,uint16_t Lcrbs);
|
||||
|
||||
|
||||
/** \brief This routine extracts a single subband PMI from a bitmap coming from UCI or the pmi_extend function
|
||||
@param N_RB_DL number of resource blocks
|
||||
@param mimo_mode
|
||||
@param pmi_alloc subband PMI bitmap
|
||||
@param rb resource block for which to extract PMI
|
||||
@returns subband PMI
|
||||
*/
|
||||
uint8_t get_pmi(uint8_t N_RB_DL,MIMO_mode_t mode, uint32_t pmi_alloc,uint16_t rb);
|
||||
|
||||
int get_nCCE_offset_l1(int *CCE_table,
|
||||
const unsigned char L,
|
||||
const int nCCE,
|
||||
@@ -1669,7 +1659,7 @@ uint8_t get_num_prach_tdd(module_id_t Mod_id);
|
||||
@param frame_type 0-FDD, 1-TDD
|
||||
@returns 0-1 accordingly
|
||||
*/
|
||||
uint8_t get_prach_fmt(uint8_t prach_ConfigIndex,lte_frame_type_t frame_type);
|
||||
uint8_t get_prach_fmt(uint8_t prach_ConfigIndex,frame_type_t frame_type);
|
||||
|
||||
/*!
|
||||
\brief Helper for MAC, returns frequency index of PRACH resource in TDD for a particular configuration index
|
||||
@@ -1691,7 +1681,7 @@ void compute_prach_seq(uint16_t rootSequenceIndex,
|
||||
uint8_t prach_ConfigIndex,
|
||||
uint8_t zeroCorrelationZoneConfig,
|
||||
uint8_t highSpeedFlag,
|
||||
lte_frame_type_t frame_type,
|
||||
frame_type_t frame_type,
|
||||
uint32_t X_u[64][839]);
|
||||
|
||||
|
||||
|
||||
@@ -107,25 +107,24 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB,int slot, int first_symb,int num_symb
|
||||
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
||||
NR_gNB_COMMON *common_vars = &gNB->common_vars;
|
||||
PHY_MEASUREMENTS_gNB *measurements = &gNB->measurements;
|
||||
int rb, offset, offset0, nb_symb[275], len;
|
||||
int32_t *ul_ch;
|
||||
|
||||
LOG_D(PHY,"slot %d Doing I0 for first_symb %d, num_symb %d\n",slot,first_symb,num_symb);
|
||||
int rb, nb_symb[275]={0};
|
||||
|
||||
memset(measurements->n0_subband_power, 0, sizeof(measurements->n0_subband_power));
|
||||
|
||||
for (int s=first_symb;s<(first_symb+num_symb);s++) {
|
||||
for (rb=0; rb<frame_parms->N_RB_UL; rb++) {
|
||||
|
||||
if (s==first_symb /*&& ((gNB->rb_mask_ul[s][rb>>5]&(1<<(rb&31))) == 0)*/) {
|
||||
nb_symb[rb]=0;
|
||||
for (int aarx=0; aarx<frame_parms->nb_antennas_rx;aarx++)
|
||||
measurements->n0_subband_power[aarx][rb]=0;
|
||||
}
|
||||
offset0 = (slot&3)*(frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size) + (frame_parms->first_carrier_offset + (rb*12))%frame_parms->ofdm_symbol_size;
|
||||
int offset0 = (slot&3)*(frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size) + (frame_parms->first_carrier_offset + (rb*12))%frame_parms->ofdm_symbol_size;
|
||||
if ((gNB->rb_mask_ul[s][rb>>5]&(1<<(rb&31))) == 0) { // check that rb was not used in this subframe
|
||||
nb_symb[rb]++;
|
||||
for (int aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
offset = offset0 + (s*frame_parms->ofdm_symbol_size);
|
||||
ul_ch = &common_vars->rxdataF[aarx][offset];
|
||||
len = 12;
|
||||
int offset = offset0 + (s*frame_parms->ofdm_symbol_size);
|
||||
int32_t *ul_ch = &common_vars->rxdataF[aarx][offset];
|
||||
int len = 12;
|
||||
if (((frame_parms->N_RB_UL&1) == 1) &&
|
||||
(rb==(frame_parms->N_RB_UL>>1))) {
|
||||
len=6;
|
||||
|
||||
@@ -113,12 +113,6 @@ EXTERN int16_t *primary_synchro_time_nr[NUMBER_PSS_SEQUENCE]
|
||||
#endif
|
||||
;
|
||||
|
||||
EXTERN int64_t *pss_corr_ue[NUMBER_PSS_SEQUENCE]
|
||||
#ifdef INIT_VARIABLES_PSS_NR_H
|
||||
= { NULL, NULL, NULL}
|
||||
#endif
|
||||
;
|
||||
|
||||
/* profiling structure */
|
||||
EXTERN time_stats_t generic_time[TIME_LAST];
|
||||
|
||||
|
||||
@@ -268,8 +268,8 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
|
||||
return;
|
||||
}
|
||||
uint16_t sc_per_symbol = (nb_rb + K_ptrs - 1)/K_ptrs;
|
||||
struct complex16 ptrs_p[(1 + sc_per_symbol/4)*4];
|
||||
struct complex16 dmrs_comp_p[(1 + sc_per_symbol/4)*4];
|
||||
c16_t ptrs_p[(1 + sc_per_symbol/4)*4];
|
||||
c16_t dmrs_comp_p[(1 + sc_per_symbol/4)*4];
|
||||
double abs = 0.0;
|
||||
double real = 0.0;
|
||||
double imag = 0.0;
|
||||
@@ -422,7 +422,7 @@ void get_slope_from_estimates(uint8_t start, uint8_t end, int16_t *est_p, double
|
||||
/* estimate from slope */
|
||||
void ptrs_estimate_from_slope(int16_t *error_est, double *slope_p, uint8_t start, uint8_t end)
|
||||
{
|
||||
struct complex16 *error=(struct complex16 *) error_est;
|
||||
c16_t *error=(struct complex16 *) error_est;
|
||||
for(uint8_t i = 1; i< (end -start);i++) {
|
||||
error[start+i].r = error[start].r + (int16_t)(i * slope_p[0]);// real
|
||||
error[start+i].i = error[start].i + (int16_t)(i * slope_p[1]); //imag
|
||||
|
||||
@@ -141,6 +141,7 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
|
||||
polar_encoder_fast((uint64_t*)dci_pdu->Payload, (void*)encoder_output, n_RNTI, 1,
|
||||
NR_POLAR_DCI_MESSAGE_TYPE, dci_pdu->PayloadSizeBits, dci_pdu->AggregationLevel);
|
||||
#ifdef DEBUG_CHANNEL_CODING
|
||||
//debug dump dci
|
||||
printf("polar rnti %x,length %d, L %d\n",n_RNTI, dci_pdu->PayloadSizeBits,pdcch_pdu_rel15->dci_pdu->AggregationLevel);
|
||||
printf("DCI PDU: [0]->0x%lx \t [1]->0x%lx\n",
|
||||
((uint64_t*)dci_pdu->Payload)[0], ((uint64_t*)dci_pdu->Payload)[1]);
|
||||
|
||||
@@ -131,7 +131,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx,
|
||||
start_meas(dlsch_encoding_stats);
|
||||
|
||||
if (nr_dlsch_encoding(gNB,
|
||||
harq->pdu, frame, slot, dlsch, frame_parms,output,tinput,tprep,tparity,toutput,
|
||||
frame, slot, harq, frame_parms,output,tinput,tprep,tparity,toutput,
|
||||
dlsch_rate_matching_stats,
|
||||
dlsch_interleaving_stats,
|
||||
dlsch_segmentation_stats) == -1)
|
||||
@@ -165,6 +165,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx,
|
||||
rel15->dataScramblingId,
|
||||
rel15->rnti,
|
||||
scrambled_output);
|
||||
|
||||
#ifdef DEBUG_DLSCH
|
||||
printf("PDSCH scrambling:\n");
|
||||
for (int i=0; i<encoded_length>>8; i++) {
|
||||
@@ -173,6 +174,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx,
|
||||
printf("\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
stop_meas(dlsch_scrambling_stats);
|
||||
/// Modulation
|
||||
start_meas(dlsch_modulation_stats);
|
||||
|
||||
@@ -78,9 +78,9 @@ int16_t find_nr_dlsch(uint16_t rnti, PHY_VARS_gNB *gNB,find_type_t type);
|
||||
NR_gNB_SCH_STATS_t *find_nr_dlsch_stats(uint16_t rnti, PHY_VARS_gNB *gNB,find_type_t type);
|
||||
|
||||
int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
|
||||
unsigned char *a,int frame,
|
||||
int frame,
|
||||
uint8_t slot,
|
||||
NR_gNB_DLSCH_t *dlsch,
|
||||
NR_DL_gNB_HARQ_t *harq,
|
||||
NR_DL_FRAME_PARMS* frame_parms,
|
||||
unsigned char * output,
|
||||
time_stats_t *tinput,
|
||||
|
||||
@@ -300,10 +300,9 @@ void ldpc8blocks( void *p) {
|
||||
}
|
||||
|
||||
int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
|
||||
unsigned char *a,
|
||||
int frame,
|
||||
uint8_t slot,
|
||||
NR_gNB_DLSCH_t *dlsch,
|
||||
NR_DL_gNB_HARQ_t *harq,
|
||||
NR_DL_FRAME_PARMS *frame_parms,
|
||||
unsigned char * output,
|
||||
time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput,
|
||||
@@ -312,13 +311,12 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
|
||||
encoder_implemparams_t impp;
|
||||
impp.output=output;
|
||||
unsigned int crc=1;
|
||||
NR_DL_gNB_HARQ_t *harq = &dlsch->harq_process;
|
||||
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15 = &harq->pdsch_pdu.pdsch_pdu_rel15;
|
||||
impp.Zc = &dlsch->harq_process.Z;
|
||||
impp.Zc = &harq->Z;
|
||||
float Coderate = 0.0;
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_DLSCH_ENCODING, VCD_FUNCTION_IN);
|
||||
uint32_t A = rel15->TBSize[0]<<3;
|
||||
|
||||
unsigned char *a=harq->pdu;
|
||||
if ( rel15->rnti != SI_RNTI)
|
||||
trace_NRpdu(DIRECTION_DOWNLINK, a, rel15->TBSize[0], 0, WS_C_RNTI, rel15->rnti, frame, slot,0, 0);
|
||||
|
||||
@@ -331,14 +329,14 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
|
||||
stats=&gNB->dlsch_stats[i];
|
||||
}
|
||||
|
||||
if (gNB->dlsch_stats[i].rnti == dlsch->rnti) {
|
||||
if (gNB->dlsch_stats[i].rnti == rel15->rnti) {
|
||||
stats=&gNB->dlsch_stats[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (stats) {
|
||||
stats->rnti = dlsch->rnti;
|
||||
stats->rnti = rel15->rnti;
|
||||
stats->total_bytes_tx += rel15->TBSize[0];
|
||||
stats->current_RI = rel15->nrOfLayers;
|
||||
stats->current_Qm = rel15->qamModOrder[0];
|
||||
|
||||
@@ -245,7 +245,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
||||
* x(l*12+n) = r_u_v_alpha_delta(n)
|
||||
*/
|
||||
// the value of u,v (delta always 0 for PUCCH) has to be calculated according to TS 38.211 Subclause 6.3.2.2.1
|
||||
uint8_t u[2]={0,0},v[2]={0,0};
|
||||
uint8_t u[2]={0},v[2]={0};
|
||||
|
||||
// x_n contains the sequence r_u_v_alpha_delta(n)
|
||||
|
||||
@@ -264,7 +264,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
||||
|
||||
|
||||
AssertFatal(pucch_pdu->nr_of_symbols < 3,"nr_of_symbols %d not allowed\n",pucch_pdu->nr_of_symbols);
|
||||
uint32_t re_offset[2]={0,0};
|
||||
uint32_t re_offset[2]={0};
|
||||
uint8_t l2;
|
||||
|
||||
const int16_t *x_re[2],*x_im[2];
|
||||
@@ -273,16 +273,10 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
||||
x_re[1] = table_5_2_2_2_2_Re[u[1]];
|
||||
x_im[1] = table_5_2_2_2_2_Im[u[1]];
|
||||
|
||||
int16_t xr[1+frame_parms->nb_antennas_rx][1+pucch_pdu->nr_of_symbols][24] __attribute__((aligned(32)));
|
||||
c64_t xr[frame_parms->nb_antennas_rx][pucch_pdu->nr_of_symbols][12] __attribute__((aligned(32)));
|
||||
int64_t xrtmag=0,xrtmag_next=0;
|
||||
uint8_t maxpos=0;
|
||||
uint8_t index=0;
|
||||
for (int l=0; l<pucch_pdu->nr_of_symbols; l++) {
|
||||
for (int aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++) {
|
||||
memset((void*)xr[aarx][l],0,24*sizeof(int16_t));
|
||||
}
|
||||
}
|
||||
int n2;
|
||||
|
||||
for (int l=0; l<pucch_pdu->nr_of_symbols; l++) {
|
||||
l2 = l+pucch_pdu->start_symbol_index;
|
||||
@@ -291,75 +285,68 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
||||
re_offset[l]-=frame_parms->ofdm_symbol_size;
|
||||
|
||||
AssertFatal(re_offset[l]+12 < frame_parms->ofdm_symbol_size,"pucch straddles DC carrier, handle this!\n");
|
||||
int16_t *r;
|
||||
for (int aa=0;aa<frame_parms->nb_antennas_rx;aa++) {
|
||||
r=(int16_t*)&rxdataF[aa][soffset+(l2*frame_parms->ofdm_symbol_size)+re_offset[l]];
|
||||
n2=0;
|
||||
for (n=0;n<12;n++,n2+=2) {
|
||||
xr[aa][l][n2] +=(int16_t)(((int32_t)x_re[l][n]*r[n2]+(int32_t)x_im[l][n]*r[n2+1])>>15);
|
||||
xr[aa][l][n2+1]+=(int16_t)(((int32_t)x_re[l][n]*r[n2+1]-(int32_t)x_im[l][n]*r[n2])>>15);
|
||||
c16_t *r=(c16_t*)&rxdataF[aa][soffset+(l2*frame_parms->ofdm_symbol_size)+re_offset[l]];
|
||||
for (n=0;n<12;n++) {
|
||||
xr[aa][l][n].r = (int32_t)x_re[l][n] * r[n].r + (int32_t)x_im[l][n] * r[n].i;
|
||||
xr[aa][l][n].i = (int32_t)x_re[l][n] * r[n].i - (int32_t)x_im[l][n] * r[n].r;
|
||||
#ifdef DEBUG_NR_PUCCH_RX
|
||||
printf("x (%d,%d), r%d.%d (%d,%d), xr (%d,%d)\n",
|
||||
x_re[l][n],x_im[l][n],l2,re_offset[l],r[n2],r[n2+1],xr[aa][l][n2],xr[aa][l][n2+1]);
|
||||
printf("x (%d,%d), r%d.%d (%d,%d), xr (%lld,%lld)\n",
|
||||
x_re[l][n],x_im[l][n],l2,re_offset[l],r[n].r,r[n].i,xr[aa][l][n].r,xr[aa][l][n].i);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int32_t corr_re[1+frame_parms->nb_antennas_rx][2];
|
||||
int32_t corr_im[1+frame_parms->nb_antennas_rx][2];
|
||||
//int32_t no_corr = 0;
|
||||
int seq_index = 0;
|
||||
int64_t temp;
|
||||
|
||||
for(i=0;i<nr_sequences;i++){
|
||||
|
||||
for (int l=0;l<pucch_pdu->nr_of_symbols;l++) {
|
||||
seq_index = (pucch_pdu->initial_cyclic_shift+
|
||||
mcs[i]+
|
||||
gNB->pucch0_lut.lut[cs_ind][slot][l+pucch_pdu->start_symbol_index])%12;
|
||||
c64_t corr[frame_parms->nb_antennas_rx][2];
|
||||
for (int aa=0;aa<frame_parms->nb_antennas_rx;aa++) {
|
||||
for (int l=0;l<pucch_pdu->nr_of_symbols;l++) {
|
||||
seq_index = (pucch_pdu->initial_cyclic_shift+
|
||||
mcs[i]+
|
||||
gNB->pucch0_lut.lut[cs_ind][slot][l+pucch_pdu->start_symbol_index])%12;
|
||||
#ifdef DEBUG_NR_PUCCH_RX
|
||||
printf("PUCCH symbol %d seq %d, seq_index %d, mcs %d\n",l,i,seq_index,mcs[i]);
|
||||
printf("PUCCH symbol %d seq %d, seq_index %d, mcs %d\n",l,i,seq_index,mcs[i]);
|
||||
#endif
|
||||
for (int aa=0;aa<frame_parms->nb_antennas_rx;aa++) {
|
||||
corr_re[aa][l]=0;
|
||||
corr_im[aa][l]=0;
|
||||
|
||||
n2=0;
|
||||
for (n=0;n<12;n++,n2+=2) {
|
||||
corr_re[aa][l]+=(xr[aa][l][n2]*idft12_re[seq_index][n]+xr[aa][l][n2+1]*idft12_im[seq_index][n])>>15;
|
||||
corr_im[aa][l]+=(xr[aa][l][n2]*idft12_im[seq_index][n]-xr[aa][l][n2+1]*idft12_re[seq_index][n])>>15;
|
||||
corr[aa][l]=(c64_t){0};
|
||||
for (n = 0; n < 12; n++) {
|
||||
corr[aa][l].r += xr[aa][l][n].r * idft12_re[seq_index][n] + xr[aa][l][n].i * idft12_im[seq_index][n];
|
||||
corr[aa][l].i += xr[aa][l][n].r * idft12_im[seq_index][n] - xr[aa][l][n].i * idft12_re[seq_index][n];
|
||||
}
|
||||
corr[aa][l].r >>= 31;
|
||||
corr[aa][l].i >>= 31;
|
||||
}
|
||||
}
|
||||
LOG_D(PHY,"PUCCH IDFT[%d/%d] = (%d,%d)=>%f\n",
|
||||
mcs[i],seq_index,corr_re[0][0],corr_im[0][0],
|
||||
10*log10((double)corr_re[0][0]*corr_re[0][0] + (double)corr_im[0][0]*corr_im[0][0]));
|
||||
LOG_D(PHY,"PUCCH IDFT[%d/%d] = (%ld,%ld)=>%f\n",
|
||||
mcs[i],seq_index,corr[0][0].r,corr[0][0].i,
|
||||
10*log10((double)squaredMod(corr[0][0])));
|
||||
if (pucch_pdu->nr_of_symbols==2)
|
||||
LOG_D(PHY,"PUCCH 2nd symbol IDFT[%d/%d] = (%d,%d)=>%f\n",
|
||||
mcs[i],seq_index,corr_re[0][1],corr_im[0][1],
|
||||
10*log10((double)corr_re[0][1]*corr_re[0][1] + (double)corr_im[0][1]*corr_im[0][1]));
|
||||
LOG_D(PHY,"PUCCH 2nd symbol IDFT[%d/%d] = (%ld,%ld)=>%f\n",
|
||||
mcs[i],seq_index,corr[0][1].r,corr[0][1].i,
|
||||
10*log10((double)squaredMod(corr[0][1])));
|
||||
if (pucch_pdu->freq_hop_flag == 0) {
|
||||
if (pucch_pdu->nr_of_symbols==1) {// non-coherent correlation
|
||||
temp=0;
|
||||
for (int aa=0;aa<frame_parms->nb_antennas_rx;aa++)
|
||||
temp+=(int64_t)corr_re[aa][0]*corr_re[aa][0] + (int64_t)corr_im[aa][0]*corr_im[aa][0];
|
||||
temp+=squaredMod(corr[aa][0]);
|
||||
} else {
|
||||
int64_t corr_re2=0;
|
||||
int64_t corr_im2=0;
|
||||
temp=0;
|
||||
for (int aa=0;aa<frame_parms->nb_antennas_rx;aa++) {
|
||||
corr_re2 = (int64_t)corr_re[aa][0]+corr_re[aa][1];
|
||||
corr_im2 = (int64_t)corr_im[aa][0]+corr_im[aa][1];
|
||||
// coherent combining of 2 symbols and then complex modulus for single-frequency case
|
||||
temp+=corr_re2*corr_re2 + corr_im2*corr_im2;
|
||||
c64_t corr2;
|
||||
csum(corr2, corr[aa][0], corr[aa][1]);
|
||||
// coherent combining of 2 symbols and then complex modulus for single-frequency case
|
||||
temp+=corr2.r*corr2.r + corr2.i*corr2.i;
|
||||
}
|
||||
}
|
||||
} else if (pucch_pdu->freq_hop_flag == 1) {
|
||||
// full non-coherent combining of 2 symbols for frequency-hopping case
|
||||
temp=0;
|
||||
for (int aa=0;aa<frame_parms->nb_antennas_rx;aa++)
|
||||
temp += (int64_t)corr_re[aa][0]*corr_re[aa][0] + (int64_t)corr_im[aa][0]*corr_im[aa][0] + (int64_t)corr_re[aa][1]*corr_re[aa][1] + (int64_t)corr_im[aa][1]*corr_im[aa][1];
|
||||
temp += squaredMod(corr[aa][0]) + squaredMod(corr[aa][1]);
|
||||
}
|
||||
else AssertFatal(1==0,"shouldn't happen\n");
|
||||
|
||||
@@ -371,9 +358,9 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
||||
uci_stats->current_pucch0_stat0 = 0;
|
||||
int64_t temp2=0,temp3=0;;
|
||||
for (int aa=0;aa<frame_parms->nb_antennas_rx;aa++) {
|
||||
temp2 += ((int64_t)corr_re[aa][0]*corr_re[aa][0] + (int64_t)corr_im[aa][0]*corr_im[aa][0]);
|
||||
temp2 += squaredMod(corr[aa][0]);
|
||||
if (pucch_pdu->nr_of_symbols==2)
|
||||
temp3 += ((int64_t)corr_re[aa][1]*corr_re[aa][1] + (int64_t)corr_im[aa][1]*corr_im[aa][1]);
|
||||
temp3 += squaredMod(corr[aa][1]);
|
||||
}
|
||||
uci_stats->current_pucch0_stat0= dB_fixed64(temp2);
|
||||
if ( pucch_pdu->nr_of_symbols==2)
|
||||
@@ -394,7 +381,8 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
||||
uci_stats->pucch0_n01 = gNB->measurements.n0_subband_power_tot_dB[prb_offset[1]];
|
||||
LOG_D(PHY,"n00[%d] = %d, n01[%d] = %d\n",prb_offset[0],uci_stats->pucch0_n00,prb_offset[1],uci_stats->pucch0_n01);
|
||||
// estimate CQI for MAC (from antenna port 0 only)
|
||||
int max_n0 = uci_stats->pucch0_n00>uci_stats->pucch0_n01 ? uci_stats->pucch0_n00:uci_stats->pucch0_n01;
|
||||
int max_n0 = max(gNB->measurements.n0_subband_power_tot_dB[prb_offset[0]],
|
||||
gNB->measurements.n0_subband_power_tot_dB[prb_offset[1]]);
|
||||
int SNRtimes10,sigenergy=0;
|
||||
for (int aa=0;aa<frame_parms->nb_antennas_rx;aa++)
|
||||
sigenergy += signal_energy_nodc(&rxdataF[aa][soffset+
|
||||
@@ -409,8 +397,15 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
||||
uci_stats->pucch0_thres = gNB->pucch0_thres; /* + (10*max_n0);*/
|
||||
bool no_conf=false;
|
||||
if (nr_sequences>1) {
|
||||
if (/*xrtmag_dBtimes10 < (30+xrtmag_next_dBtimes10) ||*/ SNRtimes10 < uci_stats->pucch0_thres)
|
||||
if (/*xrtmag_dBtimes10 < (30+xrtmag_next_dBtimes10) ||*/ SNRtimes10 < uci_stats->pucch0_thres) {
|
||||
no_conf=true;
|
||||
LOG_D(PHY,"%d.%d PUCCH bad confidence: %d threshold, %d, %d, %d\n",
|
||||
frame, slot,
|
||||
uci_stats->pucch0_thres,
|
||||
SNRtimes10,
|
||||
xrtmag_dBtimes10,
|
||||
xrtmag_next_dBtimes10);
|
||||
}
|
||||
}
|
||||
gNB->bad_pucch += no_conf;
|
||||
// first bit of bitmap for sr presence and second bit for acknack presence
|
||||
@@ -424,11 +419,12 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
||||
if (pucch_pdu->bit_len_harq==0) {
|
||||
uci_pdu->harq = NULL;
|
||||
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
|
||||
uci_pdu->sr->sr_confidence_level = no_conf ? 1 : 0;
|
||||
uci_pdu->sr->sr_confidence_level = SNRtimes10 < uci_stats->pucch0_thres;
|
||||
uci_stats->pucch0_sr_trials++;
|
||||
if (xrtmag_dBtimes10>(10*gNB->measurements.n0_power_tot_dB)) {
|
||||
if (xrtmag_dBtimes10>(10*max_n0+100)) {
|
||||
uci_pdu->sr->sr_indication = 1;
|
||||
uci_stats->pucch0_positive_SR++;
|
||||
LOG_D(PHY,"PUCCH0 got positive SR. Cumulative number of positive SR %d\n", uci_stats->pucch0_positive_SR);
|
||||
} else {
|
||||
uci_pdu->sr->sr_indication = 0;
|
||||
}
|
||||
@@ -436,34 +432,49 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
||||
else if (pucch_pdu->bit_len_harq==1) {
|
||||
uci_pdu->harq = calloc(1,sizeof(*uci_pdu->harq));
|
||||
uci_pdu->harq->num_harq = 1;
|
||||
uci_pdu->harq->harq_confidence_level = no_conf ? 1 : 0;
|
||||
uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(1);
|
||||
uci_pdu->harq->harq_confidence_level = no_conf;
|
||||
uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(sizeof *uci_pdu->harq->harq_list);
|
||||
uci_pdu->harq->harq_list[0].harq_value = !(index&0x01);
|
||||
LOG_D(PHY, "[DLSCH/PDSCH/PUCCH] %d.%d HARQ value %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, energy %f, sync_pos %d\n",
|
||||
frame,slot,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,10*log10((double)sigenergy),gNB->ulsch_stats[0].sync_pos);
|
||||
LOG_D(PHY, "[DLSCH/PDSCH/PUCCH] %d.%d HARQ %s with confidence level %s xrt_mag %d xrt_mag_next %d n0 %d (%d,%d) pucch0_thres %d, cqi %d, SNRtimes10 %d, energy %f, sync_pos %d\n",
|
||||
frame,slot,uci_pdu->harq->harq_list[0].harq_value==0?"ACK":"NACK",
|
||||
uci_pdu->harq->harq_confidence_level==0?"good":"bad",
|
||||
xrtmag_dBtimes10,xrtmag_next_dBtimes10,max_n0,uci_stats->pucch0_n00,uci_stats->pucch0_n01,uci_stats->pucch0_thres,cqi,SNRtimes10,10*log10((double)sigenergy),gNB->ulsch_stats[0].sync_pos);
|
||||
|
||||
if (pucch_pdu->sr_flag == 1) {
|
||||
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
|
||||
uci_pdu->sr->sr_indication = (index>1) ? 1 : 0;
|
||||
uci_pdu->sr->sr_confidence_level = no_conf ? 1 : 0;
|
||||
uci_stats->pucch0_positive_SR++;
|
||||
uci_pdu->sr->sr_indication = (index>1);
|
||||
uci_pdu->sr->sr_confidence_level = no_conf;
|
||||
if(uci_pdu->sr->sr_indication == 1 && uci_pdu->sr->sr_confidence_level == 0) {
|
||||
uci_stats->pucch0_positive_SR++;
|
||||
LOG_D(PHY,"PUCCH0 got positive SR. Cumulative number of positive SR %d\n", uci_stats->pucch0_positive_SR);
|
||||
}
|
||||
}
|
||||
uci_stats->pucch01_trials++;
|
||||
}
|
||||
else {
|
||||
uci_pdu->harq = calloc(1,sizeof(*uci_pdu->harq));
|
||||
uci_pdu->harq->num_harq = 2;
|
||||
uci_pdu->harq->harq_confidence_level = (no_conf) ? 1 : 0;
|
||||
uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(2);
|
||||
uci_pdu->harq->harq_confidence_level = no_conf;
|
||||
uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(2 * sizeof( *uci_pdu->harq->harq_list));
|
||||
|
||||
uci_pdu->harq->harq_list[1].harq_value = !(index&0x01);
|
||||
uci_pdu->harq->harq_list[0].harq_value = !((index>>1)&0x01);
|
||||
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);
|
||||
LOG_D(PHY, "[DLSCH/PDSCH/PUCCH] %d.%d HARQ values (%s, %s) with confidence level %s, 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 == 0 ? "ACK" : "NACK",
|
||||
uci_pdu->harq->harq_list[0].harq_value == 0 ? "ACK" : "NACK",
|
||||
uci_pdu->harq->harq_confidence_level == 0 ? "good" : "bad",
|
||||
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) {
|
||||
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
|
||||
uci_pdu->sr->sr_indication = (index>3) ? 1 : 0;
|
||||
uci_pdu->sr->sr_confidence_level = (no_conf) ? 1 : 0;
|
||||
uci_pdu->sr->sr_confidence_level = no_conf;
|
||||
if(uci_pdu->sr->sr_indication == 1 && uci_pdu->sr->sr_confidence_level == 0) {
|
||||
uci_stats->pucch0_positive_SR++;
|
||||
LOG_D(PHY,"PUCCH0 got positive SR. Cumulative number of positive SR %d\n", uci_stats->pucch0_positive_SR);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1673,7 +1684,8 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
|
||||
LOG_D(PHY,"metric %d dB\n",corr_dB);
|
||||
}
|
||||
|
||||
// estimate CQI for MAC (from antenna port 0 only)
|
||||
// estimate CQI for MAC (from antenna port 0 only)
|
||||
// TODO this computation is wrong -> to be ignored at MAC for now
|
||||
int SNRtimes10 = dB_fixed_times10(signal_energy_nodc(&rxdataF[0][soffset+(l2*frame_parms->ofdm_symbol_size)+re_offset[0]],
|
||||
12*pucch_pdu->prb_size)) -
|
||||
(10*gNB->measurements.n0_power_tot_dB);
|
||||
|
||||
@@ -468,7 +468,9 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
unsigned char symbol,
|
||||
unsigned short scrambling_id,
|
||||
unsigned short coreset_start_subcarrier,
|
||||
unsigned short nb_rb_coreset)
|
||||
unsigned short nb_rb_coreset,
|
||||
int32_t pdcch_est_size,
|
||||
int32_t pdcch_dl_ch_estimates[][pdcch_est_size])
|
||||
{
|
||||
|
||||
unsigned char aarx;
|
||||
@@ -477,7 +479,6 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
int16_t ch[2],*pil,*rxF,*dl_ch,*fl,*fm,*fr;
|
||||
int ch_offset,symbol_offset;
|
||||
|
||||
int **dl_ch_estimates =ue->pdcch_vars[proc->thread_id][gNB_id]->dl_ch_estimates;
|
||||
int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
|
||||
|
||||
ch_offset = ue->frame_parms.ofdm_symbol_size*symbol;
|
||||
@@ -510,7 +511,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
k = coreset_start_subcarrier;
|
||||
pil = (int16_t *)&pilot[0];
|
||||
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+1)];
|
||||
dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset];
|
||||
dl_ch = (int16_t *)&pdcch_dl_ch_estimates[aarx][ch_offset];
|
||||
|
||||
memset(dl_ch,0,4*(ue->frame_parms.ofdm_symbol_size));
|
||||
|
||||
|
||||
@@ -46,7 +46,9 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
unsigned char symbol,
|
||||
unsigned short scrambling_id,
|
||||
unsigned short coreset_start_subcarrier,
|
||||
unsigned short nb_rb_coreset);
|
||||
unsigned short nb_rb_coreset,
|
||||
int32_t pdcch_est_size,
|
||||
int32_t pdcch_dl_ch_estimates[][pdcch_est_size]);
|
||||
|
||||
int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
|
||||
UE_nr_rxtx_proc_t *proc,
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
#include "PHY/CODING/coding_extern.h"
|
||||
#include "PHY/sse_intrin.h"
|
||||
#include "common/utils/nr/nr_common.h"
|
||||
#include <openair1/PHY/TOOLS/phy_scope_interface.h>
|
||||
|
||||
#include "assertions.h"
|
||||
#include "T.h"
|
||||
@@ -79,8 +80,8 @@ char nr_dci_format_string[8][30] = {
|
||||
//static const int16_t conjugate[8]__attribute__((aligned(32))) = {-1,1,-1,1,-1,1,-1,1};
|
||||
|
||||
|
||||
void nr_pdcch_demapping_deinterleaving(uint32_t *llr,
|
||||
uint32_t *z,
|
||||
static void nr_pdcch_demapping_deinterleaving(uint32_t *llr,
|
||||
uint32_t *e_rx,
|
||||
uint8_t coreset_time_dur,
|
||||
uint8_t start_symbol,
|
||||
uint32_t coreset_nbr_rb,
|
||||
@@ -186,10 +187,10 @@ void nr_pdcch_demapping_deinterleaving(uint32_t *llr,
|
||||
index_z = data_sc * rb_count;
|
||||
index_llr = (uint16_t) (f*B_rb + rb + symbol_idx * coreset_nbr_rb) * data_sc;
|
||||
for (int i = 0; i < data_sc; i++) {
|
||||
z[index_z + i] = llr[index_llr + i];
|
||||
e_rx[index_z + i] = llr[index_llr + i];
|
||||
#ifdef NR_PDCCH_DCI_DEBUG
|
||||
LOG_I(PHY,"[candidate=%d,symbol_idx=%d,cce=%d,REG bundle=%d,PRB=%d] z[%d]=(%d,%d) <-> \t llr[%d]=(%d,%d) \n",
|
||||
c_id,symbol_idx,cce_count,k,f*B_rb + rb,(index_z + i),*(int16_t *) &z[index_z + i],*(1 + (int16_t *) &z[index_z + i]),
|
||||
c_id,symbol_idx,cce_count,k,f*B_rb + rb,(index_z + i),*(int16_t *) &e_rx[index_z + i],*(1 + (int16_t *) &e_rx[index_z + i]),
|
||||
(index_llr + i),*(int16_t *) &llr[index_llr + i], *(1 + (int16_t *) &llr[index_llr + i]));
|
||||
#endif
|
||||
}
|
||||
@@ -201,7 +202,7 @@ void nr_pdcch_demapping_deinterleaving(uint32_t *llr,
|
||||
}
|
||||
}
|
||||
|
||||
int32_t nr_pdcch_llr(NR_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp,
|
||||
int32_t nr_pdcch_llr(NR_DL_FRAME_PARMS *frame_parms, int32_t rx_size, int32_t rxdataF_comp[][rx_size],
|
||||
int16_t *pdcch_llr, uint8_t symbol,uint32_t coreset_nbr_rb) {
|
||||
int16_t *rxF = (int16_t *) &rxdataF_comp[0][(symbol * coreset_nbr_rb * 12)];
|
||||
int32_t i;
|
||||
@@ -270,7 +271,8 @@ int32_t pdcch_llr(NR_DL_FRAME_PARMS *frame_parms,
|
||||
//__m128i avg128P;
|
||||
|
||||
//compute average channel_level on each (TX,RX) antenna pair
|
||||
void nr_pdcch_channel_level(int32_t **dl_ch_estimates_ext,
|
||||
void nr_pdcch_channel_level(int32_t rx_size,
|
||||
int32_t dl_ch_estimates_ext[][rx_size],
|
||||
NR_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t *avg,
|
||||
int symbol,
|
||||
@@ -337,9 +339,11 @@ void nr_pdcch_channel_level(int32_t **dl_ch_estimates_ext,
|
||||
|
||||
// This function will extract the mapped DM-RS PDCCH REs as per 38.211 Section 7.4.1.3.2 (Mapping to physical resources)
|
||||
void nr_pdcch_extract_rbs_single(int32_t **rxdataF,
|
||||
int32_t **dl_ch_estimates,
|
||||
int32_t **rxdataF_ext,
|
||||
int32_t **dl_ch_estimates_ext,
|
||||
int32_t est_size,
|
||||
int32_t dl_ch_estimates[][est_size],
|
||||
int32_t rx_size,
|
||||
int32_t rxdataF_ext[][rx_size],
|
||||
int32_t dl_ch_estimates_ext[][rx_size],
|
||||
uint8_t symbol,
|
||||
NR_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t *coreset_freq_dom,
|
||||
@@ -515,9 +519,9 @@ void nr_pdcch_extract_rbs_single(int32_t **rxdataF,
|
||||
|
||||
#define print_shorts(s,x) printf("%s %d,%d,%d,%d,%d,%d,%d,%d\n",s,(x)[0],(x)[1],(x)[2],(x)[3],(x)[4],(x)[5],(x)[6],(x)[7])
|
||||
|
||||
void nr_pdcch_channel_compensation(int32_t **rxdataF_ext,
|
||||
int32_t **dl_ch_estimates_ext,
|
||||
int32_t **rxdataF_comp,
|
||||
void nr_pdcch_channel_compensation(int32_t rx_size, int32_t rxdataF_ext[][rx_size],
|
||||
int32_t dl_ch_estimates_ext[][rx_size],
|
||||
int32_t rxdataF_comp[][rx_size],
|
||||
int32_t **rho,
|
||||
NR_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t symbol,
|
||||
@@ -628,7 +632,8 @@ void nr_pdcch_channel_compensation(int32_t **rxdataF_ext,
|
||||
|
||||
|
||||
void nr_pdcch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t **rxdataF_comp,
|
||||
int32_t rx_size,
|
||||
int32_t rxdataF_comp[][rx_size],
|
||||
uint8_t symbol) {
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
__m128i *rxdataF_comp128_0,*rxdataF_comp128_1;
|
||||
@@ -664,18 +669,31 @@ void nr_pdcch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms,
|
||||
|
||||
int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
|
||||
UE_nr_rxtx_proc_t *proc,
|
||||
int32_t pdcch_est_size,
|
||||
int32_t pdcch_dl_ch_estimates[][pdcch_est_size],
|
||||
int16_t *pdcch_e_rx,
|
||||
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15) {
|
||||
|
||||
uint32_t frame = proc->frame_rx;
|
||||
uint32_t slot = proc->nr_slot_rx;
|
||||
NR_UE_COMMON *common_vars = &ue->common_vars;
|
||||
NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
||||
NR_UE_PDCCH *pdcch_vars = ue->pdcch_vars[proc->thread_id][0];
|
||||
|
||||
uint8_t log2_maxh, aarx;
|
||||
int32_t avgs;
|
||||
int32_t avgP[4];
|
||||
int n_rb,rb_offset;
|
||||
|
||||
// Pointers to extracted PDCCH symbols in frequency-domain.
|
||||
int32_t rx_size = 4*273*12;
|
||||
int32_t rxdataF_ext[4*frame_parms->nb_antennas_rx][rx_size];
|
||||
int32_t rxdataF_comp[4*frame_parms->nb_antennas_rx][rx_size];
|
||||
int32_t pdcch_dl_ch_estimates_ext[4*frame_parms->nb_antennas_rx][rx_size];
|
||||
|
||||
// Pointer to llrs, 4-bit resolution.
|
||||
int32_t llr_size = 2*4*100*12;
|
||||
int16_t llr[llr_size];
|
||||
|
||||
get_coreset_rballoc(rel15->coreset.frequency_domain_resource,&n_rb,&rb_offset);
|
||||
LOG_D(PHY,"pdcch coreset: freq %x, n_rb %d, rb_offset %d\n",
|
||||
rel15->coreset.frequency_domain_resource[0],n_rb,rb_offset);
|
||||
@@ -683,9 +701,11 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
|
||||
LOG_D(PHY,"in nr_pdcch_extract_rbs_single(rxdataF -> rxdataF_ext || dl_ch_estimates -> dl_ch_estimates_ext)\n");
|
||||
|
||||
nr_pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
|
||||
pdcch_vars->dl_ch_estimates,
|
||||
pdcch_vars->rxdataF_ext,
|
||||
pdcch_vars->dl_ch_estimates_ext,
|
||||
pdcch_est_size,
|
||||
pdcch_dl_ch_estimates,
|
||||
rx_size,
|
||||
rxdataF_ext,
|
||||
pdcch_dl_ch_estimates_ext,
|
||||
s,
|
||||
frame_parms,
|
||||
rel15->coreset.frequency_domain_resource,
|
||||
@@ -695,7 +715,8 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
|
||||
LOG_D(PHY,"we enter nr_pdcch_channel_level(avgP=%d) => compute channel level based on ofdm symbol 0, pdcch_vars[eNB_id]->dl_ch_estimates_ext\n",*avgP);
|
||||
LOG_D(PHY,"in nr_pdcch_channel_level(dl_ch_estimates_ext -> dl_ch_estimates_ext)\n");
|
||||
// compute channel level based on ofdm symbol 0
|
||||
nr_pdcch_channel_level(pdcch_vars->dl_ch_estimates_ext,
|
||||
nr_pdcch_channel_level(rx_size,
|
||||
pdcch_dl_ch_estimates_ext,
|
||||
frame_parms,
|
||||
avgP,
|
||||
s,
|
||||
@@ -717,26 +738,33 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
|
||||
LOG_D(PHY,"we enter nr_pdcch_channel_compensation(log2_maxh=%d)\n",log2_maxh);
|
||||
LOG_D(PHY,"in nr_pdcch_channel_compensation(rxdataF_ext x dl_ch_estimates_ext -> rxdataF_comp)\n");
|
||||
// compute LLRs for ofdm symbol 0 only
|
||||
nr_pdcch_channel_compensation(pdcch_vars->rxdataF_ext,
|
||||
pdcch_vars->dl_ch_estimates_ext,
|
||||
pdcch_vars->rxdataF_comp,
|
||||
nr_pdcch_channel_compensation(rx_size, rxdataF_ext,
|
||||
pdcch_dl_ch_estimates_ext,
|
||||
rxdataF_comp,
|
||||
NULL,
|
||||
frame_parms,
|
||||
s,
|
||||
log2_maxh,
|
||||
n_rb); // log2_maxh+I0_shift
|
||||
|
||||
UEscopeCopy(ue, pdcchRxdataF_comp, rxdataF_comp, sizeof(struct complex16), frame_parms->nb_antennas_rx, rx_size);
|
||||
|
||||
if (frame_parms->nb_antennas_rx > 1) {
|
||||
LOG_D(PHY,"we enter nr_pdcch_detection_mrc(frame_parms->nb_antennas_rx=%d)\n", frame_parms->nb_antennas_rx);
|
||||
nr_pdcch_detection_mrc(frame_parms, pdcch_vars->rxdataF_comp,s);
|
||||
nr_pdcch_detection_mrc(frame_parms, rx_size, rxdataF_comp,s);
|
||||
}
|
||||
|
||||
LOG_D(PHY,"we enter nr_pdcch_llr(for symbol %d), pdcch_vars[eNB_id]->rxdataF_comp ---> pdcch_vars[eNB_id]->llr \n",s);
|
||||
LOG_D(PHY,"in nr_pdcch_llr(rxdataF_comp -> llr)\n");
|
||||
nr_pdcch_llr(frame_parms,
|
||||
pdcch_vars->rxdataF_comp,
|
||||
pdcch_vars->llr,
|
||||
rx_size,
|
||||
rxdataF_comp,
|
||||
llr,
|
||||
s,
|
||||
n_rb);
|
||||
|
||||
UEscopeCopy(ue, pdcchLlr, llr, sizeof(int16_t), 1, llr_size);
|
||||
|
||||
#if T_TRACER
|
||||
|
||||
// T(T_UE_PHY_PDCCH_IQ, T_INT(frame_parms->N_RB_DL), T_INT(frame_parms->N_RB_DL),
|
||||
@@ -750,8 +778,8 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
|
||||
}
|
||||
|
||||
LOG_D(PHY,"we enter nr_pdcch_demapping_deinterleaving(), number of candidates %d\n",rel15->number_of_candidates);
|
||||
nr_pdcch_demapping_deinterleaving((uint32_t *) pdcch_vars->llr,
|
||||
(uint32_t *) pdcch_vars->e_rx,
|
||||
nr_pdcch_demapping_deinterleaving((uint32_t *) llr,
|
||||
(uint32_t *) pdcch_e_rx,
|
||||
rel15->coreset.duration,
|
||||
rel15->coreset.StartSymbolIndex,
|
||||
n_rb,
|
||||
@@ -770,7 +798,7 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
|
||||
|
||||
|
||||
|
||||
void nr_pdcch_unscrambling(int16_t *z,
|
||||
void nr_pdcch_unscrambling(int16_t *e_rx,
|
||||
uint16_t scrambling_RNTI,
|
||||
uint32_t length,
|
||||
uint16_t pdcch_DMRS_scrambling_id,
|
||||
@@ -793,8 +821,10 @@ void nr_pdcch_unscrambling(int16_t *z,
|
||||
reset = 0;
|
||||
}
|
||||
|
||||
if (((s >> (i % 32)) & 1) == 1) z2[i] = -z[i];
|
||||
else z2[i]=z[i];
|
||||
if (((s >> (i % 32)) & 1) == 1)
|
||||
z2[i] = -e_rx[i];
|
||||
else
|
||||
z2[i]=e_rx[i];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -832,10 +862,10 @@ static uint16_t nr_dci_false_detection(uint64_t *dci,
|
||||
|
||||
uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
|
||||
UE_nr_rxtx_proc_t *proc,
|
||||
int16_t *pdcch_e_rx,
|
||||
fapi_nr_dci_indication_t *dci_ind,
|
||||
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15) {
|
||||
|
||||
NR_UE_PDCCH *pdcch_vars = ue->pdcch_vars[proc->thread_id][0];
|
||||
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15,
|
||||
NR_UE_PDCCH_CONFIG *phy_pdcch_config) {
|
||||
|
||||
//int gNB_id = 0;
|
||||
int16_t tmp_e[16*108];
|
||||
@@ -847,6 +877,7 @@ uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
|
||||
int L = rel15->L[j];
|
||||
|
||||
// Loop over possible DCI lengths
|
||||
|
||||
for (int k = 0; k < rel15->num_dci_options; k++) {
|
||||
// skip this candidate if we've already found one with the
|
||||
// same rnti and format at a different aggregation level
|
||||
@@ -865,10 +896,11 @@ uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
|
||||
LOG_D(PHY, "(%i.%i) Trying DCI candidate %d of %d number of candidates, CCE %d (%d), L %d, length %d, format %s\n",
|
||||
proc->frame_rx, proc->nr_slot_rx, j, rel15->number_of_candidates, CCEind, e_rx_cand_idx, L, dci_length, nr_dci_format_string[rel15->dci_format_options[k]]);
|
||||
|
||||
nr_pdcch_unscrambling(&pdcch_vars->e_rx[e_rx_cand_idx], rel15->coreset.scrambling_rnti, L*108, rel15->coreset.pdcch_dmrs_scrambling_id, tmp_e);
|
||||
|
||||
nr_pdcch_unscrambling(&pdcch_e_rx[e_rx_cand_idx], rel15->coreset.scrambling_rnti, L*108, rel15->coreset.pdcch_dmrs_scrambling_id, tmp_e);
|
||||
|
||||
#ifdef DEBUG_DCI_DECODING
|
||||
uint32_t *z = (uint32_t *) &pdcch_vars->e_rx[e_rx_cand_idx];
|
||||
uint32_t *z = (uint32_t *) &e_rx[e_rx_cand_idx];
|
||||
for (int index_z = 0; index_z < L*6; index_z++){
|
||||
for (int i=0; i<9; i++) {
|
||||
LOG_I(PHY,"z[%d]=(%d,%d) \n", (9*index_z + i), *(int16_t *) &z[9*index_z + i],*(1 + (int16_t *) &z[9*index_z + i]));
|
||||
@@ -881,8 +913,8 @@ uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
|
||||
NR_POLAR_DCI_MESSAGE_TYPE, dci_length, L);
|
||||
|
||||
n_rnti = rel15->rnti;
|
||||
LOG_D(PHY, "(%i.%i) dci indication (rnti %x,dci format %s,n_CCE %d,payloadSize %d)\n",
|
||||
proc->frame_rx, proc->nr_slot_rx,n_rnti,nr_dci_format_string[rel15->dci_format_options[k]],CCEind,dci_length);
|
||||
LOG_D(PHY, "(%i.%i) dci indication (rnti %x,dci format %s,n_CCE %d,payloadSize %d,payload %llx )\n",
|
||||
proc->frame_rx, proc->nr_slot_rx,n_rnti,nr_dci_format_string[rel15->dci_format_options[k]],CCEind,dci_length, *(unsigned long long*)dci_estimation);
|
||||
if (crc == n_rnti) {
|
||||
LOG_D(PHY, "(%i.%i) Received dci indication (rnti %x,dci format %s,n_CCE %d,payloadSize %d,payload %llx)\n",
|
||||
proc->frame_rx, proc->nr_slot_rx,n_rnti,nr_dci_format_string[rel15->dci_format_options[k]],CCEind,dci_length,*(unsigned long long*)dci_estimation);
|
||||
@@ -910,7 +942,7 @@ uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
|
||||
}
|
||||
e_rx_cand_idx += 9*L*6*2; //e_rx index for next candidate (L CCEs, 6 REGs per CCE and 9 REs per REG and 2 uint16_t per RE)
|
||||
}
|
||||
pdcch_vars->nb_search_space = 0;
|
||||
phy_pdcch_config->nb_search_space = 0;
|
||||
return(dci_ind->number_of_dcis);
|
||||
}
|
||||
|
||||
|
||||
@@ -168,6 +168,7 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint
|
||||
memset(dlsch->harq_processes[i]->d[r],0,5*8448);
|
||||
else
|
||||
exit_flag=2;
|
||||
|
||||
}
|
||||
} else {
|
||||
exit_flag=1;
|
||||
@@ -221,7 +222,7 @@ bool nr_ue_postDecode(PHY_VARS_NR_UE *phy_vars_ue, notifiedFIFO_elt_t *req, bool
|
||||
//LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d TBS %d mcs %d nb_rb %d harq_process->round %d\n",
|
||||
// phy_vars_ue->Mod_id,nr_slot_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb, harq_process->round);
|
||||
harq_process->status = SCH_IDLE;
|
||||
harq_process->round = 0;
|
||||
harq_process->DLround = 0;
|
||||
harq_process->ack = 1;
|
||||
|
||||
//LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d)\n",
|
||||
@@ -236,9 +237,9 @@ bool nr_ue_postDecode(PHY_VARS_NR_UE *phy_vars_ue, notifiedFIFO_elt_t *req, bool
|
||||
//LOG_D(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
|
||||
// phy_vars_ue->Mod_id, frame, nr_slot_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
|
||||
harq_process->ack = 0;
|
||||
if (harq_process->round >= dlsch->Mlimit) {
|
||||
if (harq_process->DLround >= dlsch->Mlimit) {
|
||||
harq_process->status = SCH_IDLE;
|
||||
harq_process->round = 0;
|
||||
harq_process->DLround = 0;
|
||||
phy_vars_ue->dl_stats[4]++;
|
||||
}
|
||||
|
||||
@@ -295,14 +296,14 @@ void nr_processDLSegment(void* arg) {
|
||||
K_bits_F = Kr-harq_process->F;
|
||||
|
||||
t_nrLDPC_time_stats procTime = {0};
|
||||
t_nrLDPC_time_stats* p_procTime = &procTime ;
|
||||
|
||||
int16_t w[5*8448];
|
||||
memset(w,0,(5*8448)*sizeof(short));
|
||||
|
||||
|
||||
start_meas(&rdata->ts_deinterleave);
|
||||
|
||||
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_IN);
|
||||
int16_t w[E];
|
||||
memset(w, 0, sizeof(w));
|
||||
nr_deinterleaving_ldpc(E,
|
||||
Qm,
|
||||
w, // [hna] w is e
|
||||
@@ -389,12 +390,12 @@ void nr_processDLSegment(void* arg) {
|
||||
no_iteration_ldpc = nrLDPC_decoder(p_decoderParms,
|
||||
(int8_t *)&pl[0],
|
||||
llrProcBuf,
|
||||
p_procTime);
|
||||
&procTime);
|
||||
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_OUT);
|
||||
|
||||
// Fixme: correct type is unsigned, but nrLDPC_decoder and all called behind use signed int
|
||||
if (check_crc((uint8_t *)llrProcBuf,length_dec,harq_process->F,crc_type)) {
|
||||
LOG_D(PHY,"Segment %u CRC OK\n\033[0m",r);
|
||||
LOG_D(PHY,"Segment %u CRC OK\n",r);
|
||||
|
||||
if (r==0) {
|
||||
for (int i=0; i<10; i++) LOG_D(PHY,"byte %d : %x\n",i,((uint8_t *)llrProcBuf)[i]);
|
||||
@@ -404,7 +405,7 @@ void nr_processDLSegment(void* arg) {
|
||||
no_iteration_ldpc = dlsch->max_ldpc_iterations;
|
||||
rdata->decodeIterations = no_iteration_ldpc;
|
||||
} else {
|
||||
LOG_D(PHY,"CRC NOT OK\n\033[0m");
|
||||
LOG_D(PHY,"CRC NOT OK\n");
|
||||
}
|
||||
|
||||
nb_total_decod++;
|
||||
@@ -447,8 +448,8 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
||||
}
|
||||
|
||||
// HARQ stats
|
||||
phy_vars_ue->dl_stats[harq_process->round]++;
|
||||
LOG_D(PHY,"Round %d RV idx %d\n",harq_process->round,harq_process->rvidx);
|
||||
phy_vars_ue->dl_stats[harq_process->DLround]++;
|
||||
LOG_D(PHY,"Round %d RV idx %d\n",harq_process->DLround,harq_process->rvidx);
|
||||
uint8_t kc;
|
||||
uint32_t Tbslbrm;// = 950984;
|
||||
uint16_t nb_rb;// = 30;
|
||||
@@ -501,7 +502,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
||||
}
|
||||
*/
|
||||
nb_rb = harq_process->nb_rb;
|
||||
harq_process->trials[harq_process->round]++;
|
||||
harq_process->trials[harq_process->DLround]++;
|
||||
uint16_t nb_rb_oh = 0; // it was not computed at UE side even before and set to 0 in nr_compute_tbs
|
||||
harq_process->TBS = nr_compute_tbs(harq_process->Qm,harq_process->R,nb_rb,nb_symb_sch,nb_re_dmrs*dmrs_length, nb_rb_oh, 0, harq_process->Nl);
|
||||
A = harq_process->TBS;
|
||||
|
||||
@@ -117,7 +117,6 @@ static int nr_dlsch_llr(NR_UE_PDSCH **pdsch_vars,
|
||||
unsigned char first_symbol_flag,
|
||||
unsigned char symbol,
|
||||
unsigned short nb_rb,
|
||||
unsigned short round,
|
||||
int32_t codeword_TB0,
|
||||
int32_t codeword_TB1,
|
||||
uint32_t len,
|
||||
@@ -154,7 +153,6 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
||||
|
||||
unsigned char aatx=0,aarx=0;
|
||||
|
||||
unsigned short round;
|
||||
int avgs = 0;// rb;
|
||||
NR_DL_UE_HARQ_t *dlsch0_harq, *dlsch1_harq = NULL;
|
||||
|
||||
@@ -278,8 +276,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
||||
nb_rb_pdsch = dlsch0_harq->nb_rb;
|
||||
|
||||
DevAssert(dlsch0_harq);
|
||||
round = dlsch0_harq->round;
|
||||
//printf("round = %d\n", round);
|
||||
|
||||
|
||||
if (gNB_id > 2) {
|
||||
LOG_W(PHY, "In %s: Illegal gNB_id %d\n", __FUNCTION__, gNB_id);
|
||||
@@ -522,7 +519,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
||||
rx_type, harq_pid,
|
||||
gNB_id, gNB_id_i,
|
||||
first_symbol_flag,
|
||||
i, nb_rb_pdsch, round,
|
||||
i, nb_rb_pdsch,
|
||||
codeword_TB0, codeword_TB1,
|
||||
pdsch_vars[gNB_id]->dl_valid_re[i-1],
|
||||
nr_slot_rx, beamforming_mode);
|
||||
@@ -2479,7 +2476,6 @@ static int nr_dlsch_llr(NR_UE_PDSCH **pdsch_vars,
|
||||
unsigned char first_symbol_flag,
|
||||
unsigned char symbol,
|
||||
unsigned short nb_rb,
|
||||
unsigned short round,
|
||||
int32_t codeword_TB0,
|
||||
int32_t codeword_TB1,
|
||||
uint32_t len,
|
||||
|
||||
@@ -101,7 +101,7 @@ void free_list(NR_UE_SSB *node) {
|
||||
}
|
||||
|
||||
|
||||
int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_initial_symbol)
|
||||
int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_initial_symbol, NR_UE_PDCCH_CONFIG *phy_pdcch_config)
|
||||
{
|
||||
NR_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
|
||||
int ret =-1;
|
||||
@@ -165,6 +165,7 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini
|
||||
0,
|
||||
temp_ptr->i_ssb,
|
||||
SISO,
|
||||
phy_pdcch_config,
|
||||
&result);
|
||||
|
||||
temp_ptr=temp_ptr->next_ssb;
|
||||
@@ -215,6 +216,8 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
|
||||
NR_DL_FRAME_PARMS *fp = &ue->frame_parms;
|
||||
int ret=-1;
|
||||
int rx_power=0; //aarx,
|
||||
|
||||
NR_UE_PDCCH_CONFIG phy_pdcch_config={0};
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_INITIAL_UE_SYNC, VCD_FUNCTION_IN);
|
||||
|
||||
@@ -305,7 +308,7 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
|
||||
#endif
|
||||
|
||||
int freq_offset_sss = 0;
|
||||
rx_sss_nr(ue, proc, &metric_tdd_ncp, &phase_tdd_ncp, &freq_offset_sss);
|
||||
ret = rx_sss_nr(ue, proc, &metric_tdd_ncp, &phase_tdd_ncp, &freq_offset_sss);
|
||||
|
||||
accumulated_freq_offset += freq_offset_sss;
|
||||
|
||||
@@ -333,8 +336,10 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
|
||||
}
|
||||
}
|
||||
|
||||
nr_gold_pbch(ue);
|
||||
ret = nr_pbch_detection(proc, ue, 1); // start pbch detection at first symbol after pss
|
||||
if (ret==0) { //we got sss channel
|
||||
nr_gold_pbch(ue);
|
||||
ret = nr_pbch_detection(proc, ue, 1, &phy_pdcch_config); // start pbch detection at first symbol after pss
|
||||
}
|
||||
|
||||
if (ret == 0) {
|
||||
// sync at symbol ue->symbol_offset
|
||||
@@ -531,34 +536,40 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
|
||||
// if stand alone and sync on ssb do sib1 detection as part of initial sync
|
||||
if (sa==1 && ret==0) {
|
||||
bool dec = false;
|
||||
NR_UE_PDCCH *pdcch_vars = ue->pdcch_vars[proc->thread_id][0];
|
||||
int gnb_id = 0; //FIXME
|
||||
int coreset_nb_rb=0;
|
||||
int coreset_start_rb=0;
|
||||
|
||||
for(int n_ss = 0; n_ss<pdcch_vars->nb_search_space; n_ss++) {
|
||||
uint8_t nb_symb_pdcch = pdcch_vars->pdcch_config[n_ss].coreset.duration;
|
||||
int start_symb = pdcch_vars->pdcch_config[n_ss].coreset.StartSymbolIndex;
|
||||
get_coreset_rballoc(pdcch_vars->pdcch_config[n_ss].coreset.frequency_domain_resource,&coreset_nb_rb,&coreset_start_rb);
|
||||
// Hold the channel estimates in frequency domain.
|
||||
int32_t pdcch_est_size = ((((fp->symbols_per_slot*(fp->ofdm_symbol_size+LTE_CE_FILTER_LENGTH))+15)/16)*16);
|
||||
__attribute__ ((aligned(16))) int32_t pdcch_dl_ch_estimates[4*fp->nb_antennas_rx][pdcch_est_size];
|
||||
|
||||
|
||||
for(int n_ss = 0; n_ss<phy_pdcch_config.nb_search_space; n_ss++) {
|
||||
uint8_t nb_symb_pdcch = phy_pdcch_config.pdcch_config[n_ss].coreset.duration;
|
||||
int start_symb = phy_pdcch_config.pdcch_config[n_ss].coreset.StartSymbolIndex;
|
||||
get_coreset_rballoc(phy_pdcch_config.pdcch_config[n_ss].coreset.frequency_domain_resource,&coreset_nb_rb,&coreset_start_rb);
|
||||
for (uint16_t l=start_symb; l<start_symb+nb_symb_pdcch; l++) {
|
||||
nr_slot_fep_init_sync(ue,
|
||||
proc,
|
||||
l, // the UE PHY has no notion of the symbols to be monitored in the search space
|
||||
pdcch_vars->slot,
|
||||
is*fp->samples_per_frame+pdcch_vars->sfn*fp->samples_per_frame+ue->rx_offset);
|
||||
phy_pdcch_config.slot,
|
||||
is*fp->samples_per_frame+phy_pdcch_config.sfn*fp->samples_per_frame+ue->rx_offset);
|
||||
|
||||
if (coreset_nb_rb > 0)
|
||||
nr_pdcch_channel_estimation(ue,
|
||||
proc,
|
||||
0,
|
||||
pdcch_vars->slot,
|
||||
phy_pdcch_config.slot,
|
||||
l,
|
||||
fp->Nid_cell,
|
||||
fp->first_carrier_offset+(pdcch_vars->pdcch_config[n_ss].BWPStart + coreset_start_rb)*12,
|
||||
coreset_nb_rb);
|
||||
fp->first_carrier_offset+(phy_pdcch_config.pdcch_config[n_ss].BWPStart + coreset_start_rb)*12,
|
||||
coreset_nb_rb,
|
||||
pdcch_est_size,
|
||||
pdcch_dl_ch_estimates);
|
||||
|
||||
}
|
||||
int dci_cnt = nr_ue_pdcch_procedures(gnb_id, ue, proc, n_ss);
|
||||
int dci_cnt = nr_ue_pdcch_procedures(gnb_id, ue, proc, pdcch_est_size, pdcch_dl_ch_estimates, &phy_pdcch_config, n_ss);
|
||||
if (dci_cnt>0){
|
||||
NR_UE_DLSCH_t *dlsch = ue->dlsch_SI[gnb_id];
|
||||
if (dlsch && (dlsch->active == 1)) {
|
||||
@@ -571,8 +582,8 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
|
||||
nr_slot_fep_init_sync(ue,
|
||||
proc,
|
||||
m,
|
||||
pdcch_vars->slot, // same slot and offset as pdcch
|
||||
is*fp->samples_per_frame+pdcch_vars->sfn*fp->samples_per_frame+ue->rx_offset);
|
||||
phy_pdcch_config.slot, // same slot and offset as pdcch
|
||||
is*fp->samples_per_frame+phy_pdcch_config.sfn*fp->samples_per_frame+ue->rx_offset);
|
||||
}
|
||||
|
||||
int ret = nr_ue_pdsch_procedures(ue,
|
||||
|
||||
@@ -391,6 +391,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
|
||||
uint8_t gNB_id,
|
||||
uint8_t i_ssb,
|
||||
MIMO_mode_t mimo_mode,
|
||||
NR_UE_PDCCH_CONFIG *phy_pdcch_config,
|
||||
fapiPbch_t *result) {
|
||||
NR_UE_COMMON *nr_ue_common_vars = &ue->common_vars;
|
||||
int max_h=0;
|
||||
@@ -577,7 +578,8 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
|
||||
nr_downlink_indication_t dl_indication;
|
||||
fapi_nr_rx_indication_t *rx_ind=calloc(sizeof(*rx_ind),1);
|
||||
uint16_t number_pdus = 1;
|
||||
nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id);
|
||||
|
||||
nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id, phy_pdcch_config);
|
||||
nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_SSB, gNB_id, ue, NULL, NULL, number_pdus, proc,(void *)result);
|
||||
|
||||
if (ue->if_inst && ue->if_inst->dl_indication)
|
||||
|
||||
@@ -1076,6 +1076,9 @@ uint32_t dlsch_decoding_emul(PHY_VARS_NR_UE *phy_vars_ue,
|
||||
|
||||
int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
|
||||
UE_nr_rxtx_proc_t *proc,
|
||||
int32_t pdcch_est_size,
|
||||
int32_t pdcch_dl_ch_estimates[][pdcch_est_size],
|
||||
int16_t *pdcch_e_rx,
|
||||
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15);
|
||||
|
||||
|
||||
@@ -1130,11 +1133,13 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
|
||||
uint8_t eNB_id,
|
||||
uint8_t i_ssb,
|
||||
MIMO_mode_t mimo_mode,
|
||||
fapiPbch_t* result);
|
||||
NR_UE_PDCCH_CONFIG *phy_pdcch_config,
|
||||
fapiPbch_t* result);
|
||||
|
||||
int nr_pbch_detection(UE_nr_rxtx_proc_t *proc,
|
||||
PHY_VARS_NR_UE *ue,
|
||||
int pbch_initial_symbol);
|
||||
PHY_VARS_NR_UE *ue,
|
||||
int pbch_initial_symbol,
|
||||
NR_UE_PDCCH_CONFIG *phy_pdcch_config);
|
||||
|
||||
uint16_t rx_pbch_emul(PHY_VARS_NR_UE *phy_vars_ue,
|
||||
uint8_t eNB_id,
|
||||
@@ -1451,16 +1456,6 @@ uint64_t cqi2hex(uint32_t cqi);
|
||||
|
||||
uint16_t computeRIV(uint16_t N_RB_DL,uint16_t RBstart,uint16_t Lcrbs);
|
||||
|
||||
|
||||
/** \brief This routine extracts a single subband PMI from a bitmap coming from UCI or the pmi_extend function
|
||||
@param N_RB_DL number of resource blocks
|
||||
@param mimo_mode
|
||||
@param pmi_alloc subband PMI bitmap
|
||||
@param rb resource block for which to extract PMI
|
||||
@returns subband PMI
|
||||
*/
|
||||
uint8_t get_pmi(uint8_t N_RB_DL,MIMO_mode_t mode, uint32_t pmi_alloc,uint16_t rb);
|
||||
|
||||
int get_nCCE_offset_l1(int *CCE_table,
|
||||
const unsigned char L,
|
||||
const int nCCE,
|
||||
@@ -1562,7 +1557,7 @@ uint8_t get_num_prach_tdd(module_id_t Mod_id);
|
||||
@param frame_type 0-FDD, 1-TDD
|
||||
@returns 0-1 accordingly
|
||||
*/
|
||||
uint8_t get_prach_fmt(uint8_t prach_ConfigIndex,lte_frame_type_t frame_type);
|
||||
uint8_t get_prach_fmt(uint8_t prach_ConfigIndex,frame_type_t frame_type);
|
||||
|
||||
/*!
|
||||
\brief Helper for MAC, returns frequency index of PRACH resource in TDD for a particular configuration index
|
||||
@@ -1584,7 +1579,7 @@ void compute_prach_seq(uint16_t rootSequenceIndex,
|
||||
uint8_t prach_ConfigIndex,
|
||||
uint8_t zeroCorrelationZoneConfig,
|
||||
uint8_t highSpeedFlag,
|
||||
lte_frame_type_t frame_type,
|
||||
frame_type_t frame_type,
|
||||
uint32_t X_u[64][839]);
|
||||
|
||||
|
||||
@@ -1640,8 +1635,10 @@ uint8_t get_prach_prb_offset(NR_DL_FRAME_PARMS *frame_parms,
|
||||
|
||||
uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
|
||||
UE_nr_rxtx_proc_t *proc,
|
||||
int16_t *pdcch_e_rx,
|
||||
fapi_nr_dci_indication_t *dci_ind,
|
||||
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15);
|
||||
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15,
|
||||
NR_UE_PDCCH_CONFIG *phy_pdcch_config);
|
||||
|
||||
|
||||
/** \brief This function is the top-level entry point to PDSCH demodulation, after frequency-domain transformation and channel estimation. It performs
|
||||
|
||||
@@ -181,9 +181,10 @@ typedef struct {
|
||||
/// Pointers to transport block segments
|
||||
uint8_t **c;
|
||||
/// soft bits for each received segment ("d"-sequence)(for definition see 36-212 V8.6 2009-03, p.15)
|
||||
/// Accumulates the soft bits for each round to increase decoding success (HARQ)
|
||||
int16_t **d;
|
||||
/// Index of current HARQ round for this DLSCH
|
||||
uint8_t round;
|
||||
uint8_t DLround;
|
||||
/// MCS table for this DLSCH
|
||||
uint8_t mcs_table;
|
||||
/// MCS format for this DLSCH
|
||||
|
||||
@@ -381,7 +381,6 @@ void init_context_pss_nr(NR_DL_FRAME_PARMS *frame_parms_ue)
|
||||
int sizePss = LENGTH_PSS_NR * IQ_SIZE; /* complex value i & q signed 16 bits */
|
||||
int size = ofdm_symbol_size * IQ_SIZE; /* i and q samples signed 16 bits */
|
||||
int16_t *p = NULL;
|
||||
int64_t *q = NULL;
|
||||
|
||||
AssertFatal(ofdm_symbol_size > 127, "illegal ofdm_symbol_size %d\n",ofdm_symbol_size);
|
||||
for (int i = 0; i < NUMBER_PSS_SEQUENCE; i++) {
|
||||
@@ -410,17 +409,6 @@ void init_context_pss_nr(NR_DL_FRAME_PARMS *frame_parms_ue)
|
||||
assert(0);
|
||||
}
|
||||
|
||||
size = sizeof(int64_t)*(frame_parms_ue->samples_per_frame + (2*ofdm_symbol_size));
|
||||
q = (int64_t*)malloc16(size);
|
||||
if (q != NULL) {
|
||||
pss_corr_ue[i] = q;
|
||||
bzero( pss_corr_ue[i], size);
|
||||
}
|
||||
else {
|
||||
LOG_E(PHY,"Fatal memory allocation problem \n");
|
||||
assert(0);
|
||||
}
|
||||
|
||||
generate_pss_nr(frame_parms_ue,i);
|
||||
}
|
||||
}
|
||||
@@ -443,7 +431,6 @@ void free_context_pss_nr(void)
|
||||
free_and_zero(primary_synchro_nr[i]);
|
||||
free_and_zero(primary_synchro_nr2[i]);
|
||||
free_and_zero(primary_synchro_time_nr[i]);
|
||||
free_and_zero(pss_corr_ue[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -801,7 +788,6 @@ static inline double angle64(int64_t x)
|
||||
*********************************************************************/
|
||||
|
||||
#define DOT_PRODUCT_SCALING_SHIFT (17)
|
||||
|
||||
int pss_search_time_nr(int **rxdata, ///rx data in time domain
|
||||
NR_DL_FRAME_PARMS *frame_parms,
|
||||
int fo_flag,
|
||||
@@ -812,7 +798,7 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain
|
||||
unsigned int n, ar, peak_position, pss_source;
|
||||
int64_t peak_value;
|
||||
int64_t result;
|
||||
int64_t avg[NUMBER_PSS_SEQUENCE];
|
||||
int64_t avg[NUMBER_PSS_SEQUENCE]={0};
|
||||
double ffo_est=0;
|
||||
|
||||
// performing the correlation on a frame length plus one symbol for the first of the two frame
|
||||
@@ -823,9 +809,8 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain
|
||||
else
|
||||
length = frame_parms->samples_per_frame;
|
||||
|
||||
AssertFatal(length>0,"illegal length %d\n",length);
|
||||
for (int i = 0; i < NUMBER_PSS_SEQUENCE; i++) AssertFatal(pss_corr_ue[i] != NULL,"pss_corr_ue[%d] not yet allocated! Exiting.\n", i);
|
||||
|
||||
AssertFatal(length>0,"illegal length %d\n",length);
|
||||
peak_value = 0;
|
||||
peak_position = 0;
|
||||
pss_source = 0;
|
||||
@@ -846,47 +831,41 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain
|
||||
/* Correlation computation is based on a a dot product which is realized thank to SIMS extensions */
|
||||
|
||||
for (int pss_index = 0; pss_index < NUMBER_PSS_SEQUENCE; pss_index++) {
|
||||
avg[pss_index]=0;
|
||||
memset(pss_corr_ue[pss_index],0,length*sizeof(int64_t));
|
||||
}
|
||||
|
||||
for (n=0; n < length; n+=4) { //
|
||||
for (n=0; n < length; n+=4) { //
|
||||
|
||||
for (int pss_index = 0; pss_index < NUMBER_PSS_SEQUENCE; pss_index++) {
|
||||
int64_t pss_corr_ue=0;
|
||||
/* calculate dot product of primary_synchro_time_nr and rxdata[ar][n]
|
||||
* (ar=0..nb_ant_rx) and store the sum in temp[n]; */
|
||||
for (ar=0; ar<frame_parms->nb_antennas_rx; ar++) {
|
||||
|
||||
if ( n < (length - frame_parms->ofdm_symbol_size)) {
|
||||
/* perform correlation of rx data and pss sequence ie it is a dot product */
|
||||
result = dot_product64((short*)primary_synchro_time_nr[pss_index],
|
||||
(short*)&(rxdata[ar][n+is*frame_parms->samples_per_frame]),
|
||||
frame_parms->ofdm_symbol_size,
|
||||
shift);
|
||||
pss_corr_ue += abs64(result);
|
||||
//((short*)pss_corr_ue[pss_index])[2*n] += ((short*) &result)[0]; /* real part */
|
||||
//((short*)pss_corr_ue[pss_index])[2*n+1] += ((short*) &result)[1]; /* imaginary part */
|
||||
//((short*)&synchro_out)[0] += ((int*) &result)[0]; /* real part */
|
||||
//((short*)&synchro_out)[1] += ((int*) &result)[1]; /* imaginary part */
|
||||
|
||||
/* calculate dot product of primary_synchro_time_nr and rxdata[ar][n] (ar=0..nb_ant_rx) and store the sum in temp[n]; */
|
||||
for (ar=0; ar<frame_parms->nb_antennas_rx; ar++) {
|
||||
|
||||
/* perform correlation of rx data and pss sequence ie it is a dot product */
|
||||
result = dot_product64((short*)primary_synchro_time_nr[pss_index],
|
||||
(short*)&(rxdata[ar][n+is*frame_parms->samples_per_frame]),
|
||||
frame_parms->ofdm_symbol_size,
|
||||
shift);
|
||||
pss_corr_ue[pss_index][n] += abs64(result);
|
||||
//((short*)pss_corr_ue[pss_index])[2*n] += ((short*) &result)[0]; /* real part */
|
||||
//((short*)pss_corr_ue[pss_index])[2*n+1] += ((short*) &result)[1]; /* imaginary part */
|
||||
//((short*)&synchro_out)[0] += ((int*) &result)[0]; /* real part */
|
||||
//((short*)&synchro_out)[1] += ((int*) &result)[1]; /* imaginary part */
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* calculate the absolute value of sync_corr[n] */
|
||||
avg[pss_index]+=pss_corr_ue[pss_index][n];
|
||||
if (pss_corr_ue[pss_index][n] > peak_value) {
|
||||
peak_value = pss_corr_ue[pss_index][n];
|
||||
avg[pss_index]+=pss_corr_ue;
|
||||
if (pss_corr_ue > peak_value) {
|
||||
peak_value = pss_corr_ue;
|
||||
peak_position = n;
|
||||
pss_source = pss_index;
|
||||
|
||||
|
||||
#ifdef DEBUG_PSS_NR
|
||||
printf("pss_index %d: n %6u peak_value %15llu\n", pss_index, n, (unsigned long long)pss_corr_ue[pss_index][n]);
|
||||
printf("pss_index %d: n %6u peak_value %15llu\n", pss_index, n, (unsigned long long)pss_corr_ue[n]);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (fo_flag){
|
||||
|
||||
// fractional frequency offset computation according to Cross-correlation Synchronization Algorithm Using PSS
|
||||
@@ -922,7 +901,8 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain
|
||||
// computing absolute value of frequency offset
|
||||
*f_off = ffo_est*frame_parms->subcarrier_spacing;
|
||||
|
||||
for (int pss_index = 0; pss_index < NUMBER_PSS_SEQUENCE; pss_index++) avg[pss_index]/=(length/4);
|
||||
for (int pss_index = 0; pss_index < NUMBER_PSS_SEQUENCE; pss_index++)
|
||||
avg[pss_index]/=(length/4);
|
||||
|
||||
*eNB_id = pss_source;
|
||||
|
||||
@@ -937,9 +917,6 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain
|
||||
static int debug_cnt = 0;
|
||||
|
||||
if (debug_cnt == 0) {
|
||||
LOG_M("pss_corr_ue0.m","pss_corr_ue0",pss_corr_ue[0],length,1,6);
|
||||
LOG_M("pss_corr_ue1.m","pss_corr_ue1",pss_corr_ue[1],length,1,6);
|
||||
LOG_M("pss_corr_ue2.m","pss_corr_ue2",pss_corr_ue[2],length,1,6);
|
||||
if (is)
|
||||
LOG_M("rxdata1.m","rxd0",rxdata[frame_parms->samples_per_frame],length,1,1);
|
||||
else
|
||||
|
||||
@@ -563,6 +563,10 @@ int rx_sss_nr(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int32_t *tot_metric,
|
||||
|
||||
int re = 0;
|
||||
int im = 0;
|
||||
if (Nid1 == N_ID_1_NUMBER) {
|
||||
LOG_I(PHY,"Failled to detect SSS after PSS\n");
|
||||
return -1;
|
||||
}
|
||||
d = (int16_t *)&d_sss[Nid2][Nid1];
|
||||
for(i = 0; i<LENGTH_SSS_NR; i++) {
|
||||
re += d[i]*sss[2*i];
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
#include "costable.h"
|
||||
#include "defs.h"
|
||||
|
||||
unsigned int angle(struct complex16 perror)
|
||||
unsigned int angle(c16_t perror)
|
||||
{
|
||||
int a;
|
||||
|
||||
|
||||
@@ -129,7 +129,7 @@ main ()
|
||||
short output[256] __attribute__((aligned(16)));
|
||||
|
||||
int i;
|
||||
struct complex16 alpha;
|
||||
c16_t alpha;
|
||||
|
||||
Zero_Buffer(output,256*2);
|
||||
|
||||
|
||||
@@ -278,7 +278,7 @@ main ()
|
||||
short output[256] __attribute__((aligned(16)));
|
||||
|
||||
int i;
|
||||
struct complex16 alpha;
|
||||
c16_t alpha;
|
||||
|
||||
Zero_Buffer(output,256*2);
|
||||
|
||||
|
||||
@@ -305,15 +305,15 @@ int main(int argc, char **argv) {
|
||||
|
||||
openair0_device_load(&rfdevice,&openair0_cfg);
|
||||
|
||||
void ** samplesRx = (void **)malloc16(antennas* sizeof(struct complex16 *) );
|
||||
void ** samplesTx = (void **)malloc16(antennas* sizeof(struct complex16 *) );
|
||||
void ** samplesRx = (void **)malloc16(antennas* sizeof(c16_t *) );
|
||||
void ** samplesTx = (void **)malloc16(antennas* sizeof(c16_t *) );
|
||||
|
||||
int fd=open(getenv("rftestInputFile"),O_RDONLY);
|
||||
AssertFatal(fd>=0,"%s",strerror(errno));
|
||||
|
||||
for (int i=0; i<antennas; i++) {
|
||||
samplesRx[i] = (int32_t *)malloc16_clear( DFT*sizeof(struct complex16) );
|
||||
samplesTx[i] = (int32_t *)malloc16_clear( DFT*sizeof(struct complex16) );
|
||||
samplesRx[i] = (int32_t *)malloc16_clear( DFT*sizeof(c16_t) );
|
||||
samplesTx[i] = (int32_t *)malloc16_clear( DFT*sizeof(c16_t) );
|
||||
}
|
||||
|
||||
CalibrationInitScope(samplesRx, &rfdevice);
|
||||
@@ -322,7 +322,7 @@ int main(int argc, char **argv) {
|
||||
|
||||
while(!oai_exit) {
|
||||
for (int i=0; i<antennas; i++)
|
||||
read(fd, samplesTx[i], DFT*sizeof(struct complex16));
|
||||
read(fd, samplesTx[i], DFT*sizeof(c16_t));
|
||||
int readBlockSize = rfdevice.trx_read_func(&rfdevice,
|
||||
×tamp,
|
||||
samplesRx,
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*
|
||||
* dB_routines.h
|
||||
*
|
||||
* Created on: Nov 12, 2013
|
||||
* Author: winckel
|
||||
*/
|
||||
|
||||
#ifndef DB_ROUTINES_H_
|
||||
#define DB_ROUTINES_H_
|
||||
|
||||
int16_t dB_fixed_times10(uint32_t x);
|
||||
int16_t dB_fixed_x10(uint32_t x);
|
||||
|
||||
#endif /* DB_ROUTINES_H_ */
|
||||
@@ -37,7 +37,7 @@
|
||||
const FL_COLOR rx_antenna_colors[4] = {FL_RED,FL_BLUE,FL_GREEN,FL_YELLOW};
|
||||
const FL_COLOR water_colors[4] = {FL_BLUE,FL_GREEN,FL_YELLOW,FL_RED};
|
||||
|
||||
typedef struct complex16 scopeSample_t;
|
||||
typedef c16_t scopeSample_t;
|
||||
#define SquaredNorm(VaR) ((VaR).r*(VaR).r+(VaR).i*(VaR).i)
|
||||
|
||||
typedef struct {
|
||||
@@ -678,52 +678,42 @@ static void uePbchIQ (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_U
|
||||
|
||||
static void uePcchLLR (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
|
||||
// PDCCH LLRs
|
||||
if (!phy_vars_ue->pdcch_vars[0][eNB_id]->llr)
|
||||
if (!data[pdcchLlr])
|
||||
return;
|
||||
|
||||
//int num_re = 4*273*12; // 12*frame_parms->N_RB_DL*num_pdcch_symbols
|
||||
//int Qm = 2;
|
||||
int coded_bits_per_codeword = 2*4*100*12; //num_re*Qm;
|
||||
const int sz=data[pdcchLlr]->lineSz;
|
||||
float *llr, *bit;
|
||||
oai_xygraph_getbuff(graph, &bit, &llr, coded_bits_per_codeword*RX_NB_TH_MAX, 0);
|
||||
int base=0;
|
||||
oai_xygraph_getbuff(graph, &bit, &llr, sz, 0);
|
||||
|
||||
for (int thr=0 ; thr < RX_NB_TH_MAX ; thr ++ ) {
|
||||
int16_t *pdcch_llr = (int16_t *) phy_vars_ue->pdcch_vars[thr][eNB_id]->llr;
|
||||
int16_t *pdcch_llr = (int16_t *)(data[pdcchLlr]+1);
|
||||
|
||||
for (int i=0; i<coded_bits_per_codeword; i++) {
|
||||
llr[base+i] = (float) pdcch_llr[i];
|
||||
}
|
||||
|
||||
base+=coded_bits_per_codeword;
|
||||
for (int i=0; i<sz; i++) {
|
||||
llr[i] = (float) pdcch_llr[i];
|
||||
}
|
||||
|
||||
AssertFatal(base <= coded_bits_per_codeword*RX_NB_TH_MAX, "");
|
||||
oai_xygraph(graph,bit,llr,base,0,10);
|
||||
oai_xygraph(graph,bit,llr,sz,0,10);
|
||||
}
|
||||
static void uePcchIQ (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
|
||||
// PDCCH I/Q of MF Output
|
||||
if (!phy_vars_ue->pdcch_vars[0][eNB_id]->rxdataF_comp[0])
|
||||
if (!data[pdcchRxdataF_comp])
|
||||
return;
|
||||
|
||||
int nb=4*273*12; // 12*frame_parms->N_RB_DL*num_pdcch_symbols
|
||||
const int sz=data[pdcchRxdataF_comp]->lineSz;
|
||||
//const int antennas=data[pdcchRxdataF_comp]->colSz;
|
||||
// We take the first antenna only for now
|
||||
float *I, *Q;
|
||||
oai_xygraph_getbuff(graph, &I, &Q, nb*RX_NB_TH_MAX, 0);
|
||||
int base=0;
|
||||
oai_xygraph_getbuff(graph, &I, &Q, sz, 0);
|
||||
|
||||
for (int thr=0 ; thr < RX_NB_TH_MAX ; thr ++ ) {
|
||||
scopeSample_t *pdcch_comp = (scopeSample_t *) phy_vars_ue->pdcch_vars[thr][eNB_id]->rxdataF_comp[0];
|
||||
scopeSample_t *pdcch_comp = (scopeSample_t *) (data[pdcchRxdataF_comp]+1);
|
||||
|
||||
for (int i=0; i< nb; i++) {
|
||||
I[base+i] = pdcch_comp[i].r;
|
||||
Q[base+i] = pdcch_comp[i].i;
|
||||
}
|
||||
|
||||
base+=nb;
|
||||
for (int i=0; i<sz; i++) {
|
||||
I[i] = pdcch_comp[i].r;
|
||||
Q[i] = pdcch_comp[i].i;
|
||||
}
|
||||
|
||||
AssertFatal(base <= nb*RX_NB_TH_MAX, "");
|
||||
oai_xygraph(graph,I,Q,base,0,10);
|
||||
oai_xygraph(graph,I,Q,sz,0,10);
|
||||
}
|
||||
static void uePdschLLR (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
|
||||
// PDSCH LLRs
|
||||
@@ -908,7 +898,6 @@ static void *nrUEscopeThread(void *arg) {
|
||||
char *name="5G-UE-scope";
|
||||
fl_initialize (&fl_argc, &name, NULL, 0, 0);
|
||||
OAI_phy_scope_t *form_nrue=create_phy_scope_nrue(0);
|
||||
(( scopeData_t *)ue->scopeData)->liveData=calloc(sizeof(scopeGraphData_t *), UEdataTypeNumberOfItems);
|
||||
|
||||
while (!oai_exit) {
|
||||
fl_freeze_form(form_nrue->phy_scope);
|
||||
@@ -925,28 +914,43 @@ static void *nrUEscopeThread(void *arg) {
|
||||
}
|
||||
|
||||
void UEcopyData(PHY_VARS_NR_UE *ue, enum UEdataType type, void *dataIn, int elementSz, int colSz, int lineSz) {
|
||||
// Local static copy of the scope data bufs
|
||||
// The active data buf is alterned to avoid interference between the Scope thread (display) and the Rx thread (data input)
|
||||
// Index of "2" could be set to the number of Rx threads + 1
|
||||
static scopeGraphData_t *copyDataBufs[UEdataTypeNumberOfItems][2] = {0};
|
||||
static int copyDataBufsIdx[UEdataTypeNumberOfItems] = {0};
|
||||
|
||||
scopeData_t *tmp=(scopeData_t *)ue->scopeData;
|
||||
|
||||
if (tmp) {
|
||||
scopeGraphData_t *live= ((scopeGraphData_t **)tmp->liveData)[type];
|
||||
// Begin of critical zone between UE Rx threads that might copy new data at the same time: might require a mutex
|
||||
int newCopyDataIdx = (copyDataBufsIdx[type]==0)?1:0;
|
||||
copyDataBufsIdx[type] = newCopyDataIdx;
|
||||
// End of critical zone between UE Rx threads
|
||||
|
||||
if (live == NULL || live->dataSize < elementSz*colSz*lineSz) {
|
||||
scopeGraphData_t *ptr=realloc(live, sizeof(scopeGraphData_t) + elementSz*colSz*lineSz);
|
||||
// New data will be copied in a different buffer than the live one
|
||||
scopeGraphData_t *copyData= copyDataBufs[type][newCopyDataIdx];
|
||||
|
||||
if (copyData == NULL || copyData->dataSize < elementSz*colSz*lineSz) {
|
||||
scopeGraphData_t *ptr=realloc(copyData, sizeof(scopeGraphData_t) + elementSz*colSz*lineSz);
|
||||
|
||||
if (!ptr) {
|
||||
LOG_E(PHY,"can't realloc\n");
|
||||
return;
|
||||
} else {
|
||||
live=ptr;
|
||||
copyData=ptr;
|
||||
}
|
||||
}
|
||||
|
||||
live->dataSize=elementSz*colSz*lineSz;
|
||||
live->elementSz=elementSz;
|
||||
live->colSz=colSz;
|
||||
live->lineSz=lineSz;
|
||||
memcpy(live+1, dataIn, elementSz*colSz*lineSz);
|
||||
((scopeGraphData_t **)tmp->liveData)[type]=live;
|
||||
copyData->dataSize=elementSz*colSz*lineSz;
|
||||
copyData->elementSz=elementSz;
|
||||
copyData->colSz=colSz;
|
||||
copyData->lineSz=lineSz;
|
||||
memcpy(copyData+1, dataIn, elementSz*colSz*lineSz);
|
||||
copyDataBufs[type][newCopyDataIdx] = copyData;
|
||||
|
||||
// The new data just copied in the local static buffer becomes live now
|
||||
((scopeGraphData_t **)tmp->liveData)[type]=copyData;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -954,6 +958,7 @@ void nrUEinitScope(PHY_VARS_NR_UE *ue) {
|
||||
AssertFatal(ue->scopeData=malloc(sizeof(scopeData_t)),"");
|
||||
scopeData_t *scope=(scopeData_t *) ue->scopeData;
|
||||
scope->copyData=UEcopyData;
|
||||
AssertFatal(scope->liveData=calloc(sizeof(scopeGraphData_t *), UEdataTypeNumberOfItems),"");
|
||||
pthread_t forms_thread;
|
||||
threadCreate(&forms_thread, nrUEscopeThread, ue, "scope", -1, OAI_PRIORITY_RT_LOW);
|
||||
}
|
||||
|
||||
@@ -45,6 +45,8 @@ enum UEdataType {
|
||||
pbchDlChEstimateTime,
|
||||
pbchLlr,
|
||||
pbchRxdataF_comp,
|
||||
pdcchLlr,
|
||||
pdcchRxdataF_comp,
|
||||
UEdataTypeNumberOfItems
|
||||
};
|
||||
|
||||
|
||||
@@ -39,26 +39,33 @@ extern "C" {
|
||||
#define CEILIDIV(a,b) ((a+b-1)/b)
|
||||
#define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1))
|
||||
|
||||
struct complexd {
|
||||
typedef struct complexd {
|
||||
double r;
|
||||
double i;
|
||||
};
|
||||
} cd_t;
|
||||
|
||||
struct complexf {
|
||||
typedef struct complexf {
|
||||
float r;
|
||||
float i;
|
||||
};
|
||||
} cf_t;
|
||||
|
||||
struct complex16 {
|
||||
typedef struct complex16 {
|
||||
int16_t r;
|
||||
int16_t i;
|
||||
};
|
||||
} c16_t;
|
||||
|
||||
struct complex32 {
|
||||
typedef struct complex32 {
|
||||
int32_t r;
|
||||
int32_t i;
|
||||
};
|
||||
} c32_t;
|
||||
|
||||
typedef struct complex64 {
|
||||
int64_t r;
|
||||
int64_t i;
|
||||
} c64_t;
|
||||
|
||||
#define squaredMod(a) ((a).r*(a).r+(a).i*(a).i)
|
||||
#define csum(res, i1, i2) (res).r=(i1).r+(i2).r ; (res).i=(i1).i+(i2).i
|
||||
//cmult_sv.h
|
||||
|
||||
/*!\fn void multadd_real_vector_complex_scalar(int16_t *x,int16_t *alpha,int16_t *y,uint32_t N)
|
||||
|
||||
@@ -54,7 +54,6 @@ typedef enum {
|
||||
no_L2_connect=5,
|
||||
calib_prach_tx=6,
|
||||
rx_dump_frame=7,
|
||||
loop_through_memory=8
|
||||
} runmode_t;
|
||||
|
||||
/*! \brief Extension Type */
|
||||
|
||||
@@ -833,7 +833,6 @@ typedef struct {
|
||||
pthread_mutex_t timer_mutex;
|
||||
pthread_cond_t timer_cond;
|
||||
int instance_cnt_timer;
|
||||
|
||||
/// RF and Interface devices per CC
|
||||
|
||||
openair0_device rfdevice;
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
#define NB_RX_ANTENNAS_MAX 64
|
||||
|
||||
|
||||
typedef enum {TDD=1,FDD=0} lte_frame_type_t;
|
||||
typedef enum {TDD=1,FDD=0} frame_type_t;
|
||||
|
||||
typedef enum {EXTENDED=1,NORMAL=0} lte_prefix_type_t;
|
||||
|
||||
@@ -597,7 +597,7 @@ typedef struct LTE_DL_FRAME_PARMS {
|
||||
/// shift of pilot position in one RB
|
||||
uint8_t nushift;
|
||||
/// Frame type (0 FDD, 1 TDD)
|
||||
lte_frame_type_t frame_type;
|
||||
frame_type_t frame_type;
|
||||
/// TDD subframe assignment (0-7) (default = 3) (254=RX only, 255=TX only)
|
||||
uint8_t tdd_config;
|
||||
/// TDD S-subframe configuration (0-9)
|
||||
|
||||
@@ -587,9 +587,6 @@ typedef struct gNB_L1_proc_t_s {
|
||||
int instance_cnt_te;
|
||||
/// \internal This variable is protected by \ref mutex_prach.
|
||||
int instance_cnt_prach;
|
||||
|
||||
// instance count for over-the-air gNB synchronization
|
||||
int instance_cnt_synch;
|
||||
/// \internal This variable is protected by \ref mutex_asynch_rxtx.
|
||||
int instance_cnt_asynch_rxtx;
|
||||
/// pthread structure for eNB single processing thread
|
||||
@@ -661,8 +658,6 @@ typedef struct {
|
||||
unsigned int n0_power_tot;
|
||||
//! estimated avg noise power (dB)
|
||||
unsigned int n0_power_tot_dB;
|
||||
//! estimated avg noise power (dB)
|
||||
int n0_power_tot_dBm;
|
||||
//! estimated avg noise power per RB per RX ant (lin)
|
||||
unsigned int n0_subband_power[MAX_NUM_RU_PER_gNB][275];
|
||||
//! estimated avg noise power per RB per RX ant (dB)
|
||||
|
||||
@@ -550,60 +550,20 @@ typedef struct {
|
||||
} NR_UE_PDCCH_SEARCHSPACE;
|
||||
#endif
|
||||
typedef struct {
|
||||
/// \brief Pointers to extracted PDCCH symbols in frequency-domain.
|
||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - second index: ? [0..168*N_RB_DL[
|
||||
int32_t **rxdataF_ext;
|
||||
/// \brief Pointers to extracted and compensated PDCCH symbols in frequency-domain.
|
||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - second index: ? [0..168*N_RB_DL[
|
||||
int32_t **rxdataF_comp;
|
||||
/// \brief Hold the channel estimates in frequency domain.
|
||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - second index: samples? [0..symbols_per_tti*(ofdm_symbol_size+LTE_CE_FILTER_LENGTH)[
|
||||
int32_t **dl_ch_estimates;
|
||||
/// \brief Hold the channel estimates in time domain (used for tracking).
|
||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - second index: samples? [0..2*ofdm_symbol_size[
|
||||
int32_t **dl_ch_estimates_time;
|
||||
/// \brief Pointers to extracted channel estimates of PDCCH symbols.
|
||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - second index: ? [0..168*N_RB_DL[
|
||||
int32_t **dl_ch_estimates_ext;
|
||||
/// \brief Pointers to channel cross-correlation vectors for multi-gNB detection.
|
||||
/// - first index: rx antenna [0..nb_antennas_rx[
|
||||
/// - second index: ? [0..]
|
||||
int32_t **rho;
|
||||
/// \brief Pointer to llrs, 4-bit resolution.
|
||||
/// - first index: ? [0..48*N_RB_DL[
|
||||
int16_t *llr;
|
||||
/// \brief Pointer to llrs, 16-bit resolution.
|
||||
/// - first index: ? [0..96*N_RB_DL[
|
||||
int16_t *llr16;
|
||||
/// \brief \f$\overline{w}\f$ from 36-211.
|
||||
/// - first index: ? [0..48*N_RB_DL[
|
||||
int16_t *wbar;
|
||||
/// \brief PDCCH/DCI e-sequence (input to rate matching).
|
||||
/// - first index: ? [0..96*N_RB_DL[
|
||||
int16_t *e_rx;
|
||||
/// Total number of PDU errors (diagnostic mode)
|
||||
uint32_t dci_errors;
|
||||
int nb_search_space;
|
||||
uint16_t sfn;
|
||||
uint16_t slot;
|
||||
fapi_nr_dl_config_dci_dl_pdu_rel15_t pdcch_config[FAPI_NR_MAX_SS];
|
||||
} NR_UE_PDCCH_CONFIG;
|
||||
|
||||
typedef struct {
|
||||
/// Total number of PDU received
|
||||
uint32_t dci_received;
|
||||
/// Total number of DCI False detection (diagnostic mode)
|
||||
uint32_t dci_false;
|
||||
/// Total number of DCI missed (diagnostic mode)
|
||||
uint32_t dci_missed;
|
||||
/// nCCE for PDCCH per subframe
|
||||
uint8_t nCCE[10];
|
||||
//Check for specific DCIFormat and AgregationLevel
|
||||
uint8_t dciFormat;
|
||||
uint8_t agregationLevel;
|
||||
int nb_search_space;
|
||||
fapi_nr_dl_config_dci_dl_pdu_rel15_t pdcch_config[FAPI_NR_MAX_SS];
|
||||
// frame and slot for sib1 in initial sync
|
||||
uint16_t sfn;
|
||||
uint16_t slot;
|
||||
|
||||
/*
|
||||
#ifdef NR_PDCCH_DEFS_NR_UE
|
||||
int nb_searchSpaces;
|
||||
|
||||
@@ -67,6 +67,7 @@
|
||||
|
||||
/*used for the resource mapping*/
|
||||
#define NR_MAX_PDCCH_DMRS_LENGTH 576 // 16(L)*2(QPSK)*3(3 DMRS symbs per REG)*6(REG per CCE)
|
||||
#define NR_MAX_PDCCH_SIZE 8192 // It seems it is the max polar coded block size
|
||||
|
||||
#define NR_MAX_DCI_PAYLOAD_SIZE 64
|
||||
#define NR_MAX_DCI_SIZE 1728 //16(L)*2(QPSK)*9(12 RE per REG - 3(DMRS))*6(REG per CCE)
|
||||
@@ -280,7 +281,7 @@ struct NR_DL_FRAME_PARMS {
|
||||
uint32_t att_rx;
|
||||
/// total Number of Resource Block Groups: this is ceil(N_PRB/P)
|
||||
/// Frame type (0 FDD, 1 TDD)
|
||||
lte_frame_type_t frame_type;
|
||||
frame_type_t frame_type;
|
||||
uint8_t tdd_config;
|
||||
/// Cell ID
|
||||
uint16_t Nid_cell;
|
||||
|
||||
@@ -994,7 +994,7 @@ int is_srs_occasion_common(LTE_DL_FRAME_PARMS *frame_parms,int frame_tx,int subf
|
||||
return(isSubframeSRS);
|
||||
}
|
||||
|
||||
void compute_srs_pos(lte_frame_type_t frameType,uint16_t isrs,uint16_t *psrsPeriodicity,uint16_t *psrsOffset)
|
||||
void compute_srs_pos(frame_type_t frameType,uint16_t isrs,uint16_t *psrsPeriodicity,uint16_t *psrsOffset)
|
||||
{
|
||||
if(TDD == frameType)
|
||||
{
|
||||
|
||||
@@ -339,7 +339,7 @@ void dump_dlsch2(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe, unsig
|
||||
|
||||
int is_srs_occasion_common(LTE_DL_FRAME_PARMS *frame_parms,int frame_tx,int subframe_tx);
|
||||
|
||||
void compute_srs_pos(lte_frame_type_t frameType,uint16_t isrs,uint16_t *psrsPeriodicity,uint16_t *psrsOffset);
|
||||
void compute_srs_pos(frame_type_t frameType,uint16_t isrs,uint16_t *psrsPeriodicity,uint16_t *psrsOffset);
|
||||
|
||||
|
||||
/* from here: prototype added to remove compilation warnings, doc to be written by the author of the function */
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <openair1/SCHED/sched_common_extern.h>
|
||||
|
||||
|
||||
// This is the formula from Section 5.1.1.1 in 36.213 100*10*log10((2^(MPR*Ks)-1)), where MPR is in the range [0,6] and Ks=1.25
|
||||
|
||||
@@ -215,7 +215,7 @@ int16_t get_target_pucch_rx_power(module_id_t module_idP, uint8_t CC_id);
|
||||
|
||||
int is_srs_occasion_common(LTE_DL_FRAME_PARMS *frame_parms,int frame_tx,int subframe_tx);
|
||||
|
||||
void compute_srs_pos(lte_frame_type_t frameType,uint16_t isrs,uint16_t *psrsPeriodicity,uint16_t *psrsOffset);
|
||||
void compute_srs_pos(frame_type_t frameType,uint16_t isrs,uint16_t *psrsPeriodicity,uint16_t *psrsOffset);
|
||||
|
||||
void release_rnti_of_phy(module_id_t mod_id);
|
||||
/*@}*/
|
||||
|
||||
@@ -116,16 +116,18 @@ int phy_procedures_RN_UE_RX(unsigned char last_slot, unsigned char next_slot, re
|
||||
void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t eNB_id);
|
||||
|
||||
/*! \brief Scheduling for UE RX procedures in normal subframes.
|
||||
@param ue Pointer to UE variables on which to act
|
||||
@param proc Pointer to proc information
|
||||
@param gNB_id Local id of eNB on which to act
|
||||
@param dlsch_parallel use multithreaded dlsch processing
|
||||
@param txFifo Result fifo if PDSCH is run in parallel
|
||||
@param ue Pointer to UE variables on which to act
|
||||
@param proc Pointer to proc information
|
||||
@param gNB_id Local id of eNB on which to act
|
||||
@param dlsch_parallel use multithreaded dlsch processing
|
||||
@param phy_pdcch_config PDCCH Config for this slot
|
||||
@param txFifo Result fifo if PDSCH is run in parallel
|
||||
*/
|
||||
int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
||||
UE_nr_rxtx_proc_t *proc,
|
||||
uint8_t gNB_id,
|
||||
uint8_t dlsch_parallel,
|
||||
NR_UE_PDCCH_CONFIG *phy_pdcch_config,
|
||||
notifiedFIFO_t *txFifo);
|
||||
|
||||
int phy_procedures_slot_parallelization_nrUE_RX(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t eNB_id, uint8_t abstraction_flag, uint8_t do_pdcch_flag, relaying_type_t r_type);
|
||||
@@ -383,7 +385,8 @@ void nr_fill_dl_indication(nr_downlink_indication_t *dl_ind,
|
||||
fapi_nr_rx_indication_t *rx_ind,
|
||||
UE_nr_rxtx_proc_t *proc,
|
||||
PHY_VARS_NR_UE *ue,
|
||||
uint8_t gNB_id);
|
||||
uint8_t gNB_id,
|
||||
void *phy_data);
|
||||
|
||||
/*@}*/
|
||||
|
||||
@@ -417,8 +420,11 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
|
||||
NR_UE_DLSCH_t *dlsch0, NR_UE_DLSCH_t *dlsch1);
|
||||
|
||||
int nr_ue_pdcch_procedures(uint8_t gNB_id,
|
||||
PHY_VARS_NR_UE *ue,
|
||||
UE_nr_rxtx_proc_t *proc,
|
||||
PHY_VARS_NR_UE *ue,
|
||||
UE_nr_rxtx_proc_t *proc,
|
||||
int32_t pdcch_est_size,
|
||||
int32_t pdcch_dl_ch_estimates[][pdcch_est_size],
|
||||
NR_UE_PDCCH_CONFIG *phy_pdcch_config,
|
||||
int n_ss);
|
||||
|
||||
|
||||
|
||||
@@ -353,15 +353,14 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
|
||||
// Note: we have to handle the thread IDs for this. To be revisited completely.
|
||||
thread_id = scheduled_response->thread_id;
|
||||
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_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_PDCCH_CONFIG *phy_pdcch_config = NULL;
|
||||
|
||||
if(scheduled_response->dl_config != NULL){
|
||||
fapi_nr_dl_config_request_t *dl_config = scheduled_response->dl_config;
|
||||
fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu;
|
||||
fapi_nr_dl_config_dci_dl_pdu_rel15_t *pdcch_config;
|
||||
pdcch_vars->nb_search_space = 0;
|
||||
|
||||
for (int i = 0; i < dl_config->number_pdus; ++i){
|
||||
AssertFatal(dl_config->number_pdus < FAPI_NR_DL_CONFIG_LIST_NUM,"dl_config->number_pdus %d out of bounds\n",dl_config->number_pdus);
|
||||
@@ -371,12 +370,16 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
|
||||
|
||||
switch(dl_config->dl_config_list[i].pdu_type) {
|
||||
case FAPI_NR_DL_CONFIG_TYPE_DCI:
|
||||
if (NULL == phy_pdcch_config) {
|
||||
phy_pdcch_config = (NR_UE_PDCCH_CONFIG *)scheduled_response->phy_data;
|
||||
phy_pdcch_config->nb_search_space = 0;
|
||||
}
|
||||
pdcch_config = &dl_config->dl_config_list[i].dci_config_pdu.dci_config_rel15;
|
||||
memcpy(&pdcch_vars->pdcch_config[pdcch_vars->nb_search_space],pdcch_config,sizeof(*pdcch_config));
|
||||
pdcch_vars->nb_search_space = pdcch_vars->nb_search_space + 1;
|
||||
pdcch_vars->sfn = scheduled_response->frame;
|
||||
pdcch_vars->slot = slot;
|
||||
LOG_D(PHY,"Number of DCI SearchSpaces %d\n",pdcch_vars->nb_search_space);
|
||||
memcpy((void*)&phy_pdcch_config->pdcch_config[phy_pdcch_config->nb_search_space],(void*)pdcch_config,sizeof(*pdcch_config));
|
||||
phy_pdcch_config->nb_search_space = phy_pdcch_config->nb_search_space + 1;
|
||||
phy_pdcch_config->sfn = scheduled_response->frame;
|
||||
phy_pdcch_config->slot = slot;
|
||||
LOG_D(PHY,"Number of DCI SearchSpaces %d\n",phy_pdcch_config->nb_search_space);
|
||||
break;
|
||||
case FAPI_NR_DL_CONFIG_TYPE_CSI_IM:
|
||||
LOG_I(PHY,"Received CSI-IM PDU at FAPI\n");
|
||||
|
||||
@@ -307,7 +307,7 @@ void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq)
|
||||
{
|
||||
dl_harq->status = SCH_IDLE;
|
||||
dl_harq->first_rx = 1;
|
||||
dl_harq->round = 0;
|
||||
dl_harq->DLround = 0;
|
||||
dl_harq->DCINdi = 1;
|
||||
dl_harq->ack = DL_ACKNACK_NO_SET;
|
||||
}
|
||||
@@ -334,60 +334,38 @@ void downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int ndi, int
|
||||
if (rnti_type == _SI_RNTI_ ||
|
||||
rnti_type == _P_RNTI_ ||
|
||||
rnti_type == _RA_RNTI_) {
|
||||
dl_harq->round = 0;
|
||||
dl_harq->DLround = 0;
|
||||
dl_harq->status = ACTIVE;
|
||||
dl_harq->first_rx = 1;
|
||||
}
|
||||
else{
|
||||
switch(rv){
|
||||
case 0:
|
||||
dl_harq->round = 0;
|
||||
dl_harq->status = ACTIVE;
|
||||
dl_harq->first_rx = 1;
|
||||
if (dl_harq->DCINdi == ndi)
|
||||
LOG_E(PHY,"Warning! rv %d indicates new transmission but new ndi %d is the same as old ndi %d\n",rv,ndi,dl_harq->DCINdi);
|
||||
dl_harq->DCINdi = ndi;
|
||||
break;
|
||||
case 1:
|
||||
dl_harq->round = 3;
|
||||
dl_harq->status = ACTIVE;
|
||||
dl_harq->first_rx = 0;
|
||||
if (dl_harq->DCINdi != ndi) {
|
||||
LOG_E(PHY,"Missed previous DCI detections. NDI toggled but rv %d does not correspond to first reception\n",rv);
|
||||
dl_harq->first_rx = 1;
|
||||
dl_harq->DCINdi = ndi;
|
||||
}
|
||||
else if (dl_harq->ack == 1)
|
||||
dl_harq->status = SCH_IDLE;
|
||||
break;
|
||||
case 2:
|
||||
dl_harq->round = 1;
|
||||
dl_harq->status = ACTIVE;
|
||||
dl_harq->first_rx = 0;
|
||||
if (dl_harq->DCINdi != ndi) {
|
||||
LOG_E(PHY,"Missed previous DCI detections. NDI toggled but rv %d does not correspond to first reception\n",rv);
|
||||
dl_harq->first_rx = 1;
|
||||
dl_harq->DCINdi = ndi;
|
||||
}
|
||||
else if (dl_harq->ack == 1)
|
||||
dl_harq->status = SCH_IDLE;
|
||||
break;
|
||||
case 3:
|
||||
dl_harq->round = 2;
|
||||
dl_harq->status = ACTIVE;
|
||||
dl_harq->first_rx = 0;
|
||||
if (dl_harq->DCINdi != ndi) {
|
||||
LOG_E(PHY,"Missed previous DCI detections. NDI toggled but rv %d does not correspond to first reception\n",rv);
|
||||
dl_harq->first_rx = 1;
|
||||
dl_harq->DCINdi = ndi;
|
||||
}
|
||||
else if (dl_harq->ack == 1)
|
||||
dl_harq->status = SCH_IDLE;
|
||||
break;
|
||||
default:
|
||||
AssertFatal(1==0,"Invalid value for rv %d\n",rv);
|
||||
} else {
|
||||
LOG_D(PHY,"receive harq process: %p harqPid=%d, rv=%d, ndi=%d, rntiType=%d new transmission= %s\n",
|
||||
dl_harq, harq_pid, rv, ndi, rnti_type, dl_harq->DCINdi != ndi ? "yes":"no");
|
||||
AssertFatal(rv<4 && rv>=0, "invalid redondancy version %d\n", rv);
|
||||
|
||||
if (ndi!=dl_harq->DCINdi) {
|
||||
if (dl_harq->ack == DL_NACK)
|
||||
LOG_D(PHY,"New transmission on a harq pid (%d) never acknowledged\n", harq_pid);
|
||||
else
|
||||
LOG_D(PHY,"Starting new transmission on a harq pid (%d)\n", harq_pid);
|
||||
} else {
|
||||
if (dl_harq->ack != DL_NACK)
|
||||
LOG_D(PHY,"gNB asked for retransmission even if we sent ACK\n");
|
||||
else
|
||||
LOG_D(PHY,"Starting retransmission on a harq pid (%d), rv (%d)\n", harq_pid, rv);
|
||||
}
|
||||
}
|
||||
|
||||
if (ndi!=dl_harq->DCINdi) {
|
||||
dl_harq->first_rx = true;
|
||||
dl_harq->DLround = 0;
|
||||
} else {
|
||||
dl_harq->first_rx = false;
|
||||
dl_harq->DLround++;
|
||||
}
|
||||
|
||||
dl_harq->status = ACTIVE;
|
||||
|
||||
dl_harq->DCINdi = ndi;
|
||||
//dl_harq->status = SCH_IDLE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -87,7 +87,8 @@ void nr_fill_dl_indication(nr_downlink_indication_t *dl_ind,
|
||||
fapi_nr_rx_indication_t *rx_ind,
|
||||
UE_nr_rxtx_proc_t *proc,
|
||||
PHY_VARS_NR_UE *ue,
|
||||
uint8_t gNB_id){
|
||||
uint8_t gNB_id,
|
||||
void *phy_data){
|
||||
|
||||
memset((void*)dl_ind, 0, sizeof(nr_downlink_indication_t));
|
||||
|
||||
@@ -97,6 +98,7 @@ void nr_fill_dl_indication(nr_downlink_indication_t *dl_ind,
|
||||
dl_ind->frame = proc->frame_rx;
|
||||
dl_ind->slot = proc->nr_slot_rx;
|
||||
dl_ind->thread_id = proc->thread_id;
|
||||
dl_ind->phy_data = phy_data;
|
||||
|
||||
if (dci_ind) {
|
||||
|
||||
@@ -360,7 +362,7 @@ void nr_ue_measurement_procedures(uint16_t l,
|
||||
|
||||
static void nr_ue_pbch_procedures(uint8_t gNB_id,
|
||||
PHY_VARS_NR_UE *ue,
|
||||
UE_nr_rxtx_proc_t *proc,int estimateSz, struct complex16 dl_ch_estimates[][estimateSz])
|
||||
UE_nr_rxtx_proc_t *proc,int estimateSz, struct complex16 dl_ch_estimates[][estimateSz], NR_UE_PDCCH_CONFIG *phy_pdcch_config)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
@@ -380,7 +382,8 @@ static void nr_ue_pbch_procedures(uint8_t gNB_id,
|
||||
gNB_id,
|
||||
(ue->frame_parms.ssb_index)&7,
|
||||
SISO,
|
||||
&result);
|
||||
phy_pdcch_config,
|
||||
&result);
|
||||
|
||||
if (ret==0) {
|
||||
|
||||
@@ -486,6 +489,9 @@ unsigned int nr_get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb
|
||||
int nr_ue_pdcch_procedures(uint8_t gNB_id,
|
||||
PHY_VARS_NR_UE *ue,
|
||||
UE_nr_rxtx_proc_t *proc,
|
||||
int32_t pdcch_est_size,
|
||||
int32_t pdcch_dl_ch_estimates[][pdcch_est_size],
|
||||
NR_UE_PDCCH_CONFIG *phy_pdcch_config,
|
||||
int n_ss)
|
||||
{
|
||||
int frame_rx = proc->frame_rx;
|
||||
@@ -494,13 +500,16 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
|
||||
fapi_nr_dci_indication_t *dci_ind = calloc(1, sizeof(*dci_ind));
|
||||
nr_downlink_indication_t dl_indication;
|
||||
|
||||
NR_UE_PDCCH *pdcch_vars = ue->pdcch_vars[proc->thread_id][gNB_id];
|
||||
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &pdcch_vars->pdcch_config[n_ss];
|
||||
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &phy_pdcch_config->pdcch_config[n_ss];
|
||||
|
||||
start_meas(&ue->dlsch_rx_pdcch_stats);
|
||||
|
||||
/// PDCCH/DCI e-sequence (input to rate matching).
|
||||
int32_t pdcch_e_rx_size = NR_MAX_PDCCH_SIZE;
|
||||
int16_t pdcch_e_rx[pdcch_e_rx_size];
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_IN);
|
||||
nr_rx_pdcch(ue, proc, rel15);
|
||||
nr_rx_pdcch(ue, proc, pdcch_est_size, pdcch_dl_ch_estimates, pdcch_e_rx, rel15);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_OUT);
|
||||
|
||||
|
||||
@@ -511,7 +520,7 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
|
||||
n_ss);
|
||||
#endif
|
||||
|
||||
dci_cnt = nr_dci_decoding_procedure(ue, proc, dci_ind, rel15);
|
||||
dci_cnt = nr_dci_decoding_procedure(ue, proc, pdcch_e_rx, dci_ind, rel15, phy_pdcch_config);
|
||||
|
||||
#ifdef NR_PDCCH_SCHED_DEBUG
|
||||
LOG_I(PHY,"<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Ending function nr_dci_decoding_procedure() -> dci_cnt=%u\n",dci_cnt);
|
||||
@@ -531,11 +540,13 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
|
||||
ue->pdcch_vars[proc->thread_id][gNB_id]->dci_received += dci_cnt;
|
||||
|
||||
dci_ind->number_of_dcis = dci_cnt;
|
||||
|
||||
// fill dl_indication message
|
||||
nr_fill_dl_indication(&dl_indication, dci_ind, NULL, proc, ue, gNB_id);
|
||||
nr_fill_dl_indication(&dl_indication, dci_ind, NULL, proc, ue, gNB_id, phy_pdcch_config);
|
||||
// send to mac
|
||||
ue->if_inst->dl_indication(&dl_indication, NULL);
|
||||
|
||||
|
||||
stop_meas(&ue->dlsch_rx_pdcch_stats);
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT);
|
||||
@@ -801,16 +812,16 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
|
||||
|
||||
switch (pdsch) {
|
||||
case RA_PDSCH:
|
||||
nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id);
|
||||
nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id, NULL);
|
||||
nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_RAR, gNB_id, ue, dlsch0, NULL, number_pdus, proc, NULL);
|
||||
ue->UE_mode[gNB_id] = RA_RESPONSE;
|
||||
break;
|
||||
case PDSCH:
|
||||
nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id);
|
||||
nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id, NULL);
|
||||
nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_DLSCH, gNB_id, ue, dlsch0, NULL, number_pdus, proc, NULL);
|
||||
break;
|
||||
case SI_PDSCH:
|
||||
nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id);
|
||||
nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id, NULL);
|
||||
nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_SIB, gNB_id, ue, dlsch0, NULL, number_pdus, proc, NULL);
|
||||
break;
|
||||
default:
|
||||
@@ -1368,6 +1379,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
||||
UE_nr_rxtx_proc_t *proc,
|
||||
uint8_t gNB_id,
|
||||
uint8_t dlsch_parallel,
|
||||
NR_UE_PDCCH_CONFIG *phy_pdcch_config,
|
||||
notifiedFIFO_t *txFifo
|
||||
)
|
||||
{
|
||||
@@ -1375,10 +1387,9 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
||||
int nr_slot_rx = proc->nr_slot_rx;
|
||||
int slot_pbch;
|
||||
int slot_ssb;
|
||||
NR_UE_PDCCH *pdcch_vars = ue->pdcch_vars[proc->thread_id][0];
|
||||
fapi_nr_config_request_t *cfg = &ue->nrUE_config;
|
||||
|
||||
uint8_t nb_symb_pdcch = pdcch_vars->nb_search_space > 0 ? pdcch_vars->pdcch_config[0].coreset.duration : 0;
|
||||
uint8_t nb_symb_pdcch = phy_pdcch_config->nb_search_space > 0 ? phy_pdcch_config->pdcch_config[0].coreset.duration : 0;
|
||||
uint8_t dci_cnt = 0;
|
||||
NR_DL_FRAME_PARMS *fp = &ue->frame_parms;
|
||||
|
||||
@@ -1397,8 +1408,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
||||
int coreset_nb_rb=0;
|
||||
int coreset_start_rb=0;
|
||||
|
||||
if (pdcch_vars->nb_search_space > 0)
|
||||
get_coreset_rballoc(pdcch_vars->pdcch_config[0].coreset.frequency_domain_resource,&coreset_nb_rb,&coreset_start_rb);
|
||||
if (phy_pdcch_config->nb_search_space > 0)
|
||||
get_coreset_rballoc(phy_pdcch_config->pdcch_config[0].coreset.frequency_domain_resource,&coreset_nb_rb,&coreset_start_rb);
|
||||
|
||||
slot_pbch = is_pbch_in_slot(cfg, frame_rx, nr_slot_rx, fp);
|
||||
slot_ssb = is_ssb_in_slot(cfg, frame_rx, nr_slot_rx, fp);
|
||||
@@ -1429,7 +1440,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
||||
if ((ue->decode_MIB == 1) && slot_pbch) {
|
||||
|
||||
LOG_D(PHY," ------ Decode MIB: frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx);
|
||||
nr_ue_pbch_procedures(gNB_id, ue, proc, estimateSz, dl_ch_estimates);
|
||||
nr_ue_pbch_procedures(gNB_id, ue, proc, estimateSz, dl_ch_estimates, phy_pdcch_config);
|
||||
|
||||
if (ue->no_timing_correction==0) {
|
||||
LOG_D(PHY,"start adjust sync slot = %d no timing %d\n", nr_slot_rx, ue->no_timing_correction);
|
||||
@@ -1470,13 +1481,17 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
||||
nr_slot_rx);
|
||||
}
|
||||
|
||||
// Hold the channel estimates in frequency domain.
|
||||
int32_t pdcch_est_size = ((((fp->symbols_per_slot*(fp->ofdm_symbol_size+LTE_CE_FILTER_LENGTH))+15)/16)*16);
|
||||
__attribute__ ((aligned(16))) int32_t pdcch_dl_ch_estimates[4*fp->nb_antennas_rx][pdcch_est_size];
|
||||
|
||||
dci_cnt = 0;
|
||||
for(int n_ss = 0; n_ss<pdcch_vars->nb_search_space; n_ss++) {
|
||||
for(int n_ss = 0; n_ss<phy_pdcch_config->nb_search_space; n_ss++) {
|
||||
for (uint16_t l=0; l<nb_symb_pdcch; l++) {
|
||||
|
||||
// note: this only works if RBs for PDCCH are contigous!
|
||||
LOG_D(PHY, "pdcch_channel_estimation: first_carrier_offset %d, BWPStart %d, coreset_start_rb %d, coreset_nb_rb %d\n",
|
||||
fp->first_carrier_offset, pdcch_vars->pdcch_config[n_ss].BWPStart, coreset_start_rb, coreset_nb_rb);
|
||||
fp->first_carrier_offset, phy_pdcch_config->pdcch_config[n_ss].BWPStart, coreset_start_rb, coreset_nb_rb);
|
||||
|
||||
if (coreset_nb_rb > 0)
|
||||
nr_pdcch_channel_estimation(ue,
|
||||
@@ -1484,14 +1499,16 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
||||
gNB_id,
|
||||
nr_slot_rx,
|
||||
l,
|
||||
pdcch_vars->pdcch_config[n_ss].coreset.pdcch_dmrs_scrambling_id,
|
||||
fp->first_carrier_offset+(pdcch_vars->pdcch_config[n_ss].BWPStart + coreset_start_rb)*12,
|
||||
coreset_nb_rb);
|
||||
phy_pdcch_config->pdcch_config[n_ss].coreset.pdcch_dmrs_scrambling_id,
|
||||
fp->first_carrier_offset+(phy_pdcch_config->pdcch_config[n_ss].BWPStart + coreset_start_rb)*12,
|
||||
coreset_nb_rb,
|
||||
pdcch_est_size,
|
||||
pdcch_dl_ch_estimates);
|
||||
|
||||
stop_meas(&ue->ofdm_demod_stats);
|
||||
|
||||
}
|
||||
dci_cnt = dci_cnt + nr_ue_pdcch_procedures(gNB_id, ue, proc, n_ss);
|
||||
dci_cnt = dci_cnt + nr_ue_pdcch_procedures(gNB_id, ue, proc, pdcch_est_size, pdcch_dl_ch_estimates, phy_pdcch_config, n_ss);
|
||||
}
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDCCH, VCD_FUNCTION_OUT);
|
||||
|
||||
|
||||
@@ -574,7 +574,7 @@ void get_cqipmiri_params(PHY_VARS_UE *ue,
|
||||
}
|
||||
}
|
||||
|
||||
PUCCH_FMT_t get_pucch_format(lte_frame_type_t frame_type,
|
||||
PUCCH_FMT_t get_pucch_format(frame_type_t frame_type,
|
||||
lte_prefix_type_t cyclic_prefix_type,
|
||||
uint8_t SR_payload,
|
||||
uint8_t nb_cw,
|
||||
@@ -4870,109 +4870,3 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,
|
||||
LOG_D(PHY," ****** end RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, subframe_rx);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
void phy_procedures_UE_lte(PHY_VARS_UE *ue,
|
||||
UE_rxtx_proc_t *proc,
|
||||
uint8_t eNB_id,
|
||||
uint8_t abstraction_flag,
|
||||
uint8_t do_pdcch_flag,
|
||||
runmode_t mode) {
|
||||
MessageDef *msg_p;
|
||||
int result;
|
||||
int frame_rx = proc->frame_rx;
|
||||
int frame_tx = proc->frame_tx;
|
||||
int subframe_rx = proc->subframe_rx;
|
||||
int subframe_tx = proc->subframe_tx;
|
||||
UE_L2_STATE_t ret;
|
||||
int slot;
|
||||
|
||||
if (ue->mac_enabled == 0) {
|
||||
ue->UE_mode[eNB_id]=PUSCH;
|
||||
}
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,1);
|
||||
|
||||
if ( LOG_DEBUGFLAG(UE_TIMING)) {
|
||||
start_meas(&ue->phy_proc[ue->current_thread_id[subframe_rx]]);
|
||||
}
|
||||
do {
|
||||
// Checks if a message has been sent to PHY sub-task
|
||||
itti_poll_msg (TASK_PHY_UE, &msg_p);
|
||||
|
||||
if (msg_p != NULL) {
|
||||
switch (ITTI_MSG_ID(msg_p)) {
|
||||
case PHY_FIND_CELL_REQ:
|
||||
LOG_I(PHY, "[UE ] Received %s\n", ITTI_MSG_NAME (msg_p));
|
||||
/* TODO process the message */
|
||||
break;
|
||||
|
||||
default:
|
||||
LOG_E(PHY, "[UE %ld] Received unexpected message %s\n", ITTI_MSG_DESTINATION_INSTANCE (msg_p), ITTI_MSG_NAME (msg_p));
|
||||
break;
|
||||
}
|
||||
|
||||
result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
|
||||
AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
|
||||
}
|
||||
} while(msg_p != NULL);
|
||||
|
||||
for (slot=0; slot<2; slot++) {
|
||||
if ((subframe_select(&ue->frame_parms,subframe_tx)==SF_UL)||
|
||||
(ue->frame_parms.frame_type == FDD)) {
|
||||
phy_procedures_UE_TX(ue,proc,eNB_id,abstraction_flag,mode);
|
||||
}
|
||||
|
||||
if ((subframe_select(&ue->frame_parms,subframe_rx)==SF_DL) ||
|
||||
(ue->frame_parms.frame_type == FDD)) {
|
||||
phy_procedures_UE_RX(ue,proc,eNB_id,abstraction_flag,do_pdcch_flag,mode);
|
||||
}
|
||||
|
||||
if ((subframe_select(&ue->frame_parms,subframe_tx)==SF_S) &&
|
||||
(slot==1)) {
|
||||
phy_procedures_UE_S_TX(ue,eNB_id,abstraction_flag);
|
||||
}
|
||||
|
||||
if ((subframe_select(&ue->frame_parms,subframe_rx)==SF_S) &&
|
||||
(slot==0)) {
|
||||
phy_procedures_UE_RX(ue,proc,eNB_id,abstraction_flag,do_pdcch_flag,mode);
|
||||
}
|
||||
|
||||
if (ue->mac_enabled==1) {
|
||||
if (slot==0) {
|
||||
//LOG_I(PHY,"[UE %d] Frame %d, subframe %d, star ue_scheduler\n", ue->Mod_id,frame_rx,subframe_tx);
|
||||
ret = ue_scheduler(ue->Mod_id,
|
||||
frame_rx,
|
||||
subframe_rx,
|
||||
frame_tx,
|
||||
subframe_tx,
|
||||
subframe_select(&ue->frame_parms,subframe_tx),
|
||||
eNB_id,
|
||||
0/*FIXME CC_id*/);
|
||||
|
||||
if (ret == CONNECTION_LOST) {
|
||||
LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, returning to PRACH\n",ue->Mod_id,
|
||||
frame_rx,subframe_tx);
|
||||
ue->UE_mode[eNB_id] = PRACH;
|
||||
// mac_xface->macphy_exit("Connection lost");
|
||||
} else if (ret == PHY_RESYNCH) {
|
||||
LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, trying to resynch\n",
|
||||
ue->Mod_id,
|
||||
frame_rx,subframe_tx);
|
||||
ue->UE_mode[eNB_id] = RESYNCH;
|
||||
// mac_xface->macphy_exit("Connection lost");
|
||||
} else if (ret == PHY_HO_PRACH) {
|
||||
LOG_I(PHY,"[UE %d] Frame %d, subframe %d, return to PRACH and perform a contention-free access\n",
|
||||
ue->Mod_id,frame_rx,subframe_tx);
|
||||
ue->UE_mode[eNB_id] = PRACH;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,0);
|
||||
|
||||
if (LOG_DEBUGFLAG(UE_TIMING)) {
|
||||
stop_meas(&ue->phy_proc[ue->current_thread_id[subframe_rx]]);
|
||||
}
|
||||
} // slot
|
||||
}
|
||||
|
||||
@@ -278,7 +278,7 @@ void dump_dlsch2(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe, unsig
|
||||
|
||||
int is_srs_occasion_common(LTE_DL_FRAME_PARMS *frame_parms,int frame_tx,int subframe_tx);
|
||||
|
||||
void compute_srs_pos(lte_frame_type_t frameType,uint16_t isrs,uint16_t *psrsPeriodicity,uint16_t *psrsOffset);
|
||||
void compute_srs_pos(frame_type_t frameType,uint16_t isrs,uint16_t *psrsPeriodicity,uint16_t *psrsOffset);
|
||||
|
||||
/*@}*/
|
||||
|
||||
|
||||
@@ -415,7 +415,7 @@ int main(int argc, char **argv) {
|
||||
uint8_t harq_pid;
|
||||
uint8_t phich_ACK;
|
||||
uint8_t num_phich_interf = 0;
|
||||
lte_frame_type_t frame_type=TDD;
|
||||
frame_type_t frame_type=TDD;
|
||||
// int re_offset;
|
||||
// uint32_t *txptr;
|
||||
int aarx;
|
||||
|
||||
@@ -478,14 +478,11 @@ int main(int argc, char **argv)
|
||||
harq_process->n_dmrs_cdm_groups = 1;
|
||||
printf("harq process ue mcs = %d Qm = %d, symb %d\n", harq_process->mcs, harq_process->Qm, nb_symb_sch);
|
||||
|
||||
unsigned char *test_input;
|
||||
test_input = (unsigned char *) malloc16(sizeof(unsigned char) * TBS / 8);
|
||||
unsigned char *test_input=dlsch->harq_process.pdu;
|
||||
//unsigned char test_input[TBS / 8] __attribute__ ((aligned(16)));
|
||||
for (i = 0; i < TBS / 8; i++)
|
||||
test_input[i] = (unsigned char) rand();
|
||||
|
||||
//estimated_output = harq_process->b;
|
||||
|
||||
#ifdef DEBUG_NR_DLSCHSIM
|
||||
for (i = 0; i < TBS / 8; i++) printf("test_input[i]=%hhu \n",test_input[i]);
|
||||
#endif
|
||||
@@ -498,7 +495,7 @@ int main(int argc, char **argv)
|
||||
unsigned char output[rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS] __attribute__((aligned(32)));
|
||||
bzero(output,rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS);
|
||||
if (input_fd == NULL) {
|
||||
nr_dlsch_encoding(gNB, test_input, frame, slot, dlsch, frame_parms,output,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
|
||||
nr_dlsch_encoding(gNB, frame, slot, &dlsch->harq_process, frame_parms,output,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
for (SNR = snr0; SNR < snr1; SNR += snr_step) {
|
||||
@@ -618,8 +615,6 @@ int main(int argc, char **argv)
|
||||
}
|
||||
}*/
|
||||
|
||||
free(test_input);
|
||||
|
||||
free_channel_desc_scm(gNB2UE);
|
||||
|
||||
reset_DLSCH_struct(gNB, &msgDataTx);
|
||||
|
||||
@@ -1003,6 +1003,8 @@ int main(int argc, char **argv)
|
||||
|
||||
nr_dcireq_t dcireq;
|
||||
nr_scheduled_response_t scheduled_response;
|
||||
NR_UE_PDCCH_CONFIG phy_pdcch_config={0};
|
||||
|
||||
memset((void*)&dcireq,0,sizeof(dcireq));
|
||||
memset((void*)&scheduled_response,0,sizeof(scheduled_response));
|
||||
dcireq.module_id = 0;
|
||||
@@ -1017,6 +1019,7 @@ int main(int argc, char **argv)
|
||||
scheduled_response.frame = frame;
|
||||
scheduled_response.slot = slot;
|
||||
scheduled_response.thread_id = 0;
|
||||
scheduled_response.phy_data = &phy_pdcch_config;
|
||||
|
||||
nr_ue_phy_config_request(&UE_mac->phy_config);
|
||||
//NR_COMMON_channels_t *cc = RC.nrmac[0]->common_channels;
|
||||
@@ -1086,7 +1089,7 @@ int main(int argc, char **argv)
|
||||
|
||||
UE_harq_process->ack = 0;
|
||||
round = 0;
|
||||
UE_harq_process->round = round;
|
||||
UE_harq_process->DLround = round;
|
||||
UE_harq_process->first_rx = 1;
|
||||
|
||||
while ((round<num_rounds) && (UE_harq_process->ack==0)) {
|
||||
@@ -1259,6 +1262,7 @@ int main(int argc, char **argv)
|
||||
&UE_proc,
|
||||
0,
|
||||
dlsch_threads,
|
||||
&phy_pdcch_config,
|
||||
NULL);
|
||||
|
||||
//printf("dlsim round %d ends\n",round);
|
||||
@@ -1407,8 +1411,6 @@ int main(int argc, char **argv)
|
||||
LOG_M("chestF0.m","chF0",&UE->pdsch_vars[0][0]->dl_ch_estimates_ext[0][0],g_rbSize*12*14,1,1);
|
||||
write_output("rxF_comp.m","rxFc",&UE->pdsch_vars[0][0]->rxdataF_comp0[0][0],N_RB_DL*12*14,1,1);
|
||||
LOG_M("rxF_llr.m","rxFllr",UE->pdsch_vars[UE_proc.thread_id][0]->llr[0],available_bits,1,0);
|
||||
LOG_M("pdcch_rxFcomp.m","pdcch_rxFcomp",&UE->pdcch_vars[0][0]->rxdataF_comp[0][0],96*12,1,1);
|
||||
LOG_M("pdcch_rxFllr.m","pdcch_rxFllr",UE->pdcch_vars[0][0]->llr,96*12,1,1);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -28,7 +28,8 @@ void nr_fill_dl_indication(nr_downlink_indication_t *dl_ind,
|
||||
fapi_nr_rx_indication_t *rx_ind,
|
||||
UE_nr_rxtx_proc_t *proc,
|
||||
PHY_VARS_NR_UE *ue,
|
||||
uint8_t gNB_id) {}
|
||||
uint8_t gNB_id,
|
||||
void *phy_data) {}
|
||||
void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind,
|
||||
uint8_t pdu_type,
|
||||
uint8_t gNB_id,
|
||||
|
||||
@@ -74,7 +74,10 @@ void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq) {}
|
||||
int nr_ue_pdcch_procedures(uint8_t gNB_id,
|
||||
PHY_VARS_NR_UE *ue,
|
||||
UE_nr_rxtx_proc_t *proc,
|
||||
int n_ss) {
|
||||
int32_t pdcch_est_size,
|
||||
int32_t pdcch_dl_ch_estimates[][pdcch_est_size],
|
||||
NR_UE_PDCCH_CONFIG *phy_pdcch_config,
|
||||
int n_ss) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -722,6 +725,8 @@ int main(int argc, char **argv)
|
||||
}
|
||||
else {
|
||||
UE_nr_rxtx_proc_t proc={0};
|
||||
NR_UE_PDCCH_CONFIG phy_pdcch_config={0};
|
||||
|
||||
UE->rx_offset=0;
|
||||
uint8_t ssb_index = 0;
|
||||
const int estimateSz=7*2*sizeof(int)*frame_parms->ofdm_symbol_size;
|
||||
@@ -750,7 +755,8 @@ int main(int argc, char **argv)
|
||||
0,
|
||||
ssb_index%8,
|
||||
SISO,
|
||||
&result);
|
||||
&phy_pdcch_config,
|
||||
&result);
|
||||
|
||||
if (ret==0) {
|
||||
//UE->rx_ind.rx_indication_body->mib_pdu.ssb_index; //not yet detected automatically
|
||||
|
||||
@@ -551,7 +551,7 @@ int main(int argc, char **argv)
|
||||
|
||||
if (n_trials==1) printf("txlev %d (%f dB), offset %d, sigma2 %f ( %f dB)\n",txlev,10*log10(txlev),startingSymbolIndex*frame_parms->ofdm_symbol_size,sigma2,sigma2_dB);
|
||||
|
||||
struct complex16 **rxdataF = (struct complex16 **)gNB->common_vars.rxdataF;
|
||||
c16_t **rxdataF = (struct complex16 **)gNB->common_vars.rxdataF;
|
||||
for (int symb=0; symb<gNB->frame_parms.symbols_per_slot;symb++) {
|
||||
if (symb<startingSymbolIndex || symb >= startingSymbolIndex+nrofSymbols) {
|
||||
int i0 = symb*gNB->frame_parms.ofdm_symbol_size;
|
||||
|
||||
@@ -285,7 +285,7 @@ int main(int argc, char *argv[])
|
||||
uint8_t nb_antennas_tx = 1;
|
||||
uint8_t nb_antennas_rx = 1;
|
||||
uint8_t frame_type = FDD;
|
||||
uint8_t N_RB_DL=100;
|
||||
int N_RB_DL=100;
|
||||
lte_prefix_type_t extended_prefix_flag = NORMAL;
|
||||
int Nid_cell[] = {(3*0+0)};
|
||||
VOID_PARAMETER argc;
|
||||
|
||||
@@ -200,7 +200,7 @@ int main(int argc, char *argv[])
|
||||
uint8_t nb_antennas_tx = 1;
|
||||
uint8_t nb_antennas_rx = 1;
|
||||
uint8_t frame_type = FDD;
|
||||
uint8_t N_RB_DL=100;
|
||||
int N_RB_DL=100;
|
||||
lte_prefix_type_t extended_prefix_flag = NORMAL;
|
||||
int Nid_cell[] = {(3*0+0)};
|
||||
VOID_PARAMETER argc;
|
||||
|
||||
@@ -379,7 +379,7 @@ int main(int argc, char *argv[])
|
||||
uint8_t nb_antennas_tx = 1;
|
||||
uint8_t nb_antennas_rx = 1;
|
||||
uint8_t frame_type = FDD;
|
||||
uint8_t N_RB_DL=100;
|
||||
int N_RB_DL=100;
|
||||
lte_prefix_type_t extended_prefix_flag = NORMAL;
|
||||
int decoded_pbch = -1;
|
||||
int Nid1, Nid2;
|
||||
|
||||
@@ -184,7 +184,7 @@ int main(int argc, char *argv[])
|
||||
uint8_t nb_antennas_rx = 1;
|
||||
uint16_t Nid_cell=123;
|
||||
uint8_t frame_type=FDD;
|
||||
uint8_t N_RB_DL=100;
|
||||
int N_RB_DL=100;
|
||||
lte_prefix_type_t extended_prefix_flag=NORMAL;
|
||||
const char *name_test = "PSS NR";
|
||||
test_t test = { name_test, 0, 0, 0, 0};
|
||||
|
||||
@@ -206,7 +206,7 @@ void undefined_function(const char *function) {
|
||||
*********************************************************************/
|
||||
|
||||
int init_test(unsigned char N_tx, unsigned char N_rx, unsigned char transmission_mode,
|
||||
unsigned char extended_prefix_flag, uint8_t frame_type, uint16_t Nid_cell, uint8_t N_RB_DL) {
|
||||
unsigned char extended_prefix_flag, uint8_t frame_type, uint16_t Nid_cell, int N_RB_DL) {
|
||||
(void) transmission_mode;
|
||||
NR_DL_FRAME_PARMS *frame_parms;
|
||||
int log_level = OAILOG_TRACE;
|
||||
|
||||
@@ -90,7 +90,7 @@ int set_pss_in_rx_buffer(PHY_VARS_NR_UE *PHY_vars_UE, int position_symbol, int p
|
||||
|
||||
int init_test(unsigned char N_tx, unsigned char N_rx, unsigned char transmission_mode,
|
||||
unsigned char extended_prefix_flag, uint8_t frame_type, uint16_t Nid_cell,
|
||||
uint8_t N_RB_DL);
|
||||
int N_RB_DL);
|
||||
|
||||
void display_test_configuration_pss(int position, int pss_sequence_number);
|
||||
|
||||
|
||||
@@ -142,7 +142,7 @@ int main(int argc, char *argv[]) {
|
||||
uint8_t nb_antennas_tx = 1;
|
||||
uint8_t nb_antennas_rx = 1;
|
||||
uint8_t frame_type = FDD;
|
||||
uint8_t N_RB_DL=106;
|
||||
int N_RB_DL=106;
|
||||
lte_prefix_type_t extended_prefix_flag = NORMAL;
|
||||
int Nid_cell[] = {(3*1+3)};
|
||||
VOID_PARAMETER argc;
|
||||
|
||||
@@ -1239,7 +1239,7 @@ int main(int argc, char *argv[])
|
||||
uint8_t nb_antennas_tx = 1;
|
||||
uint8_t nb_antennas_rx = 1;
|
||||
uint8_t frame_type = FDD;
|
||||
uint8_t N_RB_DL=100;
|
||||
int N_RB_DL=100;
|
||||
lte_prefix_type_t extended_prefix_flag = NORMAL;
|
||||
int Nid_cell[] = {(3*1+3)};
|
||||
VOID_PARAMETER argc;
|
||||
|
||||
@@ -442,7 +442,7 @@ int main(int argc, char *argv[])
|
||||
uint8_t nb_antennas_tx = 1;
|
||||
uint8_t nb_antennas_rx = 1;
|
||||
uint8_t frame_type = FDD;
|
||||
uint8_t N_RB_DL=100;
|
||||
int N_RB_DL=100;
|
||||
lte_prefix_type_t extended_prefix_flag = NORMAL;
|
||||
int Nid_cell[] = {(3*0+0)};
|
||||
VOID_PARAMETER argc;
|
||||
|
||||
@@ -181,7 +181,7 @@ int main(int argc, char *argv[])
|
||||
uint8_t nb_antennas_tx = 1;
|
||||
uint8_t nb_antennas_rx = 1;
|
||||
uint8_t frame_type = FDD;
|
||||
uint8_t N_RB_DL=100;
|
||||
int N_RB_DL=100;
|
||||
lte_prefix_type_t extended_prefix_flag = NORMAL;
|
||||
int phase;
|
||||
int Nid1, Nid2;
|
||||
|
||||
Reference in New Issue
Block a user