Commit a25d97bc authored by Raymond Knopp's avatar Raymond Knopp

added polar encoding for up to 128 bit payloads. Tested with decoder up to 64

parent 136ed515
...@@ -113,7 +113,8 @@ struct nrPolar_params { ...@@ -113,7 +113,8 @@ struct nrPolar_params {
uint64_t **G_N_tab; uint64_t **G_N_tab;
int groupsize; int groupsize;
int *rm_tab; int *rm_tab;
uint64_t cprime_tab[8][256]; uint64_t cprime_tab0[8][256];
uint64_t cprime_tab1[8][256];
uint64_t B_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;
......
...@@ -374,7 +374,7 @@ void build_polar_tables(t_nrPolar_paramsPtr polarParams) { ...@@ -374,7 +374,7 @@ void build_polar_tables(t_nrPolar_paramsPtr polarParams) {
// build table b -> c' // build table b -> c'
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 < 129, "K = %d > 64, is not supported yet\n",polarParams->K);
int bit_i,ip; int bit_i,ip;
...@@ -386,12 +386,14 @@ void build_polar_tables(t_nrPolar_paramsPtr polarParams) { ...@@ -386,12 +386,14 @@ void build_polar_tables(t_nrPolar_paramsPtr polarParams) {
if (byte<(polarParams->K>>3)) numbits=8; if (byte<(polarParams->K>>3)) numbits=8;
else numbits=residue; else numbits=residue;
for (int val=0;val<256;val++) { for (int val=0;val<256;val++) {
polarParams->cprime_tab[byte][val] = 0; polarParams->cprime_tab0[byte][val] = 0;
polarParams->cprime_tab1[byte][val] = 0;
for (int i=0;i<numbits;i++) { for (int i=0;i<numbits;i++) {
ip=polarParams->deinterleaving_pattern[(8*byte)+i]; ip=polarParams->deinterleaving_pattern[(8*byte)+i];
AssertFatal(ip<64,"ip = %d\n",ip); AssertFatal(ip<128,"ip = %d\n",ip);
bit_i=(val>>i)&1; bit_i=(val>>i)&1;
polarParams->cprime_tab[byte][val] |= (((uint64_t)bit_i)<<ip); if (ip<64) polarParams->cprime_tab0[byte][val] |= (((uint64_t)bit_i)<<ip);
else polarParams->cprime_tab1[byte][val] |= (((uint64_t)bit_i)<<(ip&63));
} }
} }
} }
...@@ -461,29 +463,57 @@ void polar_encoder_fast(int64_t *A, ...@@ -461,29 +463,57 @@ void polar_encoder_fast(int64_t *A,
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=0,Cprime=0; uint64_t B[4]={0,0,0,0},Cprime[4]={0,0,0,0};
int bitlen = polarParams->payloadBits; int bitlen = polarParams->payloadBits;
// append crc
// append crc
AssertFatal(bitlen<129,"support for payloads <= 128 bits\n");
AssertFatal(polarParams->crcParityBits == 24,"support for 24-bit crc only for now\n"); 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; int bitlen0=bitlen;
for (int i=0;i<(1+(bitlen>>6));i++)
if (bitlen0<64)
B[i] = ((A[i])&((((uint64_t)1)<<bitlen0)-1)) |((uint64_t)((crcmask^(crc24c((uint8_t*)A,bitlen0)>>8)))<<bitlen0);
else {
B[i] = A[i];
bitlen0-=64;
}
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]] | if (bitlen<65)
polarParams->cprime_tab[1][Bbyte[1]] | Cprime[0] = polarParams->cprime_tab0[0][Bbyte[0]] |
polarParams->cprime_tab[2][Bbyte[2]] | polarParams->cprime_tab0[1][Bbyte[1]] |
polarParams->cprime_tab[3][Bbyte[3]] | polarParams->cprime_tab0[2][Bbyte[2]] |
polarParams->cprime_tab[4][Bbyte[4]] | polarParams->cprime_tab0[3][Bbyte[3]] |
polarParams->cprime_tab[5][Bbyte[5]] | polarParams->cprime_tab0[4][Bbyte[4]] |
polarParams->cprime_tab[6][Bbyte[6]] | polarParams->cprime_tab0[5][Bbyte[5]] |
polarParams->cprime_tab[7][Bbyte[7]]; polarParams->cprime_tab0[6][Bbyte[6]] |
polarParams->cprime_tab0[7][Bbyte[7]];
else if (bitlen < 129) {
Cprime[0] = polarParams->cprime_tab0[0][Bbyte[0]] |
polarParams->cprime_tab0[1][Bbyte[1]] |
polarParams->cprime_tab0[2][Bbyte[2]] |
polarParams->cprime_tab0[3][Bbyte[3]] |
polarParams->cprime_tab0[4][Bbyte[4]] |
polarParams->cprime_tab0[5][Bbyte[5]] |
polarParams->cprime_tab0[6][Bbyte[6]] |
polarParams->cprime_tab0[7][Bbyte[7]];
Cprime[1] = polarParams->cprime_tab1[0][Bbyte[0]] |
polarParams->cprime_tab1[1][Bbyte[1]] |
polarParams->cprime_tab1[2][Bbyte[2]] |
polarParams->cprime_tab1[3][Bbyte[3]] |
polarParams->cprime_tab1[4][Bbyte[4]] |
polarParams->cprime_tab1[5][Bbyte[5]] |
polarParams->cprime_tab1[6][Bbyte[6]] |
polarParams->cprime_tab1[7][Bbyte[7]];
}
#ifdef DEBUG_POLAR_ENCODER #ifdef DEBUG_POLAR_ENCODER
printf("A %llx B %llx Cprime %llx (payload bits %d,crc %x)\n", 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)((A[0])&((((uint64_t)1)<<bitlen)-1)),
(unsigned long long)B,(unsigned long long)Cprime,polarParams->payloadBits, (unsigned long long)B[0],(unsigned long long)Cprime[0],polarParams->payloadBits,
crc24c((uint8_t*)A,bitlen)); crc24c((uint8_t*)A,bitlen));
#endif #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("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]);
...@@ -499,7 +529,7 @@ void polar_encoder_fast(int64_t *A, ...@@ -499,7 +529,7 @@ void polar_encoder_fast(int64_t *A,
// 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;
/* printf("%llx Cprime_0 (%llx) G %llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx\n",Cprime_i,Cprime &1, /* 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][0],
polarParams->G_N_tab[0][1], polarParams->G_N_tab[0][1],
...@@ -509,40 +539,35 @@ void polar_encoder_fast(int64_t *A, ...@@ -509,40 +539,35 @@ void polar_encoder_fast(int64_t *A,
polarParams->G_N_tab[0][5], polarParams->G_N_tab[0][5],
polarParams->G_N_tab[0][6], polarParams->G_N_tab[0][6],
polarParams->G_N_tab[0][7]);*/ polarParams->G_N_tab[0][7]);*/
uint64_t D[8]; uint64_t D[8]={0,0,0,0,0,0,0,0};
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++) {
D[0] = Cprime_i & polarParams->G_N_tab[0][0]; Cprime_i = -((Cprime[j]>>i)&1); // this converts bit 0 as, 0 => 0000x00, 1 => 1111x11
D[1] = Cprime_i & polarParams->G_N_tab[0][1];
D[2] = Cprime_i & polarParams->G_N_tab[0][2];
D[3] = Cprime_i & polarParams->G_N_tab[0][3];
D[4] = Cprime_i & polarParams->G_N_tab[0][4];
D[5] = Cprime_i & polarParams->G_N_tab[0][5];
D[6] = Cprime_i & polarParams->G_N_tab[0][6];
D[7] = Cprime_i & polarParams->G_N_tab[0][7];
for (int i=1;i<polarParams->K;i++) {
Cprime_i = -((Cprime>>i)&1);
#ifdef DEBUG_POLAR_ENCODER #ifdef DEBUG_POLAR_ENCODER
printf("%llx Cprime_%d (%llx) G %llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx\n", printf("%llx Cprime_%d (%llx) G %llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx\n",
Cprime_i,i,(Cprime>>i) &1, Cprime_i,i,(Cprime[j]>>i) &1,
polarParams->G_N_tab[i][0], polarParams->G_N_tab[i][0],
polarParams->G_N_tab[i][1], polarParams->G_N_tab[i][1],
polarParams->G_N_tab[i][2], polarParams->G_N_tab[i][2],
polarParams->G_N_tab[i][3], polarParams->G_N_tab[i][3],
polarParams->G_N_tab[i][4], polarParams->G_N_tab[i][4],
polarParams->G_N_tab[i][5], polarParams->G_N_tab[i][5],
polarParams->G_N_tab[i][6], polarParams->G_N_tab[i][6],
polarParams->G_N_tab[i][7]); polarParams->G_N_tab[i][7]);
#endif #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]);
D[3] ^= (Cprime_i & polarParams->G_N_tab[i][3]); D[3] ^= (Cprime_i & polarParams->G_N_tab[i][3]);
D[4] ^= (Cprime_i & polarParams->G_N_tab[i][4]); D[4] ^= (Cprime_i & polarParams->G_N_tab[i][4]);
D[5] ^= (Cprime_i & polarParams->G_N_tab[i][5]); D[5] ^= (Cprime_i & polarParams->G_N_tab[i][5]);
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 #ifdef DEBUG_POLAR_ENCODER
printf("D %llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx\n", printf("D %llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx\n",
......
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