Commit df8b32b8 authored by Raymond Knopp's avatar Raymond Knopp

fast polar encoder functional only for 32-64 bit input (B, payload+crc)

parent 123f8745
...@@ -92,12 +92,12 @@ int main(int argc, char *argv[]) { ...@@ -92,12 +92,12 @@ int main(int argc, char *argv[]) {
} }
if (polarMessageType == 0) { //PBCH if (polarMessageType == 0) { //PBCH
testLength = NR_POLAR_PBCH_PAYLOAD_BITS; testLength = 64;//NR_POLAR_PBCH_PAYLOAD_BITS;
coderLength = NR_POLAR_PBCH_E; coderLength = NR_POLAR_PBCH_E;
aggregation_level = NR_POLAR_PBCH_AGGREGATION_LEVEL; aggregation_level = NR_POLAR_PBCH_AGGREGATION_LEVEL;
} else if (polarMessageType == 1) { //DCI } else if (polarMessageType == 1) { //DCI
//testLength = nr_get_dci_size(params_rel15->dci_format, params_rel15->rnti_type, &fp->initial_bwp_dl, cfg); //testLength = nr_get_dci_size(params_rel15->dci_format, params_rel15->rnti_type, &fp->initial_bwp_dl, cfg);
testLength = 20; testLength = 64; //20;
coderLength = 108; //to be changed by aggregate level function. coderLength = 108; //to be changed by aggregate level function.
} else if (polarMessageType == -1) { //UCI } else if (polarMessageType == -1) { //UCI
//testLength = ; //testLength = ;
...@@ -318,10 +318,16 @@ int main(int argc, char *argv[]) { ...@@ -318,10 +318,16 @@ int main(int argc, char *argv[]) {
for (int i=0; i<32; i++) for (int i=0; i<32; i++)
printf("%d\n",(testInput[0]>>i)&1);*/ printf("%d\n",(testInput[0]>>i)&1);*/
start_meas(&timeEncoder); start_meas(&timeEncoder);
polar_encoder(testInput, encoderOutput, currentPtr); if (decoder_int16==0)
polar_encoder(testInput, encoderOutput, currentPtr);
else
polar_encoder_fast((uint64_t*)testInput, (uint64_t*)encoderOutput,0, currentPtr);
stop_meas(&timeEncoder); stop_meas(&timeEncoder);
/*printf("encoderOutput: [0]->0x%08x\n", encoderOutput[0]); /*printf("encoderOutput: [0]->0x%08x\n", encoderOutput[0]);
printf("encoderOutput: [1]->0x%08x\n", encoderOutput[1]);*/ printf("encoderOutput: [1]->0x%08x\n", encoderOutput[1]);*/
...@@ -377,13 +383,16 @@ int main(int argc, char *argv[]) { ...@@ -377,13 +383,16 @@ int main(int argc, char *argv[]) {
blockErrorState=-1; blockErrorState=-1;
nBitError=-1; nBitError=-1;
} else { } else {
for (int i = 0; i < testArrayLength; i++) { for (int j = 0; j < currentPtr->payloadBits; j++) {
for (int j = 0; j < (sizeof(testInput[0])*8); j++) { if (((estimatedOutput[0]>>j) & 1) != ((testInput[0]>>j) & 1)) nBitError++;
if (((estimatedOutput[i]>>j) & 1) != ((testInput[i]>>j) & 1)) nBitError++;
} }
}
if (nBitError>0) blockErrorState=1; if (nBitError>0) {
blockErrorState=1;
printf("Error: Input %x, Output %x\n",testInput[0],estimatedOutput[0]);
}
} }
//Iteration times are in microseconds. //Iteration times are in microseconds.
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
*/ */
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h" #include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
#include "assertions.h"
int8_t polar_decoder( int8_t polar_decoder(
double *input, double *input,
...@@ -1037,6 +1037,31 @@ int8_t polar_decoder_dci(double *input, ...@@ -1037,6 +1037,31 @@ int8_t polar_decoder_dci(double *input,
return(0); return(0);
} }
void init_polar_deinterleaver_table(t_nrPolar_params *polarParams) {
AssertFatal(polarParams->K > 32, "K = %d < 33, is not supported yet\n",polarParams->K);
AssertFatal(polarParams->K < 65, "K = %d > 64, is not supported yet\n",polarParams->K);
int bit_i,ip;
int numbytes = polarParams->K>>3;
int residue = polarParams->K&7;
int numbits;
if (residue>0) numbytes++;
for (int byte=0;byte<numbytes;byte++) {
if (byte<(polarParams->K>>3)) numbits=8;
else numbits=residue;
for (int i=0;i<numbits;i++) {
ip=polarParams->interleaving_pattern[(8*byte)+i];
AssertFatal(ip<64,"ip = %d\n",ip);
for (int val=0;val<256;val++) {
bit_i=(val>>i)&1;
polarParams->B_tab[byte][val] |= (((uint64_t)bit_i)<<ip);
}
}
}
}
int8_t polar_decoder_int16(int16_t *input, int8_t polar_decoder_int16(int16_t *input,
uint8_t *out, uint8_t *out,
...@@ -1053,33 +1078,34 @@ int8_t polar_decoder_int16(int16_t *input, ...@@ -1053,33 +1078,34 @@ int8_t polar_decoder_int16(int16_t *input,
} }
memcpy((void*)&polarParams->tree.root->alpha[0],(void*)&d_tilde[0],sizeof(int16_t)*polarParams->N); memcpy((void*)&polarParams->tree.root->alpha[0],(void*)&d_tilde[0],sizeof(int16_t)*polarParams->N);
/*
* SCL polar decoder.
*/
generic_polar_decoder(polarParams,polarParams->tree.root); generic_polar_decoder(polarParams,polarParams->tree.root);
//Extract the information bits (û to ĉ) //Extract the information bits (û to ĉ)
nr_polar_info_bit_extraction(polarParams->nr_polar_U, polarParams->nr_polar_CPrime, polarParams->information_bit_pattern, polarParams->N); uint64_t Cprime=0;
uint64_t B;
for (int i=0;i<polarParams->K;i++) Cprime = Cprime | ((uint64_t)polarParams->nr_polar_U[polarParams->Q_I_N[i]])<<i;
//Deinterleaving (ĉ to b) //Deinterleaving (ĉ to b)
uint8_t *Cprimebyte = (uint8_t*)&Cprime;
nr_polar_deinterleaver(polarParams->nr_polar_CPrime, polarParams->nr_polar_B, polarParams->interleaving_pattern, polarParams->K); B = polarParams->B_tab[0][Cprimebyte[0]] |
polarParams->B_tab[1][Cprimebyte[1]] |
//Remove the CRC (â) polarParams->B_tab[2][Cprimebyte[2]] |
//for (int j = 0; j < polarParams->payloadBits; j++) polarParams->nr_polar_A[j]=polarParams->nr_polar_B[j]; polarParams->B_tab[3][Cprimebyte[3]] |
polarParams->B_tab[4][Cprimebyte[4]] |
// Check the CRC polarParams->B_tab[5][Cprimebyte[5]] |
for (int j=0;j<polarParams->crcParityBits;j++) { polarParams->B_tab[6][Cprimebyte[6]] |
int crcbit=0; polarParams->B_tab[7][Cprimebyte[7]];
for (int i=0;i<polarParams->payloadBits;i++)
crcbit = crcbit ^ (polarParams->crc_generator_matrix[i][j] & polarParams->nr_polar_B[i]); #if 0
if (crcbit != polarParams->nr_polar_B[polarParams->payloadBits+j]) return(-1); printf("Decoded B %llx (crc %x,B>>payloadBits %x)\n",B,crc24c((uint8_t*)&B,polarParams->payloadBits)>>8,
(uint32_t)(B>>polarParams->payloadBits));
#endif
if ((uint64_t)(crc24c((uint8_t*)&B,polarParams->payloadBits)>>8) == (B>>polarParams->payloadBits)) {
*((uint64_t *)out) = B & (((uint64_t)1<<polarParams->payloadBits)-1);
return(0);
} }
// pack into ceil(payloadBits/32) 32 bit words, lowest index in MSB else return(-1);
// nr_byte2bit_uint8_32_t(polarParams->nr_polar_A, polarParams->payloadBits, out);
nr_byte2bit_uint8_32_t(polarParams->nr_polar_B, polarParams->payloadBits, out);
return(0);
} }
...@@ -98,6 +98,7 @@ struct nrPolar_params { ...@@ -98,6 +98,7 @@ struct nrPolar_params {
uint32_t crcBit; uint32_t crcBit;
uint16_t *interleaving_pattern; uint16_t *interleaving_pattern;
uint16_t *deinterleaving_pattern;
uint16_t *rate_matching_pattern; uint16_t *rate_matching_pattern;
const uint16_t *Q_0_Nminus1; const uint16_t *Q_0_Nminus1;
int16_t *Q_I_N; int16_t *Q_I_N;
...@@ -110,7 +111,10 @@ struct nrPolar_params { ...@@ -110,7 +111,10 @@ 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;
uint64_t **G_N_tab; uint64_t **G_N_tab;
int groupsize;
int *rm_tab;
uint64_t cprime_tab[8][256]; uint64_t cprime_tab[8][256];
uint64_t B_tab[8][256];
uint32_t* crc256Table; uint32_t* crc256Table;
uint8_t **extended_crc_generator_matrix; uint8_t **extended_crc_generator_matrix;
//lowercase: bits, Uppercase: Bits stored in bytes //lowercase: bits, Uppercase: Bits stored in bytes
...@@ -355,11 +359,11 @@ uint8_t **crc6_generator_matrix(uint16_t payloadSizeBits); ...@@ -355,11 +359,11 @@ uint8_t **crc6_generator_matrix(uint16_t payloadSizeBits);
//Also nr_polar_rate_matcher //Also nr_polar_rate_matcher
static inline void nr_polar_interleaver(uint8_t *input, static inline void nr_polar_interleaver(uint8_t *input,
uint8_t *output, uint8_t *output,
uint16_t *pattern, uint16_t *pattern,
uint16_t size) uint16_t size)
{ {
for (int i=0; i<size; i++) output[i]=input[pattern[i]]; for (int i=0; i<size; i++) output[i]=input[pattern[i]];
} }
static inline void nr_polar_deinterleaver(uint8_t *input, static inline void nr_polar_deinterleaver(uint8_t *input,
......
...@@ -45,11 +45,16 @@ void polar_encoder(uint32_t *in, ...@@ -45,11 +45,16 @@ void polar_encoder(uint32_t *in,
t_nrPolar_paramsPtr polarParams) t_nrPolar_paramsPtr polarParams)
{ {
if (polarParams->idx == 0){//PBCH if (polarParams->idx == 0){//PBCH
nr_bit2byte_uint32_8_t(in, polarParams->payloadBits, polarParams->nr_polar_A); uint64_t B = (((uint64_t)*in)&((((uint64_t)1)<<32)-1)) | (((uint64_t)crc24c((uint8_t*)in,polarParams->payloadBits)>>8)<<polarParams->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);
/* /*
* Bytewise operations * Bytewise operations
*/ */
//Calculate CRC. //Calculate CRC.
/*
nr_matrix_multiplication_uint8_t_1D_uint8_t_2D(polarParams->nr_polar_A, nr_matrix_multiplication_uint8_t_1D_uint8_t_2D(polarParams->nr_polar_A,
polarParams->crc_generator_matrix, polarParams->crc_generator_matrix,
polarParams->nr_polar_crc, polarParams->nr_polar_crc,
...@@ -58,11 +63,23 @@ void polar_encoder(uint32_t *in, ...@@ -58,11 +63,23 @@ void polar_encoder(uint32_t *in,
for (uint8_t i = 0; i < polarParams->crcParityBits; i++) for (uint8_t i = 0; i < polarParams->crcParityBits; i++)
polarParams->nr_polar_crc[i] = (polarParams->nr_polar_crc[i] % 2); 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++) for (uint16_t i = 0; i < polarParams->payloadBits; i++)
polarParams->nr_polar_B[i] = polarParams->nr_polar_A[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]= 0;//polarParams->nr_polar_crc[i-(polarParams->payloadBits)];
*/
uint64_t B2=0;
for (int i = 0;i<polarParams->K;i++) B2 = B2 | ((uint64_t)polarParams->nr_polar_B[i] << i);
printf("polar_B %llx\n",B2);
/* for (int j=0;j<polarParams->crcParityBits;j++) {
for (int i=0;i<polarParams->payloadBits;i++)
printf("%1d.%1d+",polarParams->crc_generator_matrix[i][j],polarParams->nr_polar_A[i]);
printf(" => %d\n",polarParams->nr_polar_crc[j]);
}*/
} else { //UCI } else { //UCI
} }
...@@ -73,6 +90,15 @@ void polar_encoder(uint32_t *in, ...@@ -73,6 +90,15 @@ void polar_encoder(uint32_t *in,
polarParams->interleaving_pattern, polarParams->interleaving_pattern,
polarParams->K); polarParams->K);
uint64_t Cprime=0;
for (int i = 0;i<polarParams->K;i++) {
Cprime = Cprime | ((uint64_t)polarParams->nr_polar_CPrime[i] << i);
if (polarParams->nr_polar_CPrime[i] == 1) printf("pos %d : %llx\n",i,Cprime);
}
#ifdef DEBUG_POLAR_ENCODER
printf("polar_Cprime %llx\n",Cprime);
#endif
//Bit insertion (c' to u) //Bit insertion (c' to u)
nr_polar_bit_insertion(polarParams->nr_polar_CPrime, nr_polar_bit_insertion(polarParams->nr_polar_CPrime,
polarParams->nr_polar_U, polarParams->nr_polar_U,
...@@ -83,6 +109,9 @@ void polar_encoder(uint32_t *in, ...@@ -83,6 +109,9 @@ void polar_encoder(uint32_t *in,
polarParams->n_pc); polarParams->n_pc);
//Encoding (u to d) //Encoding (u to d)
/* memset(polarParams->nr_polar_U,0,polarParams->N);
polarParams->nr_polar_U[247]=1;
polarParams->nr_polar_U[253]=1;*/
nr_matrix_multiplication_uint8_t_1D_uint8_t_2D(polarParams->nr_polar_U, nr_matrix_multiplication_uint8_t_1D_uint8_t_2D(polarParams->nr_polar_U,
polarParams->G_N, polarParams->G_N,
polarParams->nr_polar_D, polarParams->nr_polar_D,
...@@ -91,6 +120,14 @@ void polar_encoder(uint32_t *in, ...@@ -91,6 +120,14 @@ void polar_encoder(uint32_t *in,
for (uint16_t i = 0; i < polarParams->N; i++) for (uint16_t i = 0; i < polarParams->N; i++)
polarParams->nr_polar_D[i] = (polarParams->nr_polar_D[i] % 2); polarParams->nr_polar_D[i] = (polarParams->nr_polar_D[i] % 2);
uint64_t D[8];
memset((void*)D,0,8*sizeof(int64_t));
#ifdef DEBUG_POLAR_ENCODER
for (int i=0;i<polarParams->N;i++) D[i/64] |= ((uint64_t)polarParams->nr_polar_D[i])<<(i&63);
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
//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_interleaver(polarParams->nr_polar_D, nr_polar_interleaver(polarParams->nr_polar_D,
...@@ -316,6 +353,15 @@ void polar_encoder_timing(uint32_t *in, ...@@ -316,6 +353,15 @@ void polar_encoder_timing(uint32_t *in,
(timeEncoderByte2Bit.diff_now/(cpuFreqGHz*1000.0))); (timeEncoderByte2Bit.diff_now/(cpuFreqGHz*1000.0)));
} }
static inline void polar_rate_matching(t_nrPolar_paramsPtr polarParams,void *in,void *out) __attribute__((always_inline));
static inline void polar_rate_matching(t_nrPolar_paramsPtr polarParams,void *in,void *out) {
if (polarParams->groupsize == 8)
for (int i=0;i<polarParams->encoderLength>>3;i++) ((uint8_t*)out)[i] = ((uint8_t *)in)[polarParams->rm_tab[i]];
else
for (int i=0;i<polarParams->encoderLength>>4;i++) ((uint16_t*)out)[i] = ((uint16_t *)in)[polarParams->rm_tab[i]];
}
void build_polar_tables(t_nrPolar_paramsPtr polarParams) { void build_polar_tables(t_nrPolar_paramsPtr polarParams) {
...@@ -326,6 +372,7 @@ void build_polar_tables(t_nrPolar_paramsPtr polarParams) { ...@@ -326,6 +372,7 @@ void build_polar_tables(t_nrPolar_paramsPtr polarParams) {
AssertFatal(polarParams->K < 65, "K = %d > 64, is not supported yet\n",polarParams->K); AssertFatal(polarParams->K < 65, "K = %d > 64, is not supported yet\n",polarParams->K);
int bit_i,ip; int bit_i,ip;
int numbytes = polarParams->K>>3; int numbytes = polarParams->K>>3;
int residue = polarParams->K&7; int residue = polarParams->K&7;
int numbits; int numbits;
...@@ -333,46 +380,89 @@ void build_polar_tables(t_nrPolar_paramsPtr polarParams) { ...@@ -333,46 +380,89 @@ void build_polar_tables(t_nrPolar_paramsPtr polarParams) {
for (int byte=0;byte<numbytes;byte++) { for (int byte=0;byte<numbytes;byte++) {
if (byte<(polarParams->K>>3)) numbits=8; if (byte<(polarParams->K>>3)) numbits=8;
else numbits=residue; else numbits=residue;
for (int i=0;i<numbits;i++) { for (int val=0;val<256;val++) {
ip=polarParams->interleaving_pattern[(8*byte)+i]; polarParams->cprime_tab[byte][val] = 0;
printf("input (%d,%d) %d ip %d\n",byte,i,(8*byte)+i,ip); for (int i=0;i<numbits;i++) {
AssertFatal(ip<64,"ip = %d\n",ip); ip=polarParams->deinterleaving_pattern[(8*byte)+i];
for (int val=0;val<256;val++) { AssertFatal(ip<64,"ip = %d\n",ip);
bit_i=(val>>i)&1; bit_i=(val>>i)&1;
polarParams->cprime_tab[byte][val] |= (bit_i<<polarParams->interleaving_pattern[(8*byte)+i]); polarParams->cprime_tab[byte][val] |= (((uint64_t)bit_i)<<ip);
} }
} }
for (int val=0;val<255;val++)
printf("cprime_tab[%d][%d] = %llx\n",byte,val,polarParams->cprime_tab[byte][val]);
} }
AssertFatal(polarParams->N==512,"N = %d, not done yet\n",polarParams->N); AssertFatal(polarParams->N==512,"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. // 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 // keep only rows of G which correspond to information/crc bits
polarParams->G_N_tab = (uint64_t**)malloc(polarParams->K * sizeof(int64_t*)); polarParams->G_N_tab = (uint64_t**)malloc(polarParams->K * sizeof(int64_t*));
for (int i=0;i<polarParams->K;i++) { int k=0;
polarParams->G_N_tab[i] = (uint64_t*)memalign(32,(polarParams->N/64)*sizeof(uint64_t)); for (int i=0;i<polarParams->N;i++) {
memset((void*)polarParams->G_N_tab[i],0,(polarParams->N/64)*sizeof(uint64_t)); if (polarParams->information_bit_pattern[i] > 0) {
for (int j=0;j<polarParams->N;j++) polarParams->G_N_tab[k] = (uint64_t*)memalign(32,(polarParams->N/64)*sizeof(uint64_t));
polarParams->G_N_tab[i][j/64] |= polarParams->G_N[polarParams->Q_I_N[i]][j]<<(j&63); memset((void*)polarParams->G_N_tab[k],0,(polarParams->N/64)*sizeof(uint64_t));
for (int j=0;j<polarParams->N;j++)
polarParams->G_N_tab[k][j/64] |= ((uint64_t)polarParams->G_N[i][j])<<(j&63);
#ifdef DEBUG_POLAR_ENCODER
printf("Bit %d Selecting row %d of G : ",k,i);
for (int j=0;j<polarParams->N;j+=4) printf("%1x",polarParams->G_N[i][j]+(polarParams->G_N[i][j+1]*2)+(polarParams->G_N[i][j+2]*4)+(polarParams->G_N[i][j+3]*8));
printf("\n");
#endif
k++;
}
}
// rate matching table
int iplast=polarParams->rate_matching_pattern[0];
int ccnt=0;
int groupcnt=0;
int firstingroup_out=0;
int firstingroup_in=iplast;
int mingroupsize = 1024;
// compute minimum group size of rate-matching pattern
for (int outpos=1; outpos<polarParams->encoderLength; outpos++) {
ip=polarParams->rate_matching_pattern[outpos];
if ((ip - iplast) == 1) ccnt++;
else {
groupcnt++;
printf("group %d (size %d): (%d:%d) => (%d:%d)\n",groupcnt,ccnt+1,
firstingroup_in,firstingroup_in+ccnt,
firstingroup_out,firstingroup_out+ccnt);
if ((ccnt+1)<mingroupsize) mingroupsize=ccnt+1;
ccnt=0;
firstingroup_out=outpos;
firstingroup_in=ip;
}
iplast=ip;
} }
AssertFatal(mingroupsize==8 || mingroupsize==16,"mingroupsize %d, needs to be handled\n");
polarParams->groupsize=mingroupsize;
int shift=3;
if (mingroupsize == 16) shift=4;
polarParams->rm_tab=(int*)malloc(sizeof(int)*polarParams->encoderLength/mingroupsize);
// rerun again to create groups
int tcnt;
for (int outpos=0;outpos<polarParams->encoderLength; outpos+=mingroupsize,tcnt++)
polarParams->rm_tab[tcnt] = polarParams->rate_matching_pattern[outpos]>>shift;
} }
void polar_encoder_fast(int64_t *A, void polar_encoder_fast(int64_t *A,
int64_t *D, uint32_t *out,
int bitlen,
int32_t crcmask, int32_t crcmask,
t_nrPolar_paramsPtr polarParams) { t_nrPolar_paramsPtr polarParams) {
AssertFatal(polarParams->K > 32, "K = %d < 33, is not supported yet\n",polarParams->K); AssertFatal(polarParams->K > 32, "K = %d < 33, is not supported yet\n",polarParams->K);
AssertFatal(polarParams->K < 65, "K = %d > 64, is not supported yet\n",polarParams->K); AssertFatal(polarParams->K < 65, "K = %d > 64, is not supported yet\n",polarParams->K);
uint64_t B,Cprime; uint64_t B=0,Cprime=0;
int bitlen = polarParams->payloadBits;
// append crc // append crc
B = *A | ((crcmask^crc24c(A,bitlen))<<bitlen);
AssertFatal(polarParams->crcParityBits == 24,"support for 24-bit crc only for now\n");
B = ((*A)&((((uint64_t)1)<<bitlen)-1)) |((uint64_t)((crcmask^(crc24c((uint8_t*)A,bitlen)>>8)))<<bitlen);
uint8_t *Bbyte = (uint8_t*)&B; uint8_t *Bbyte = (uint8_t*)&B;
// for each byte of B, lookup in corresponding table for 64-bit word corresponding to that byte and its position // for each byte of B, lookup in corresponding table for 64-bit word corresponding to that byte and its position
Cprime = polarParams->cprime_tab[0][Bbyte[0]] | Cprime = polarParams->cprime_tab[0][Bbyte[0]] |
...@@ -384,11 +474,38 @@ void polar_encoder_fast(int64_t *A, ...@@ -384,11 +474,38 @@ void polar_encoder_fast(int64_t *A,
polarParams->cprime_tab[6][Bbyte[6]] | polarParams->cprime_tab[6][Bbyte[6]] |
polarParams->cprime_tab[7][Bbyte[7]]; polarParams->cprime_tab[7][Bbyte[7]];
#ifdef DEBUG_POLAR_ENCODER
printf("A %llx B %llx Cprime %llx (payload bits %d,crc %x)\n",
(unsigned long long)((*A)&((((uint64_t)1)<<bitlen)-1)),
(unsigned long long)B,(unsigned long long)Cprime,polarParams->payloadBits,
crc24c((uint8_t*)A,bitlen));
#endif
/* printf("Bbytes : %x.%x.%x.%x.%x.%x.%x.%x\n",Bbyte[0],Bbyte[1],Bbyte[2],Bbyte[3],Bbyte[4],Bbyte[5],Bbyte[6],Bbyte[7]);
printf("%llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx\n",polarParams->cprime_tab[0][Bbyte[0]] ,
polarParams->cprime_tab[1][Bbyte[1]] ,
polarParams->cprime_tab[2][Bbyte[2]] ,
polarParams->cprime_tab[3][Bbyte[3]] ,
polarParams->cprime_tab[4][Bbyte[4]] ,
polarParams->cprime_tab[5][Bbyte[5]] ,
polarParams->cprime_tab[6][Bbyte[6]] ,
polarParams->cprime_tab[7][Bbyte[7]]);*/
// now do Gu product (here using 64-bit XORs, we can also do with SIMD after) // now do Gu product (here using 64-bit XORs, we can also do with SIMD after)
// here we're reading out the bits LSB -> MSB, is this correct w.r.t. 3GPP ? // here we're reading out the bits LSB -> MSB, is this correct w.r.t. 3GPP ?
uint64_t Cprime_i = -(Cprime & 1); // this converts bit 0 as, 0 => 0000x00, 1 => 1111x11 uint64_t Cprime_i = -(Cprime & 1); // this converts bit 0 as, 0 => 0000x00, 1 => 1111x11
/* printf("%llx Cprime_0 (%llx) G %llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx\n",Cprime_i,Cprime &1,
polarParams->G_N_tab[0][0],
polarParams->G_N_tab[0][1],
polarParams->G_N_tab[0][2],
polarParams->G_N_tab[0][3],
polarParams->G_N_tab[0][4],
polarParams->G_N_tab[0][5],
polarParams->G_N_tab[0][6],
polarParams->G_N_tab[0][7]);*/
uint64_t D[8];
D[0] = Cprime_i & polarParams->G_N_tab[0][0]; D[0] = Cprime_i & polarParams->G_N_tab[0][0];
D[1] = Cprime_i & polarParams->G_N_tab[0][1]; D[1] = Cprime_i & polarParams->G_N_tab[0][1];
D[2] = Cprime_i & polarParams->G_N_tab[0][2]; D[2] = Cprime_i & polarParams->G_N_tab[0][2];
...@@ -397,9 +514,22 @@ void polar_encoder_fast(int64_t *A, ...@@ -397,9 +514,22 @@ void polar_encoder_fast(int64_t *A,
D[5] = Cprime_i & polarParams->G_N_tab[0][5]; D[5] = Cprime_i & polarParams->G_N_tab[0][5];
D[6] = Cprime_i & polarParams->G_N_tab[0][6]; D[6] = Cprime_i & polarParams->G_N_tab[0][6];
D[7] = Cprime_i & polarParams->G_N_tab[0][7]; D[7] = Cprime_i & polarParams->G_N_tab[0][7];
for (int i=1;i<bitlen;i++) { for (int i=1;i<polarParams->K;i++) {
Cprime_i = -((Cprime>>i)&1); Cprime_i = -((Cprime>>i)&1);
#ifdef DEBUG_POLAR_ENCODER
printf("%llx Cprime_%d (%llx) G %llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx\n",
Cprime_i,i,(Cprime>>i) &1,
polarParams->G_N_tab[i][0],
polarParams->G_N_tab[i][1],
polarParams->G_N_tab[i][2],
polarParams->G_N_tab[i][3],
polarParams->G_N_tab[i][4],
polarParams->G_N_tab[i][5],
polarParams->G_N_tab[i][6],
polarParams->G_N_tab[i][7]);
#endif
D[0] ^= (Cprime_i & polarParams->G_N_tab[i][0]); D[0] ^= (Cprime_i & polarParams->G_N_tab[i][0]);
D[1] ^= (Cprime_i & polarParams->G_N_tab[i][1]); D[1] ^= (Cprime_i & polarParams->G_N_tab[i][1]);
D[2] ^= (Cprime_i & polarParams->G_N_tab[i][2]); D[2] ^= (Cprime_i & polarParams->G_N_tab[i][2]);
...@@ -409,8 +539,17 @@ void polar_encoder_fast(int64_t *A, ...@@ -409,8 +539,17 @@ void polar_encoder_fast(int64_t *A,
D[6] ^= (Cprime_i & polarParams->G_N_tab[i][6]); D[6] ^= (Cprime_i & polarParams->G_N_tab[i][6]);
D[7] ^= (Cprime_i & polarParams->G_N_tab[i][7]); D[7] ^= (Cprime_i & polarParams->G_N_tab[i][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
// Rate matching on the 8 64-bit D bit-strings should be performed more or less like polar_rate_matching(polarParams,(void*)D,(void*)out);
// The interleaving on the single 64-bit input in the first step. We just need 64 lookup tables I guess, and they will have large entries
} }
...@@ -36,6 +36,11 @@ ...@@ -36,6 +36,11 @@
#include "PHY/CODING/nrPolar_tools/nr_polar_pbch_defs.h" #include "PHY/CODING/nrPolar_tools/nr_polar_pbch_defs.h"
#include "PHY/NR_TRANSPORT/nr_dci.h" #include "PHY/NR_TRANSPORT/nr_dci.h"
static int intcmp(const void *p1,const void *p2) {
return(*(int16_t*)p1 > *(int16_t*)p2);
}
void nr_polar_init(t_nrPolar_paramsPtr *polarParams, void nr_polar_init(t_nrPolar_paramsPtr *polarParams,
int8_t messageType, int8_t messageType,
uint16_t messageLength, uint16_t messageLength,
...@@ -115,6 +120,10 @@ void nr_polar_init(t_nrPolar_paramsPtr *polarParams, ...@@ -115,6 +120,10 @@ void nr_polar_init(t_nrPolar_paramsPtr *polarParams,
newPolarInitNode->i_il, newPolarInitNode->i_il,
newPolarInitNode->interleaving_pattern); newPolarInitNode->interleaving_pattern);
newPolarInitNode->deinterleaving_pattern = malloc(sizeof(uint16_t) * newPolarInitNode->K);
for (int i=0;i<newPolarInitNode->K;i++)
newPolarInitNode->deinterleaving_pattern[newPolarInitNode->interleaving_pattern[i]] = i;
newPolarInitNode->rate_matching_pattern = malloc(sizeof(uint16_t) * newPolarInitNode->encoderLength); newPolarInitNode->rate_matching_pattern = malloc(sizeof(uint16_t) * newPolarInitNode->encoderLength);
uint16_t *J = malloc(sizeof(uint16_t) * newPolarInitNode->N); uint16_t *J = malloc(sizeof(uint16_t) * newPolarInitNode->N);
nr_polar_rate_matching_pattern(newPolarInitNode->rate_matching_pattern, nr_polar_rate_matching_pattern(newPolarInitNode->rate_matching_pattern,
...@@ -139,7 +148,9 @@ void nr_polar_init(t_nrPolar_paramsPtr *polarParams, ...@@ -139,7 +148,9 @@ void nr_polar_init(t_nrPolar_paramsPtr *polarParams,
newPolarInitNode->N, newPolarInitNode->N,
newPolarInitNode->encoderLength, newPolarInitNode->encoderLength,
newPolarInitNode->n_pc); newPolarInitNode->n_pc);
// sort the Q_I_N array in ascending order (first K positions)
qsort((void*)newPolarInitNode->Q_I_N,newPolarInitNode->K,sizeof(int16_t),intcmp);
newPolarInitNode->channel_interleaver_pattern = malloc(sizeof(uint16_t) * newPolarInitNode->encoderLength); newPolarInitNode->channel_interleaver_pattern = malloc(sizeof(uint16_t) * newPolarInitNode->encoderLength);
nr_polar_channel_interleaver_pattern(newPolarInitNode->channel_interleaver_pattern, nr_polar_channel_interleaver_pattern(newPolarInitNode->channel_interleaver_pattern,
newPolarInitNode->i_bil, newPolarInitNode->i_bil,
...@@ -149,6 +160,8 @@ void nr_polar_init(t_nrPolar_paramsPtr *polarParams, ...@@ -149,6 +160,8 @@ void nr_polar_init(t_nrPolar_paramsPtr *polarParams,
build_decoder_tree(newPolarInitNode); build_decoder_tree(newPolarInitNode);
build_polar_tables(newPolarInitNode); build_polar_tables(newPolarInitNode);
init_polar_deinterleaver_table(newPolarInitNode);
printf("decoder tree nodes %d\n",newPolarInitNode->tree.num_nodes); printf("decoder tree nodes %d\n",newPolarInitNode->tree.num_nodes);
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment