use non-systematic polar codes

This commit is contained in:
Ahmet Inan 2025-06-25 11:53:59 +02:00
commit f92a24eb5a
4 changed files with 28 additions and 67 deletions

View file

@ -6,7 +6,6 @@ Copyright 2021 Ahmet Inan <inan@aicodix.de>
#include <iostream>
#include <cassert>
#include <cstdint>
#include <cmath>
#include "xorshift.hh"
#include "complex.hh"
@ -22,7 +21,7 @@ Copyright 2021 Ahmet Inan <inan@aicodix.de>
#include "psk.hh"
#include "qam.hh"
#include "polar_tables.hh"
#include "polar_parity_aided.hh"
#include "polar_encoder.hh"
#include "bose_chaudhuri_hocquenghem_encoder.hh"
template <typename value, typename cmplx, int rate>
@ -45,7 +44,7 @@ struct Encoder
CODE::CRC<uint16_t> crc0;
CODE::CRC<uint32_t> crc1;
CODE::BoseChaudhuriHocquenghemEncoder<255, 71> bchenc;
CODE::PolarParityEncoder<code_type> polarenc;
CODE::PolarEncoder<code_type> polarenc;
CODE::FisherYatesShuffle<4096> shuffle_4096;
CODE::FisherYatesShuffle<8192> shuffle_8192;
CODE::FisherYatesShuffle<16384> shuffle_16384;
@ -252,8 +251,6 @@ struct Encoder
oper_mode(oper_mode)
{
const uint32_t *frozen_bits = nullptr;
int parity_stride = 0;
int first_parity = 0;
int code_cols = 0;
int comb_cols = 0;
int comb_dist = 1;
@ -271,10 +268,8 @@ struct Encoder
code_order = 12;
code_cols = 256;
data_bits = 2048;
parity_stride = 31;
first_parity = 3;
frozen_bits = frozen_4096_2147;
reserved_tones = 0;
frozen_bits = frozen_4096_2080;
break;
case 24:
mod_bits = 2;
@ -283,10 +278,8 @@ struct Encoder
code_order = 13;
code_cols = 256;
data_bits = 4096;
parity_stride = 31;
first_parity = 5;
frozen_bits = frozen_8192_4261;
reserved_tones = 0;
frozen_bits = frozen_8192_4128;
break;
case 25:
mod_bits = 2;
@ -295,10 +288,8 @@ struct Encoder
code_order = 14;
code_cols = 256;
data_bits = 8192;
parity_stride = 31;
first_parity = 9;
frozen_bits = frozen_16384_8489;
reserved_tones = 0;
frozen_bits = frozen_16384_8224;
break;
case 26:
mod_bits = 4;
@ -307,10 +298,8 @@ struct Encoder
code_order = 12;
code_cols = 256;
data_bits = 2048;
parity_stride = 31;
first_parity = 3;
frozen_bits = frozen_4096_2147;
reserved_tones = 8;
frozen_bits = frozen_4096_2080;
break;
case 27:
mod_bits = 4;
@ -319,10 +308,8 @@ struct Encoder
code_order = 13;
code_cols = 256;
data_bits = 4096;
parity_stride = 31;
first_parity = 5;
frozen_bits = frozen_8192_4261;
reserved_tones = 8;
frozen_bits = frozen_8192_4128;
break;
case 28:
mod_bits = 4;
@ -331,10 +318,8 @@ struct Encoder
code_order = 14;
code_cols = 256;
data_bits = 8192;
parity_stride = 31;
first_parity = 9;
frozen_bits = frozen_16384_8489;
reserved_tones = 8;
frozen_bits = frozen_16384_8224;
break;
case 29:
mod_bits = 6;
@ -343,10 +328,8 @@ struct Encoder
code_order = 13;
code_cols = 273;
data_bits = 4096;
parity_stride = 31;
first_parity = 5;
frozen_bits = frozen_8192_4261;
reserved_tones = 15;
frozen_bits = frozen_8192_4128;
break;
case 30:
mod_bits = 6;
@ -355,10 +338,8 @@ struct Encoder
code_order = 14;
code_cols = 273;
data_bits = 8192;
parity_stride = 31;
first_parity = 9;
frozen_bits = frozen_16384_8489;
reserved_tones = 15;
frozen_bits = frozen_16384_8224;
break;
default:
return;
@ -411,7 +392,7 @@ struct Encoder
crc1(input_data[i]);
for (int i = 0; i < 32; ++i)
mesg[i+data_bits] = nrz((crc1()>>i)&1);
polarenc(code, mesg, frozen_bits, code_order, parity_stride, first_parity);
polarenc(code, mesg, frozen_bits, code_order);
shuffle(code);
for (int i = 0; i < cons_cols; ++i)
prev[i] = fdom[bin(i+code_off)];