From c73353bed3da696551fbfd4a43b28cc3f1cde035 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Sun, 19 Jan 2025 17:33:28 +0100 Subject: [PATCH 1/8] comprehensive dmrs reception and better cpu efficiency --- openair1/PHY/NR_REFSIG/dmrs_nr.h | 2 +- openair1/PHY/NR_REFSIG/nr_dmrs_rx.c | 95 ++++++++++------------------- openair1/PHY/NR_REFSIG/ptrs_nr.c | 2 +- openair1/PHY/defs_nr_common.h | 1 - 4 files changed, 35 insertions(+), 65 deletions(-) diff --git a/openair1/PHY/NR_REFSIG/dmrs_nr.h b/openair1/PHY/NR_REFSIG/dmrs_nr.h index 5a3160857a..001aae4150 100644 --- a/openair1/PHY/NR_REFSIG/dmrs_nr.h +++ b/openair1/PHY/NR_REFSIG/dmrs_nr.h @@ -61,7 +61,7 @@ uint8_t allowed_xlsch_re_in_dmrs_symbol(uint16_t k, uint8_t numDmrsCdmGrpsNoData, uint8_t dmrs_type); -void nr_gen_ref_conj_symbols(const uint32_t *in, uint32_t length, int16_t *output, uint16_t offset, int mod_order); +void nr_gen_ref_conj_symbols(const uint32_t *in, uint32_t length, int16_t *output, int mod_order); int8_t get_next_dmrs_symbol_in_slot(uint16_t ul_dmrs_symb_pos, uint8_t counter, uint8_t end_symbol); uint8_t get_dmrs_symbols_in_slot(uint16_t l_prime_mask, uint16_t nb_symb, uint8_t start); int8_t get_valid_dmrs_idx_for_channel_est(uint16_t dmrs_symb_pos, uint8_t counter); diff --git a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c index 1c217d8da0..01b05071a2 100644 --- a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c +++ b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c @@ -49,10 +49,21 @@ static const int wt2[12][2] = {{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, -1}, {1, -1}, {1, -1}, {1, -1}, {1, -1}, {1, -1}}; // complex conjugate of mod table -static const c16_t nr_rx_mod_table[7] = - {{0, 0}, {23170, -23170}, {-23170, 23170}, {23170, -23170}, {23170, 23170}, {-23170, -23170}, {-23170, 23170}}; -static const c16_t nr_rx_nmod_table[7] = - {{0, 0}, {-23170, 23170}, {23170, -23170}, {-23170, 23170}, {-23170, -23170}, {23170, 23170}, {23170, -23170}}; +static const c16_t nr_rx_mod_table[4] = {{23170, -23170}, {23170, 23170}, {-23170, -23170}, {-23170, 23170}}; + +static inline c16_t get_modulated(const uint32_t *gold_sequence, const int idx_gold, const bool inverse) +{ + const uint8_t *gold = (uint8_t *)gold_sequence; + const int swap2bits[4] = {0, 2, 1, 3}; + const uint8_t packedbyte = gold[idx_gold / 4]; + const int indexByte = (idx_gold * 2) & 7; + const int idx = swap2bits[(packedbyte >> indexByte) & 3]; + const c16_t val = nr_rx_mod_table[idx]; + if (inverse) + return val; + else + return (c16_t){-val.r, -val.i}; +} int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB, unsigned int Ns, @@ -64,41 +75,27 @@ int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB, uint32_t re_offset, uint8_t dmrs_type) { - int8_t w, nb_dmrs; - unsigned char idx=0; - int k; typedef int array_of_w[2]; const array_of_w *wf = (dmrs_type == pusch_dmrs_type1) ? wf1 : wf2; const array_of_w *wt = (dmrs_type == pusch_dmrs_type1) ? wt1 : wt2; - int dmrs_offset = re_offset/((dmrs_type==pusch_dmrs_type1)?2:3); - + const int dmrs_offset = re_offset / ((dmrs_type == pusch_dmrs_type1) ? 2 : 3); if (dmrs_type > 2) LOG_E(PHY,"PUSCH DMRS config type %d not valid\n", dmrs_type+1); + const int nb_dmrs = dmrs_type == pusch_dmrs_type1 ? 6 : 4; + if ((p>=1000) && (p<((dmrs_type==pusch_dmrs_type1) ? 1008 : 1012))) { if (gNB->frame_parms.Ncp == NORMAL) { - nb_dmrs = ((dmrs_type==pusch_dmrs_type1) ? 6:4); - for (int i=dmrs_offset; i>5])>>((i<<1)&0x1f))&1)<<1) ^ (((nr_gold_pusch[((i<<1)+1)>>5])>>(((i<<1)+1)&0x1f))&1); - output[k] = mod_table[NR_MOD_TABLE_QPSK_OFFSET + idx]; + for (int k = 0; k < nb_pusch_rb * nb_dmrs; k++) { + int i = k + dmrs_offset; + int w = (wf[p - 1000][i & 1]) * (wt[p - 1000][lp]); + output[k] = get_modulated(nr_gold_pusch, i, w == 1); #ifdef DEBUG_PUSCH printf("nr_pusch_dmrs_rx dmrs config type %d port %d nb_pusch_rb %d\n", dmrs_type, p, nb_pusch_rb); printf("wf[%d] = %d wt[%d]= %d\n", i&1, wf[p-1000][i&1], lp, wt[p-1000][lp]); - printf("i %d idx %d pusch gold %u b0-b1 %d-%d mod_dmrs %d %d\n", - i, - idx, - nr_gold_pusch[(i << 1) >> 5], - (((nr_gold_pusch[(i << 1) >> 5]) >> ((i << 1) & 0x1f)) & 1), - (((nr_gold_pusch[((i << 1) + 1) >> 5]) >> (((i << 1) + 1) & 0x1f)) & 1), - output[k].r, - output[k].i); + printf("i %d idx %d pusch mod_dmrs %d %d\n", i, idx, output[k].r, output[k].i); #endif - } } else { LOG_E(PHY,"extended cp not supported for PUSCH DMRS yet\n"); @@ -119,9 +116,6 @@ int nr_pdsch_dmrs_rx(const PHY_VARS_NR_UE *ue, unsigned short nb_pdsch_rb, uint8_t config_type) { - int8_t w; - unsigned char idx=0; - typedef int array_of_w[2]; const array_of_w *wf = (config_type == NFAPI_NR_DMRS_TYPE1) ? wf1 : wf2; const array_of_w *wt = (config_type == NFAPI_NR_DMRS_TYPE1) ? wt1 : wt2; @@ -132,22 +126,13 @@ int nr_pdsch_dmrs_rx(const PHY_VARS_NR_UE *ue, if ((p >= 1000) && (p < ((config_type == NFAPI_NR_DMRS_TYPE1) ? 1008 : 1012))) { if (ue->frame_parms.Ncp == NORMAL) { for (int i = 0; i < nb_pdsch_rb * ((config_type == NFAPI_NR_DMRS_TYPE1) ? 6 : 4); i++) { - w = (wf[p - 1000][i & 1]) * (wt[p - 1000][lp]); - const c16_t *mod_table = (w == 1) ? nr_rx_mod_table : nr_rx_nmod_table; + int w = (wf[p - 1000][i & 1]) * (wt[p - 1000][lp]); + output[i] = get_modulated(nr_gold_pdsch, i, w == 1); - idx = ((((nr_gold_pdsch[(i << 1) >> 5]) >> ((i << 1) & 0x1f)) & 1) << 1) ^ (((nr_gold_pdsch[((i << 1) + 1) >> 5]) >> (((i << 1) + 1) & 0x1f)) & 1); - output[i] = mod_table[NR_MOD_TABLE_QPSK_OFFSET + idx]; #ifdef DEBUG_PDSCH printf("nr_pdsch_dmrs_rx dmrs config type %d port %d nb_pdsch_rb %d\n", config_type, p, nb_pdsch_rb); printf("wf[%d] = %d wt[%d]= %d\n", i & 1, wf[p - 1000][i & 1], lp, wt[p - 1000][lp]); - printf("i %d idx %d pdsch gold %u b0-b1 %d-%d mod_dmrs %d %d\n", - i, - idx, - nr_gold_pdsch[(i << 1) >> 5], - (((nr_gold_pdsch[(i << 1) >> 5]) >> ((i << 1) & 0x1f)) & 1), - (((nr_gold_pdsch[((i << 1) + 1) >> 5]) >> (((i << 1) + 1) & 0x1f)) & 1), - output[i].r, - output[i].i); + printf("i %d idx %d pdsch mod_dmrs %d %d\n", i, idx, output[i].r, output[i].i); #endif } } else { @@ -167,24 +152,12 @@ int nr_pdcch_dmrs_rx(const PHY_VARS_NR_UE *ue, unsigned short p, unsigned short nb_rb_coreset) { - uint8_t idx=0; - //uint8_t pdcch_rb_offset =0; - //nr_gold_pdcch += ((int)floor(ue->frame_parms.ssb_start_subcarrier/12)+pdcch_rb_offset)*3/32; - if (p==2000) { for (int i=0; i<((nb_rb_coreset*6)>>1); i++) { - idx = ((((nr_gold_pdcch[(i<<1)>>5])>>((i<<1)&0x1f))&1)<<1) ^ (((nr_gold_pdcch[((i<<1)+1)>>5])>>(((i<<1)+1)&0x1f))&1); - output[i] = nr_rx_mod_table[NR_MOD_TABLE_QPSK_OFFSET + idx]; + output[i] = get_modulated(nr_gold_pdcch, i, true); #ifdef DEBUG_PDCCH if (i<8) - printf("i %d idx %d pdcch gold %u b0-b1 %d-%d mod_dmrs %d %d\n", - i, - idx, - nr_gold_pdcch[(i << 1) >> 5], - (((nr_gold_pdcch[(i << 1) >> 5]) >> ((i << 1) & 0x1f)) & 1), - (((nr_gold_pdcch[((i << 1) + 1) >> 5]) >> (((i << 1) + 1) & 0x1f)) & 1), - output[i].r, - output[i].i); + printf("i %d idx %d pdcch mod_dmrs %d %d\n", i, idx, output[i].r, output[i].i); #endif } } @@ -194,8 +167,7 @@ int nr_pdcch_dmrs_rx(const PHY_VARS_NR_UE *ue, void nr_pbch_dmrs_rx(int symbol, const unsigned int *nr_gold_pbch, c16_t *output, bool sidelink) { - int m,m0,m1; - uint8_t idx=0; + int m0, m1; if (sidelink) { AssertFatal(symbol == 0 || (symbol >= 5 && symbol <= 12), "illegal symbol %d\n", symbol); m0 = (symbol) ? (symbol - 4) * 33 : 0; @@ -216,9 +188,8 @@ void nr_pbch_dmrs_rx(int symbol, const unsigned int *nr_gold_pbch, c16_t *output } // printf("Generating pilots symbol %d, m0 %d, m1 %d\n",symbol,m0,m1); /// QPSK modulation - for (m=m0; m>5])>>((m<<1)&0x1f))&1)<<1) ^ (((nr_gold_pbch[((m<<1)+1)>>5])>>(((m<<1)+1)&0x1f))&1); - output[m - m0] = nr_rx_mod_table[NR_MOD_TABLE_QPSK_OFFSET + idx]; + for (int m = m0; m < m1; m++) { + output[m - m0] = get_modulated(nr_gold_pbch, m, true); #ifdef DEBUG_PBCH if (m<16) @@ -235,7 +206,7 @@ void nr_pbch_dmrs_rx(int symbol, const unsigned int *nr_gold_pbch, c16_t *output \param length is number of RE in a OFDM symbol \param *output pointer to all ptrs RE in a OFDM symbol */ -void nr_gen_ref_conj_symbols(const uint32_t *in, uint32_t length, c16_t *output, uint16_t offset, int mod_order) +void nr_gen_ref_conj_symbols(const uint32_t *in, uint32_t length, c16_t *output, int mod_order) { uint8_t idx, b_idx; for (int i=0; i>b_idx)&1)<<(mod_order-j-1); } - output[i] = nr_rx_mod_table[offset + idx]; + output[i] = nr_rx_mod_table[idx]; } } diff --git a/openair1/PHY/NR_REFSIG/ptrs_nr.c b/openair1/PHY/NR_REFSIG/ptrs_nr.c index eae3cebb01..c632585389 100644 --- a/openair1/PHY/NR_REFSIG/ptrs_nr.c +++ b/openair1/PHY/NR_REFSIG/ptrs_nr.c @@ -213,7 +213,7 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs, c16_t dmrs_comp_p[(1 + sc_per_symbol / 4) * 4]; /* generate PTRS RE for the symbol */ - nr_gen_ref_conj_symbols(gold_seq,sc_per_symbol*2,(int16_t*)ptrs_p, NR_MOD_TABLE_QPSK_OFFSET,2);// 2 for QPSK + nr_gen_ref_conj_symbols(gold_seq, sc_per_symbol * 2, (int16_t *)ptrs_p, 2); // 2 for QPSK uint32_t re_cnt = 0, cnt = 0; /* loop over all sub carriers to get compensated RE on ptrs symbols*/ for (int re = 0; re < NR_NB_SC_PER_RB * nb_rb; re++) { diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index f6f18eb942..da01d7e639 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -52,7 +52,6 @@ #define NR_MOD_TABLE_SIZE_SHORT 686 #define NR_MOD_TABLE_BPSK_OFFSET 1 -#define NR_MOD_TABLE_QPSK_OFFSET 3 #define NR_MOD_TABLE_QAM16_OFFSET 7 #define NR_MOD_TABLE_QAM64_OFFSET 23 #define NR_MOD_TABLE_QAM256_OFFSET 87 From f272d7d1cc613fca18d3914c5ba83ee6610cbdf2 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Sun, 19 Jan 2025 17:37:14 +0100 Subject: [PATCH 2/8] set correct type on qpsk modulation table --- openair1/PHY/NR_REFSIG/nr_gen_mod_table.c | 6 +- openair1/PHY/NR_REFSIG/nr_mod_table.h | 3 +- openair1/PHY/NR_TRANSPORT/nr_pbch.c | 57 +++++++------------ .../nr_dl_channel_estimation.c | 10 ++-- 4 files changed, 31 insertions(+), 45 deletions(-) diff --git a/openair1/PHY/NR_REFSIG/nr_gen_mod_table.c b/openair1/PHY/NR_REFSIG/nr_gen_mod_table.c index c9d8786b6e..203ca08678 100644 --- a/openair1/PHY/NR_REFSIG/nr_gen_mod_table.c +++ b/openair1/PHY/NR_REFSIG/nr_gen_mod_table.c @@ -21,7 +21,7 @@ #include "nr_refsig.h" #include "nr_mod_table.h" -short nr_qpsk_mod_table[8]; +c16_t nr_qpsk_mod_table[4]; int32_t nr_16qam_mod_table[16]; simde__m128i nr_qpsk_byte_mod_table[2048]; @@ -43,8 +43,8 @@ void nr_generate_modulation_table() { // QPSK for (i=0; i<4; i++) { - nr_qpsk_mod_table[i*2] = (short)(1-2*(i&1))*val*sqrt2*sqrt2; - nr_qpsk_mod_table[i*2+1] = (short)(1-2*((i>>1)&1))*val*sqrt2*sqrt2; + nr_qpsk_mod_table[i].r = (short)(1 - 2 * (i & 1)) * val * sqrt2 * sqrt2; + nr_qpsk_mod_table[i].i = (short)(1 - 2 * ((i >> 1) & 1)) * val * sqrt2 * sqrt2; //printf("%d j%d\n",nr_qpsk_mod_table[i*2],nr_qpsk_mod_table[i*2+1]); } diff --git a/openair1/PHY/NR_REFSIG/nr_mod_table.h b/openair1/PHY/NR_REFSIG/nr_mod_table.h index 4ac83ee79c..517d86b762 100644 --- a/openair1/PHY/NR_REFSIG/nr_mod_table.h +++ b/openair1/PHY/NR_REFSIG/nr_mod_table.h @@ -24,12 +24,11 @@ #define NR_MOD_TABLE_SIZE_SHORT 686 #define NR_MOD_TABLE_BPSK_OFFSET 1 -#define NR_MOD_TABLE_QPSK_OFFSET 3 #define NR_MOD_TABLE_QAM16_OFFSET 7 #define NR_MOD_TABLE_QAM64_OFFSET 23 #define NR_MOD_TABLE_QAM256_OFFSET 87 -extern short nr_qpsk_mod_table[8]; +extern c16_t nr_qpsk_mod_table[4]; extern int32_t nr_16qam_mod_table[16]; #if defined(__SSE2__) diff --git a/openair1/PHY/NR_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_TRANSPORT/nr_pbch.c index 4cc55c1345..64d07723bd 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_pbch.c @@ -36,13 +36,13 @@ #include "PHY/sse_intrin.h" #include "executables/softmodem-common.h" #include "openair1/PHY/NR_REFSIG/nr_refsig_common.h" +#include "openair1/PHY/NR_REFSIG/nr_mod_table.h" +#include "openair1/PHY/TOOLS/tools_defs.h" //#define DEBUG_PBCH //#define DEBUG_PBCH_ENCODING //#define DEBUG_PBCH_DMRS -extern short nr_qpsk_mod_table[8]; - const uint8_t nr_pbch_payload_interleaving_pattern[32] = {16, 23, 18, 17, 8, 30, 10, 6, 24, 7, 0, 5, 3, 2, 1, 4, 9, 11, 12, 13, 14, 15, 19, 20, 21, 22, 25, 26, 27, 28, 29, 31 }; @@ -56,7 +56,7 @@ void nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs, { int k,l; //int16_t a; - int16_t mod_dmrs[NR_PBCH_DMRS_LENGTH<<1]; + c16_t mod_dmrs[NR_PBCH_DMRS_LENGTH]; uint8_t idx=0; uint8_t nushift = config->cell_config.phy_cell_id.value &3; LOG_D(PHY, "PBCH DMRS mapping started at symbol %d shift %d\n", ssb_start_symbol+1, nushift); @@ -64,11 +64,16 @@ void nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs, /// QPSK modulation for (int m=0; m>5])>>((m<<1)&0x1f))&3); - mod_dmrs[m<<1] = nr_qpsk_mod_table[idx<<1]; - mod_dmrs[(m<<1)+1] = nr_qpsk_mod_table[(idx<<1) + 1]; + mod_dmrs[m] = nr_qpsk_mod_table[idx]; #ifdef DEBUG_PBCH_DMRS - printf("m %d idx %d gold seq %u b0-b1 %d-%d mod_dmrs %d %d\n", m, idx, gold_pbch_dmrs[(m<<1)>>5], (((gold_pbch_dmrs[(m<<1)>>5])>>((m<<1)&0x1f))&1), - (((gold_pbch_dmrs[((m<<1)+1)>>5])>>(((m<<1)+1)&0x1f))&1), mod_dmrs[(m<<1)], mod_dmrs[(m<<1)+1]); + printf("m %d idx %d gold seq %u b0-b1 %d-%d mod_dmrs %d %d\n", + m, + idx, + gold_pbch_dmrs[(m << 1) >> 5], + (((gold_pbch_dmrs[(m << 1) >> 5]) >> ((m << 1) & 0x1f)) & 1), + (((gold_pbch_dmrs[((m << 1) + 1) >> 5]) >> (((m << 1) + 1) & 0x1f)) & 1), + mod_dmrs[m].r, + mod_dmrs[m].i); #endif } @@ -82,13 +87,7 @@ void nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs, #ifdef DEBUG_PBCH_DMRS printf("m %d at k %d of l %d\n", m, k, l); #endif - ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_dmrs[m<<1]) >> 15; - ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_dmrs[(m<<1) + 1]) >> 15; -#ifdef DEBUG_PBCH_DMRS - printf("(%d,%d)\n", - ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1], - ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]); -#endif + txdataF[l * frame_parms->ofdm_symbol_size + k] = c16mulRealShift(mod_dmrs[m], amp, 15); k+=4; if (k >= frame_parms->ofdm_symbol_size) @@ -103,8 +102,7 @@ void nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs, #ifdef DEBUG_PBCH_DMRS printf("m %d at k %d of l %d\n", m, k, l); #endif - ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_dmrs[m<<1]) >> 15; - ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_dmrs[(m<<1) + 1]) >> 15; + txdataF[l * frame_parms->ofdm_symbol_size + k] = c16mulRealShift(mod_dmrs[m], amp, 15); #ifdef DEBUG_PBCH_DMRS printf("(%d,%d)\n", ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1], @@ -124,13 +122,7 @@ void nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs, #ifdef DEBUG_PBCH_DMRS printf("m %d at k %d of l %d\n", m, k, l); #endif - ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_dmrs[m<<1]) >> 15; - ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_dmrs[(m<<1) + 1]) >> 15; -#ifdef DEBUG_PBCH_DMRS - printf("(%d,%d)\n", - ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1], - ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]); -#endif + txdataF[l * frame_parms->ofdm_symbol_size + k] = c16mulRealShift(mod_dmrs[m], amp, 15); k+=4; if (k >= frame_parms->ofdm_symbol_size) @@ -346,14 +338,13 @@ void nr_generate_pbch(PHY_VARS_gNB *gNB, printf("\n"); #endif - int16_t mod_pbch_e[NR_POLAR_PBCH_E]; + c16_t mod_pbch_e[NR_POLAR_PBCH_E / 2]; /// QPSK modulation for (int i=0; i>1; i++) { int idx = ((pbch_e[(i << 1) >> 5] >> ((i << 1) & 0x1f)) & 3); - mod_pbch_e[i<<1] = nr_qpsk_mod_table[idx << 1]; - mod_pbch_e[(i<<1)+1] = nr_qpsk_mod_table[(idx << 1) + 1]; + mod_pbch_e[i] = nr_qpsk_mod_table[idx]; #ifdef DEBUG_PBCH - printf("i %d idx %d mod_pbch %d %d\n", i, idx, mod_pbch_e[2 * i], mod_pbch_e[2 * i + 1]); + printf("i %d idx %d mod_pbch %d %d\n", i, idx, mod_pbch_e[i].r, mod_pbch_e[i].i); #endif } @@ -374,8 +365,7 @@ void nr_generate_pbch(PHY_VARS_gNB *gNB, #ifdef DEBUG_PBCH printf("m %d ssb_sc_idx %d at k %d of l %d\n", m, ssb_sc_idx, k, l); #endif - ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_pbch_e[m<<1]) >> 15; - ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_pbch_e[(m<<1) + 1]) >> 15; + txdataF[l * frame_parms->ofdm_symbol_size + k] = c16mulRealShift(mod_pbch_e[m], amp, 15); k++; m++; } @@ -397,8 +387,7 @@ void nr_generate_pbch(PHY_VARS_gNB *gNB, #ifdef DEBUG_PBCH printf("m %d ssb_sc_idx %d at k %d of l %d\n", m, ssb_sc_idx, k, l); #endif - ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_pbch_e[m<<1]) >> 15; - ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_pbch_e[(m<<1) + 1]) >> 15; + txdataF[l * frame_parms->ofdm_symbol_size + k] = c16mulRealShift(mod_pbch_e[m], amp, 15); k++; m++; } @@ -422,8 +411,7 @@ void nr_generate_pbch(PHY_VARS_gNB *gNB, #ifdef DEBUG_PBCH printf("m %d ssb_sc_idx %d at k %d of l %d\n", m, ssb_sc_idx, k, l); #endif - ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_pbch_e[m<<1]) >> 15; - ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_pbch_e[(m<<1) + 1]) >> 15; + txdataF[l * frame_parms->ofdm_symbol_size + k] = c16mulRealShift(mod_pbch_e[m], amp, 15); k++; m++; } @@ -445,8 +433,7 @@ void nr_generate_pbch(PHY_VARS_gNB *gNB, #ifdef DEBUG_PBCH printf("m %d ssb_sc_idx %d at k %d of l %d\n", m, ssb_sc_idx, k, l); #endif - ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_pbch_e[m<<1]) >> 15; - ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_pbch_e[(m<<1) + 1]) >> 15; + txdataF[l * frame_parms->ofdm_symbol_size + k] = c16mulRealShift(mod_pbch_e[m], amp, 15); k++; m++; } 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 23560568cf..ee4874026a 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -94,7 +94,8 @@ int nr_prs_channel_estimation(uint8_t gNB_id, int slot_prs = (proc->nr_slot_rx - rep_num * prs_cfg->PRSResourceTimeGap + frame_params->slots_per_frame) % frame_params->slots_per_frame; - int16_t *rxF, *pil, mod_prs[NR_MAX_PRS_LENGTH << 1]; + int16_t *rxF, *pil; + c16_t mod_prs[NR_MAX_PRS_LENGTH]; const int16_t *fl, *fm, *fmm, *fml, *fmr, *fr; int16_t ch[2] = {0}, noiseFig[2] = {0}; int16_t k_prime = 0, k = 0; @@ -138,8 +139,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, for (int m = 0; m < num_pilots; m++) { idx = (((gold_prs[(m << 1) >> 5]) >> ((m << 1) & 0x1f)) & 3); - mod_prs[m<<1] = nr_qpsk_mod_table[idx<<1]; - mod_prs[(m<<1)+1] = nr_qpsk_mod_table[(idx<<1) + 1]; + mod_prs[m] = nr_qpsk_mod_table[idx]; } for (rxAnt=0; rxAnt < frame_params->nb_antennas_rx; rxAnt++) @@ -152,7 +152,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, k = (prs_cfg->REOffset + k_prime) % prs_cfg->CombSize + prs_cfg->RBOffset * 12 + frame_params->first_carrier_offset; // Channel estimation and interpolation - pil = (int16_t *)&mod_prs[0]; + pil = (int16_t *)mod_prs; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; if(prs_cfg->CombSize == 2) @@ -520,7 +520,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, #ifdef DEBUG_PRS_CHEST sprintf(filename, "%s%i%s", "PRSpilot_", rxAnt, ".m"); - LOG_M(filename, "prs_loc", &mod_prs[0], num_pilots,1,1); + LOG_M(filename, "prs_loc", mod_prs, num_pilots, 1, 1); sprintf(filename, "%s%i%s", "rxSigF_", rxAnt, ".m"); sprintf(varname, "%s%i", "rxF_", rxAnt); LOG_M(filename, varname, &rxdataF[rxAnt][0], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); From 284b7af49c19cbfea3f7d5782b70ca7e2b89c81e Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Sun, 19 Jan 2025 17:43:50 +0100 Subject: [PATCH 3/8] more comprehensive modulation lut table generation --- openair1/PHY/NR_REFSIG/nr_gen_mod_table.c | 30 ++++++++++++++--------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/openair1/PHY/NR_REFSIG/nr_gen_mod_table.c b/openair1/PHY/NR_REFSIG/nr_gen_mod_table.c index 203ca08678..76a89f670b 100644 --- a/openair1/PHY/NR_REFSIG/nr_gen_mod_table.c +++ b/openair1/PHY/NR_REFSIG/nr_gen_mod_table.c @@ -52,8 +52,8 @@ void nr_generate_modulation_table() { table = (short*) nr_qpsk_byte_mod_table; for (i=0; i<256; i++) { for (j=0; j<4; j++) { - table[i*8+(j*2)] = (short)(1-2*((i>>(j*2))&1))*val*sqrt2*sqrt2; - table[i*8+(j*2)+1] = (short)(1-2*((i>>(j*2+1))&1))*val*sqrt2*sqrt2; + *table++ = (short)(1 - 2 * ((i >> (j * 2)) & 1)) * val * sqrt2 * sqrt2; + *table++ = (short)(1 - 2 * ((i >> (j * 2 + 1)) & 1)) * val * sqrt2 * sqrt2; //printf("%d j%d\n",nr_qpsk_byte_mod_table[i*8+(j*2)],nr_qpsk_byte_mod_table[i*8+(j*2)+1]); } } @@ -62,16 +62,16 @@ void nr_generate_modulation_table() { table = (short*) nr_16qam_byte_mod_table; for (i=0; i<256; i++) { for (j=0; j<2; j++) { - table[i*4+(j*2)] = (short)((1-2*((i>>(j*4))&1))*(2-(1-2*((i>>(j*4+2))&1))))*val*sqrt10*sqrt2; - table[i*4+(j*2)+1] = (short)((1-2*((i>>(j*4+1))&1))*(2-(1-2*((i>>(j*4+3))&1))))*val*sqrt10*sqrt2; - //printf("%d j%d\n",nr_16qam_byte_mod_table[i*4+(j*2)],nr_16qam_byte_mod_table[i*4+(j*2)+1]); + *table++ = (short)((1 - 2 * ((i >> (j * 4)) & 1)) * (2 - (1 - 2 * ((i >> (j * 4 + 2)) & 1)))) * val * sqrt10 * sqrt2; + *table++ = (short)((1 - 2 * ((i >> (j * 4 + 1)) & 1)) * (2 - (1 - 2 * ((i >> (j * 4 + 3)) & 1)))) * val * sqrt10 * sqrt2; + // printf("%d j%d\n",nr_16qam_byte_mod_table[i*4+(j*2)],nr_16qam_byte_mod_table[i*4+(j*2)+1]); } } table = (short*) nr_16qam_mod_table; for (i=0; i<16; i++) { - table[i*2] = (short)((1-2*(i&1))*(2-(1-2*((i>>2)&1))))*val*sqrt10*sqrt2; - table[i*2+1] = (short)((1-2*((i>>1)&1))*(2-(1-2*((i>>3)&1))))*val*sqrt10*sqrt2; + *table++ = (short)((1 - 2 * (i & 1)) * (2 - (1 - 2 * ((i >> 2) & 1)))) * val * sqrt10 * sqrt2; + *table++ = (short)((1 - 2 * ((i >> 1) & 1)) * (2 - (1 - 2 * ((i >> 3) & 1)))) * val * sqrt10 * sqrt2; //printf("%d j%d\n",table[i*2],table[i*2+1]); } @@ -79,8 +79,12 @@ void nr_generate_modulation_table() { table = (short*) nr_64qam_mod_table; for (i=0; i<4096; i++) { for (j=0; j<2; j++) { - table[i*4+(j*2)] = (short)((1-2*((i>>(j*6))&1))*(4-(1-2*((i>>(j*6+2))&1))*(2-(1-2*((i>>(j*6+4))&1)))))*val*sqrt42*sqrt2; - table[i*4+(j*2)+1] = (short)((1-2*((i>>(j*6+1))&1))*(4-(1-2*((i>>(j*6+3))&1))*(2-(1-2*((i>>(j*6+5))&1)))))*val*sqrt42*sqrt2; + *table++ = (short)((1 - 2 * ((i >> (j * 6)) & 1)) + * (4 - (1 - 2 * ((i >> (j * 6 + 2)) & 1)) * (2 - (1 - 2 * ((i >> (j * 6 + 4)) & 1))))) + * val * sqrt42 * sqrt2; + *table++ = (short)((1 - 2 * ((i >> (j * 6 + 1)) & 1)) + * (4 - (1 - 2 * ((i >> (j * 6 + 3)) & 1)) * (2 - (1 - 2 * ((i >> (j * 6 + 5)) & 1))))) + * val * sqrt42 * sqrt2; //printf("%d j%d\n",table[i*4+(j*2)],table[i*4+(j*2)+1]); } } @@ -88,8 +92,12 @@ void nr_generate_modulation_table() { //256QAM table = (short*) nr_256qam_mod_table; for (i=0; i<256; i++) { - table[i*2] = (short)((1-2*(i&1))*(8-(1-2*((i>>2)&1))*(4-(1-2*((i>>4)&1))*(2-(1-2*((i>>6)&1))))))*val*sqrt170*sqrt2; - table[i*2+1] = (short)((1-2*((i>>1)&1))*(8-(1-2*((i>>3)&1))*(4-(1-2*((i>>5)&1))*(2-(1-2*((i>>7)&1))))))*val*sqrt170*sqrt2; + *table++ = (short)((1 - 2 * (i & 1)) + * (8 - (1 - 2 * ((i >> 2) & 1)) * (4 - (1 - 2 * ((i >> 4) & 1)) * (2 - (1 - 2 * ((i >> 6) & 1)))))) + * val * sqrt170 * sqrt2; + *table++ = (short)((1 - 2 * ((i >> 1) & 1)) + * (8 - (1 - 2 * ((i >> 3) & 1)) * (4 - (1 - 2 * ((i >> 5) & 1)) * (2 - (1 - 2 * ((i >> 7) & 1)))))) + * val * sqrt170 * sqrt2; } } From 268172a435af07538d53df719888a60bf120e465 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Sun, 19 Jan 2025 17:52:45 +0100 Subject: [PATCH 4/8] pure bad code fix --- common/platform_types.h | 6 +++++ .../PHY/NR_ESTIMATION/nr_measurements_gNB.c | 6 +++-- openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h | 2 +- openair1/PHY/NR_TRANSPORT/nr_prs.c | 24 ++++--------------- openair1/PHY/NR_TRANSPORT/srs_rx.c | 4 ++-- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 8 +++---- openair1/SIMULATION/NR_PHY/psbchsim.c | 11 ++------- 7 files changed, 24 insertions(+), 37 deletions(-) diff --git a/common/platform_types.h b/common/platform_types.h index cb3d872804..1001a454a9 100644 --- a/common/platform_types.h +++ b/common/platform_types.h @@ -288,6 +288,12 @@ typedef struct protocol_ctxt_s { #define CHECK_CTXT_ARGS(CTXT_Pp) + +static inline int ceil_mod(const unsigned int v, const unsigned int mod) +{ + return ((v + mod - 1) / mod) * mod; +} + #define exit_fun(msg) exit_function(__FILE__, __FUNCTION__, __LINE__, "exit_fun", OAI_EXIT_NORMAL) #ifdef __cplusplus extern "C" { diff --git a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c index 42b0b0b515..69d032a4f8 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c +++ b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c @@ -38,8 +38,10 @@ extern openair0_config_t openair0_cfg[MAX_CARDS]; -int nr_est_timing_advance_srs(const NR_DL_FRAME_PARMS *frame_parms, - const int32_t srs_estimated_channel_time[][frame_parms->ofdm_symbol_size]) { +int nr_est_timing_advance_srs(const NR_DL_FRAME_PARMS *frame_parms, + const c16_t srs_estimated_channel_time[][frame_parms->ofdm_symbol_size]) +{ + int timing_advance = 0; int max_val = 0; diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h index 9f340d84d6..d3db4f396a 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h @@ -64,7 +64,7 @@ void nr_gnb_measurements(PHY_VARS_gNB *gNB, uint8_t nrOfLayers); int nr_est_timing_advance_srs(const NR_DL_FRAME_PARMS *frame_parms, - const int32_t srs_estimated_channel_time[][frame_parms->ofdm_symbol_size]); + const c16_t srs_estimated_channel_time[][frame_parms->ofdm_symbol_size]); void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB, NR_DL_FRAME_PARMS *frame_parms, diff --git a/openair1/PHY/NR_TRANSPORT/nr_prs.c b/openair1/PHY/NR_TRANSPORT/nr_prs.c index 382e995a65..6f26b9a07f 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prs.c @@ -4,11 +4,10 @@ #include "PHY/NR_REFSIG/nr_refsig.h" #include "PHY/sse_intrin.h" #include "openair1/PHY/NR_REFSIG/refsig_defs_ue.h" +#include "openair1/PHY/NR_REFSIG/nr_mod_table.h" //#define DEBUG_PRS_MOD //#define DEBUG_PRS_MAP -extern short nr_qpsk_mod_table[8]; - int nr_generate_prs(int slot, c16_t *txdataF, int16_t amp, @@ -18,7 +17,7 @@ int nr_generate_prs(int slot, { int k_prime = 0, k = 0, idx; - int16_t mod_prs[NR_MAX_PRS_LENGTH<<1]; + c16_t mod_prs[NR_MAX_PRS_LENGTH]; int16_t k_prime_table[K_PRIME_TABLE_ROW_SIZE][K_PRIME_TABLE_COL_SIZE] = PRS_K_PRIME_TABLE; // PRS resource mapping with combsize=k which means PRS symbols exist in every k-th subcarrier in frequency domain @@ -45,25 +44,12 @@ int nr_generate_prs(int slot, uint32_t *gold = nr_gold_prs(prs_cfg->NPRSID, slot, l); for (int m = 0; m < (12/prs_cfg->CombSize) * prs_cfg->NumRB; m++) { idx = (((gold[(m << 1) >> 5]) >> ((m << 1) & 0x1f)) & 3); - mod_prs[m<<1] = nr_qpsk_mod_table[idx<<1]; - mod_prs[(m<<1)+1] = nr_qpsk_mod_table[(idx<<1) + 1]; - -#ifdef DEBUG_PRS_MOD - LOG_D("m %d idx %d gold seq %d mod_prs %d %d\n", m, idx, nr_gold_prs[l][(m<<1)>>5], mod_prs[m<<1], mod_prs[(m<<1)+1]); -#endif - + mod_prs[m] = nr_qpsk_mod_table[idx]; + #ifdef DEBUG_PRS_MAP LOG_D("m %d at k %d of l %d reIdx %d\n", m, k, l, (l*frame_parms->ofdm_symbol_size + k)<<1); #endif - - ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_prs[m<<1]) >> 15; - ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_prs[(m<<1) + 1]) >> 15; - -#ifdef DEBUG_PRS_MAP - LOG_D("(%d,%d)\n", - ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1], - ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]); -#endif + txdataF[l * frame_parms->ofdm_symbol_size + k] = c16mulRealShift(mod_prs[m], amp, 15); k = k + prs_cfg->CombSize; diff --git a/openair1/PHY/NR_TRANSPORT/srs_rx.c b/openair1/PHY/NR_TRANSPORT/srs_rx.c index 49ae659a06..ff9539edba 100644 --- a/openair1/PHY/NR_TRANSPORT/srs_rx.c +++ b/openair1/PHY/NR_TRANSPORT/srs_rx.c @@ -88,7 +88,7 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB, const uint8_t K_TC = 2 << srs_pdu->comb_size; const uint16_t M_sc_b_SRS = get_m_srs(srs_pdu->config_index, srs_pdu->bandwidth_index) * NR_NB_SC_PER_RB / K_TC; - int32_t *rx_signal; + c16_t *rx_signal; bool no_srs_signal = true; for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) { @@ -117,7 +117,7 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB, srs_received_signal[ant][l_line_offset+subcarrier] = rx_signal[l_line_offset+subcarrier]; - if (rx_signal[l_line_offset+subcarrier] != 0) { + if (rx_signal[l_line_offset + subcarrier].r || rx_signal[l_line_offset + subcarrier].i) { no_srs_signal = false; } diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 9e1ec84d9c..bcb530a0bf 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -647,8 +647,9 @@ int fill_srs_channel_matrix(uint8_t *channel_matrix, const uint16_t prg_size, const uint16_t num_prgs, const NR_DL_FRAME_PARMS *frame_parms, - const int32_t srs_estimated_channel_freq[][1<num_ant_ports][frame_parms->ofdm_symbol_size*(1<num_symbols)]) { - + const c16_t srs_estimated_channel_freq[][1 << srs_pdu->num_ant_ports] + [frame_parms->ofdm_symbol_size * (1 << srs_pdu->num_symbols)]) +{ const uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start*NR_NB_SC_PER_RB; const uint16_t step = prg_size*NR_NB_SC_PER_RB; @@ -664,8 +665,7 @@ int fill_srs_channel_matrix(uint8_t *channel_matrix, } for(int pI = 0; pI < num_prgs; pI++) { - - c16_t *srs_estimated_channel16 = (c16_t *)&srs_estimated_channel_freq[gI][uI][subcarrier]; + const c16_t *srs_estimated_channel16 = srs_estimated_channel_freq[gI][uI] + subcarrier; uint16_t index = uI*num_gnb_antenna_elements*num_prgs + gI*num_prgs + pI; if (normalized_iq_representation == 0) { diff --git a/openair1/SIMULATION/NR_PHY/psbchsim.c b/openair1/SIMULATION/NR_PHY/psbchsim.c index 972605fc96..d1f7993346 100644 --- a/openair1/SIMULATION/NR_PHY/psbchsim.c +++ b/openair1/SIMULATION/NR_PHY/psbchsim.c @@ -260,15 +260,8 @@ static int freq_domain_loopback(PHY_VARS_NR_UE *UE_tx, PHY_VARS_NR_UE *UE_rx, in nr_tx_psbch(UE_tx, frame, slot, &phy_data->psbch_vars, txdataF); int estimateSz = sl_ue2->sl_frame_params.samples_per_slot_wCP; - __attribute__((aligned(32))) struct complex16 rxdataF[1][estimateSz]; - for (int i = 0; i < sl_ue1->sl_frame_params.samples_per_slot_wCP; i++) { - struct complex16 *txdataF_ptr = (struct complex16 *)&txdataF[0][i]; - struct complex16 *rxdataF_ptr = (struct complex16 *)&rxdataF[0][i]; - rxdataF_ptr->r = txdataF_ptr->r; - rxdataF_ptr->i = txdataF_ptr->i; - // printf("r,i TXDATAF[%d]- %d:%d, RXDATAF[%d]- %d:%d\n", - // i, txdataF_ptr->r, txdataF_ptr->i, i, txdataF_ptr->r, txdataF_ptr->i); - } + __attribute__((aligned(32))) c16_t rxdataF[1][estimateSz]; + memcpy(rxdataF[0], txdataF[0], sl_ue1->sl_frame_params.samples_per_slot_wCP * sizeof(**rxdataF)); uint8_t err_status = 0; From 5416be3736f76d039978cafe876d8fa1185d5b97 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Tue, 28 Jan 2025 09:59:49 +0100 Subject: [PATCH 5/8] move byte2m128i in a more logical place --- CMakeLists.txt | 1 - common/utils/nr/nr_common.c | 34 ++++++++++++-- common/utils/nr/nr_common.h | 11 +++++ doc/Doxyfile | 1 - executables/nr-softmodem.c | 7 +-- executables/nr-uesoftmodem.c | 14 +++--- executables/softmodem-common.h | 2 + .../nrLDPC_coding_segment_encoder.c | 2 - openair1/PHY/CODING/nrLDPC_extern.h | 2 +- openair1/PHY/INIT/nr_init.c | 1 + .../PHY/NR_ESTIMATION/nr_measurements_gNB.c | 3 -- openair1/PHY/NR_REFSIG/nr_refsig.h | 1 - openair1/PHY/NR_REFSIG/scrambling_luts.c | 45 ------------------- openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c | 2 - .../nr_dl_channel_estimation.c | 5 +-- .../NR_UE_TRANSPORT/nr_dlsch_demodulation.c | 11 ++--- openair1/SCHED_NR/fapi_nr_l1.c | 9 +--- openair1/SCHED_NR/nr_prach_procedures.c | 3 -- openair1/SCHED_NR_UE/fapi_nr_ue_l1.c | 3 +- openair2/ENB_APP/enb_config.c | 5 --- openair2/LAYER2/MAC/mac_proto.h | 4 +- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 2 - openair2/LAYER2/NR_MAC_gNB/config.c | 4 -- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 2 - .../LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c | 2 - .../LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c | 6 +-- .../NR_MAC_gNB/gNB_scheduler_primitives.c | 9 ++-- .../LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c | 5 +-- .../LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c | 3 -- openair2/LAYER2/NR_MAC_gNB/main.c | 3 -- openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c | 3 -- openair2/NR_PHY_INTERFACE/NR_IF_Module.c | 13 +----- openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.c | 1 - openair2/RRC/LTE/rrc_eNB.c | 16 +------ openair2/RRC/LTE/rrc_eNB_S1AP.c | 5 ++- openair2/RRC/LTE/rrc_proto.h | 13 +++++- openair2/RRC/NR/MESSAGES/asn1_msg.c | 2 - openair2/RRC/NR/rrc_gNB.c | 4 -- openair2/RRC/NR/rrc_gNB_GTPV1U.c | 2 - openair2/RRC/NR/rrc_gNB_NGAP.c | 2 - openair2/RRC/NR/rrc_gNB_NGAP.h | 2 + openair2/RRC/NR/rrc_gNB_mobility.c | 4 +- openair3/NAS/NR_UE/nr_nas_msg.c | 1 - 43 files changed, 92 insertions(+), 178 deletions(-) delete mode 100644 openair1/PHY/NR_REFSIG/scrambling_luts.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 8e2457630a..2b852dcd0d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -917,7 +917,6 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_prach_common.c ${OPENAIR1_DIR}/PHY/nr_phy_common/src/nr_phy_common_csirs.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_scrambling.c - ${OPENAIR1_DIR}/PHY/NR_REFSIG/scrambling_luts.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/refsig.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c ) diff --git a/common/utils/nr/nr_common.c b/common/utils/nr/nr_common.c index 516c94cb46..1bac7e6da7 100644 --- a/common/utils/nr/nr_common.c +++ b/common/utils/nr/nr_common.c @@ -109,8 +109,6 @@ static const unsigned short srs_bandwidth_config[C_SRS_NUMBER][B_SRS_NUMBER][2] /* 63 */ {{272, 1}, {16, 17}, {8, 2}, {4, 2}}, }; -const char *duplex_mode[]={"FDD","TDD"}; - static const uint8_t bit_reverse_table_256[] = { 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, @@ -126,6 +124,36 @@ static const uint8_t bit_reverse_table_256[] = { 0x3B, 0xBB, 0x7B, 0xFB, 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF}; +simde__m128i byte2bit16_lut[256]; +void init_byte2bit16(void) +{ + for (int s = 0; s < 256; s++) { + byte2bit16_lut[s] = simde_mm_insert_epi16(byte2bit16_lut[s], s & 1, 0); + byte2bit16_lut[s] = simde_mm_insert_epi16(byte2bit16_lut[s], (s >> 1) & 1, 1); + byte2bit16_lut[s] = simde_mm_insert_epi16(byte2bit16_lut[s], (s >> 2) & 1, 2); + byte2bit16_lut[s] = simde_mm_insert_epi16(byte2bit16_lut[s], (s >> 3) & 1, 3); + byte2bit16_lut[s] = simde_mm_insert_epi16(byte2bit16_lut[s], (s >> 4) & 1, 4); + byte2bit16_lut[s] = simde_mm_insert_epi16(byte2bit16_lut[s], (s >> 5) & 1, 5); + byte2bit16_lut[s] = simde_mm_insert_epi16(byte2bit16_lut[s], (s >> 6) & 1, 6); + byte2bit16_lut[s] = simde_mm_insert_epi16(byte2bit16_lut[s], (s >> 7) & 1, 7); + } +} + +simde__m128i byte2m128i[256]; +void init_byte2m128i(void) { + + for (int s=0;s<256;s++) { + byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*(s&1)),0); + byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*((s>>1)&1)),1); + byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*((s>>2)&1)),2); + byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*((s>>3)&1)),3); + byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*((s>>4)&1)),4); + byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*((s>>5)&1)),5); + byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*((s>>6)&1)),6); + byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*((s>>7)&1)),7); + } +} + void reverse_bits_u8(uint8_t const* in, size_t sz, uint8_t* out) { DevAssert(in != NULL); @@ -704,7 +732,7 @@ frame_type_t get_frame_type(uint16_t current_band, uint8_t scs_index) { int32_t delta_duplex = get_delta_duplex(current_band, scs_index); frame_type_t current_type = delta_duplex == 0 ? TDD : FDD; - LOG_D(NR_MAC, "NR band %d, duplex mode %s, duplex spacing = %d KHz\n", current_band, duplex_mode[current_type], delta_duplex); + LOG_D(NR_MAC, "NR band %d, duplex mode %s, duplex spacing = %d KHz\n", current_band, duplex_mode_txt[current_type], delta_duplex); return current_type; } diff --git a/common/utils/nr/nr_common.h b/common/utils/nr/nr_common.h index 1408f271b0..8509aac413 100644 --- a/common/utils/nr/nr_common.h +++ b/common/utils/nr/nr_common.h @@ -183,6 +183,15 @@ uint32_t nr_timer_elapsed_time(const NR_timer_t *timer); int set_default_nta_offset(frequency_range_t freq_range, uint32_t samples_per_subframe); extern const nr_bandentry_t nr_bandtable[]; +extern simde__m128i byte2bit16_lut[256]; +void init_byte2bit16(void); +void init_byte2m128i(void); + +static inline simde__m128i byte2bit16(uint8_t b) +{ + return byte2bit16_lut[b]; +} + static inline int get_num_dmrs(uint16_t dmrs_mask ) { int num_dmrs=0; @@ -262,6 +271,8 @@ unsigned short get_N_b_srs(int c_srs, int b_srs); // Align up to a multiple of 16 #define ALIGN_UP_16(a) ((a + 15) & ~15) +static const char *const duplex_mode_txt[] = {"FDD", "TDD"}; + #ifdef __cplusplus #ifdef min #undef min diff --git a/doc/Doxyfile b/doc/Doxyfile index 023fe84693..22273aaf71 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -2085,7 +2085,6 @@ INPUT = \ @CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/NR_REFSIG/ul_ref_seq_nr.h \ @CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/NR_REFSIG/ul_ref_seq_nr.c \ @CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/NR_REFSIG/sss_nr.h \ -@CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/NR_REFSIG/scrambling_luts.c \ @CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/NR_REFSIG/dmrs_nr.c \ @CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/NR_REFSIG/refsig_defs_ue.h \ @CMAKE_CURRENT_SOURCE_DIR@/../openair1/PHY/NR_REFSIG/ptrs_nr.h \ diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c index e14e482b6d..210b5b09a1 100644 --- a/executables/nr-softmodem.c +++ b/executables/nr-softmodem.c @@ -86,6 +86,7 @@ unsigned short config_frames[4] = {2,9,11,13}; #include "time_meas.h" #include "utils.h" #include "x2ap_eNB.h" +#include "openair1/SCHED_NR/sched_nr.h" pthread_cond_t nfapi_sync_cond; pthread_mutex_t nfapi_sync_mutex; @@ -116,8 +117,7 @@ double rx_gain[MAX_NUM_CCs][4] = {{110,0,0,0},{20,0,0,0}}; double rx_gain_off = 0.0; static int tx_max_power[MAX_NUM_CCs]; /* = {0,0}*/; -int chain_offset=0; -extern void *udp_eNB_task(void *args_p); +int chain_offset = 0; int emulate_rf = 0; int numerology = 0; double cpuf; @@ -398,9 +398,6 @@ void terminate_task(task_id_t task_id, module_id_t mod_id) { itti_send_msg_to_task (task_id, ENB_MODULE_ID_TO_INSTANCE(mod_id), msg); } -//extern void free_transport(PHY_VARS_gNB *); -extern void nr_phy_free_RU(RU_t *); - int stop_L1(module_id_t gnb_id) { RU_t *ru = RC.ru[gnb_id]; diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index ca92f30d4f..690e6f3e25 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -91,7 +91,6 @@ unsigned short config_frames[4] = {2,9,11,13}; #include "pdcp.h" #include "actor.h" -extern const char *duplex_mode[]; THREAD_STRUCT thread_struct; nrUE_params_t nrUE_params = {0}; @@ -270,12 +269,13 @@ void init_openair0() openair0_cfg[card].tx_num_channels = min(4, frame_parms->nb_antennas_tx); openair0_cfg[card].rx_num_channels = min(4, frame_parms->nb_antennas_rx); - LOG_I(PHY, "HW: Configuring card %d, sample_rate %f, tx/rx num_channels %d/%d, duplex_mode %s\n", - card, - openair0_cfg[card].sample_rate, - openair0_cfg[card].tx_num_channels, - openair0_cfg[card].rx_num_channels, - duplex_mode[openair0_cfg[card].duplex_mode]); + LOG_I(PHY, + "HW: Configuring card %d, sample_rate %f, tx/rx num_channels %d/%d, duplex_mode %s\n", + card, + openair0_cfg[card].sample_rate, + openair0_cfg[card].tx_num_channels, + openair0_cfg[card].rx_num_channels, + duplex_mode_txt[openair0_cfg[card].duplex_mode]); if (is_sidelink) { dl_carrier = frame_parms->dl_CarrierFreq; diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h index 2e7aaacc21..2d7d1b33cf 100644 --- a/executables/softmodem-common.h +++ b/executables/softmodem-common.h @@ -361,6 +361,8 @@ void configure_rru(void *, void *arg); struct timespec timespec_add(struct timespec lhs, struct timespec rhs); struct timespec timespec_sub(struct timespec lhs, struct timespec rhs); extern uint8_t nfapi_mode; +extern char *parallel_config; +extern char *worker_config; #ifdef __cplusplus } #endif diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_segment/nrLDPC_coding_segment_encoder.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_segment/nrLDPC_coding_segment_encoder.c index 757566b1fc..adf9dd6624 100644 --- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_segment/nrLDPC_coding_segment_encoder.c +++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_segment/nrLDPC_coding_segment_encoder.c @@ -44,8 +44,6 @@ // #define DEBUG_LDPC_ENCODING // #define DEBUG_LDPC_ENCODING_FREE 1 -extern ldpc_interface_t ldpc_interface_segment; - typedef struct ldpc8blocks_args_s { nrLDPC_TB_encoding_parameters_t *nrLDPC_TB_encoding_parameters; encoder_implemparams_t impp; diff --git a/openair1/PHY/CODING/nrLDPC_extern.h b/openair1/PHY/CODING/nrLDPC_extern.h index f93e7eb9aa..a0e10db155 100644 --- a/openair1/PHY/CODING/nrLDPC_extern.h +++ b/openair1/PHY/CODING/nrLDPC_extern.h @@ -32,7 +32,7 @@ typedef struct ldpc_interface_s { } ldpc_interface_t; // Global var to limit the rework of the dirty legacy code -extern ldpc_interface_t ldpc_interface, ldpc_interface_offload; +extern ldpc_interface_t ldpc_interface, ldpc_interface_offload, ldpc_interface_segment; /* functions to load the LDPC shared lib, implemented in openair1/PHY/CODING/nrLDPC_load.c */ int load_LDPClib(char *version, ldpc_interface_t *); diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index f3c8d01579..3db1339169 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -129,6 +129,7 @@ void phy_init_nr_gNB(PHY_VARS_gNB *gNB) crcTableInit(); init_byte2m128i(); + init_byte2bit16(); init_pucch2_luts(); nr_init_fde(); // Init array for frequency equalization of transform precoding of PUSCH diff --git a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c index 69d032a4f8..2e6e4a54a6 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c +++ b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c @@ -36,12 +36,9 @@ #define I0_SKIP_DC 1 -extern openair0_config_t openair0_cfg[MAX_CARDS]; - int nr_est_timing_advance_srs(const NR_DL_FRAME_PARMS *frame_parms, const c16_t srs_estimated_channel_time[][frame_parms->ofdm_symbol_size]) { - int timing_advance = 0; int max_val = 0; diff --git a/openair1/PHY/NR_REFSIG/nr_refsig.h b/openair1/PHY/NR_REFSIG/nr_refsig.h index c79d0b70aa..b0cd9449f0 100644 --- a/openair1/PHY/NR_REFSIG/nr_refsig.h +++ b/openair1/PHY/NR_REFSIG/nr_refsig.h @@ -44,7 +44,6 @@ void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms, const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csi_params, const int slot, const csi_mapping_parms_t *phy_csi_parms); -void init_byte2m128i(void); void nr_generate_modulation_table(void); diff --git a/openair1/PHY/NR_REFSIG/scrambling_luts.c b/openair1/PHY/NR_REFSIG/scrambling_luts.c deleted file mode 100644 index f6b1207838..0000000000 --- a/openair1/PHY/NR_REFSIG/scrambling_luts.c +++ /dev/null @@ -1,45 +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 - */ - -/* Lookup tables for 3GPP scrambling/unscrambling */ - -/* Author R. Knopp / EURECOM / OpenAirInterface.org */ - -#include "PHY/impl_defs_nr.h" -#include "PHY/sse_intrin.h" -#include - -simde__m128i byte2m128i[256]; - -void init_byte2m128i(void) { - - for (int s=0;s<256;s++) { - byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*(s&1)),0); - byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*((s>>1)&1)),1); - byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*((s>>2)&1)),2); - byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*((s>>3)&1)),3); - byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*((s>>4)&1)),4); - byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*((s>>5)&1)),5); - byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*((s>>6)&1)),6); - byte2m128i[s] = simde_mm_insert_epi16(byte2m128i[s],(1-2*((s>>7)&1)),7); - } -} - diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c index 0a3717ec70..3f1d988c53 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c @@ -34,8 +34,6 @@ #include "nr_dlsch.h" #include "../../../nfapi/oai_integration/vendor_ext.h" -extern void set_taus_seed(unsigned int seed_type); - void nr_fill_dlsch_dl_tti_req(processingData_L1tx_t *msgTx, nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu) { NR_gNB_DLSCH_t *dlsch = &msgTx->dlsch[msgTx->num_pdsch_slot][0]; 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 ee4874026a..40bae6eac7 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -34,10 +34,7 @@ #include #include "nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h" #include "instrumentation.h" - - -extern openair0_config_t openair0_cfg[]; - +#include "executables/nr-softmodem-common.h" // #define DEBUG_PDSCH // #define DEBUG_PDCCH // #define DEBUG_PBCH(a...) printf(a) diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c index e5442aab48..4ac5f9e772 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c @@ -1515,8 +1515,8 @@ uint8_t nr_matrix_inverse(int32_t size, //Convert Q15 to floating point for (int rtx=0;rtx0) {//determin of the symmetric matrix is real part only - ((short*) ad_bc)[i<<1] = (short) ((creal(determin_cpx)*(1<<(shift0)))+0.5);// - //((short*) ad_bc)[(i<<1)+1] = (short) ((cimag(determin_cpx)*(1<<(shift0)))+0.5);// + ((short *)ad_bc)[i << 1] = (short)((creal(determin_cpx) * (1 << (shift0))) + 0.5); // } else { - ((short*) ad_bc)[i<<1] = (short) ((creal(determin_cpx)*(1<<(shift0)))-0.5);// - //((short*) ad_bc)[(i<<1)+1] = (short) ((cimag(determin_cpx)*(1<<(shift0)))-0.5);// + ((short *)ad_bc)[i << 1] = (short)((creal(determin_cpx) * (1 << (shift0))) - 0.5); // } - //if (i<4) printf("nr_det_FP= %d+j%d \n",((short*) ad_bc)[i<<1],((short*) ad_bc)[(i<<1)+1]); //Compute Inversion of the H^*H matrix (normalized output divide by determinant) for (int rtx=0;rtx - -extern uint8_t nfapi_mode; - uint8_t get_nr_prach_duration(uint8_t prach_format){ switch(prach_format){ diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c index 6dffd4ad8c..fbfc9d8389 100644 --- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c +++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c @@ -41,8 +41,7 @@ #include "utils.h" #include "openair2/PHY_INTERFACE/queue_t.h" #include "SCHED_NR_UE/phy_sch_processing_time.h" - -extern PHY_VARS_NR_UE ***PHY_vars_UE_g; +#include "openair1/PHY/phy_extern_nr_ue.h" const char *const dl_pdu_type[] = {"DCI", "DLSCH", "RA_DLSCH", "SI_DLSCH", "P_DLSCH", "CSI_RS", "CSI_IM", "TA"}; const char *const ul_pdu_type[] = {"PRACH", "PUCCH", "PUSCH", "SRS"}; diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index 6daae2907d..f166135fed 100644 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -59,11 +59,6 @@ #include "executables/thread-common.h" #include -extern uint32_t to_earfcn_DL(int eutra_bandP, uint32_t dl_CarrierFreq, uint32_t bw); -extern uint32_t to_earfcn_UL(int eutra_bandP, uint32_t ul_CarrierFreq, uint32_t bw); -extern char *parallel_config; -extern char *worker_config; - RAN_CONTEXT_t RC; void RCconfig_L1(void) { diff --git a/openair2/LAYER2/MAC/mac_proto.h b/openair2/LAYER2/MAC/mac_proto.h index 1a8a1f98bc..bf060eb820 100644 --- a/openair2/LAYER2/MAC/mac_proto.h +++ b/openair2/LAYER2/MAC/mac_proto.h @@ -1235,10 +1235,12 @@ void eNB_Config_Local_DRX(instance_t module_idP, rrc_mac_drx_config_req_t *rrc_m /* from here: prototypes to get rid of compilation warnings: doc to be written by function author */ uint8_t ul_subframe2_k_phich(COMMON_channels_t *cc, sub_frame_t ul_subframe); -#endif /** @}*/ /* MAC ITTI messaging related functions */ /* Main loop of MAC itti message handling */ void *mac_enb_task(void *arg); +uint32_t to_earfcn_DL(int eutra_bandP, long long int dl_CarrierFreq, uint32_t bw); +uint32_t to_earfcn_UL(int eutra_bandP, long long int ul_CarrierFreq, uint32_t bw); +#endif diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 762cad5106..c7ceeeab8e 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -60,8 +60,6 @@ // #define DEBUG_MIB // #define ENABLE_MAC_PAYLOAD_DEBUG 1 // #define DEBUG_RAR -extern uint32_t N_RB_DL; - /* TS 36.213 Table 9.2.3-3: Mapping of values for one HARQ-ACK bit to sequences */ static const int sequence_cyclic_shift_1_harq_ack_bit[2] /* HARQ-ACK Value 0 1 */ diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index 4927f407d0..c8aa0b2ac1 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -62,10 +62,6 @@ #include "nfapi_nr_interface_scf.h" #include "utils.h" -extern RAN_CONTEXT_t RC; -//extern int l2_init_gNB(void); -extern uint8_t nfapi_mode; - c16_t convert_precoder_weight(double complex c_in) { double cr = creal(c_in) * 32768 + 0.5; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 5ac48f1374..f0581cf58e 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -46,8 +46,6 @@ #include "openair2/LAYER2/RLC/rlc.h" #include -extern RAN_CONTEXT_t RC; -extern const uint8_t nr_slots_per_frame[5]; // forward declaration of functions used in this file static void fill_msg3_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu, diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c index fb239c48e4..e2fa7d744b 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c @@ -45,8 +45,6 @@ #include "executables/softmodem-common.h" -extern RAN_CONTEXT_t RC; - static void schedule_ssb(frame_t frame, sub_frame_t slot, NR_ServingCellConfigCommon_t *scc, diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c index 26cffef6ac..026f93fd43 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c @@ -37,10 +37,8 @@ #include "executables/softmodem-common.h" #include "common/utils/nr/nr_common.h" -//#define UL_HARQ_PRINT -extern RAN_CONTEXT_t RC; - -//#define ENABLE_MAC_PAYLOAD_DEBUG 1 +// #define UL_HARQ_PRINT +// #define ENABLE_MAC_PAYLOAD_DEBUG 1 uint32_t target_dl_mcs = 9; uint32_t target_dl_Nl = 1; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index ec243fcd86..1ca064b101 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -63,12 +63,9 @@ #include "common/utils/alg/find.h" -//#define DEBUG_DCI - -extern RAN_CONTEXT_t RC; - -// CQI TABLES (10 times the value in 214 to adequately compare with R) -// Table 1 (38.214 5.2.2.1-2) +// #define DEBUG_DCI +// CQI TABLES (10 times the value in 214 to adequately compare with R) +// Table 1 (38.214 5.2.2.1-2) static const uint16_t cqi_table1[16][2] = {{0, 0}, {2, 780}, {2, 1200}, diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c index e6935db7ae..cbfac0148d 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c @@ -37,10 +37,7 @@ #include #include "PHY/sse_intrin.h" -//#define SRS_DEBUG - -extern RAN_CONTEXT_t RC; - +// #define SRS_DEBUG const uint16_t m_SRS[64] = { 4, 8, 12, 16, 16, 20, 24, 24, 28, 32, 36, 40, 48, 48, 52, 56, 60, 64, 72, 72, 76, 80, 88, 96, 96, 104, 112, 120, 120, 120, 128, 128, 128, 132, 136, 144, 144, 144, 144, 152, 160, 160, 160, 168, 176, 184, 192, 192, 192, 192, 208, 216, 224, 240, 240, 240, 240, 256, 256, diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c index 378565123b..7a14dc7124 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c @@ -33,9 +33,6 @@ #include "common/ran_context.h" #include "common/utils/nr/nr_common.h" #include "nfapi/oai_integration/vendor_ext.h" - -extern RAN_CONTEXT_t RC; - static void nr_fill_nfapi_pucch(gNB_MAC_INST *nrmac, frame_t frame, sub_frame_t slot, diff --git a/openair2/LAYER2/NR_MAC_gNB/main.c b/openair2/LAYER2/NR_MAC_gNB/main.c index 3456cc86fd..a8fe8de79c 100644 --- a/openair2/LAYER2/NR_MAC_gNB/main.c +++ b/openair2/LAYER2/NR_MAC_gNB/main.c @@ -72,9 +72,6 @@ #include "time_meas.h" #include "utils.h" -extern RAN_CONTEXT_t RC; - - #define MACSTATSSTRLEN 36256 void *nrmac_stats_thread(void *arg) { diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c index 64a152f847..bffb064159 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c +++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c @@ -41,9 +41,6 @@ #include "openair2/F1AP/f1ap_du_rrc_message_transfer.h" #include "openair2/F1AP/f1ap_ids.h" #include "openair3/ocp-gtpu/gtp_itf.h" - -extern RAN_CONTEXT_t RC; - #include #include diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c index f23460c994..aac556575d 100644 --- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c @@ -45,22 +45,11 @@ #include "openair2/NR_PHY_INTERFACE/nr_sched_response.h" #include "openair2/PHY_INTERFACE/queue_t.h" #include "utils.h" +#include "nfapi/oai_integration/nfapi_pnf.h" #define MAX_IF_MODULES 100 static NR_IF_Module_t *nr_if_inst[MAX_IF_MODULES]; -extern int oai_nfapi_harq_indication(nfapi_harq_indication_t *harq_ind); -extern int oai_nfapi_crc_indication(nfapi_crc_indication_t *crc_ind); -extern int oai_nfapi_cqi_indication(nfapi_cqi_indication_t *cqi_ind); -extern int oai_nfapi_sr_indication(nfapi_sr_indication_t *ind); -extern int oai_nfapi_rx_ind(nfapi_rx_indication_t *ind); -extern int oai_nfapi_nr_slot_indication(nfapi_nr_slot_indication_scf_t *ind); -extern int oai_nfapi_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind); -extern int oai_nfapi_nr_crc_indication(nfapi_nr_crc_indication_t *ind); -extern int oai_nfapi_nr_srs_indication(nfapi_nr_srs_indication_t *ind); -extern int oai_nfapi_nr_uci_indication(nfapi_nr_uci_indication_t *ind); -extern int oai_nfapi_nr_rach_indication(nfapi_nr_rach_indication_t *ind); -extern uint8_t nfapi_mode; static void handle_nr_rach(NR_UL_IND_t *UL_info) { diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.c b/openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.c index 8a6bd3118c..97c5a4e130 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.c @@ -57,7 +57,6 @@ void read_channel_param(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t * pdu, int slot, return; } -extern nr_bler_struct nr_bler_data[NR_NUM_MCS]; float get_bler_val(uint8_t mcs, int sinr) { // 4th col = dropped packets, 5th col = total packets diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c index bfe07c86ca..78f05cf56a 100644 --- a/openair2/RRC/LTE/rrc_eNB.c +++ b/openair2/RRC/LTE/rrc_eNB.c @@ -34,6 +34,7 @@ #include "uper_encoder.h" #include "uper_decoder.h" #include "rrc_defs.h" +#include "rrc_proto.h" #include "rrc_extern.h" #include "assertions.h" #include "common/ran_context.h" @@ -104,23 +105,8 @@ #define NUMBEROF_DRBS_TOBE_ADDED 1 static int encode_CG_ConfigInfo(char *buffer,int buffer_size,rrc_eNB_ue_context_t *const ue_context_pP,int *enc_size); -extern RAN_CONTEXT_t RC; - -extern eNB_MAC_INST *eNB_mac_inst; -extern UE_MAC_INST *UE_mac_inst; - - mui_t rrc_eNB_mui = 0; -extern uint32_t to_earfcn_DL(int eutra_bandP, uint32_t dl_CarrierFreq, uint32_t bw); -extern int rrc_eNB_process_security(const protocol_ctxt_t *const ctxt_pP, rrc_eNB_ue_context_t *const ue_context_pP, security_capabilities_t *security_capabilities_pP); -extern void process_eNB_security_key(const protocol_ctxt_t *const ctxt_pP, - rrc_eNB_ue_context_t *const ue_context_pP, - uint8_t *security_key_pP); -extern int rrc_eNB_generate_RRCConnectionReconfiguration_endc(protocol_ctxt_t *ctxt, rrc_eNB_ue_context_t *ue_context, unsigned char *buffer, int buffer_size, OCTET_STRING_t *scg_group_config, - OCTET_STRING_t *scg_RB_config); -extern struct rrc_eNB_ue_context_s *get_first_ue_context(eNB_RRC_INST *rrc_instance_pP); - pthread_mutex_t rrc_release_freelist; RRC_release_list_t rrc_release_info; pthread_mutex_t lock_ue_freelist; diff --git a/openair2/RRC/LTE/rrc_eNB_S1AP.c b/openair2/RRC/LTE/rrc_eNB_S1AP.c index 4ec1b9383d..1124cc8dd9 100644 --- a/openair2/RRC/LTE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LTE/rrc_eNB_S1AP.c @@ -29,6 +29,7 @@ */ #include "rrc_defs.h" +#include "rrc_proto.h" #include "rrc_extern.h" #include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h" #include "RRC/LTE/MESSAGES/asn1_msg.h" @@ -396,7 +397,9 @@ static e_LTE_SecurityAlgorithmConfig__integrityProtAlgorithm rrc_eNB_select_inte return INTEGRITY_ALGORITHM_NONE; } -/*! \fn int rrc_eNB_process_security (uint8_t mod_id, uint8_t ue_index, security_capabilities_t *security_capabilities) +/*! \fn int rrc_eNB_process_security(const protocol_ctxt_t *const ctxt_pP, + rrc_eNB_ue_context_t *const ue_context_pP, + security_capabilities_t *security_capabilities_pP) *\brief save and analyze available security algorithms bit mask and select relevant ones. *\param mod_id Instance ID of eNB. *\param ue_index Instance ID of UE in the eNB. diff --git a/openair2/RRC/LTE/rrc_proto.h b/openair2/RRC/LTE/rrc_proto.h index 1810fbaed2..38ba42b251 100644 --- a/openair2/RRC/LTE/rrc_proto.h +++ b/openair2/RRC/LTE/rrc_proto.h @@ -654,5 +654,16 @@ extern pthread_mutex_t lock_ue_freelist; void remove_UE_from_freelist(module_id_t mod_id, rnti_t rnti); void put_UE_in_freelist(module_id_t mod_id, rnti_t rnti, bool removeFlag); void release_UE_in_freeList(module_id_t mod_id); - +int rrc_eNB_process_security(const protocol_ctxt_t *const ctxt_pP, + rrc_eNB_ue_context_t *const ue_context_pP, + security_capabilities_t *security_capabilities_pP); +void process_eNB_security_key(const protocol_ctxt_t *const ctxt_pP, + rrc_eNB_ue_context_t *const ue_context_pP, + uint8_t *security_key_pP); +int rrc_eNB_generate_RRCConnectionReconfiguration_endc(protocol_ctxt_t *ctxt, + rrc_eNB_ue_context_t *ue_context, + unsigned char *buffer, + int buffer_size, + OCTET_STRING_t *scg_group_config, + OCTET_STRING_t *scg_RB_config); /** @}*/ diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c index 68a8c49774..b66625e6b2 100644 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.c +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c @@ -153,8 +153,6 @@ typedef struct xer_sprint_string_s { size_t string_index; } xer_sprint_string_t; -extern RAN_CONTEXT_t RC; - /* * This is a helper function for xer_sprint, which directs all incoming data * into the provided string. diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index b4d33b16f0..fd69a4fafd 100644 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -101,10 +101,6 @@ #include "openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc_extern.h" #endif -//#define XER_PRINT - -extern RAN_CONTEXT_t RC; - mui_t rrc_gNB_mui = 0; typedef struct deliver_ue_ctxt_release_data_t { diff --git a/openair2/RRC/NR/rrc_gNB_GTPV1U.c b/openair2/RRC/NR/rrc_gNB_GTPV1U.c index 6bf64a27a9..79882d58f3 100644 --- a/openair2/RRC/NR/rrc_gNB_GTPV1U.c +++ b/openair2/RRC/NR/rrc_gNB_GTPV1U.c @@ -36,8 +36,6 @@ #include "rrc_eNB_GTPV1U.h" #include "s1ap_messages_types.h" -extern RAN_CONTEXT_t RC; - int rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(gNB_RRC_UE_t *ue, const gtpv1u_enb_create_tunnel_resp_t *const create_tunnel_resp_pP, uint8_t *inde_list) diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.c b/openair2/RRC/NR/rrc_gNB_NGAP.c index 08f83ea5c8..0b1c3012f4 100644 --- a/openair2/RRC/NR/rrc_gNB_NGAP.c +++ b/openair2/RRC/NR/rrc_gNB_NGAP.c @@ -87,8 +87,6 @@ #include "openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc_extern.h" #endif -extern RAN_CONTEXT_t RC; - /* Masks for NGAP Encryption algorithms, NEA0 is always supported (not coded) */ static const uint16_t NGAP_ENCRYPTION_NEA1_MASK = 0x8000; static const uint16_t NGAP_ENCRYPTION_NEA2_MASK = 0x4000; diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.h b/openair2/RRC/NR/rrc_gNB_NGAP.h index a4ccaaa41b..22fff8705f 100644 --- a/openair2/RRC/NR/rrc_gNB_NGAP.h +++ b/openair2/RRC/NR/rrc_gNB_NGAP.h @@ -40,6 +40,8 @@ #include "ngap_messages_types.h" #include "nr_rrc_defs.h" +extern mui_t rrc_gNB_mui; + void rrc_gNB_send_NGAP_NAS_FIRST_REQ(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, NR_RRCSetupComplete_IEs_t *rrcSetupComplete); int rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, instance_t instance); diff --git a/openair2/RRC/NR/rrc_gNB_mobility.c b/openair2/RRC/NR/rrc_gNB_mobility.c index 22e86c5120..e4c4e8b67e 100644 --- a/openair2/RRC/NR/rrc_gNB_mobility.c +++ b/openair2/RRC/NR/rrc_gNB_mobility.c @@ -34,9 +34,7 @@ #include "MESSAGES/asn1_msg.h" #include "nr_pdcp/nr_pdcp_oai_api.h" #include "openair3/SECU/key_nas_deriver.h" - -/* declared in rrc_gNB.c: should be cleaned up through helper function? useful? */ -extern mui_t rrc_gNB_mui; +#include "openair2/RRC/NR/rrc_gNB_NGAP.h" typedef enum { HO_CTX_BOTH, HO_CTX_SOURCE, HO_CTX_TARGET } ho_ctx_type_t; static nr_handover_context_t *alloc_ho_ctx(ho_ctx_type_t type) diff --git a/openair3/NAS/NR_UE/nr_nas_msg.c b/openair3/NAS/NR_UE/nr_nas_msg.c index 5e9ce65194..f05a173960 100644 --- a/openair3/NAS/NR_UE/nr_nas_msg.c +++ b/openair3/NAS/NR_UE/nr_nas_msg.c @@ -53,7 +53,6 @@ #define MAX_NAS_UE 4 -extern uint16_t NB_UE_INST; static nr_ue_nas_t nr_ue_nas[MAX_NAS_UE] = {0}; static nr_nas_msg_snssai_t nas_allowed_nssai[8]; From 25652c5a2461fba68af852bc8248a4f8541e1044 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Sun, 19 Jan 2025 21:02:56 +0100 Subject: [PATCH 6/8] fix bad type in dci encoding --- openair1/PHY/NR_TRANSPORT/nr_dci.c | 36 +++++++++++++++--------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci.c b/openair1/PHY/NR_TRANSPORT/nr_dci.c index 54ca8665c3..9bda1b96c4 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dci.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dci.c @@ -66,8 +66,8 @@ static void nr_generate_dci(PHY_VARS_gNB *gNB, get_coreset_rballoc(pdcch_pdu_rel15->FreqDomainResource,&n_rb,&rb_offset); uint16_t cset_start_sc = frame_parms->first_carrier_offset + (pdcch_pdu_rel15->BWPStart + rb_offset) * NR_NB_SC_PER_RB; int idx1 = pdcch_pdu_rel15->StartSymbolIndex+pdcch_pdu_rel15->DurationSymbols; - int idx2 = (((n_rb + rb_offset + pdcch_pdu_rel15->BWPStart) * 6 + 15) >> 4) << 4; - int16_t mod_dmrs[idx1][idx2] __attribute__((aligned(16))); + int idx2 = (((n_rb + rb_offset + pdcch_pdu_rel15->BWPStart) * 3) + 15) & ~15; + c16_t mod_dmrs[idx1][idx2] __attribute__((aligned(16))); for (int d = 0; d < pdcch_pdu_rel15->numDlDci; d++) { /*The coreset is initialised @@ -114,7 +114,7 @@ static void nr_generate_dci(PHY_VARS_gNB *gNB, /// DMRS QPSK modulation for (int symb = cset_start_symb; symb < cset_start_symb + pdcch_pdu_rel15->DurationSymbols; symb++) { const uint32_t *gold = nr_gold_pdcch(frame_parms->N_RB_DL, frame_parms->symbols_per_slot, dci_pdu->ScramblingId, slot, symb); - nr_modulation(gold, dmrs_length, DMRS_MOD_ORDER, mod_dmrs[symb]); // Qm = 2 as DMRS is QPSK modulated + nr_modulation(gold, dmrs_length, DMRS_MOD_ORDER, (int16_t *)mod_dmrs[symb]); // Qm = 2 as DMRS is QPSK modulated #ifdef DEBUG_PDCCH_DMRS if(dci_pdu->RNTI!=0xFFFF) { @@ -122,8 +122,10 @@ static void nr_generate_dci(PHY_VARS_gNB *gNB, printf("symb %d i %d %p gold seq 0x%08x mod_dmrs %d %d\n", symb, i, - &gold_pdcch_dmrs[symb][i>>5],gold_pdcch_dmrs[symb][i>>5], - mod_dmrs[symb][i<<1], mod_dmrs[symb][(i<<1)+1]); + &gold_pdcch_dmrs[symb][i >> 5], + gold_pdcch_dmrs[symb][i >> 5], + mod_dmrs[symb][i].r, + mod_dmrs[symb][i].i); } #endif } @@ -160,18 +162,18 @@ static void nr_generate_dci(PHY_VARS_gNB *gNB, scrambled_output[6], scrambled_output[7], scrambled_output[8], scrambled_output[9], scrambled_output[10],scrambled_output[11] ); #endif /// QPSK modulation - int16_t mod_dci[NR_MAX_DCI_SIZE>>1] __attribute__((aligned(16))); - nr_modulation(scrambled_output, encoded_length, DMRS_MOD_ORDER, mod_dci); //Qm = 2 as DMRS is QPSK modulated + c16_t mod_dci[NR_MAX_DCI_SIZE >> 2] __attribute__((aligned(16))); + nr_modulation(scrambled_output, encoded_length, DMRS_MOD_ORDER, (int16_t *)mod_dci); // Qm = 2 as DMRS is QPSK modulated #ifdef DEBUG_DCI for (int i=0; i>1; i++) - printf("i %d mod_dci %d %d\n", i, mod_dci[i<<1], mod_dci[(i<<1)+1] ); - + printf("i %d mod_dci %d %d\n", i, mod_dci[i].r, mod_dci[i].i); + #endif /// Resource mapping uint16_t amp = gNB->TX_AMP; - int32_t *txdataF = (int32_t *)&gNB->common_vars.txdataF[beam_nb][0][txdataF_offset]; + c16_t *txdataF = gNB->common_vars.txdataF[beam_nb][0] + txdataF_offset; if (cset_start_sc >= frame_parms->ofdm_symbol_size) cset_start_sc -= frame_parms->ofdm_symbol_size; @@ -198,8 +200,7 @@ static void nr_generate_dci(PHY_VARS_gNB *gNB, for (int m = 0; m < NR_NB_SC_PER_RB; m++) { if (m == (k_prime << 2) + 1) { // DMRS if not already mapped - ((int16_t *)txdataF)[(l * frame_parms->ofdm_symbol_size + k) << 1] = (amp * mod_dmrs[l][dmrs_idx << 1]) >> 15; - ((int16_t *)txdataF)[((l * frame_parms->ofdm_symbol_size + k) << 1) + 1] = (amp * mod_dmrs[l][(dmrs_idx << 1) + 1]) >> 15; + txdataF[l * frame_parms->ofdm_symbol_size + k] = c16mulRealShift(mod_dmrs[l][dmrs_idx], amp, 15); #ifdef DEBUG_PDCCH_DMRS LOG_I(NR_PHY_DCI, @@ -207,23 +208,22 @@ static void nr_generate_dci(PHY_VARS_gNB *gNB, dmrs_idx, l, k, - ((int16_t *)txdataF)[(l * frame_parms->ofdm_symbol_size + k) << 1], - ((int16_t *)txdataF)[((l * frame_parms->ofdm_symbol_size + k) << 1) + 1]); + txdataF[l * frame_parms->ofdm_symbol_size + k].r, + txdataF[l * frame_parms->ofdm_symbol_size + k].i); #endif dmrs_idx++; k_prime++; } else { // DCI payload - ((int16_t *)txdataF)[(l * frame_parms->ofdm_symbol_size + k) << 1] = (amp * mod_dci[dci_idx << 1]) >> 15; - ((int16_t *)txdataF)[((l * frame_parms->ofdm_symbol_size + k) << 1) + 1] = (amp * mod_dci[(dci_idx << 1) + 1]) >> 15; + txdataF[l * frame_parms->ofdm_symbol_size + k] = c16mulRealShift(mod_dci[dci_idx], amp, 15); #ifdef DEBUG_DCI LOG_I(NR_PHY_DCI, "PDCCH: l %d position %d => (%d,%d)\n", l, k, - ((int16_t *)txdataF)[(l * frame_parms->ofdm_symbol_size + k) << 1], - ((int16_t *)txdataF)[((l * frame_parms->ofdm_symbol_size + k) << 1) + 1]); + txdataF[l * frame_parms->ofdm_symbol_size + k].r, + txdataF[l * frame_parms->ofdm_symbol_size + k].i; #endif dci_idx++; From 62e8431c981203b4e3e39d48a8a5360f2a4d998b Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Sun, 19 Jan 2025 21:12:40 +0100 Subject: [PATCH 7/8] remove code obfuscation --- openair1/SIMULATION/NR_PHY/prachsim.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c index db3631276c..8f644bf4c5 100644 --- a/openair1/SIMULATION/NR_PHY/prachsim.c +++ b/openair1/SIMULATION/NR_PHY/prachsim.c @@ -678,16 +678,16 @@ int main(int argc, char **argv){ for (i = 0; i < frame_parms->samples_per_subframe; i++) { for (aa=0; aa<1; aa++) { if (awgn_flag == 0) { - s_re[aa][i] = ((double)(((short *)&txdata[aa][prach_start]))[(i<<1)]); - s_im[aa][i] = ((double)(((short *)&txdata[aa][prach_start]))[(i<<1)+1]); + s_re[aa][i] = txdata[aa][prach_start + i].r; + s_im[aa][i] = txdata[aa][prach_start + i].i; } else { for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { if (aa==0) { - r_re[aarx][i] = ((double)(((short *)&txdata[aa][prach_start]))[(i<<1)]); - r_im[aarx][i] = ((double)(((short *)&txdata[aa][prach_start]))[(i<<1)+1]); + r_re[aa][i] = txdata[aa][prach_start + i].r; + r_im[aa][i] = txdata[aa][prach_start + i].i; } else { - r_re[aarx][i] += ((double)(((short *)&txdata[aa][prach_start]))[(i<<1)]); - r_im[aarx][i] += ((double)(((short *)&txdata[aa][prach_start]))[(i<<1)+1]); + r_re[aa][i] += txdata[aa][prach_start + i].r; + r_im[aa][i] += txdata[aa][prach_start + i].i; } } } From 6d14ac735bc9fa608ce6499589d6e525e5ea21c6 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Sun, 19 Jan 2025 21:14:19 +0100 Subject: [PATCH 8/8] remove dead commented code --- common/utils/nr/nr_common.h | 3 - openair1/PHY/INIT/nr_init.c | 2 +- .../NR_ESTIMATION/nr_ul_channel_estimation.c | 56 +++++++++---------- openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h | 10 ++-- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 4 +- openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 2 +- .../PHY/NR_TRANSPORT/nr_transport_proto.h | 2 +- .../PHY/NR_TRANSPORT/nr_ulsch_demodulation.c | 6 +- openair1/PHY/NR_TRANSPORT/srs_rx.c | 14 ++--- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 11 ++-- openair1/SIMULATION/NR_PHY/dlschsim.c | 33 ----------- radio/fhi_72/oaioran.c | 23 ++------ 12 files changed, 61 insertions(+), 105 deletions(-) diff --git a/common/utils/nr/nr_common.h b/common/utils/nr/nr_common.h index 8509aac413..7e7b15d13f 100644 --- a/common/utils/nr/nr_common.h +++ b/common/utils/nr/nr_common.h @@ -268,9 +268,6 @@ unsigned short get_N_b_srs(int c_srs, int b_srs); #define CEILIDIV(a,b) ((a+b-1)/b) #define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1)) -// Align up to a multiple of 16 -#define ALIGN_UP_16(a) ((a + 15) & ~15) - static const char *const duplex_mode_txt[] = {"FDD", "TDD"}; #ifdef __cplusplus diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 3db1339169..451144dfee 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -197,7 +197,7 @@ void phy_init_nr_gNB(PHY_VARS_gNB *gNB) int n_buf = Prx*max_ul_mimo_layers; int nb_re_pusch = N_RB_UL * NR_NB_SC_PER_RB; - int nb_re_pusch2 = ALIGN_UP_16(nb_re_pusch); + int nb_re_pusch2 = ceil_mod(nb_re_pusch, 16); gNB->pusch_vars = (NR_gNB_PUSCH *)malloc16_clear(gNB->max_nb_pusch * sizeof(NR_gNB_PUSCH)); for (int ULSCH_id = 0; ULSCH_id < gNB->max_nb_pusch; ULSCH_id++) { diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c index 6fdf6cd995..8ef3cb1b0c 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c @@ -703,11 +703,11 @@ int nr_srs_channel_estimation( const nfapi_nr_srs_pdu_t *srs_pdu, const nr_srs_info_t *nr_srs_info, const c16_t **srs_generated_signal, - int32_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size * (1 << srs_pdu->num_symbols)], - int32_t srs_estimated_channel_freq[][1 << srs_pdu->num_ant_ports] - [gNB->frame_parms.ofdm_symbol_size * (1 << srs_pdu->num_symbols)], - int32_t srs_estimated_channel_time[][1 << srs_pdu->num_ant_ports][gNB->frame_parms.ofdm_symbol_size], - int32_t srs_estimated_channel_time_shifted[][1 << srs_pdu->num_ant_ports][gNB->frame_parms.ofdm_symbol_size], + c16_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size * (1 << srs_pdu->num_symbols)], + c16_t srs_estimated_channel_freq[][1 << srs_pdu->num_ant_ports] + [gNB->frame_parms.ofdm_symbol_size * (1 << srs_pdu->num_symbols)], + c16_t srs_estimated_channel_time[][1 << srs_pdu->num_ant_ports][gNB->frame_parms.ofdm_symbol_size], + c16_t srs_estimated_channel_time_shifted[][1 << srs_pdu->num_ant_ports][gNB->frame_parms.ofdm_symbol_size], int8_t *snr_per_rb, int8_t *snr) { @@ -738,20 +738,20 @@ int nr_srs_channel_estimation( c16_t noise[arr_len]; memset(noise, 0, arr_len * sizeof(c16_t)); - uint8_t mem_offset = ((16 - ((long)&srs_estimated_channel_freq[0][0][subcarrier_offset + nr_srs_info->k_0_p[0][0]])) & 0xF) + uint8_t mem_offset = ((16 - ((intptr_t)&srs_estimated_channel_freq[0][0][subcarrier_offset + nr_srs_info->k_0_p[0][0]])) & 0xF) >> 2; // >> 2 <=> /sizeof(int32_t) // filt16_end is {4096,8192,8192,8192,12288,16384,16384,16384,0,0,0,0,0,0,0,0} // The End of OFDM symbol corresponds to the position of last 16384 in the filter // The c16multaddVectRealComplex applies the remaining 8 zeros of filter, therefore, to avoid a buffer overflow, // we added 8 in the array size - int32_t srs_est[frame_parms->ofdm_symbol_size * (1 << srs_pdu->num_symbols) + mem_offset + 8] __attribute__((aligned(32))); + c16_t srs_est[frame_parms->ofdm_symbol_size * (1 << srs_pdu->num_symbols) + mem_offset + 8] __attribute__((aligned(32))); c16_t ls_estimated = {0}; for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) { for (int p_index = 0; p_index < N_ap; p_index++) { memset(srs_ls_estimated_channel, 0, frame_parms->ofdm_symbol_size * (1 << srs_pdu->num_symbols) * sizeof(c16_t)); - memset(srs_est, 0, (frame_parms->ofdm_symbol_size * (1 << srs_pdu->num_symbols) + mem_offset) * sizeof(int32_t)); + memset(srs_est, 0, (frame_parms->ofdm_symbol_size * (1 << srs_pdu->num_symbols) + mem_offset) * sizeof(c16_t)); #ifdef SRS_DEBUG LOG_I(NR_PHY, "====================== UE port %d --> gNB Rx antenna %i ======================\n", p_index, ant); @@ -762,7 +762,7 @@ int nr_srs_channel_estimation( subcarrier -= frame_parms->ofdm_symbol_size; } - c16_t *srs_estimated_channel16 = (c16_t *)&srs_est[subcarrier + mem_offset]; + c16_t *srs_estimated_channel16 = &srs_est[subcarrier + mem_offset]; for (int k = 0; k < M_sc_b_SRS; k++) { if (k % fd_cdm == 0) { @@ -773,8 +773,8 @@ int nr_srs_channel_estimation( int16_t generated_real = srs_generated_signal[p_index][subcarrier_cdm].r; int16_t generated_imag = srs_generated_signal[p_index][subcarrier_cdm].i; - int16_t received_real = ((c16_t *)srs_received_signal[ant])[subcarrier_cdm].r; - int16_t received_imag = ((c16_t *)srs_received_signal[ant])[subcarrier_cdm].i; + int16_t received_real = srs_received_signal[ant][subcarrier_cdm].r; + int16_t received_imag = srs_received_signal[ant][subcarrier_cdm].i; // We know that nr_srs_info->srs_generated_signal_bits bits are enough to represent the generated_real and // generated_imag. So we only need a nr_srs_info->srs_generated_signal_bits shift to ensure that the result fits into 16 @@ -806,10 +806,10 @@ int nr_srs_channel_estimation( LOG_I(NR_PHY, "(%4i) %6i\t%6i | %6i\t%6i | %6i\t%6i\n", subcarrier_log, - ((c16_t *)srs_generated_signal[p_index])[subcarrier].r, - ((c16_t *)srs_generated_signal[p_index])[subcarrier].i, - ((c16_t *)srs_received_signal[ant])[subcarrier].r, - ((c16_t *)srs_received_signal[ant])[subcarrier].i, + srs_generated_signal[p_index][subcarrier].r, + srs_generated_signal[p_index][subcarrier].i, + srs_received_signal[ant][subcarrier].r, + srs_received_signal[ant][subcarrier].i, ls_estimated.r, ls_estimated.i); #endif @@ -823,7 +823,7 @@ int nr_srs_channel_estimation( c16multaddVectRealComplex(filt8_start, &ls_estimated, srs_estimated_channel16, 8); } else if (subcarrier < K_TC) { // Start of OFDM symbol case // filt8_start is {12288,8192,4096,0,0,0,0,0} - srs_estimated_channel16 = (c16_t *)&srs_est[subcarrier]; + srs_estimated_channel16 = &srs_est[subcarrier]; const short *filter = mem_offset == 0 ? filt8_start : filt8_start_shift2; c16multaddVectRealComplex(filter, &ls_estimated, srs_estimated_channel16, 8); } else if ((subcarrier + K_TC) >= frame_parms->ofdm_symbol_size @@ -837,14 +837,14 @@ int nr_srs_channel_estimation( } else if (k % 2 == 0) { // 2nd middle case // filt8_middle4 is {0,0,4096,8192,8192,8192,4096,0} c16multaddVectRealComplex(filt8_middle4, &ls_estimated, srs_estimated_channel16, 8); - srs_estimated_channel16 = (c16_t *)&srs_est[sc_offset]; + srs_estimated_channel16 = &srs_est[sc_offset]; } } else { if (k == 0) { // First subcarrier case // filt16_start is {12288,8192,8192,8192,4096,0,0,0,0,0,0,0,0,0,0,0} c16multaddVectRealComplex(filt16_start, &ls_estimated, srs_estimated_channel16, 16); } else if (subcarrier < K_TC) { // Start of OFDM symbol case - srs_estimated_channel16 = (c16_t *)&srs_est[sc_offset]; + srs_estimated_channel16 = &srs_est[sc_offset]; // filt16_start is {12288,8192,8192,8192,4096,0,0,0,0,0,0,0,0,0,0,0} c16multaddVectRealComplex(filt16_start, &ls_estimated, srs_estimated_channel16, 16); } else if ((subcarrier + K_TC) >= frame_parms->ofdm_symbol_size @@ -854,7 +854,7 @@ int nr_srs_channel_estimation( } else { // Middle case // filt16_middle4 is {4096,8192,8192,8192,8192,8192,8192,8192,4096,0,0,0,0,0,0,0} c16multaddVectRealComplex(filt16_middle4, &ls_estimated, srs_estimated_channel16, 16); - srs_estimated_channel16 = (c16_t *)&srs_est[sc_offset]; + srs_estimated_channel16 = &srs_est[sc_offset]; } } @@ -866,9 +866,9 @@ int nr_srs_channel_estimation( } // for (int k = 0; k < M_sc_b_SRS; k++) - memcpy(&srs_estimated_channel_freq[ant][p_index][0], + memcpy(srs_estimated_channel_freq[ant][p_index], &srs_est[mem_offset], - (frame_parms->ofdm_symbol_size * (1 << srs_pdu->num_symbols)) * sizeof(int32_t)); + (frame_parms->ofdm_symbol_size * (1 << srs_pdu->num_symbols)) * sizeof(c16_t)); // Compute noise subcarrier = subcarrier_offset + nr_srs_info->k_0_p[p_index][0]; @@ -877,7 +877,7 @@ int nr_srs_channel_estimation( } uint16_t base_idx = ant * N_ap * M_sc_b_SRS + p_index * M_sc_b_SRS; for (int k = 0; k < M_sc_b_SRS; k++) { - ch[base_idx + k] = ((c16_t *)srs_estimated_channel_freq[ant][p_index])[subcarrier]; + ch[base_idx + k] = srs_estimated_channel_freq[ant][p_index][subcarrier]; noise[base_idx + k].r = abs(srs_ls_estimated_channel[subcarrier].r - ch[base_idx + k].r); noise[base_idx + k].i = abs(srs_ls_estimated_channel[subcarrier].i - ch[base_idx + k].i); subcarrier += K_TC; @@ -908,8 +908,8 @@ int nr_srs_channel_estimation( subcarrier_log, srs_ls_estimated_channel[subcarrier].r, srs_ls_estimated_channel[subcarrier].i, - ((c16_t *)srs_estimated_channel_freq[ant][p_index])[subcarrier].r, - ((c16_t *)srs_estimated_channel_freq[ant][p_index])[subcarrier].i, + srs_estimated_channel_freq[ant][p_index][subcarrier].r, + srs_estimated_channel_freq[ant][p_index][subcarrier].i, noise[base_idx + (k / K_TC)].r, noise[base_idx + (k / K_TC)].i); @@ -926,13 +926,13 @@ int nr_srs_channel_estimation( (int16_t *)srs_estimated_channel_freq[ant][p_index], (int16_t *)srs_estimated_channel_time[ant][p_index]); - memcpy(&srs_estimated_channel_time_shifted[ant][p_index][0], + memcpy(srs_estimated_channel_time_shifted[ant][p_index], &srs_estimated_channel_time[ant][p_index][gNB->frame_parms.ofdm_symbol_size >> 1], - (gNB->frame_parms.ofdm_symbol_size >> 1) * sizeof(int32_t)); + (gNB->frame_parms.ofdm_symbol_size >> 1) * sizeof(c16_t)); memcpy(&srs_estimated_channel_time_shifted[ant][p_index][gNB->frame_parms.ofdm_symbol_size >> 1], - &srs_estimated_channel_time[ant][p_index][0], - (gNB->frame_parms.ofdm_symbol_size >> 1) * sizeof(int32_t)); + srs_estimated_channel_time[ant][p_index], + (gNB->frame_parms.ofdm_symbol_size >> 1) * sizeof(c16_t)); } // for (int p_index = 0; p_index < N_ap; p_index++) } // for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h index d3db4f396a..483e1ea090 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h @@ -81,11 +81,11 @@ int nr_srs_channel_estimation( const nfapi_nr_srs_pdu_t *srs_pdu, const nr_srs_info_t *nr_srs_info, const c16_t **srs_generated_signal, - int32_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size * (1 << srs_pdu->num_symbols)], - int32_t srs_estimated_channel_freq[][1 << srs_pdu->num_ant_ports] - [gNB->frame_parms.ofdm_symbol_size * (1 << srs_pdu->num_symbols)], - int32_t srs_estimated_channel_time[][1 << srs_pdu->num_ant_ports][gNB->frame_parms.ofdm_symbol_size], - int32_t srs_estimated_channel_time_shifted[][1 << srs_pdu->num_ant_ports][gNB->frame_parms.ofdm_symbol_size], + c16_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size * (1 << srs_pdu->num_symbols)], + c16_t srs_estimated_channel_freq[][1 << srs_pdu->num_ant_ports] + [gNB->frame_parms.ofdm_symbol_size * (1 << srs_pdu->num_symbols)], + c16_t srs_estimated_channel_time[][1 << srs_pdu->num_ant_ports][gNB->frame_parms.ofdm_symbol_size], + c16_t srs_estimated_channel_time_shifted[][1 << srs_pdu->num_ant_ports][gNB->frame_parms.ofdm_symbol_size], int8_t *snr_per_rb, int8_t *snr); diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 2484c0e800..c415a26dfc 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -99,7 +99,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, int frame, int slot) * => size_output is a sum of parts sizes rounded up to a multiple of 64 */ size_t size_output_tb = rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * Qm * rel15->nrOfLayers; - size_output += (size_output_tb + 63 - ((size_output_tb + 63) % 64)); + size_output += ceil_mod(size_output_tb, 64); } unsigned char output[size_output] __attribute__((aligned(64))); @@ -220,7 +220,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, int frame, int slot) * => offset_output should remain a multiple of 64 with enough offset to fit each dlsch */ uint32_t size_output_tb = rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * Qm * rel15->nrOfLayers; - offset_output += (size_output_tb + 63) & ~63; + offset_output += ceil_mod(size_output_tb, 64); // Non interleaved VRB to PRB mapping uint16_t start_sc = frame_parms->first_carrier_offset + (rel15->rbStart+rel15->BWPStart)*NR_NB_SC_PER_RB; diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index 76955fd259..d64c32059c 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -304,7 +304,7 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB, * => dlsch_offset should remain a multiple of 64 with enough offset to fit each dlsch */ const size_t dlsch_size = rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * rel15->qamModOrder[0] * rel15->nrOfLayers; - dlsch_offset += (dlsch_size + 63 - ((dlsch_size + 63) % 64)); + dlsch_offset += ceil_mod(dlsch_size, 64); } gNB->nrLDPC_coding_interface.nrLDPC_coding_encoder(&slot_parameters); diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h index 397c0adf98..6dbf6e565d 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h +++ b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h @@ -303,7 +303,7 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB, slot_t slot, nfapi_nr_srs_pdu_t *srs_pdu, nr_srs_info_t *nr_srs_info, - int32_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size*(1<num_symbols)]); + c16_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size * (1 << srs_pdu->num_symbols)]); void init_prach_list(PHY_VARS_gNB *gNB); void init_prach_ru_list(RU_t *ru); diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c index 902a7bae02..c3b4f4dd75 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c @@ -1026,7 +1026,7 @@ static void inner_rx(PHY_VARS_gNB *gNB, int nb_layer = rel15_ul->nrOfLayers; int nb_rx_ant = frame_parms->nb_antennas_rx; int dmrs_symbol_flag = (rel15_ul->ul_dmrs_symb_pos >> symbol) & 0x01; - int buffer_length = ALIGN_UP_16(rel15_ul->rb_size * NR_NB_SC_PER_RB); + int buffer_length = ceil_mod(rel15_ul->rb_size * NR_NB_SC_PER_RB, 16); c16_t rxFext[nb_rx_ant][buffer_length] __attribute__((aligned(32))); c16_t chFext[nb_layer][nb_rx_ant][buffer_length] __attribute__((aligned(32))); @@ -1400,7 +1400,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, // extract the data in the OFDM frame, to the start of the array int soffset = (slot % RU_RX_SLOT_DEPTH) * frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size; - nb_re_pusch = ALIGN_UP_16(nb_re_pusch); + nb_re_pusch = ceil_mod(nb_re_pusch, 16); int dmrs_symbol; if (gNB->chest_time == 0) dmrs_symbol = get_valid_dmrs_idx_for_channel_est(rel15_ul->ul_dmrs_symb_pos, meas_symbol); @@ -1524,7 +1524,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, // buffer due to reference symbol extraction and padding. The gNBscopeCopy call is broken up into steps: trylock, copy, unlock. metadata mt = {.slot = slot, .frame = frame}; if (gNBTryLockScopeData(gNB, gNBPuschRxIq, sizeof(c16_t), 1, total_res, &mt)) { - int buffer_length = ALIGN_UP_16(rel15_ul->rb_size * NR_NB_SC_PER_RB); + int buffer_length = ceil_mod(rel15_ul->rb_size * NR_NB_SC_PER_RB, 16); size_t offset = 0; for (uint8_t symbol = rel15_ul->start_symbol_index; symbol < (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols); symbol++) { diff --git a/openair1/PHY/NR_TRANSPORT/srs_rx.c b/openair1/PHY/NR_TRANSPORT/srs_rx.c index ff9539edba..8ece090cc5 100644 --- a/openair1/PHY/NR_TRANSPORT/srs_rx.c +++ b/openair1/PHY/NR_TRANSPORT/srs_rx.c @@ -74,7 +74,7 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB, slot_t slot, nfapi_nr_srs_pdu_t *srs_pdu, nr_srs_info_t *nr_srs_info, - int32_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size * (1 << srs_pdu->num_symbols)]) + c16_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size * (1 << srs_pdu->num_symbols)]) { const NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms; @@ -91,9 +91,8 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB, c16_t *rx_signal; bool no_srs_signal = true; for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) { - - memset(srs_received_signal[ant], 0, frame_parms->ofdm_symbol_size*sizeof(int32_t)); - rx_signal = (int32_t *)&rxdataF[ant][symbol_offset]; + memset(srs_received_signal[ant], 0, frame_parms->ofdm_symbol_size * sizeof(c16_t)); + rx_signal = &rxdataF[ant][symbol_offset]; for (int p_index = 0; p_index < N_ap; p_index++) { @@ -129,10 +128,11 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB, if(subcarrier_log%12 == 0) { LOG_I(NR_PHY,"------------ %d ------------\n", subcarrier_log/12); } - LOG_I(NR_PHY,"(%i) \t%i\t%i\n", + LOG_I(NR_PHY, + "(%i) \t%i\t%i\n", subcarrier_log, - (int16_t)(srs_received_signal[ant][l_line_offset+subcarrier]&0xFFFF), - (int16_t)((srs_received_signal[ant][l_line_offset+subcarrier]>>16)&0xFFFF)); + srs_received_signal[ant][l_line_offset + subcarrier].r, + srs_received_signal[ant][l_line_offset + subcarrier].i); #endif // Subcarrier increment diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index bcb530a0bf..ba067201e9 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -918,10 +918,13 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, N NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms; nfapi_nr_srs_pdu_t *srs_pdu = &srs->srs_pdu; uint8_t N_symb_SRS = 1 << srs_pdu->num_symbols; - int32_t srs_received_signal[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size * N_symb_SRS]; - int32_t srs_estimated_channel_freq[frame_parms->nb_antennas_rx][1 << srs_pdu->num_ant_ports][frame_parms->ofdm_symbol_size * N_symb_SRS] __attribute__((aligned(32))); - int32_t srs_estimated_channel_time[frame_parms->nb_antennas_rx][1 << srs_pdu->num_ant_ports][frame_parms->ofdm_symbol_size] __attribute__((aligned(32))); - int32_t srs_estimated_channel_time_shifted[frame_parms->nb_antennas_rx][1 << srs_pdu->num_ant_ports][frame_parms->ofdm_symbol_size]; + c16_t srs_received_signal[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size * N_symb_SRS]; + c16_t srs_estimated_channel_freq[frame_parms->nb_antennas_rx][1 << srs_pdu->num_ant_ports] + [frame_parms->ofdm_symbol_size * N_symb_SRS] __attribute__((aligned(32))); + c16_t srs_estimated_channel_time[frame_parms->nb_antennas_rx][1 << srs_pdu->num_ant_ports][frame_parms->ofdm_symbol_size] + __attribute__((aligned(32))); + c16_t srs_estimated_channel_time_shifted[frame_parms->nb_antennas_rx][1 << srs_pdu->num_ant_ports] + [frame_parms->ofdm_symbol_size]; int8_t snr_per_rb[srs_pdu->bwp_size]; start_meas(&gNB->generate_srs_stats); diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c index 4b3a128211..b302faf3db 100644 --- a/openair1/SIMULATION/NR_PHY/dlschsim.c +++ b/openair1/SIMULATION/NR_PHY/dlschsim.c @@ -620,39 +620,6 @@ int main(int argc, char **argv) } } - /*LOG_M("txsigF0.m","txsF0", gNB->common_vars.txdataF[0],frame_length_complex_samples_no_prefix,1,1); - if (gNB->frame_parms.nb_antennas_tx>1) - LOG_M("txsigF1.m","txsF1", gNB->common_vars.txdataF[1],frame_length_complex_samples_no_prefix,1,1);*/ - - //TODO: loop over slots - /*for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { - if (gNB_config->subframe_config.dl_cyclic_prefix_type.value == 1) { - PHY_ofdm_mod(gNB->common_vars.txdataF[aa], - txdata[aa], - frame_parms->ofdm_symbol_size, - 12, - frame_parms->nb_prefix_samples, - CYCLIC_PREFIX); - } else { - nr_normal_prefix_mod(gNB->common_vars.txdataF[aa], - txdata[aa], - 14, - frame_parms); - } - } - - LOG_M("txsig0.m","txs0", txdata[0],frame_length_complex_samples,1,1); - if (gNB->frame_parms.nb_antennas_tx>1) - LOG_M("txsig1.m","txs1", txdata[1],frame_length_complex_samples,1,1); - - - for (i=0; inb_antennas_tx; aa++) { - r_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]); - r_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]); - } - }*/ - free_channel_desc_scm(gNB2UE); reset_DLSCH_struct(gNB, &msgDataTx); diff --git a/radio/fhi_72/oaioran.c b/radio/fhi_72/oaioran.c index 35c0356005..0d3b72f381 100644 --- a/radio/fhi_72/oaioran.c +++ b/radio/fhi_72/oaioran.c @@ -230,16 +230,12 @@ int read_prach_data(ru_info_t *ru, int frame, int slot) } } } else if (ru_conf->compMeth_PRACH == XRAN_COMPMETHOD_BLKFLOAT) { - struct xranlib_decompress_request bfp_decom_req; - struct xranlib_decompress_response bfp_decom_rsp; + struct xranlib_decompress_request bfp_decom_req = {}; + struct xranlib_decompress_response bfp_decom_rsp = {}; int16_t local_dst[12 * 2 * N_SC_PER_PRB] __attribute__((aligned(64))); int payload_len = (3 * ru_conf->iqWidth_PRACH + 1) * 12; // 12 = closest number of PRBs to 139 REs - - memset(&bfp_decom_req, 0, sizeof(struct xranlib_decompress_request)); - memset(&bfp_decom_rsp, 0, sizeof(struct xranlib_decompress_response)); - bfp_decom_req.data_in = (int8_t *)src; bfp_decom_req.numRBs = 12; // closest number of PRBs to 139 REs bfp_decom_req.len = payload_len; @@ -415,14 +411,10 @@ int xran_fh_rx_read_slot(ru_info_t *ru, int *frame, int *slot) memcpy((void *)dst2, (void *)local_dst, neg_len * 4); memcpy((void *)dst1, (void *)&local_dst[neg_len], pos_len * 4); } else if (pRbElm->compMethod == XRAN_COMPMETHOD_BLKFLOAT) { - struct xranlib_decompress_request bfp_decom_req; - struct xranlib_decompress_response bfp_decom_rsp; + struct xranlib_decompress_request bfp_decom_req = {}; + struct xranlib_decompress_response bfp_decom_rsp = {}; payload_len = (3 * pRbElm->iqWidth + 1) * pRbElm->nRBSize; - - memset(&bfp_decom_req, 0, sizeof(struct xranlib_decompress_request)); - memset(&bfp_decom_rsp, 0, sizeof(struct xranlib_decompress_response)); - bfp_decom_req.data_in = (int8_t *)src; bfp_decom_req.numRBs = pRbElm->nRBSize; bfp_decom_req.len = payload_len; @@ -556,12 +548,9 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp) for (idx = 0; idx < (pos_len + neg_len) * 2; idx++) ((uint16_t *)dst16)[idx] = htons(((uint16_t *)local_src)[idx]); } else if (p_prbMapElm->compMethod == XRAN_COMPMETHOD_BLKFLOAT) { - struct xranlib_compress_request bfp_com_req; - struct xranlib_compress_response bfp_com_rsp; + struct xranlib_compress_request bfp_com_req = {}; + struct xranlib_compress_response bfp_com_rsp = {}; payload_len = (3 * p_prbMapElm->iqWidth + 1) * p_prbMapElm->nRBSize; - memset(&bfp_com_req, 0, sizeof(struct xranlib_compress_request)); - memset(&bfp_com_rsp, 0, sizeof(struct xranlib_compress_response)); - bfp_com_req.data_in = (int16_t *)local_src; bfp_com_req.numRBs = p_prbMapElm->nRBSize; bfp_com_req.len = payload_len;