diff --git a/ci-scripts/oai-ci-vm-tool b/ci-scripts/oai-ci-vm-tool
index ed43e26729..3d9fb87cba 100755
--- a/ci-scripts/oai-ci-vm-tool
+++ b/ci-scripts/oai-ci-vm-tool
@@ -252,7 +252,7 @@ case $key in
VM_NAME=ci-phy-sim
ARCHIVES_LOC=phy_sim
LOG_PATTERN=.Rel15.txt
- NB_PATTERN_FILES=9
+ NB_PATTERN_FILES=10
BUILD_OPTIONS="--phy_simulators"
VM_MEMORY=8192
RUN_OPTIONS="./run_exec_autotests.bash -g \"01510*\" -q -np -b"
@@ -331,7 +331,7 @@ case $key in
VM_NAME=ci-phy-sim
ARCHIVES_LOC=phy_sim
LOG_PATTERN=.Rel15.txt
- NB_PATTERN_FILES=9
+ NB_PATTERN_FILES=10
BUILD_OPTIONS="--phy_simulators"
VM_MEMORY=8192
RUN_OPTIONS="./run_exec_autotests.bash -g \"01510*\" -q -np -b"
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index cb9c181a94..d5c5c10d64 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -1116,15 +1116,19 @@ set(PHY_POLARSRC
${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_procedures.c
${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_sequence_pattern.c
)
+set(PHY_SMALLBLOCKSRC
+ ${OPENAIR1_DIR}/PHY/CODING/nrSmallBlock/encodeSmallBlock.c
+ ${OPENAIR1_DIR}/PHY/CODING/nrSmallBlock/decodeSmallBlock.c
+)
set(PHY_TURBOIF
${OPENAIR1_DIR}/PHY/CODING/coding_load.c
- )
+)
set(PHY_LDPCSRC
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_encoder/ldpc_encoder.c
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_encoder/ldpc_generate_coefficient.c
- )
+)
add_library(coding MODULE ${PHY_TURBOSRC} )
set(PHY_SRC_COMMON
@@ -1290,6 +1294,7 @@ set(PHY_SRC_UE
${OPENAIR1_DIR}/PHY/TOOLS/time_meas.c
${OPENAIR1_DIR}/PHY/TOOLS/lut.c
${PHY_POLARSRC}
+ ${PHY_SMALLBLOCKSRC}
${PHY_LDPCSRC}
)
@@ -1334,6 +1339,7 @@ set(PHY_SRC_UE
${OPENAIR1_DIR}/PHY/INIT/nr_init_ue.c
# ${OPENAIR1_DIR}/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c
${PHY_POLARSRC}
+ ${PHY_SMALLBLOCKSRC}
${PHY_LDPCSRC}
)
@@ -2513,6 +2519,12 @@ add_executable(polartest
${OPENAIR_DIR}/common/utils/backtrace.c)
target_link_libraries(polartest SIMU PHY PHY_NR PHY_COMMON m ${ATLAS_LIBRARIES})
+
+add_executable(smallblocktest
+ ${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/smallblocktest.c
+ ${OPENAIR_DIR}/common/utils/backtrace.c)
+target_link_libraries(smallblocktest SIMU PHY PHY_NR PHY_COMMON m ${ATLAS_LIBRARIES})
+
add_executable(ldpctest
${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/ldpctest.c
${OPENAIR_DIR}/common/utils/backtrace.c)
diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml
index 5003125967..792e46cec6 100644
--- a/cmake_targets/autotests/test_case_list.xml
+++ b/cmake_targets/autotests/test_case_list.xml
@@ -1116,8 +1116,31 @@
segmentation fault|assertion|exiting|fatal
3
-
+
+ execution
+ shortblocktest Test cases. (Test1: 3 bits),
+ (Test2: 6 bits),
+ (Test3: 7 bits),
+ (Test4: 11 bits)
+
+ $OPENAIR_DIR/cmake_targets/build_oai
+ --phy_simulators -c
+ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash
+
+ $OPENAIR_DIR/targets/bin/smallblocktest.Rel15
+ -l 3 -s -4 -d 1 -i 10000
+ -l 6 -s -4 -d 1 -i 10000
+ -l 7 -s -4 -d 1 -i 10000
+ -l 11 -s -4 -d 1 -i 10000
+ smallblocktest.test1 smallblocktest.test2 smallblocktest.test3 smallblocktest.test4
+ BLER= 0.000000
+ segmentation fault|assertion|exiting|fatal
+ 3
+
+
+
+
execution
nr_ulschsim Test cases. (Test1: 106 PRB),
(Test2: 217 PRB),
diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index ba7fdc6cb0..e99d84a134 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -80,8 +80,6 @@ function print_help() {
This program installs OpenAirInterface Software
You should have ubuntu 16.xx or 18.04 updated
Options
--h
- This help
-c | --clean
Erase all files to make a rebuild from start
-C | --clean-all
@@ -686,7 +684,7 @@ function main() {
echo_info "Compiling unitary tests simulators"
# TODO: fix: dlsim_tm4 pucchsim prachsim pdcchsim pbchsim mbmssim
#simlist="dlsim_tm4 dlsim ulsim pucchsim prachsim pdcchsim pbchsim mbmssim"
- simlist="dlsim ulsim polartest ldpctest nr_pbchsim nr_dlschsim nr_dlsim nr_ulschsim"
+ simlist="dlsim ulsim polartest ldpctest smallblocktest nr_pbchsim nr_dlschsim nr_dlsim nr_ulschsim"
for f in $simlist ; do
compilations \
phy_simulators $f \
diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper
index 8c5d33975c..1c4b291069 100755
--- a/cmake_targets/tools/build_helper
+++ b/cmake_targets/tools/build_helper
@@ -683,7 +683,7 @@ install_asn1c_from_source(){
# better to use a given commit than a branch in case the branch
# is updated and requires modifications in the source of OAI
#git checkout velichkov_s1ap_plus_option_group
- git checkout d3aed06bb2bec7df1b5c6d0333f8c7dfc5993372
+ git checkout f12568d617dbf48497588f8e227d70388fa217c9
autoreconf -iv
./configure
make -j`nproc`
diff --git a/common/utils/LOG/log.h b/common/utils/LOG/log.h
index 8390c3af25..b8a72ece7b 100644
--- a/common/utils/LOG/log.h
+++ b/common/utils/LOG/log.h
@@ -83,11 +83,11 @@ extern "C" {
* @brief LOG defines 9 levels of messages for users. Importance of these levels decrease gradually from 0 to 8
* @{*/
# define OAILOG_DISABLE -1 /*!< \brief disable all LOG messages, cannot be used in LOG macros, use only in LOG module */
-# define OAILOG_ERR 0 /*!< \brief critical error conditions, impact on "must have" fuctinalities */
+# define OAILOG_ERR 0 /*!< \brief critical error conditions, impact on "must have" functionalities */
# define OAILOG_WARNING 1 /*!< \brief warning conditions, shouldn't happen but doesn't impact "must have" functionalities */
# define OAILOG_INFO 2 /*!< \brief informational messages most people don't need, shouldn't impact real-time behavior */
-# define OAILOG_DEBUG 3 /*!< \brief first level debug-level messages, for developers , may impact real-time behavior */
-# define OAILOG_TRACE 4 /*!< \brief second level debug-level messages, for developers ,likely impact real-time behavior*/
+# define OAILOG_DEBUG 3 /*!< \brief first level debug-level messages, for developers, may impact real-time behavior */
+# define OAILOG_TRACE 4 /*!< \brief second level debug-level messages, for developers, likely impact real-time behavior*/
#define NUM_LOG_LEVEL 5 /*!< \brief the number of message levels users have with LOG (OAILOG_DISABLE is not available to user as a level, so it is not included)*/
/* @}*/
diff --git a/openair1/PHY/CODING/TESTBENCH/polartest.c b/openair1/PHY/CODING/TESTBENCH/polartest.c
index 1b46cab3c1..76cde6c3be 100644
--- a/openair1/PHY/CODING/TESTBENCH/polartest.c
+++ b/openair1/PHY/CODING/TESTBENCH/polartest.c
@@ -11,116 +11,137 @@
#include "PHY/CODING/nrPolar_tools/nr_polar_uci_defs.h"
#include "PHY/CODING/coding_defs.h"
#include "SIMULATION/TOOLS/sim.h"
+//#include "PHY/NR_TRANSPORT/nr_transport.h"
+//#include "common/utils/LOG/log.h"
//#define DEBUG_DCI_POLAR_PARAMS
//#define DEBUG_POLAR_TIMING
-//#define DEBUG_CRC
+//#define DEBUG_POLARTEST
int main(int argc, char *argv[]) {
- //Initiate timing. (Results depend on CPU Frequency. Therefore, might change due to performance variances during simulation.)
- time_stats_t timeEncoder,timeDecoder;
- opp_enabled=1;
- int decoder_int16=0;
- cpu_freq_GHz = get_cpu_freq_GHz();
- reset_meas(&timeEncoder);
- reset_meas(&timeDecoder);
- randominit(0);
- crcTableInit();
//Default simulation values (Aim for iterations = 1000000.)
+ int decoder_int16=0;
int itr, iterations = 1000, arguments, polarMessageType = 0; //0=PBCH, 1=DCI, -1=UCI
double SNRstart = -20.0, SNRstop = 0.0, SNRinc= 0.5; //dB
double SNR, SNR_lin;
int16_t nBitError = 0; // -1 = Decoding failed (All list entries have failed the CRC checks).
uint32_t decoderState=0, blockErrorState=0; //0 = Success, -1 = Decoding failed, 1 = Block Error.
- uint16_t testLength = 0, coderLength = 0, blockErrorCumulative=0, bitErrorCumulative=0;
+ uint16_t testLength = NR_POLAR_PBCH_PAYLOAD_BITS, coderLength = NR_POLAR_PBCH_E;
+ uint16_t blockErrorCumulative=0, bitErrorCumulative=0;
double timeEncoderCumulative = 0, timeDecoderCumulative = 0;
- uint8_t aggregation_level = 8, decoderListSize = 8, pathMetricAppr = 0;
+ uint8_t aggregation_level = 8, decoderListSize = 8, logFlag = 0;
+ uint16_t rnti=0;
- while ((arguments = getopt (argc, argv, "s:d:f:m:i:l:a:hqg")) != -1)
+ while ((arguments = getopt (argc, argv, "s:d:f:m:i:l:a:p:hqgFL:k:")) != -1)
switch (arguments) {
- case 's':
- SNRstart = atof(optarg);
- break;
+ case 's':
+ SNRstart = atof(optarg);
+ break;
- case 'd':
- SNRinc = atof(optarg);
- break;
+ case 'd':
+ SNRinc = atof(optarg);
+ break;
- case 'f':
- SNRstop = atof(optarg);
- break;
+ case 'f':
+ SNRstop = atof(optarg);
+ break;
- case 'm':
- polarMessageType = atoi(optarg);
- break;
+ case 'm':
+ polarMessageType = atoi(optarg);
+ if (polarMessageType!=0 && polarMessageType!=1 && polarMessageType!=2)
+ printf("Illegal polar message type %d (should be 0,1 or 2)\n", polarMessageType);
+ break;
- case 'i':
- iterations = atoi(optarg);
- break;
+ case 'i':
+ iterations = atoi(optarg);
+ break;
- case 'l':
- decoderListSize = (uint8_t) atoi(optarg);
- break;
+ case 'l':
+ decoderListSize = (uint8_t) atoi(optarg);
+ break;
- case 'a':
- pathMetricAppr = (uint8_t) atoi(optarg);
- break;
+ case 'q':
+ decoder_int16 = 1;
+ break;
- case 'q':
- decoder_int16 = 1;
- break;
+ case 'g':
+ iterations = 1;
+ SNRstart = -6.0;
+ SNRstop = -6.0;
+ decoder_int16 = 1;
+ break;
- case 'g':
- iterations = 1;
- SNRstart = -6.0;
- SNRstop = -6.0;
- decoder_int16 = 1;
- break;
+ case 'F':
+ logFlag = 1;
+ break;
- case 'h':
- printf("./polartest -s SNRstart -d SNRinc -f SNRstop -m [0=PBCH|1=DCI|2=UCI] -i iterations -l decoderListSize -a pathMetricAppr\n");
- exit(-1);
+ case 'L':
+ aggregation_level=atoi(optarg);
+ if (aggregation_level != 1 && aggregation_level != 2 && aggregation_level != 4 && aggregation_level != 8 && aggregation_level != 16) {
+ printf("Illegal aggregation level %d \n",aggregation_level);
+ exit(-1);
+ }
+ break;
- default:
- perror("[polartest.c] Problem at argument parsing with getopt");
- exit(-1);
+ case 'k':
+ testLength=atoi(optarg);
+ if (testLength < 12 || testLength > 60) {
+ printf("Illegal packet bitlength %d \n",testLength);
+ exit(-1);
+ }
+ break;
+
+ case 'h':
+ printf("./polartest\nOptions\n-h Print this help\n-s SNRstart (dB)\n-d SNRinc (dB)\n-f SNRstop (dB)\n-m [0=PBCH|1=DCI|2=UCI]\n"
+ "-i Number of iterations\n-l decoderListSize\n-q Flag for optimized coders usage\n-F Flag for test results logging\n"
+ "-L aggregation level (for DCI)\n-k packet_length (bits) for DCI/UCI\n");
+ exit(-1);
+ break;
+
+ default:
+ perror("[polartest.c] Problem at argument parsing with getopt");
+ exit(-1);
+ break;
}
+ //Initiate timing. (Results depend on CPU Frequency. Therefore, might change due to performance variances during simulation.)
+ time_stats_t timeEncoder,timeDecoder;
+ opp_enabled=1;
+ cpu_freq_GHz = get_cpu_freq_GHz();
+ reset_meas(&timeEncoder);
+ reset_meas(&timeDecoder);
+ randominit(0);
+ crcTableInit();
+
if (polarMessageType == 0) { //PBCH
- testLength = 64;//NR_POLAR_PBCH_PAYLOAD_BITS;
- coderLength = NR_POLAR_PBCH_E;
- aggregation_level = NR_POLAR_PBCH_AGGREGATION_LEVEL;
+ aggregation_level = NR_POLAR_PBCH_AGGREGATION_LEVEL;
} else if (polarMessageType == 1) { //DCI
- //testLength = nr_get_dci_size(params_rel15->dci_format, params_rel15->rnti_type, &fp->initial_bwp_dl, cfg);
- testLength = 41; //20;
- coderLength = 108*8; //to be changed by aggregate level function.
+ coderLength = 108*aggregation_level;
} else if (polarMessageType == -1) { //UCI
- //testLength = ;
- //coderLength = ;
+ printf("UCI testing not supported yet\n");
+ exit(-1);
}
//Logging
time_t currentTime;
- time (¤tTime);
char fileName[512], currentTimeInfo[25];
char folderName[] = ".";
- /*
- folderName=getenv("HOME");
- strcat(folderName,"/Desktop/polartestResults");
- */
+ FILE *logFile;
+ /*folderName=getenv("HOME");
+ strcat(folderName,"/Desktop/polartestResults");*/
+
+if (logFlag){
+ time (¤tTime);
#ifdef DEBUG_POLAR_TIMING
- sprintf(fileName,"%s/TIMING_ListSize_%d_pmAppr_%d_Payload_%d_Itr_%d",folderName,decoderListSize,pathMetricAppr,testLength,iterations);
+ sprintf(fileName,"%s/TIMING_ListSize_%d_Payload_%d_Itr_%d", folderName, decoderListSize, testLength, iterations);
#else
- sprintf(fileName,"%s/_ListSize_%d_pmAppr_%d_Payload_%d_Itr_%d",folderName,decoderListSize,pathMetricAppr,testLength,iterations);
+ sprintf(fileName,"%s/_ListSize_%d_Payload_%d_Itr_%d", folderName, decoderListSize, testLength, iterations);
#endif
strftime(currentTimeInfo, 25, "_%Y-%m-%d-%H-%M-%S.csv", localtime(¤tTime));
strcat(fileName,currentTimeInfo);
//Create "~/Desktop/polartestResults" folder if it doesn't already exist.
- /*
- struct stat folder = {0};
- if (stat(folderName, &folder) == -1) mkdir(folderName, S_IRWXU | S_IRWXG | S_IRWXO);
- */
- FILE *logFile;
+ /*struct stat folder = {0};
+ if (stat(folderName, &folder) == -1) mkdir(folderName, S_IRWXU | S_IRWXG | S_IRWXO);*/
logFile = fopen(fileName, "w");
if (logFile==NULL) {
@@ -129,11 +150,12 @@ int main(int argc, char *argv[]) {
}
#ifdef DEBUG_POLAR_TIMING
- fprintf(logFile,
- ",timeEncoderCRCByte[us],timeEncoderCRCBit[us],timeEncoderInterleaver[us],timeEncoderBitInsertion[us],timeEncoder1[us],timeEncoder2[us],timeEncoderRateMatching[us],timeEncoderByte2Bit[us]\n");
+ fprintf(logFile,",timeEncoderCRCByte[us],timeEncoderCRCBit[us],timeEncoderInterleaver[us],timeEncoderBitInsertion[us],timeEncoder1[us],timeEncoder2[us],timeEncoderRateMatching[us],timeEncoderByte2Bit[us]\n");
#else
fprintf(logFile,",SNR,nBitError,blockErrorState,t_encoder[us],t_decoder[us]\n");
#endif
+}
+
uint8_t testArrayLength = ceil(testLength / 32.0);
uint8_t coderArrayLength = ceil(coderLength / 32.0);
uint32_t testInput[testArrayLength]; //generate randomly
@@ -146,253 +168,156 @@ int main(int argc, char *argv[]) {
double modulatedInput[coderLength]; //channel input
double channelOutput[coderLength]; //add noise
int16_t channelOutput_int16[coderLength];
+
t_nrPolar_params *currentPtr = nr_polar_params(polarMessageType, testLength, aggregation_level);
+
#ifdef DEBUG_DCI_POLAR_PARAMS
uint32_t dci_pdu[4];
memset(dci_pdu,0,sizeof(uint32_t)*4);
dci_pdu[0]=0x01189400;
- printf("dci_pdu: [0]->0x%08x \t [1]->0x%08x \t [2]->0x%08x \t [3]->0x%08x\n",
- dci_pdu[0], dci_pdu[1], dci_pdu[2], dci_pdu[3]);
+ printf("dci_pdu: [0]->0x%08x \t [1]->0x%08x \t [2]->0x%08x \t [3]->0x%08x\n", dci_pdu[0], dci_pdu[1], dci_pdu[2], dci_pdu[3]);
+ uint16_t size=41;
+ rnti=3;
+ aggregation_level=8;
uint32_t encoder_output[54];
memset(encoder_output,0,sizeof(uint32_t)*54);
- uint16_t size=41;
- uint16_t rnti=3;
- aggregation_level=8;
t_nrPolar_params *currentPtrDCI=nr_polar_params(1, size, aggregation_level);
- polar_encoder_dci(dci_pdu, encoder_output, currentPtrDCI, rnti);
- for (int i=0; i<54; i++)
- printf("encoder_output: [%2d]->0x%08x \n",i, encoder_output[i]);
+ polar_encoder_dci(dci_pdu, encoder_output, currentPtrDCI, rnti);
+ for (int i=0; i<54; i++) printf("encoder_output: [%2d]->0x%08x \n", i, encoder_output[i]);
uint8_t *encoder_outputByte = malloc(sizeof(uint8_t) * currentPtrDCI->encoderLength);
- double *channel_output = malloc (sizeof(double) * currentPtrDCI->encoderLength);
- uint32_t dci_estimation[4];
- memset(dci_estimation,0,sizeof(uint32_t)*4);
- printf("dci_estimation: [0]->0x%08x \t [1]->0x%08x \t [2]->0x%08x \t [3]->0x%08x\n",
- dci_estimation[0], dci_estimation[1], dci_estimation[2], dci_estimation[3]);
- nr_bit2byte_uint32_8_t(encoder_output, currentPtrDCI->encoderLength, encoder_outputByte);
+ double *modulated_input = malloc (sizeof(double) * currentPtrDCI->encoderLength);
+ double *channel_output = malloc (sizeof(double) * currentPtrDCI->encoderLength);
+ uint32_t dci_est[4];
+ memset(dci_est,0,sizeof(uint32_t)*4);
+ printf("dci_est: [0]->0x%08x \t [1]->0x%08x \t [2]->0x%08x \t [3]->0x%08x\n", dci_est[0], dci_est[1], dci_est[2], dci_est[3]);
+ nr_bit2byte_uint32_8(encoder_output, currentPtrDCI->encoderLength, encoder_outputByte);
printf("[polartest] encoder_outputByte: ");
+ for (int i = 0; i < currentPtrDCI->encoderLength; i++) printf("%d-", encoder_outputByte[i]); printf("\n");
- for (int i = 0; i < currentPtrDCI->encoderLength; i++) printf("%d-", encoder_outputByte[i]);
-
- printf("\n");
-
+ SNR_lin = pow(10, 0/10); //SNR = 0 dB
for(int i=0; iencoderLength; i++) {
- if (encoder_outputByte[i] == 0) {
- channel_output[i]=1/sqrt(2);
- } else {
- channel_output[i]=(-1)/sqrt(2);
- }
+ if (encoder_outputByte[i] == 0)
+ modulated_input[i]=1/sqrt(2);
+ else
+ modulated_input[i]=(-1)/sqrt(2);
+ channel_output[i] = modulated_input[i] + (gaussdouble(0.0,1.0) * (1/sqrt(2*SNR_lin)));
}
-
- decoderState = polar_decoder_dci(channel_output,
- dci_estimation,
- currentPtrDCI,
- NR_POLAR_DECODER_LISTSIZE,
- NR_POLAR_DECODER_PATH_METRIC_APPROXIMATION,
- rnti);
- printf("dci_estimation: [0]->0x%08x \t [1]->0x%08x \t [2]->0x%08x \t [3]->0x%08x\n",
- dci_estimation[0], dci_estimation[1], dci_estimation[2], dci_estimation[3]);
+ decoderState = polar_decoder_dci(channel_output, dci_est, currentPtrDCI, NR_POLAR_DECODER_LISTSIZE, rnti);
+ printf("dci_est: [0]->0x%08x \t [1]->0x%08x \t [2]->0x%08x \t [3]->0x%08x\n", dci_est[0], dci_est[1], dci_est[2], dci_est[3]);
free(encoder_outputByte);
free(channel_output);
+ free(modulated_input);
return 0;
#endif
-#ifdef DEBUG_CRC
- uint32_t crc;
- unsigned int poly24c = 0xb2b11700;
- uint32_t testInputCRC[4];
- testInputCRC[0]=0x00291880;
- //testInputCRC[0]=0x01189400;
- testInputCRC[1]=0x00000000;
- testInputCRC[2]=0x00000000;
- testInputCRC[3]=0x00000000;
- uint32_t testInputcrc=0x01189400;
- uint32_t testInputcrc2=0x00291880;
- uint8_t testInputCRC2[8];
- nr_crc_bit2bit_uint32_8_t(testInputCRC, 32, testInputCRC2);
- printf("testInputCRC2: [0]->%x \t [1]->%x \t [2]->%x \t [3]->%x\n"
- " [4]->%x \t [5]->%x \t [6]->%x \t [7]->%x\n",
- testInputCRC2[0], testInputCRC2[1], testInputCRC2[2], testInputCRC2[3],
- testInputCRC2[4], testInputCRC2[5], testInputCRC2[6], testInputCRC2[7]);
- unsigned int crc41 = crc24c(testInputCRC, 32);
- unsigned int crc65 = crc24c(testInputCRC, 56);
- printf("crc41: [0]->0x%08x\tcrc65: [0]->0x%08x\n",crc41, crc65);
-
- for (int i=0; i<32; i++) printf("crc41[%d]=%d\tcrc65[%d]=%d\n",i,(crc41>>i)&1,i,(crc65>>i)&1);
-
- crc = crc24c(testInputCRC, testLength)>>8;
-
- for (int i=0; i<24; i++) printf("[i]=%d\n",(crc>>i)&1);
-
- printf("crc: [0]->0x%08x\n",crc);
- //crcbit(testInputCRC, sizeof(test) - 1, poly24c));
- testInputCRC[testLength>>3] = ((uint8_t *)&crc)[2];
- testInputCRC[1+(testLength>>3)] = ((uint8_t *)&crc)[1];
- testInputCRC[2+(testLength>>3)] = ((uint8_t *)&crc)[0];
- printf("testInputCRC: [0]->0x%08x \t [1]->0x%08x \t [2]->0x%08x \t [3]->0x%08x\n",
- testInputCRC[0], testInputCRC[1], testInputCRC[2], testInputCRC[3]);
- //uint32_t trial32 = 0xffffffff;
- uint32_t trial32 = 0xf10fffff;
- uint8_t a[4];
- //memcpy(a, &trial32, sizeof(trial32));
- *(uint32_t *)a = trial32;
- unsigned char trial[4];
- trial[0]=0xff;
- trial[1]=0xff;
- trial[2]=0x0f;
- trial[3]=0xf1;
- uint32_t trialcrc = crc24c(trial, 32);
- uint32_t trialcrc32 = crc24c((uint8_t *)&trial32, 32);
- //uint32_t trialcrc32 = crc24c(a, 32);
- printf("crcbit(trial = %x\n", crcbit(trial, 4, poly24c));
- printf("trialcrc = %x\n", trialcrc);
- printf("trialcrc32 = %x\n", trialcrc32);
-
- for (int i=0; i<32; i++) printf("trialcrc[%2d]=%d\ttrialcrc32[%2d]=%d\n",i,(trialcrc>>i)&1,i,(trialcrc32>>i)&1);
-
- //uint8_t nr_polar_A[32] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
- uint8_t nr_polar_A[32] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,1};
- uint8_t nr_polar_crc[24];
- uint8_t **crc_generator_matrix = crc24c_generator_matrix(32);
- nr_matrix_multiplication_uint8_1D_uint8_2D(nr_polar_A,
- crc_generator_matrix,
- nr_polar_crc,
- 32,
- 24);
-
- for (uint8_t i = 0; i < 24; i++) {
- nr_polar_crc[i] = (nr_polar_crc[i] % 2);
- printf("nr_polar_crc[%d]=%d\n",i,nr_polar_crc[i]);
- }
-
- return 0;
-#endif
-#ifdef DEBUG_POLAR_TIMING
for (SNR = SNRstart; SNR <= SNRstop; SNR += SNRinc) {
- SNR_lin = pow(10, SNR / 10);
+ printf("SNR %f\n",SNR);
+ SNR_lin = pow(10, SNR/10);
- for (itr = 1; itr <= iterations; itr++) {
- for (int j=0; jpayloadBits".
+ for (int i = 0; i < testArrayLength; i++) {
+ for (int j = 0; j < (sizeof(testInput[0])*8)-1; j++) {
+ testInput[i] |= ( ((uint32_t) (rand()%2)) &1);
+ testInput[i]<<=1;
+ }
+ testInput[i] |= ( ((uint32_t) (rand()%2)) &1);
+ }
- printf("testInput: [0]->0x%08x \n", testInput[0]);
- polar_encoder_timing(testInput, encoderOutput, currentPtr, cpu_freq_GHz, logFile);
- }
- }
-
- fclose(logFile);
- free(testInput);
- free(encoderOutput);
- free(modulatedInput);
- free(channelOutput);
- free(estimatedOutput);
- return (0);
+#ifdef DEBUG_POLARTEST
+ //testInput[0] = 0x360f8a5c;
+ printf("testInput: [0]->0x%08x\n", testInput[0]);
#endif
- // We assume no a priori knowledge available about the payload.
- double aPrioriArray[currentPtr->payloadBits];
+ int len_mod64=currentPtr->payloadBits&63;
+ ((uint64_t *)testInput)[currentPtr->payloadBits/64]&=((((uint64_t)1)<payloadBits; i++) aPrioriArray[i] = NAN;
+ start_meas(&timeEncoder);
+ if (decoder_int16==1) {
+ polar_encoder_fast((uint64_t *)testInput, encoderOutput, 0, currentPtr);
+ //polar_encoder_fast((uint64_t*)testInput, (uint64_t*)encoderOutput,0, currentPtr);
+ } else { //0 --> PBCH, 1 --> DCI, -1 --> UCI
+ if (polarMessageType == 0)
+ polar_encoder(testInput, encoderOutput, currentPtr);
+ else if (polarMessageType == 1)
+ polar_encoder_dci(testInput, encoderOutput, currentPtr, rnti);
+ }
+ stop_meas(&timeEncoder);
- for (SNR = SNRstart; SNR <= SNRstop; SNR += SNRinc) {
- printf("SNR %f\n",SNR);
- SNR_lin = pow(10, SNR/10);
+#ifdef DEBUG_POLARTEST
+ printf("encoderOutput: [0]->0x%08x\n", encoderOutput[0]);
+ //for (int i=1;i0x%08x\n", i, encoderOutput[1]);
+#endif
- for (itr = 1; itr <= iterations; itr++) {
- for (int i = 0; i < testArrayLength; i++) {
- for (int j = 0; j < (sizeof(testInput[0])*8)-1; j++) {
- testInput[i] |= ( ((uint32_t) (rand()%2)) &1);
- testInput[i]<<=1;
- }
-
- testInput[i] |= ( ((uint32_t) (rand()%2)) &1);
- }
-
- /*printf("testInput: [0]->0x%08x\n", testInput[0]);
- for (int i=0; i<32; i++)
- printf("%d\n",(testInput[0]>>i)&1);*/
- int len_mod64=currentPtr->payloadBits&63;
- ((uint64_t *)testInput)[currentPtr->payloadBits/64]&=((((uint64_t)1)<0x%08x\n", encoderOutput[0]);
- printf("encoderOutput: [1]->0x%08x\n", encoderOutput[1]);*/
//Bit-to-byte:
- nr_bit2byte_uint32_8_t(encoderOutput, coderLength, encoderOutputByte);
+ nr_bit2byte_uint32_8(encoderOutput, coderLength, encoderOutputByte);
//BPSK modulation
for(int i=0; i 15) channelOutput_int16[i] = 127;
- else if (channelOutput[i] < -16) channelOutput_int16[i] = -128;
- else channelOutput_int16[i] = (int16_t) (8*channelOutput[i]);
- }
+ if (decoder_int16==1) {
+ if (channelOutput[i] > 15) channelOutput_int16[i] = 127;
+ else if (channelOutput[i] < -16) channelOutput_int16[i] = -128;
+ else channelOutput_int16[i] = (int16_t) (8*channelOutput[i]);
+ }
}
start_meas(&timeDecoder);
- /*decoderState = polar_decoder(channelOutput,
- estimatedOutput,
- currentPtr,
- NR_POLAR_DECODER_LISTSIZE,
- aPrioriArray,
- NR_POLAR_DECODER_PATH_METRIC_APPROXIMATION);*/
- if (decoder_int16==0)
- decoderState = polar_decoder_aPriori(channelOutput,
- estimatedOutput,
- currentPtr,
- NR_POLAR_DECODER_LISTSIZE,
- NR_POLAR_DECODER_PATH_METRIC_APPROXIMATION,
- aPrioriArray);
- else
- decoderState = polar_decoder_int16(channelOutput_int16,
- (uint64_t *)estimatedOutput,
- currentPtr);
-
+ if (decoder_int16==1) {
+ decoderState = polar_decoder_int16(channelOutput_int16, (uint64_t *)estimatedOutput, currentPtr);
+ } else { //0 --> PBCH, 1 --> DCI, -1 --> UCI
+ if (polarMessageType == 0) {
+ decoderState = polar_decoder(channelOutput,
+ estimatedOutput,
+ currentPtr,
+ decoderListSize);
+ } else if (polarMessageType == 1) {
+ decoderState = polar_decoder_dci(channelOutput,
+ estimatedOutput,
+ currentPtr,
+ decoderListSize,
+ rnti);
+ }
+ }
stop_meas(&timeDecoder);
- /*printf("testInput: [0]->0x%08x\n", testInput[0]);
- printf("estimatedOutput: [0]->0x%08x\n", estimatedOutput[0]);*/
+
+#ifdef DEBUG_POLARTEST
+ printf("estimatedOutput: [0]->0x%08x\n", estimatedOutput[0]);
+#endif
//calculate errors
if (decoderState!=0) {
- blockErrorState=-1;
- nBitError=-1;
+ blockErrorState=-1;
+ nBitError=-1;
} else {
- for (int j = 0; j < currentPtr->payloadBits; j++) {
- if (((estimatedOutput[0]>>j) & 1) != ((testInput[0]>>j) & 1)) nBitError++;
-
- // printf("bit %d: %d => %d\n",j,(testInput[0]>>j)&1,(estimatedOutput[0]>>j)&1);
- }
-
- if (nBitError>0) {
- blockErrorState=1;
- // printf("Error: Input %x, Output %x\n",testInput[0],estimatedOutput[0]);
- }
+ for (int i = 0; i < (testArrayLength-1); i++) {
+ for (int j = 0; j < 32; j++) {
+ if ( ((estimatedOutput[i]>>j) & 1) != ((testInput[i]>>j) & 1) )
+ nBitError++;
+ }
+ }
+ for (int j = 0; j < testLength - ((testArrayLength-1) * 32); j++)
+ if ( ((estimatedOutput[(testArrayLength-1)]>>j) & 1) != ((testInput[(testArrayLength-1)]>>j) & 1) )
+ nBitError++;
}
+ if (nBitError>0) blockErrorState=1;
+#ifdef DEBUG_POLARTEST
+ for (int i = 0; i < testArrayLength; i++)
+ printf("[polartest/decoderState=%d] testInput[%d]=0x%08x, estimatedOutput[%d]=0x%08x\n",decoderState, i, testInput[i], i, estimatedOutput[i]);
+#endif
//Iteration times are in microseconds.
timeEncoderCumulative+=(timeEncoder.diff/(cpu_freq_GHz*1000.0));
timeDecoderCumulative+=(timeDecoder.diff/(cpu_freq_GHz*1000.0));
- fprintf(logFile,",%f,%d,%d,%f,%f\n", SNR, nBitError, blockErrorState,
- (timeEncoder.diff/(cpu_freq_GHz*1000.0)), (timeDecoder.diff/(cpu_freq_GHz*1000.0)));
+ if (logFlag) fprintf(logFile,",%f,%d,%d,%f,%f\n", SNR, nBitError, blockErrorState, (timeEncoder.diff/(cpu_freq_GHz*1000.0)), (timeDecoder.diff/(cpu_freq_GHz*1000.0)));
if (nBitError<0) {
blockErrorCumulative++;
@@ -405,17 +330,19 @@ int main(int argc, char *argv[]) {
decoderState=0;
nBitError=0;
blockErrorState=0;
+ memset(testInput,0,sizeof(uint32_t) * testArrayLength);
+ memset(encoderOutput,0,sizeof(uint32_t) * coderArrayLength);
+ memset(estimatedOutput,0,sizeof(uint32_t) * testArrayLength);
}
//Calculate error statistics for the SNR.
- printf("[ListSize=%d, Appr=%d] SNR=%+8.3f, BLER=%9.6f, BER=%12.9f, t_Encoder=%9.3fus, t_Decoder=%9.3fus\n",
- decoderListSize, pathMetricAppr, SNR, ((double)blockErrorCumulative/iterations),
+ printf("[ListSize=%d] SNR=%+8.3f, BLER=%9.6f, BER=%12.9f, t_Encoder=%9.3fus, t_Decoder=%9.3fus\n",
+ decoderListSize, SNR, ((double)blockErrorCumulative/iterations),
((double)bitErrorCumulative / (iterations*testLength)),
(double)timeEncoder.diff/timeEncoder.trials/(cpu_freq_GHz*1000.0),(double)timeDecoder.diff/timeDecoder.trials/(cpu_freq_GHz*1000.0));
//(timeEncoderCumulative/iterations),timeDecoderCumulative/iterations);
- if (blockErrorCumulative==0 && bitErrorCumulative==0)
- break;
+ if (blockErrorCumulative==0 && bitErrorCumulative==0) break;
blockErrorCumulative = 0;
bitErrorCumulative = 0;
@@ -425,6 +352,6 @@ int main(int argc, char *argv[]) {
print_meas(&timeEncoder,"polar_encoder",NULL,NULL);
print_meas(&timeDecoder,"polar_decoder",NULL,NULL);
- fclose(logFile);
+ if (logFlag) fclose(logFile);
return (0);
}
diff --git a/openair1/PHY/CODING/TESTBENCH/smallblocktest.c b/openair1/PHY/CODING/TESTBENCH/smallblocktest.c
new file mode 100644
index 0000000000..ee1a228ab8
--- /dev/null
+++ b/openair1/PHY/CODING/TESTBENCH/smallblocktest.c
@@ -0,0 +1,166 @@
+#include "PHY/CODING/nrSmallBlock/nr_small_block_defs.h"
+#include "SIMULATION/TOOLS/sim.h"
+#include
+
+//#define DEBUG_SMALLBLOCKTEST
+
+signed char quantize(double D, double x, unsigned char B)
+{
+ double qxd;
+ short maxlev;
+ qxd = floor(x/D);
+
+ maxlev = 1<<(B-1);//(char)(pow(2,B-1));
+
+ if (qxd <= -maxlev)
+ qxd = -maxlev;
+ else if (qxd >= maxlev)
+ qxd = maxlev-1;
+
+ return((char)qxd);
+}
+
+int main(int argc, char *argv[]) {
+
+ time_stats_t timeEncoder,timeDecoder;
+ opp_enabled=1;
+ cpu_freq_GHz = get_cpu_freq_GHz();
+ reset_meas(&timeEncoder);
+ reset_meas(&timeDecoder);
+ randominit(0);
+
+ int arguments, iterations = 1000, messageLength = 11;
+ //int matlabDebug = 0;
+ uint32_t testInput, encoderOutput, codingDifference, nBitError=0, blockErrorState = 0, blockErrorCumulative=0, bitErrorCumulative=0;
+ uint16_t estimatedOutput;
+ double SNRstart = -20.0, SNRstop = 5.0, SNRinc= 0.5; //dB
+ double SNR, SNR_lin, sigma;
+ double modulatedInput[NR_SMALL_BLOCK_CODED_BITS], channelOutput[NR_SMALL_BLOCK_CODED_BITS];
+ //int16_t channelOutput_int16[NR_SMALL_BLOCK_CODED_BITS];
+ int8_t channelOutput_int8[NR_SMALL_BLOCK_CODED_BITS];
+ unsigned char qbits=8;
+
+ while ((arguments = getopt (argc, argv, "s:d:f:l:i:mhg")) != -1)
+ switch (arguments)
+ {
+ case 's':
+ SNRstart = atof(optarg);
+ break;
+
+ case 'd':
+ SNRinc = atof(optarg);
+ break;
+
+ case 'f':
+ SNRstop = atof(optarg);
+ break;
+
+ case 'l':
+ messageLength = atoi(optarg);
+ break;
+
+ case 'i':
+ iterations = atoi(optarg);
+ break;
+
+ /*case 'm':
+ matlabDebug = 1;
+ //#define DEBUG_POLAR_MATLAB
+ break;*/
+
+ case 'g':
+ iterations = 1;
+ SNRstart = -6.0;
+ SNRstop = -6.0;
+ messageLength = 11;
+ break;
+
+ case 'h':
+ //printf("./smallblocktest -s SNRstart -d SNRinc -f SNRstop -l messageLength -i iterations -m Matlab Debug\n");
+ printf("./smallblocktest -s SNRstart -d SNRinc -f SNRstop -l messageLength -i iterations\n");
+ exit(-1);
+
+ default:
+ perror("[smallblocktest.c] Problem at argument parsing with getopt");
+ exit(-1);
+ }
+
+
+ uint16_t mask = 0x07ff >> (11-messageLength);
+ for (SNR = SNRstart; SNR <= SNRstop; SNR += SNRinc) {
+ printf("SNR %f\n",SNR);
+ SNR_lin = pow(10, SNR/10.0);
+ sigma = 1.0/sqrt(SNR_lin);
+
+ for (int itr = 1; itr <= iterations; itr++) {
+
+ //Generate random test input of length "messageLength"
+ testInput = 0;
+ for (int i = 1; i < messageLength; i++) {
+ testInput |= ( ((uint32_t) (rand()%2)) &1);
+ testInput<<=1;
+ }
+ testInput |= ( ((uint32_t) (rand()%2)) &1);
+ //Encoding
+ start_meas(&timeEncoder);
+ encoderOutput = encodeSmallBlock((uint16_t*)&testInput, (uint8_t)messageLength);
+ stop_meas(&timeEncoder);
+
+ for (int i=0; i>i) & 1 ) {
+ modulatedInput[i]=-1;
+ } else {
+ modulatedInput[i]=1;
+ }
+
+ //AWGN
+ channelOutput[i] = modulatedInput[i] + ( gaussdouble(0.0,1.0) * ( 1/sqrt(SNR_lin) ) );
+
+ //Quantization
+ channelOutput_int8[i] = quantize(sigma/16.0, channelOutput[i], qbits);
+ }
+
+ //Decoding
+ start_meas(&timeDecoder);
+ estimatedOutput = decodeSmallBlock(channelOutput_int8, (uint8_t)messageLength);
+ stop_meas(&timeDecoder);
+
+#ifdef DEBUG_SMALLBLOCKTEST
+ printf("[smallblocktest] Input = 0x%x, Output = 0x%x, DecoderOutput = 0x%x\n", testInput, encoderOutput, estimatedOutput);
+ for (int i=0;i<32;i++)
+ printf("[smallblocktest] Input[%d] = %d, Output[%d] = %d, codingDifference[%d]=%d, Mask[%d] = %d\n", i, (testInput>>i)&1, i, (estimatedOutput>>i)&1, i, (codingDifference>>i)&1, i, (mask>>i)&1);
+#endif
+
+ //Error Calculation
+ estimatedOutput &= mask;
+ codingDifference = ((uint32_t)estimatedOutput) ^ testInput; // Count the # of 1's in codingDifference by Brian Kernighan’s algorithm.
+
+ for (nBitError = 0; codingDifference; nBitError++)
+ codingDifference &= codingDifference - 1;
+
+ blockErrorState = (nBitError > 0) ? 1 : 0;
+
+ blockErrorCumulative+=blockErrorState;
+ bitErrorCumulative+=nBitError;
+
+ nBitError = 0; blockErrorState = 0;
+ }
+
+ //Error statistics for the SNR; iteration times are in nanoseconds and microseconds, respectively.
+ printf("[smallblocktest] SNR=%+7.3f, BER=%9.6f, BLER=%9.6f, t_Encoder=%9.3fns, t_Decoder=%7.3fus\n",
+ SNR,
+ ((double)bitErrorCumulative / (iterations*messageLength)),
+ ((double)blockErrorCumulative/iterations),
+ ((double)timeEncoder.diff/timeEncoder.trials)/(cpu_freq_GHz),
+ ((double)timeDecoder.diff/timeDecoder.trials)/(cpu_freq_GHz*1000.0));
+
+ blockErrorCumulative=0;
+ bitErrorCumulative=0;
+ }
+
+ print_meas(&timeEncoder, "smallblock_encoder", NULL, NULL);
+ print_meas(&timeDecoder, "smallblock_decoder", NULL, NULL);
+
+ return (0);
+}
diff --git a/openair1/PHY/CODING/crc_byte.c b/openair1/PHY/CODING/crc_byte.c
index 5e0ebeb991..ee5c302adb 100644
--- a/openair1/PHY/CODING/crc_byte.c
+++ b/openair1/PHY/CODING/crc_byte.c
@@ -106,17 +106,6 @@ void crcTableInit (void)
} while (++c);
}
-//Generic version
-void crcTable256Init (uint32_t poly, uint32_t* crc256Table)
-{
- unsigned char c = 0;
-
- do {
- crc256Table[c] = crcbit(&c, 1, poly);
- } while (++c);
-
-}
-
/*********************************************************
Byte by byte implementations,
@@ -236,30 +225,10 @@ crc8 (unsigned char * inptr, int bitlen)
return crc;
}
-//Generic version
-unsigned int crcPayload(unsigned char * inptr, int bitlen, uint32_t* crc256Table)
-{
- int octetlen, resbit;
- unsigned int crc = 0;
- octetlen = bitlen/8; // Change in bytes
- resbit = (bitlen % 8);
-
- while (octetlen-- > 0)
- {
- crc = (crc << 8) ^ crc256Table[(*inptr++) ^ (crc >> 24)];
- }
-
- if (resbit > 0)
- {
- crc = (crc << resbit) ^ crc256Table[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))];
- }
- return crc;
-}
-
int check_crc(uint8_t* decoded_bytes, uint32_t n, uint32_t F, uint8_t crc_type)
{
uint32_t crc=0,oldcrc=0;
- uint8_t crc_len,temp;
+ uint8_t crc_len=0;
switch (crc_type) {
case CRC24_A:
@@ -335,7 +304,7 @@ main()
{
unsigned char test[] = "Thebigredfox";
crcTableInit();
- printf("%x\n", crcbit(test, sizeof(test) - 1, poly24));
+ printf("%x\n", crcbit(test, sizeof(test) - 1, poly24a));
printf("%x\n", crc24(test, (sizeof(test) - 1)*8));
printf("%x\n", crcbit(test, sizeof(test) - 1, poly8));
printf("%x\n", crc8(test, (sizeof(test) - 1)*8));
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/time_meas.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/time_meas.c
deleted file mode 100644
index c784188071..0000000000
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/time_meas.c
+++ /dev/null
@@ -1,117 +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
- */
-
-#include
-#include "time_meas.h"
-#include
-#include
-
-// global var for openair performance profiler
-extern int opp_enabled;
-
-
-double get_cpu_freq_GHz(void) {
-
- time_stats_t ts = {0};
- reset_meas(&ts);
- ts.trials++;
- ts.in = rdtsc_oai();
- sleep(1);
- ts.diff = (rdtsc_oai()-ts.in);
- cpu_freq_GHz = (double)ts.diff/1000000000;
- printf("CPU Freq is %f \n", cpu_freq_GHz);
- return cpu_freq_GHz;
-}
-
-void print_meas_now(time_stats_t *ts, const char* name, FILE* file_name){
-
- if (opp_enabled) {
-
- //static double cpu_freq_GHz = 3.2;
-
- //if (cpu_freq_GHz == 0.0)
- //cpu_freq_GHz = get_cpu_freq_GHz(); // super slow
-
- if (ts->trials>0) {
-
- //fprintf(file_name,"Name %25s: Processing %15.3f ms for SF %d, diff_now %15.3f \n", name,(ts->diff_now/(cpu_freq_GHz*1000000.0)),subframe,ts->diff_now);
- fprintf(file_name,"%15.3f ms, diff_now %15.3f \n",(ts->diff_now/(cpu_freq_GHz*1000000.0)),(double)ts->diff_now);
-
- }
- }
-}
-
-void print_meas(time_stats_t *ts, const char* name, time_stats_t * total_exec_time, time_stats_t * sf_exec_time)
-{
-
- if (opp_enabled) {
-
- static int first_time = 0;
- static double cpu_freq_GHz = 0.0;
-
- if (cpu_freq_GHz == 0.0)
- cpu_freq_GHz = get_cpu_freq_GHz();
-
- if (first_time == 0) {
- first_time=1;
-
- if ((total_exec_time == NULL) || (sf_exec_time== NULL))
- fprintf(stderr, "%25s %25s %25s %25s %25s %6f\n","Name","Total","Per Trials", "Num Trials","CPU_F_GHz", cpu_freq_GHz);
- else
- fprintf(stderr, "%25s %25s %25s %20s %15s %6f\n","Name","Total","Average/Frame","Trials", "CPU_F_GHz", cpu_freq_GHz);
- }
-
- if (ts->trials>0) {
- //printf("%20s: total: %10.3f ms, average: %10.3f us (%10d trials)\n", name, ts->diff/cpu_freq_GHz/1000000.0, ts->diff/ts->trials/cpu_freq_GHz/1000.0, ts->trials);
-
- if ((total_exec_time == NULL) || (sf_exec_time== NULL)) {
- fprintf(stderr, "%25s: %15.3f ms ; %15.3f us; %15d;\n",
- name,
- (ts->diff/cpu_freq_GHz/1000000.0),
- (ts->diff/ts->trials/cpu_freq_GHz/1000.0),
- ts->trials);
- } else {
- fprintf(stderr, "%25s: %15.3f ms (%5.2f%%); %15.3f us (%5.2f%%); %15d;\n",
- name,
- (ts->diff/cpu_freq_GHz/1000000.0),
- ((ts->diff/cpu_freq_GHz/1000000.0)/(total_exec_time->diff/cpu_freq_GHz/1000000.0))*100, // percentage
- (ts->diff/ts->trials/cpu_freq_GHz/1000.0),
- ((ts->diff/ts->trials/cpu_freq_GHz/1000.0)/(sf_exec_time->diff/sf_exec_time->trials/cpu_freq_GHz/1000.0))*100, // percentage
- ts->trials);
- }
- }
- }
-
-}
-
-double get_time_meas_us(time_stats_t *ts)
-{
-
- static double cpu_freq_GHz = 0.0;
-
- if (cpu_freq_GHz == 0.0)
- cpu_freq_GHz = get_cpu_freq_GHz();
-
- if (ts->trials>0)
- return (ts->diff/ts->trials/cpu_freq_GHz/1000.0);
-
- return 0;
-}
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/time_meas.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/time_meas.h
deleted file mode 100644
index e6bec31176..0000000000
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/time_meas.h
+++ /dev/null
@@ -1,156 +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
- */
-
-#ifndef __TIME_MEAS_DEFS__H__
-#define __TIME_MEAS_DEFS__H__
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-// global var to enable openair performance profiler
-static int opp_enabled = 1;
-double cpu_freq_GHz;
-#if defined(__x86_64__) || defined(__i386__)
-
-typedef struct {
-
- long long in;
- long long diff;
- long long diff_now;
- long long p_time; /*!< \brief absolute process duration */
- long long diff_square; /*!< \brief process duration square */
- long long max;
- int trials;
- int meas_flag;
-} time_stats_t;
-#elif defined(__arm__)
-typedef struct {
- uint32_t in;
- uint32_t diff_now;
- uint32_t diff;
- uint32_t p_time; /*!< \brief absolute process duration */
- uint32_t diff_square; /*!< \brief process duration square */
- uint32_t max;
- int trials;
-} time_stats_t;
-
-#endif
-static inline void start_meas(time_stats_t *ts) __attribute__((always_inline));
-static inline void stop_meas(time_stats_t *ts) __attribute__((always_inline));
-
-
-void print_meas_now(time_stats_t *ts, const char* name, FILE* file_name);
-//void print_meas(time_stats_t *ts, const char* name, time_stats_t * total_exec_time, time_stats_t * sf_exec_time);
-double get_time_meas_us(time_stats_t *ts);
-double get_cpu_freq_GHz(void);
-
-#if defined(__i386__)
-static inline unsigned long long rdtsc_oai(void) __attribute__((always_inline));
-static inline unsigned long long rdtsc_oai(void)
-{
- unsigned long long int x;
- __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
- return x;
-}
-#elif defined(__x86_64__)
-static inline unsigned long long rdtsc_oai(void) __attribute__((always_inline));
-static inline unsigned long long rdtsc_oai(void)
-{
- unsigned long long a, d;
- __asm__ volatile ("rdtsc" : "=a" (a), "=d" (d));
- return (d<<32) | a;
-}
-
-#elif defined(__arm__)
-static inline uint32_t rdtsc_oai(void) __attribute__((always_inline));
-static inline uint32_t rdtsc_oai(void)
-{
- uint32_t r = 0;
- asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(r) );
- return r;
-}
-#endif
-
-static inline void start_meas(time_stats_t *ts)
-{
-
- if (opp_enabled) {
- if (ts->meas_flag==0) {
- ts->trials++;
- ts->in = rdtsc_oai();
- ts->meas_flag=1;
- }
- else {
- ts->in = rdtsc_oai();
- }
- }
-}
-
-static inline void stop_meas(time_stats_t *ts)
-{
-
- if (opp_enabled) {
- long long out = rdtsc_oai();
-
- ts->diff_now = (out-ts->in);
-
- ts->diff_now = (out-ts->in);
- ts->diff += (out-ts->in);
- /// process duration is the difference between two clock points
- ts->p_time = (out-ts->in);
- ts->diff_square += (out-ts->in)*(out-ts->in);
-
- if ((out-ts->in) > ts->max)
- ts->max = out-ts->in;
-
- ts->meas_flag=0;
- }
-}
-
-static inline void reset_meas(time_stats_t *ts) {
-
- ts->trials=0;
- ts->diff=0;
- ts->diff_now=0;
- ts->p_time=0;
- ts->diff_square=0;
- ts->max=0;
- ts->meas_flag=0;
-
-}
-
-static inline void copy_meas(time_stats_t *dst_ts,time_stats_t *src_ts)
-{
-
- if (opp_enabled) {
- dst_ts->trials=src_ts->trials;
- dst_ts->diff=src_ts->diff;
- dst_ts->max=src_ts->max;
- }
-}
-
-#endif
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
index ae32f6ffb6..a61a15459c 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
@@ -31,7 +31,7 @@
#ifndef __NR_LDPC_TYPES__H__
#define __NR_LDPC_TYPES__H__
-#include "./nrLDPC_tools/time_meas.h"
+#include "PHY/TOOLS/time_meas.h"
// ==============================================================================
// TYPES
diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_bitwise_operations.c b/openair1/PHY/CODING/nrPolar_tools/nr_bitwise_operations.c
index beabeead36..fdba4e1b65 100644
--- a/openair1/PHY/CODING/nrPolar_tools/nr_bitwise_operations.c
+++ b/openair1/PHY/CODING/nrPolar_tools/nr_bitwise_operations.c
@@ -19,9 +19,20 @@
* contact@openairinterface.org
*/
+/*!\file PHY/CODING/nrPolar_tools/nr_bitwise_operations.c
+ * \brief
+ * \author Turker Yilmaz
+ * \date 2018
+ * \version 0.1
+ * \company EURECOM
+ * \email turker.yilmaz@eurecom.fr
+ * \note
+ * \warning
+*/
+
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
-void nr_bit2byte_uint32_8_t(uint32_t *in, uint16_t arraySize, uint8_t *out) {
+void nr_bit2byte_uint32_8(uint32_t *in, uint16_t arraySize, uint8_t *out) {
uint8_t arrayInd = ceil(arraySize / 32.0);
for (int i = 0; i < (arrayInd-1); i++) {
for (int j = 0; j < 32; j++) {
@@ -29,10 +40,11 @@ void nr_bit2byte_uint32_8_t(uint32_t *in, uint16_t arraySize, uint8_t *out) {
}
}
- for (int j = 0; j < arraySize - ((arrayInd-1) * 32); j++) out[j + ((arrayInd-1) * 32)] = (in[(arrayInd-1)] >> j) & 1;
+ for (int j = 0; j < arraySize - ((arrayInd-1) * 32); j++)
+ out[j + ((arrayInd-1) * 32)] = (in[(arrayInd-1)] >> j) & 1;
}
-void nr_byte2bit_uint8_32_t(uint8_t *in, uint16_t arraySize, uint32_t *out) {
+void nr_byte2bit_uint8_32(uint8_t *in, uint16_t arraySize, uint32_t *out) {
uint8_t arrayInd = ceil(arraySize / 32.0);
for (int i = 0; i < arrayInd; i++) {
out[i]=0;
@@ -43,16 +55,3 @@ void nr_byte2bit_uint8_32_t(uint8_t *in, uint16_t arraySize, uint32_t *out) {
out[i]|=in[(i*32)];
}
}
-
-void nr_crc_bit2bit_uint32_8_t(uint32_t *in, uint16_t arraySize, uint8_t *out) {
- out[0]=0xff;
- out[1]=0xff;
- out[2]=0xff;
- uint8_t arrayInd = ceil(arraySize / 32.0);
- for (int i = 0; i < arrayInd; i++) {
- out[3+i*4] = ((in[i] & (0x0000000f))<<4) | ((in[i] & (0x000000f0))>>4);
- out[4+i*4] = (((in[i] & (0x00000f00))<<4) | ((in[i] & (0x0000f000))>>4))>>8;
- out[5+i*4] = (((in[i] & (0x000f0000))<<4) | ((in[i] & (0x00f00000))>>4))>>16;
- out[6+i*4] = (((in[i] & (0x0f000000))<<4) | ((in[i] & (0xf0000000))>>4))>>24;
- }
-}
diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c b/openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c
index ef329b3aaa..461eb7d6f6 100644
--- a/openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c
+++ b/openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c
@@ -21,43 +21,36 @@
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
-
// ----- Old implementation ----
uint8_t **crc24c_generator_matrix(uint16_t payloadSizeBits){
uint8_t crcPolynomialPattern[25] = {1,1,0,1,1,0,0,1,0,1,0,1,1,0,0,0,1,0,0,0,1,0,1,1,1};
// 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
- uint8_t crcPolynomialSize = 24;// 24 because crc24c
+ uint8_t crcPolynomialSize = 24;
uint8_t temp1[crcPolynomialSize], temp2[crcPolynomialSize];
uint8_t **crc_generator_matrix = malloc(payloadSizeBits * sizeof(uint8_t *));
if (crc_generator_matrix)
- {
for (int i = 0; i < payloadSizeBits; i++)
- {
crc_generator_matrix[i] = malloc(crcPolynomialSize * sizeof(uint8_t));
- }
- }
for (int i = 0; i < crcPolynomialSize; i++) crc_generator_matrix[payloadSizeBits-1][i]=crcPolynomialPattern[i+1];
for (int i = payloadSizeBits-2; i >= 0; i--){
-
for (int j = 0; j < crcPolynomialSize-1; j++) temp1[j]=crc_generator_matrix[i+1][j+1];
+
temp1[crcPolynomialSize-1]=0;
- for (int j = 0; j < crcPolynomialSize; j++) temp2[j]=crc_generator_matrix[i+1][0]*crcPolynomialPattern[j+1];
+ for (int j = 0; j < crcPolynomialSize; j++)
+ temp2[j]=crc_generator_matrix[i+1][0]*crcPolynomialPattern[j+1];
for (int j = 0; j < crcPolynomialSize; j++){
- if(temp1[j]+temp2[j] == 1){
+ if(temp1[j]+temp2[j] == 1)
crc_generator_matrix[i][j]=1;
- } else {
+ else
crc_generator_matrix[i][j]=0;
- }
}
-
}
-
return crc_generator_matrix;
}
@@ -70,30 +63,26 @@ uint8_t **crc11_generator_matrix(uint16_t payloadSizeBits){
uint8_t **crc_generator_matrix = malloc(payloadSizeBits * sizeof(uint8_t *));
if (crc_generator_matrix)
- {
for (int i = 0; i < payloadSizeBits; i++)
- {
crc_generator_matrix[i] = malloc(crcPolynomialSize * sizeof(uint8_t));
- }
- }
for (int i = 0; i < crcPolynomialSize; i++) crc_generator_matrix[payloadSizeBits-1][i]=crcPolynomialPattern[i+1];
for (int i = payloadSizeBits-2; i >= 0; i--){
+ for (int j = 0; j < crcPolynomialSize-1; j++)
+ temp1[j]=crc_generator_matrix[i+1][j+1];
- for (int j = 0; j < crcPolynomialSize-1; j++) temp1[j]=crc_generator_matrix[i+1][j+1];
temp1[crcPolynomialSize-1]=0;
- for (int j = 0; j < crcPolynomialSize; j++) temp2[j]=crc_generator_matrix[i+1][0]*crcPolynomialPattern[j+1];
+ for (int j = 0; j < crcPolynomialSize; j++)
+ temp2[j]=crc_generator_matrix[i+1][0]*crcPolynomialPattern[j+1];
for (int j = 0; j < crcPolynomialSize; j++){
- if(temp1[j]+temp2[j] == 1){
+ if(temp1[j]+temp2[j] == 1)
crc_generator_matrix[i][j]=1;
- } else {
+ else
crc_generator_matrix[i][j]=0;
- }
}
-
}
return crc_generator_matrix;
@@ -105,33 +94,30 @@ uint8_t **crc6_generator_matrix(uint16_t payloadSizeBits){
// 0110 0001 D^6 + D^5 + 1
uint8_t crcPolynomialSize = 6;
uint8_t temp1[crcPolynomialSize], temp2[crcPolynomialSize];
-
uint8_t **crc_generator_matrix = malloc(payloadSizeBits * sizeof(uint8_t *));
- if (crc_generator_matrix)
- {
- for (int i = 0; i < payloadSizeBits; i++)
- {
- crc_generator_matrix[i] = malloc(crcPolynomialSize * sizeof(uint8_t));
- }
- }
- for (int i = 0; i < crcPolynomialSize; i++) crc_generator_matrix[payloadSizeBits-1][i]=crcPolynomialPattern[i+1];
+ if (crc_generator_matrix)
+ for (int i = 0; i < payloadSizeBits; i++)
+ crc_generator_matrix[i] = malloc(crcPolynomialSize * sizeof(uint8_t));
+
+ for (int i = 0; i < crcPolynomialSize; i++)
+ crc_generator_matrix[payloadSizeBits-1][i]=crcPolynomialPattern[i+1];
for (int i = payloadSizeBits-2; i >= 0; i--){
+ for (int j = 0; j < crcPolynomialSize-1; j++)
+ temp1[j]=crc_generator_matrix[i+1][j+1];
- for (int j = 0; j < crcPolynomialSize-1; j++) temp1[j]=crc_generator_matrix[i+1][j+1];
temp1[crcPolynomialSize-1]=0;
- for (int j = 0; j < crcPolynomialSize; j++) temp2[j]=crc_generator_matrix[i+1][0]*crcPolynomialPattern[j+1];
+ for (int j = 0; j < crcPolynomialSize; j++)
+ temp2[j]=crc_generator_matrix[i+1][0]*crcPolynomialPattern[j+1];
for (int j = 0; j < crcPolynomialSize; j++){
- if(temp1[j]+temp2[j] == 1){
+ if(temp1[j]+temp2[j] == 1)
crc_generator_matrix[i][j]=1;
- } else {
+ else
crc_generator_matrix[i][j]=0;
- }
}
-
}
return crc_generator_matrix;
diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoder.c b/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoder.c
index cc90247c12..66d0fc481c 100644
--- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoder.c
+++ b/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoder.c
@@ -21,11 +21,11 @@
/*!\file PHY/CODING/nrPolar_tools/nr_polar_decoder.c
* \brief
- * \author Turker Yilmaz
+ * \author Raymond Knopp, Turker Yilmaz
* \date 2018
* \version 0.1
* \company EURECOM
- * \email turker.yilmaz@eurecom.fr
+ * \email raymond.knopp@eurecom.fr, turker.yilmaz@eurecom.fr
* \note
* \warning
*/
@@ -39,12 +39,11 @@
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
#include "assertions.h"
-int8_t polar_decoder(
- double *input,
- uint8_t *out,
- t_nrPolar_params *polarParams,
- uint8_t listSize,
- uint8_t pathMetricAppr) {
+int8_t polar_decoder(double *input,
+ uint32_t *out,
+ t_nrPolar_params *polarParams,
+ uint8_t listSize)
+{
//Assumes no a priori knowledge.
uint8_t ***bit = nr_alloc_uint8_3D_array(polarParams->N, (polarParams->n+1), 2*listSize);
uint8_t **bitUpdated = nr_alloc_uint8_2D_array(polarParams->N, (polarParams->n+1)); //0=False, 1=True
@@ -118,12 +117,12 @@ int8_t polar_decoder(
uint8_t listIndex[2*listSize], copyIndex;
for (uint16_t currentBit=0; currentBitN; currentBit++) {
- updateLLR(llr, llrUpdated, bit, bitUpdated, currentListSize, currentBit, 0, polarParams->N, (polarParams->n+1), pathMetricAppr);
+ updateLLR(llr, llrUpdated, bit, bitUpdated, currentListSize, currentBit, 0, polarParams->N, (polarParams->n+1));
if (polarParams->information_bit_pattern[currentBit]==0) { //Frozen bit.
- updatePathMetric(pathMetric, llr, currentListSize, 0, currentBit, pathMetricAppr); //approximation=0 --> 11b, approximation=1 --> 12
+ updatePathMetric(pathMetric, llr, currentListSize, 0, currentBit);
} else { //Information or CRC bit.
- updatePathMetric2(pathMetric, llr, currentListSize, currentBit, pathMetricAppr);
+ updatePathMetric2(pathMetric, llr, currentListSize, currentBit);
for (int i = 0; i < currentListSize; i++) {
for (int j = 0; j < polarParams->N; j++) {
@@ -293,567 +292,14 @@ int8_t polar_decoder(
/*
* Return bits.
*/
- //nr_byte2bit_uint8_32_t(polarParams->nr_polar_A, polarParams->payloadBits, out);
+ nr_byte2bit_uint8_32(polarParams->nr_polar_A, polarParams->payloadBits, out);
return(0);
}
-int8_t polar_decoder_aPriori(double *input,
- uint32_t *out,
- t_nrPolar_params *polarParams,
- uint8_t listSize,
- uint8_t pathMetricAppr,
- double *aPrioriPayload) {
- uint8_t ***bit = nr_alloc_uint8_3D_array(polarParams->N, (polarParams->n+1), 2*listSize);
- uint8_t **bitUpdated = nr_alloc_uint8_2D_array(polarParams->N, (polarParams->n+1)); //0=False, 1=True
- uint8_t **llrUpdated = nr_alloc_uint8_2D_array(polarParams->N, (polarParams->n+1)); //0=False, 1=True
- double ***llr = nr_alloc_double_3D_array(polarParams->N, (polarParams->n+1), 2*listSize);
- uint8_t **crcChecksum = nr_alloc_uint8_2D_array(polarParams->crcParityBits, 2*listSize);
- double *pathMetric = malloc(sizeof(double)*(2*listSize));
- uint8_t *crcState = malloc(sizeof(uint8_t)*(2*listSize)); //0=False, 1=True
-
- for (int i=0; i<(2*listSize); i++) {
- pathMetric[i] = 0;
- crcState[i]=1;
- }
-
- for (int i=0; iN; i++) {
- llrUpdated[i][polarParams->n]=1;
- bitUpdated[i][0]=((polarParams->information_bit_pattern[i]+1) % 2);
- }
-
- uint8_t **extended_crc_generator_matrix = malloc(polarParams->K * sizeof(uint8_t *)); //G_P3
- uint8_t **tempECGM = malloc(polarParams->K * sizeof(uint8_t *)); //G_P2
-
- for (int i = 0; i < polarParams->K; i++) {
- extended_crc_generator_matrix[i] = malloc(polarParams->crcParityBits * sizeof(uint8_t));
- tempECGM[i] = malloc(polarParams->crcParityBits * sizeof(uint8_t));
- }
-
- for (int i=0; ipayloadBits; i++) {
- for (int j=0; jcrcParityBits; j++) {
- tempECGM[i][j]=polarParams->crc_generator_matrix[i][j];
- }
- }
-
- for (int i=polarParams->payloadBits; iK; i++) {
- for (int j=0; jcrcParityBits; j++) {
- if( (i-polarParams->payloadBits) == j ) {
- tempECGM[i][j]=1;
- } else {
- tempECGM[i][j]=0;
- }
- }
- }
-
- for (int i=0; iK; i++) {
- for (int j=0; jcrcParityBits; j++) {
- extended_crc_generator_matrix[i][j]=tempECGM[polarParams->interleaving_pattern[i]][j];
- }
- }
-
- //The index of the last 1-valued bit that appears in each column.
- uint16_t last1ind[polarParams->crcParityBits];
-
- for (int j=0; jcrcParityBits; j++) {
- for (int i=0; iK; i++) {
- if (extended_crc_generator_matrix[i][j]==1) last1ind[j]=i;
- }
- }
-
- double *d_tilde = malloc(sizeof(double) * polarParams->N);
- nr_polar_rate_matching(input, d_tilde, polarParams->rate_matching_pattern, polarParams->K, polarParams->N, polarParams->encoderLength);
-
- for (int j = 0; j < polarParams->N; j++) llr[j][polarParams->n][0]=d_tilde[j];
-
- /*
- * SCL polar decoder.
- */
- uint32_t nonFrozenBit=0;
- uint8_t currentListSize=1;
- uint8_t decoderIterationCheck=0;
- int16_t checkCrcBits=-1;
- uint8_t listIndex[2*listSize], copyIndex;
-
- for (uint16_t currentBit=0; currentBitN; currentBit++) {
- updateLLR(llr, llrUpdated, bit, bitUpdated, currentListSize, currentBit, 0, polarParams->N, (polarParams->n+1), pathMetricAppr);
-
- if (polarParams->information_bit_pattern[currentBit]==0) { //Frozen bit.
- updatePathMetric(pathMetric, llr, currentListSize, 0, currentBit, pathMetricAppr); //approximation=0 --> 11b, approximation=1 --> 12
- } else { //Information or CRC bit.
- if ( (polarParams->interleaving_pattern[nonFrozenBit] <= polarParams->payloadBits) &&
- (aPrioriPayload[polarParams->interleaving_pattern[nonFrozenBit]] == 0) ) {
- //Information bit with known value of "0".
- updatePathMetric(pathMetric, llr, currentListSize, 0, currentBit, pathMetricAppr);
- bitUpdated[currentBit][0]=1; //0=False, 1=True
- } else if ( (polarParams->interleaving_pattern[nonFrozenBit] <= polarParams->payloadBits) &&
- (aPrioriPayload[polarParams->interleaving_pattern[nonFrozenBit]] == 1) ) {
- //Information bit with known value of "1".
- updatePathMetric(pathMetric, llr, currentListSize, 1, currentBit, pathMetricAppr);
-
- for (uint8_t i=0; icrcParityBits);
- } else {
- updatePathMetric2(pathMetric, llr, currentListSize, currentBit, pathMetricAppr);
-
- for (int i = 0; i < currentListSize; i++) {
- for (int j = 0; j < polarParams->N; j++) {
- for (int k = 0; k < (polarParams->n+1); k++) {
- bit[j][k][i+currentListSize]=bit[j][k][i];
- llr[j][k][i+currentListSize]=llr[j][k][i];
- }
- }
- }
-
- for (int i = 0; i < currentListSize; i++) {
- bit[currentBit][0][i]=0;
- crcState[i+currentListSize]=crcState[i];
- }
-
- for (int i = currentListSize; i < 2*currentListSize; i++) bit[currentBit][0][i]=1;
-
- bitUpdated[currentBit][0]=1;
- updateCrcChecksum2(crcChecksum, extended_crc_generator_matrix, currentListSize, nonFrozenBit, polarParams->crcParityBits);
- currentListSize*=2;
-
- //Keep only the best "listSize" number of entries.
- if (currentListSize > listSize) {
- for (uint8_t i = 0; i < 2*listSize; i++) listIndex[i]=i;
-
- nr_sort_asc_double_1D_array_ind(pathMetric, listIndex, currentListSize);
- //sort listIndex[listSize, ..., 2*listSize-1] in descending order.
- uint8_t swaps, tempInd;
-
- for (uint8_t i = 0; i < listSize; i++) {
- swaps = 0;
-
- for (uint8_t j = listSize; j < (2*listSize - i) - 1; j++) {
- if (listIndex[j+1] > listIndex[j]) {
- tempInd = listIndex[j];
- listIndex[j] = listIndex[j + 1];
- listIndex[j + 1] = tempInd;
- swaps++;
- }
- }
-
- if (swaps == 0)
- break;
- }
-
- //First, backup the best "listSize" number of entries.
- for (int k=(listSize-1); k>0; k--) {
- for (int i=0; iN; i++) {
- for (int j=0; j<(polarParams->n+1); j++) {
- bit[i][j][listIndex[(2*listSize-1)-k]]=bit[i][j][listIndex[k]];
- llr[i][j][listIndex[(2*listSize-1)-k]]=llr[i][j][listIndex[k]];
- }
- }
- }
-
- for (int k=(listSize-1); k>0; k--) {
- for (int i = 0; i < polarParams->crcParityBits; i++) {
- crcChecksum[i][listIndex[(2*listSize-1)-k]] = crcChecksum[i][listIndex[k]];
- }
- }
-
- for (int k=(listSize-1); k>0; k--) crcState[listIndex[(2*listSize-1)-k]]=crcState[listIndex[k]];
-
- //Copy the best "listSize" number of entries to the first indices.
- for (int k = 0; k < listSize; k++) {
- if (k > listIndex[k]) {
- copyIndex = listIndex[(2*listSize-1)-k];
- } else { //Use the backup.
- copyIndex = listIndex[k];
- }
-
- for (int i = 0; i < polarParams->N; i++) {
- for (int j = 0; j < (polarParams->n + 1); j++) {
- bit[i][j][k] = bit[i][j][copyIndex];
- llr[i][j][k] = llr[i][j][copyIndex];
- }
- }
- }
-
- for (int k = 0; k < listSize; k++) {
- if (k > listIndex[k]) {
- copyIndex = listIndex[(2*listSize-1)-k];
- } else { //Use the backup.
- copyIndex = listIndex[k];
- }
-
- for (int i = 0; i < polarParams->crcParityBits; i++) {
- crcChecksum[i][k]=crcChecksum[i][copyIndex];
- }
- }
-
- for (int k = 0; k < listSize; k++) {
- if (k > listIndex[k]) {
- copyIndex = listIndex[(2*listSize-1)-k];
- } else { //Use the backup.
- copyIndex = listIndex[k];
- }
-
- crcState[k]=crcState[copyIndex];
- }
-
- currentListSize = listSize;
- }
- }
-
- for (int i=0; icrcParityBits; i++) {
- if (last1ind[i]==nonFrozenBit) {
- checkCrcBits=i;
- break;
- }
- }
-
- if ( checkCrcBits > (-1) ) {
- for (uint8_t i = 0; i < currentListSize; i++) {
- if (crcChecksum[checkCrcBits][i]==1) {
- crcState[i]=0; //0=False, 1=True
- }
- }
- }
-
- for (uint8_t i = 0; i < currentListSize; i++) decoderIterationCheck+=crcState[i];
-
- if (decoderIterationCheck==0) {
- //perror("[SCL polar decoder] All list entries have failed the CRC checks.");
- free(d_tilde);
- free(pathMetric);
- free(crcState);
- nr_free_uint8_3D_array(bit, polarParams->N, (polarParams->n+1));
- nr_free_double_3D_array(llr, polarParams->N, (polarParams->n+1));
- nr_free_uint8_2D_array(crcChecksum, polarParams->crcParityBits);
- return(-1);
- }
-
- nonFrozenBit++;
- decoderIterationCheck=0;
- checkCrcBits=-1;
- }
- }
-
- for (uint8_t i = 0; i < 2*listSize; i++) listIndex[i]=i;
-
- nr_sort_asc_double_1D_array_ind(pathMetric, listIndex, currentListSize);
-
- for (uint8_t i = 0; i < fmin(listSize, (pow(2,polarParams->crcCorrectionBits)) ); i++) {
- if ( crcState[listIndex[i]] == 1 ) {
- for (int j = 0; j < polarParams->N; j++) polarParams->nr_polar_U[j]=bit[j][0][listIndex[i]];
-
- //Extract the information bits (û to ĉ)
- nr_polar_info_bit_extraction(polarParams->nr_polar_U, polarParams->nr_polar_CPrime, polarParams->information_bit_pattern, polarParams->N);
- //Deinterleaving (ĉ to b)
- nr_polar_deinterleaver(polarParams->nr_polar_CPrime, polarParams->nr_polar_B, polarParams->interleaving_pattern, polarParams->K);
-
- //Remove the CRC (â)
- for (int j = 0; j < polarParams->payloadBits; j++)
- polarParams->nr_polar_A[j]=polarParams->nr_polar_B[j];
-
- break;
- }
- }
-
- free(d_tilde);
- free(pathMetric);
- free(crcState);
- nr_free_uint8_3D_array(bit, polarParams->N, (polarParams->n+1));
- nr_free_double_3D_array(llr, polarParams->N, (polarParams->n+1));
- nr_free_uint8_2D_array(crcChecksum, polarParams->crcParityBits);
- nr_free_uint8_2D_array(extended_crc_generator_matrix, polarParams->K);
- nr_free_uint8_2D_array(tempECGM, polarParams->K);
- /*
- * Return bits.
- */
- nr_byte2bit_uint8_32_t(polarParams->nr_polar_A, polarParams->payloadBits, out);
- return(0);
-}
-
-
-
-int8_t polar_decoder_aPriori_timing(double *input,
- uint32_t *out,
- t_nrPolar_params *polarParams,
- uint8_t listSize,
- uint8_t pathMetricAppr,
- double *aPrioriPayload,
- double cpuFreqGHz,
- FILE *logFile) {
- uint8_t ***bit = nr_alloc_uint8_3D_array(polarParams->N, (polarParams->n+1), 2*listSize);
- uint8_t **bitUpdated = nr_alloc_uint8_2D_array(polarParams->N, (polarParams->n+1)); //0=False, 1=True
- uint8_t **llrUpdated = nr_alloc_uint8_2D_array(polarParams->N, (polarParams->n+1)); //0=False, 1=True
- double ***llr = nr_alloc_double_3D_array(polarParams->N, (polarParams->n+1), 2*listSize);
- uint8_t **crcChecksum = nr_alloc_uint8_2D_array(polarParams->crcParityBits, 2*listSize);
- double *pathMetric = malloc(sizeof(double)*(2*listSize));
- uint8_t *crcState = malloc(sizeof(uint8_t)*(2*listSize)); //0=False, 1=True
-
- for (int i=0; i<(2*listSize); i++) {
- pathMetric[i] = 0;
- crcState[i]=1;
- }
-
- for (int i=0; iN; i++) {
- llrUpdated[i][polarParams->n]=1;
- bitUpdated[i][0]=((polarParams->information_bit_pattern[i]+1) % 2);
- }
-
- uint8_t **extended_crc_generator_matrix = malloc(polarParams->K * sizeof(uint8_t *)); //G_P3
- uint8_t **tempECGM = malloc(polarParams->K * sizeof(uint8_t *)); //G_P2
-
- for (int i = 0; i < polarParams->K; i++) {
- extended_crc_generator_matrix[i] = malloc(polarParams->crcParityBits * sizeof(uint8_t));
- tempECGM[i] = malloc(polarParams->crcParityBits * sizeof(uint8_t));
- }
-
- for (int i=0; ipayloadBits; i++) {
- for (int j=0; jcrcParityBits; j++) {
- tempECGM[i][j]=polarParams->crc_generator_matrix[i][j];
- }
- }
-
- for (int i=polarParams->payloadBits; iK; i++) {
- for (int j=0; jcrcParityBits; j++) {
- if( (i-polarParams->payloadBits) == j ) {
- tempECGM[i][j]=1;
- } else {
- tempECGM[i][j]=0;
- }
- }
- }
-
- for (int i=0; iK; i++) {
- for (int j=0; jcrcParityBits; j++) {
- extended_crc_generator_matrix[i][j]=tempECGM[polarParams->interleaving_pattern[i]][j];
- }
- }
-
- //The index of the last 1-valued bit that appears in each column.
- uint16_t last1ind[polarParams->crcParityBits];
-
- for (int j=0; jcrcParityBits; j++) {
- for (int i=0; iK; i++) {
- if (extended_crc_generator_matrix[i][j]==1) last1ind[j]=i;
- }
- }
-
- double *d_tilde = malloc(sizeof(double) * polarParams->N);
- nr_polar_rate_matching(input, d_tilde, polarParams->rate_matching_pattern, polarParams->K, polarParams->N, polarParams->encoderLength);
-
- for (int j = 0; j < polarParams->N; j++) llr[j][polarParams->n][0]=d_tilde[j];
-
- /*
- * SCL polar decoder.
- */
- uint32_t nonFrozenBit=0;
- uint8_t currentListSize=1;
- uint8_t decoderIterationCheck=0;
- int16_t checkCrcBits=-1;
- uint8_t listIndex[2*listSize], copyIndex;
-
- for (uint16_t currentBit=0; currentBitN; currentBit++) {
- updateLLR(llr, llrUpdated, bit, bitUpdated, currentListSize, currentBit, 0, polarParams->N, (polarParams->n+1), pathMetricAppr);
-
- if (polarParams->information_bit_pattern[currentBit]==0) { //Frozen bit.
- updatePathMetric(pathMetric, llr, currentListSize, 0, currentBit, pathMetricAppr); //approximation=0 --> 11b, approximation=1 --> 12
- } else { //Information or CRC bit.
- if ( (polarParams->interleaving_pattern[nonFrozenBit] <= polarParams->payloadBits) &&
- (aPrioriPayload[polarParams->interleaving_pattern[nonFrozenBit]] == 0) ) {
- //Information bit with known value of "0".
- updatePathMetric(pathMetric, llr, currentListSize, 0, currentBit, pathMetricAppr);
- bitUpdated[currentBit][0]=1; //0=False, 1=True
- } else if ( (polarParams->interleaving_pattern[nonFrozenBit] <= polarParams->payloadBits) &&
- (aPrioriPayload[polarParams->interleaving_pattern[nonFrozenBit]] == 1) ) {
- //Information bit with known value of "1".
- updatePathMetric(pathMetric, llr, currentListSize, 1, currentBit, pathMetricAppr);
-
- for (uint8_t i=0; icrcParityBits);
- } else {
- updatePathMetric2(pathMetric, llr, currentListSize, currentBit, pathMetricAppr);
-
- for (int i = 0; i < currentListSize; i++) {
- for (int j = 0; j < polarParams->N; j++) {
- for (int k = 0; k < (polarParams->n+1); k++) {
- bit[j][k][i+currentListSize]=bit[j][k][i];
- llr[j][k][i+currentListSize]=llr[j][k][i];
- }
- }
- }
-
- for (int i = 0; i < currentListSize; i++) {
- bit[currentBit][0][i]=0;
- crcState[i+currentListSize]=crcState[i];
- }
-
- for (int i = currentListSize; i < 2*currentListSize; i++) bit[currentBit][0][i]=1;
-
- bitUpdated[currentBit][0]=1;
- updateCrcChecksum2(crcChecksum, extended_crc_generator_matrix, currentListSize, nonFrozenBit, polarParams->crcParityBits);
- currentListSize*=2;
-
- //Keep only the best "listSize" number of entries.
- if (currentListSize > listSize) {
- for (uint8_t i = 0; i < 2*listSize; i++) listIndex[i]=i;
-
- nr_sort_asc_double_1D_array_ind(pathMetric, listIndex, currentListSize);
- //sort listIndex[listSize, ..., 2*listSize-1] in descending order.
- uint8_t swaps, tempInd;
-
- for (uint8_t i = 0; i < listSize; i++) {
- swaps = 0;
-
- for (uint8_t j = listSize; j < (2*listSize - i) - 1; j++) {
- if (listIndex[j+1] > listIndex[j]) {
- tempInd = listIndex[j];
- listIndex[j] = listIndex[j + 1];
- listIndex[j + 1] = tempInd;
- swaps++;
- }
- }
-
- if (swaps == 0)
- break;
- }
-
- //First, backup the best "listSize" number of entries.
- for (int k=(listSize-1); k>0; k--) {
- for (int i=0; iN; i++) {
- for (int j=0; j<(polarParams->n+1); j++) {
- bit[i][j][listIndex[(2*listSize-1)-k]]=bit[i][j][listIndex[k]];
- llr[i][j][listIndex[(2*listSize-1)-k]]=llr[i][j][listIndex[k]];
- }
- }
- }
-
- for (int k=(listSize-1); k>0; k--) {
- for (int i = 0; i < polarParams->crcParityBits; i++) {
- crcChecksum[i][listIndex[(2*listSize-1)-k]] = crcChecksum[i][listIndex[k]];
- }
- }
-
- for (int k=(listSize-1); k>0; k--) crcState[listIndex[(2*listSize-1)-k]]=crcState[listIndex[k]];
-
- //Copy the best "listSize" number of entries to the first indices.
- for (int k = 0; k < listSize; k++) {
- if (k > listIndex[k]) {
- copyIndex = listIndex[(2*listSize-1)-k];
- } else { //Use the backup.
- copyIndex = listIndex[k];
- }
-
- for (int i = 0; i < polarParams->N; i++) {
- for (int j = 0; j < (polarParams->n + 1); j++) {
- bit[i][j][k] = bit[i][j][copyIndex];
- llr[i][j][k] = llr[i][j][copyIndex];
- }
- }
- }
-
- for (int k = 0; k < listSize; k++) {
- if (k > listIndex[k]) {
- copyIndex = listIndex[(2*listSize-1)-k];
- } else { //Use the backup.
- copyIndex = listIndex[k];
- }
-
- for (int i = 0; i < polarParams->crcParityBits; i++) {
- crcChecksum[i][k]=crcChecksum[i][copyIndex];
- }
- }
-
- for (int k = 0; k < listSize; k++) {
- if (k > listIndex[k]) {
- copyIndex = listIndex[(2*listSize-1)-k];
- } else { //Use the backup.
- copyIndex = listIndex[k];
- }
-
- crcState[k]=crcState[copyIndex];
- }
-
- currentListSize = listSize;
- }
- }
-
- for (int i=0; icrcParityBits; i++) {
- if (last1ind[i]==nonFrozenBit) {
- checkCrcBits=i;
- break;
- }
- }
-
- if ( checkCrcBits > (-1) ) {
- for (uint8_t i = 0; i < currentListSize; i++) {
- if (crcChecksum[checkCrcBits][i]==1) {
- crcState[i]=0; //0=False, 1=True
- }
- }
- }
-
- for (uint8_t i = 0; i < currentListSize; i++) decoderIterationCheck+=crcState[i];
-
- if (decoderIterationCheck==0) {
- //perror("[SCL polar decoder] All list entries have failed the CRC checks.");
- free(d_tilde);
- free(pathMetric);
- free(crcState);
- nr_free_uint8_3D_array(bit, polarParams->N, (polarParams->n+1));
- nr_free_double_3D_array(llr, polarParams->N, (polarParams->n+1));
- nr_free_uint8_2D_array(crcChecksum, polarParams->crcParityBits);
- return(-1);
- }
-
- nonFrozenBit++;
- decoderIterationCheck=0;
- checkCrcBits=-1;
- }
- }
-
- for (uint8_t i = 0; i < 2*listSize; i++) listIndex[i]=i;
-
- nr_sort_asc_double_1D_array_ind(pathMetric, listIndex, currentListSize);
-
- for (uint8_t i = 0; i < fmin(listSize, (pow(2,polarParams->crcCorrectionBits)) ); i++) {
- if ( crcState[listIndex[i]] == 1 ) {
- for (int j = 0; j < polarParams->N; j++) polarParams->nr_polar_U[j]=bit[j][0][listIndex[i]];
-
- //Extract the information bits (û to ĉ)
- nr_polar_info_bit_extraction(polarParams->nr_polar_U, polarParams->nr_polar_CPrime, polarParams->information_bit_pattern, polarParams->N);
- //Deinterleaving (ĉ to b)
- nr_polar_deinterleaver(polarParams->nr_polar_CPrime, polarParams->nr_polar_B, polarParams->interleaving_pattern, polarParams->K);
-
- //Remove the CRC (â)
- for (int j = 0; j < polarParams->payloadBits; j++) polarParams->nr_polar_A[j]=polarParams->nr_polar_B[j];
-
- break;
- }
- }
-
- free(d_tilde);
- free(pathMetric);
- free(crcState);
- nr_free_uint8_3D_array(bit, polarParams->N, (polarParams->n+1));
- nr_free_double_3D_array(llr, polarParams->N, (polarParams->n+1));
- nr_free_uint8_2D_array(crcChecksum, polarParams->crcParityBits);
- nr_free_uint8_2D_array(extended_crc_generator_matrix, polarParams->K);
- nr_free_uint8_2D_array(tempECGM, polarParams->K);
- /*
- * Return bits.
- */
- nr_byte2bit_uint8_32_t(polarParams->nr_polar_A, polarParams->payloadBits, out);
- return(0);
-}
-
-
int8_t polar_decoder_dci(double *input,
uint32_t *out,
t_nrPolar_params *polarParams,
uint8_t listSize,
- uint8_t pathMetricAppr,
uint16_t n_RNTI) {
uint8_t ***bit = nr_alloc_uint8_3D_array(polarParams->N, (polarParams->n+1), 2*listSize);
uint8_t **bitUpdated = nr_alloc_uint8_2D_array(polarParams->N, (polarParams->n+1)); //0=False, 1=True
@@ -941,12 +387,12 @@ int8_t polar_decoder_dci(double *input,
uint8_t listIndex[2*listSize], copyIndex;
for (uint16_t currentBit=0; currentBitN; currentBit++) {
- updateLLR(llr, llrUpdated, bit, bitUpdated, currentListSize, currentBit, 0, polarParams->N, (polarParams->n+1), pathMetricAppr);
+ updateLLR(llr, llrUpdated, bit, bitUpdated, currentListSize, currentBit, 0, polarParams->N, (polarParams->n+1));
if (polarParams->information_bit_pattern[currentBit]==0) { //Frozen bit.
- updatePathMetric(pathMetric, llr, currentListSize, 0, currentBit, pathMetricAppr); //approximation=0 --> 11b, approximation=1 --> 12
+ updatePathMetric(pathMetric, llr, currentListSize, 0, currentBit);
} else { //Information or CRC bit.
- updatePathMetric2(pathMetric, llr, currentListSize, currentBit, pathMetricAppr);
+ updatePathMetric2(pathMetric, llr, currentListSize, currentBit);
for (int i = 0; i < currentListSize; i++) {
for (int j = 0; j < polarParams->N; j++) {
@@ -1116,7 +562,7 @@ int8_t polar_decoder_dci(double *input,
/*
* Return bits.
*/
- nr_byte2bit_uint8_32_t(polarParams->nr_polar_A, polarParams->payloadBits, out);
+ nr_byte2bit_uint8_32(polarParams->nr_polar_A, polarParams->payloadBits, out);
return(0);
}
diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c b/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c
index a1a17a9d9e..bf8a90e0d9 100644
--- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c
+++ b/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c
@@ -37,27 +37,26 @@
//#define DEBUG_NEW_IMPL 1
void updateLLR(double ***llr,
- uint8_t **llrU,
- uint8_t ***bit,
- uint8_t **bitU,
- uint8_t listSize,
- uint16_t row,
- uint16_t col,
- uint16_t xlen,
- uint8_t ylen,
- uint8_t approximation)
+ uint8_t **llrU,
+ uint8_t ***bit,
+ uint8_t **bitU,
+ uint8_t listSize,
+ uint16_t row,
+ uint16_t col,
+ uint16_t xlen,
+ uint8_t ylen)
{
uint16_t offset = (xlen/(pow(2,(ylen-col-1))));
for (uint8_t i=0; i= offset ) {
if(bitU[row-offset][col]==0) updateBit(bit, bitU, listSize, (row-offset), col, xlen, ylen);
- if(llrU[row-offset][col+1]==0) updateLLR(llr, llrU, bit, bitU, listSize, (row-offset), (col+1), xlen, ylen, approximation);
- if(llrU[row][col+1]==0) updateLLR(llr, llrU, bit, bitU, listSize, row, (col+1), xlen, ylen, approximation);
+ if(llrU[row-offset][col+1]==0) updateLLR(llr, llrU, bit, bitU, listSize, (row-offset), (col+1), xlen, ylen);
+ if(llrU[row][col+1]==0) updateLLR(llr, llrU, bit, bitU, listSize, row, (col+1), xlen, ylen);
llr[row][col][i] = (pow((-1),bit[row-offset][col][i])*llr[row-offset][col+1][i]) + llr[row][col+1][i];
} else {
- if(llrU[row][col+1]==0) updateLLR(llr, llrU, bit, bitU, listSize, row, (col+1), xlen, ylen, approximation);
- if(llrU[row+offset][col+1]==0) updateLLR(llr, llrU, bit, bitU, listSize, (row+offset), (col+1), xlen, ylen, approximation);
- computeLLR(llr, row, col, i, offset, approximation);
+ if(llrU[row][col+1]==0) updateLLR(llr, llrU, bit, bitU, listSize, row, (col+1), xlen, ylen);
+ if(llrU[row+offset][col+1]==0) updateLLR(llr, llrU, bit, bitU, listSize, (row+offset), (col+1), xlen, ylen);
+ computeLLR(llr, row, col, i, offset);
}
}
llrU[row][col]=1;
@@ -73,7 +72,6 @@ void updateBit(uint8_t ***bit,
uint16_t xlen,
uint8_t ylen)
{
-
uint16_t offset = ( xlen/(pow(2,(ylen-col))) );
for (uint8_t i=0; ibeta = (int16_t*)malloc16(node->Nv*sizeof(int16_t));
memset((void*)node->beta,-1,node->Nv*sizeof(int16_t));
-
return(node);
}
-decoder_node_t *add_nodes(int level,int first_leaf_index,t_nrPolar_params *pp) {
+decoder_node_t *add_nodes(int level, int first_leaf_index, t_nrPolar_params *polarParams) {
- int all_frozen_below=1;
+ int all_frozen_below = 1;
int Nv = 1<tree.num_nodes,Nv,level);
+ printf("New node %d order %d, level %d\n",polarParams->tree.num_nodes,Nv,level);
#endif
- pp->tree.num_nodes++;
+ polarParams->tree.num_nodes++;
if (level==0) {
#ifdef DEBUG_NEW_IMPL
- printf("leaf %d (%s)\n",first_leaf_index,pp->information_bit_pattern[first_leaf_index]==1 ? "information or crc" : "frozen");
+ printf("leaf %d (%s)\n", first_leaf_index, polarParams->information_bit_pattern[first_leaf_index]==1 ? "information or crc" : "frozen");
#endif
new_node->leaf=1;
- new_node->all_frozen = pp->information_bit_pattern[first_leaf_index]==0 ? 1 : 0;
+ new_node->all_frozen = polarParams->information_bit_pattern[first_leaf_index]==0 ? 1 : 0;
return new_node; // this is a leaf node
}
for (int i=0;iinformation_bit_pattern[i+first_leaf_index]>0) all_frozen_below=0;
+ if (polarParams->information_bit_pattern[i+first_leaf_index]>0)
+ all_frozen_below=0;
}
- if (all_frozen_below==0) new_node->left=add_nodes(level-1,first_leaf_index,pp);
+
+ if (all_frozen_below==0)
+ new_node->left=add_nodes(level-1, first_leaf_index, polarParams);
else {
#ifdef DEBUG_NEW_IMPL
printf("aggregating frozen bits %d ... %d at level %d (%s)\n",first_leaf_index,first_leaf_index+Nv-1,level,((first_leaf_index/Nv)&1)==0?"left":"right");
@@ -241,21 +210,22 @@ decoder_node_t *add_nodes(int level,int first_leaf_index,t_nrPolar_params *pp) {
new_node->leaf=1;
new_node->all_frozen=1;
}
- if (all_frozen_below==0) new_node->right=add_nodes(level-1,first_leaf_index+(Nv/2),pp);
+ if (all_frozen_below==0)
+ new_node->right=add_nodes(level-1,first_leaf_index+(Nv/2),polarParams);
#ifdef DEBUG_NEW_IMPL
printf("new_node (%d): first_leaf_index %d, left %p, right %p\n",Nv,first_leaf_index,new_node->left,new_node->right);
-#endif
+#endif
+
return(new_node);
}
-
-void build_decoder_tree(t_nrPolar_params *pp) {
-
- pp->tree.num_nodes=0;
- pp->tree.root = add_nodes(pp->n,0,pp);
+void build_decoder_tree(t_nrPolar_params *polarParams)
+{
+ polarParams->tree.num_nodes=0;
+ polarParams->tree.root = add_nodes(polarParams->n,0,polarParams);
#ifdef DEBUG_NEW_IMPL
- printf("root : left %p, right %p\n",pp->tree.root->left,pp->tree.root->right);
+ printf("root : left %p, right %p\n",polarParams->tree.root->left,polarParams->tree.root->right);
#endif
}
@@ -271,7 +241,7 @@ void build_decoder_tree(t_nrPolar_params *pp) {
#define _mm_subs_pi16(a,b) vsub_s16(a,b)
#endif
-void applyFtoleft(t_nrPolar_params *pp,decoder_node_t *node) {
+void applyFtoleft(const t_nrPolar_params *pp, decoder_node_t *node) {
int16_t *alpha_v=node->alpha;
int16_t *alpha_l=node->left->alpha;
int16_t *betal = node->left->beta;
@@ -368,18 +338,18 @@ void applyFtoleft(t_nrPolar_params *pp,decoder_node_t *node) {
else
#endif
- { // equvalent scalar code to above, activated only on non x86/ARM architectures
+ { // equivalent scalar code to above, activated only on non x86/ARM architectures
for (int i=0;iNv/2;i++) {
- a=alpha_v[i];
- b=alpha_v[i+(node->Nv/2)];
- maska=a>>15;
- maskb=b>>15;
- absa=(a+maska)^maska;
- absb=(b+maskb)^maskb;
- minabs = absaNv/2)];
+ maska=a>>15;
+ maskb=b>>15;
+ absa=(a+maska)^maska;
+ absb=(b+maskb)^maskb;
+ minabs = absaNv == 2) { // apply hard decision on left node
betal[0] = (alpha_l[0]>0) ? -1 : 1;
@@ -394,7 +364,7 @@ void applyFtoleft(t_nrPolar_params *pp,decoder_node_t *node) {
}
}
-void applyGtoright(t_nrPolar_params *pp,decoder_node_t *node) {
+void applyGtoright(const t_nrPolar_params *pp,decoder_node_t *node) {
int16_t *alpha_v=node->alpha;
int16_t *alpha_r=node->right->alpha;
@@ -448,7 +418,7 @@ void applyGtoright(t_nrPolar_params *pp,decoder_node_t *node) {
}
else
#endif
- {// equvalent scalar code to above, activated only on non x86/ARM architectures or Nv=1,2
+ {// equivalent scalar code to above, activated only on non x86/ARM architectures or Nv=1,2
for (int i=0;iNv/2;i++) {
alpha_r[i] = alpha_v[i+(node->Nv/2)] - (betal[i]*alpha_v[i]);
}
@@ -463,13 +433,9 @@ void applyGtoright(t_nrPolar_params *pp,decoder_node_t *node) {
}
}
+int16_t all1[16] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
-int16_t all1[16] = {1,1,1,1,
- 1,1,1,1,
- 1,1,1,1,
- 1,1,1,1};
-
-void computeBeta(t_nrPolar_params *pp,decoder_node_t *node) {
+void computeBeta(const t_nrPolar_params *pp,decoder_node_t *node) {
int16_t *betav = node->beta;
int16_t *betal = node->left->beta;
@@ -504,38 +470,37 @@ void computeBeta(t_nrPolar_params *pp,decoder_node_t *node) {
int ssr4len = node->Nv/2/8;
register __m128i allones=*((__m128i*)all1);
for (int i=0;iNv/2;i++) {
- betav[i] = (betal[i] != betar[i]) ? 1 : -1;
+ betav[i] = (betal[i] != betar[i]) ? 1 : -1;
}
}
}
else memcpy((void*)&betav[0],betar,(node->Nv/2)*sizeof(int16_t));
memcpy((void*)&betav[node->Nv/2],betar,(node->Nv/2)*sizeof(int16_t));
-
}
void generic_polar_decoder(const t_nrPolar_params *pp,decoder_node_t *node) {
// Apply F to left
- applyFtoleft(pp,node);
+ applyFtoleft(pp, node);
// if left is not a leaf recurse down to the left
- if (node->left->leaf==0) generic_polar_decoder(pp,node->left);
+ if (node->left->leaf==0)
+ generic_polar_decoder(pp, node->left);
- applyGtoright(pp,node);
- if (node->right->leaf==0) generic_polar_decoder(pp,node->right);
+ applyGtoright(pp, node);
+ if (node->right->leaf==0) generic_polar_decoder(pp, node->right);
- computeBeta(pp,node);
+ computeBeta(pp, node);
}
+
diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_defs.h b/openair1/PHY/CODING/nrPolar_tools/nr_polar_defs.h
index 39c2620406..2c37462f75 100644
--- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_defs.h
+++ b/openair1/PHY/CODING/nrPolar_tools/nr_polar_defs.h
@@ -21,11 +21,11 @@
/*!\file PHY/CODING/nrPolar_tools/nr_polar_defs.h
* \brief
- * \author Turker Yilmaz
+ * \author Raymond Knopp, Turker Yilmaz
* \date 2018
* \version 0.1
* \company EURECOM
- * \email turker.yilmaz@eurecom.fr
+ * \email raymond.knopp@eurecom.fr, turker.yilmaz@eurecom.fr
* \note
* \warning
*/
@@ -46,7 +46,6 @@
//#include "SIMULATION/TOOLS/sim.h"
#define NR_POLAR_DECODER_LISTSIZE 8 //uint8_t
-#define NR_POLAR_DECODER_PATH_METRIC_APPROXIMATION 0 //uint8_t; 0 --> eq. (8a) and (11b), 1 --> eq. (9) and (12)
#define NR_POLAR_AGGREGATION_LEVEL_1_PRIME 149 //uint16_t
#define NR_POLAR_AGGREGATION_LEVEL_2_PRIME 151 //uint16_t
@@ -54,12 +53,13 @@
#define NR_POLAR_AGGREGATION_LEVEL_8_PRIME 163 //uint16_t
#define NR_POLAR_AGGREGATION_LEVEL_16_PRIME 167 //uint16_t
-static const uint8_t nr_polar_subblock_interleaver_pattern[32] = { 0, 1, 2, 4, 3, 5, 6, 7, 8, 16, 9, 17, 10, 18, 11, 19, 12, 20, 13, 21, 14, 22, 15, 23, 24, 25, 26, 28, 27, 29, 30, 31 };
-
+static const uint8_t nr_polar_subblock_interleaver_pattern[32] = {0,1,2,4,3,5,6,7,8,16,9,17,10,18,11,19,12,20,13,21,14,22,15,23,24,25,26,28,27,29,30,31};
#define Nmax 1024
#define nmax 10
+#define uint128_t __uint128_t
+
typedef struct decoder_node_t_s {
struct decoder_node_t_s *left;
struct decoder_node_t_s *right;
@@ -106,18 +106,17 @@ struct nrPolar_params {
int16_t *Q_PC_N;
uint8_t *information_bit_pattern;
uint16_t *channel_interleaver_pattern;
- uint32_t crc_polynomial;
+ //uint32_t crc_polynomial;
uint8_t **crc_generator_matrix; //G_P
uint8_t **G_N;
uint64_t **G_N_tab;
int groupsize;
- int *rm_tab;
+ int *rm_tab;
uint64_t cprime_tab0[32][256];
uint64_t cprime_tab1[32][256];
uint64_t B_tab0[32][256];
uint64_t B_tab1[32][256];
- uint32_t *crc256Table;
uint8_t **extended_crc_generator_matrix;
//lowercase: bits, Uppercase: Bits stored in bytes
//polar_encoder vectors
@@ -152,40 +151,31 @@ void polar_encoder_fast(uint64_t *A,
t_nrPolar_params *polarParams);
int8_t polar_decoder(double *input,
- uint8_t *output,
+ uint32_t *output,
t_nrPolar_params *polarParams,
- uint8_t listSize,
- uint8_t pathMetricAppr);
+ uint8_t listSize);
uint32_t polar_decoder_int16(int16_t *input,
uint64_t *out,
const t_nrPolar_params *polarParams);
-int8_t polar_decoder_aPriori(double *input,
- uint32_t *output,
- t_nrPolar_params *polarParams,
- uint8_t listSize,
- uint8_t pathMetricAppr,
- double *aPrioriPayload);
-
-int8_t polar_decoder_aPriori_timing(double *input,
- uint32_t *output,
- t_nrPolar_params *polarParams,
- uint8_t listSize,
- uint8_t pathMetricAppr,
- double *aPrioriPayload,
- double cpuFreqGHz,
- FILE *logFile);
-
int8_t polar_decoder_dci(double *input,
uint32_t *out,
t_nrPolar_params *polarParams,
uint8_t listSize,
- uint8_t pathMetricAppr,
uint16_t n_RNTI);
-void generic_polar_decoder(const t_nrPolar_params *,
- decoder_node_t *);
+void generic_polar_decoder(const t_nrPolar_params *pp,
+ decoder_node_t *node);
+
+void applyFtoleft(const t_nrPolar_params *pp,
+ decoder_node_t *node);
+
+void applyGtoright(const t_nrPolar_params *pp,
+ decoder_node_t *node);
+
+void computeBeta(const t_nrPolar_params *pp,
+ decoder_node_t *node);
void build_decoder_tree(t_nrPolar_params *pp);
void build_polar_tables(t_nrPolar_params *polarParams);
@@ -193,9 +183,9 @@ void init_polar_deinterleaver_table(t_nrPolar_params *polarParams);
void nr_polar_print_polarParams(t_nrPolar_params *polarParams);
-t_nrPolar_params *nr_polar_params ( int8_t messageType,
- uint16_t messageLength,
- uint8_t aggregation_level);
+t_nrPolar_params *nr_polar_params (int8_t messageType,
+ uint16_t messageLength,
+ uint8_t aggregation_level);
uint16_t nr_polar_aggregation_prime (uint8_t aggregation_level);
@@ -256,17 +246,19 @@ void nr_polar_info_bit_extraction(uint8_t *input,
uint8_t *pattern,
uint16_t size);
-void nr_bit2byte_uint32_8_t(uint32_t *in,
- uint16_t arraySize,
- uint8_t *out);
+void nr_bit2byte_uint32_8(uint32_t *in,
+ uint16_t arraySize,
+ uint8_t *out);
-void nr_byte2bit_uint8_32_t(uint8_t *in,
- uint16_t arraySize,
- uint32_t *out);
+void nr_byte2bit_uint8_32(uint8_t *in,
+ uint16_t arraySize,
+ uint32_t *out);
-void nr_crc_bit2bit_uint32_8_t(uint32_t *in,
- uint16_t arraySize,
- uint8_t *out);
+uint8_t **crc24c_generator_matrix(uint16_t payloadSizeBits);
+
+uint8_t **crc11_generator_matrix(uint16_t payloadSizeBits);
+
+uint8_t **crc6_generator_matrix(uint16_t payloadSizeBits);
void nr_polar_bit_insertion(uint8_t *input,
uint8_t *output,
@@ -320,7 +312,6 @@ void nr_sort_asc_int16_1D_array_ind(int32_t *matrix,
void nr_free_double_2D_array(double **input, uint16_t xlen);
-
void updateLLR(double ***llr,
uint8_t **llrU,
uint8_t ***bit,
@@ -329,8 +320,7 @@ void updateLLR(double ***llr,
uint16_t row,
uint16_t col,
uint16_t xlen,
- uint8_t ylen,
- uint8_t approximation);
+ uint8_t ylen);
void updateBit(uint8_t ***bit,
uint8_t **bitU,
@@ -344,21 +334,18 @@ void updatePathMetric(double *pathMetric,
double ***llr,
uint8_t listSize,
uint8_t bitValue,
- uint16_t row,
- uint8_t approximation);
+ uint16_t row);
void updatePathMetric2(double *pathMetric,
double ***llr,
uint8_t listSize,
- uint16_t row,
- uint8_t approximation);
+ uint16_t row);
void computeLLR(double ***llr,
uint16_t row,
uint16_t col,
uint8_t i,
- uint16_t offset,
- uint8_t approximation);
+ uint16_t offset);
void updateCrcChecksum(uint8_t **crcChecksum,
uint8_t **crcGen,
@@ -372,12 +359,6 @@ void updateCrcChecksum2(uint8_t **crcChecksum,
uint32_t i2,
uint8_t len);
-uint8_t **crc24c_generator_matrix(uint16_t payloadSizeBits);
-
-uint8_t **crc11_generator_matrix(uint16_t payloadSizeBits);
-
-uint8_t **crc6_generator_matrix(uint16_t payloadSizeBits);
-
//Also nr_polar_rate_matcher
static inline void nr_polar_interleaver(uint8_t *input,
uint8_t *output,
@@ -387,14 +368,10 @@ static inline void nr_polar_interleaver(uint8_t *input,
}
static inline void nr_polar_deinterleaver(uint8_t *input,
- uint8_t *output,
- uint16_t *pattern,
- uint16_t size) {
- for (int i=0; i
//input [a_31 a_30 ... a_0]
//output [f_31 f_30 ... f_0] [f_63 f_62 ... f_32] ...
@@ -43,23 +44,23 @@
void polar_encoder(uint32_t *in,
uint32_t *out,
t_nrPolar_params *polarParams) {
- if (polarParams->idx == 0) { //PBCH
+ if (1) {//polarParams->idx == 0 || polarParams->idx == 1) { //PBCH or PDCCH
/*
uint64_t B = (((uint64_t)*in)&((((uint64_t)1)<<32)-1)) | (((uint64_t)crc24c((uint8_t*)in,polarParams->payloadBits)>>8)<payloadBits);
#ifdef DEBUG_POLAR_ENCODER
printf("polar_B %llx (crc %x)\n",B,crc24c((uint8_t*)in,polarParams->payloadBits)>>8);
#endif
nr_bit2byte_uint32_8_t((uint32_t*)&B, polarParams->K, polarParams->nr_polar_B);*/
- nr_bit2byte_uint32_8_t((uint32_t *)in, polarParams->payloadBits, polarParams->nr_polar_A);
+ nr_bit2byte_uint32_8(in, polarParams->payloadBits, polarParams->nr_polar_A);
/*
* Bytewise operations
*/
//Calculate CRC.
nr_matrix_multiplication_uint8_1D_uint8_2D(polarParams->nr_polar_A,
- polarParams->crc_generator_matrix,
- polarParams->nr_polar_crc,
- polarParams->payloadBits,
- polarParams->crcParityBits);
+ polarParams->crc_generator_matrix,
+ polarParams->nr_polar_crc,
+ polarParams->payloadBits,
+ polarParams->crcParityBits);
for (uint8_t i = 0; i < polarParams->crcParityBits; i++)
polarParams->nr_polar_crc[i] = (polarParams->nr_polar_crc[i] % 2);
@@ -77,6 +78,8 @@ void polar_encoder(uint32_t *in,
for (int i = 0; iK; i++) B2 = B2 | ((uint64_t)polarParams->nr_polar_B[i] << i);
printf("polar_B %llx\n",B2);
+ for (int i=0; i< polarParams->payloadBits; i++) printf("a[%d]=%d\n", i, polarParams->nr_polar_A[i]);
+ for (int i=0; i< polarParams->K; i++) printf("b[%d]=%d\n", i, polarParams->nr_polar_B[i]);
#endif
/* for (int j=0;jcrcParityBits;j++) {
for (int i=0;ipayloadBits;i++)
@@ -115,10 +118,10 @@ void polar_encoder(uint32_t *in,
polarParams->nr_polar_U[247]=1;
polarParams->nr_polar_U[253]=1;*/
nr_matrix_multiplication_uint8_1D_uint8_2D(polarParams->nr_polar_U,
- polarParams->G_N,
- polarParams->nr_polar_D,
- polarParams->N,
- polarParams->N);
+ polarParams->G_N,
+ polarParams->nr_polar_D,
+ polarParams->N,
+ polarParams->N);
for (uint16_t i = 0; i < polarParams->N; i++)
polarParams->nr_polar_D[i] = (polarParams->nr_polar_D[i] % 2);
@@ -146,7 +149,7 @@ void polar_encoder(uint32_t *in,
for (int i=0; i< polarParams->encoderLength; i++) printf("f[%d]=%d\n", i, polarParams->nr_polar_E[i]);
#endif
- nr_byte2bit_uint8_32_t(polarParams->nr_polar_E, polarParams->encoderLength, out);
+ nr_byte2bit_uint8_32(polarParams->nr_polar_E, polarParams->encoderLength, out);
}
void polar_encoder_dci(uint32_t *in,
@@ -160,7 +163,7 @@ void polar_encoder_dci(uint32_t *in,
* Bytewise operations
*/
//(a to a')
- nr_bit2byte_uint32_8_t(in, polarParams->payloadBits, polarParams->nr_polar_A);
+ nr_bit2byte_uint32_8(in, polarParams->payloadBits, polarParams->nr_polar_A);
for (int i=0; icrcParityBits; i++) polarParams->nr_polar_APrime[i]=1;
@@ -168,35 +171,29 @@ void polar_encoder_dci(uint32_t *in,
#ifdef DEBUG_POLAR_ENCODER_DCI
printf("[polar_encoder_dci] A: ");
-
for (int i=0; ipayloadBits; i++) printf("%d-", polarParams->nr_polar_A[i]);
-
printf("\n");
+
printf("[polar_encoder_dci] APrime: ");
-
for (int i=0; iK; i++) printf("%d-", polarParams->nr_polar_APrime[i]);
-
printf("\n");
+
printf("[polar_encoder_dci] GP: ");
-
for (int i=0; icrcParityBits; i++) printf("%d-", polarParams->crc_generator_matrix[0][i]);
-
printf("\n");
#endif
//Calculate CRC.
nr_matrix_multiplication_uint8_1D_uint8_2D(polarParams->nr_polar_APrime,
- polarParams->crc_generator_matrix,
- polarParams->nr_polar_crc,
- polarParams->K,
- polarParams->crcParityBits);
+ polarParams->crc_generator_matrix,
+ polarParams->nr_polar_crc,
+ polarParams->K,
+ polarParams->crcParityBits);
for (uint8_t i = 0; i < polarParams->crcParityBits; i++) polarParams->nr_polar_crc[i] = (polarParams->nr_polar_crc[i] % 2);
#ifdef DEBUG_POLAR_ENCODER_DCI
printf("[polar_encoder_dci] CRC: ");
-
for (int i=0; icrcParityBits; i++) printf("%d-", polarParams->nr_polar_crc[i]);
-
printf("\n");
#endif
@@ -208,55 +205,16 @@ void polar_encoder_dci(uint32_t *in,
polarParams->nr_polar_B[i]= polarParams->nr_polar_crc[i-(polarParams->payloadBits)];
//Scrambling (b to c)
- for (int i=0; i<16; i++) {
- polarParams->nr_polar_B[polarParams->payloadBits+8+i] =
- ( polarParams->nr_polar_B[polarParams->payloadBits+8+i] + ((n_RNTI>>(15-i))&1) ) % 2;
- }
+ for (int i=0; i<16; i++)
+ polarParams->nr_polar_B[polarParams->payloadBits+8+i]=( polarParams->nr_polar_B[polarParams->payloadBits+8+i] + ((n_RNTI>>(15-i))&1) ) % 2;
- /* //(a to a')
- nr_crc_bit2bit_uint32_8_t(in, polarParams->payloadBits, polarParams->nr_polar_aPrime);
- //Parity bits computation (p)
- polarParams->crcBit = crc24c(polarParams->nr_polar_aPrime, (polarParams->payloadBits+polarParams->crcParityBits));
- #ifdef DEBUG_POLAR_ENCODER_DCI
- printf("[polar_encoder_dci] crc: 0x%08x\n", polarParams->crcBit);
- for (int i=0; i<32; i++)
- {
- printf("%d\n",((polarParams->crcBit)>>i)&1);
- }
- #endif
- //(a to b)
- //
- // Bytewise operations
- //
- uint8_t arrayInd = ceil(polarParams->payloadBits / 8.0);
- for (int i=0; inr_polar_B[j+(i*8)] = ((polarParams->nr_polar_aPrime[3+i]>>(7-j)) & 1);
- }
- }
- for (int i=0; i<((polarParams->payloadBits)%8); i++) {
- polarParams->nr_polar_B[i+(arrayInd-1)*8] = ((polarParams->nr_polar_aPrime[3+(arrayInd-1)]>>(7-i)) & 1);
- }
- for (int i=0; i<8; i++) {
- polarParams->nr_polar_B[polarParams->payloadBits+i] = ((polarParams->crcBit)>>(31-i))&1;
- }
- //Scrambling (b to c)
- for (int i=0; i<16; i++) {
- polarParams->nr_polar_B[polarParams->payloadBits+8+i] =
- ( (((polarParams->crcBit)>>(23-i))&1) + ((n_RNTI>>(15-i))&1) ) % 2;
- }*/
#ifdef DEBUG_POLAR_ENCODER_DCI
printf("[polar_encoder_dci] B: ");
-
for (int i = 0; i < polarParams->K; i++) printf("%d-", polarParams->nr_polar_B[i]);
-
printf("\n");
#endif
//Interleaving (c to c')
- nr_polar_interleaver(polarParams->nr_polar_B,
- polarParams->nr_polar_CPrime,
- polarParams->interleaving_pattern,
- polarParams->K);
+ nr_polar_interleaver(polarParams->nr_polar_B, polarParams->nr_polar_CPrime, polarParams->interleaving_pattern, polarParams->K);
//Bit insertion (c' to u)
nr_polar_bit_insertion(polarParams->nr_polar_CPrime,
polarParams->nr_polar_U,
@@ -267,13 +225,11 @@ void polar_encoder_dci(uint32_t *in,
polarParams->n_pc);
//Encoding (u to d)
nr_matrix_multiplication_uint8_1D_uint8_2D(polarParams->nr_polar_U,
- polarParams->G_N,
- polarParams->nr_polar_D,
- polarParams->N,
- polarParams->N);
-
- for (uint16_t i = 0; i < polarParams->N; i++)
- polarParams->nr_polar_D[i] = (polarParams->nr_polar_D[i] % 2);
+ polarParams->G_N,
+ polarParams->nr_polar_D,
+ polarParams->N,
+ polarParams->N);
+ for (uint16_t i = 0; i < polarParams->N; i++) polarParams->nr_polar_D[i] = (polarParams->nr_polar_D[i] % 2);
//Rate matching
//Sub-block interleaving (d to y) and Bit selection (y to e)
@@ -284,28 +240,54 @@ void polar_encoder_dci(uint32_t *in,
/*
* Return bits.
*/
- nr_byte2bit_uint8_32_t(polarParams->nr_polar_E, polarParams->encoderLength, out);
+ nr_byte2bit_uint8_32(polarParams->nr_polar_E, polarParams->encoderLength, out);
#ifdef DEBUG_POLAR_ENCODER_DCI
printf("[polar_encoder_dci] E: ");
-
for (int i = 0; i < polarParams->encoderLength; i++) printf("%d-", polarParams->nr_polar_E[i]);
uint8_t outputInd = ceil(polarParams->encoderLength / 32.0);
printf("\n[polar_encoder_dci] out: ");
-
- for (int i = 0; i < outputInd; i++) {
- printf("[%d]->0x%08x\t", i, out[i]);
- }
-
+ for (int i = 0; i < outputInd; i++) printf("[%d]->0x%08x\t", i, out[i]);
#endif
}
static inline void polar_rate_matching(t_nrPolar_params *polarParams,void *in,void *out) __attribute__((always_inline));
static inline void polar_rate_matching(t_nrPolar_params *polarParams,void *in,void *out) {
- if (polarParams->groupsize == 8)
+
+ // handle rate matching with a single 128 bit word using bit shuffling
+ // can be done with SIMD intrisics if needed
+ if (polarParams->groupsize < 8) {
+ AssertFatal(polarParams->encoderLength<=128,"Need to handle groupsize<8 and N>128\n");
+ uint128_t *out128=(uint128_t*)out;
+ uint128_t *in128=(uint128_t*)in;
+ *out128=0;
+ uint128_t tmp0;
+#ifdef DEBUG_POLAR_ENCODER
+ uint128_t tmp1;
+#endif
+ for (int i=0; iencoderLength; i++) {
+#ifdef DEBUG_POLAR_ENCODER
+ printf("%u<-%u : %llx.%llx =>",i,polarParams->rate_matching_pattern[i],((uint64_t *)out)[1],((uint64_t *)out)[0]);
+#endif
+ tmp0 = (*in128&(((uint128_t)1)<rate_matching_pattern[i]));
+ if (tmp0!=0) {
+ *out128 = *out128 | ((uint128_t)1)<%llx.%llx => %llx.%llx\n",
+ ((uint64_t *)&tmp0)[1],((uint64_t *)&tmp0)[0],
+ ((uint64_t *)&tmp1)[1],((uint64_t *)&tmp1)[0],
+ ((uint64_t *)out)[1],((uint64_t *)out)[0]);
+#endif
+ }
+ }
+
+ }
+ // These are based on LUTs for byte and short word groups
+ else if (polarParams->groupsize == 8)
for (int i=0; iencoderLength>>3; i++) ((uint8_t *)out)[i] = ((uint8_t *)in)[polarParams->rm_tab[i]];
- else
+ else // groupsize==16
for (int i=0; iencoderLength>>4; i++) {
((uint16_t *)out)[i] = ((uint16_t *)in)[polarParams->rm_tab[i]];
}
@@ -342,7 +324,7 @@ void build_polar_tables(t_nrPolar_params *polarParams) {
}
}
- AssertFatal(polarParams->N==512,"N = %d, not done yet\n",polarParams->N);
+ AssertFatal(polarParams->N==512 || polarParams->N==256 || polarParams->N==128,"N = %d, not done yet\n",polarParams->N);
// build G bit vectors for information bit positions and convert the bit as bytes tables in nr_polar_kronecker_power_matrices.c to 64 bit packed vectors.
// keep only rows of G which correspond to information/crc bits
polarParams->G_N_tab = (uint64_t **)malloc(polarParams->K * sizeof(int64_t *));
@@ -371,14 +353,18 @@ void build_polar_tables(t_nrPolar_params *polarParams) {
int iplast=polarParams->rate_matching_pattern[0];
int ccnt=0;
int groupcnt=0;
+#ifdef DEBUG_POLAR_ENCODER
int firstingroup_out=0;
int firstingroup_in=iplast;
+#endif
int mingroupsize = 1024;
// compute minimum group size of rate-matching pattern
for (int outpos=1; outposencoderLength; outpos++) {
ip=polarParams->rate_matching_pattern[outpos];
-
+#ifdef DEBUG_POLAR_ENCODER
+ printf("rm: outpos %d, inpos %d\n",outpos,ip);
+#endif
if ((ip - iplast) == 1) ccnt++;
else {
groupcnt++;
@@ -391,18 +377,27 @@ void build_polar_tables(t_nrPolar_params *polarParams) {
if ((ccnt+1) (%d:%d)\n",groupcnt,ccnt+1,
+ firstingroup_in,firstingroup_in+ccnt,
+ firstingroup_out,firstingroup_out+ccnt);
+#endif
+ AssertFatal(mingroupsize==4 || mingroupsize==8 || mingroupsize==16,"mingroupsize %d, needs to be handled\n",mingroupsize);
polarParams->groupsize=mingroupsize;
int shift=3;
if (mingroupsize == 16) shift=4;
+ else if (mingroupsize == 4) shift=2;
polarParams->rm_tab=(int *)malloc(sizeof(int)*polarParams->encoderLength/mingroupsize);
// rerun again to create groups
@@ -427,10 +422,11 @@ void polar_encoder_fast(uint64_t *A,
//int bitlen0=bitlen;
uint64_t tcrc=0;
- // A bitstring should be stored as a_{N-1} a_{N-2} ... a_{N-A} 0 .... 0, where N=64,128,192,..., N is smallest multiple of 64 greater than or equal to A
+ // A bit string should be stored as 0, 0, ..., 0, a'_0, a'_1, ..., a'_A-1,
+ //???a'_{N-1} a'_{N-2} ... a'_{N-A} 0 .... 0, where N=64,128,192,..., N is smallest multiple of 64 greater than or equal to A
// First flip A bitstring byte endian for CRC routines (optimized for DLSCH/ULSCH, not PBCH/PDCCH)
- // CRC reads in each byte in bit positions 7 downto 0, for PBCH/PDCCH we need to read in a_{A-1} downto a_{0}, A = length of bit string (e.g. 32 for PBCH)
+ // CRC reads in each byte in bit positions 7 down to 0, for PBCH/PDCCH we need to read in a_{A-1} down to a_{0}, A = length of bit string (e.g. 32 for PBCH)
if (bitlen<=32) {
uint8_t A32_flip[4];
uint32_t Aprime= (uint32_t)(((uint32_t)*A)<<(32-bitlen));
@@ -452,6 +448,19 @@ void polar_encoder_fast(uint64_t *A,
A64_flip[7]=((uint8_t *)&Aprime)[0];
tcrc = (uint64_t)((crcmask^(crc24c(A64_flip,bitlen)>>8)));
}
+ else if (bitlen<=128) {
+ uint8_t A128_flip[16];
+ uint128_t Aprime= (uint32_t)(((uint128_t)*A)<<(128-bitlen));
+ A128_flip[0]=((uint8_t*)&Aprime)[15]; A128_flip[1]=((uint8_t*)&Aprime)[14];
+ A128_flip[2]=((uint8_t*)&Aprime)[13]; A128_flip[3]=((uint8_t*)&Aprime)[12];
+ A128_flip[4]=((uint8_t*)&Aprime)[11]; A128_flip[5]=((uint8_t*)&Aprime)[10];
+ A128_flip[6] =((uint8_t*)&Aprime)[9]; A128_flip[7] =((uint8_t*)&Aprime)[8];
+ A128_flip[8] =((uint8_t*)&Aprime)[7]; A128_flip[9] =((uint8_t*)&Aprime)[6];
+ A128_flip[10]=((uint8_t*)&Aprime)[5]; A128_flip[11]=((uint8_t*)&Aprime)[4];
+ A128_flip[12]=((uint8_t*)&Aprime)[3]; A128_flip[13]=((uint8_t*)&Aprime)[2];
+ A128_flip[14]=((uint8_t*)&Aprime)[1]; A128_flip[15]=((uint8_t*)&Aprime)[0];
+ tcrc = (uint64_t)((crcmask^(crc24c(A128_flip,bitlen)>>8)));
+ }
int n;
// this is number of quadwords in the bit string
@@ -459,11 +468,14 @@ void polar_encoder_fast(uint64_t *A,
if ((polarParams->K&63) > 0) quadwlen++;
- // Create the B bitstring as
- // b_{N'-1} b_{N'-2} ... b_{N'-A} b_{N'-A-1} ... b_{N'-A-Nparity} = a_{N-1} a_{N-2} ... a_{N-A} p_{N_parity-1} ... p_0
+ // Create the B bit string as
+ // 0, 0, ..., 0, a'_0, a'_1, ..., a'_A-1, p_0, p_1, ..., p_{N_parity-1}
+
+ //??? b_{N'-1} b_{N'-2} ... b_{N'-A} b_{N'-A-1} ... b_{N'-A-Nparity} = a_{N-1} a_{N-2} ... a_{N-A} p_{N_parity-1} ... p_0
+
for (n=0; ncrcParityBits) | tcrc;
- else B[n] = (A[n] << polarParams->crcParityBits) | (A[n-1]>>(64-polarParams->crcParityBits));
+ else B[n] = (A[n] << polarParams->crcParityBits) | (A[n-1]>>(64-polarParams->crcParityBits));
uint8_t *Bbyte = (uint8_t *)B;
@@ -484,6 +496,11 @@ void polar_encoder_fast(uint64_t *A,
}
}
+#ifdef DEBUG_POLAR_MATLAB
+ // Cprime = pbchCprime
+ for (int i = 0; i < quadwlen; i++) printf("[polar_encoder_fast]C'[%d]= 0x%llx\n", i, (unsigned long long)(Cprime[i]));
+#endif
+
#ifdef DEBUG_POLAR_ENCODER
if (polarParams->K<65)
@@ -536,45 +553,104 @@ void polar_encoder_fast(uint64_t *A,
int off=0;
int len=polarParams->K;
- for (int j=0; j<(1+(polarParams->K>>6)); j++,off+=64,len-=64) {
- for (int i=0; i<((len>63) ? 64 : len); i++) {
- Cprime_i = -((Cprime[j]>>i)&1); // this converts bit 0 as, 0 => 0000x00, 1 => 1111x11
- /*
- #ifdef DEBUG_POLAR_ENCODER
- printf("%llx Cprime_%d (%llx) G %llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx\n",
- Cprime_i,off+i,(Cprime[j]>>i) &1,
- polarParams->G_N_tab[off+i][0],
- polarParams->G_N_tab[off+i][1],
- polarParams->G_N_tab[off+i][2],
- polarParams->G_N_tab[off+i][3],
- polarParams->G_N_tab[off+i][4],
- polarParams->G_N_tab[off+i][5],
- polarParams->G_N_tab[off+i][6],
- polarParams->G_N_tab[off+i][7]);
- #endif
- */
- uint64_t *Gi=polarParams->G_N_tab[off+i];
- D[0] ^= (Cprime_i & Gi[0]);
- D[1] ^= (Cprime_i & Gi[1]);
- D[2] ^= (Cprime_i & Gi[2]);
- D[3] ^= (Cprime_i & Gi[3]);
- D[4] ^= (Cprime_i & Gi[4]);
- D[5] ^= (Cprime_i & Gi[5]);
- D[6] ^= (Cprime_i & Gi[6]);
- D[7] ^= (Cprime_i & Gi[7]);
+ if (polarParams->N==512) {
+ for (int j=0; j<(1+(polarParams->K>>6)); j++,off+=64,len-=64) {
+ for (int i=0; i<((len>63) ? 64 : len); i++) {
+ Cprime_i = -((Cprime[j]>>i)&1); // this converts bit 0 as, 0 => 0000x00, 1 => 1111x11
+ /*
+ #ifdef DEBUG_POLAR_ENCODER
+ printf("%llx Cprime_%d (%llx) G %llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx\n",
+ Cprime_i,off+i,(Cprime[j]>>i) &1,
+ polarParams->G_N_tab[off+i][0],
+ polarParams->G_N_tab[off+i][1],
+ polarParams->G_N_tab[off+i][2],
+ polarParams->G_N_tab[off+i][3],
+ polarParams->G_N_tab[off+i][4],
+ polarParams->G_N_tab[off+i][5],
+ polarParams->G_N_tab[off+i][6],
+ polarParams->G_N_tab[off+i][7]);
+ #endif
+ */
+ uint64_t *Gi=polarParams->G_N_tab[off+i];
+ D[0] ^= (Cprime_i & Gi[0]);
+ D[1] ^= (Cprime_i & Gi[1]);
+ D[2] ^= (Cprime_i & Gi[2]);
+ D[3] ^= (Cprime_i & Gi[3]);
+ D[4] ^= (Cprime_i & Gi[4]);
+ D[5] ^= (Cprime_i & Gi[5]);
+ D[6] ^= (Cprime_i & Gi[6]);
+ D[7] ^= (Cprime_i & Gi[7]);
+
+#ifdef DEBUG_POLAR_ENCODER
+ printf("D %llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx\n",
+ D[0],
+ D[1],
+ D[2],
+ D[3],
+ D[4],
+ D[5],
+ D[6],
+ D[7]);
+#endif
+ }
}
}
-
+ else if (polarParams->N==256) {
+ for (int j=0; j<(1+(polarParams->K>>6)); j++,off+=64,len-=64) {
+ for (int i=0; i<((len>63) ? 64 : len); i++) {
+ Cprime_i = -((Cprime[j]>>i)&1); // this converts bit 0 as, 0 => 0000x00, 1 => 1111x11
+ /*
+ #ifdef DEBUG_POLAR_ENCODER
+ printf("%llx Cprime_%d (%llx) G %llx,%llx,%llx,%llx\n",
+ Cprime_i,off+i,(Cprime[j]>>i) &1,
+ polarParams->G_N_tab[off+i][0],
+ polarParams->G_N_tab[off+i][1],
+ polarParams->G_N_tab[off+i][2],
+ polarParams->G_N_tab[off+i][3],
+ #endif
+ */
+ uint64_t *Gi=polarParams->G_N_tab[off+i];
+ D[0] ^= (Cprime_i & Gi[0]);
+ D[1] ^= (Cprime_i & Gi[1]);
+ D[2] ^= (Cprime_i & Gi[2]);
+ D[3] ^= (Cprime_i & Gi[3]);
+
+
#ifdef DEBUG_POLAR_ENCODER
- printf("D %llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx\n",
- D[0],
- D[1],
- D[2],
- D[3],
- D[4],
- D[5],
- D[6],
- D[7]);
+ printf("D %llx,%llx,%llx,%llx\n",
+ D[0],
+ D[1],
+ D[2],
+ D[3]);
#endif
+ }
+ }
+ }
+ else if (polarParams->N==128) {
+ for (int j=0; j<(1+(polarParams->K>>6)); j++,off+=64,len-=64) {
+ for (int i=0; i<((len>63) ? 64 : len); i++) {
+ Cprime_i = -((Cprime[j]>>i)&1); // this converts bit 0 as, 0 => 0000x00, 1 => 1111x11
+
+ #ifdef DEBUG_POLAR_ENCODER
+ printf("%llx Cprime_%d (%d+%d) (%llx) G %llx,%llx\n",
+ Cprime_i,off+i,off,i,(Cprime[j]>>i) &1,
+ polarParams->G_N_tab[off+i][0],
+ polarParams->G_N_tab[off+i][1]);
+ #endif
+
+ uint64_t *Gi=polarParams->G_N_tab[off+i];
+ D[0] ^= (Cprime_i & Gi[0]);
+ D[1] ^= (Cprime_i & Gi[1]);
+
+
+#ifdef DEBUG_POLAR_ENCODER
+ printf("D %llx,%llx\n",
+ D[0],
+ D[1]);
+#endif
+ }
+ }
+ }
+ memset((void*)out,0,polarParams->encoderLength>>3);
polar_rate_matching(polarParams,(void *)D,(void *)out);
}
diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_procedures.c b/openair1/PHY/CODING/nrPolar_tools/nr_polar_procedures.c
index 985266447b..26832fd70c 100644
--- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_procedures.c
+++ b/openair1/PHY/CODING/nrPolar_tools/nr_polar_procedures.c
@@ -28,7 +28,7 @@
* \email turker.yilmaz@eurecom.fr
* \note
* \warning
-*/
+ */
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
@@ -43,295 +43,305 @@ void nr_polar_bit_insertion(uint8_t *input,
uint16_t k=0;
uint8_t flag;
- if (n_PC>0) {
- /*
- *
- */
- } else {
- for (int n=0; n<=N-1; n++) {
- flag=0;
- for (int m=0; m<=(K+n_PC)-1; m++) {
- if ( n == Q_I_N[m]) {
- flag=1;
- break;
- }
- }
- if (flag) { // n ϵ Q_I_N
- output[n]=input[k];
- k++;
- } else {
- output[n] = 0;
- }
- }
+ if (n_PC>0) {
+ /*
+ *
+ */
+ } else {
+ for (int n=0; n<=N-1; n++) {
+ flag=0;
+ for (int m=0; m<=(K+n_PC)-1; m++) {
+ if ( n == Q_I_N[m]) {
+ flag=1;
+ break;
}
+ }
+ if (flag) { // n ϵ Q_I_N
+ output[n]=input[k];
+ k++;
+ } else {
+ output[n] = 0;
+ }
+ }
+ }
}
uint32_t nr_polar_output_length(uint16_t K,
- uint16_t E,
- uint8_t n_max)
+ uint16_t E,
+ uint8_t n_max)
{
- uint8_t n_1, n_2, n_min=5, n;
- double R_min=1.0/8;
+ uint8_t n_1, n_2, n_min=5, n;
+ double R_min=1.0/8;
+
+ if ( (E <= (9.0/8)*pow(2,ceil(log2(E))-1)) && (K/E < 9.0/16) ) {
+ n_1 = ceil(log2(E))-1;
+ } else {
+ n_1 = ceil(log2(E));
+ }
+
+ n_2 = ceil(log2(K/R_min));
+
+ n=n_max;
+ if (n>n_1) n=n_1;
+ if (n>n_2) n=n_2;
+ if (nn_1) n=n_1;
- if (n>n_2) n=n_2;
- if (n= (3.0 / 4)) {
+ limit = ceil((double) (3 * N - 2 * E) / 4);
+ for (int n = 0; n <= limit - 1; n++) {
+ ind = Q_Ftmp_N[N] + 1;
+ Q_Ftmp_N[ind] = n;
+ Q_Ftmp_N[N] = Q_Ftmp_N[N] + 1;
}
-
- uint8_t flag;
- uint16_t limit, ind;
-
- if (E < N) {
- if ((K / (double) E) <= (7.0 / 16)) { //puncturing
- for (int n = 0; n <= N - E - 1; n++) {
- ind = Q_Ftmp_N[N] + 1;
- Q_Ftmp_N[ind] = J[n];
- Q_Ftmp_N[N] = Q_Ftmp_N[N] + 1;
- }
-
- if ((E / (double) N) >= (3.0 / 4)) {
- limit = ceil((double) (3 * N - 2 * E) / 4);
- for (int n = 0; n <= limit - 1; n++) {
- ind = Q_Ftmp_N[N] + 1;
- Q_Ftmp_N[ind] = n;
- Q_Ftmp_N[N] = Q_Ftmp_N[N] + 1;
- }
- } else {
- limit = ceil((double) (9 * N - 4 * E) / 16);
- for (int n = 0; n <= limit - 1; n++) {
- ind = Q_Ftmp_N[N] + 1;
- Q_Ftmp_N[ind] = n;
- Q_Ftmp_N[N] = Q_Ftmp_N[N] + 1;
- }
- }
- } else { //shortening
- for (int n = E; n <= N - 1; n++) {
- ind = Q_Ftmp_N[N] + 1;
- Q_Ftmp_N[ind] = J[n];
- Q_Ftmp_N[N] = Q_Ftmp_N[N] + 1;
- }
- }
+ } else {
+ limit = ceil((double) (9 * N - 4 * E) / 16);
+ for (int n = 0; n <= limit - 1; n++) {
+ ind = Q_Ftmp_N[N] + 1;
+ Q_Ftmp_N[ind] = n;
+ Q_Ftmp_N[N] = Q_Ftmp_N[N] + 1;
}
+ }
+ } else { //shortening
+ for (int n = E; n <= N - 1; n++) {
+ ind = Q_Ftmp_N[N] + 1;
+ Q_Ftmp_N[ind] = J[n];
+ Q_Ftmp_N[N] = Q_Ftmp_N[N] + 1;
+ }
+ }
+ }
- //Q_I,tmp_N = Q_0_N-1 \ Q_F,tmp_N
- for (int n = 0; n <= N - 1; n++) {
- flag = 1;
- for (int m = 0; m <= Q_Ftmp_N[N]; m++) {
- if (Q_0_Nminus1[n] == Q_Ftmp_N[m]) {
- flag = 0;
- break;
- }
- }
- if (flag) {
- Q_Itmp_N[Q_Itmp_N[N] + 1] = Q_0_Nminus1[n];
- Q_Itmp_N[N]++;
- }
- }
+ //Q_I,tmp_N = Q_0_N-1 \ Q_F,tmp_N
+ for (int n = 0; n <= N - 1; n++) {
+ flag = 1;
+ for (int m = 0; m <= Q_Ftmp_N[N]; m++) {
+ if (Q_0_Nminus1[n] == Q_Ftmp_N[m]) {
+ flag = 0;
+ break;
+ }
+ }
+ if (flag) {
+ Q_Itmp_N[Q_Itmp_N[N] + 1] = Q_0_Nminus1[n];
+ Q_Itmp_N[N]++;
+ }
+ }
- //Q_I_N comprises (K+n_PC) most reliable bit indices in Q_I,tmp_N
- for (int n = 0; n <= (K + n_PC) - 1; n++) {
- ind = Q_Itmp_N[N] + n - ((K + n_PC) - 1);
- Q_I_N[n] = Q_Itmp_N[ind];
- }
+ //Q_I_N comprises (K+n_PC) most reliable bit indices in Q_I,tmp_N
+ for (int n = 0; n <= (K + n_PC) - 1; n++) {
+ ind = Q_Itmp_N[N] + n - ((K + n_PC) - 1);
+ Q_I_N[n] = Q_Itmp_N[ind];
+ }
- //Q_F_N = Q_0_N-1 \ Q_I_N
- for (int n = 0; n <= N - 1; n++) {
- flag = 1;
- for (int m = 0; m <= (K + n_PC) - 1; m++) {
- if (Q_0_Nminus1[n] == Q_I_N[m]) {
- flag = 0;
- break;
- }
- }
- if (flag) {
- Q_F_N[Q_F_N[N] + 1] = Q_0_Nminus1[n];
- Q_F_N[N]++;
- }
- }
+ //Q_F_N = Q_0_N-1 \ Q_I_N
+ for (int n = 0; n <= N - 1; n++) {
+ flag = 1;
+ for (int m = 0; m <= (K + n_PC) - 1; m++) {
+ if (Q_0_Nminus1[n] == Q_I_N[m]) {
+ flag = 0;
+ break;
+ }
+ }
+ if (flag) {
+ Q_F_N[Q_F_N[N] + 1] = Q_0_Nminus1[n];
+ Q_F_N[N]++;
+ }
+ }
- //Information Bit Pattern
- for (int n = 0; n <= N - 1; n++) {
- ibp[n] = 0;
+ //Information Bit Pattern
+ for (int n = 0; n <= N - 1; n++) {
+ ibp[n] = 0;
- for (int m = 0; m <= (K + n_PC) - 1; m++) {
- if (n == Q_I_N[m]) {
- ibp[n] = 1;
- break;
- }
- }
- }
+ for (int m = 0; m <= (K + n_PC) - 1; m++) {
+ if (n == Q_I_N[m]) {
+ ibp[n] = 1;
+ break;
+ }
+ }
+ }
- free(Q_Ftmp_N);
- free(Q_Itmp_N);
+ free(Q_Ftmp_N);
+ free(Q_Itmp_N);
}
void nr_polar_info_bit_extraction(uint8_t *input,
- uint8_t *output,
- uint8_t *pattern,
- uint16_t size)
+ uint8_t *output,
+ uint8_t *pattern,
+ uint16_t size)
{
- uint16_t j = 0;
- for (int i = 0; i < size; i++) {
- if (pattern[i] > 0) {
- output[j] = input[i];
- j++;
- }
- }
+ uint16_t j = 0;
+ for (int i = 0; i < size; i++) {
+ if (pattern[i] > 0) {
+ output[j] = input[i];
+ j++;
+ }
+ }
}
-void nr_polar_rate_matching_pattern(uint16_t *rmp, uint16_t *J, const uint8_t *P_i_, uint16_t K, uint16_t N, uint16_t E){
+void nr_polar_rate_matching_pattern(uint16_t *rmp,
+ uint16_t *J,
+ const uint8_t *P_i_,
+ uint16_t K,
+ uint16_t N,
+ uint16_t E)
+{
+ uint8_t i;
+ uint16_t *d, *y, ind;
+ d = (uint16_t *)malloc(sizeof(uint16_t) * N);
+ y = (uint16_t *)malloc(sizeof(uint16_t) * N);
- uint8_t i;
- uint16_t *d, *y, ind;
- d = (uint16_t *)malloc(sizeof(uint16_t) * N);
- y = (uint16_t *)malloc(sizeof(uint16_t) * N);
+ for (int m=0; m<=N-1; m++) d[m]=m;
- for (int m=0; m<=N-1; m++) d[m]=m;
+ for (int m=0; m<=N-1; m++){
+ i=floor((32*m)/N);
+ J[m] = (P_i_[i]*(N/32)) + (m%(N/32));
+ y[m] = d[J[m]];
+ }
- for (int m=0; m<=N-1; m++){
- i=floor((32*m)/N);
- J[m] = (P_i_[i]*(N/32)) + (m%(N/32));
- y[m] = d[J[m]];
- }
+ if (E>=N) { //repetition
+ for (int k=0; k<=E-1; k++) {
+ ind = (k%N);
+ rmp[k]=y[ind];
+ }
+ } else {
+ if ( (K/(double)E) <= (7.0/16) ) { //puncturing
+ for (int k=0; k<=E-1; k++) {
+ rmp[k]=y[k+N-E];
+ }
+ } else { //shortening
+ for (int k=0; k<=E-1; k++) {
+ rmp[k]=y[k];
+ }
+ }
+ }
- if (E>=N) { //repetition
- for (int k=0; k<=E-1; k++) {
- ind = (k%N);
- rmp[k]=y[ind];
- }
- } else {
- if ( (K/(double)E) <= (7.0/16) ) { //puncturing
- for (int k=0; k<=E-1; k++) {
- rmp[k]=y[k+N-E];
- }
- } else { //shortening
- for (int k=0; k<=E-1; k++) {
- rmp[k]=y[k];
- }
- }
- }
-
- free(d);
- free(y);
+ free(d);
+ free(y);
}
-void nr_polar_rate_matching(double *input, double *output, uint16_t *rmp, uint16_t K, uint16_t N, uint16_t E){
-
- if (E>=N) { //repetition
- for (int i=0; i<=N-1; i++) output[i]=0;
- for (int i=0; i<=E-1; i++){
- output[rmp[i]]+=input[i];
- }
- } else {
- if ( (K/(double)E) <= (7.0/16) ) { //puncturing
- for (int i=0; i<=N-1; i++) output[i]=0;
- } else { //shortening
- for (int i=0; i<=N-1; i++) output[i]=INFINITY;
- }
-
- for (int i=0; i<=E-1; i++){
- output[rmp[i]]=input[i];
- }
- }
+void nr_polar_rate_matching(double *input,
+ double *output,
+ uint16_t *rmp,
+ uint16_t K,
+ uint16_t N,
+ uint16_t E)
+{
+ if (E>=N) { //repetition
+ for (int i=0; i<=N-1; i++) output[i]=0;
+ for (int i=0; i<=E-1; i++){
+ output[rmp[i]]+=input[i];
+ }
+ } else {
+ if ( (K/(double)E) <= (7.0/16) ) { //puncturing
+ for (int i=0; i<=N-1; i++) output[i]=0;
+ } else { //shortening
+ for (int i=0; i<=N-1; i++) output[i]=INFINITY;
+ }
+ for (int i=0; i<=E-1; i++){
+ output[rmp[i]]=input[i];
+ }
+ }
}
-void nr_polar_rate_matching_int16(int16_t *input, int16_t *output, uint16_t *rmp, uint16_t K, uint16_t N, uint16_t E){
-
- if (E>=N) { //repetition
- for (int i=0; i<=N-1; i++) output[i]=0;
- for (int i=0; i<=E-1; i++){
- output[rmp[i]]+=input[i];
- }
- } else {
- if ( (K/(double)E) <= (7.0/16) ) { //puncturing
- for (int i=0; i<=N-1; i++) output[i]=0;
- } else { //shortening
- for (int i=0; i<=N-1; i++) output[i]=32767;//instead of INFINITY, to prevent [-Woverflow]
- }
-
- for (int i=0; i<=E-1; i++){
- output[rmp[i]]=input[i];
- }
- }
+void nr_polar_rate_matching_int16(int16_t *input,
+ int16_t *output,
+ uint16_t *rmp,
+ uint16_t K,
+ uint16_t N,
+ uint16_t E)
+{
+ if (E>=N) { //repetition
+ memset((void*)output,0,N*sizeof(int16_t));
+ for (int i=0; i<=E-1; i++) output[rmp[i]]+=input[i];
+ } else {
+ if ( (K/(double)E) <= (7.0/16) ) memset((void*)output,0,N*sizeof(int16_t)); //puncturing
+ else { //shortening
+ for (int i=0; i<=N-1; i++) output[i]=32767;//instead of INFINITY, to prevent [-Woverflow]
+ }
+ for (int i=0; i<=E-1; i++) output[rmp[i]]=input[i];
+
+ }
}
-
diff --git a/openair1/PHY/CODING/nrSmallBlock/decodeSmallBlock.c b/openair1/PHY/CODING/nrSmallBlock/decodeSmallBlock.c
new file mode 100644
index 0000000000..3dd570cc18
--- /dev/null
+++ b/openair1/PHY/CODING/nrSmallBlock/decodeSmallBlock.c
@@ -0,0 +1,156 @@
+/*
+ * 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 PHY/CODING/nrSmallBlock/decodeSmallBlock.c
+ * \brief
+ * \author Turker Yilmaz
+ * \date 2019
+ * \version 0.1
+ * \company EURECOM
+ * \email turker.yilmaz@eurecom.fr
+ * \note
+ * \warning
+*/
+
+#include "PHY/CODING/nrSmallBlock/nr_small_block_defs.h"
+#include "assertions.h"
+#include "PHY/sse_intrin.h"
+
+//#define DEBUG_DECODESMALLBLOCK
+
+//input = [d̂_0] [d̂_1] [d̂_2] ... [d̂_31]
+//output = [? ... ? ĉ_K-1 ... ĉ_2 ĉ_1 ĉ_0]
+
+uint16_t decodeSmallBlock(int8_t *in, uint8_t len){
+ uint16_t out = 0;
+
+ AssertFatal(len >= 3 && len <= 11, "[decodeSmallBlock] Message Length = %d (Small Block Coding is only defined for input lengths 3 to 11)", len);
+
+ if(len<7) {
+ int16_t Rhat[NR_SMALL_BLOCK_CODED_BITS] = {0}, Rhatabs[NR_SMALL_BLOCK_CODED_BITS] = {0};
+ uint16_t maxVal;
+ uint8_t maxInd = 0;
+ uint8_t jmax = (1<<(len-1));
+ for (int j = 0; j < jmax; ++j)
+ for (int k = 0; k < NR_SMALL_BLOCK_CODED_BITS; ++k)
+ Rhat[j] += in[k] * hadamard32InterleavedTransposed[j][k];
+
+#if defined(__AVX2__)
+ for (int i = 0; i < NR_SMALL_BLOCK_CODED_BITS; i += 16) {
+ __m256i a15_a0 = _mm256_loadu_si256((__m256i*)&Rhat[i]);
+ a15_a0 = _mm256_abs_epi16(a15_a0);
+ _mm256_storeu_si256((__m256i*)(&Rhatabs[i]), a15_a0);
+ }
+#else
+ for (int i = 0; i < NR_SMALL_BLOCK_CODED_BITS; i += 8) {
+ __m128i a7_a0 = _mm_loadu_si128((__m128i*)&Rhat[i]);
+ a7_a0 = _mm_abs_epi16(a7_a0);
+ _mm_storeu_si128((__m128i*)(&Rhatabs[i]), a7_a0);
+ }
+#endif
+ maxVal = Rhatabs[0];
+ for (int k = 1; k < jmax; ++k){
+ if (Rhatabs[k] > maxVal){
+ maxVal = Rhatabs[k];
+ maxInd = k;
+ }
+ }
+
+ out = properOrderedBasis[maxInd] | ( (Rhat[maxInd] > 0) ? (uint16_t)0 : (uint16_t)1 );
+
+#ifdef DEBUG_DECODESMALLBLOCK
+ for (int k = 0; k < jmax; ++k)
+ printf("[decodeSmallBlock]Rhat[%d]=%d %d %d %d\n",k, Rhat[k], maxVal, maxInd, ((uint32_t)out>>k)&1);
+ printf("[decodeSmallBlock]0x%x 0x%x\n", out, properOrderedBasis[maxInd]);
+#endif
+
+ } else {
+ uint8_t maxRow = 0, maxCol = 0;
+
+#if defined(__AVX2__)
+ int16_t maxVal = 0;
+ int DmatrixElementVal = 0;
+ int8_t DmatrixElement[NR_SMALL_BLOCK_CODED_BITS] = {0};
+ __m256i _in_256 = _mm256_loadu_si256 ((__m256i*)&in[0]);
+ __m256i _maskD_256, _Dmatrixj_256, _maskH_256, _DmatrixElement_256;
+ for (int j = 0; j < ( 1<<(len-6) ); ++j) {
+ _maskD_256 = _mm256_loadu_si256 ((__m256i*)(&maskD[j][0]));
+ _Dmatrixj_256 = _mm256_sign_epi8 (_in_256, _maskD_256);
+ for (int k = 0; k < NR_SMALL_BLOCK_CODED_BITS; ++k) {
+ _maskH_256 = _mm256_loadu_si256 ((__m256i*)(&hadamard32InterleavedTransposed[k][0]));
+ _DmatrixElement_256 = _mm256_sign_epi8 (_Dmatrixj_256, _maskH_256);
+#if defined(__AVX512F__)
+ DmatrixElementVal = _mm512_reduce_add_epi32 (
+ _mm512_add_epi32(
+ _mm512_cvtepi8_epi32 (_mm256_extracti128_si256 (_DmatrixElement_256, 1)),
+ _mm512_cvtepi8_epi32 (_mm256_castsi256_si128 (_DmatrixElement_256))
+ )
+ );
+#else
+ _mm256_storeu_si256((__m256i*)(&DmatrixElement[0]), _DmatrixElement_256);
+ for (int i = 0; i < NR_SMALL_BLOCK_CODED_BITS; ++i)
+ DmatrixElementVal += DmatrixElement[i];
+#endif
+ if (abs(DmatrixElementVal) > abs(maxVal)){
+ maxVal = DmatrixElementVal;
+ maxRow = j;
+ maxCol = k;
+ }
+ DmatrixElementVal=0;
+ }
+ }
+ out = properOrderedBasisExtended[maxRow] | properOrderedBasis[maxCol] | ( (maxVal > 0) ? (uint16_t)0 : (uint16_t)1 );
+#else
+ int8_t Dmatrix[NR_SMALL_BLOCK_CODED_BITS][NR_SMALL_BLOCK_CODED_BITS] = {0};
+ int16_t DmatrixFHT[NR_SMALL_BLOCK_CODED_BITS][NR_SMALL_BLOCK_CODED_BITS] = {0};
+ uint16_t maxVal;
+ uint8_t rowLimit = 1<<(len-6);
+
+ for (int j = 0; j < ( rowLimit ); ++j)
+ for (int k = 0; k < NR_SMALL_BLOCK_CODED_BITS; ++k)
+ Dmatrix[j][k] = in[k] * maskD[j][k];
+
+ for (int i = 0; i < ( rowLimit ); ++i)
+ for (int j = 0; j < NR_SMALL_BLOCK_CODED_BITS; ++j)
+ for (int k = 0; k < NR_SMALL_BLOCK_CODED_BITS; ++k)
+ DmatrixFHT[i][j] += Dmatrix[i][k] * hadamard32InterleavedTransposed[j][k];
+
+ maxVal = abs(DmatrixFHT[0][0]);
+ for (int i = 0; i < ( rowLimit ); ++i)
+ for (int j = 0; j < NR_SMALL_BLOCK_CODED_BITS; ++j)
+ if (abs(DmatrixFHT[i][j]) > maxVal){
+ maxVal = abs(DmatrixFHT[i][j]);
+ maxRow = i;
+ maxCol = j;
+ }
+
+ out = properOrderedBasisExtended[maxRow] | properOrderedBasis[maxCol] | ( (DmatrixFHT[maxRow][maxCol] > 0) ? (uint16_t)0 : (uint16_t)1 );
+#endif
+
+#ifdef DEBUG_DECODESMALLBLOCK
+ for (int k = 0; k < NR_SMALL_BLOCK_CODED_BITS; ++k)
+ printf("[decodeSmallBlock]maxRow = %d maxCol = %d out[%d]=%d\n", maxRow, maxCol, k, ((uint32_t)out>>k)&1);
+#endif
+
+ }
+
+ return out;
+}
diff --git a/openair1/PHY/CODING/nrSmallBlock/encodeSmallBlock.c b/openair1/PHY/CODING/nrSmallBlock/encodeSmallBlock.c
new file mode 100644
index 0000000000..8358bd270b
--- /dev/null
+++ b/openair1/PHY/CODING/nrSmallBlock/encodeSmallBlock.c
@@ -0,0 +1,44 @@
+/*
+ * 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 PHY/CODING/nrSmallBlock/encodeSmallBlock.c
+ * \brief
+ * \author Turker Yilmaz
+ * \date 2019
+ * \version 0.1
+ * \company EURECOM
+ * \email turker.yilmaz@eurecom.fr
+ * \note
+ * \warning
+*/
+
+#include "PHY/CODING/nrSmallBlock/nr_small_block_defs.h"
+
+//input = [0 ... 0 c_K-1 ... c_2 c_1 c_0]
+//output = [d_31 d_30 ... d_2 d_1 d_0]
+uint32_t encodeSmallBlock(uint16_t *in, uint8_t len){
+ uint32_t out = 0;
+ for (uint16_t i=0; i 0)
+ out^=nrSmallBlockBasis[i];
+
+ return out;
+}
diff --git a/openair1/PHY/CODING/nrSmallBlock/nr_small_block_defs.h b/openair1/PHY/CODING/nrSmallBlock/nr_small_block_defs.h
new file mode 100644
index 0000000000..50559aa0d2
--- /dev/null
+++ b/openair1/PHY/CODING/nrSmallBlock/nr_small_block_defs.h
@@ -0,0 +1,134 @@
+/*
+ * 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 PHY/CODING/nrSmallBlock/nr_small_block_defs.h
+ * \brief
+ * \author Turker Yilmaz
+ * \date 2019
+ * \version 0.1
+ * \company EURECOM
+ * \email turker.yilmaz@eurecom.fr
+ * \note
+ * \warning
+*/
+
+#ifndef __NR_SMALL_BLOCK_DEFS__H__
+#define __NR_SMALL_BLOCK_DEFS__H__
+
+#include
+#include
+#include
+#include
+#include
+
+#define NR_SMALL_BLOCK_CODED_BITS 32
+
+#define L1d_CLS 64
+
+uint32_t encodeSmallBlock(uint16_t *in, uint8_t len);
+
+uint16_t decodeSmallBlock(int8_t *in, uint8_t len);
+
+static const uint32_t nrSmallBlockBasis[11] = {0xFFFFFFFF, 0x4BA5A933, 0x7D910E5A, 0x6D26339C, 0x71C7C3E0,
+ 0x7E0FFC00, 0x731D8E64, 0x6B44F5B0, 0x7DC218EC, 0x4DA1B746, 0x42F0FFFF};
+
+static const uint16_t properOrderedBasis[32] = {0x0000, 0x0002, 0x0004, 0x0006, 0x0008, 0x000A, 0x000C, 0x000E, 0x0010, 0x0012,
+ 0x0014, 0x0016, 0x0018, 0x001A, 0x001C, 0x001E, 0x0020, 0x0022, 0x0024, 0x0026,
+ 0x0028, 0x002A, 0x002C, 0x002E, 0x0030, 0x0032, 0x0034, 0x0036, 0x0038, 0x003A, 0x003C, 0x003E};
+
+static const uint16_t properOrderedBasisExtended[32] = {0x0000, 0x0040, 0x0080, 0x00C0, 0x0100, 0x0140, 0x0180, 0x01C0, 0x0200, 0x0240,
+ 0x0280, 0x02C0, 0x0300, 0x0340, 0x0380, 0x03C0, 0x0400, 0x0440, 0x0480, 0x04C0,
+ 0x0500, 0x0540, 0x0580, 0x05C0, 0x0600, 0x0640, 0x0680, 0x06C0, 0x0700, 0x0740, 0x0780, 0x07C0};
+
+static const int8_t hadamard32InterleavedTransposed[32][32] __attribute__ ((aligned(32))) = {
+ {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
+ {-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1},
+ {1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1},
+ {-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1},
+ {1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1},
+ {-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,1},
+ {1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1},
+ {-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,1},
+ {1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1},
+ {-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,1},
+ {1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,1,1},
+ {-1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1},
+ {1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1},
+ {-1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,1},
+ {1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1},
+ {-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1},
+ {1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,1},
+ {-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1},
+ {1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1},
+ {-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1},
+ {1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1},
+ {-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,1},
+ {1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1},
+ {-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,1},
+ {1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1},
+ {-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,1},
+ {1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1},
+ {-1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1},
+ {1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1},
+ {-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1},
+ {1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1},
+ {-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1}
+};
+
+static const int8_t maskD[32][32] __attribute__ ((aligned(32))) = {
+ {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
+ {1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1},
+ {1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1},
+ {1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,1},
+ {1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1},
+ {1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1},
+ {1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1},
+ {1,1,1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1},
+ {1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1},
+ {1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1},
+ {1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,1},
+ {1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1},
+ {1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1},
+ {1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1},
+ {1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1},
+ {1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1},
+ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1},
+ {-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1},
+ {-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1},
+ {-1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1},
+ {-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1},
+ {-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,1},
+ {-1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1},
+ {-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1},
+ {-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1},
+ {-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1},
+ {-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,1},
+ {-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1},
+ {-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1},
+ {-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1},
+ {-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,},
+ {-1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1}
+};
+
+
+
+#endif
+
diff --git a/openair1/PHY/CODING/nr_polar_init.c b/openair1/PHY/CODING/nr_polar_init.c
index dd0056b3b5..f158d44303 100644
--- a/openair1/PHY/CODING/nr_polar_init.c
+++ b/openair1/PHY/CODING/nr_polar_init.c
@@ -21,19 +21,16 @@
/*!\file PHY/CODING/nr_polar_init.h
* \brief
- * \author Turker Yilmaz
+ * \author Turker Yilmaz, Raymond Knopp
* \date 2018
* \version 0.1
* \company EURECOM
- * \email turker.yilmaz@eurecom.fr
+ * \email turker.yilmaz@eurecom.fr, raymond.knopp@eurecom.fr
* \note
* \warning
*/
-#include "nrPolar_tools/nr_polar_defs.h"
-#include "PHY/CODING/nrPolar_tools/nr_polar_dci_defs.h"
-#include "PHY/CODING/nrPolar_tools/nr_polar_uci_defs.h"
-#include "PHY/CODING/nrPolar_tools/nr_polar_pbch_defs.h"
+#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
#include "PHY/NR_TRANSPORT/nr_dci.h"
static int intcmp(const void *p1,const void *p2) {
@@ -95,7 +92,9 @@ static void nr_polar_init(t_nrPolar_params * *polarParams,
}
newPolarInitNode->K = newPolarInitNode->payloadBits + newPolarInitNode->crcParityBits; // Number of bits to encode.
- newPolarInitNode->N = nr_polar_output_length(newPolarInitNode->K, newPolarInitNode->encoderLength, newPolarInitNode->n_max);
+ newPolarInitNode->N = nr_polar_output_length(newPolarInitNode->K,
+ newPolarInitNode->encoderLength,
+ newPolarInitNode->n_max);
newPolarInitNode->n = log2(newPolarInitNode->N);
newPolarInitNode->G_N = nr_polar_kronecker_power_matrices(newPolarInitNode->n);
//polar_encoder vectors:
@@ -182,9 +181,9 @@ void nr_polar_print_polarParams(t_nrPolar_params *polarParams) {
return;
}
-t_nrPolar_params *nr_polar_params ( int8_t messageType,
- uint16_t messageLength,
- uint8_t aggregation_level) {
+t_nrPolar_params *nr_polar_params (int8_t messageType,
+ uint16_t messageLength,
+ uint8_t aggregation_level) {
static t_nrPolar_params *polarList = NULL;
nr_polar_init(&polarList, messageType,messageLength,aggregation_level);
t_nrPolar_params *polarParams=polarList;
diff --git a/openair1/PHY/CODING/nr_rate_matching.c b/openair1/PHY/CODING/nr_rate_matching.c
index 4172ad0306..0954939a58 100644
--- a/openair1/PHY/CODING/nr_rate_matching.c
+++ b/openair1/PHY/CODING/nr_rate_matching.c
@@ -26,6 +26,7 @@
#include "PHY/defs_gNB.h"
#include "PHY/defs_nr_UE.h"
+#include "PHY/CODING/coding_defs.h"
//#define RM_DEBUG 1
diff --git a/openair1/PHY/INIT/lte_init_ue.c b/openair1/PHY/INIT/lte_init_ue.c
index bcdd782073..9c9d67bdc2 100644
--- a/openair1/PHY/INIT/lte_init_ue.c
+++ b/openair1/PHY/INIT/lte_init_ue.c
@@ -355,7 +355,9 @@ void phy_config_dedicated_scell_ue(uint8_t Mod_id,
#endif
-void phy_config_harq_ue(module_id_t Mod_id,int CC_id,uint8_t eNB_id,
+void phy_config_harq_ue(module_id_t Mod_id,
+ int CC_id,
+ uint8_t eNB_id,
uint16_t max_harq_tx )
{
diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c
index ef555c0f20..397f206336 100644
--- a/openair1/PHY/INIT/nr_init.c
+++ b/openair1/PHY/INIT/nr_init.c
@@ -40,6 +40,7 @@
extern uint32_t from_nrarfcn(int nr_bandP,uint32_t dl_nrarfcn);
extern int32_t get_uldl_offset(int nr_bandP);
+extern openair0_config_t openair0_cfg[MAX_CARDS];
int l1_north_init_gNB() {
int i,j;
@@ -417,7 +418,7 @@ void nr_phy_config_request(NR_PHY_Config_t *phy_config) {
RC.gNB[Mod_id][CC_id]->mac_enabled = 1;
fp->dl_CarrierFreq = from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value);
fp->ul_CarrierFreq = fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000);
- fp->threequarter_fs = 0;
+ fp->threequarter_fs = openair0_cfg[0].threequarter_fs;
LOG_I(PHY,"Configuring MIB for instance %d, CCid %d : (band %d,N_RB_DL %d, N_RB_UL %d, Nid_cell %d,DL freq %u)\n",
Mod_id,
CC_id,
diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c
index b2be51f6a2..f5f6ca1523 100644
--- a/openair1/PHY/INIT/nr_init_ue.c
+++ b/openair1/PHY/INIT/nr_init_ue.c
@@ -357,8 +357,10 @@ void phy_config_dedicated_scell_ue(uint8_t Mod_id,
}
#endif
-void phy_config_harq_ue(module_id_t Mod_id,int CC_id,uint8_t eNB_id,
- uint16_t max_harq_tx )
+void phy_config_harq_ue(module_id_t Mod_id,
+ int CC_id,
+ uint8_t eNB_id,
+ uint16_t max_harq_tx)
{
int num_of_threads,num_of_code_words;
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/transport_ue.h b/openair1/PHY/LTE_UE_TRANSPORT/transport_ue.h
index 98e6f90a53..4c433a5683 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/transport_ue.h
+++ b/openair1/PHY/LTE_UE_TRANSPORT/transport_ue.h
@@ -194,7 +194,7 @@ typedef struct {
/// allocated CBA RNTI
uint16_t cba_rnti[4];//NUM_MAX_CBA_GROUP];
/// UL max-harq-retransmission
- uint8_t Mlimit;
+ uint16_t Mlimit;
} LTE_UE_ULSCH_t;
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci.c b/openair1/PHY/NR_TRANSPORT/nr_dci.c
index 929ac823dd..15e31d9728 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dci.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dci.c
@@ -31,6 +31,7 @@
*/
#include "nr_dci.h"
+#include "nr_dlsch.h"
//#define DEBUG_PDCCH_DMRS
//#define DEBUG_DCI
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci.h b/openair1/PHY/NR_TRANSPORT/nr_dci.h
index 21fcd06c09..f53f5be282 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dci.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_dci.h
@@ -25,8 +25,6 @@
#include "PHY/defs_gNB.h"
#include "PHY/NR_REFSIG/nr_refsig.h"
-typedef unsigned __int128 uint128_t;
-
uint16_t nr_get_dci_size(nfapi_nr_dci_format_e format,
nfapi_nr_rnti_type_e rnti_type,
uint16_t N_RB,
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c b/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c
index 14d8958811..b392506095 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c
@@ -64,9 +64,9 @@ void nr_fill_cce_list(NR_gNB_DCI_ALLOC_t* dci_alloc, uint16_t n_shift, uint8_t m
}
if (pdcch_params->cr_mapping_type == NFAPI_NR_CCE_REG_MAPPING_INTERLEAVED) {
- AssertFatal((N_reg % (bsize*R))==0, "CCE to REG interleaving: Invalid configuration leading to non integer C (N_reg %us, bsize %d R %d)\n",
- N_reg, bsize, R);
- C = N_reg/(bsize*R);
+ uint16_t assertFatalCond = (N_reg%(bsize*R));
+ AssertFatal(assertFatalCond == 0,"CCE to REG interleaving: Invalid configuration leading to non integer C (N_reg %us, bsize %d R %d)\n",N_reg, bsize, R);
+ C = N_reg/(bsize*R);
}
tmp = L * (( Y + (m*N_cce)/(L*M_s_max) + n_CI ) % CEILIDIV(N_cce,L));
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
index 06969eded0..f5f1ba3d0a 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
@@ -67,6 +67,11 @@ void nr_pdsch_codeword_scrambling(uint8_t *in,
uint32_t n_RNTI,
uint32_t* out);
+void nr_modulation(uint32_t *in,
+ uint16_t length,
+ nr_mod_t modulation_type,
+ int16_t *out);
+
void nr_pdsch_codeword_modulation(uint32_t *in,
uint8_t Qm,
uint32_t length,
@@ -96,6 +101,8 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t *dlsch);
void clean_gNB_dlsch(NR_gNB_DLSCH_t *dlsch);
+void clean_gNB_ulsch(NR_gNB_ULSCH_t *ulsch);
+
int nr_dlsch_encoding(unsigned char *a,
uint8_t subframe,
NR_gNB_DLSCH_t *dlsch,
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
index 50e836fe58..0a2927d881 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
@@ -282,8 +282,8 @@ int nr_dlsch_encoding(unsigned char *a,
uint32_t A, Z, F=0;
uint32_t *pz = &Z;
uint8_t mod_order = rel15.modulation_order;
- uint16_t Kr=0,r,r_offset=0,Kr_bytes;
- uint8_t *d_tmp[MAX_NUM_DLSCH_SEGMENTS];
+ uint16_t Kr=0,r,r_offset=0;
+ //uint8_t *d_tmp[MAX_NUM_DLSCH_SEGMENTS];
uint8_t BG=1;
uint32_t E;
uint8_t Ilbrm = 0;
@@ -354,13 +354,16 @@ int nr_dlsch_encoding(unsigned char *a,
}
Kr = dlsch->harq_processes[harq_pid]->K;
+#ifdef DEBUG_DLSCH_CODING
+ uint16_t Kr_bytes;
Kr_bytes = Kr>>3;
+#endif
//printf("segment Z %d k %d Kr %d BG %d\n", *pz,dlsch->harq_processes[harq_pid]->K,Kr,BG);
//start_meas(te_stats);
for (r=0; rharq_processes[harq_pid]->C; r++) {
- d_tmp[r] = &dlsch->harq_processes[harq_pid]->d[r][0];
+ //d_tmp[r] = &dlsch->harq_processes[harq_pid]->d[r][0];
//channel_input[r] = &dlsch->harq_processes[harq_pid]->d[r][0];
#ifdef DEBUG_DLSCH_CODING
printf("Encoder: B %d F %d \n",dlsch->harq_processes[harq_pid]->B, dlsch->harq_processes[harq_pid]->F);
@@ -393,7 +396,6 @@ int nr_dlsch_encoding(unsigned char *a,
//stop_meas(te_stats);
//printf("end ldpc encoder -- output\n");
- //write_output("enc_input0.m","enc_in0",&dlsch->harq_processes[harq_pid]->c[0][0],Kr_bytes,1,4);
#ifdef DEBUG_DLSCH_CODING
write_output("enc_input0.m","enc_in0",&dlsch->harq_processes[harq_pid]->c[0][0],Kr_bytes,1,4);
write_output("enc_output0.m","enc0",&dlsch->harq_processes[harq_pid]->d[0][0],(3*8*Kr_bytes)+12,1,4);
diff --git a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c
index 9fb73fa994..83d0d72b28 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c
@@ -112,12 +112,9 @@ void nr_get_tbs(nfapi_nr_dl_config_dlsch_pdu *dlsch_pdu,
nfapi_nr_dl_config_pdcch_parameters_rel15_t params_rel15 = dci_pdu.pdcch_params_rel15;
nfapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_rel15 = &dlsch_pdu->dlsch_pdu_rel15;
uint8_t rnti_type = params_rel15.rnti_type;
- uint8_t dci_format = params_rel15.dci_format;
- uint8_t ss_type = params_rel15.search_space_type;
uint8_t N_PRB_oh = ((rnti_type==NFAPI_NR_RNTI_SI)||(rnti_type==NFAPI_NR_RNTI_RA)||(rnti_type==NFAPI_NR_RNTI_P))? 0 : \
(config.pdsch_config.x_overhead.value);
uint8_t N_PRB_DMRS = (config.pdsch_config.dmrs_type.value == NFAPI_NR_DMRS_TYPE1)?6:4; //This only works for antenna port 1000
- uint8_t mcs_table = config.pdsch_config.mcs_table.value;
uint8_t N_sh_symb = dlsch_rel15->nb_symbols;
uint8_t Imcs = dlsch_rel15->mcs_idx;
uint16_t N_RE_prime = NR_NB_SC_PER_RB*N_sh_symb - N_PRB_DMRS - N_PRB_oh;
@@ -126,7 +123,11 @@ void nr_get_tbs(nfapi_nr_dl_config_dlsch_pdu *dlsch_pdu,
uint16_t N_RE, Ninfo, Ninfo_prime, C, TBS=0, R;
uint8_t table_idx, Qm, n, scale;
- table_idx = 1; //get_table_idx(mcs_table, dci_format, rnti_type, ss_type);
+ /*uint8_t mcs_table = config.pdsch_config.mcs_table.value;
+ uint8_t ss_type = params_rel15.search_space_type;
+ uint8_t dci_format = params_rel15.dci_format;
+ get_table_idx(mcs_table, dci_format, rnti_type, ss_type);*/
+ table_idx = 1;
scale = ((table_idx==2)&&((Imcs==20)||(Imcs==26)))?11:10;
N_RE = min(156, N_RE_prime)*dlsch_rel15->n_prb;
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
index ace93e4ee3..f9d8291423 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
@@ -171,6 +171,104 @@ NR_gNB_ULSCH_t *new_gNB_ulsch(uint8_t max_ldpc_iterations,uint8_t N_RB_UL, uint8
return(NULL);
}
+void clean_gNB_ulsch(NR_gNB_ULSCH_t *ulsch)
+{
+ unsigned char i, j;
+
+ if (ulsch) {
+ ulsch->harq_mask = 0;
+ ulsch->bundling = 0;
+ ulsch->beta_offset_cqi_times8 = 0;
+ ulsch->beta_offset_ri_times8 = 0;
+ ulsch->beta_offset_harqack_times8 = 0;
+ ulsch->Msg3_active = 0;
+ ulsch->Msg3_flag = 0;
+ ulsch->Msg3_subframe = 0;
+ ulsch->Msg3_frame = 0;
+ ulsch->rnti = 0;
+ ulsch->rnti_type = 0;
+ ulsch->cyclicShift = 0;
+ ulsch->cooperation_flag = 0;
+ ulsch->Mlimit = 0;
+ ulsch->max_ldpc_iterations = 0;
+ ulsch->last_iteration_cnt = 0;
+ ulsch->num_active_cba_groups = 0;
+ for (i=0;icba_rnti[i] = 0;
+ for (i=0;iharq_process_id[i] = 0;
+
+ for (i=0; iharq_processes[i]){
+ /// Nfapi ULSCH PDU
+ //nfapi_nr_ul_config_ulsch_pdu ulsch_pdu;
+ ulsch->harq_processes[i]->frame=0;
+ ulsch->harq_processes[i]->subframe=0;
+ ulsch->harq_processes[i]->round=0;
+ ulsch->harq_processes[i]->TPC=0;
+ ulsch->harq_processes[i]->mimo_mode=0;
+ ulsch->harq_processes[i]->dci_alloc=0;
+ ulsch->harq_processes[i]->rar_alloc=0;
+ ulsch->harq_processes[i]->status=0;
+ ulsch->harq_processes[i]->subframe_scheduling_flag=0;
+ ulsch->harq_processes[i]->subframe_cba_scheduling_flag=0;
+ ulsch->harq_processes[i]->phich_active=0;
+ ulsch->harq_processes[i]->phich_ACK=0;
+ ulsch->harq_processes[i]->previous_first_rb=0;
+ ulsch->harq_processes[i]->handled=0;
+ ulsch->harq_processes[i]->delta_TF=0;
+
+ ulsch->harq_processes[i]->TBS=0;
+ /// Pointer to the payload (38.212 V15.4.0 section 5.1)
+ //uint8_t *b;
+ ulsch->harq_processes[i]->B=0;
+ /// Pointers to code blocks after code block segmentation and CRC attachment (38.212 V15.4.0 section 5.2.2)
+ //uint8_t *c[MAX_NUM_NR_ULSCH_SEGMENTS];
+ ulsch->harq_processes[i]->K=0;
+ ulsch->harq_processes[i]->F=0;
+ ulsch->harq_processes[i]->C=0;
+ /// Pointers to code blocks after LDPC coding (38.212 V15.4.0 section 5.3.2)
+ //int16_t *d[MAX_NUM_NR_ULSCH_SEGMENTS];
+ /// LDPC processing buffer
+ //t_nrLDPC_procBuf* p_nrLDPC_procBuf[MAX_NUM_NR_ULSCH_SEGMENTS];
+ ulsch->harq_processes[i]->Z=0;
+ /// code blocks after bit selection in rate matching for LDPC code (38.212 V15.4.0 section 5.4.2.1)
+ //int16_t e[MAX_NUM_NR_DLSCH_SEGMENTS][3*8448];
+ ulsch->harq_processes[i]->E=0;
+ ulsch->harq_processes[i]->G=0;
+
+
+ ulsch->harq_processes[i]->n_DMRS=0;
+ ulsch->harq_processes[i]->n_DMRS2=0;
+ ulsch->harq_processes[i]->previous_n_DMRS=0;
+
+
+ ulsch->harq_processes[i]->cqi_crc_status=0;
+ for (j=0;jharq_processes[i]->o[j]=0;
+ ulsch->harq_processes[i]->uci_format=0;
+ ulsch->harq_processes[i]->Or1=0;
+ ulsch->harq_processes[i]->Or2=0;
+ ulsch->harq_processes[i]->o_RI[0]=0; ulsch->harq_processes[i]->o_RI[1]=0;
+ ulsch->harq_processes[i]->O_RI=0;
+ ulsch->harq_processes[i]->o_ACK[0]=0; ulsch->harq_processes[i]->o_ACK[1]=0;
+ ulsch->harq_processes[i]->o_ACK[2]=0; ulsch->harq_processes[i]->o_ACK[3]=0;
+ ulsch->harq_processes[i]->O_ACK=0;
+ ulsch->harq_processes[i]->V_UL_DAI=0;
+ /// "q" sequences for CQI/PMI (for definition see 36-212 V8.6 2009-03, p.27)
+ //int8_t q[MAX_CQI_PAYLOAD];
+ ulsch->harq_processes[i]->o_RCC=0;
+ /// coded and interleaved CQI bits
+ //int8_t o_w[(MAX_CQI_BITS+8)*3];
+ /// coded CQI bits
+ //int8_t o_d[96+((MAX_CQI_BITS+8)*3)];
+ for (j=0;jharq_processes[i]->q_ACK[j]=0;
+ for (j=0;jharq_processes[i]->q_RI[j]=0;
+ /// Temporary h sequence to flag PUSCH_x/PUSCH_y symbols which are not scrambled
+ //uint8_t h[MAX_NUM_CHANNEL_BITS];
+ /// soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15)
+ //int16_t w[MAX_NUM_ULSCH_SEGMENTS][3*(6144+64)];
+ }
+ }
+ }
+}
uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
uint8_t UE_id,
@@ -205,7 +303,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
int16_t z [68*384];
int8_t l [68*384];
- int16_t inv_d [68*384];
+ //int16_t inv_d [68*384];
uint8_t kc;
uint8_t Ilbrm = 0;
uint32_t Tbslbrm = 950984;
@@ -608,4 +706,4 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
ulsch->last_iteration_cnt = ret;
return(ret);
-}
\ No newline at end of file
+}
diff --git a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
index f01a5ef60a..9b309983b1 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
@@ -332,7 +332,9 @@ void nr_pdcch_extract_rbs_single(int32_t **rxdataF,
//uint8_t rb_count_bit;
uint8_t i, j, aarx, bitcnt_coreset_freq_dom=0;
int32_t *dl_ch0, *dl_ch0_ext, *rxF, *rxF_ext;
+#ifdef NR_PDCCH_DCI_DEBUG
int nushiftmod3 = frame_parms->nushift % 3;
+#endif
uint8_t symbol_mod;
symbol_mod = (symbol >= (7 - frame_parms->Ncp)) ? symbol - (7 - frame_parms->Ncp) : symbol;
c_rb = n_BWP_start; // c_rb is the common resource block: RB within the BWP
@@ -809,8 +811,6 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
// indicates the number of active CORESETs for the current BWP to decode PDCCH: max is 3 (this variable is not useful here, to be removed)
//uint8_t coreset_nbr_act;
// indicates the number of REG contained in the PDCCH (number of RBs * number of symbols, in CORESET)
- uint8_t coreset_nbr_reg;
- uint32_t coreset_C;
uint32_t coreset_nbr_rb = 0;
// for (int j=0; j < coreset_nbr_act; j++) {
// for each active CORESET (max number of active CORESETs in a BWP is 3),
@@ -829,9 +829,9 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
#ifdef NR_PDCCH_DCI_DEBUG
printf("\t<-NR_PDCCH_DCI_DEBUG (nr_rx_pdcch)-> coreset_freq_dom=(%ld,%lx), coreset_nbr_rb=%d\n", coreset_freq_dom,coreset_freq_dom,coreset_nbr_rb);
#endif
- coreset_nbr_reg = coreset_time_dur * coreset_nbr_rb;
- coreset_C = (uint32_t)(coreset_nbr_reg / (reg_bundle_size_L * coreset_interleaver_size_R));
#ifdef NR_PDCCH_DCI_DEBUG
+ uint8_t coreset_nbr_reg = coreset_time_dur * coreset_nbr_rb;
+ uint32_t coreset_C = (uint32_t)(coreset_nbr_reg / (reg_bundle_size_L * coreset_interleaver_size_R));
printf("\t<-NR_PDCCH_DCI_DEBUG (nr_rx_pdcch)-> coreset_nbr_rb=%d, coreset_nbr_reg=%d, coreset_C=(%d/(%d*%d))=%d\n",
coreset_nbr_rb, coreset_nbr_reg, coreset_nbr_reg, reg_bundle_size_L,coreset_interleaver_size_R, coreset_C);
#endif
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
index e56ccd8af7..73c5c3ef6f 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
@@ -231,14 +231,16 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
int16_t z [68*384];
int8_t l [68*384];
//__m128i l;
- int16_t inv_d [68*384];
+ //int16_t inv_d [68*384];
uint8_t kc;
uint8_t Ilbrm = 0;
uint32_t Tbslbrm = 950984;
- uint16_t nb_rb = 30; //to update
- uint8_t nb_re_dmrs = 6;
- uint16_t length_dmrs = 1;
+ uint16_t nb_rb = 30;
double Coderate = 0.0;
+ nfapi_nr_config_request_t *cfg = &phy_vars_ue->nrUE_config;
+ uint8_t dmrs_type = cfg->pdsch_config.dmrs_type.value;
+ uint8_t nb_re_dmrs = (dmrs_type==NFAPI_NR_DMRS_TYPE1)?6:4;
+ uint16_t length_dmrs = 1; //cfg->pdsch_config.dmrs_max_length.value;
uint32_t i,j;
@@ -312,15 +314,15 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
&harq_process->Z, // [hna] Z is Zc
&harq_process->F);
- p_decParams->Z = harq_process->Z;
-
#ifdef DEBUG_DLSCH_DECODING
- printf("dlsch decoding nr segmentation Z %d\n", p_decParams->Z);
if (!frame%100)
printf("K %d C %d Z %d nl %d \n", harq_process->K, harq_process->C, p_decParams->Z, harq_process->Nl);
#endif
}
+ p_decParams->Z = harq_process->Z;
+ //printf("dlsch decoding nr segmentation Z %d\n", p_decParams->Z);
+
Coderate = (float) A /(float) G;
if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25)
{
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
index 6c4fc3db10..56f4d7cb1e 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
@@ -85,19 +85,19 @@ unsigned char offset_mumimo_llr_drange[29][3]={{8,8,8},{7,7,7},{7,7,7},{7,7,7},{
extern void print_shorts(char *s,int16_t *x);
static void nr_dlsch_dual_stream_correlation_core(int **dl_ch_estimates_ext,
- int **dl_ch_estimates_ext_i,
- int **dl_ch_rho_ext,
- unsigned char n_tx,
- unsigned char n_rx,
- unsigned char output_shift,
- int length,
- int start_point);
+ int **dl_ch_estimates_ext_i,
+ int **dl_ch_rho_ext,
+ unsigned char n_tx,
+ unsigned char n_rx,
+ unsigned char output_shift,
+ int length,
+ int start_point);
static void nr_dlsch_layer_demapping(int16_t **llr_cw,
- uint8_t Nl,
- uint8_t mod_order,
- uint16_t length,
- int16_t **llr_layers);
+ uint8_t Nl,
+ uint8_t mod_order,
+ uint16_t length,
+ int16_t **llr_layers);
int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
PDSCH_t type,
@@ -128,7 +128,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
unsigned char aatx=0,aarx=0;
- unsigned short nb_rb = 0, nb_re =0, round;
+ unsigned short nb_rb = 0, round;
int avgs = 0;// rb;
NR_DL_UE_HARQ_t *dlsch0_harq,*dlsch1_harq = 0;
@@ -151,9 +151,10 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
//int16_t *pllr_symbol_cw1_deint;
uint32_t llr_offset_symbol;
//uint16_t bundle_L = 2;
- uint8_t l0 =2;
+ uint8_t l0 =2, pilots=0;
uint16_t n_tx=1, n_rx=1;
int32_t median[16];
+ uint32_t len;
switch (type) {
case SI_PDSCH:
@@ -173,16 +174,9 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
case PDSCH:
pdsch_vars = ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]];
dlsch = ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id];
-
-
- //set active for testing -> to be removed
- dlsch[0]->harq_processes[harq_pid]->status = ACTIVE;
- dlsch[0]->harq_processes[harq_pid]->Qm = 2;
- dlsch[0]->harq_processes[harq_pid]->mcs = 9;
- dlsch[0]->harq_processes[harq_pid]->Nl=1;
- dlsch[0]->harq_processes[harq_pid]->round=0;
- dlsch[0]->harq_processes[harq_pid]->nb_rb = nb_rb_pdsch;
- frame_parms->nushift = 0;
+
+
+ dlsch[0]->harq_processes[harq_pid]->Qm = nr_get_Qm(dlsch[0]->harq_processes[harq_pid]->mcs, 1);;
//printf("status TB0 = %d, status TB1 = %d \n", dlsch[0]->harq_processes[harq_pid]->status, dlsch[1]->harq_processes[harq_pid]->status);
LOG_D(PHY,"AbsSubframe %d.%d / Sym %d harq_pid %d, harq status %d.%d \n",
@@ -237,6 +231,10 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
printf("[DEMOD] cw for TB0 = %d, cw for TB1 = %d\n", codeword_TB0, codeword_TB1);
#endif
+ start_rb = dlsch0_harq->start_rb;
+ nb_rb_pdsch = dlsch0_harq->nb_rb;
+ l0 = dlsch0_harq->start_symbol;
+
DevAssert(dlsch0_harq);
round = dlsch0_harq->round;
//printf("round = %d\n", round);
@@ -298,9 +296,11 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
printf("Demod dlsch0_harq->pmi_alloc %d\n", dlsch0_harq->pmi_alloc);
#endif
+ pilots = (symbol==l0) ? 1 : 0;
+
if (frame_parms->nb_antenna_ports_eNB>1 && beamforming_mode==0) {
#ifdef DEBUG_DLSCH_MOD
- LOG_I(PHY,"dlsch: using pmi %x (%p), rb_alloc %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),dlsch[0],dlsch0_harq->rb_alloc_even[0]);
+ LOG_I(PHY,"dlsch: using pmi %x (%p)\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),dlsch[0]);
#endif
#if UE_TIMING_TRACE
@@ -312,8 +312,8 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
dlsch0_harq->pmi_alloc,
pdsch_vars[eNB_id]->pmi_ext,
- rballoc,
symbol,
+ pilots,
start_rb,
nb_rb_pdsch,
nr_tti_rx,
@@ -321,7 +321,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
frame_parms,
dlsch0_harq->mimo_mode);
#ifdef DEBUG_DLSCH_MOD
- printf("dlsch: using pmi %lx, rb_alloc %x, pmi_ext ",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),*rballoc);
+ printf("dlsch: using pmi %lx, pmi_ext ",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc));
for (rb=0;rbpmi_ext[rb]);
printf("\n");
@@ -335,8 +335,8 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
dlsch0_harq->pmi_alloc,
pdsch_vars[eNB_id_i]->pmi_ext,
- rballoc,
symbol,
+ pilots,
start_rb,
nb_rb_pdsch,
nr_tti_rx,
@@ -350,8 +350,8 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
dlsch0_harq->pmi_alloc,
pdsch_vars[eNB_id_i]->pmi_ext,
- rballoc,
symbol,
+ pilots,
start_rb,
nb_rb_pdsch,
nr_tti_rx,
@@ -367,8 +367,8 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
dlsch0_harq->pmi_alloc,
pdsch_vars[eNB_id]->pmi_ext,
- rballoc,
symbol,
+ pilots,
start_rb,
nb_rb_pdsch,
nr_tti_rx,
@@ -424,6 +424,8 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
return(-1);
}
+ len = (symbol==l0)? (nb_rb*6):(nb_rb*12);
+
#if UE_TIMING_TRACE
stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
#if DISABLE_LOG_X
@@ -440,12 +442,12 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
#endif
n_tx = frame_parms->nb_antenna_ports_eNB;
n_rx = frame_parms->nb_antennas_rx;
- nb_re= (symbol==l0)? (nb_rb*6):(nb_rb*12);
nr_dlsch_scale_channel(pdsch_vars[eNB_id]->dl_ch_estimates_ext,
frame_parms,
dlsch,
symbol,
+ pilots,
nb_rb);
if ((dlsch0_harq->mimo_modenb_antenna_ports_eNB;aatx++)
@@ -496,7 +500,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
median,
n_tx,
n_rx,
- 2*nb_re,// subcarriers Re Im
+ 2*len,// subcarriers Re Im
0);
for (aatx = 0; aatx < n_tx; ++aatx)
@@ -602,6 +606,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
(aatx>1) ? pdsch_vars[eNB_id]->rho : NULL,
frame_parms,
symbol,
+ pilots,
first_symbol_flag,
dlsch0_harq->Qm,
nb_rb,
@@ -655,7 +660,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
n_rx,
dlsch0_harq->Qm,
pdsch_vars[eNB_id]->log2_maxh,
- 2*nb_re, // subcarriers Re Im
+ 2*len, // subcarriers Re Im
0); // we start from the beginning of the vector
/* if (symbol == 5) {
write_output("rxF_comp_d00.m","rxF_c_d00",&pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);// should be QAM
@@ -670,7 +675,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
n_tx,
n_rx,
pdsch_vars[eNB_id]->log2_maxh,
- 2*nb_re,
+ 2*len,
0);
//printf("rho stream1 =%d\n", &pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round] );
nr_dlsch_dual_stream_correlation_core(&(pdsch_vars[eNB_id]->dl_ch_estimates_ext[2]),
@@ -679,7 +684,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
n_tx,
n_rx,
pdsch_vars[eNB_id]->log2_maxh,
- 2*nb_re,
+ 2*len,
0);
// printf("rho stream2 =%d\n",&pdsch_vars[eNB_id]->dl_ch_rho2_ext );
//printf("TM3 log2_maxh : %d\n",pdsch_vars[eNB_id]->log2_maxh);
@@ -719,7 +724,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
NULL,
n_tx,
n_rx,
- 2*nb_re,
+ 2*len,
0);
/* if (symbol == 5) {
write_output("rho0_mrc.m","rho0_0",&pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round][0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);// should be QAM
@@ -792,7 +797,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pllr_symbol_cw0 += llr_offset_symbol;
pllr_symbol_cw1 += llr_offset_symbol;
- pdsch_vars[eNB_id]->llr_offset[symbol] = nb_re*dlsch0_harq->Qm + llr_offset_symbol;
+ pdsch_vars[eNB_id]->llr_offset[symbol] = len*dlsch0_harq->Qm + llr_offset_symbol;
/*LOG_I(PHY,"compute LLRs [symbol %d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %x @LLR Buff(symb) %x\n",
symbol,
@@ -817,6 +822,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pdsch_vars[eNB_id]->rxdataF_comp0,
pllr_symbol_cw0,
symbol,
+ len,
first_symbol_flag,
nb_rb,
beamforming_mode);
@@ -827,6 +833,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pdsch_vars[eNB_id]->rxdataF_comp0,
pllr_symbol_cw1,
symbol,
+ len,
first_symbol_flag,
nb_rb,
beamforming_mode);
@@ -838,7 +845,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
rxdataF_comp_ptr,
pdsch_vars[eNB_id]->dl_ch_rho2_ext,
pdsch_vars[eNB_id]->layer_llr[0],
- symbol,first_symbol_flag,nb_rb,
+ symbol,len,first_symbol_flag,nb_rb,
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,nr_tti_rx,symbol),
pdsch_vars[eNB_id]->llr128);
if (rx_type==rx_IC_dual_stream) {
@@ -847,7 +854,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pdsch_vars[eNB_id]->rxdataF_comp0,
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
pdsch_vars[eNB_id]->layer_llr[1],
- symbol,first_symbol_flag,nb_rb,
+ symbol,len,first_symbol_flag,nb_rb,
adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,nr_tti_rx,symbol),
pdsch_vars[eNB_id]->llr128_2ndstream);
}
@@ -904,7 +911,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pdsch_vars[eNB_id]->rxdataF_comp0,
pdsch_vars[eNB_id]->llr[0],
pdsch_vars[eNB_id]->dl_ch_mag0,
- symbol,first_symbol_flag,nb_rb,
+ symbol,len,first_symbol_flag,nb_rb,
pdsch_vars[eNB_id]->llr128,
beamforming_mode);
} else if (codeword_TB0 == -1){
@@ -912,7 +919,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pdsch_vars[eNB_id]->rxdataF_comp0,
pdsch_vars[eNB_id]->llr[1],
pdsch_vars[eNB_id]->dl_ch_mag0,
- symbol,first_symbol_flag,nb_rb,
+ symbol,len,first_symbol_flag,nb_rb,
pdsch_vars[eNB_id]->llr128_2ndstream,
beamforming_mode);
}
@@ -947,7 +954,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
dl_ch_mag_ptr,//i
pdsch_vars[eNB_id]->dl_ch_rho2_ext,
pdsch_vars[eNB_id]->layer_llr[0],
- symbol,first_symbol_flag,nb_rb,
+ symbol,len,first_symbol_flag,nb_rb,
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,nr_tti_rx,symbol),
pdsch_vars[eNB_id]->llr128);
if (rx_type==rx_IC_dual_stream) {
@@ -958,7 +965,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pdsch_vars[eNB_id]->dl_ch_mag0,//i
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
pdsch_vars[eNB_id]->layer_llr[1],
- symbol,first_symbol_flag,nb_rb,
+ symbol,len,first_symbol_flag,nb_rb,
adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,nr_tti_rx,symbol),
pdsch_vars[eNB_id]->llr128_2ndstream);
}
@@ -996,7 +1003,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
(int16_t*)pllr_symbol_cw0,
pdsch_vars[eNB_id]->dl_ch_mag0,
pdsch_vars[eNB_id]->dl_ch_magb0,
- symbol,first_symbol_flag,nb_rb,
+ symbol,len,first_symbol_flag,nb_rb,
pdsch_vars[eNB_id]->llr_offset[symbol],
beamforming_mode);
} else if (codeword_TB0 == -1){
@@ -1005,7 +1012,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pllr_symbol_cw1,
pdsch_vars[eNB_id]->dl_ch_mag0,
pdsch_vars[eNB_id]->dl_ch_magb0,
- symbol,first_symbol_flag,nb_rb,
+ symbol,len,first_symbol_flag,nb_rb,
pdsch_vars[eNB_id]->llr_offset[symbol],
beamforming_mode);
}
@@ -1064,7 +1071,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
dl_ch_mag_ptr,//i
pdsch_vars[eNB_id]->dl_ch_rho2_ext,
(int16_t*)pllr_symbol_layer0,
- symbol,first_symbol_flag,nb_rb,
+ symbol,len,first_symbol_flag,nb_rb,
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,nr_tti_rx,symbol),
pdsch_vars[eNB_id]->llr_offset[symbol]);
if (rx_type==rx_IC_dual_stream) {
@@ -1075,7 +1082,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pdsch_vars[eNB_id]->dl_ch_mag0,//i
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
pllr_symbol_layer1,
- symbol,first_symbol_flag,nb_rb,
+ symbol,len,first_symbol_flag,nb_rb,
adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,nr_tti_rx,symbol),
pdsch_vars[eNB_id]->llr_offset[symbol]);
}
@@ -1094,7 +1101,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
nr_dlsch_qpsk_llr(frame_parms,
pdsch_vars[eNB_id]->rxdataF_comp0,
pllr_symbol_cw0,
- symbol,first_symbol_flag,nb_rb,
+ symbol,len,first_symbol_flag,nb_rb,
beamforming_mode);
}
break;
@@ -1104,7 +1111,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pdsch_vars[eNB_id]->rxdataF_comp0,
pdsch_vars[eNB_id]->llr[0],
pdsch_vars[eNB_id]->dl_ch_mag0,
- symbol,first_symbol_flag,nb_rb,
+ symbol,len,first_symbol_flag,nb_rb,
pdsch_vars[eNB_id]->llr128,
beamforming_mode);
}
@@ -1116,7 +1123,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pllr_symbol_cw0,
pdsch_vars[eNB_id]->dl_ch_mag0,
pdsch_vars[eNB_id]->dl_ch_magb0,
- symbol,first_symbol_flag,nb_rb,
+ symbol,len,first_symbol_flag,nb_rb,
pdsch_vars[eNB_id]->llr_offset[symbol],
beamforming_mode);
}
@@ -1132,10 +1139,10 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
if (rx_type==rx_IC_dual_stream) {
nr_dlsch_layer_demapping(pdsch_vars[eNB_id]->llr,
- dlsch[0]->harq_processes[harq_pid]->Nl,
- dlsch[0]->harq_processes[harq_pid]->G,
- -1,
- pdsch_vars[eNB_id]->layer_llr);
+ dlsch[0]->harq_processes[harq_pid]->Nl,
+ dlsch[0]->harq_processes[harq_pid]->Qm,
+ dlsch[0]->harq_processes[harq_pid]->G,
+ pdsch_vars[eNB_id]->layer_llr);
}
#if UE_TIMING_TRACE
@@ -1197,6 +1204,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
}
void nr_dlsch_deinterleaving(uint8_t symbol,
+ uint8_t start_symbol,
uint16_t L,
uint16_t *llr,
uint16_t *llr_deint,
@@ -1215,7 +1223,7 @@ void nr_dlsch_deinterleaving(uint8_t symbol,
printf("N_bundle %d L %d nb_rb_pdsch %d\n",N_bundle, L,nb_rb_pdsch);
- if (symbol==2)
+ if (symbol==start_symbol)
nb_re = 6;
else
nb_re = 12;
@@ -1253,6 +1261,7 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
int **rho,
NR_DL_FRAME_PARMS *frame_parms,
unsigned char symbol,
+ uint8_t pilots,
uint8_t first_symbol_flag,
unsigned char mod_order,
unsigned short nb_rb,
@@ -1263,16 +1272,11 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
#if defined(__i386) || defined(__x86_64)
unsigned short rb;
- unsigned char aatx,aarx,pilots=0;
+ unsigned char aatx,aarx;
__m128i *dl_ch128,*dl_ch128_2,*dl_ch_mag128,*dl_ch_mag128b,*rxdataF128,*rxdataF_comp128,*rho128;
__m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b;
QAM_amp128b = _mm_setzero_si128();
- if (symbol == 2){
- pilots=1;
- }
-
-
for (aatx=0; aatxnb_antenna_ports_eNB; aatx++) {
if (mod_order == 4) {
QAM_amp128 = _mm_set1_epi16(QAM16_n1); // 2/sqrt(10)
@@ -1917,19 +1921,19 @@ void nr_dlsch_scale_channel(int **dl_ch_estimates_ext,
NR_DL_FRAME_PARMS *frame_parms,
NR_UE_DLSCH_t **dlsch_ue,
uint8_t symbol,
+ uint8_t pilots,
unsigned short nb_rb)
{
#if defined(__x86_64__)||defined(__i386__)
short rb, ch_amp;
- unsigned char aatx,aarx,pilots=0;
+ unsigned char aatx,aarx;
__m128i *dl_ch128, ch_amp128;
- if (symbol==2){
+ if (pilots==1){
nb_rb = nb_rb>>1;
- pilots=1;
}
// Determine scaling amplitude based the symbol
@@ -1977,6 +1981,7 @@ void nr_dlsch_channel_level(int **dl_ch_estimates_ext,
NR_DL_FRAME_PARMS *frame_parms,
int32_t *avg,
uint8_t symbol,
+ uint32_t len,
unsigned short nb_rb)
{
@@ -1986,14 +1991,9 @@ void nr_dlsch_channel_level(int **dl_ch_estimates_ext,
unsigned char aatx,aarx,nre=12;
__m128i *dl_ch128, avg128D;
- if (symbol==2) //assume start symbol 2
- nre=6;
- else
- nre=12;
-
//nb_rb*nre = y * 2^x
- int16_t x = factor2(nb_rb*nre);
- int16_t y = (nb_rb*nre)>>x;
+ int16_t x = factor2(len);
+ int16_t y = (len)>>x;
//printf("nb_rb*nre = %d = %d * 2^(%d)\n",nb_rb*nre,y,x);
for (aatx=0; aatxnb_antenna_ports_eNB; aatx++)
@@ -2492,8 +2492,8 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
int **dl_ch_estimates_ext,
unsigned short pmi,
unsigned char *pmi_ext,
- unsigned int *rb_alloc, //unused in NR
unsigned char symbol,
+ uint8_t pilots,
unsigned short start_rb,
unsigned short nb_rb_pdsch,
unsigned char nr_tti_rx,
@@ -2508,9 +2508,8 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
- unsigned char pilots=0,j=0;
+ unsigned char j=0;
- pilots = (symbol==2) ? 1 : 0; //to updated from config!!!
k = frame_parms->first_carrier_offset + 12*start_rb;
for (aarx=0; aarxnb_antennas_rx; aarx++) {
@@ -2593,8 +2592,8 @@ unsigned short nr_dlsch_extract_rbs_dual(int **rxdataF,
int **dl_ch_estimates_ext,
unsigned short pmi,
unsigned char *pmi_ext,
- unsigned int *rb_alloc,
unsigned char symbol,
+ uint8_t pilots,
unsigned short start_rb,
unsigned short nb_rb_pdsch,
unsigned char nr_tti_rx,
@@ -2604,19 +2603,11 @@ unsigned short nr_dlsch_extract_rbs_dual(int **rxdataF,
int prb,nb_rb=0;
unsigned short k;
- //int prb_off,prb_off2;
- int skip_half=0,l;//sss_symb,pss_symb=0,nsymb
- int i,aarx;
+ int i,j,aarx;
int32_t *dl_ch0=NULL,*dl_ch0p=NULL,*dl_ch0_ext=NULL,*dl_ch1=NULL,*dl_ch1p=NULL,*dl_ch1_ext=NULL,*rxF=NULL,*rxF_ext=NULL;
- int symbol_mod,pilots=0,j=0;
- unsigned char *pmi_loc=NULL;
- pilots = (symbol==2) ? 1 : 0; //to updated from config
k = frame_parms->first_carrier_offset + 516; //0
- //nsymb = (frame_parms->Ncp==NORMAL) ? 14:12;
- l=symbol;
-
for (aarx=0; aarxnb_antennas_rx; aarx++) {
if (high_speed_flag==1) {
@@ -2627,7 +2618,7 @@ unsigned short nr_dlsch_extract_rbs_dual(int **rxdataF,
dl_ch1 = &dl_ch_estimates[2+aarx][0];
}
- pmi_loc = pmi_ext;
+ //pmi_loc = pmi_ext;
// pointers to extracted RX signals and channel estimates
rxF_ext = &rxdataF_ext[aarx][symbol*(nb_rb_pdsch*12)];
@@ -2635,13 +2626,13 @@ unsigned short nr_dlsch_extract_rbs_dual(int **rxdataF,
dl_ch1_ext = &dl_ch_estimates_ext[2+aarx][symbol*(nb_rb_pdsch*12)];
for (prb=0; prbN_RB_DL; prb++) {
- skip_half=0;
+ //skip_half=0;
if ((frame_parms->N_RB_DL&1) == 0) { // even number of RBs
// For second half of RBs skip DC carrier
if (k>=frame_parms->ofdm_symbol_size) {
- rxF = &rxdataF[aarx][(symbol*(frame_parms->ofdm_symbol_size))];
+ rxF = &rxdataF[aarx][(symbol*(frame_parms->ofdm_symbol_size))];
k=k-(frame_parms->ofdm_symbol_size);
}
@@ -2688,11 +2679,12 @@ unsigned short nr_dlsch_extract_rbs_dual(int **rxdataF,
return(nb_rb/frame_parms->nb_antennas_rx);
}
+
static void nr_dlsch_layer_demapping(int16_t **llr_cw,
- uint8_t Nl,
- uint8_t mod_order,
- uint16_t length,
- int16_t **llr_layers) {
+ uint8_t Nl,
+ uint8_t mod_order,
+ uint16_t length,
+ int16_t **llr_layers) {
switch (Nl) {
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c
index 29f3ffd758..a02efd9a82 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c
@@ -632,6 +632,7 @@ int nr_dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
int32_t **rxdataF_comp,
int16_t *dlsch_llr,
uint8_t symbol,
+ uint32_t len,
uint8_t first_symbol_flag,
uint16_t nb_rb,
uint8_t beamforming_mode)
@@ -639,7 +640,7 @@ int nr_dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
uint32_t *rxF = (uint32_t*)&rxdataF_comp[0][((int32_t)symbol*nb_rb*12)];
uint32_t *llr32;
- int i,len;
+ int i;
llr32 = (uint32_t*)dlsch_llr;
if (!llr32) {
@@ -647,10 +648,6 @@ int nr_dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
return(-1);
}
- if (symbol ==2) //to update from config
- len = nb_rb*6;
- else
- len = nb_rb*12;
/*
LOG_I(PHY,"dlsch_qpsk_llr: [symb %d / Length %d]: @LLR Buff %x, @LLR Buff(symb) %x \n",
symbol,
@@ -677,6 +674,7 @@ void nr_dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
int16_t *dlsch_llr,
int32_t **dl_ch_mag,
uint8_t symbol,
+ uint32_t len,
uint8_t first_symbol_flag,
uint16_t nb_rb,
int16_t **llr32p,
@@ -696,7 +694,7 @@ void nr_dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
#endif
- int i,len;
+ int i;
unsigned char len_mod4=0;
@@ -720,11 +718,6 @@ void nr_dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
ch_mag = (int16x8_t*)&dl_ch_mag[0][(symbol*nb_rb*12)];
#endif
- if (symbol ==2) //to update from config
- len = nb_rb*6;
- else
- len = nb_rb*12;
-
// update output pointer according to number of REs in this symbol (<<2 because 4 bits per RE)
if (first_symbol_flag == 1)
*llr32p = dlsch_llr + (len<<2);
@@ -798,6 +791,7 @@ void nr_dlsch_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
int32_t **dl_ch_mag,
int32_t **dl_ch_magb,
uint8_t symbol,
+ uint32_t len,
uint8_t first_symbol_flag,
uint16_t nb_rb,
uint32_t llr_offset,
@@ -810,7 +804,7 @@ void nr_dlsch_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
int16x8_t *rxF = (int16x8_t*)&rxdataF_comp[0][(symbol*nb_rb*12)];
int16x8_t *ch_mag,*ch_magb,xmm1,xmm2;
#endif
- int i,len,len2;
+ int i,len2;
unsigned char len_mod4;
short *llr;
int16_t *llr2;
@@ -835,11 +829,6 @@ void nr_dlsch_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
ch_magb = (int16x8_t*)&dl_ch_magb[0][(symbol*frame_parms->N_RB_DL*12)];
#endif
- if (symbol ==2) //to update from config
- len = nb_rb*6;
- else
- len = nb_rb*12;
-
// printf("nr_dlsch_64qam_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
/* LOG_I(PHY,"nr_dlsch_64qam_llr [symb %d / FirstSym %d / Length %d]: @LLR Buff %x \n",
@@ -1131,6 +1120,7 @@ int nr_dlsch_qpsk_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
int **rho_i,
short *dlsch_llr,
unsigned char symbol,
+ uint32_t len,
unsigned char first_symbol_flag,
unsigned short nb_rb,
uint16_t pbch_pss_sss_adjust,
@@ -1141,8 +1131,6 @@ int nr_dlsch_qpsk_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
int16_t *rxF_i=(int16_t*)&rxdataF_comp_i[0][(symbol*nb_rb*12)];
int16_t *rho=(int16_t*)&rho_i[0][(symbol*nb_rb*12)];
int16_t *llr16;
- int len;
- //uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
if (first_symbol_flag == 1) {
llr16 = (int16_t*)dlsch_llr;
@@ -1152,11 +1140,6 @@ int nr_dlsch_qpsk_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
AssertFatal(llr16!=NULL,"nr_dlsch_qpsk_qpsk_llr: llr is null, symbol %d\n",symbol);
- if (symbol ==2) //to update from config
- len = nb_rb*6;
- else
- len = nb_rb*12;
-
// printf("nr_dlsch_qpsk_qpsk_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
// printf("qpsk_qpsk: len %d, llr16 %p\n",len,llr16);
qpsk_qpsk((short *)rxF,
@@ -2972,6 +2955,7 @@ int nr_dlsch_16qam_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
int32_t **rho_i,
int16_t *dlsch_llr,
uint8_t symbol,
+ uint32_t len,
uint8_t first_symbol_flag,
uint16_t nb_rb,
uint16_t pbch_pss_sss_adjust,
@@ -2984,8 +2968,6 @@ int nr_dlsch_16qam_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*nb_rb*12)];
int16_t *rho = (int16_t*)&rho_i[0][(symbol*nb_rb*12)];
int16_t *llr16;
- int len;
- //uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
// first symbol has different structure due to more pilots
if (first_symbol_flag == 1) {
@@ -2997,11 +2979,6 @@ int nr_dlsch_16qam_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
AssertFatal(llr16!=NULL,"nr_dlsch_16qam_16qam_llr: llr is null, symbol %d\n",symbol);
- if (symbol ==2) //to update from config
- len = nb_rb*6;
- else
- len = nb_rb*12;
-
// printf("symbol %d: qam16_llr, len %d (llr16 %p)\n",symbol,len,llr16);
qam16_qam16((short *)rxF,
@@ -8514,6 +8491,7 @@ int nr_dlsch_64qam_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
int32_t **rho_i,
int16_t *dlsch_llr,
uint8_t symbol,
+ uint32_t len,
uint8_t first_symbol_flag,
uint16_t nb_rb,
uint16_t pbch_pss_sss_adjust,
@@ -8521,15 +8499,13 @@ int nr_dlsch_64qam_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
uint32_t llr_offset)
{
- int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)];
+ int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*nb_rb*12)];
+ int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*nb_rb*12)];
+ int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*nb_rb*12)];
+ int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*nb_rb*12)];
+ int16_t *rho = (int16_t*)&rho_i[0][(symbol*nb_rb*12)];
int16_t *llr16;
int8_t *pllr_symbol; // pointer where llrs should filled for this ofdm symbol
- int len;
- uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
//first symbol has different structure due to more pilots
/*if (first_symbol_flag == 1) {
@@ -8543,19 +8519,6 @@ int nr_dlsch_64qam_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
AssertFatal(llr16!=NULL,"nr_dlsch_16qam_64qam_llr:llr is null, symbol %d\n",symbol);
- if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
- // if symbol has pilots
- if (frame_parms->nb_antenna_ports_eNB!=1)
- // in 2 antenna ports we have 8 REs per symbol per RB
- len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
- else
- // for 1 antenna port we have 10 REs per symbol per RB
- len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
- } else {
- // symbol has no pilots
- len = (nb_rb*12) - pbch_pss_sss_adjust;
- }
-
pllr_symbol = (int8_t*)dlsch_llr;
pllr_symbol += llr_offset;
//printf("nr_dlsch_64qam_64qam_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
index 48cf637529..e7af632327 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
@@ -113,6 +113,7 @@ int32_t nr_dlsch_qpsk_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
int32_t **rho_i,
int16_t *dlsch_llr,
uint8_t symbol,
+ uint32_t len,
uint8_t first_symbol_flag,
uint16_t nb_rb,
uint16_t pbch_pss_sss_adj,
@@ -268,6 +269,7 @@ int nr_dlsch_16qam_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
int **rho_i,
short *dlsch_llr,
unsigned char symbol,
+ uint32_t len,
unsigned char first_symbol_flag,
unsigned short nb_rb,
uint16_t pbch_pss_sss_adjust,
@@ -464,6 +466,7 @@ int nr_dlsch_64qam_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
int **rho_i,
short *dlsch_llr,
unsigned char symbol,
+ uint32_t len,
unsigned char first_symbol_flag,
unsigned short nb_rb,
uint16_t pbch_pss_sss_adjust,
@@ -486,6 +489,7 @@ int32_t nr_dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
int32_t **rxdataF_comp,
int16_t *dlsch_llr,
uint8_t symbol,
+ uint32_t len,
uint8_t first_symbol_flag,
uint16_t nb_rb,
uint8_t beamforming_mode);
@@ -520,6 +524,7 @@ void nr_dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
int16_t *dlsch_llr,
int32_t **dl_ch_mag,
uint8_t symbol,
+ uint32_t len,
uint8_t first_symbol_flag,
uint16_t nb_rb,
int16_t **llr32p,
@@ -568,6 +573,7 @@ void nr_dlsch_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
int32_t **dl_ch_mag,
int32_t **dl_ch_magb,
uint8_t symbol,
+ uint32_t len,
uint8_t first_symbol_flag,
uint16_t nb_rb,
uint32_t llr_offset,
@@ -722,8 +728,8 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
int **dl_ch_estimates_ext,
unsigned short pmi,
unsigned char *pmi_ext,
- unsigned int *rb_alloc,
unsigned char symbol,
+ uint8_t pilots,
unsigned short start_rb,
unsigned short nb_pdsch_rb,
unsigned char nr_tti_rx,
@@ -759,8 +765,8 @@ unsigned short nr_dlsch_extract_rbs_dual(int **rxdataF,
int **dl_ch_estimates_ext,
unsigned short pmi,
unsigned char *pmi_ext,
- unsigned int *rb_alloc,
unsigned char symbol,
+ uint8_t pilots,
unsigned short start_rb,
unsigned short nb_rb_pdsch,
unsigned char nr_tti_rx,
@@ -822,6 +828,7 @@ void nr_dlsch_channel_compensation(int32_t **rxdataF_ext,
int32_t **rho,
NR_DL_FRAME_PARMS *frame_parms,
uint8_t symbol,
+ uint8_t start_symbol,
uint8_t first_symbol_flag,
uint8_t mod_order,
uint16_t nb_rb,
@@ -842,6 +849,7 @@ void nr_dlsch_channel_compensation_core(int **rxdataF_ext,
int start_point);
void nr_dlsch_deinterleaving(uint8_t symbol,
+ uint8_t start_symbol,
uint16_t L,
uint16_t *llr,
uint16_t *llr_deint,
@@ -974,11 +982,12 @@ void dlsch_channel_compensation_TM34(NR_DL_FRAME_PARMS *frame_parms,
@param pilots_flag Flag to indicate pilots in symbol
@param nb_rb Number of allocated RBs
*/
-void nr_dlsch_channel_level(int32_t **dl_ch_estimates_ext,
+void nr_dlsch_channel_level(int **dl_ch_estimates_ext,
NR_DL_FRAME_PARMS *frame_parms,
int32_t *avg,
- uint8_t pilots_flag,
- uint16_t nb_rb);
+ uint8_t symbol,
+ uint32_t len,
+ unsigned short nb_rb);
void dlsch_channel_level_TM34(int **dl_ch_estimates_ext,
@@ -1007,7 +1016,8 @@ void dlsch_channel_level_TM7(int32_t **dl_bf_ch_estimates_ext,
void nr_dlsch_scale_channel(int32_t **dl_ch_estimates_ext,
NR_DL_FRAME_PARMS *frame_parms,
NR_UE_DLSCH_t **dlsch_ue,
- uint8_t symbol_mod,
+ uint8_t symbol,
+ uint8_t start_symbol,
uint16_t nb_rb);
/** \brief This is the top-level entry point for DLSCH decoding in UE. It should be replicated on several
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
index 2facd85bab..7d2abd9993 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
@@ -246,7 +246,7 @@ typedef struct {
/// allocated CBA RNTI
//uint16_t cba_rnti[4];//NUM_MAX_CBA_GROUP];
/// UL max-harq-retransmission
- uint8_t Mlimit;
+ uint16_t Mlimit;
} NR_UE_ULSCH_t;
typedef struct {
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
index 70a34f2c66..95ca86959f 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
@@ -39,6 +39,7 @@
#include "PHY/CODING/nrLDPC_encoder/defs.h"
#include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h"
#include "common/utils/LOG/vcd_signal_dumper.h"
+#include "PHY/NR_TRANSPORT/nr_dlsch.h"
@@ -92,7 +93,7 @@ NR_UE_ULSCH_t *new_nr_ue_ulsch(unsigned char N_RB_UL, int number_of_harq_pids, u
{
NR_UE_ULSCH_t *ulsch;
- unsigned char exit_flag = 0,i,j,r;
+ unsigned char exit_flag = 0,i,r;
unsigned char bw_scaling =1;
switch (N_RB_UL) {
@@ -203,15 +204,14 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
uint32_t A, Z, F;
uint32_t *pz;
uint8_t mod_order;
- uint16_t Kr,r,r_offset,Kr_bytes;
- uint8_t *d_tmp[MAX_NUM_DLSCH_SEGMENTS];
+ uint16_t Kr,r,r_offset;
+ //uint8_t *d_tmp[MAX_NUM_DLSCH_SEGMENTS];
uint8_t BG;
uint32_t E;
uint8_t Ilbrm;
uint32_t Tbslbrm;
uint8_t nb_re_dmrs;
uint16_t length_dmrs;
- int i;
float Coderate;
///////////
@@ -311,8 +311,10 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
}
Kr = harq_process->K;
+#ifdef DEBUG_DLSCH_CODING
+ uint16_t Kr_bytes;
Kr_bytes = Kr>>3;
-
+#endif
///////////
/////////////////////////////////////////////////////////////////////////////////////
@@ -325,7 +327,7 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
//start_meas(te_stats);
for (r=0; rC; r++) {
- d_tmp[r] = &harq_process->d[r][0];
+ //d_tmp[r] = &harq_process->d[r][0];
//channel_input[r] = &harq_process->d[r][0];
#ifdef DEBUG_DLSCH_CODING
printf("Encoder: B %d F %d \n",harq_process->B, harq_process->F);
@@ -357,7 +359,6 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
//stop_meas(te_stats);
//printf("end ldpc encoder -- output\n");
- //write_output("ulsch_enc_input0.m","enc_in0",&harq_process->c[0][0],Kr_bytes,1,4);
#ifdef DEBUG_DLSCH_CODING
write_output("ulsch_enc_input0.m","enc_in0",&harq_process->c[0][0],Kr_bytes,1,4);
write_output("ulsch_enc_output0.m","enc0",&harq_process->d[0][0],(3*8*Kr_bytes)+12,1,4);
diff --git a/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
index 2327a5036b..41b055a7ff 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
@@ -990,7 +990,7 @@ void nr_uci_encoding(uint64_t payload,
// A is the payload size, to be provided in function call
uint8_t A = nr_bit;
// L is the CRC size
- uint8_t L;
+ //uint8_t L;
// E is the rate matching output sequence length as given in TS 38.212 subclause 6.3.1.4.1
uint16_t E=0,E_init;
@@ -1047,7 +1047,7 @@ void nr_uci_encoding(uint64_t payload,
}
*M_bit = E;
- int I_seg;
+ //int I_seg;
#ifdef DEBUG_NR_PUCCH_TX
printf("\t\t [nr_uci_encoding] start function with fmt=%d, encoding A=%d bits into M_bit=%d (where nrofSymbols=%d,nrofPRB=%d)\n",fmt,A,*M_bit,nrofSymbols,nrofPRB);
#endif
@@ -1057,19 +1057,19 @@ void nr_uci_encoding(uint64_t payload,
// CRC bits are not attached, and coding small block lengths (subclause 5.3.3)
} else if (A>=12) {
// procedure in subclause 6.3.1.2.1 (UCI encoded by Polar code -> subclause 6.3.1.3.1)
- if ((A>=360 && E>=1088)||(A>=1013)) {
+ /*if ((A>=360 && E>=1088)||(A>=1013)) {
I_seg = 1;
} else {
I_seg = 0;
- }
+ }*/
- if (A>=20) {
+ /*if (A>=20) {
// parity bits (subclause 5.2.1) computed by setting L=11 and using generator polynomial gCRC11(D) (subclause 5.1)
L=11;
} else if (A<=19) {
// parity bits (subclause 5.2.1) computed by setting L=6 and using generator polynomial gCRC6(D) (subclause 5.1)
L=6;
- }
+ }*/
// code block segmentation and CRC attachment is performed according to subclause 5.2.1
// polar coding subclause 5.3.1
diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h
index 1ea5814e8d..8f463b59b5 100644
--- a/openair1/PHY/defs_nr_UE.h
+++ b/openair1/PHY/defs_nr_UE.h
@@ -916,6 +916,7 @@ typedef struct {
NR_UE_COMMON common_vars;
nr_ue_if_module_t *if_inst;
+ nfapi_nr_config_request_t nrUE_config;
nr_downlink_indication_t dl_indication;
nr_uplink_indication_t ul_indication;
diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h
index 6adb2271e2..591d609454 100644
--- a/openair1/PHY/defs_nr_common.h
+++ b/openair1/PHY/defs_nr_common.h
@@ -333,5 +333,4 @@ typedef struct nr_band_info_s {
nr_bandentry_t band_info[100];
} nr_band_info_t;
-
#endif
diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
index 139d48ffa9..0432ded427 100644
--- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
+++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
@@ -56,7 +56,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
NR_UE_PDCCH *pdcch_vars2 = PHY_vars_UE_g[module_id][cc_id]->pdcch_vars[thread_id][0];
NR_UE_DLSCH_t *dlsch0 = PHY_vars_UE_g[module_id][cc_id]->dlsch[thread_id][0][0];
NR_UE_ULSCH_t *ulsch0 = PHY_vars_UE_g[module_id][cc_id]->ulsch[thread_id][0][0];
- NR_DL_FRAME_PARMS frame_parms = PHY_vars_UE_g[module_id][cc_id]->frame_parms;
+ //NR_DL_FRAME_PARMS frame_parms = PHY_vars_UE_g[module_id][cc_id]->frame_parms;
PRACH_RESOURCES_t *prach_resources = PHY_vars_UE_g[module_id][cc_id]->prach_resources[0];
// PUCCH_ConfigCommon_nr_t *pucch_config_common = PHY_vars_UE_g[module_id][cc_id]->pucch_config_common_nr[0];
@@ -123,7 +123,10 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
dlsch0->g_pucch = dlsch_config_pdu->accumulated_delta_PUCCH;
dlsch0_harq->harq_ack.pucch_resource_indicator = dlsch_config_pdu->pucch_resource_id;
dlsch0_harq->harq_ack.slot_for_feedback_ack = dlsch_config_pdu->pdsch_to_harq_feedback_time_ind;
+ dlsch0_harq->Nl=1;
+ dlsch0_harq->status = ACTIVE;
LOG_D(MAC,">>>> \tdlsch0->g_pucch=%d\tdlsch0_harq.mcs=%d\n",dlsch0->g_pucch,dlsch0_harq->mcs);
+
}
}
}else{
@@ -185,11 +188,11 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
if(ul_config->ul_config_list[i].pdu_type == FAPI_NR_UL_CONFIG_TYPE_PRACH){
// prach config pdu
fapi_nr_ul_config_prach_pdu *prach_config_pdu = &ul_config->ul_config_list[i].prach_config_pdu;
- frame_parms.prach_config_common.rootSequenceIndex = prach_config_pdu->root_sequence_index;
+ /*frame_parms.prach_config_common.rootSequenceIndex = prach_config_pdu->root_sequence_index;
frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex = prach_config_pdu->prach_configuration_index;
frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig = prach_config_pdu->zero_correlation_zone_config;
frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag = prach_config_pdu->restrictedset_config;
- frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset = prach_config_pdu->prach_freq_offset;
+ frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset = prach_config_pdu->prach_freq_offset;*/
prach_resources->ra_PreambleIndex = prach_config_pdu->preamble_index;
}
}
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index b5f19814f7..f26468fb03 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -1560,25 +1560,26 @@ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDUR
#endif
-void ue_ulsch_uespec_procedures(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag) {
-
- int harq_pid;
- int frame_tx=proc->frame_tx;
+void ue_ulsch_uespec_procedures(PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
+ uint8_t eNB_id,
+ uint8_t abstraction_flag)
+{
int nr_tti_tx=proc->nr_tti_tx;
- unsigned int input_buffer_length;
- int i;
- int aa;
- int tx_amp;
+
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_UESPEC,VCD_FUNCTION_IN);
/* reset harq for tx of current rx slot because it is sure that transmission has already been achieved for this slot */
set_tx_harq_id(ue->ulsch[ue->current_thread_id[nr_tti_tx]][eNB_id][0], NR_MAX_HARQ_PROCESSES, proc->nr_tti_rx);
+#if 0
+ int frame_tx=proc->frame_tx;
+ int harq_pid;
/* get harq pid related to this next tx slot */
harq_pid = get_tx_harq_id(ue->ulsch[ue->current_thread_id[nr_tti_tx]][eNB_id][0], nr_tti_tx);
-#if 0
-
+ int tx_amp;
+ unsigned int input_buffer_length;
int Mod_id = ue->Mod_id;
int CC_id = ue->CC_id;
uint8_t Msg3_flag=0;
@@ -1599,9 +1600,9 @@ void ue_ulsch_uespec_procedures(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8
ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->round==0)
- generate_ue_ulsch_params_from_rar(ue,
- proc,
- eNB_id);
+ generate_ue_ulsch_params_from_rar(ue,
+ proc,
+ eNB_id);
ue->ulsch[eNB_id]->power_offset = 14;
LOG_D(PHY,"[UE %d][RAPROC] Frame %d: Setting Msg3_flag in nr_tti_rx %d, for harq_pid %d\n",
@@ -1864,7 +1865,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8
#ifdef DEBUG_ULSCH
LOG_D(PHY,"[UE] Frame %d, nr_tti_rx %d : ULSCH SDU (TX harq_pid %d) (%d bytes) : \n",frame_tx,nr_tti_tx,harq_pid, ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3);
- for (i=0; iulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3; i++)
+ for (int i=0; iulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3; i++)
LOG_T(PHY,"%x.",ulsch_input_buffer[i]);
LOG_T(PHY,"\n");
@@ -1874,7 +1875,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8
else {
unsigned int taus(void);
- for (i=0; iframe_parms,
ue->ulsch[eNB_id]);
- for (aa=0; aa<1/*frame_parms->nb_antennas_tx*/; aa++)
+ for (int aa=0; aa<1/*frame_parms->nb_antennas_tx*/; aa++)
generate_drs_pusch(ue,
proc,
eNB_id,
@@ -2670,22 +2671,18 @@ void phy_procedures_UE_S_TX(PHY_VARS_NR_UE *ue,uint8_t eNB_id,uint8_t abstractio
#endif
-void nr_ue_measurement_procedures(
- uint16_t l, // symbol index of each slot [0..6]
- PHY_VARS_NR_UE *ue,
- UE_nr_rxtx_proc_t *proc,
- uint8_t eNB_id,
- uint16_t slot, // slot index of each radio frame [0..19]
- runmode_t mode)
+void nr_ue_measurement_procedures(uint16_t l, // symbol index of each slot [0..6]
+ PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
+ uint8_t eNB_id,
+ uint16_t slot, // slot index of each radio frame [0..19]
+ runmode_t mode)
{
-
LOG_D(PHY,"ue_measurement_procedures l %u Ncp %d\n",l,ue->frame_parms.Ncp);
- NR_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
-
- int nr_tti_rx = proc->nr_tti_rx;
-
#if 0
+ NR_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
+ int nr_tti_rx = proc->nr_tti_rx;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_MEASUREMENT_PROCEDURES, VCD_FUNCTION_IN);
if (l==0) {
@@ -2806,15 +2803,17 @@ void restart_phy(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc, uint8_t eNB_id,uint
}
#endif //(0)
-void nr_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc, uint8_t abstraction_flag)
+void nr_ue_pbch_procedures(uint8_t eNB_id,
+ PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
+ uint8_t abstraction_flag)
{
-
// int i;
//int pbch_tx_ant=0;
//uint8_t pbch_phase;
int ret = 0;
- uint16_t frame_tx;
- uint8_t pbch_trials = 0;
+ //static uint8_t first_run = 1;
+ //uint8_t pbch_trials = 0;
DevAssert(ue);
@@ -2837,6 +2836,7 @@ void nr_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *
#ifdef DEBUG_PHY_PROC
+ uint16_t frame_tx;
LOG_D(PHY,"[UE %d] frame %d, nr_tti_rx %d, Received PBCH (MIB): frame_tx %d. N_RB_DL %d\n",
ue->Mod_id,
frame_rx,
@@ -2907,9 +2907,10 @@ unsigned int get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb
#ifdef NR_PDCCH_SCHED
-int nr_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc)
+int nr_ue_pdcch_procedures(uint8_t eNB_id,
+ PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc)
{
-
// unsigned int dci_cnt=0, i; //removed for nr_ue_pdcch_procedures and added in the loop for nb_coreset_active
#ifdef NR_PDCCH_SCHED_DEBUG
printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Entering function nr_ue_pdcch_procedures() \n");
@@ -2939,7 +2940,7 @@ int nr_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *
pdcch_vars[eNB_id]->crnti = 0x1234; //to be check how to set when using loop memory
uint16_t c_rnti=pdcch_vars[eNB_id]->crnti;
- uint16_t cs_rnti=0,new_rnti=0,tc_rnti;
+ uint16_t cs_rnti=0,new_rnti=0,tc_rnti=0;
uint16_t p_rnti=P_RNTI;
uint16_t si_rnti=SI_RNTI;
uint16_t ra_rnti=99;
@@ -2957,10 +2958,10 @@ int nr_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *
#endif
// p in TS 38.212 Subclause 10.1, for each active BWP the UE can deal with 3 different CORESETs (including coresetId 0 for common search space)
- int nb_coreset_total = NR_NBR_CORESET_ACT_BWP;
+ //int nb_coreset_total = NR_NBR_CORESET_ACT_BWP;
unsigned int dci_cnt=0;
// this table contains 56 (NBR_NR_DCI_FIELDS) elements for each dci field and format described in TS 38.212. Each element represents the size in bits for each dci field
- uint8_t dci_fields_sizes[NBR_NR_DCI_FIELDS][NBR_NR_FORMATS] = {{0}};
+ //uint8_t dci_fields_sizes[NBR_NR_DCI_FIELDS][NBR_NR_FORMATS] = {{0}};
// this is the UL bandwidth part. FIXME! To be defined where this value comes from
// uint16_t n_RB_ULBWP = 106;
// this is the DL bandwidth part. FIXME! To be defined where this value comes from
@@ -2969,7 +2970,7 @@ int nr_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *
// Up to 10 searchSpaces can be configured to UE (s<=10)
for (nb_searchspace_active=0; nb_searchspace_activesearchSpace[nb_searchspace_active].searchSpaceId;
+ //int searchSpace_id = pdcch_vars2->searchSpace[nb_searchspace_active].searchSpaceId;
#ifdef NR_PDCCH_SCHED_DEBUG
@@ -3000,16 +3001,16 @@ int nr_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *
// the searchSpace indicates that we need to monitor PDCCH in current nr_tti_rx
// get the parameters describing the current SEARCHSPACE
// the CORESET id applicable to the current SearchSpace
- int searchSpace_coreset_id = pdcch_vars2->searchSpace[nb_searchspace_active].controlResourceSetId;
+ //int searchSpace_coreset_id = pdcch_vars2->searchSpace[nb_searchspace_active].controlResourceSetId;
// FIXME this variable is a bit string (14 bits) identifying every OFDM symbol in a slot.
// at the moment we will not take into consideration this variable and we will consider that the OFDM symbol offset is always the first OFDM in a symbol
uint16_t symbol_within_slot_mon = pdcch_vars2->searchSpace[nb_searchspace_active].monitoringSymbolWithinSlot;
// get the remaining parameters describing the current SEARCHSPACE: // FIXME! To be defined where we get this information from
- NR_UE_SEARCHSPACE_nbrCAND_t num_cand_L1 = pdcch_vars2->searchSpace[nb_searchspace_active].nrofCandidates_aggrlevel1;
+ /*NR_UE_SEARCHSPACE_nbrCAND_t num_cand_L1 = pdcch_vars2->searchSpace[nb_searchspace_active].nrofCandidates_aggrlevel1;
NR_UE_SEARCHSPACE_nbrCAND_t num_cand_L2 = pdcch_vars2->searchSpace[nb_searchspace_active].nrofCandidates_aggrlevel2;
NR_UE_SEARCHSPACE_nbrCAND_t num_cand_L4 = pdcch_vars2->searchSpace[nb_searchspace_active].nrofCandidates_aggrlevel4;
NR_UE_SEARCHSPACE_nbrCAND_t num_cand_L8 = pdcch_vars2->searchSpace[nb_searchspace_active].nrofCandidates_aggrlevel8;
- NR_UE_SEARCHSPACE_nbrCAND_t num_cand_L16 = pdcch_vars2->searchSpace[nb_searchspace_active].nrofCandidates_aggrlevel16;
+ NR_UE_SEARCHSPACE_nbrCAND_t num_cand_L16 = pdcch_vars2->searchSpace[nb_searchspace_active].nrofCandidates_aggrlevel16;*/
// FIXME! A table of five enum elements
// searchSpaceType indicates whether this is a common search space or a UE-specific search space
//int searchSpaceType = pdcch_vars2->searchSpace[nb_searchspace_active].searchSpaceType.type;
@@ -3126,9 +3127,8 @@ int nr_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING, VCD_FUNCTION_OUT);
//LOG_D(PHY,"[UE %d][PUSCH] Frame %d nr_tti_rx %d PHICH RX\n",ue->Mod_id,frame_rx,nr_tti_rx);
-
- uint8_t *nCCE_current = &ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->nCCE[nr_tti_rx];
/*
+ uint8_t *nCCE_current = &ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->nCCE[nr_tti_rx];
uint8_t *nCCE_dest = &ue->pdcch_vars[next1_thread_id][eNB_id]->nCCE[nr_tti_rx];
uint8_t *nCCE_dest1 = &ue->pdcch_vars[next2_thread_id][eNB_id]->nCCE[nr_tti_rx];
memcpy(nCCE_dest, nCCE_current, sizeof(uint8_t));
@@ -3779,13 +3779,14 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
int frame_rx = proc->frame_rx;
int nr_tti_rx = proc->nr_tti_rx;
int ret=0, ret1=0;
- int CC_id = ue->CC_id;
+ //int CC_id = ue->CC_id;
NR_UE_PDSCH *pdsch_vars;
uint8_t is_cw0_active = 0;
uint8_t is_cw1_active = 0;
- // to be updated by higher layer
- uint8_t nb_re_dmrs = 6;
- uint16_t length_dmrs = 1;
+ nfapi_nr_config_request_t *cfg = &ue->nrUE_config;
+ uint8_t dmrs_type = cfg->pdsch_config.dmrs_type.value;
+ uint8_t nb_re_dmrs = (dmrs_type==NFAPI_NR_DMRS_TYPE1)?6:4;
+ uint16_t length_dmrs = 1; //cfg->pdsch_config.dmrs_max_length.value;
uint16_t nb_symb_sch = 9;
if (dlsch0==NULL)
@@ -3793,6 +3794,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
harq_pid = dlsch0->current_harq_pid;
is_cw0_active = dlsch0->harq_processes[harq_pid]->status;
+ nb_symb_sch = dlsch0->harq_processes[harq_pid]->nb_symbols;
if(dlsch1)
is_cw1_active = dlsch1->harq_processes[harq_pid]->status;
@@ -3860,10 +3862,10 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
start_meas(&ue->dlsch_unscrambling_stats);
#endif
nr_dlsch_unscrambling(pdsch_vars->llr[0],
- dlsch0->harq_processes[harq_pid]->G,
- 0,
- ue->frame_parms.Nid_cell,
- dlsch0->rnti);
+ dlsch0->harq_processes[harq_pid]->G,
+ 0,
+ ue->frame_parms.Nid_cell,
+ dlsch0->rnti);
#if UE_TIMING_TRACE
@@ -3886,7 +3888,9 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
#endif
#ifdef UE_DLSCH_PARALLELISATION
- ret = nr_dlsch_decoding_mthread(ue,proc,eNB_id,
+ ret = nr_dlsch_decoding_mthread(ue,
+ proc,
+ eNB_id,
pdsch_vars->llr[0],
&ue->frame_parms,
dlsch0,
@@ -3897,6 +3901,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
harq_pid,
pdsch==PDSCH?1:0,
dlsch0->harq_processes[harq_pid]->TBS>256?1:0);
+ LOG_T(PHY,"UE_DLSCH_PARALLELISATION is defined, ret = %d\n", ret);
#else
ret = nr_dlsch_decoding(ue,
pdsch_vars->llr[0],
@@ -3907,8 +3912,9 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
nb_symb_sch,
nr_tti_rx,
harq_pid,
- pdsch==PDSCH?1:0,//proc->decoder_switch,
+ pdsch==PDSCH?1:0,
dlsch0->harq_processes[harq_pid]->TBS>256?1:0);
+ LOG_T(PHY,"UE_DLSCH_PARALLELISATION is NOT defined, ret = %d\n", ret);
//printf("start cW0 dlsch decoding\n");
#endif
@@ -3963,7 +3969,9 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
#endif
#ifdef UE_DLSCH_PARALLELISATION
- ret1 = nr_dlsch_decoding_mthread(ue,proc, eNB_id,
+ ret1 = nr_dlsch_decoding_mthread(ue,
+ proc,
+ eNB_id,
pdsch_vars->llr[1],
&ue->frame_parms,
dlsch1,
@@ -3974,19 +3982,20 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
harq_pid,
pdsch==PDSCH?1:0,
dlsch1->harq_processes[harq_pid]->TBS>256?1:0);
+ LOG_T(PHY,"UE_DLSCH_PARALLELISATION is defined, ret1 = %d\n", ret1);
#else
-
ret1 = nr_dlsch_decoding(ue,
pdsch_vars->llr[1],
&ue->frame_parms,
dlsch1,
dlsch1->harq_processes[harq_pid],
frame_rx,
- nb_symb_sch,
+ nb_symb_sch,
nr_tti_rx,
harq_pid,
pdsch==PDSCH?1:0,//proc->decoder_switch,
dlsch1->harq_processes[harq_pid]->TBS>256?1:0);
+ LOG_T(PHY,"UE_DLSCH_PARALLELISATION is NOT defined, ret1 = %d\n", ret1);
printf("start cw1 dlsch decoding\n");
#endif
@@ -4316,18 +4325,19 @@ void *UE_thread_slot1_dl_processing(void *arg) {
-int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eNB_id,
- uint8_t do_pdcch_flag,runmode_t mode) {
-
-
-
- int l,l2;
- int pilot1;
-
+int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
+ uint8_t eNB_id,
+ uint8_t do_pdcch_flag,
+ runmode_t mode)
+{
int frame_rx = proc->frame_rx;
int nr_tti_rx = proc->nr_tti_rx;
NR_UE_PDCCH *pdcch_vars = ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][0];
- uint16_t nb_symb_sch = 9; // to be updated by higher layer
+ NR_UE_DLSCH_t **dlsch = ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id];
+ uint8_t harq_pid = ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->current_harq_pid;
+ NR_DL_UE_HARQ_t *dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
+ uint16_t nb_symb_sch = dlsch0_harq->nb_symbols;
uint8_t nb_symb_pdcch = pdcch_vars->coreset[0].duration;
uint8_t dci_cnt = 0;
diff --git a/openair1/SCHED_NR_UE/pucch_power_control_ue_nr.c b/openair1/SCHED_NR_UE/pucch_power_control_ue_nr.c
index debb0d4ed5..296d92969c 100644
--- a/openair1/SCHED_NR_UE/pucch_power_control_ue_nr.c
+++ b/openair1/SCHED_NR_UE/pucch_power_control_ue_nr.c
@@ -67,9 +67,19 @@
*
*********************************************************************/
-int16_t get_pucch_tx_power_ue(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_t *proc, pucch_format_nr_t pucch_format,
- int nb_of_prbs, int N_sc_ctrl_RB, int N_symb_PUCCH, int O_UCI, int O_SR, int O_CSI, int O_ACK,
- int O_CRC, int n_HARQ_ACK) {
+int16_t get_pucch_tx_power_ue(PHY_VARS_NR_UE *ue,
+ uint8_t gNB_id,
+ UE_nr_rxtx_proc_t *proc,
+ pucch_format_nr_t pucch_format,
+ int nb_of_prbs,
+ int N_sc_ctrl_RB,
+ int N_symb_PUCCH,
+ int O_UCI,
+ int O_SR,
+ int O_CSI,
+ int O_ACK,
+ int O_CRC,
+ int n_HARQ_ACK) {
int16_t P_O_NOMINAL_PUCCH = ue->pucch_config_common_nr[gNB_id].p0_nominal;
PUCCH_PowerControl_t *power_config = &ue->pucch_config_dedicated_nr[gNB_id].pucch_PowerControl;
@@ -147,7 +157,6 @@ int16_t get_pucch_tx_power_ue(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_pro
}
}
- int l = 0;
int k2;
if (power_config->twoPUCCH_PC_AdjustmentStates > 1) {
@@ -156,11 +165,11 @@ int16_t get_pucch_tx_power_ue(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_pro
}
/* response to a detection by the UE of a DCI format 1_0 or DCI format 1_1 */
- int K_PUCCH = 0;
+ //int K_PUCCH = 0;
if (O_ACK != 0) {
/* it assumes that PDCCH is in the first symbol of receive slot FFS TDDO NR */
- int slots_gap = (proc->nr_tti_tx > proc->nr_tti_rx ? (proc->nr_tti_tx - proc->nr_tti_rx - 1) : ((proc->nr_tti_tx + ue->frame_parms.ttis_per_subframe) - proc->nr_tti_rx - 1));
- K_PUCCH = (slots_gap * (ue->frame_parms.symbols_per_tti)) - 1;
+ //int slots_gap = (proc->nr_tti_tx > proc->nr_tti_rx ? (proc->nr_tti_tx - proc->nr_tti_rx - 1) : ((proc->nr_tti_tx + ue->frame_parms.ttis_per_subframe) - proc->nr_tti_rx - 1));
+ //K_PUCCH = (slots_gap * (ue->frame_parms.symbols_per_tti)) - 1;
}
else {
/* field k2 is not present - to check k2 of pucch from upper layer FFS TDDO NR */
@@ -189,7 +198,7 @@ int16_t get_pucch_tx_power_ue(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_pro
} while(ue->pusch_config.pusch_TimeDomainResourceAllocation[i] != NULL);
k2 = k2_min;
}
- K_PUCCH = N_SYMB_SLOT * k2; /* the product of a number of symbols per slot and the minimum of the values provided by higher layer parameter k2 */
+ //K_PUCCH = N_SYMB_SLOT * k2; /* the product of a number of symbols per slot and the minimum of the values provided by higher layer parameter k2 */
}
int contributor = (10 * log10((double)(pow(2,(ue->frame_parms.numerology_index)) * nb_of_prbs)));
diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c
index 2a95768a3e..0eed21c446 100644
--- a/openair1/SIMULATION/NR_PHY/dlschsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlschsim.c
@@ -103,6 +103,7 @@ void exit_function(const char *file, const char *function, const int line,
// needed for some functions
PHY_VARS_NR_UE *PHY_vars_UE_g[1][1] = { { NULL } };
uint16_t n_rnti = 0x1234;
+openair0_config_t openair0_cfg[MAX_CARDS];
char quantize(double D, double x, unsigned char B) {
double qxd;
@@ -131,21 +132,22 @@ int main(int argc, char **argv) {
// int sync_pos, sync_pos_slot;
// FILE *rx_frame_file;
FILE *output_fd = NULL;
- uint8_t write_output_file = 0;
+ //uint8_t write_output_file = 0;
// int subframe_offset;
// char fname[40], vname[40];
int trial, n_trials = 1, n_errors = 0, n_false_positive = 0;
- uint8_t transmission_mode = 1, n_tx = 1, n_rx = 1;
+ uint8_t n_tx = 1, n_rx = 1;
+ //uint8_t transmission_mode = 1;
uint16_t Nid_cell = 0;
channel_desc_t *gNB2UE;
uint8_t extended_prefix_flag = 0;
- int8_t interf1 = -21, interf2 = -21;
+ //int8_t interf1 = -21, interf2 = -21;
FILE *input_fd = NULL, *pbch_file_fd = NULL;
//char input_val_str[50],input_val_str2[50];
//uint16_t NB_RB=25;
SCM_t channel_model = AWGN; //Rayleigh1_anticorr;
uint16_t N_RB_DL = 106, mu = 1;
- unsigned char frame_type = 0;
+ //unsigned char frame_type = 0;
unsigned char pbch_phase = 0;
int frame = 0, subframe = 0;
int frame_length_complex_samples;
@@ -176,7 +178,7 @@ int main(int argc, char **argv) {
while ((c = getopt(argc, argv, "df:hpg:i:j:n:l:m:r:s:S:y:z:M:N:F:R:P:L:")) != -1) {
switch (c) {
- case 'f':
+ /*case 'f':
write_output_file = 1;
output_fd = fopen(optarg, "w");
@@ -185,11 +187,11 @@ int main(int argc, char **argv) {
exit(-1);
}
- break;
+ break;*/
- case 'd':
+ /*case 'd':
frame_type = 1;
- break;
+ break;*/
case 'g':
switch ((char) *optarg) {
@@ -228,13 +230,13 @@ int main(int argc, char **argv) {
break;
- case 'i':
+ /*case 'i':
interf1 = atoi(optarg);
break;
case 'j':
interf2 = atoi(optarg);
- break;
+ break;*/
case 'n':
n_trials = atoi(optarg);
@@ -331,33 +333,33 @@ int main(int argc, char **argv) {
nb_rb = atoi(optarg);
break;
- case 'x':
+ /*case 'x':
transmission_mode = atoi(optarg);
- break;
+ break;*/
default:
case 'h':
printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n", argv[0]);
printf("-h This message\n");
printf("-p Use extended prefix mode\n");
- printf("-d Use TDD\n");
+ //printf("-d Use TDD\n");
printf("-n Number of frames to simulate\n");
printf("-s Starting SNR, runs from SNR0 to SNR0 + 5 dB. If n_frames is 1 then just SNR is simulated\n");
printf("-S Ending SNR, runs from SNR0 to SNR1\n");
printf("-t Delay spread for multipath channel\n");
printf("-g [A,B,C,D,E,F,G] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models (ignores delay spread and Ricean factor)\n");
- printf("-x Transmission mode (1,2,6 for the moment)\n");
+ //printf("-x Transmission mode (1,2,6 for the moment)\n");
printf("-y Number of TX antennas used in eNB\n");
printf("-z Number of RX antennas used in UE\n");
- printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n");
- printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n");
- printf("-M Multiple SSB positions in burst\n");
+ //printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n");
+ //printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n");
+ printf("-M Multiple SSB positions in burst\n");
printf("-N Nid_cell\n");
printf("-R N_RB_DL\n");
printf("-O oversampling factor (1,2,4,8,16)\n");
printf("-A Interpolation_filname Run with Abstraction to generate Scatter plot using interpolation polynomial in file\n");
- // printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n");
- printf("-f Output filename (.txt format) for Pe/SNR results\n");
+ //printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n");
+ //printf("-f Output filename (.txt format) for Pe/SNR results\n");
printf("-F Input filename (.txt format) for RX conformance testing\n");
exit(-1);
break;
@@ -493,12 +495,12 @@ int main(int argc, char **argv) {
short *channel_output_fixed = malloc16(sizeof(short) * 16 * 68 * 384);
short *channel_output_uncoded = malloc16(sizeof(unsigned short) * 16 * 68 * 384);
double errors_bit_uncoded = 0;
- unsigned char *estimated_output;
+ //unsigned char *estimated_output;
unsigned char *estimated_output_bit;
unsigned char *test_input_bit;
unsigned int errors_bit = 0;
test_input_bit = (unsigned char *) malloc16(sizeof(unsigned char) * 16 * 68 * 384);
- estimated_output = (unsigned char *) malloc16(sizeof(unsigned char) * 16 * 68 * 384);
+ //estimated_output = (unsigned char *) malloc16(sizeof(unsigned char) * 16 * 68 * 384);
estimated_output_bit = (unsigned char *) malloc16(sizeof(unsigned char) * 16 * 68 * 384);
NR_UE_DLSCH_t *dlsch0_ue = UE->dlsch[0][0][0];
NR_DL_UE_HARQ_t *harq_process = dlsch0_ue->harq_processes[harq_pid];
@@ -514,7 +516,7 @@ int main(int argc, char **argv) {
for (i = 0; i < TBS / 8; i++)
test_input[i] = (unsigned char) rand();
- estimated_output = harq_process->b;
+ //estimated_output = harq_process->b;
#ifdef DEBUG_DLSCHSIM
for (i = 0; i < TBS / 8; i++) printf("test_input[i]=%d \n",test_input[i]);
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index b95ea7502e..771b6ba7c6 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -46,6 +46,7 @@
#include "SCHED_NR/sched_nr.h"
#include "SCHED_NR/fapi_nr_l1.h"
+#include "SCHED_NR_UE/defs.h"
#include "SCHED_NR_UE/fapi_nr_ue_l1.h"
#include "LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
@@ -57,6 +58,12 @@
#include "NR_PHY_INTERFACE/NR_IF_Module.h"
#include "NR_UE_PHY_INTERFACE/NR_IF_Module.h"
+#include "LAYER2/NR_MAC_UE/mac_proto.h"
+//#include "LAYER2/NR_MAC_gNB/mac_proto.h"
+//#include "openair2/LAYER2/NR_MAC_UE/mac_proto.h"
+#include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
+#include "RRC/NR/MESSAGES/asn1_msg.h"
+
PHY_VARS_gNB *gNB;
PHY_VARS_NR_UE *UE;
@@ -115,51 +122,53 @@ void config_common(int Mod_idP,
// needed for some functions
PHY_VARS_NR_UE ***PHY_vars_UE_g;
short conjugate[8]__attribute__((aligned(32))) = {-1,1,-1,1,-1,1,-1,1};
+openair0_config_t openair0_cfg[MAX_CARDS];
int main(int argc, char **argv)
{
char c;
- int i,l,aa;
+ int i,aa;//,l;
double sigma2, sigma2_dB=10,SNR,snr0=-2.0,snr1=2.0;
uint8_t snr1set=0;
int **txdata;
double **s_re,**s_im,**r_re,**r_im;
- double iqim = 0.0;
- unsigned char pbch_pdu[6];
+ //double iqim = 0.0;
+ //unsigned char pbch_pdu[6];
// int sync_pos, sync_pos_slot;
// FILE *rx_frame_file;
FILE *output_fd = NULL;
- uint8_t write_output_file=0;
+ //uint8_t write_output_file=0;
//int result;
- int freq_offset;
+ //int freq_offset;
// int subframe_offset;
// char fname[40], vname[40];
- int trial,n_trials=1,n_errors,n_errors2,n_alamouti;
+ int trial,n_trials=1,n_errors=0;
+ //int n_errors2, n_alamouti;
uint8_t transmission_mode = 1,n_tx=1,n_rx=1;
uint16_t Nid_cell=0;
uint64_t SSB_positions=0x01;
channel_desc_t *gNB2UE;
- uint32_t nsymb,tx_lev,tx_lev1 = 0,tx_lev2 = 0;
- uint8_t extended_prefix_flag=0;
- int8_t interf1=-21,interf2=-21;
+ //uint32_t nsymb,tx_lev,tx_lev1 = 0,tx_lev2 = 0;
+ //uint8_t extended_prefix_flag=0;
+ //int8_t interf1=-21,interf2=-21;
FILE *input_fd=NULL,*pbch_file_fd=NULL;
- char input_val_str[50],input_val_str2[50];
+ //char input_val_str[50],input_val_str2[50];
- uint8_t frame_mod4,num_pdcch_symbols = 0;
+ //uint8_t frame_mod4,num_pdcch_symbols = 0;
SCM_t channel_model=AWGN;//Rayleigh1_anticorr;
- double pbch_sinr;
- int pbch_tx_ant;
+ //double pbch_sinr;
+ //int pbch_tx_ant;
int N_RB_DL=273,mu=1;
uint64_t ssb_pattern = 0x01;
- unsigned char frame_type = 0;
+ //unsigned char frame_type = 0;
unsigned char pbch_phase = 0;
int frame=0,slot=1;
@@ -192,7 +201,7 @@ int main(int argc, char **argv)
while ((c = getopt (argc, argv, "f:hA:pf:g:i:j:n:s:S:t:x:y:z:M:N:F:GR:dP:IL:")) != -1) {
switch (c) {
- case 'f':
+ /*case 'f':
write_output_file=1;
output_fd = fopen(optarg,"w");
@@ -200,12 +209,11 @@ int main(int argc, char **argv)
printf("Error opening %s\n",optarg);
exit(-1);
}
+ break;*/
- break;
-
- case 'd':
+ /*case 'd':
frame_type = 1;
- break;
+ break;*/
case 'g':
switch((char)*optarg) {
@@ -244,13 +252,13 @@ int main(int argc, char **argv)
break;
- case 'i':
+ /*case 'i':
interf1=atoi(optarg);
break;
case 'j':
interf2=atoi(optarg);
- break;
+ break;*/
case 'n':
n_trials = atoi(optarg);
@@ -272,9 +280,9 @@ int main(int argc, char **argv)
Td= atof(optarg);
break;
*/
- case 'p':
+ /*case 'p':
extended_prefix_flag=1;
- break;
+ break;*/
/*
case 'r':
@@ -361,8 +369,8 @@ int main(int argc, char **argv)
printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n",
argv[0]);
printf("-h This message\n");
- printf("-p Use extended prefix mode\n");
- printf("-d Use TDD\n");
+ //printf("-p Use extended prefix mode\n");
+ //printf("-d Use TDD\n");
printf("-n Number of frames to simulate\n");
printf("-s Starting SNR, runs from SNR0 to SNR0 + 5 dB. If n_frames is 1 then just SNR is simulated\n");
printf("-S Ending SNR, runs from SNR0 to SNR1\n");
@@ -371,15 +379,15 @@ int main(int argc, char **argv)
printf("-x Transmission mode (1,2,6 for the moment)\n");
printf("-y Number of TX antennas used in eNB\n");
printf("-z Number of RX antennas used in UE\n");
- printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n");
- printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n");
+ //printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n");
+ //printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n");
printf("-M Multiple SSB positions in burst\n");
printf("-N Nid_cell\n");
printf("-R N_RB_DL\n");
printf("-O oversampling factor (1,2,4,8,16)\n");
printf("-A Interpolation_filname Run with Abstraction to generate Scatter plot using interpolation polynomial in file\n");
- // printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n");
- printf("-f Output filename (.txt format) for Pe/SNR results\n");
+ //printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n");
+ //printf("-f Output filename (.txt format) for Pe/SNR results\n");
printf("-F Input filename (.txt format) for RX conformance testing\n");
exit (-1);
break;
@@ -676,8 +684,8 @@ int main(int argc, char **argv)
for (SNR=snr0; SNRofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0],
- frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples);
-
- // printf("txlev %d (%f)\n",txlev,10*log10(txlev));
+ /*int txlev = signal_energy(&txdata[0][5*frame_parms->ofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0],
+ frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples);
+ printf("txlev %d (%f)\n",txlev,10*log10(txlev));*/
for (i=0; iul_SCH_Config->retxBSR_Timer) {
UE_mac_inst[Mod_idP].scheduling_info.retxBSR_Timer =
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index c5a569b781..05e88e3ed9 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -65,11 +65,16 @@ uint8_t table_9_2_2_1[16][8]={
{1,0, 14,4, 0,3,6,9},
{1,0, 14,26,0,3,0,0}
};
-int8_t nr_ue_process_dlsch(module_id_t module_id, int cc_id, uint8_t gNB_index, fapi_nr_dci_indication_t *dci_ind, void *pduP, uint32_t pdu_len){
-
+int8_t nr_ue_process_dlsch(module_id_t module_id,
+ int cc_id,
+ uint8_t gNB_index,
+ fapi_nr_dci_indication_t *dci_ind,
+ void *pduP,
+ uint32_t pdu_len)
+{
NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
fapi_nr_ul_config_request_t *ul_config = &mac->ul_config_request;
- fapi_nr_dl_config_request_t *dl_config = &mac->dl_config_request;
+ //fapi_nr_dl_config_request_t *dl_config = &mac->dl_config_request;
nr_phy_config_t *phy_config = &mac->phy_config;
//ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.rnti = rnti;
@@ -1087,7 +1092,7 @@ int8_t nr_ue_process_dci_freq_dom_resource_assignment(
start_RB = riv%n_RB_DLBWP;
// if (l_RB - 1) > floor (n_RB_DLBWP/2) we need to recalculate them using the following lines
tmp_RIV = n_RB_DLBWP * (l_RB - 1) + start_RB;
- if (tmp_RIV != riv) { // then (l_RB - 1) > floor (n_RB_DLBWP/2) and we need to recalculate l_RB and start_RB
+ if ((tmp_RIV != riv) || ((start_RB+l_RB)>n_RB_DLBWP)) { // then (l_RB - 1) > floor (n_RB_DLBWP/2) and we need to recalculate l_RB and start_RB
l_RB = n_RB_DLBWP - l_RB + 2;
start_RB = n_RB_DLBWP - start_RB - 1;
}
@@ -1149,7 +1154,7 @@ int8_t nr_ue_process_dci_time_dom_resource_assignment(
{0,4,7}, // row index 15
{0,8,4} // row index 16
};
- uint8_t table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP[16][3]={ // for PDSCH from TS 38.214 subclause 5.1.2.1.1
+ /*uint8_t table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP[16][3]={ // for PDSCH from TS 38.214 subclause 5.1.2.1.1
{0,(dmrs_typeA_pos == 0)?2:3, (dmrs_typeA_pos == 0)?6:5}, // row index 1
{0,(dmrs_typeA_pos == 0)?2:3, (dmrs_typeA_pos == 0)?10:9}, // row index 2
{0,(dmrs_typeA_pos == 0)?2:3, (dmrs_typeA_pos == 0)?9:8}, // row index 3
@@ -1166,8 +1171,8 @@ int8_t nr_ue_process_dci_time_dom_resource_assignment(
{0,2,4}, // row index 14
{0,4,6}, // row index 15
{0,8,4} // row index 16
- };
- uint8_t table_5_1_2_1_1_4_time_dom_res_alloc_B[16][3]={ // for PDSCH from TS 38.214 subclause 5.1.2.1.1
+ };*/
+ /*uint8_t table_5_1_2_1_1_4_time_dom_res_alloc_B[16][3]={ // for PDSCH from TS 38.214 subclause 5.1.2.1.1
{0,2,2}, // row index 1
{0,4,2}, // row index 2
{0,6,2}, // row index 3
@@ -1184,8 +1189,8 @@ int8_t nr_ue_process_dci_time_dom_resource_assignment(
{0,(dmrs_typeA_pos == 0)?2:3,(dmrs_typeA_pos == 0)?12:11}, // row index 14
{1,2,4}, // row index 15
{0,0,0} // row index 16
- };
- uint8_t table_5_1_2_1_1_5_time_dom_res_alloc_C[16][3]={ // for PDSCH from TS 38.214 subclause 5.1.2.1.1
+ };*/
+ /*uint8_t table_5_1_2_1_1_5_time_dom_res_alloc_C[16][3]={ // for PDSCH from TS 38.214 subclause 5.1.2.1.1
{0,2,2}, // row index 1
{0,4,2}, // row index 2
{0,6,2}, // row index 3
@@ -1202,7 +1207,7 @@ int8_t nr_ue_process_dci_time_dom_resource_assignment(
{0,(dmrs_typeA_pos == 0)?2:3,(dmrs_typeA_pos == 0)?12:11}, // row index 14
{0,0,6}, // row index 15
{0,2,6} // row index 16
- };
+ };*/
uint8_t mu_pusch = 1;
// definition table j Table 6.1.2.1.1-4
uint8_t j = (mu_pusch==3)?3:(mu_pusch==2)?2:1;
@@ -1224,7 +1229,7 @@ int8_t nr_ue_process_dci_time_dom_resource_assignment(
{j+3,0,14}, // row index 15
{j+3,0,10} // row index 16
};
- uint8_t table_6_1_2_1_1_3_time_dom_res_alloc_A_extCP[16][3]={ // for PUSCH from TS 38.214 subclause 6.1.2.1.1
+ /*uint8_t table_6_1_2_1_1_3_time_dom_res_alloc_A_extCP[16][3]={ // for PUSCH from TS 38.214 subclause 6.1.2.1.1
{j, 0,8}, // row index 1
{j, 0,12}, // row index 2
{j, 0,10}, // row index 3
@@ -1241,7 +1246,7 @@ int8_t nr_ue_process_dci_time_dom_resource_assignment(
{j, 8,4}, // row index 14
{j+3,0,8}, // row index 15
{j+3,0,10} // row index 16
- };
+ };*/
/*
* TS 38.214 subclause 5.1.2.1 Resource allocation in time domain (downlink)
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
index def897433e..02c27930d3 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
@@ -48,6 +48,7 @@
#include "pdcp.h"
#include "openair1/PHY/defs_gNB.h"
+#include "openair1/PHY/NR_TRANSPORT/nr_dlsch.h"
//Agent-related headers
#include "flexran_agent_extern.h"
@@ -335,7 +336,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
rnti = UE_RNTI(module_idP, i);
CC_id = UE_PCCID(module_idP, i);
- int spf = get_spf(cfg);
+ //int spf = get_spf(cfg);
if (((frameP&127) == 0) && (slotP == 0)) {
LOG_I(MAC,
@@ -388,7 +389,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
NR_gNB_ULSCH_t *ulsch = RC.gNB[module_idP][CC_id]->ulsch[ii][0];
if((ulsch != NULL) && (ulsch->rnti == rnti)){
LOG_W(MAC, "TODO: clean_eNb_ulsch UE %x \n", rnti);
- //clean_eNb_ulsch(ulsch);
+ clean_gNB_ulsch(ulsch);
}
}
@@ -396,7 +397,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
NR_gNB_DLSCH_t *dlsch = RC.gNB[module_idP][CC_id]->dlsch[ii][0];
if((dlsch != NULL) && (dlsch->rnti == rnti)){
LOG_W(MAC, "TODO: clean_eNb_dlsch UE %x \n", rnti);
- //clean_eNb_dlsch(dlsch);
+ clean_gNB_dlsch(dlsch);
}
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
index 5a57bc2846..ce18158f18 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
@@ -203,8 +203,8 @@ void nr_schedule_uss_dlsch_phytest(module_id_t module_idP,
int dl_carrier_bandwidth = cfg->rf_config.dl_carrier_bandwidth.value;
// everything here is hard-coded to 30 kHz
- int scs = get_dlscs(cfg);
- int slots_per_frame = get_spf(cfg);
+ //int scs = get_dlscs(cfg);
+ //int slots_per_frame = get_spf(cfg);
for (CC_id=0; CC_idue_context.primaryCC_id;
- OCTET_STRING_t *secondaryCellGroup;
+ rrc_gNB_ue_context_t *const ue_context_pP)
+{
+ //uint8_t size;
+ //uint8_t buffer[100];
+ //int CC_id = ue_context_pP->ue_context.primaryCC_id;
+ //OCTET_STRING_t *secondaryCellGroup;
NR_CellGroupConfig_t *cellGroupconfig;
struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_BearerToAddModList;
struct NR_MAC_CellGroupConfig *mac_CellGroupConfig;
struct NR_PhysicalCellGroupConfig *physicalCellGroupConfig;
struct NR_SpCellConfig *spCellConfig;
- struct NR_CellGroupConfig__sCellToAddModList *sCellToAddModList;
+ //struct NR_CellGroupConfig__sCellToAddModList *sCellToAddModList;
cellGroupconfig = CALLOC(1,sizeof(NR_CellGroupConfig_t));
cellGroupconfig->rlc_BearerToAddModList = CALLOC(1,sizeof(struct NR_CellGroupConfig__rlc_BearerToAddModList));
diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h
index 09ad515324..5530a68f9b 100644
--- a/targets/ARCH/COMMON/common_lib.h
+++ b/targets/ARCH/COMMON/common_lib.h
@@ -229,6 +229,8 @@ typedef struct {
double rx_sample_rate;
//! the sample rate for transmit.
double tx_sample_rate;
+ //! check for threequarter sampling rate
+ int8_t threequarter_fs;
} openair0_config_t;
diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
index 8a012b39de..890561f385 100644
--- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
+++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
@@ -1131,7 +1131,15 @@ extern "C" {
openair0_cfg[0].rx_bw = 80e6;
break;
- case 61440000:
+ case 92160000:
+ // from usrp_time_offset
+ //openair0_cfg[0].samples_per_packet = 2048;
+ openair0_cfg[0].tx_sample_advance = 15; //to be checked
+ openair0_cfg[0].tx_bw = 80e6;
+ openair0_cfg[0].rx_bw = 80e6;
+ break;
+
+ case 61440000:
// from usrp_time_offset
//openair0_cfg[0].samples_per_packet = 2048;
openair0_cfg[0].tx_sample_advance = 15;
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf
new file mode 100644
index 0000000000..51910091f7
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf
@@ -0,0 +1,298 @@
+Active_gNBs = ( "gNB-Eurecom-5GNRBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+ ////////// Identification parameters:
+ gNB_ID = 0xe00;
+
+ cell_type = "CELL_MACRO_GNB";
+
+ gNB_name = "gNB-Eurecom-5GNRBox";
+
+ // Tracking area code, 0x0000 and 0xfffe are reserved values
+ tracking_area_code = 1;
+
+ plmn_list = ({mcc = 208; mnc = 93; mnc_length = 2;});
+
+ tr_s_preference = "local_mac"
+
+ ////////// Physical parameters:
+
+ component_carriers = (
+ {
+ node_function = "3GPP_gNODEB";
+ node_timing = "synch_to_ext_device";
+ node_synch_ref = 0;
+ frame_type = "TDD";
+ DL_prefix_type = "NORMAL";
+ UL_prefix_type = "NORMAL";
+ eutra_band = 78;
+ downlink_frequency = 3510000000L;
+ uplink_frequency_offset = -120000000;
+ Nid_cell = 0;
+ N_RB_DL = 217;
+ nb_antenna_ports = 1;
+ nb_antennas_tx = 1;
+ nb_antennas_rx = 1;
+ tx_gain = 90;
+ rx_gain = 125;
+ MIB_subCarrierSpacingCommon = 30;
+ MIB_ssb_SubcarrierOffset = 0;
+ MIB_dmrs_TypeA_Position = 2;
+ pdcch_ConfigSIB1 = 0;
+ SIB1_frequencyOffsetSSB = "khz5";
+ SIB1_ssb_PeriodicityServingCell = 5;
+ SIB1_ss_PBCH_BlockPower = -60;
+ absoluteFrequencySSB = 0;
+ DL_FreqBandIndicatorNR = 15;
+ DL_absoluteFrequencyPointA = 15;
+ DL_offsetToCarrier = 15;
+ DL_SCS_SubcarrierSpacing = "kHz30";
+ DL_SCS_SpecificCarrier_k0 = 0;
+ DL_carrierBandwidth = 15;
+ DL_locationAndBandwidth = 15;
+ DL_BWP_SubcarrierSpacing = "kHz30";
+ DL_BWP_prefix_type = "NORMAL";
+ UL_FreqBandIndicatorNR = 15;
+ UL_absoluteFrequencyPointA = 13;
+ UL_additionalSpectrumEmission = 3;
+ UL_p_Max = -1;
+ UL_frequencyShift7p5khz = "TRUE";
+ UL_offsetToCarrier = 10;
+ UL_SCS_SubcarrierSpacing = "kHz30";
+ UL_SCS_SpecificCarrier_k0 = 0;
+ UL_carrierBandwidth = 15;
+ UL_locationAndBandwidth = 15;
+ UL_BWP_SubcarrierSpacing = "kHz30";
+ UL_BWP_prefix_type = "NORMAL";
+ UL_timeAlignmentTimerCommon = "infinity";
+ ServingCellConfigCommon_n_TimingAdvanceOffset = "n0"
+ ServingCellConfigCommon_ssb_PositionsInBurst_PR = 0x01;
+ ServingCellConfigCommon_ssb_periodicityServingCell = 10;
+ ServingCellConfigCommon_dmrs_TypeA_Position = 2;
+ NIA_SubcarrierSpacing = "kHz15";
+ ServingCellConfigCommon_ss_PBCH_BlockPower = -60;
+ referenceSubcarrierSpacing = "kHz15";
+ dl_UL_TransmissionPeriodicity = "ms0p5";
+ nrofDownlinkSlots = 10;
+ nrofDownlinkSymbols = 10;
+ nrofUplinkSlots = 10;
+ nrofUplinkSymbols = 10;
+ rach_totalNumberOfRA_Preambles = 63;
+ rach_ssb_perRACH_OccasionAndCB_PreamblesPerSSB_choice = "oneEighth";
+ rach_ssb_perRACH_OccasionAndCB_PreamblesPerSSB_oneEighth = 4;
+ rach_ssb_perRACH_OccasionAndCB_PreamblesPerSSB_oneFourth = 8;
+ rach_ssb_perRACH_OccasionAndCB_PreamblesPerSSB_oneHalf = 16;
+ rach_ssb_perRACH_OccasionAndCB_PreamblesPerSSB_one = 24;
+ rach_ssb_perRACH_OccasionAndCB_PreamblesPerSSB_two = 32;
+ rach_ssb_perRACH_OccasionAndCB_PreamblesPerSSB_four = 8;
+ rach_ssb_perRACH_OccasionAndCB_PreamblesPerSSB_eight = 4;
+ rach_ssb_perRACH_OccasionAndCB_PreamblesPerSSB_sixteen = 2;
+ rach_groupBconfigured = "ENABLE";
+ rach_ra_Msg3SizeGroupA = 56;
+ rach_messagePowerOffsetGroupB = "dB0";
+ rach_numberOfRA_PreamblesGroupA = 32;
+ rach_ra_ContentionResolutionTimer = 8;
+ rsrp_ThresholdSSB = 64;
+ rsrp_ThresholdSSB_SUL = 64;
+ prach_RootSequenceIndex_choice = "l839";
+ prach_RootSequenceIndex_l839 = 0;
+ prach_RootSequenceIndex_l139 = 0;
+ prach_msg1_SubcarrierSpacing = "kHz30";
+ restrictedSetConfig = "unrestrictedSet";
+ msg3_transformPrecoding = "ENABLE";
+ prach_ConfigurationIndex = 10;
+ prach_msg1_FDM = "one";
+ prach_msg1_FrequencyStart = 10;
+ zeroCorrelationZoneConfig = 10;
+ preambleReceivedTargetPower = -150;
+ preambleTransMax = 6;
+ powerRampingStep = "dB0";
+ ra_ResponseWindow = 8;
+ groupHoppingEnabledTransformPrecoding = "ENABLE";
+ msg3_DeltaPreamble = 0;
+ p0_NominalWithGrant = 0;
+ PUSCH_TimeDomainResourceAllocation_k2 = 0;
+ PUSCH_TimeDomainResourceAllocation_mappingType = "typeA";
+ PUSCH_TimeDomainResourceAllocation_startSymbolAndLength = 0;
+ pucch_ResourceCommon = 0;
+ pucch_GroupHopping = "neither";
+ hoppingId = 0;
+ p0_nominal = -30;
+ PDSCH_TimeDomainResourceAllocation_k0 = 2;
+ PDSCH_TimeDomainResourceAllocation_mappingType = "typeA";
+ PDSCH_TimeDomainResourceAllocation_startSymbolAndLength = 0;
+ rateMatchPatternId = 0;
+ RateMatchPattern_patternType = "bitmaps";
+ symbolsInResourceBlock = "oneSlot";
+ periodicityAndPattern = 2;
+ RateMatchPattern_controlResourceSet = 5;
+ RateMatchPattern_subcarrierSpacing = "kHz30";
+ RateMatchPattern_mode = "dynamic";
+ controlResourceSetZero = 0;
+ searchSpaceZero = 0;
+ searchSpaceSIB1 = 10;
+ searchSpaceOtherSystemInformation = 10;
+ pagingSearchSpace = 10;
+ ra_SearchSpace = 10;
+ PDCCH_common_controlResourceSetId = 5;
+ PDCCH_common_ControlResourceSet_duration = 2;
+ PDCCH_cce_REG_MappingType = "nonInterleaved";
+ PDCCH_reg_BundleSize = 3;
+ PDCCH_interleaverSize = 3;
+ PDCCH_shiftIndex = 10;
+ PDCCH_precoderGranularity = "sameAsREG-bundle";
+ PDCCH_TCI_StateId = 32;
+ tci_PresentInDCI = "ENABLE";
+ PDCCH_DMRS_ScramblingID = 0;
+ SearchSpaceId = 10;
+ commonSearchSpaces_controlResourceSetId = 5;
+ SearchSpace_monitoringSlotPeriodicityAndOffset_choice = "sl1";
+ SearchSpace_monitoringSlotPeriodicityAndOffset_value = 0;
+ SearchSpace_duration = 2;
+ SearchSpace_nrofCandidates_aggregationLevel1 = 0;
+ SearchSpace_nrofCandidates_aggregationLevel2 = 0;
+ SearchSpace_nrofCandidates_aggregationLevel4 = 0;
+ SearchSpace_nrofCandidates_aggregationLevel8 = 0;
+ SearchSpace_nrofCandidates_aggregationLevel16 = 0;
+ SearchSpace_searchSpaceType = "common";
+ Common_dci_Format2_0_nrofCandidates_SFI_aggregationLevel1 = 1;
+ Common_dci_Format2_0_nrofCandidates_SFI_aggregationLevel2 = 1;
+ Common_dci_Format2_0_nrofCandidates_SFI_aggregationLevel4 = 1;
+ Common_dci_Format2_0_nrofCandidates_SFI_aggregationLevel8 = 1;
+ Common_dci_Format2_0_nrofCandidates_SFI_aggregationLevel16 = 1;
+ Common_dci_Format2_3_monitoringPeriodicity = 1;
+ Common_dci_Format2_3_nrofPDCCH_Candidates = 1;
+ ue_Specific__dci_Formats = "formats0-0-And-1-0";
+ RateMatchPatternLTE_CRS_carrierFreqDL = 6;
+ RateMatchPatternLTE_CRS_carrierBandwidthDL = 6;
+ RateMatchPatternLTE_CRS_nrofCRS_Ports = 1;
+ RateMatchPatternLTE_CRS_v_Shift = 0;
+ RateMatchPatternLTE_CRS_radioframeAllocationPeriod = 1;
+ RateMatchPatternLTE_CRS_radioframeAllocationOffset = 0;
+ RateMatchPatternLTE_CRS_subframeAllocation_choice = "oneFrame";
+ }
+ );
+
+
+ srb1_parameters :
+ {
+ # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
+ timer_poll_retransmit = 80;
+
+ # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
+ timer_reordering = 35;
+
+ # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
+ timer_status_prohibit = 0;
+
+ # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
+ poll_pdu = 4;
+
+ # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
+ poll_byte = 99999;
+
+ # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
+ max_retx_threshold = 4;
+ }
+
+ # ------- SCTP definitions
+ SCTP :
+ {
+ # Number of streams to use in input/output
+ SCTP_INSTREAMS = 2;
+ SCTP_OUTSTREAMS = 2;
+ };
+
+
+ ////////// MME parameters:
+ mme_ip_address = ( { ipv4 = "192.168.12.26";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+ NETWORK_INTERFACES :
+ {
+
+ GNB_INTERFACE_NAME_FOR_S1_MME = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24";
+ GNB_INTERFACE_NAME_FOR_S1U = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24";
+ GNB_PORT_FOR_S1U = 2152; # Spec 2152
+ };
+ }
+);
+
+MACRLCs = (
+ {
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ }
+);
+
+L1s = (
+ {
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ }
+);
+
+RUs = (
+ {
+ local_rf = "yes"
+ nb_tx = 1
+ nb_rx = 1
+ att_tx = 0
+ att_rx = 0;
+ bands = [7];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 114;
+ eNB_instances = [0];
+ sdr_addrs = "addr=192.168.30.2";
+
+ }
+);
+
+THREAD_STRUCT = (
+ {
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_SINGLE_THREAD";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_DISABLE";
+ }
+);
+
+NETWORK_CONTROLLER :
+{
+ FLEXRAN_ENABLED = "no";
+ FLEXRAN_INTERFACE_NAME = "lo";
+ FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
+ FLEXRAN_PORT = 2210;
+ FLEXRAN_CACHE = "/mnt/oai_agent_cache";
+ FLEXRAN_AWAIT_RECONF = "no";
+};
+
+ log_config :
+ {
+ global_log_level ="info";
+ global_log_verbosity ="medium";
+ hw_log_level ="info";
+ hw_log_verbosity ="medium";
+ phy_log_level ="info";
+ phy_log_verbosity ="medium";
+ mac_log_level ="info";
+ mac_log_verbosity ="high";
+ rlc_log_level ="info";
+ rlc_log_verbosity ="medium";
+ pdcp_log_level ="info";
+ pdcp_log_verbosity ="medium";
+ rrc_log_level ="info";
+ rrc_log_verbosity ="medium";
+ };
+
diff --git a/targets/RT/USER/nr-softmodem.c b/targets/RT/USER/nr-softmodem.c
index 5561258694..411281d72a 100644
--- a/targets/RT/USER/nr-softmodem.c
+++ b/targets/RT/USER/nr-softmodem.c
@@ -961,6 +961,7 @@ int main( int argc, char **argv )
fprintf(stderr,"Getting configuration failed\n");
exit(-1);
}
+ openair0_cfg[0].threequarter_fs = threequarter_fs;
#if T_TRACER