Merge with nr_smallBlockCoding
This commit is contained in:
@@ -7,10 +7,10 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
|
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
|
||||||
#include "PHY/NR_TRANSPORT/nr_dci.h"
|
|
||||||
#include "PHY/defs_gNB.h"
|
|
||||||
#include "SIMULATION/TOOLS/sim.h"
|
#include "SIMULATION/TOOLS/sim.h"
|
||||||
|
|
||||||
|
//#define DEBUG_POLAR_PARAMS
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
//Initiate timing. (Results depend on CPU Frequency. Therefore, might change due to performance variances during simulation.)
|
//Initiate timing. (Results depend on CPU Frequency. Therefore, might change due to performance variances during simulation.)
|
||||||
@@ -20,16 +20,6 @@ int main(int argc, char *argv[]) {
|
|||||||
reset_meas(&timeEncoder);
|
reset_meas(&timeEncoder);
|
||||||
reset_meas(&timeDecoder);
|
reset_meas(&timeDecoder);
|
||||||
|
|
||||||
//gNB scheduler
|
|
||||||
/*PHY_VARS_gNB *gNB = RC.gNB[0][0];
|
|
||||||
NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
|
|
||||||
nfapi_nr_config_request_t *cfg = &gNB->gNB_config;
|
|
||||||
|
|
||||||
nfapi_nr_dl_config_request_pdu_t *pdu;
|
|
||||||
nfapi_nr_dl_config_pdcch_parameters_rel15_t *params_rel15 = &pdu->dci_dl_pdu.pdcch_params_rel15;
|
|
||||||
params_rel15->rnti_type = NFAPI_NR_RNTI_RA;
|
|
||||||
params_rel15->dci_format = NFAPI_NR_DL_DCI_FORMAT_1_0;*/
|
|
||||||
|
|
||||||
randominit(0);
|
randominit(0);
|
||||||
//Default simulation values (Aim for iterations = 1000000.)
|
//Default simulation values (Aim for iterations = 1000000.)
|
||||||
int itr, iterations = 1000, arguments, polarMessageType = 0; //0=PBCH, 1=DCI, -1=UCI
|
int itr, iterations = 1000, arguments, polarMessageType = 0; //0=PBCH, 1=DCI, -1=UCI
|
||||||
@@ -38,10 +28,9 @@ int main(int argc, char *argv[]) {
|
|||||||
double SNR, SNR_lin;
|
double SNR, SNR_lin;
|
||||||
int16_t nBitError = 0; // -1 = Decoding failed (All list entries have failed the CRC checks).
|
int16_t nBitError = 0; // -1 = Decoding failed (All list entries have failed the CRC checks).
|
||||||
int8_t decoderState=0, blockErrorState=0; //0 = Success, -1 = Decoding failed, 1 = Block Error.
|
int8_t decoderState=0, blockErrorState=0; //0 = Success, -1 = Decoding failed, 1 = Block Error.
|
||||||
uint16_t testLength, coderLength, blockErrorCumulative=0, bitErrorCumulative=0;
|
uint16_t testLength = 0, coderLength = 0, blockErrorCumulative=0, bitErrorCumulative=0;
|
||||||
double timeEncoderCumulative = 0, timeDecoderCumulative = 0;
|
double timeEncoderCumulative = 0, timeDecoderCumulative = 0;
|
||||||
|
uint8_t aggregation_level;
|
||||||
uint8_t aggregation_level, decoderListSize = 8, pathMetricAppr = 0; //0 --> eq. (8a) and (11b), 1 --> eq. (9) and (12)
|
|
||||||
|
|
||||||
while ((arguments = getopt (argc, argv, "s:d:f:m:i:l:a:")) != -1)
|
while ((arguments = getopt (argc, argv, "s:d:f:m:i:l:a:")) != -1)
|
||||||
switch (arguments)
|
switch (arguments)
|
||||||
@@ -125,6 +114,26 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
t_nrPolar_paramsPtr nrPolar_params = NULL;
|
t_nrPolar_paramsPtr nrPolar_params = NULL;
|
||||||
nr_polar_init(&nrPolar_params, polarMessageType, testLength, aggregation_level);
|
nr_polar_init(&nrPolar_params, polarMessageType, testLength, aggregation_level);
|
||||||
|
#ifdef DEBUG_POLAR_PARAMS
|
||||||
|
nr_polar_init(&nrPolar_params, polarMessageType, testLength, aggregation_level);
|
||||||
|
nr_polar_init(&nrPolar_params, 1, 20, 1);
|
||||||
|
nr_polar_init(&nrPolar_params, 1, 21, 1);
|
||||||
|
nr_polar_init(&nrPolar_params, polarMessageType, testLength, aggregation_level);
|
||||||
|
nr_polar_print_polarParams(nrPolar_params);
|
||||||
|
|
||||||
|
uint32_t in[4];
|
||||||
|
in[0]=0x01189400;
|
||||||
|
in[1]=0xffffff0f;
|
||||||
|
uint8_t *out = malloc(sizeof(uint8_t) * 41);
|
||||||
|
nr_bit2byte_uint32_8_t(in, 41, out);
|
||||||
|
for (int i=0;i<41;i++)
|
||||||
|
printf("out[%d]=%d\n",i,out[i]);
|
||||||
|
uint32_t inn[4];
|
||||||
|
nr_byte2bit_uint8_32_t(out, 41, inn);
|
||||||
|
printf("inn[0]=%#x, inn[1]=%#x\n",inn[0],inn[1]);
|
||||||
|
return (0);
|
||||||
|
#endif
|
||||||
|
|
||||||
t_nrPolar_paramsPtr currentPtr = nr_polar_params(nrPolar_params, polarMessageType, testLength);
|
t_nrPolar_paramsPtr currentPtr = nr_polar_params(nrPolar_params, polarMessageType, testLength);
|
||||||
|
|
||||||
// We assume no a priori knowledge available about the payload.
|
// We assume no a priori knowledge available about the payload.
|
||||||
@@ -149,16 +158,24 @@ int main(int argc, char *argv[]) {
|
|||||||
modulatedInput[i]=(-1)/sqrt(2);
|
modulatedInput[i]=(-1)/sqrt(2);
|
||||||
|
|
||||||
channelOutput[i] = modulatedInput[i] + (gaussdouble(0.0,1.0) * (1/sqrt(2*SNR_lin)));
|
channelOutput[i] = modulatedInput[i] + (gaussdouble(0.0,1.0) * (1/sqrt(2*SNR_lin)));
|
||||||
|
printf("%f\n",channelOutput[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
start_meas(&timeDecoder);
|
start_meas(&timeDecoder);
|
||||||
decoderState = polar_decoder(channelOutput,
|
/*decoderState = polar_decoder(channelOutput,
|
||||||
estimatedOutput,
|
estimatedOutput,
|
||||||
currentPtr,
|
currentPtr,
|
||||||
decoderListSize,
|
NR_POLAR_DECODER_LISTSIZE,
|
||||||
aPrioriArray,
|
aPrioriArray,
|
||||||
pathMetricAppr);
|
NR_POLAR_DECODER_PATH_METRIC_APPROXIMATION);*/
|
||||||
|
decoderState = polar_decoder_aPriori(channelOutput,
|
||||||
|
estimatedOutput,
|
||||||
|
currentPtr,
|
||||||
|
NR_POLAR_DECODER_LISTSIZE,
|
||||||
|
NR_POLAR_DECODER_PATH_METRIC_APPROXIMATION,
|
||||||
|
aPrioriArray);
|
||||||
stop_meas(&timeDecoder);
|
stop_meas(&timeDecoder);
|
||||||
|
|
||||||
//calculate errors
|
//calculate errors
|
||||||
|
|||||||
@@ -21,29 +21,23 @@
|
|||||||
|
|
||||||
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
|
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
|
||||||
|
|
||||||
void nr_byte2bit_uint8(uint8_t *array, uint8_t arraySize, uint8_t *bitArray) {
|
void nr_bit2byte_uint32_8_t(uint32_t *in, uint16_t arraySize, uint8_t *out) {
|
||||||
//First 2 parameters are in bytes.
|
uint8_t arrayInd = ceil(arraySize / 32.0);
|
||||||
|
for (int i = 0; i < arrayInd; i++) {
|
||||||
for (int i = 0; i < arraySize; i++) {
|
for (int j = 0; j < 32; j++) {
|
||||||
bitArray[(7 + (i * 8))] = (array[i] >> 0 & 0x01);
|
out[j+(i*32)] = (in[i] >> j) & 1;
|
||||||
bitArray[(6 + (i * 8))] = (array[i] >> 1 & 0x01);
|
}
|
||||||
bitArray[(5 + (i * 8))] = (array[i] >> 2 & 0x01);
|
|
||||||
bitArray[(4 + (i * 8))] = (array[i] >> 3 & 0x01);
|
|
||||||
bitArray[(3 + (i * 8))] = (array[i] >> 4 & 0x01);
|
|
||||||
bitArray[(2 + (i * 8))] = (array[i] >> 5 & 0x01);
|
|
||||||
bitArray[(1 + (i * 8))] = (array[i] >> 6 & 0x01);
|
|
||||||
bitArray[(i * 8)] = (array[i] >> 7 & 0x01);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void nr_bit2byte(uint32_t *in, uint16_t arraySize, uint8_t *out) {
|
void nr_byte2bit_uint8_32_t(uint8_t *in, uint16_t arraySize, uint32_t *out) {
|
||||||
for (int i = 0; i < arraySize; i++) {
|
uint8_t arrayInd = ceil(arraySize / 32.0);
|
||||||
out[i] = ((*in) >> i) & 1;
|
for (int i = 0; i < arrayInd; i++) {
|
||||||
}
|
out[i]=0;
|
||||||
}
|
for (int j = 31; j > 0; j--) {
|
||||||
|
out[i]|=in[(i*32)+j];
|
||||||
void nr_byte2bit(uint8_t *in, uint16_t arraySize, uint32_t *out) {
|
out[i]<<=1;
|
||||||
for (int i = 0; i < arraySize; i++) {
|
}
|
||||||
*out = (*out) << i | in[i];
|
out[i]|=in[(i*32)];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,17 @@
|
|||||||
* contact@openairinterface.org
|
* contact@openairinterface.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*!\file PHY/CODING/nrPolar_tools/nr_polar_decoder.c
|
||||||
|
* \brief
|
||||||
|
* \author Turker Yilmaz
|
||||||
|
* \date 2018
|
||||||
|
* \version 0.1
|
||||||
|
* \company EURECOM
|
||||||
|
* \email turker.yilmaz@eurecom.fr
|
||||||
|
* \note
|
||||||
|
* \warning
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return values:
|
* Return values:
|
||||||
* 0 --> Success
|
* 0 --> Success
|
||||||
@@ -26,16 +37,255 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
|
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
|
||||||
#include "PHY/CODING/nrPolar_tools/nr_polar_pbch_defs.h"
|
|
||||||
|
|
||||||
int8_t polar_decoder(
|
int8_t polar_decoder(
|
||||||
double *input,
|
double *input,
|
||||||
uint8_t *output,
|
uint32_t *out,
|
||||||
t_nrPolar_paramsPtr polarParams,
|
t_nrPolar_paramsPtr polarParams,
|
||||||
uint8_t listSize,
|
uint8_t listSize,
|
||||||
double *aPrioriPayload,
|
|
||||||
uint8_t pathMetricAppr)
|
uint8_t pathMetricAppr)
|
||||||
{
|
{
|
||||||
|
//Assumes no a priori knowledge.
|
||||||
|
|
||||||
|
uint8_t ***bit = nr_alloc_uint8_t_3D_array(polarParams->N, (polarParams->n+1), 2*listSize);
|
||||||
|
uint8_t **bitUpdated = nr_alloc_uint8_t_2D_array(polarParams->N, (polarParams->n+1)); //0=False, 1=True
|
||||||
|
uint8_t **llrUpdated = nr_alloc_uint8_t_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_t_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; i<polarParams->N; 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; i<polarParams->payloadBits; i++) {
|
||||||
|
for (int j=0; j<polarParams->crcParityBits; j++) {
|
||||||
|
tempECGM[i][j]=polarParams->crc_generator_matrix[i][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i=polarParams->payloadBits; i<polarParams->K; i++) {
|
||||||
|
for (int j=0; j<polarParams->crcParityBits; j++) {
|
||||||
|
if( (i-polarParams->payloadBits) == j ){
|
||||||
|
tempECGM[i][j]=1;
|
||||||
|
} else {
|
||||||
|
tempECGM[i][j]=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i=0; i<polarParams->K; i++) {
|
||||||
|
for (int j=0; j<polarParams->crcParityBits; 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; j<polarParams->crcParityBits; j++) {
|
||||||
|
for (int i=0; i<polarParams->K; 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; currentBit<polarParams->N; 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.
|
||||||
|
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; i<polarParams->N; 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; i<polarParams->crcParityBits; 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_t_3D_array(bit, polarParams->N, (polarParams->n+1));
|
||||||
|
nr_free_double_3D_array(llr, polarParams->N, (polarParams->n+1));
|
||||||
|
nr_free_uint8_t_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_t_3D_array(bit, polarParams->N, (polarParams->n+1));
|
||||||
|
nr_free_double_3D_array(llr, polarParams->N, (polarParams->n+1));
|
||||||
|
nr_free_uint8_t_2D_array(crcChecksum, polarParams->crcParityBits);
|
||||||
|
nr_free_uint8_t_2D_array(extended_crc_generator_matrix, polarParams->K);
|
||||||
|
nr_free_uint8_t_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(
|
||||||
|
double *input,
|
||||||
|
uint32_t *out,
|
||||||
|
t_nrPolar_paramsPtr polarParams,
|
||||||
|
uint8_t listSize,
|
||||||
|
uint8_t pathMetricAppr,
|
||||||
|
double *aPrioriPayload)
|
||||||
|
{
|
||||||
|
|
||||||
uint8_t ***bit = nr_alloc_uint8_t_3D_array(polarParams->N, (polarParams->n+1), 2*listSize);
|
uint8_t ***bit = nr_alloc_uint8_t_3D_array(polarParams->N, (polarParams->n+1), 2*listSize);
|
||||||
uint8_t **bitUpdated = nr_alloc_uint8_t_2D_array(polarParams->N, (polarParams->n+1)); //0=False, 1=True
|
uint8_t **bitUpdated = nr_alloc_uint8_t_2D_array(polarParams->N, (polarParams->n+1)); //0=False, 1=True
|
||||||
@@ -110,11 +360,13 @@ int8_t polar_decoder(
|
|||||||
if (polarParams->information_bit_pattern[currentBit]==0) { //Frozen bit.
|
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, pathMetricAppr); //approximation=0 --> 11b, approximation=1 --> 12
|
||||||
} else { //Information or CRC bit.
|
} else { //Information or CRC bit.
|
||||||
if ( (polarParams->interleaving_pattern[nonFrozenBit] <= polarParams->payloadBits) && (aPrioriPayload[polarParams->interleaving_pattern[nonFrozenBit]] == 0) ) {
|
if ( (polarParams->interleaving_pattern[nonFrozenBit] <= polarParams->payloadBits) &&
|
||||||
|
(aPrioriPayload[polarParams->interleaving_pattern[nonFrozenBit]] == 0) ) {
|
||||||
//Information bit with known value of "0".
|
//Information bit with known value of "0".
|
||||||
updatePathMetric(pathMetric, llr, currentListSize, 0, currentBit, pathMetricAppr);
|
updatePathMetric(pathMetric, llr, currentListSize, 0, currentBit, pathMetricAppr);
|
||||||
bitUpdated[currentBit][0]=1; //0=False, 1=True
|
bitUpdated[currentBit][0]=1; //0=False, 1=True
|
||||||
} else if ( (polarParams->interleaving_pattern[nonFrozenBit] <= polarParams->payloadBits) && (aPrioriPayload[polarParams->interleaving_pattern[nonFrozenBit]] == 1) ) {
|
} else if ( (polarParams->interleaving_pattern[nonFrozenBit] <= polarParams->payloadBits) &&
|
||||||
|
(aPrioriPayload[polarParams->interleaving_pattern[nonFrozenBit]] == 1) ) {
|
||||||
//Information bit with known value of "1".
|
//Information bit with known value of "1".
|
||||||
updatePathMetric(pathMetric, llr, currentListSize, 1, currentBit, pathMetricAppr);
|
updatePathMetric(pathMetric, llr, currentListSize, 1, currentBit, pathMetricAppr);
|
||||||
for (uint8_t i=0; i<currentListSize; i++) bit[currentBit][0][i]=1;
|
for (uint8_t i=0; i<currentListSize; i++) bit[currentBit][0][i]=1;
|
||||||
@@ -257,7 +509,7 @@ int8_t polar_decoder(
|
|||||||
nr_polar_deinterleaver(polarParams->nr_polar_cPrime, polarParams->nr_polar_b, polarParams->interleaving_pattern, polarParams->K);
|
nr_polar_deinterleaver(polarParams->nr_polar_cPrime, polarParams->nr_polar_b, polarParams->interleaving_pattern, polarParams->K);
|
||||||
|
|
||||||
//Remove the CRC (â)
|
//Remove the CRC (â)
|
||||||
for (int j = 0; j < polarParams->payloadBits; j++) output[j]=polarParams->nr_polar_b[j];
|
for (int j = 0; j < polarParams->payloadBits; j++) polarParams->nr_polar_a[j]=polarParams->nr_polar_b[j];
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -271,5 +523,10 @@ int8_t polar_decoder(
|
|||||||
nr_free_uint8_t_2D_array(crcChecksum, polarParams->crcParityBits);
|
nr_free_uint8_t_2D_array(crcChecksum, polarParams->crcParityBits);
|
||||||
nr_free_uint8_t_2D_array(extended_crc_generator_matrix, polarParams->K);
|
nr_free_uint8_t_2D_array(extended_crc_generator_matrix, polarParams->K);
|
||||||
nr_free_uint8_t_2D_array(tempECGM, polarParams->K);
|
nr_free_uint8_t_2D_array(tempECGM, polarParams->K);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return bits.
|
||||||
|
*/
|
||||||
|
nr_byte2bit_uint8_32_t(polarParams->nr_polar_a, polarParams->payloadBits, out);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,17 @@
|
|||||||
* contact@openairinterface.org
|
* contact@openairinterface.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*!\file PHY/CODING/nrPolar_tools/nr_polar_defs.h
|
||||||
|
* \brief
|
||||||
|
* \author Turker Yilmaz
|
||||||
|
* \date 2018
|
||||||
|
* \version 0.1
|
||||||
|
* \company EURECOM
|
||||||
|
* \email turker.yilmaz@eurecom.fr
|
||||||
|
* \note
|
||||||
|
* \warning
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef __NR_POLAR_DEFS__H__
|
#ifndef __NR_POLAR_DEFS__H__
|
||||||
#define __NR_POLAR_DEFS__H__
|
#define __NR_POLAR_DEFS__H__
|
||||||
|
|
||||||
@@ -32,6 +43,9 @@
|
|||||||
#include "PHY/CODING/nrPolar_tools/nr_polar_uci_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_pbch_defs.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)
|
||||||
|
|
||||||
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 };
|
||||||
|
|
||||||
struct nrPolar_params {
|
struct nrPolar_params {
|
||||||
@@ -65,20 +79,33 @@ struct nrPolar_params {
|
|||||||
uint8_t **crc_generator_matrix; //G_P
|
uint8_t **crc_generator_matrix; //G_P
|
||||||
uint8_t **G_N;
|
uint8_t **G_N;
|
||||||
|
|
||||||
//polar_encoder vectors:
|
//polar_encoder vectors
|
||||||
uint8_t *nr_polar_crc;
|
uint8_t *nr_polar_crc;
|
||||||
uint8_t *nr_polar_b;
|
|
||||||
uint8_t *nr_polar_cPrime;
|
|
||||||
uint8_t *nr_polar_u;
|
|
||||||
uint8_t *nr_polar_d;
|
uint8_t *nr_polar_d;
|
||||||
|
uint8_t *nr_polar_e;
|
||||||
|
|
||||||
|
//Polar Coding vectors
|
||||||
|
uint8_t *nr_polar_a;
|
||||||
|
uint8_t *nr_polar_cPrime;
|
||||||
|
uint8_t *nr_polar_b;
|
||||||
|
uint8_t *nr_polar_u;
|
||||||
} __attribute__ ((__packed__));
|
} __attribute__ ((__packed__));
|
||||||
typedef struct nrPolar_params t_nrPolar_params;
|
typedef struct nrPolar_params t_nrPolar_params;
|
||||||
typedef t_nrPolar_params *t_nrPolar_paramsPtr;
|
typedef t_nrPolar_params *t_nrPolar_paramsPtr;
|
||||||
|
|
||||||
void polar_encoder(uint8_t *input, uint8_t *output, t_nrPolar_paramsPtr polarParams);
|
void polar_encoder(uint32_t *input, uint32_t *output, t_nrPolar_paramsPtr polarParams);
|
||||||
|
|
||||||
int8_t polar_decoder(double *input, uint8_t *output, t_nrPolar_paramsPtr polarParams,
|
int8_t polar_decoder(double *input,
|
||||||
uint8_t listSize, double *aPrioriPayload, uint8_t pathMetricAppr);
|
uint32_t *output,
|
||||||
|
t_nrPolar_paramsPtr polarParams,
|
||||||
|
uint8_t listSize,
|
||||||
|
uint8_t pathMetricAppr);
|
||||||
|
int8_t polar_decoder_aPriori(double *input,
|
||||||
|
uint32_t *output,
|
||||||
|
t_nrPolar_paramsPtr polarParams,
|
||||||
|
uint8_t listSize,
|
||||||
|
uint8_t pathMetricAppr,
|
||||||
|
double *aPrioriPayload);
|
||||||
|
|
||||||
void nr_polar_init(t_nrPolar_paramsPtr *polarParams,
|
void nr_polar_init(t_nrPolar_paramsPtr *polarParams,
|
||||||
int8_t messageType,
|
int8_t messageType,
|
||||||
@@ -113,9 +140,8 @@ void nr_polar_info_bit_pattern(uint8_t *ibp, int16_t *Q_I_N, int16_t *Q_F_N,
|
|||||||
void nr_polar_info_bit_extraction(uint8_t *input, uint8_t *output,
|
void nr_polar_info_bit_extraction(uint8_t *input, uint8_t *output,
|
||||||
uint8_t *pattern, uint16_t size);
|
uint8_t *pattern, uint16_t size);
|
||||||
|
|
||||||
void nr_byte2bit(uint8_t *in, uint16_t arraySize, uint32_t *out);
|
void nr_bit2byte_uint32_8_t(uint32_t *in, uint16_t arraySize, uint8_t *out);
|
||||||
void nr_byte2bit_uint8(uint8_t *array, uint8_t arraySize, uint8_t *bitArray);
|
void nr_byte2bit_uint8_32_t(uint8_t *in, uint16_t arraySize, uint32_t *out);
|
||||||
void nr_bit2byte(uint32_t *in, uint16_t arraySize, uint8_t *out);
|
|
||||||
|
|
||||||
void nr_polar_bit_insertion(uint8_t *input, uint8_t *output, uint16_t N,
|
void nr_polar_bit_insertion(uint8_t *input, uint8_t *output, uint16_t N,
|
||||||
uint16_t K, int16_t *Q_I_N, int16_t *Q_PC_N, uint8_t n_PC);
|
uint16_t K, int16_t *Q_I_N, int16_t *Q_PC_N, uint8_t n_PC);
|
||||||
|
|||||||
@@ -19,40 +19,75 @@
|
|||||||
* contact@openairinterface.org
|
* contact@openairinterface.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*!\file PHY/CODING/nrPolar_tools/nr_polar_encoder.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"
|
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
|
||||||
|
|
||||||
void polar_encoder(
|
void polar_encoder(uint32_t *in,
|
||||||
uint8_t *input,
|
uint32_t *out,
|
||||||
uint8_t *output,
|
t_nrPolar_paramsPtr polarParams)
|
||||||
t_nrPolar_paramsPtr polarParams)
|
|
||||||
{
|
{
|
||||||
|
nr_bit2byte_uint32_8_t(in, polarParams->payloadBits, polarParams->nr_polar_a);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Bytewise operations
|
* Bytewise operations
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//Calculate CRC.
|
//Calculate CRC.
|
||||||
nr_matrix_multiplication_uint8_t_1D_uint8_t_2D(input, polarParams->crc_generator_matrix,
|
nr_matrix_multiplication_uint8_t_1D_uint8_t_2D(polarParams->nr_polar_a,
|
||||||
polarParams->nr_polar_crc, polarParams->payloadBits, polarParams->crcParityBits);
|
polarParams->crc_generator_matrix,
|
||||||
for (uint8_t i = 0; i < polarParams->crcParityBits; i++) polarParams->nr_polar_crc[i] = (polarParams->nr_polar_crc[i] % 2);
|
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);
|
||||||
|
|
||||||
//Attach CRC to the Transport Block. (a to b)
|
//Attach CRC to the Transport Block. (a to b)
|
||||||
for (uint16_t i = 0; i < polarParams->payloadBits; i++) polarParams->nr_polar_b[i] = input[i];
|
for (uint16_t i = 0; i < polarParams->payloadBits; i++) polarParams->nr_polar_b[i] = polarParams->nr_polar_a[i];
|
||||||
for (uint16_t i = polarParams->payloadBits; i < polarParams->K; i++)
|
for (uint16_t i = polarParams->payloadBits; i < polarParams->K; i++)
|
||||||
polarParams->nr_polar_b[i]= polarParams->nr_polar_crc[i-(polarParams->payloadBits)];
|
polarParams->nr_polar_b[i]= polarParams->nr_polar_crc[i-(polarParams->payloadBits)];
|
||||||
|
|
||||||
//Interleaving (c to c')
|
//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)
|
//Bit insertion (c' to u)
|
||||||
nr_polar_bit_insertion(polarParams->nr_polar_cPrime, polarParams->nr_polar_u, polarParams->N, polarParams->K,
|
nr_polar_bit_insertion(polarParams->nr_polar_cPrime,
|
||||||
polarParams->Q_I_N, polarParams->Q_PC_N, polarParams->n_pc);
|
polarParams->nr_polar_u,
|
||||||
|
polarParams->N,
|
||||||
|
polarParams->K,
|
||||||
|
polarParams->Q_I_N,
|
||||||
|
polarParams->Q_PC_N,
|
||||||
|
polarParams->n_pc);
|
||||||
|
|
||||||
//Encoding (u to d)
|
//Encoding (u to d)
|
||||||
nr_matrix_multiplication_uint8_t_1D_uint8_t_2D(polarParams->nr_polar_u, polarParams->G_N, polarParams->nr_polar_d, polarParams->N, polarParams->N);
|
nr_matrix_multiplication_uint8_t_1D_uint8_t_2D(polarParams->nr_polar_u,
|
||||||
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
|
//Rate matching
|
||||||
//Sub-block interleaving (d to y) and Bit selection (y to e)
|
//Sub-block interleaving (d to y) and Bit selection (y to e)
|
||||||
nr_polar_rate_matcher(polarParams->nr_polar_d, output, polarParams->rate_matching_pattern, polarParams->encoderLength);
|
nr_polar_rate_matcher(polarParams->nr_polar_d,
|
||||||
|
polarParams->nr_polar_e,
|
||||||
|
polarParams->rate_matching_pattern,
|
||||||
|
polarParams->encoderLength);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return bits.
|
||||||
|
*/
|
||||||
|
nr_byte2bit_uint8_32_t(polarParams->nr_polar_e, polarParams->encoderLength, out);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,15 +19,15 @@
|
|||||||
* contact@openairinterface.org
|
* contact@openairinterface.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*! \file PHY/CODING/nrPolar_tools/nr_polar_dci_defs.h
|
/*!\file PHY/CODING/nrPolar_tools/nr_polar_defs.h
|
||||||
* \brief Defines the constant variables for polar coding of the PBCH from 38-212, V15.1.1 2018-04.
|
* \brief Defines the constant variables for polar coding of the PBCH from 38-212, V15.1.1 2018-04.
|
||||||
* \author
|
* \author Turker Yilmaz
|
||||||
* \date 2018
|
* \date 2018
|
||||||
* \version 0.1
|
* \version 0.1
|
||||||
* \company Eurecom
|
* \company EURECOM
|
||||||
* \email:
|
* \email turker.yilmaz@eurecom.fr
|
||||||
* \note
|
* \note
|
||||||
* \warning
|
* \warning
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __NR_POLAR_PBCH_DEFS__H__
|
#ifndef __NR_POLAR_PBCH_DEFS__H__
|
||||||
@@ -52,9 +52,6 @@
|
|||||||
#define NR_POLAR_PBCH_I_BIL 0 //uint8_t
|
#define NR_POLAR_PBCH_I_BIL 0 //uint8_t
|
||||||
#define NR_POLAR_PBCH_E 864 //uint16_t
|
#define NR_POLAR_PBCH_E 864 //uint16_t
|
||||||
|
|
||||||
//#define NR_POLAR_PBCH_L 5 //uint8_t
|
|
||||||
#define NR_POLAR_PBCH_PATH_METRIC_APPROXIMATION 0 //uint8_t; 0 --> eq. (8a) and (11b), 1 --> eq. (9) and (12)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TEST CODE
|
* TEST CODE
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -19,6 +19,17 @@
|
|||||||
* contact@openairinterface.org
|
* contact@openairinterface.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*!\file PHY/CODING/nr_polar_init.h
|
||||||
|
* \brief
|
||||||
|
* \author Turker Yilmaz
|
||||||
|
* \date 2018
|
||||||
|
* \version 0.1
|
||||||
|
* \company EURECOM
|
||||||
|
* \email turker.yilmaz@eurecom.fr
|
||||||
|
* \note
|
||||||
|
* \warning
|
||||||
|
*/
|
||||||
|
|
||||||
#include "nrPolar_tools/nr_polar_defs.h"
|
#include "nrPolar_tools/nr_polar_defs.h"
|
||||||
#include "PHY/CODING/nrPolar_tools/nr_polar_dci_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_uci_defs.h"
|
||||||
@@ -31,16 +42,11 @@ void nr_polar_init(t_nrPolar_paramsPtr *polarParams,
|
|||||||
uint8_t aggregation_level)
|
uint8_t aggregation_level)
|
||||||
{
|
{
|
||||||
t_nrPolar_paramsPtr currentPtr = *polarParams;
|
t_nrPolar_paramsPtr currentPtr = *polarParams;
|
||||||
t_nrPolar_paramsPtr previousPtr = NULL;
|
|
||||||
|
|
||||||
//Parse the list. If the node is already created, return without initialization.
|
//Parse the list. If the node is already created, return without initialization.
|
||||||
while (currentPtr != NULL) {
|
while (currentPtr != NULL) {
|
||||||
if (currentPtr->idx == (messageType * messageLength)) {
|
if (currentPtr->idx == (messageType * messageLength)) return;
|
||||||
return;
|
else currentPtr = currentPtr->nextPtr;
|
||||||
} else {
|
|
||||||
previousPtr = currentPtr;
|
|
||||||
currentPtr = currentPtr->nextPtr;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Else, initialize and add node to the end of the linked list.
|
//Else, initialize and add node to the end of the linked list.
|
||||||
@@ -88,13 +94,15 @@ void nr_polar_init(t_nrPolar_paramsPtr *polarParams,
|
|||||||
|
|
||||||
//polar_encoder vectors:
|
//polar_encoder vectors:
|
||||||
newPolarInitNode->nr_polar_crc = malloc(sizeof(uint8_t) * newPolarInitNode->crcParityBits);
|
newPolarInitNode->nr_polar_crc = malloc(sizeof(uint8_t) * newPolarInitNode->crcParityBits);
|
||||||
newPolarInitNode->nr_polar_cPrime = malloc(sizeof(uint8_t) * newPolarInitNode->K);
|
|
||||||
newPolarInitNode->nr_polar_d = malloc(sizeof(uint8_t) * newPolarInitNode->N);
|
newPolarInitNode->nr_polar_d = malloc(sizeof(uint8_t) * newPolarInitNode->N);
|
||||||
|
newPolarInitNode->nr_polar_e = malloc(sizeof(uint8_t) * newPolarInitNode->encoderLength);
|
||||||
|
|
||||||
//Polar Coding vectors
|
//Polar Coding vectors
|
||||||
newPolarInitNode->nr_polar_u = malloc(sizeof(uint8_t) * newPolarInitNode->N); //Decoder: nr_polar_uHat
|
newPolarInitNode->nr_polar_u = malloc(sizeof(uint8_t) * newPolarInitNode->N); //Decoder: nr_polar_uHat
|
||||||
newPolarInitNode->nr_polar_cPrime = malloc(sizeof(uint8_t) * newPolarInitNode->K); //Decoder: nr_polar_cHat
|
newPolarInitNode->nr_polar_cPrime = malloc(sizeof(uint8_t) * newPolarInitNode->K); //Decoder: nr_polar_cHat
|
||||||
newPolarInitNode->nr_polar_b = malloc(sizeof(uint8_t) * newPolarInitNode->K); //Decoder: nr_polar_bHat
|
newPolarInitNode->nr_polar_b = malloc(sizeof(uint8_t) * newPolarInitNode->K); //Decoder: nr_polar_bHat
|
||||||
|
newPolarInitNode->nr_polar_a = malloc(sizeof(uint8_t) * newPolarInitNode->payloadBits); //Decoder: nr_polar_aHat
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
newPolarInitNode->Q_0_Nminus1 = nr_polar_sequence_pattern(newPolarInitNode->n);
|
newPolarInitNode->Q_0_Nminus1 = nr_polar_sequence_pattern(newPolarInitNode->n);
|
||||||
@@ -174,7 +182,7 @@ t_nrPolar_paramsPtr nr_polar_params (t_nrPolar_paramsPtr polarParams,
|
|||||||
int8_t messageType,
|
int8_t messageType,
|
||||||
uint16_t messageLength)
|
uint16_t messageLength)
|
||||||
{
|
{
|
||||||
t_nrPolar_paramsPtr currentPtr;
|
t_nrPolar_paramsPtr currentPtr = NULL;
|
||||||
|
|
||||||
while (polarParams != NULL) {
|
while (polarParams != NULL) {
|
||||||
if (polarParams->idx == (messageType * messageLength)) {
|
if (polarParams->idx == (messageType * messageLength)) {
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
|
|||||||
// PBCH DMRS gold sequences generation
|
// PBCH DMRS gold sequences generation
|
||||||
nr_init_pbch_dmrs(gNB);
|
nr_init_pbch_dmrs(gNB);
|
||||||
// Polar encoder init for PBCH
|
// Polar encoder init for PBCH
|
||||||
nr_polar_init(&fp->pbch_polar_params,
|
nr_polar_init(&gNB->nrPolar_params,
|
||||||
NR_POLAR_PBCH_MESSAGE_TYPE,
|
NR_POLAR_PBCH_MESSAGE_TYPE,
|
||||||
NR_POLAR_PBCH_PAYLOAD_BITS,
|
NR_POLAR_PBCH_PAYLOAD_BITS,
|
||||||
NR_POLAR_PBCH_AGGREGATION_LEVEL);
|
NR_POLAR_PBCH_AGGREGATION_LEVEL);
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
|
|
||||||
//#define DEBUG_PDCCH_DMRS
|
//#define DEBUG_PDCCH_DMRS
|
||||||
//#define DEBUG_DCI
|
//#define DEBUG_DCI
|
||||||
|
#define DEBUG_POLAR_PARAMS
|
||||||
|
|
||||||
extern short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT];
|
extern short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT];
|
||||||
|
|
||||||
@@ -202,24 +203,29 @@ uint8_t nr_generate_dci_top(NR_gNB_PDCCH pdcch_vars,
|
|||||||
|
|
||||||
/// DCI payload processing
|
/// DCI payload processing
|
||||||
//channel coding
|
//channel coding
|
||||||
/*uint8_t *encoderInput = malloc(sizeof(uint8_t) * dci_alloc.size);
|
nr_polar_init(nrPolar_params, NR_POLAR_DCI_MESSAGE_TYPE, dci_alloc.size, dci_alloc.L);
|
||||||
nr_bit2byte(dci_alloc.dci_pdu, dci_alloc.size, encoderInput);
|
t_nrPolar_paramsPtr currentPtr = nr_polar_params(*nrPolar_params, NR_POLAR_DCI_MESSAGE_TYPE, dci_alloc.size);
|
||||||
|
|
||||||
nr_polar_init(&nrPolar_params, NR_POLAR_DCI_MESSAGE_TYPE, dci_alloc.size, pdcch_params.aggregation_level);
|
|
||||||
t_nrPolar_paramsPtr currentPtr = nr_polar_params(nrPolar_params,
|
|
||||||
NR_POLAR_DCI_MESSAGE_TYPE,
|
|
||||||
dci_alloc.size);
|
|
||||||
|
|
||||||
|
uint8_t *encoderInput = malloc(sizeof(uint8_t) * dci_alloc.size);
|
||||||
uint8_t *encoderOutput = malloc(sizeof(uint8_t) * currentPtr->encoderLength);
|
uint8_t *encoderOutput = malloc(sizeof(uint8_t) * currentPtr->encoderLength);
|
||||||
polar_encoder(encoderInput, encoderOutput, currentPtr);
|
|
||||||
uint32_t encoded_payload[4];
|
uint32_t encoded_payload[4];
|
||||||
nr_byte2bit(encoderOutput,currentPtr->encoderLength,encoded_payload);*/
|
|
||||||
|
nr_bit2byte_uint32_8_t(dci_alloc.dci_pdu,dci_alloc.size,encoderInput);
|
||||||
|
polar_encoder(encoderInput, encoderOutput, currentPtr);
|
||||||
|
nr_byte2bit_uint8_32_t(encoderOutput, currentPtr->encoderLength, encoded_payload);
|
||||||
|
|
||||||
|
#ifdef DEBUG_POLAR_PARAMS
|
||||||
|
printf("DCI PDU: [0]->0x%08x \t [1]->0x%08x \t [2]->0x%08x \t [3]->0x%08x\n",
|
||||||
|
dci_alloc.dci_pdu[0], dci_alloc.dci_pdu[1], dci_alloc.dci_pdu[2], dci_alloc.dci_pdu[3]);
|
||||||
|
printf("Encoded Payload: [0]->0x%08x \t [1]->0x%08x \t [2]->0x%08x \t [3]->0x%08x\n",
|
||||||
|
encoded_payload[0], encoded_payload[1], encoded_payload[2], encoded_payload[3]);
|
||||||
|
#endif
|
||||||
|
|
||||||
// scrambling
|
// scrambling
|
||||||
uint32_t scrambled_payload[NR_MAX_DCI_SIZE_DWORD];
|
uint32_t scrambled_payload[NR_MAX_DCI_SIZE_DWORD];
|
||||||
uint32_t Nid = (pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)? pdcch_params.scrambling_id : config.sch_config.physical_cell_id.value;
|
uint32_t Nid = (pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)? pdcch_params.scrambling_id : config.sch_config.physical_cell_id.value;
|
||||||
uint32_t n_RNTI = (pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)? pdcch_params.rnti : 0;
|
uint32_t n_RNTI = (pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)? pdcch_params.rnti : 0;
|
||||||
nr_pdcch_scrambling(dci_alloc.dci_pdu, dci_alloc.size, Nid, n_RNTI, scrambled_payload);
|
nr_pdcch_scrambling(encoded_payload, dci_alloc.size, Nid, n_RNTI, scrambled_payload);
|
||||||
|
|
||||||
// QPSK modulation
|
// QPSK modulation
|
||||||
int16_t mod_dci[NR_MAX_DCI_SIZE>>1];
|
int16_t mod_dci[NR_MAX_DCI_SIZE>>1];
|
||||||
|
|||||||
@@ -31,6 +31,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "nr_dci.h"
|
#include "nr_dci.h"
|
||||||
|
#define DEBUG_NFAPI_NR_RNTI_RA
|
||||||
|
|
||||||
void nr_fill_cce_list(NR_gNB_DCI_ALLOC_t* dci_alloc, uint16_t n_shift, uint8_t m) {
|
void nr_fill_cce_list(NR_gNB_DCI_ALLOC_t* dci_alloc, uint16_t n_shift, uint8_t m) {
|
||||||
|
|
||||||
@@ -128,6 +129,17 @@ void nr_fill_dci_and_dlsch(PHY_VARS_gNB *gNB,
|
|||||||
case NFAPI_NR_DL_DCI_FORMAT_1_0:
|
case NFAPI_NR_DL_DCI_FORMAT_1_0:
|
||||||
switch(params_rel15->rnti_type) {
|
switch(params_rel15->rnti_type) {
|
||||||
case NFAPI_NR_RNTI_RA:
|
case NFAPI_NR_RNTI_RA:
|
||||||
|
#ifdef DEBUG_NFAPI_NR_RNTI_RA
|
||||||
|
printf("frequency_domain_assignment = %05d = %#010x\n"
|
||||||
|
" time_domain_assignment = %05d = %#010x\n"
|
||||||
|
" vrb_to_prb_mapping = %05d = %#010x\n"
|
||||||
|
" MCS = %05d = %#010x\n"
|
||||||
|
" tb_scaling = %05d = %#010x\n",
|
||||||
|
pdu_rel15->frequency_domain_assignment,pdu_rel15->frequency_domain_assignment,
|
||||||
|
pdu_rel15->time_domain_assignment,pdu_rel15->time_domain_assignment,
|
||||||
|
pdu_rel15->vrb_to_prb_mapping,pdu_rel15->vrb_to_prb_mapping,
|
||||||
|
pdu_rel15->mcs,pdu_rel15->mcs,pdu_rel15->tb_scaling,pdu_rel15->tb_scaling);
|
||||||
|
#endif
|
||||||
// Freq domain assignment
|
// Freq domain assignment
|
||||||
fsize = (int)ceil( log2( (N_RB*(N_RB+1))>>1 ) );
|
fsize = (int)ceil( log2( (N_RB*(N_RB+1))>>1 ) );
|
||||||
for (int i=0; i<fsize; i++)
|
for (int i=0; i<fsize; i++)
|
||||||
|
|||||||
@@ -535,13 +535,13 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
|
|||||||
unsigned short idx_demod =0;
|
unsigned short idx_demod =0;
|
||||||
int8_t decoderState=0;
|
int8_t decoderState=0;
|
||||||
uint8_t decoderListSize = 8, pathMetricAppr = 0;
|
uint8_t decoderListSize = 8, pathMetricAppr = 0;
|
||||||
double aPrioriArray[frame_parms->pbch_polar_params.payloadBits]; // assume no a priori knowledge available about the payload.
|
|
||||||
|
|
||||||
memset(&pbch_a[0], 0, sizeof(uint8_t) * NR_POLAR_PBCH_PAYLOAD_BITS);
|
memset(&pbch_a[0], 0, sizeof(uint8_t) * NR_POLAR_PBCH_PAYLOAD_BITS);
|
||||||
|
|
||||||
//printf("nr_pbch_ue nid_cell %d\n",frame_parms->Nid_cell);
|
//printf("nr_pbch_ue nid_cell %d\n",frame_parms->Nid_cell);
|
||||||
|
|
||||||
for (int i=0; i<frame_parms->pbch_polar_params.payloadBits; i++) aPrioriArray[i] = NAN;
|
/*double aPrioriArray[frame_parms->pbch_polar_params.payloadBits]; // assume no a priori knowledge available about the payload.
|
||||||
|
for (int i=0; i<frame_parms->pbch_polar_params.payloadBits; i++) aPrioriArray[i] = NAN;*/
|
||||||
|
|
||||||
int subframe_rx = proc->subframe_rx;
|
int subframe_rx = proc->subframe_rx;
|
||||||
|
|
||||||
@@ -651,7 +651,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
|
|||||||
//#endif
|
//#endif
|
||||||
|
|
||||||
//polar decoding de-rate matching
|
//polar decoding de-rate matching
|
||||||
decoderState = polar_decoder(demod_pbch_e, pbch_a_b, &frame_parms->pbch_polar_params, decoderListSize, aPrioriArray, pathMetricAppr);
|
decoderState = polar_decoder(demod_pbch_e, pbch_a, &frame_parms->pbch_polar_params, decoderListSize, pathMetricAppr);
|
||||||
printf("polar decoder state %d\n", decoderState);
|
printf("polar decoder state %d\n", decoderState);
|
||||||
if(decoderState == -1)
|
if(decoderState == -1)
|
||||||
return(decoderState);
|
return(decoderState);
|
||||||
|
|||||||
@@ -283,15 +283,16 @@ typedef struct PHY_VARS_gNB_s {
|
|||||||
/// NFAPI PRACH information
|
/// NFAPI PRACH information
|
||||||
nfapi_preamble_pdu_t preamble_list[MAX_NUM_RX_PRACH_PREAMBLES];
|
nfapi_preamble_pdu_t preamble_list[MAX_NUM_RX_PRACH_PREAMBLES];
|
||||||
|
|
||||||
Sched_Rsp_t Sched_INFO;
|
Sched_Rsp_t Sched_INFO;
|
||||||
NR_gNB_PDCCH pdcch_vars;
|
NR_gNB_PDCCH pdcch_vars;
|
||||||
|
NR_gNB_PBCH pbch;
|
||||||
|
t_nrPolar_paramsPtr nrPolar_params;
|
||||||
nfapi_nr_dl_config_pdcch_parameters_rel15_t pdcch_type0_params;
|
nfapi_nr_dl_config_pdcch_parameters_rel15_t pdcch_type0_params;
|
||||||
LTE_eNB_PHICH phich_vars[2];
|
LTE_eNB_PHICH phich_vars[2];
|
||||||
|
|
||||||
NR_gNB_COMMON common_vars;
|
NR_gNB_COMMON common_vars;
|
||||||
LTE_eNB_UCI uci_vars[NUMBER_OF_UE_MAX];
|
LTE_eNB_UCI uci_vars[NUMBER_OF_UE_MAX];
|
||||||
LTE_eNB_SRS srs_vars[NUMBER_OF_UE_MAX];
|
LTE_eNB_SRS srs_vars[NUMBER_OF_UE_MAX];
|
||||||
NR_gNB_PBCH pbch;
|
|
||||||
LTE_eNB_PUSCH *pusch_vars[NUMBER_OF_UE_MAX];
|
LTE_eNB_PUSCH *pusch_vars[NUMBER_OF_UE_MAX];
|
||||||
LTE_eNB_PRACH prach_vars;
|
LTE_eNB_PRACH prach_vars;
|
||||||
LTE_eNB_DLSCH_t *dlsch[NUMBER_OF_UE_MAX][2]; // Nusers times two spatial streams
|
LTE_eNB_DLSCH_t *dlsch[NUMBER_OF_UE_MAX][2]; // Nusers times two spatial streams
|
||||||
@@ -462,8 +463,6 @@ typedef struct PHY_VARS_gNB_s {
|
|||||||
int32_t pusch_stats_mcs[NUMBER_OF_UE_MAX][10240];
|
int32_t pusch_stats_mcs[NUMBER_OF_UE_MAX][10240];
|
||||||
int32_t pusch_stats_bsr[NUMBER_OF_UE_MAX][10240];
|
int32_t pusch_stats_bsr[NUMBER_OF_UE_MAX][10240];
|
||||||
int32_t pusch_stats_BO[NUMBER_OF_UE_MAX][10240];
|
int32_t pusch_stats_BO[NUMBER_OF_UE_MAX][10240];
|
||||||
|
|
||||||
t_nrPolar_paramsPtr nrPolar_params;
|
|
||||||
} PHY_VARS_gNB;
|
} PHY_VARS_gNB;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -592,12 +592,12 @@ int RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
|
|||||||
int32_t RateMatchPatternLTE_CRS_radioframeAllocationOffset = 0;
|
int32_t RateMatchPatternLTE_CRS_radioframeAllocationOffset = 0;
|
||||||
char* RateMatchPatternLTE_CRS_subframeAllocation_choice = NULL;
|
char* RateMatchPatternLTE_CRS_subframeAllocation_choice = NULL;
|
||||||
|
|
||||||
int32_t srb1_timer_poll_retransmit = 0;
|
/*int32_t srb1_timer_poll_retransmit = 0;
|
||||||
int32_t srb1_timer_reordering = 0;
|
int32_t srb1_timer_reordering = 0;
|
||||||
int32_t srb1_timer_status_prohibit = 0;
|
int32_t srb1_timer_status_prohibit = 0;
|
||||||
int32_t srb1_poll_pdu = 0;
|
int32_t srb1_poll_pdu = 0;
|
||||||
int32_t srb1_poll_byte = 0;
|
int32_t srb1_poll_byte = 0;
|
||||||
int32_t srb1_max_retx_threshold = 0;
|
int32_t srb1_max_retx_threshold = 0;*/
|
||||||
|
|
||||||
//int32_t my_int;
|
//int32_t my_int;
|
||||||
|
|
||||||
@@ -606,11 +606,11 @@ int RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
|
|||||||
paramdef_t GNBParams[] = GNBPARAMS_DESC;
|
paramdef_t GNBParams[] = GNBPARAMS_DESC;
|
||||||
paramlist_def_t GNBParamList = {GNB_CONFIG_STRING_GNB_LIST,NULL,0};
|
paramlist_def_t GNBParamList = {GNB_CONFIG_STRING_GNB_LIST,NULL,0};
|
||||||
////////// Physical parameters
|
////////// Physical parameters
|
||||||
checkedparam_t config_check_CCparams[] = NRCCPARAMS_CHECK;
|
//checkedparam_t config_check_CCparams[] = NRCCPARAMS_CHECK;
|
||||||
paramdef_t CCsParams[] = NRCCPARAMS_DESC;
|
paramdef_t CCsParams[] = NRCCPARAMS_DESC;
|
||||||
paramlist_def_t CCsParamList = {GNB_CONFIG_STRING_COMPONENT_CARRIERS,NULL,0};
|
paramlist_def_t CCsParamList = {GNB_CONFIG_STRING_COMPONENT_CARRIERS,NULL,0};
|
||||||
|
|
||||||
paramdef_t SRB1Params[] = SRB1PARAMS_DESC;
|
//paramdef_t SRB1Params[] = SRB1PARAMS_DESC;
|
||||||
|
|
||||||
/* get global parameters, defined outside any section in the config file */
|
/* get global parameters, defined outside any section in the config file */
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP,
|
|||||||
uint8_t CC_id;
|
uint8_t CC_id;
|
||||||
|
|
||||||
gNB_MAC_INST *nr_mac = RC.nrmac[module_idP];
|
gNB_MAC_INST *nr_mac = RC.nrmac[module_idP];
|
||||||
NR_COMMON_channels_t *cc = nr_mac->common_channels;
|
//NR_COMMON_channels_t *cc = nr_mac->common_channels;
|
||||||
nfapi_nr_dl_config_request_body_t *dl_req;
|
nfapi_nr_dl_config_request_body_t *dl_req;
|
||||||
nfapi_nr_dl_config_request_pdu_t *dl_config_pdu;
|
nfapi_nr_dl_config_request_pdu_t *dl_config_pdu;
|
||||||
nfapi_tx_request_pdu_t *TX_req;
|
nfapi_tx_request_pdu_t *TX_req;
|
||||||
|
|||||||
@@ -604,7 +604,7 @@ void fh_if4p5_north_asynch_in(RU_t *ru,int *frame,int *subframe) {
|
|||||||
RU_proc_t *proc = &ru->proc;
|
RU_proc_t *proc = &ru->proc;
|
||||||
|
|
||||||
uint16_t packet_type;
|
uint16_t packet_type;
|
||||||
uint32_t symbol_number,symbol_mask,symbol_mask_full;
|
uint32_t symbol_number,symbol_mask,symbol_mask_full=0;
|
||||||
int subframe_tx,frame_tx;
|
int subframe_tx,frame_tx;
|
||||||
|
|
||||||
LOG_D(PHY, "%s(ru:%p frame, subframe)\n", __FUNCTION__, ru);
|
LOG_D(PHY, "%s(ru:%p frame, subframe)\n", __FUNCTION__, ru);
|
||||||
|
|||||||
@@ -396,8 +396,8 @@ static void *scope_thread(void *arg) {
|
|||||||
for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||||
if ((ue_cnt<scope_enb_num_ue)) {
|
if ((ue_cnt<scope_enb_num_ue)) {
|
||||||
phy_scope_eNB(form_enb[CC_id][ue_cnt],
|
phy_scope_eNB(form_enb[CC_id][ue_cnt],
|
||||||
RC.gNB[0][CC_id],
|
RC.gNB[0][CC_id],
|
||||||
UE_id);
|
UE_id);
|
||||||
ue_cnt++;
|
ue_cnt++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user