diff --git a/openair1/PHY/NR_REFSIG/dmrs_nr.h b/openair1/PHY/NR_REFSIG/dmrs_nr.h new file mode 100644 index 0000000000000000000000000000000000000000..a695006304762b3eee95e0d644ce2cb5b7d683e0 --- /dev/null +++ b/openair1/PHY/NR_REFSIG/dmrs_nr.h @@ -0,0 +1,62 @@ +/* + * 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 + */ + +/********************************************************************** +* +* FILENAME : dmrs.h +* +* MODULE : demodulation reference signals +* +* DESCRIPTION : generation of dmrs sequences for NR 5G +* 3GPP TS 38.211 +* +************************************************************************/ + +#ifndef DMRS_NR_H +#define DMRS_NR_H + +#include "PHY/defs_nr_UE.h" +#include "PHY/types.h" +#include "PHY/NR_REFSIG/ss_pbch_nr.h" +#include "PHY/NR_REFSIG/pss_nr.h" +#include "PHY/NR_REFSIG/sss_nr.h" + +/************** CODE GENERATION ***********************************/ + +/************** DEFINE ********************************************/ + + +/************* STRUCTURES *****************************************/ + + +/************** VARIABLES *****************************************/ + +/************** FUNCTION ******************************************/ + +int pseudo_random_sequence(int M_PN, uint32_t *c, uint32_t cinit); +void lte_gold_new(LTE_DL_FRAME_PARMS *frame_parms, uint32_t lte_gold_table[20][2][14], uint16_t Nid_cell); +void generate_dmrs_pbch(uint32_t dmrs_pbch_bitmap[DMRS_PBCH_I_SSB][DMRS_PBCH_N_HF][DMRS_BITMAP_SIZE], uint16_t Nid_cell); + +#undef EXTERN + +#endif /* DMRS_NR_H */ + + diff --git a/openair1/PHY/NR_REFSIG/pss_nr.h b/openair1/PHY/NR_REFSIG/pss_nr.h new file mode 100644 index 0000000000000000000000000000000000000000..c171cf501bdf64257c03df398f023dcacf798f92 --- /dev/null +++ b/openair1/PHY/NR_REFSIG/pss_nr.h @@ -0,0 +1,142 @@ +/* + * 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 + */ + +/********************************************************************** +* +* FILENAME : pss_nr.h +* +* MODULE : primary synchronisation signal +* +* DESCRIPTION : elements related to pss +* +************************************************************************/ + +#ifndef PSS_NR_H +#define PSS_NR_H + +#include "PHY/defs_nr_UE.h" +#include "PHY/types.h" + +#include "PHY/NR_REFSIG/ss_pbch_nr.h" + +#ifdef DEFINE_VARIABLES_PSS_NR_H +#define EXTERN +#else +#define EXTERN extern +#endif + +/************** CODE GENERATION ***********************************/ + +//#define PSS_DECIMATOR /* decimation of sample is done between time correlation */ + +//#define CIC_DECIMATOR /* it allows enabling decimation based on CIC filter. By default, decimation is based on a FIF filter */ + +#define TEST_SYNCHRO_TIMING_PSS (1) /* enable time profiling */ + +//#define DBG_PSS_NR + +/************** DEFINE ********************************************/ + +/* PROFILING */ +#define TIME_PSS (0) +#define TIME_RATE_CHANGE (TIME_PSS+1) +#define TIME_SSS (TIME_RATE_CHANGE+1) +#define TIME_LAST (TIME_SSS+1) + +/* PSS configuration */ + +#define SYNCHRO_FFT_SIZE_MAX (2048) /* maximum size of fft for synchronisation */ + +#define NO_RATE_CHANGE (1) + +#ifdef PSS_DECIMATOR + #define RATE_CHANGE (SYNCHRO_FFT_SIZE_MAX/SYNCHRO_FFT_SIZE_PSS) + #define SYNCHRO_FFT_SIZE_PSS (256) + #define OFDM_SYMBOL_SIZE_PSS (SYNCHRO_FFT_SIZE_PSS) + #define SYNCHRO_RATE_CHANGE_FACTOR (SYNCHRO_FFT_SIZE_MAX/SYNCHRO_FFT_SIZE_PSS) + #define CIC_FILTER_STAGE_NUMBER (4) +#else + #define RATE_CHANGE (1) + #define SYNCHRO_RATE_CHANGE_FACTOR (1) +#endif + +#define SYNC_TMP_SIZE (NB_ANTENNAS_RX*SYNCHRO_FFT_SIZE_MAX*IQ_SIZE) /* to be aligned with existing lte synchro */ +#define SYNCF_TMP_SIZE (SYNCHRO_FFT_SIZE_MAX*IQ_SIZE) + +/************* STRUCTURES *****************************************/ + + +/************** VARIABLES *****************************************/ + +//#define STATIC_SYNC_BUFFER + +#ifdef STATIC_SYNC_BUFFER +/* buffer defined in file lte_sync_time */ +EXTERN int16_t synchro_tmp[SYNC_TMP_SIZE] __attribute__((aligned(32))); +EXTERN int16_t synchroF_tmp[SYNCF_TMP_SIZE] __attribute__((aligned(32))); +#else +EXTERN int16_t *synchro_tmp; +EXTERN int16_t *synchroF_tmp; +#endif + +EXTERN int16_t *primary_synchro_nr[NUMBER_PSS_SEQUENCE] +#ifdef INIT_VARIABLES_PSS_NR_H += { NULL, NULL, NULL} +#endif +; +EXTERN int16_t *primary_synchro_time_nr[NUMBER_PSS_SEQUENCE] +#ifdef INIT_VARIABLES_PSS_NR_H += { NULL, NULL, NULL} +#endif +; + +EXTERN int *pss_corr_ue[NUMBER_PSS_SEQUENCE] +#ifdef INIT_VARIABLES_PSS_NR_H += { NULL, NULL, NULL} +#endif +; + +/* profiling structure */ +EXTERN double cpuf; +time_stats_t generic_time[TIME_LAST]; + +#ifndef DEFINE_HEADER_ONLY + +/************** FUNCTION ******************************************/ + +void *get_idft(int ofdm_symbol_size); +void *get_dft(int ofdm_symbol_size); +void init_context_synchro_nr(NR_DL_FRAME_PARMS *frame_parms_ue); +void free_context_synchro_nr(void); +void init_context_pss_nr(NR_DL_FRAME_PARMS *frame_parms_ue); +void free_context_pss_nr(void); +int set_pss_nr(int ofdm_symbol_size); +int pss_synchro_nr(PHY_VARS_NR_UE *PHY_vars_UE, int rate_change); +int pss_search_time_nr(int **rxdata, ///rx data in time domain + NR_DL_FRAME_PARMS *frame_parms, + int *eNB_id); + +#endif +#undef EXTERN + +#endif /* PSS_NR_H */ + + diff --git a/openair1/PHY/NR_REFSIG/ss_pbch_nr.h b/openair1/PHY/NR_REFSIG/ss_pbch_nr.h new file mode 100644 index 0000000000000000000000000000000000000000..e230d8035b86d49120f0812cd62cb6c0ef2027be --- /dev/null +++ b/openair1/PHY/NR_REFSIG/ss_pbch_nr.h @@ -0,0 +1,81 @@ +/* + * 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 + */ + +/********************************************************************** +* +* FILENAME : ss_pbch_nr.h +* +* MODULE : this file contains define only +* +* DESCRIPTION : define elements related to SS/PBCH block ie synchronisation (pss/sss) and pbch +* +* see TS 38.211 7.4.2 Synchronisation Signals +* see TS 38.213 4 Synchronisation procedures +* +************************************************************************/ + +#ifndef SS_PBCH_NR_H +#define SS_PBCH_NR_H + +/************** DEFINE ********************************************/ + +#define VOID_PARAMETER (void) /* avoid a compiler warning for unused parameters of function */ + +/* PSS parameters */ +#define NUMBER_PSS_SEQUENCE (3) +#define INVALID_PSS_SEQUENCE (NUMBER_PSS_SEQUENCE) +#define LENGTH_PSS_NR (127) +#define N_SC_RB (12) /* Resource block size in frequency domain expressed as a number if subcarriers */ +#define SCALING_PSS_NR (3) +#define SCALING_CE_PSS_NR (13) /* scaling channel estimation based on ps */ +#define PSS_IFFT_SIZE (256) + +#define PSS_SC_START_NR (52) /* see from TS 38.211 table 7.4.3.1-1: Resources within an SS/PBCH block for PSS... */ + +/* define ofdm symbol offset in the SS/PBCH block of NR synchronisation */ +#define PSS_SYMBOL_NB (0) /* symbol numbers for each element */ +#define PBCH_SYMBOL_NB (1) +#define SSS_SYMBOL_NB (2) +#define PBCH_LAST_SYMBOL_NB (3) + +/* SS/PBCH parameters */ +#define N_RB_SS_PBCH_BLOCK (20) +#define NB_SYMBOLS_PBCH (3) + +#define IQ_SIZE (sizeof(int16_t) * 2) /* I and Q are alternatively stored into buffers */ +#define N_SYMB_SLOT (14) + +/* SS/PBCH parameters : see from TS 38.211 table 7.4.3.1-1: Resources within an SS/PBCH block for PSS... */ +#define DMRS_PBCH_PER_RB (N_SC_RB >> 4) /* at 0+v, 4+v, 8+v for a resource block with v = NcellID modulo 4 */ +#define DMRS_END_FIRST_PART (44) +#define DMRS_START_SECOND_PART (192) +#define DMRS_END_SECOND_PART (236) +#define DMRS_PBCH_NUMBER (NB_SYMBOLS_PBCH*(N_RB_SS_PBCH_BLOCK * DMRS_PBCH_PER_RB)) /* there are both PBCH and SSS/(Set to 0) at the second OFDM symbol of SS/PBCH so size is increased */ + +/* see TS 38211 7.4.1.4 Demodulation reference signals for PBCH */ +#define DMRS_PBCH_I_SSB (8) /* maximum index value for SSB/PBCH which can have alength of L=4 or L=8 */ +#define DMRS_PBCH_N_HF (2) /* half frame indication - 0 for first part of frame and 1 for second part of frame */ +#define DMRS_ALIGNMENT_32_BIT (20) /* it is just for ensuring a 32 bits alignment for storing dmrs pbch into a 32 bits map */ +#define DMRS_BITMAP_SIZE ((DMRS_PBCH_NUMBER-DMRS_ALIGNMENT_32_BIT)/32) /* size is divided by 32 (to get bitmap on uint32) DMRS_PBCH_NUMBER should be a multiple of 32 */ + +#endif /* SS_PBCH_NR_H */ + + diff --git a/openair1/PHY/NR_REFSIG/sss_nr.h b/openair1/PHY/NR_REFSIG/sss_nr.h new file mode 100644 index 0000000000000000000000000000000000000000..fb16bb1ca4d430191e6d99983774174af3cfb403 --- /dev/null +++ b/openair1/PHY/NR_REFSIG/sss_nr.h @@ -0,0 +1,107 @@ +/* + * 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.0 (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 + */ + +/*********************************************************************** +* +* FILENAME : sss_nr.h +* +* MODULE : Secondary synchronisation signal +* +* DESCRIPTION : variables related to sss +* +************************************************************************/ + +#ifndef SSS_NR_H +#define SSS_NR_H + +#include "PHY/defs_nr_UE.h" +#include "PHY/types.h" + +#include "pss_nr.h" + +#ifdef DEFINE_VARIABLES_SSS_NR_H +#define EXTERN +#define INIT_VARIABLES_SSS_NR_H +#else +#define EXTERN extern +#endif + +/************** DEFINE ********************************************/ + +#define INT_MIN (-2147483647 - 1) +#define SAMPLES_IQ (sizeof(int16_t)*2) +#define NUMBER_SSS_SEQUENCE (336) +#define INVALID_SSS_SEQUENCE (NUMBER_SSS_SEQUENCE) +#define LENGTH_SSS_NR (127) +#define SCALING_METRIC_SSS_NR (19) + +#define N_ID_2_NUMBER (NUMBER_PSS_SEQUENCE) +#define N_ID_1_NUMBER (NUMBER_SSS_SEQUENCE) + +#define GET_NID2(Nid_cell) (Nid_cell%3) +#define GET_NID1(Nid_cell) (Nid_cell/3) + +#define PSS_SC_START_NR (52) /* see from TS 38.211 table 7.4.3.1-1: Resources within an SS/PBCH block for PSS... */ + +/************** VARIABLES *****************************************/ + +#define PHASE_HYPOTHESIS_NUMBER (7) +#define INDEX_NO_PHASE_DIFFERENCE (3) /* this is for no phase shift case */ + +EXTERN const int16_t phase_re_nr[PHASE_HYPOTHESIS_NUMBER] +#ifdef INIT_VARIABLES_SSS_NR_H += {16383, 25101, 30791, 32767, 30791, 25101, 16383} +#endif +; + +EXTERN const int16_t phase_im_nr[PHASE_HYPOTHESIS_NUMBER] +#ifdef INIT_VARIABLES_SSS_NR_H += {-28378, -21063, -11208, 0, 11207, 21062, 28377}; +#endif +; + +EXTERN int16_t d_sss[N_ID_2_NUMBER][N_ID_1_NUMBER][LENGTH_SSS_NR]; + +/************** FUNCTION ******************************************/ + +void init_context_sss_nr(int amp); +void free_context_sss_nr(void); + +void insert_sss_nr(int16_t *sss_time, + NR_DL_FRAME_PARMS *frame_parms); + +int pss_ch_est_nr(PHY_VARS_NR_UE *ue, + int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR], + int32_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR]); + +int _do_pss_sss_extract_nr(PHY_VARS_NR_UE *ue, + int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR], + int32_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR], + uint8_t doPss, uint8_t doSss, + uint8_t subframe); + +int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric, uint8_t *phase_max); + +#undef INIT_VARIABLES_SSS_NR_H +#undef EXTERN + +#endif /* SSS_NR_H */ +