diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 87afa0450c4c3138e97bc31388b049332a75f88d..b4e2090dcd755bdaad1e4bb9a9fec10baef1d757 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1061,11 +1061,35 @@ set(PHY_LDPCSRC ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_encoder/ldpc_generate_coefficient.c ) +set(PHY_POLARSRC + ${OPENAIR1_DIR}/PHY/CODING/nrPolar_init.c + ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/get_3GPP_info_bit_pattern.c + ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/get_crc_generator_matrix.c + ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/get_PC_bit_pattern.c + ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_bitwise_operations.c + ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_crc_byte.c + ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_bit_insertion_2.c + ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_bit_insertion.c + ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_channel_interleaver_pattern.c + ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_crc.c + ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c + ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_info_bit_pattern.c + ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_interleave.c + ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_kernal_operation.c + ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_kronecker_power_matrices.c + ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_matrix_and_array.c + ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_output_length.c + ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_rate_match.c + ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_sequence_pattern.c + ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_encoder.c + ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_decoder.c +) set(PHY_TURBOIF ${OPENAIR1_DIR}/PHY/CODING/coding_load.c ) add_library(coding MODULE ${PHY_TURBOSRC} ) + set(PHY_SRC_COMMON # depend on code generation from asn1c ${RRC_FULL_DIR}/asn1_constants.h @@ -1214,6 +1238,7 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/TOOLS/sqrt.c ${OPENAIR1_DIR}/PHY/TOOLS/time_meas.c ${OPENAIR1_DIR}/PHY/TOOLS/lut.c + ${PHY_POLARSRC} ) set(PHY_NR_UE_SRC diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c b/openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c index abe918bc3f386d76bf943657e8f717e5422686b6..1d3fa5ebf4414aedbebec18c764b95d13baf8f31 100644 --- a/openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c +++ b/openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c @@ -1,108 +1,16 @@ #include "PHY/CODING/nrPolar_tools/nr_polar_defs.h" -/*ref 38-212 v15.0.0, pp 8-9 */ -/* the highest degree is set by default */ -unsigned int poly24a = 0x864cfb00; // 1000 0110 0100 1100 1111 1011 D^24 + D^23 + D^18 + D^17 + D^14 + D^11 + D^10 + D^7 + D^6 + D^5 + D^4 + D^3 + D + 1 -unsigned int poly24b = 0x80006300; // 1000 0000 0000 0000 0110 0011 D^24 + D^23 + D^6 + D^5 + D + 1 -unsigned int poly24c = 0xb2b11700; // 1011 0010 1011 0001 0001 0111 D^24 + D^23 + D^21 + D^20 + D^17 + D^15 + D^13 + D^12 + D^8 + D^4 + D^2 + D + 1 -unsigned int poly16 = 0x10210000; // 0001 0000 0010 0001 D^16 + D^12 + D^5 + 1 -unsigned int poly11 = 0xe2100000; // 1110 0010 0001 D^11 + D^10 + D^9 + D^5 + 1 -unsigned int poly6 = 0x61000000; // 0110 0001 D^6 + D^5 + 1 -/********************************************************* - -For initialization && verification purposes, - bit by bit implementation with any polynomial - -The first bit is in the MSB of each byte - -*********************************************************/ -unsigned int crcbit (unsigned char * inputptr, int octetlen, unsigned int poly) -{ - unsigned int i, crc = 0, c; - - while (octetlen-- > 0) { - c = (*inputptr++) << 24; - for (i = 8; i != 0; i--) { - if ((1 << 31) & (c ^ crc)) - crc = (crc << 1) ^ poly; - else - crc <<= 1; - - c <<= 1; - } - } - - return crc; -} /********************************************************* crc table initialization *********************************************************/ -static unsigned int crc24aTable[256]; -static unsigned int crc24bTable[256]; -static unsigned int crc24cTable[256]; -static unsigned short crc16Table[256]; +/*static unsigned int crc24cTable[256]; static unsigned short crc11Table[256]; static unsigned char crc6Table[256]; -void crcTableInit (void) -{ - unsigned char c = 0; - - do { - crc24aTable[c] = crcbit (&c, 1, poly24a); - crc24bTable[c] = crcbit (&c, 1, poly24b); - crc24cTable[c] = crcbit (&c, 1, poly24c); - crc16Table[c] = (unsigned short) (crcbit (&c, 1, poly16) >> 16); - crc11Table[c] = (unsigned short) (crcbit (&c, 1, poly11) >> 16); - crc6Table[c] = (unsigned char) (crcbit (&c, 1, poly6) >> 24); - } while (++c); -} -/********************************************************* - -Byte by byte implementations, -assuming initial byte is 0 padded (in MSB) if necessary - -*********************************************************/ -unsigned int crc24a (unsigned char * inptr, int bitlen) -{ - - int octetlen, resbit; - unsigned int crc = 0; - octetlen = bitlen / 8; /* Change in octets */ - resbit = (bitlen % 8); - - while (octetlen-- > 0) { - // printf("in %x => crc %x\n",crc,*inptr); - crc = (crc << 8) ^ crc24aTable[(*inptr++) ^ (crc >> 24)]; - } - - if (resbit > 0) - crc = (crc << resbit) ^ crc24aTable[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))]; - - return crc; -} - -unsigned int crc24b (unsigned char * inptr, int bitlen) -{ - - int octetlen, resbit; - unsigned int crc = 0; - octetlen = bitlen / 8; - resbit = (bitlen % 8); - - while (octetlen-- > 0) { - crc = (crc << 8) ^ crc24bTable[(*inptr++) ^ (crc >> 24)]; - } - - if (resbit > 0) - crc = (crc << resbit) ^ crc24bTable[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))]; - - return crc; -} unsigned int crc24c (unsigned char * inptr, int bitlen) { @@ -122,29 +30,13 @@ unsigned int crc24c (unsigned char * inptr, int bitlen) return crc; } -unsigned int crc16 (unsigned char * inptr, int bitlen) -{ - int octetlen, resbit; - unsigned int crc = 0; - octetlen = bitlen / 8; /* Change in octets */ - resbit = (bitlen % 8); - while (octetlen-- > 0) { - - crc = (crc << 8) ^ (crc16Table[(*inptr++) ^ (crc >> 24)] << 16); - } - - if (resbit > 0) - crc = (crc << resbit) ^ (crc16Table[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))] << 16); - - return crc; -} unsigned int crc11 (unsigned char * inptr, int bitlen) { int octetlen, resbit; unsigned int crc = 0; - octetlen = bitlen / 8; /* Change in octets */ + octetlen = bitlen / 8; // Change in octets resbit = (bitlen % 8); while (octetlen-- > 0) { @@ -161,7 +53,7 @@ unsigned int crc6 (unsigned char * inptr, int bitlen) { int octetlen, resbit; unsigned int crc = 0; - octetlen = bitlen / 8; /* Change in octets */ + octetlen = bitlen / 8; // Change in octets resbit = (bitlen % 8); while (octetlen-- > 0) { @@ -237,7 +129,7 @@ uint8_t check_crc(uint8_t *decoded_bytes, uint16_t len, uint8_t crc_type) printf("old CRC %x, CRC %x \n",oldcrc,crc); return (crc == oldcrc); -} +}*/ uint8_t **crc24c_generator_matrix(uint16_t payloadSizeBits){ diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 920939654fef0af26d162e045aade91aed61dd26..00e1f678732b5074ff4798c423532a6f97674a1d 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -23,6 +23,7 @@ #include "SCHED/sched_eNB.h" #include "PHY/phy_extern.h" #include "PHY/INIT/phy_init.h" +#include "PHY/CODING/nrPolar_tools/nr_polar_pbch_defs.h" #include "RadioResourceConfigCommonSIB.h" #include "RadioResourceConfigDedicated.h" #include "TDD-Config.h" @@ -112,7 +113,11 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, );*/ LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_gNB][MOD %02"PRIu8"][]\n", gNB->Mod_id); + // PBCH DMRS gold sequences generation nr_init_pbch_dmrs(gNB); + // Polar encoder init for PBCH + nr_polar_init(&fp->pbch_polar_params, 1); + /* lte_gold(fp,gNB->lte_gold_table,fp->Nid_cell); generate_pcfich_reg_mapping(fp); diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index e25fdf8768dee0b29ed121f881f838fac9a91c84..65168dfb8c368cf4bbf98f4616e24290661b1965 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -34,6 +34,7 @@ #define __PHY_DEFS_NR_COMMON__H__ #include "defs_common.h" +#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h" #define nr_subframe_t lte_subframe_t @@ -110,7 +111,10 @@ typedef struct NR_DL_FRAME_PARMS { //SSB related params /// Start in Subcarrier index of the SSB block uint16_t ssb_start_subcarrier; + /// SSB type nr_ssb_type_e ssb_type; + /// PBCH polar encoder params + t_nrPolar_params pbch_polar_params; } NR_DL_FRAME_PARMS;