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