18 #include "../../variables/common_variables/common_variables.h"    19 #include "../../variables/common_matrices/common_matrices.h"    20 #include "../../variables/ldpc_matrices/ldpc_matrices.h"    21 #include "../libphy/libphy.h"    22 #include "../../utils/sequence_generator/sequence_generator.h"    23 #include "../../asn1c/nr_rrc/BCCH-DL-SCH-Message.h"    24 #include "../../utils/common_utils/common_utils.h"    33 #include <boost/log/core.hpp>    34 #include <boost/log/trivial.hpp>    35 #include <boost/log/expressions.hpp>    36 #include <boost/log/utility/setup/file.hpp>    37 #include <boost/log/utility/setup/common_attributes.hpp>    55     if (E <= (9.0/8.0) * pow(2,ceil(log2(E))-1) && (
float) K / (
float) E < 9.0/16.0){
    60     n2 = ceil(log2((
float) K / rmin));
    61     if (nmax < 5 && n1 < 5 && n2 < 5){
    64         if (n1 < n2 && n1 < nmax){
    66         }
else if (n2 < n1 && n2 < nmax){
    93         for (
int n = 0; n < E; n ++){
   101         for (
int n = 0; n < N; n ++){
   105         if ((
float) K / (
float) E <= 7.0/16.0){
   106             for (
int n = 0; n < N - E; n ++){
   109             for (
int n = 0; n < E; n ++){
   118     for (
int n = 0; n < N; n++){
   119         int i = floor(32 * (
double) n / (
double) N );
   121         output_bits[j_n] = y[n];
   126                                     int n_wm_pc, 
int E) {
   149     int q_0_n_1[N], count_seq, q_i_n[K + n_pc], c_p[K], pi_seq[K], j_n, u[N];
   158             for (
int n = 0; n < N; n++){
   160                 for (
int p = 0 ; p < N; p++){
   166             for (
int n = 0; n < N; n++){
   168                 for (
int p = 0 ; p < N; p++){
   174             for (
int n = 0; n < N; n++){
   176                 for (
int p = 0 ; p < N; p++){
   182             for (
int n = 0; n < N; n++){
   184                 for (
int p = 0 ; p < N; p++){
   190             for (
int n = 0; n < N; n++){
   192                 for (
int p = 0 ; p < N; p++){
   198             for (
int n = 0; n < N; n++){
   200                 for (
int p = 0 ; p < N; p++){
   208     vector<int> q_ftmp_n, q_itmp_n;
   213     for (
int n = 0; n < 1024; n++){
   222         if ((
float) K / (float) E <= 7.0/16.0){
   223             for (
int n = 0; n < N - E; n ++){
   224                 int i = floor(32 * (
double) n / (
double) N );
   226                 q_ftmp_n.push_back(j_n);
   228             if (E >= 3.0 * (
float) N / 4.0){
   229                 for (
int n = 0; n < ceil(3.0 * (
float) N / 4.0 - (
float) E / 2.0); n ++){
   230                     q_ftmp_n.push_back(n);
   233                 for (
int n = 0; n < ceil(9.0 * (
float) N / 16.0 - (
float) E / 4.0); n ++){
   234                     q_ftmp_n.push_back(n);
   240     for (
int n = 0; n < N; n++){
   242         for (
int x = 0; x < q_ftmp_n.size(); x ++){
   243             if (q_0_n_1[n] == q_ftmp_n[x]){
   249             q_itmp_n.push_back(q_0_n_1[n]);
   255     for (
int n = 0; n < K + n_pc; n++){
   256         q_i_n[n] = q_itmp_n[q_itmp_n.size() - ( K + n_pc) + n];
   262     for (
int n = 0; n < N; n++){
   264         for (
int p = 0; p < K + n_pc; p ++){
   271             c_p[count_seq] = u[n];
   279     for (
int m = 0; m < K_max; m++){
   288     for (
int k = 0; k < K ; k ++){
   289         output_bits[pi_seq[k]] = c_p[k];
   310     int num_steps, seq1[length_crc];
   316     for (
int i = 0; i < length_input; i ++){
   317         if (input_bits[i] == 1){
   325     int temp_input[length_input - index_0];
   326     for (
int i = 0; i < length_input - index_0; i ++){
   327         temp_input[i] = input_bits[index_0 + i];
   329     length_input = length_input - index_0;
   330     num_steps = length_input - length_crc + 1;
   336     for (
int i = 0; i < length_crc; i ++){
   337         seq1[i] = temp_input[i];
   349         for (
int j = 0; j < length_crc; j ++){
   350             remainder[j] = seq1[j] ^ crc_polynom[j];
   355         bool validated = 
true;
   356         for (
int j = 1; j < length_crc; j ++){
   357             if (remainder[j] ==1){
   369         for (
int j = 1; j < length_crc; j ++){
   370             if (remainder[j] == 1){
   378         for (
int j = 0; j < length_crc - index_1; j ++){
   379             seq1[j] = remainder[j + index_1];
   384         for (
int j = 0; j < index_1; j ++){
   385             seq1[length_crc - index_1 + j] = temp_input[length_crc + i + j];
   405     int num_steps, *seq1;
   411     for (
int i = 0; i < length_input; i ++){
   412         if (input_bits[i] == 1){
   421     int temp_input[length_input - index_0 + length_crc - 1];
   422     for (
int i = 0; i < length_input - index_0; i ++){
   423         temp_input[i] = input_bits[index_0 + i];
   425     for (
int i = 0; i < length_crc - 1; i ++){
   426         temp_input[length_input - index_0 + i] = 0;
   428     length_input = length_input - index_0;
   429     num_steps = length_input;
   439         for (
int j = 0; j < length_crc; j ++){
   440             temp_input[i + j] ^= crc_polynom[j];
   445         bool finished = 
true;
   446         for (
int j = 0; j < length_input; j ++){
   447             if (temp_input[j] == 1){
   459         while (temp_input[i] != 1){
   466     for (
int j = 0; j < length_crc - 1; j ++){
   467         remainder[j] = temp_input[length_input + j];
   481     if (A <= 292 || (A <= 3824 && R <= 0.67) || R <= 0.25){
   503     long nre = (long) min(156, n_re) * nrb;
   504     double n_info = (double) nre * R * mod_order * num_layers;
   506         long n = (int) max(3.0, floor(log2(n_info)) - 6);
   507         long n_p_info = max(24.0, pow(2,n) * floor((
double) n_info/pow(2,n)));
   508         for (
int i =0; i < 93; i ++){
   515         cout << 
"N INFO not supported !" << endl;
   535     for (
int i = 0; i < 8; i ++){
   536         for (
int j = 0; j < 8; j ++){
   562     int k_cb = (graph == 1) ? 8448 : 3840;
   569         C = ceil(B / (k_cb - L));
   572     float k_p = (float) B_p / (
float) C;
   587     K  = (graph == 1) ? 22 * Zc : 10 * Zc;
   588     N  = (graph == 1) ? 66 * Zc : 50 * Zc;
   592 void free5GRAN::phy::transport_channel::rate_recover_ldpc(
int *input_bits, 
int N, 
int i_lbrm, 
int E, 
int id_rv, 
int mod_order, 
int C, 
int Zc, 
int graph, 
int K, 
int K_p, 
int *output_sequence){
   611     int N_cb = (i_lbrm == 0) ? N : min(N, 25344);
   613     int E_Q = (int) ((
float) E / (float) mod_order);
   617     for (
int j = 0; j < E_Q; j ++){
   618         for (
int i = 0; i < mod_order; i ++){
   619             e[i * (E_Q) +j] = input_bits[i + j * mod_order];
   628     }
else if (id_rv == 1){
   629         k0 = (graph == 1) ? floor((17.0 * N_cb) / (66.0 * Zc)) * Zc : floor((13.0 * N_cb) / (50.0 * Zc)) * Zc;
   630     }
else if (id_rv == 2){
   631         k0 = (graph == 1) ? floor((33.0 * N_cb) / (66.0 * Zc)) * Zc : floor((25.0 * N_cb) / (50.0 * Zc)) * Zc;
   632     }
else if (id_rv == 3){
   633         k0 = (graph == 1) ? floor((56.0 * N_cb) / (66.0 * Zc)) * Zc : floor((43.0 * N_cb) / (50.0 * Zc)) * Zc;
   642         int index = (k0 + j) % N_cb;
   643         if (index >= K_p - 2 * Zc && index < K - 2 * Zc){
   644             output_sequence[index] = -1;
   646             output_sequence[index] = e[k];
   653 void free5GRAN::phy::transport_channel::rate_recover_ldpc(
double *input_bits, 
int N, 
int i_lbrm, 
int E, 
int id_rv, 
int mod_order, 
int C, 
int Zc, 
int graph, 
int K, 
int K_p, 
double *output_sequence){
   672     int N_cb = (i_lbrm == 0) ? N : min(N, 25344);
   674     int E_Q = (int) ((
float) E / (float) mod_order);
   678     for (
int j = 0; j < E_Q; j ++){
   679         for (
int i = 0; i < mod_order; i ++){
   680             e[i * (E_Q) +j] = input_bits[i + j * mod_order];
   687     }
else if (id_rv == 1){
   688         k0 = (graph == 1) ? floor((17.0 * N_cb) / (66.0 * Zc)) * Zc : floor((13.0 * N_cb) / (50.0 * Zc)) * Zc;
   689     }
else if (id_rv == 2){
   690         k0 = (graph == 1) ? floor((33.0 * N_cb) / (66.0 * Zc)) * Zc : floor((25.0 * N_cb) / (50.0 * Zc)) * Zc;
   691     }
else if (id_rv == 3){
   692         k0 = (graph == 1) ? floor((56.0 * N_cb) / (66.0 * Zc)) * Zc : floor((43.0 * N_cb) / (50.0 * Zc)) * Zc;
   695     vector<int> seen_indexes;
   702         index = (k0 + j) % N_cb;
   703         if (find(seen_indexes.begin(), seen_indexes.end(), index) == seen_indexes.end()){
   704             seen_indexes.push_back(index);
   705             if (index >= K_p - 2 * Zc && index < K - 2 * Zc){
   706                 output_sequence[index] = numeric_limits<double>::infinity();;
   708                 output_sequence[index] = e[k];
   726     for (
int i = 0; i < size; i ++){
   727         for (
int j = 0; j < size; j ++){
   730         matrix[i][(i + offset) % size] = 1;
   744     double r_p1[R.size()], r_prop, q_p1, q_m1, n_q_p1, n_q_m1;
   748     for (
int j = 0; j < R.size(); j ++){
   750         for (
int i_p = 0; i_p < R[j].size(); i_p ++){
   751             r_prop = 1 / (1 + exp(2 * soft_bits[R[j][i_p]]));
   752             r_p1[j] *= 1 - 2 * r_prop;
   754         r_p1[j] = 0.5 + 0.5 * r_p1[j];
   761     for (
int j = 0; j < R.size(); j ++){
   763         q_m1 *= (1 - r_p1[j]);
   765     r_prop = 1 / (1 + exp(2 * soft_bits[i]));
   766     q_m1 = r_prop * q_m1;
   767     q_p1 = (1 - r_prop) * q_p1;
   771     n_q_p1 = q_p1 / (q_p1 + q_m1);
   772     n_q_m1 = q_m1 / (q_p1 + q_m1);
   776     if (n_q_p1 > n_q_m1){
   777         new_bit = - 0.5 * log((1/n_q_p1) - 1);
   779         new_bit = 0.5 * log((1/n_q_m1) - 1);
   807     vector<int*> ldpc_table;
   813     for (
int p = 0; p < ldpc_table.size(); p ++){
   814         int index_i = ldpc_table[p][0];
   815         int index_j = ldpc_table[p][1];
   816         int v_ij = ldpc_table[p][i_ls + 2];
   817         matrix[index_i][index_j] = v_ij;
   850     vector<vector<int>> H(size_j, vector<int>(size_i, -1));
   853     double ldpc_input_bits[N + 2 * Zc];
   854     for (
int i = 0; i < 2 * Zc; i ++){
   855         ldpc_input_bits[i] = 0;
   857     for (
int k = 2 * Zc; k < N + 2 * Zc; k ++){
   858         ldpc_input_bits[k] = input_bits[k - 2 * Zc];
   860     double new_bits[N + 2 * Zc];
   861     vector<vector<int>> R[N + 2 * Zc], R_tot;
   862     vector<int> new_vec, new_vec_tot;
   867     for (
int j = 0; j < size_j * Zc; j++) {
   869         for (
int i = 0; i < size_i; i++) {
   870             if (H[j/Zc][i] != -1) {
   871                 new_vec_tot.push_back(((j % Zc + H[j/Zc][i]) % Zc) + i * Zc);
   874         R_tot.push_back(new_vec_tot);
   876     int index_l,inter_ind;
   877     for (
int i = 0; i < N + 2 * Zc; i ++) {
   878         for (
int j = 0; j < size_j; j++) {
   879             if (H[j][i/Zc] != -1) {
   881                 inter_ind = ((i % Zc - H[j][i/Zc]) % Zc);
   883                     inter_ind = Zc + inter_ind;
   885                 index_l = inter_ind + j * Zc;
   887                 for (
int p =0; p < R_tot[index_l].size(); p ++){
   888                     if (R_tot[index_l][p] != i){
   889                         new_vec.push_back(R_tot[index_l][p]);
   892                 R[i].push_back(new_vec);
   896     int rest, final_bit[N + 2 * Zc];
   900     for (
int iter = 0; iter < 10; iter ++){
   904         for (
int i = 0; i < N + 2 * Zc; i ++){
   907         for (
int i = 0; i < N + 2 * Zc; i ++){
   908             ldpc_input_bits[i] = new_bits[i];
   909             final_bit[i] = (ldpc_input_bits[i] < 0) ? 1 : 0;
   911                 output_sequence[i] = final_bit[i];
   915         bool validated = 
true;
   916         for (
int j = 0; j < size_j * Zc; j ++){
   918             for (
int i = 0; i < R_tot[j].size(); i ++){
   919                 rest ^= final_bit[R_tot[j][i]];
   927             BOOST_LOG_TRIVIAL(trace) << 
"LDPC VALIDATED";
   964     crc_validated = 
true;
   966         if (remainder[i] ==1){
   967             crc_validated = 
false;
   973         bch_payload[i] = polar_decoded_bits[i];
   976         bch_crc[i] = polar_decoded_bits[free5GRAN::BCH_PAYLOAD_SIZE + i];
   983         crc_masq[i] = bch_crc[i] ^ bch_crc_recomputed[i];
   990     int A_bar = free5GRAN::BCH_PAYLOAD_SIZE - 8;
   993     int sfn_bits[4][2] = {
  1000     for (
int v = 0 ; v < 4; v ++){
  1002         int c_seq[free5GRAN::BCH_PAYLOAD_SIZE + v * M];
  1006         for (
int i = 0; i < A; i ++){
  1007             if ( i == 0 || i == 6 || i == 24){
  1010                 s_sequence[i] = c_seq[j + v * M];
  1022         for (
int i = 0; i < 32; i ++){
  1023             if (i == 24 || i == 25 || i == 26 || i ==27|| i==1||i==2||i==3||i==4||i==5||i==6){
  1028             }
else if ( i >= A_bar + 5 && i <= A_bar + 7){
  1037         if (sfn_bits[v][0] == mib_bits[25] && sfn_bits[v][1] == mib_bits[26]){
  1068     BOOST_LOG_TRIVIAL(trace) << 
"(n, N) = ("+ to_string(n)+
", "+to_string(N)+
")";
  1069     BOOST_LOG_TRIVIAL(trace) << 
"E = "+to_string(E) ;
  1070     BOOST_LOG_TRIVIAL(trace) << 
"K = "+to_string(K);
  1072     int rate_recovered[N], polar_decoded[K], remainder[25], descrambled[K + 24];
  1082     polar_decode(rate_recovered,polar_decoded,N,K,9,1,0,0, E);
  1086     for (
int i = 0; i < 24; i ++){
  1089     for (
int i = 0; i < K; i ++){
  1091             descrambled[i + 24] = polar_decoded[i];
  1094             descrambled[i + 24] = (polar_decoded[i] + rnti[i - A - 8]) % 2;
  1099     for (
int i = 0; i < 25; i ++){
  1100         if (remainder[i] ==1){
  1105     BOOST_LOG_TRIVIAL(trace) << 
"## CRC " << ((validated) ? 
"validated" :  
"not validated");
  1107     for (
int i = 0; i < A; i ++){
  1108         decoded_dci_bits[i] = polar_decoded[i];
  1137     int graph, A, N, K, Zc, i_ls, L_cb, C,B,L, K_p;
  1140     L = (A > 3824) ? 24 : 16;
  1144     BOOST_LOG_TRIVIAL(trace) << 
"(TBS, graph) = " << A << 
", " << graph;
  1145     BOOST_LOG_TRIVIAL(trace) << 
"B = " << B;
  1146     BOOST_LOG_TRIVIAL(trace) << 
"Zc = " << Zc;
  1147     BOOST_LOG_TRIVIAL(trace) << 
"K = " << K;
  1148     BOOST_LOG_TRIVIAL(trace) << 
"i_ls = " << i_ls;
  1149     BOOST_LOG_TRIVIAL(trace) << 
"L = " << L;
  1150     BOOST_LOG_TRIVIAL(trace) << 
"C = " << C;
  1151     BOOST_LOG_TRIVIAL(trace) << 
"N = " << N;
  1152     BOOST_LOG_TRIVIAL(trace) << 
"L_cb = " << L_cb;
  1153     BOOST_LOG_TRIVIAL(trace) << 
"K_p = " << K_p;
  1154     BOOST_LOG_TRIVIAL(trace) << 
"E = " << E;
  1159     double *rate_recovered = 
new double[N];
  1160     rate_recover_ldpc(dl_sch_bits, N, 1, E, dci_1_0_si_rnti.
rv, 2, C, Zc, graph, K, K_p, rate_recovered);
  1165     int ldpc_decoded[K];
  1166     auto start = chrono::steady_clock::now();
  1167     ldpc_decode(rate_recovered, N, Zc, graph, K, i_ls, ldpc_decoded);
  1168     auto end = chrono::steady_clock::now();
  1169     auto diff = end - start;
  1170     BOOST_LOG_TRIVIAL(trace) << 
"## LDPC execution time " << chrono::duration <double, milli> (diff).count() << 
"ms";
  1173     for (
int i = 0; i < B; i ++){
  1174         desegmented[i] = ldpc_decoded[i];
  1188     for (
int i = 0; i < L+1; i ++){
  1189         if (remainder[i] ==1){
  1194     vector<int> output_bits(A);
  1196     for (
int i = 0; i < A; i ++){
  1197         output_bits[i] = desegmented[i];
  1200     BOOST_LOG_TRIVIAL(trace) << 
"## CRC " << ((validated) ? 
"validated" :  
"not validated");
 void compute_H_matrix_ldpc(int Zc, int graph, int i_ls, vector< vector< int >> &matrix, int &size_i, int &size_j)
 
void scramble(int *input_bits, int *c_seq, int *output_bits, int length, int offset)
 
int compute_N_polar_code(int E, int K, int nmax)
 
int TS_38_212_TABLE_5_3_2_1[8][8]
 
int SIZE_PBCH_POLAR_DECODED
 
void compute_circular_permutation_matrix(int size, int offset, int **matrix)
 
int PBCH_PAYLOAD_INTERLEAVER[32]
 
int POLAR_SEQUENCE_QNMAX_AND_RELIABILITY[1024]
 
void ldpc_decode(double *input_bits, int N, int Zc, int graph, int K, int i_ls, int *output_sequence)
 
int SUB_BLOCK_INTERLEAVER_PATTERN[32]
 
void compute_ldpc_base_graph(int A, float R, int &graph)
 
int SIZE_SSB_PBCH_SYMBOLS
 
void compute_code_block_segmentation_info_ldpc(int graph, int B, int &Zc, int &K, int &i_ls, int &L, int &C, int &N, int &K_p)
 
vector< int > decode_dl_sch(double *dl_sch_bits, int n_re, float R, int nrb, int E, bool &validated, free5GRAN::dci_1_0_si_rnti dci_1_0_si_rnti)
 
void rate_recover(int *input_bits, int *output_bits, int i_bil, int E, int N, int K)
 
std::vector< int * > TS_38_212_TABLE_5_3_2_2
 
void polar_decode(int *input_bits, int *output_bits, int N, int K, int nmax, int i_il, int n_pc, int n_wm_pc, int E)
 
int TS_38_214_TABLE_5_1_3_2_1[93]
 
void crc_validate(int *input_bits, int *crc_polynom, int *remainder, int length_input, int length_crc)
 
void compute_transport_block_size(int n_re, float R, int mod_order, int num_layers, int nrb, int &tbs)
 
void decode_dci(int *dci_bits, int E, int K, int *rnti, bool &validated, int *decoded_dci_bits)
 
int INTERLEAVING_PATTERN[164]
 
void compute_Zc_dl_sch(int kb, float k_p, int &Zc, int &i_ls)
 
void ldpc_decode_one_bit(vector< vector< int >> R, double *soft_bits, int i, double &new_bit)
 
void compute_crc(int *input_bits, int *crc_polynom, int *remainder, int length_input, int length_crc)
 
void decode_bch(int *bch_bits, bool &crc_validated, int *mib_bits, int pci)
 
void rate_recover_ldpc(int *input_bits, int N, int i_lbrm, int E, int id_rv, int mod_order, int C, int Zc, int graph, int K, int K_p, int *output_sequence)
 
void generate_c_sequence(long c_init, int length, int *output_sequence, int demod_type)
 
std::vector< int * > TS_38_212_TABLE_5_3_2_3