From 21744d883aa11689f988d0f46f91d88c8f81c066 Mon Sep 17 00:00:00 2001 From: francescomani <email@francescomani.it> Date: Thu, 9 May 2024 18:11:27 +0200 Subject: [PATCH] code improvement and formatting --- openair1/PHY/NR_REFSIG/nr_refsig.h | 15 + openair1/PHY/NR_TRANSPORT/nr_csi_rs.c | 977 +++++++++--------- .../PHY/NR_TRANSPORT/nr_transport_proto.h | 15 - .../nr_dl_channel_estimation.c | 1 - openair1/PHY/NR_UE_TRANSPORT/csi_rx.c | 58 +- .../NR_UE_TRANSPORT/nr_dlsch_demodulation.c | 1 - openair1/SCHED_NR_UE/defs.h | 6 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 4 +- 8 files changed, 523 insertions(+), 554 deletions(-) diff --git a/openair1/PHY/NR_REFSIG/nr_refsig.h b/openair1/PHY/NR_REFSIG/nr_refsig.h index c8afffa7d3d..47afec9ef1e 100644 --- a/openair1/PHY/NR_REFSIG/nr_refsig.h +++ b/openair1/PHY/NR_REFSIG/nr_refsig.h @@ -61,6 +61,21 @@ int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB, uint32_t re_offset, uint8_t dmrs_type); +void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms, + int32_t **dataF, + const int16_t amp, + nr_csi_info_t *nr_csi_info, + const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csi_params, + const int slot, + uint8_t *N_cdm_groups, + uint8_t *CDM_group_size, + uint8_t *k_prime, + uint8_t *l_prime, + uint8_t *N_ports, + uint8_t *j_cdm, + uint8_t *k_overline, + uint8_t *l_overline); + void init_scrambling_luts(void); void nr_generate_modulation_table(void); diff --git a/openair1/PHY/NR_TRANSPORT/nr_csi_rs.c b/openair1/PHY/NR_TRANSPORT/nr_csi_rs.c index 716a8b52bec..001ad8ad87a 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_csi_rs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_csi_rs.c @@ -19,23 +19,21 @@ * contact@openairinterface.org */ - -#include "PHY/NR_TRANSPORT/nr_transport_proto.h" #include "PHY/MODULATION/nr_modulation.h" #include "PHY/NR_REFSIG/nr_refsig.h" //#define NR_CSIRS_DEBUG -void nr_init_csi_rs(const NR_DL_FRAME_PARMS *fp, uint32_t ***csi_rs, uint32_t Nid) { - uint32_t x1 = 0, x2 = 0; - uint8_t reset; - int csi_dmrs_init_length = ((fp->N_RB_DL<<4)>>5)+1; - for (uint8_t slot=0; slot<fp->slots_per_frame; slot++) { - for (uint8_t symb=0; symb<fp->symbols_per_slot; symb++) { - reset = 1; - x2 = ((1<<10) * (fp->symbols_per_slot*slot+symb+1) * ((Nid<<1)+1) + (Nid)); - for (uint32_t n=0; n<csi_dmrs_init_length; n++) { +void nr_init_csi_rs(const NR_DL_FRAME_PARMS *fp, uint32_t ***csi_rs, uint32_t Nid) +{ + uint32_t x1 = 0; + int csi_dmrs_init_length = ((fp->N_RB_DL << 4) >> 5) + 1; + for (int slot = 0; slot < fp->slots_per_frame; slot++) { + for (int symb = 0; symb < fp->symbols_per_slot; symb++) { + uint8_t reset = 1; + uint32_t x2 = ((1 << 10) * (fp->symbols_per_slot * slot + symb + 1) * ((Nid << 1) + 1) + Nid); + for (uint32_t n = 0; n < csi_dmrs_init_length; n++) { csi_rs[slot][symb][n] = lte_gold_generic(&x1, &x2, reset); reset = 0; } @@ -56,8 +54,8 @@ void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms, uint8_t *N_ports, uint8_t *j_cdm, uint8_t *k_overline, - uint8_t *l_overline) { - + uint8_t *l_overline) +{ #ifdef NR_CSIRS_DEBUG LOG_I(NR_PHY, "csi_params->subcarrier_spacing = %i\n", csi_params->subcarrier_spacing); LOG_I(NR_PHY, "csi_params->cyclic_prefix = %i\n", csi_params->cyclic_prefix); @@ -75,19 +73,12 @@ void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms, LOG_I(NR_PHY, "csi_params->power_control_offset_ss = %i\n", csi_params->power_control_offset_ss); #endif - int dataF_offset = slot*frame_parms->samples_per_slot_wCP; + int dataF_offset = slot * frame_parms->samples_per_slot_wCP; uint32_t **nr_gold_csi_rs = nr_csi_info->nr_gold_csi_rs[slot]; //*8(max allocation per RB)*2(QPSK)) - int csi_rs_length = frame_parms->N_RB_DL<<4; + int csi_rs_length = frame_parms->N_RB_DL << 4; int16_t mod_csi[frame_parms->symbols_per_slot][csi_rs_length>>1] __attribute__((aligned(16))); uint16_t b = csi_params->freq_domain; - uint16_t n, p, k, l, mprime, na, kpn; - uint8_t size, ports, kprime, lprime, i, gs; - uint8_t j[16], k_n[6], koverline[16], loverline[16]; - int found = 0; - int wf, wt, lp, kp, symb; - uint8_t fi = 0; - double rho, alpha; uint32_t beta = amp; nr_csi_info->csi_rs_generated_signal_bits = log2_approx(amp); @@ -99,469 +90,479 @@ void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms, nr_init_csi_rs(frame_parms, nr_csi_info->nr_gold_csi_rs, csi_params->scramb_id); } - switch (csi_params->row) { + int size, ports, kprime, lprime; + int j[16], k_n[6], koverline[16], loverline[16]; + int found = 0; + int fi = 0; + // implementation of table 7.4.1.5.3-1 of 38.211 // lprime and kprime are the max value of l' and k' - case 1: - ports = 1; - kprime = 0; - lprime = 0; - size = 3; - while (found < 1) { - if ((b >> fi) & 0x01) { - k_n[found] = fi; - found++; - } - else + switch (csi_params->row) { + case 1: + ports = 1; + kprime = 0; + lprime = 0; + size = 3; + while (found < 1) { + if ((b >> fi) & 0x01) { + k_n[found] = fi; + found++; + } + else + fi++; + } + for (int i = 0; i < size; i++) { + j[i] = 0; + loverline[i] = csi_params->symb_l0; + koverline[i] = k_n[0] + (i<<2); + } + break; + case 2: + ports = 1; + kprime = 0; + lprime = 0; + size = 1; + while (found < 1) { + if ((b >> fi) & 0x01) { + k_n[found] = fi; + found++; + } + else + fi++; + } + for (int i = 0; i < size; i++) { + j[i] = 0; + loverline[i] = csi_params->symb_l0; + koverline[i] = k_n[0]; + } + break; + case 3: + ports = 2; + kprime = 1; + lprime = 0; + size = 1; + while (found < 1) { + if ((b >> fi) & 0x01) { + k_n[found] = fi << 1; + found++; + } + else + fi++; + } + for (int i = 0; i < size; i++) { + j[i] = 0; + loverline[i] = csi_params->symb_l0; + koverline[i] = k_n[0]; + } + break; + case 4: + ports = 4; + kprime = 1; + lprime = 0; + size = 2; + while (found < 1) { + if ((b >> fi) & 0x01) { + k_n[found] = fi << 2; + found++; + } + else + fi++; + } + for (int i = 0; i < size; i++) { + j[i] = i; + loverline[i] = csi_params->symb_l0; + koverline[i] = k_n[0] + (i << 1); + } + break; + case 5: + ports = 4; + kprime = 1; + lprime = 0; + size = 2; + while (found < 1) { + if ((b >> fi) & 0x01) { + k_n[found] = fi << 1; + found++; + } + else + fi++; + } + for (int i = 0; i < size; i++) { + j[i] = i; + loverline[i] = csi_params->symb_l0 + i; + koverline[i] = k_n[0]; + } + break; + case 6: + ports = 8; + kprime = 1; + lprime = 0; + size = 4; + while (found < 4) { + if ((b >> fi) & 0x01) { + k_n[found] = fi << 1; + found++; + } fi++; - } - for (i=0; i<size; i++) { - j[i] = 0; - loverline[i] = csi_params->symb_l0; - koverline[i] = k_n[0] + (i<<2); - } - break; - - case 2: - ports = 1; - kprime = 0; - lprime = 0; - size = 1; - while (found < 1) { - if ((b >> fi) & 0x01) { - k_n[found] = fi; - found++; - } - else + } + for (int i = 0; i < size; i++) { + j[i] = i; + loverline[i] = csi_params->symb_l0; + koverline[i] = k_n[i]; + } + break; + case 7: + ports = 8; + kprime = 1; + lprime = 0; + size = 4; + while (found < 2) { + if ((b >> fi) & 0x01) { + k_n[found] = fi << 1; + found++; + } fi++; - } - for (i=0; i<size; i++) { - j[i] = 0; - loverline[i] = csi_params->symb_l0; - koverline[i] = k_n[0]; - } - break; - - case 3: - ports = 2; - kprime = 1; - lprime = 0; - size = 1; - while (found < 1) { - if ((b >> fi) & 0x01) { - k_n[found] = fi<<1; - found++; - } - else + } + for (int i = 0; i < size; i++) { + j[i] = i; + loverline[i] = csi_params->symb_l0 + (i >> 1); + koverline[i] = k_n[i % 2]; + } + break; + case 8: + ports = 8; + kprime = 1; + lprime = 1; + size = 2; + while (found < 2) { + if ((b >> fi) & 0x01) { + k_n[found] = fi << 1; + found++; + } fi++; - } - for (i=0; i<size; i++) { - j[i] = 0; - loverline[i] = csi_params->symb_l0; - koverline[i] = k_n[0]; - } - break; - - case 4: - ports = 4; - kprime = 1; - lprime = 0; - size = 2; - while (found < 1) { - if ((b >> fi) & 0x01) { - k_n[found] = fi<<2; - found++; - } - else + } + for (int i = 0; i < size; i++) { + j[i] = i; + loverline[i] = csi_params->symb_l0; + koverline[i] = k_n[i]; + } + break; + case 9: + ports = 12; + kprime = 1; + lprime = 0; + size = 6; + while (found < 6) { + if ((b >> fi) & 0x01) { + k_n[found] = fi << 1; + found++; + } fi++; - } - for (i=0; i<size; i++) { - j[i] = i; - loverline[i] = csi_params->symb_l0; - koverline[i] = k_n[0] + (i<<1); - } - break; - - case 5: - ports = 4; - kprime = 1; - lprime = 0; - size = 2; - while (found < 1) { - if ((b >> fi) & 0x01) { - k_n[found] = fi<<1; - found++; - } - else + } + for (int i = 0; i < size; i++) { + j[i] = i; + loverline[i] = csi_params->symb_l0; + koverline[i] = k_n[i]; + } + break; + case 10: + ports = 12; + kprime = 1; + lprime = 1; + size = 3; + while (found < 3) { + if ((b >> fi) & 0x01) { + k_n[found] = fi << 1; + found++; + } fi++; - } - for (i=0; i<size; i++) { - j[i] = i; - loverline[i] = csi_params->symb_l0 + i; - koverline[i] = k_n[0]; - } - break; - - case 6: - ports = 8; - kprime = 1; - lprime = 0; - size = 4; - while (found < 4) { - if ((b >> fi) & 0x01) { - k_n[found] = fi<<1; - found++; - } - fi++; - } - for (i=0; i<size; i++) { - j[i] = i; - loverline[i] = csi_params->symb_l0; - koverline[i] = k_n[i]; - } - break; - - case 7: - ports = 8; - kprime = 1; - lprime = 0; - size = 4; - while (found < 2) { - if ((b >> fi) & 0x01) { - k_n[found] = fi<<1; - found++; - } - fi++; - } - for (i=0; i<size; i++) { - j[i] = i; - loverline[i] = csi_params->symb_l0 + (i>>1); - koverline[i] = k_n[i%2]; - } - break; - - case 8: - ports = 8; - kprime = 1; - lprime = 1; - size = 2; - while (found < 2) { - if ((b >> fi) & 0x01) { - k_n[found] = fi<<1; - found++; - } - fi++; - } - for (i=0; i<size; i++) { - j[i] = i; - loverline[i] = csi_params->symb_l0; - koverline[i] = k_n[i]; - } - break; - - case 9: - ports = 12; - kprime = 1; - lprime = 0; - size = 6; - while (found < 6) { - if ((b >> fi) & 0x01) { - k_n[found] = fi<<1; - found++; - } - fi++; - } - for (i=0; i<size; i++) { - j[i] = i; - loverline[i] = csi_params->symb_l0; - koverline[i] = k_n[i]; - } - break; - - case 10: - ports = 12; - kprime = 1; - lprime = 1; - size = 3; - while (found < 3) { - if ((b >> fi) & 0x01) { - k_n[found] = fi<<1; - found++; - } - fi++; - } - for (i=0; i<size; i++) { - j[i] = i; - loverline[i] = csi_params->symb_l0; - koverline[i] = k_n[i]; - } - break; - - case 11: - ports = 16; - kprime = 1; - lprime = 0; - size = 8; - while (found < 4) { - if ((b >> fi) & 0x01) { - k_n[found] = fi<<1; - found++; - } - fi++; - } - for (i=0; i<size; i++) { - j[i] = i; - loverline[i] = csi_params->symb_l0 + (i>>2); - koverline[i] = k_n[i%4]; - } - break; - - case 12: - ports = 16; - kprime = 1; - lprime = 1; - size = 4; - while (found < 4) { - if ((b >> fi) & 0x01) { - k_n[found] = fi<<1; - found++; - } - fi++; - } - for (i=0; i<size; i++) { - j[i] = i; - loverline[i] = csi_params->symb_l0; - koverline[i] = k_n[i]; - } - break; - - case 13: - ports = 24; - kprime = 1; - lprime = 0; - size = 12; - while (found < 3) { - if ((b >> fi) & 0x01) { - k_n[found] = fi<<1; - found++; - } - fi++; - } - for (i=0; i<size; i++) { - j[i] = i; - if (i<6) - loverline[i] = csi_params->symb_l0 + i/3; - else - loverline[i] = csi_params->symb_l1 + i/9; - koverline[i] = k_n[i%3]; - } - break; - - case 14: - ports = 24; - kprime = 1; - lprime = 1; - size = 6; - while (found < 3) { - if ((b >> fi) & 0x01) { - k_n[found] = fi<<1; - found++; - } - fi++; - } - for (i=0; i<size; i++) { - j[i] = i; - if (i<3) + } + for (int i = 0; i < size; i++) { + j[i] = i; loverline[i] = csi_params->symb_l0; - else - loverline[i] = csi_params->symb_l1; - koverline[i] = k_n[i%3]; - } - break; - - case 15: - ports = 24; - kprime = 1; - lprime = 3; - size = 3; - while (found < 3) { - if ((b >> fi) & 0x01) { - k_n[found] = fi<<1; - found++; - } - fi++; - } - for (i=0; i<size; i++) { - j[i] = i; - loverline[i] = csi_params->symb_l0; - koverline[i] = k_n[i]; - } - break; - - case 16: - ports = 32; - kprime = 1; - lprime = 0; - size = 16; - while (found < 4) { - if ((b >> fi) & 0x01) { - k_n[found] = fi<<1; - found++; - } - fi++; - } - for (i=0; i<size; i++) { - j[i] = i; - if (i<8) - loverline[i] = csi_params->symb_l0 + (i>>2); - else - loverline[i] = csi_params->symb_l1 + (i/12); - koverline[i] = k_n[i%4]; - } - break; - - case 17: - ports = 32; - kprime = 1; - lprime = 1; - size = 8; - while (found < 4) { - if ((b >> fi) & 0x01) { - k_n[found] = fi<<1; - found++; - } - fi++; - } - for (i=0; i<size; i++) { - j[i] = i; - if (i<4) + koverline[i] = k_n[i]; + } + break; + case 11: + ports = 16; + kprime = 1; + lprime = 0; + size = 8; + while (found < 4) { + if ((b >> fi) & 0x01) { + k_n[found] = fi << 1; + found++; + } + fi++; + } + for (int i = 0; i < size; i++) { + j[i] = i; + loverline[i] = csi_params->symb_l0 + (i >> 2); + koverline[i] = k_n[i % 4]; + } + break; + case 12: + ports = 16; + kprime = 1; + lprime = 1; + size = 4; + while (found < 4) { + if ((b >> fi) & 0x01) { + k_n[found] = fi << 1; + found++; + } + fi++; + } + for (int i = 0; i < size; i++) { + j[i] = i; loverline[i] = csi_params->symb_l0; - else - loverline[i] = csi_params->symb_l1; - koverline[i] = k_n[i%4]; - } - break; - - case 18: - ports = 32; - kprime = 1; - lprime = 3; - size = 4; - while (found < 4) { - if ((b >> fi) & 0x01) { - k_n[found] = fi<<1; - found++; - } - fi++; - } - for (i=0; i<size; i++) { - j[i] = i; - loverline[i] = csi_params->symb_l0; - koverline[i] = k_n[i]; - } - break; - - default: - AssertFatal(0==1, "Row %d is not valid for CSI Table 7.4.1.5.3-1\n", csi_params->row); + koverline[i] = k_n[i]; + } + break; + case 13: + ports = 24; + kprime = 1; + lprime = 0; + size = 12; + while (found < 3) { + if ((b >> fi) & 0x01) { + k_n[found] = fi << 1; + found++; + } + fi++; + } + for (int i = 0; i < size; i++) { + j[i] = i; + if (i < 6) + loverline[i] = csi_params->symb_l0 + i / 3; + else + loverline[i] = csi_params->symb_l1 + i / 9; + koverline[i] = k_n[i % 3]; + } + break; + case 14: + ports = 24; + kprime = 1; + lprime = 1; + size = 6; + while (found < 3) { + if ((b >> fi) & 0x01) { + k_n[found] = fi << 1; + found++; + } + fi++; + } + for (int i = 0; i < size; i++) { + j[i] = i; + if (i < 3) + loverline[i] = csi_params->symb_l0; + else + loverline[i] = csi_params->symb_l1; + koverline[i] = k_n[i%3]; + } + break; + case 15: + ports = 24; + kprime = 1; + lprime = 3; + size = 3; + while (found < 3) { + if ((b >> fi) & 0x01) { + k_n[found] = fi << 1; + found++; + } + fi++; + } + for (int i = 0; i < size; i++) { + j[i] = i; + loverline[i] = csi_params->symb_l0; + koverline[i] = k_n[i]; + } + break; + case 16: + ports = 32; + kprime = 1; + lprime = 0; + size = 16; + while (found < 4) { + if ((b >> fi) & 0x01) { + k_n[found] = fi << 1; + found++; + } + fi++; + } + for (int i = 0; i < size; i++) { + j[i] = i; + if (i < 8) + loverline[i] = csi_params->symb_l0 + (i>>2); + else + loverline[i] = csi_params->symb_l1 + (i/12); + koverline[i] = k_n[i % 4]; + } + break; + case 17: + ports = 32; + kprime = 1; + lprime = 1; + size = 8; + while (found < 4) { + if ((b >> fi) & 0x01) { + k_n[found] = fi << 1; + found++; + } + fi++; + } + for (int i = 0; i < size; i++) { + j[i] = i; + if (i < 4) + loverline[i] = csi_params->symb_l0; + else + loverline[i] = csi_params->symb_l1; + koverline[i] = k_n[i % 4]; + } + break; + case 18: + ports = 32; + kprime = 1; + lprime = 3; + size = 4; + while (found < 4) { + if ((b >> fi) & 0x01) { + k_n[found] = fi << 1; + found++; + } + fi++; + } + for (int i = 0; i < size; i++) { + j[i] = i; + loverline[i] = csi_params->symb_l0; + koverline[i] = k_n[i]; + } + break; + default: + AssertFatal(false, "Row %d is not valid for CSI Table 7.4.1.5.3-1\n", csi_params->row); } #ifdef NR_CSIRS_DEBUG printf(" row %d, n. of ports %d\n k' ",csi_params->row,ports); - for (kp=0; kp<=kprime; kp++) + for (int kp = 0; kp <= kprime; kp++) printf("%d, ",kp); printf("l' "); - for (lp=0; lp<=lprime; lp++) - printf("%d, ",lp); + for (int lp = 0; lp <= lprime; lp++) + printf("%d, ", lp); printf("\n k overline "); - for (i=0; i<size; i++) + for (int i = 0; i < size; i++) printf("%d, ",koverline[i]); printf("\n l overline "); - for (i=0; i<size; i++) + for (int i = 0; i < size; i++) printf("%d, ",loverline[i]); printf("\n"); #endif // setting the frequency density from its index + double rho = 0; switch (csi_params->freq_density) { - - case 0: - rho = 0.5; - break; - - case 1: - rho = 0.5; - break; - - case 2: - rho = 1; - break; - - case 3: - rho = 3; - break; - - default: - AssertFatal(0==1, "Invalid frequency density index for CSI\n"); + case 0: + rho = 0.5; + break; + case 1: + rho = 0.5; + break; + case 2: + rho = 1; + break; + case 3: + rho = 3; + break; + default: + AssertFatal(false, "Invalid frequency density index for CSI\n"); } + double alpha = 0; if (ports == 1) alpha = rho; else - alpha = 2*rho; + alpha = 2 * rho; #ifdef NR_CSIRS_DEBUG - printf(" rho %f, alpha %f\n",rho,alpha); + printf(" rho %f, alpha %f\n", rho, alpha); #endif // CDM group size from CDM type index + int gs = 0; switch (csi_params->cdm_type) { - - case 0: - gs = 1; - break; - - case 1: - gs = 2; - break; - - case 2: - gs = 4; - break; - - case 3: - gs = 8; - break; - - default: - AssertFatal(0==1, "Invalid cdm type index for CSI\n"); + case 0: + gs = 1; + break; + case 1: + gs = 2; + break; + case 2: + gs = 4; + break; + case 3: + gs = 8; + break; + default: + AssertFatal(false, "Invalid cdm type index for CSI\n"); } - uint16_t csi_length; + int csi_length; if (rho < 1) { if (csi_params->freq_density == 0) { - csi_length = (((csi_params->start_rb + csi_params->nr_of_rbs)>>1)<<kprime)<<1; + csi_length = (((csi_params->start_rb + csi_params->nr_of_rbs) >> 1) << kprime) << 1; } else { - csi_length = ((((csi_params->start_rb + csi_params->nr_of_rbs)>>1)<<kprime)+1)<<1; + csi_length = ((((csi_params->start_rb + csi_params->nr_of_rbs) >> 1) << kprime) + 1) << 1; } } else { - csi_length = (((uint16_t) rho*(csi_params->start_rb + csi_params->nr_of_rbs))<<kprime)<<1; + csi_length = (((uint16_t) rho * (csi_params->start_rb + csi_params->nr_of_rbs)) << kprime) << 1; } #ifdef NR_CSIRS_DEBUG - printf(" start rb %d, nr of rbs %d, csi length %d\n", csi_params->start_rb, csi_params->nr_of_rbs, csi_length); + printf(" start rb %d, nr of rbs %d, csi length %d\n", csi_params->start_rb, csi_params->nr_of_rbs, csi_length); #endif + if (N_cdm_groups) + *N_cdm_groups = size; + if (CDM_group_size) + *CDM_group_size = gs; + if (k_prime) + *k_prime = kprime; + if (l_prime) + *l_prime = lprime; + if (N_ports) + *N_ports = ports; + if (j_cdm) + memcpy(j_cdm, j, 16 * sizeof(uint8_t)); + if (k_overline) + memcpy(k_overline, koverline, 16 * sizeof(uint8_t)); + if (l_overline) + memcpy(l_overline, loverline, 16 * sizeof(uint8_t)); - // TRS - if (csi_params->csi_type == 0) { - // ??? +#ifdef NR_CSIRS_DEBUG + if (N_ports) + LOG_I(NR_PHY, "nr_csi_info->N_ports = %d\n", *N_ports); + if (N_cdm_groups) + LOG_I(NR_PHY, "nr_csi_info->N_cdm_groups = %d\n", *N_cdm_groups); + if (CDM_group_size) + LOG_I(NR_PHY, "nr_csi_info->CDM_group_size = %d\n", *CDM_group_size); + if (k_prime) + LOG_I(NR_PHY, "nr_csi_info->kprime = %d\n", *k_prime); + if (l_prime) + LOG_I(NR_PHY, "nr_csi_info->lprime = %d\n", *l_prime); + if (N_cdm_groups) { + for(int ji = 0; ji < *N_cdm_groups; ji++) { + LOG_I(NR_PHY, "(CDM group %d) j = %d, koverline = %d, loverline = %d\n", ji, j[ji], koverline[ji], loverline[ji]); + } } +#endif - // NZP CSI RS - if (csi_params->csi_type == 1) { - // assuming amp is the amplitude of SSB channels - switch (csi_params->power_control_offset_ss) { + if (csi_params->csi_type == 2) // ZP-CSI + return; + + // assuming amp is the amplitude of SSB channels + switch (csi_params->power_control_offset_ss) { case 0: beta = (amp*ONE_OVER_SQRT2_Q15)>>15; break; @@ -572,73 +573,68 @@ void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms, beta = (amp*ONE_OVER_SQRT2_Q15)>>14; break; case 3: - beta = amp<<1; + beta = amp << 1; break; default: - AssertFatal(0==1, "Invalid SS power offset density index for CSI\n"); - } + AssertFatal(false, "Invalid SS power offset density index for CSI\n"); + } - for (lp=0; lp<=lprime; lp++){ - symb = csi_params->symb_l0; - nr_modulation(nr_gold_csi_rs[symb+lp], csi_length, DMRS_MOD_ORDER, mod_csi[symb+lp]); - if ((csi_params->row == 5) || (csi_params->row == 7) || (csi_params->row == 11) || (csi_params->row == 13) || (csi_params->row == 16)) - nr_modulation(nr_gold_csi_rs[symb+1], csi_length, DMRS_MOD_ORDER, mod_csi[symb+1]); - if ((csi_params->row == 14) || (csi_params->row == 13) || (csi_params->row == 16) || (csi_params->row == 17)) { - symb = csi_params->symb_l1; - nr_modulation(nr_gold_csi_rs[symb+lp], csi_length, DMRS_MOD_ORDER, mod_csi[symb+lp]); - if ((csi_params->row == 13) || (csi_params->row == 16)) - nr_modulation(nr_gold_csi_rs[symb+1], csi_length, DMRS_MOD_ORDER, mod_csi[symb+1]); - } + for (int lp = 0; lp <= lprime; lp++) { + int symb = csi_params->symb_l0; + nr_modulation(nr_gold_csi_rs[symb + lp], csi_length, DMRS_MOD_ORDER, mod_csi[symb + lp]); + if ((csi_params->row == 5) || (csi_params->row == 7) || (csi_params->row == 11) || (csi_params->row == 13) || (csi_params->row == 16)) + nr_modulation(nr_gold_csi_rs[symb + 1], csi_length, DMRS_MOD_ORDER, mod_csi[symb + 1]); + if ((csi_params->row == 14) || (csi_params->row == 13) || (csi_params->row == 16) || (csi_params->row == 17)) { + symb = csi_params->symb_l1; + nr_modulation(nr_gold_csi_rs[symb + lp], csi_length, DMRS_MOD_ORDER, mod_csi[symb + lp]); + if ((csi_params->row == 13) || (csi_params->row == 16)) + nr_modulation(nr_gold_csi_rs[symb + 1], csi_length, DMRS_MOD_ORDER, mod_csi[symb + 1]); } } uint16_t start_sc = frame_parms->first_carrier_offset; // resource mapping according to 38.211 7.4.1.5.3 - for (n=csi_params->start_rb; n<(csi_params->start_rb+csi_params->nr_of_rbs); n++) { - if ( (csi_params->freq_density > 1) || (csi_params->freq_density == (n%2))) { // for freq density 0.5 checks if even or odd RB - for (int ji=0; ji<size; ji++) { // loop over CDM groups - for (int s=0 ; s<gs; s++) { // loop over each CDM group size - p = s+j[ji]*gs; // port index - for (kp=0; kp<=kprime; kp++) { // loop over frequency resource elements within a group - k = (start_sc+(n*NR_NB_SC_PER_RB)+koverline[ji]+kp)%(frame_parms->ofdm_symbol_size); // frequency index of current resource element + for (int n = csi_params->start_rb; n < (csi_params->start_rb + csi_params->nr_of_rbs); n++) { + if ((csi_params->freq_density > 1) || (csi_params->freq_density == (n % 2))) { // for freq density 0.5 checks if even or odd RB + for (int ji = 0; ji < size; ji++) { // loop over CDM groups + for (int s = 0 ; s < gs; s++) { // loop over each CDM group size + int p = s + j[ji] * gs; // port index + for (int kp = 0; kp <= kprime; kp++) { // loop over frequency resource elements within a group + // frequency index of current resource element + int k = (start_sc + (n * NR_NB_SC_PER_RB) + koverline[ji] + kp) % (frame_parms->ofdm_symbol_size); // wf according to tables 7.4.5.3-2 to 7.4.5.3-5 - if (kp == 0) - wf = 1; - else - wf = -2*(s%2)+1; - na = n*alpha; - kpn = (rho*koverline[ji])/NR_NB_SC_PER_RB; - mprime = na + kp + kpn; // sequence index - for (lp=0; lp<=lprime; lp++) { // loop over frequency resource elements within a group - l = lp + loverline[ji]; - // wt according to tables 7.4.5.3-2 to 7.4.5.3-5 + int wf = kp == 0 ? 1 : (-2 * (s % 2) + 1); + int na = n * alpha; + int kpn = (rho * koverline[ji]) / NR_NB_SC_PER_RB; + int mprime = na + kp + kpn; // sequence index + for (int lp = 0; lp <= lprime; lp++) { // loop over frequency resource elements within a group + int l = lp + loverline[ji]; + // wt according to tables 7.4.5.3-2 to 7.4.5.3-5 + int wt; if (s < 2) wt = 1; else if (s < 4) - wt = -2*(lp%2)+1; + wt = -2*(lp % 2) + 1; else if (s < 6) - wt = -2*(lp/2)+1; + wt = -2 * (lp / 2) + 1; else { if ((lp == 0) || (lp == 3)) wt = 1; else wt = -1; } - - // ZP CSI RS - if (csi_params->csi_type == 2) { - ((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+(2*dataF_offset)] = 0; - ((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+1+(2*dataF_offset)] = 0; - } - else { - ((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+(2*dataF_offset)] = (beta*wt*wf*mod_csi[l][mprime<<1]) >> 15; - ((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+1+(2*dataF_offset)] = (beta*wt*wf*mod_csi[l][(mprime<<1) + 1]) >> 15; - } + int index = ((l * frame_parms->ofdm_symbol_size + k) << 1) + (2 * dataF_offset); + ((int16_t*)dataF[p])[index] = (beta * wt * wf * mod_csi[l][mprime << 1]) >> 15; + ((int16_t*)dataF[p])[index + 1] = (beta * wt * wf * mod_csi[l][(mprime << 1) + 1]) >> 15; #ifdef NR_CSIRS_DEBUG - printf("l,k (%d,%d) seq. index %d \t port %d \t (%d,%d)\n",l,k,mprime,p+3000, - ((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+(2*dataF_offset)], - ((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+1+(2*dataF_offset)]); + printf("l,k (%d,%d) seq. index %d \t port %d \t (%d,%d)\n", + l, + k, + mprime, + p + 3000, + ((int16_t*)dataF[p])[index], + ((int16_t*)dataF[p])[index + 1]); #endif } } @@ -646,25 +642,4 @@ void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms, } } } - if (N_cdm_groups) *N_cdm_groups = size; - if (CDM_group_size) *CDM_group_size = gs; - if (k_prime) *k_prime = kprime; - if (l_prime) *l_prime = lprime; - if (N_ports) *N_ports = ports; - if (j_cdm) memcpy(j_cdm,j,16*sizeof(uint8_t)); - if (k_overline) memcpy(k_overline,koverline,16*sizeof(uint8_t)); - if (l_overline) memcpy(l_overline,loverline,16*sizeof(uint8_t)); - -#ifdef NR_CSIRS_DEBUG - if (N_ports) LOG_I(NR_PHY, "nr_csi_info->N_ports = %d\n", *N_ports); - if (N_cdm_groups) LOG_I(NR_PHY, "nr_csi_info->N_cdm_groups = %d\n", *N_cdm_groups); - if (CDM_group_size) LOG_I(NR_PHY, "nr_csi_info->CDM_group_size = %d\n", *CDM_group_size); - if (k_prime) LOG_I(NR_PHY, "nr_csi_info->kprime = %d\n", *k_prime); - if (l_prime) LOG_I(NR_PHY, "nr_csi_info->lprime = %d\n", *l_prime); - if (N_cdm_groups) { - for(int ji=0; ji<*N_cdm_groups; ji++) { - LOG_I(NR_PHY, "(CDM group %d) j = %d, koverline = %d, loverline = %d\n", ji, j[ji], koverline[ji], loverline[ji]); - } - } -#endif } diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h index 0f998ebee6f..75d77f211a0 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h +++ b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h @@ -310,21 +310,6 @@ void init_prach_ru_list(RU_t *ru); void free_nr_ru_prach_entry(RU_t *ru, int prach_id); uint8_t get_nr_prach_duration(uint8_t prach_format); -void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms, - int32_t **dataF, - const int16_t amp, - nr_csi_info_t *nr_csi_info, - const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csi_params, - const int slot, - uint8_t *N_cdm_groups, - uint8_t *CDM_group_size, - uint8_t *k_prime, - uint8_t *l_prime, - uint8_t *N_ports, - uint8_t *j_cdm, - uint8_t *k_overline, - uint8_t *l_overline); - void free_nr_prach_entry(PHY_VARS_gNB *gNB, int prach_id); void nr_decode_pucch1(c16_t **rxdataF, diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index 0c3847baaf0..89ad4bbc8f9 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -28,7 +28,6 @@ #include "PHY/NR_REFSIG/ptrs_nr.h" #include "PHY/NR_REFSIG/nr_mod_table.h" #include "PHY/NR_TRANSPORT/nr_sch_dmrs.h" -#include "PHY/NR_TRANSPORT/nr_transport_proto.h" #include "nr_phy_common.h" #include "filt16a_32.h" #include "T.h" diff --git a/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c b/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c index fbb61134053..f8ca30e9023 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c +++ b/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c @@ -36,8 +36,8 @@ #include "executables/nr-softmodem-common.h" #include "nr_transport_proto_ue.h" #include "PHY/phy_extern_nr_ue.h" +#include "PHY/NR_REFSIG/nr_refsig.h" #include "common/utils/nr/nr_common.h" -#include "PHY/NR_TRANSPORT/nr_transport_proto.h" #include "PHY/NR_UE_ESTIMATION/filt16a_32.h" // Additional memory allocation, because of applying the filter and the memory offset to ensure memory alignment @@ -191,13 +191,13 @@ int nr_get_csi_rs_signal(const PHY_VARS_NR_UE *ue, int32_t csi_rs_received_signal[][ue->frame_parms.samples_per_slot_wCP], uint32_t *rsrp, int *rsrp_dBm, - c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) { - - const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) +{ + const NR_DL_FRAME_PARMS *fp = &ue->frame_parms; uint16_t meas_count = 0; uint32_t rsrp_sum = 0; - for (int ant_rx = 0; ant_rx < frame_parms->nb_antennas_rx; ant_rx++) { + for (int ant_rx = 0; ant_rx < fp->nb_antennas_rx; ant_rx++) { for (int rb = csirs_config_pdu->start_rb; rb < (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs); rb++) { @@ -212,12 +212,12 @@ int nr_get_csi_rs_signal(const PHY_VARS_NR_UE *ue, // loop over frequency resource elements within a group for (int kp = 0; kp <= k_prime; kp++) { - uint16_t k = (frame_parms->first_carrier_offset + (rb*NR_NB_SC_PER_RB)+k_overline[cdm_id] + kp) % frame_parms->ofdm_symbol_size; + uint16_t k = (fp->first_carrier_offset + (rb * NR_NB_SC_PER_RB) + k_overline[cdm_id] + kp) % fp->ofdm_symbol_size; // loop over time resource elements within a group for (int lp = 0; lp <= l_prime; lp++) { uint16_t symb = lp + l_overline[cdm_id]; - uint64_t symbol_offset = symb*frame_parms->ofdm_symbol_size; + uint64_t symbol_offset = symb * fp->ofdm_symbol_size; c16_t *rx_signal = &rxdataF[ant_rx][symbol_offset]; c16_t *rx_csi_rs_signal = (c16_t*)&csi_rs_received_signal[ant_rx][symbol_offset]; rx_csi_rs_signal[k].r = rx_signal[k].r; @@ -229,10 +229,11 @@ int nr_get_csi_rs_signal(const PHY_VARS_NR_UE *ue, meas_count++; #ifdef NR_CSIRS_DEBUG - int dataF_offset = proc->nr_slot_rx*ue->frame_parms.samples_per_slot_wCP; + int dataF_offset = proc->nr_slot_rx * fp->samples_per_slot_wCP; uint16_t port_tx = s+j_cdm[cdm_id]*CDM_group_size; - c16_t *tx_csi_rs_signal = (c16_t*)&nr_csi_info->csi_rs_generated_signal[port_tx][symbol_offset+dataF_offset]; - LOG_I(NR_PHY, "l,k (%2d,%4d) |\tport_tx %d (%4d,%4d)\tant_rx %d (%4d,%4d)\n", + c16_t *tx_csi_rs_signal = (c16_t*)&nr_csi_info->csi_rs_generated_signal[port_tx][symbol_offset + dataF_offset]; + LOG_I(NR_PHY, + "l,k (%2d,%4d) |\tport_tx %d (%4d,%4d)\tant_rx %d (%4d,%4d)\n", symb, k, port_tx+3000, @@ -728,12 +729,12 @@ int nr_csi_rs_cqi_estimation(const uint32_t precoded_sinr, return 0; } -int nr_csi_im_power_estimation(const PHY_VARS_NR_UE *ue, - const UE_nr_rxtx_proc_t *proc, - const fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu, - uint32_t *interference_plus_noise_power, - c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) { - +static void nr_csi_im_power_estimation(const PHY_VARS_NR_UE *ue, + const UE_nr_rxtx_proc_t *proc, + const fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu, + uint32_t *interference_plus_noise_power, + c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) +{ const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; const uint16_t end_rb = csiim_config_pdu->start_rb + csiim_config_pdu->nr_of_rbs > csiim_config_pdu->bwp_size ? @@ -772,7 +773,7 @@ int nr_csi_im_power_estimation(const PHY_VARS_NR_UE *ue, uint16_t sc0_offset = (frame_parms->first_carrier_offset + rb*NR_NB_SC_PER_RB) % frame_parms->ofdm_symbol_size; - for (int sc_idx = 0; sc_idx<4; sc_idx++) { + for (int sc_idx = 0; sc_idx < 4; sc_idx++) { uint16_t sc = sc0_offset + csiim_config_pdu->k_csiim[sc_idx]; if (sc >= frame_parms->ofdm_symbol_size) { @@ -785,34 +786,31 @@ int nr_csi_im_power_estimation(const PHY_VARS_NR_UE *ue, sum_re += rx_signal[sc].r; sum_im += rx_signal[sc].i; - sum2_re += rx_signal[sc].r*rx_signal[sc].r; - sum2_im += rx_signal[sc].i*rx_signal[sc].i; + sum2_re += rx_signal[sc].r * rx_signal[sc].r; + sum2_im += rx_signal[sc].i * rx_signal[sc].i; count++; } } } } - int32_t power_re = sum2_re/count - (sum_re/count)*(sum_re/count); - int32_t power_im = sum2_im/count - (sum_im/count)*(sum_im/count); + int32_t power_re = sum2_re / count - (sum_re / count) * (sum_re / count); + int32_t power_im = sum2_im / count - (sum_im / count) * (sum_im / count); *interference_plus_noise_power = power_re + power_im; #ifdef NR_CSIIM_DEBUG LOG_I(NR_PHY, "interference_plus_noise_power based on CSI-IM = %i\n", *interference_plus_noise_power); #endif - - return 0; } -int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue, - const UE_nr_rxtx_proc_t *proc, - c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) +void nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue, + const UE_nr_rxtx_proc_t *proc, + c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) { int gNB_id = proc->gNB_id; - if(!ue->csiim_vars[gNB_id]->active) { - return -1; - } + if(!ue->csiim_vars[gNB_id]->active) + LOG_E(NR_PHY, "Scheduling reception of CSI-IM that is not active\n"); const fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu = (fapi_nr_dl_config_csiim_pdu_rel15_t*)&ue->csiim_vars[gNB_id]->csiim_config_pdu; @@ -828,8 +826,6 @@ int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue, nr_csi_im_power_estimation(ue, proc, csiim_config_pdu, &ue->nr_csi_info->interference_plus_noise_power, rxdataF); ue->nr_csi_info->csi_im_meas_computed = true; - - return 0; } static nfapi_nr_dl_tti_csi_rs_pdu_rel15_t convert_csirs_pdu(const fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu) diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c index 671764db170..e22f5f1d303 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c @@ -30,7 +30,6 @@ */ #include "PHY/defs_nr_UE.h" #include "PHY/phy_extern.h" -#include "PHY/NR_TRANSPORT/nr_transport_proto.h" #include "nr_transport_proto_ue.h" #include "PHY/sse_intrin.h" #include "T.h" diff --git a/openair1/SCHED_NR_UE/defs.h b/openair1/SCHED_NR_UE/defs.h index 785aa409cbe..4174e44238a 100644 --- a/openair1/SCHED_NR_UE/defs.h +++ b/openair1/SCHED_NR_UE/defs.h @@ -149,9 +149,9 @@ int nr_ue_pdcch_procedures(PHY_VARS_NR_UE *ue, int n_ss, c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]); -int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue, - const UE_nr_rxtx_proc_t *proc, - c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]); +void nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue, + const UE_nr_rxtx_proc_t *proc, + c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]); void nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 78ca9feceeb..aa4de65c08f 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1024,7 +1024,7 @@ void pdsch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_ // do procedures for CSI-RS if ((ue->csirs_vars[gNB_id]) && (ue->csirs_vars[gNB_id]->active == 1)) { for(int symb = 0; symb < NR_SYMBOLS_PER_SLOT; symb++) { - if(is_csi_rs_in_symbol(ue->csirs_vars[gNB_id]->csirs_config_pdu,symb)) { + if(is_csi_rs_in_symbol(ue->csirs_vars[gNB_id]->csirs_config_pdu, symb)) { if (!slot_fep_map[symb]) { nr_slot_fep(ue, &ue->frame_parms, proc, symb, rxdataF, link_type_dl); slot_fep_map[symb] = true; @@ -1041,7 +1041,7 @@ void pdsch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_ uint16_t nb_symb_sch = dlsch_config->number_symbols; uint16_t start_symb_sch = dlsch_config->start_symbol; - LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR Frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx); + LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR Frame.slot %d.%d ------ \n", frame_rx % 1024, nr_slot_rx); for (int m = start_symb_sch; m < (nb_symb_sch + start_symb_sch) ; m++) { if (!slot_fep_map[m]) { -- GitLab