From 5905e61ca46b2fbfd4cf7185527c1d69bfc81b8c Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Thu, 13 Sep 2018 08:47:09 +0200 Subject: [PATCH] nr adding rate matching interleaving --- cmake_targets/CMakeLists.txt | 1 + openair1/PHY/CODING/coding_defs.h | 1 + openair1/PHY/CODING/nr_rate_matching.c | 244 +++++++++++++++++++++++++ openair1/PHY/NR_REFSIG/nr_dmrs_rx.c | 4 +- 4 files changed, 248 insertions(+), 2 deletions(-) create mode 100644 openair1/PHY/CODING/nr_rate_matching.c diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 06e121608b..981d5fb08c 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1179,6 +1179,7 @@ set(PHY_SRC_COMMON ${OPENAIR1_DIR}/PHY/CODING/lte_segmentation.c ${OPENAIR1_DIR}/PHY/CODING/nr_segmentation.c ${OPENAIR1_DIR}/PHY/CODING/nr_compute_tbs.c + ${OPENAIR1_DIR}/PHY/CODING/nr_rate_matching.c ${OPENAIR1_DIR}/PHY/CODING/ccoding_byte.c ${OPENAIR1_DIR}/PHY/CODING/ccoding_byte_lte.c ${OPENAIR1_DIR}/PHY/CODING/3gpplte_sse.c diff --git a/openair1/PHY/CODING/coding_defs.h b/openair1/PHY/CODING/coding_defs.h index 001f17dad7..a08462c03d 100644 --- a/openair1/PHY/CODING/coding_defs.h +++ b/openair1/PHY/CODING/coding_defs.h @@ -40,6 +40,7 @@ #define MAX_TURBO_ITERATIONS max_turbo_iterations #define LTE_NULL 2 +#define NR_NULL 2 /** @addtogroup _PHY_CODING_BLOCKS_ * @{ diff --git a/openair1/PHY/CODING/nr_rate_matching.c b/openair1/PHY/CODING/nr_rate_matching.c new file mode 100644 index 0000000000..591de90f86 --- /dev/null +++ b/openair1/PHY/CODING/nr_rate_matching.c @@ -0,0 +1,244 @@ +/* + * 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 + */ + +/* file: nr_rate_matching.c + purpose: Procedures for rate matching/interleaving for NR LDPC + author: hongzhi.wang@tcl.com +*/ + +#include "PHY/defs_gNB.h" +#include "PHY/defs_nr_UE.h" + +//#define RM_DEBUG 1 + +uint8_t index_k0[2][4] = {{0,17,33,56},{0,13,25,43}}; + + +void nr_interleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f) +{ + uint32_t EQm; + + EQm = E/Qm; + memset(f,0,E*sizeof(uint8_t)); + + for (int j = 0; j< EQm; j++){ + for (int i = 0; i< Qm; i++){ + f[(i+j*Qm)] = e[(i*EQm + j)]; + } + } + +} + + +void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f) +{ + + uint32_t EQm; + + EQm = E/Qm; + memset(f,0,E*sizeof(uint8_t)); + + for (int j = 0; j< EQm; j++){ + for (int i = 0; i< Qm; i++){ + e[(i*EQm + j)] = f[(i+j*Qm)]; + } + } +} + + +uint32_t nr_rate_matching_ldpc(uint8_t Ilbrm, + uint32_t Tbslbrm, + uint8_t BG, + uint16_t Z, + uint32_t G, + uint8_t *w, + uint8_t *e, + uint8_t C, + uint8_t rvidx, + uint8_t Qm, + uint8_t Nl, + uint8_t r) +{ + uint8_t Cprime; + uint32_t Ncb,E,ind,k,Nref,N; + uint8_t *e2; + + AssertFatal(Nl>0,"Nl is 0\n"); + AssertFatal(Qm>0,"Qm is 0\n"); + + //Bit selection + N = (BG==1)?(66*Z):(50*Z); + + if (Ilbrm == 0) + Ncb = N; + else { + Nref = 3*Tbslbrm/(2*C); //R_LBRM = 2/3 + Ncb = min(N, Nref); + } + +#ifdef RM_DEBUG + printf("nr_rate_matching: Ncb %d, rvidx %d, G %d, Qm %d, Nl%d, r %d\n",Ncb,rvidx, G, Qm,Nl,r); +#endif + + Cprime = C; //assume CBGTI not present + + printf("comp r %d\n", Cprime - ((G/(Nl*Qm))%Cprime) - 1); + + if (r <= Cprime - ((G/(Nl*Qm))%Cprime) - 1) + E = Nl*Qm*(G/(Nl*Qm*Cprime)); + else + E = Nl*Qm*((G/(Nl*Qm*Cprime))+1); + + ind = (index_k0[BG-1][rvidx]*Ncb/N)*Z; + +#ifdef RM_DEBUG + printf("nr_rate_matching: E %d, k0 %d \n",E,ind); +#endif + + e2 = e; + + k=0; + + for (; (ind0,"Nl is 0\n"); + AssertFatal(Qm>0,"Qm is 0\n"); + + //Bit selection + N = (BG==1)?(66*Z):(50*Z); + + if (Ilbrm == 0) + Ncb = N; + else { + Nref = (3*Tbslbrm/(2*C)); //R_LBRM = 2/3 + Ncb = min(N, Nref); + } + + Cprime = C; //assume CBGTI not present + + if (r <= Cprime - ((G/(Nl*Qm))%Cprime) - 1) + E = Nl*Qm*(G/(Nl*Qm*Cprime)); + else + E = Nl*Qm*((G/(Nl*Qm*Cprime))+1); + + ind = (index_k0[BG-1][rvidx]*Ncb/N)*Z; + +#ifdef RM_DEBUG + printf("nr_rate_matching_ldpc_rx: Clear %d, E %d, Ncb %d,rvidx %d, G %d, Qm %d, Nl%d, r %d\n",clear,E,Ncb,rvidx, G, Qm,Nl,r); +#endif + + if (clear==1) + memset(w,0,Ncb*sizeof(int16_t)); + + soft_input2 = soft_input; + k=0; + + for (; (ind