Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
openairinterface5G
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Merge Requests
15
Merge Requests
15
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
oai
openairinterface5G
Commits
8b38bfc7
Commit
8b38bfc7
authored
May 24, 2018
by
yilmazt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
General modifications for polar coding, and deleting duplicate functions.
parent
cded3bd6
Changes
26
Hide whitespace changes
Inline
Side-by-side
Showing
26 changed files
with
540 additions
and
854 deletions
+540
-854
cmake_targets/CMakeLists.txt
cmake_targets/CMakeLists.txt
+1
-5
openair1/PHY/CODING/TESTBENCH/ldpctest.c
openair1/PHY/CODING/TESTBENCH/ldpctest.c
+1
-1
openair1/PHY/CODING/nrPolar_init.c
openair1/PHY/CODING/nrPolar_init.c
+36
-4
openair1/PHY/CODING/nrPolar_tools/get_3GPP_info_bit_pattern.c
...air1/PHY/CODING/nrPolar_tools/get_3GPP_info_bit_pattern.c
+0
-200
openair1/PHY/CODING/nrPolar_tools/get_PC_bit_pattern.c
openair1/PHY/CODING/nrPolar_tools/get_PC_bit_pattern.c
+0
-259
openair1/PHY/CODING/nrPolar_tools/get_crc_generator_matrix.c
openair1/PHY/CODING/nrPolar_tools/get_crc_generator_matrix.c
+0
-79
openair1/PHY/CODING/nrPolar_tools/nr_bitwise_operations.c
openair1/PHY/CODING/nrPolar_tools/nr_bitwise_operations.c
+21
-0
openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c
openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c
+21
-151
openair1/PHY/CODING/nrPolar_tools/nr_polar_bit_insertion.c
openair1/PHY/CODING/nrPolar_tools/nr_polar_bit_insertion.c
+22
-1
openair1/PHY/CODING/nrPolar_tools/nr_polar_bit_insertion_2.c
openair1/PHY/CODING/nrPolar_tools/nr_polar_bit_insertion_2.c
+0
-63
openair1/PHY/CODING/nrPolar_tools/nr_polar_channel_interleaver_pattern.c
...DING/nrPolar_tools/nr_polar_channel_interleaver_pattern.c
+21
-0
openair1/PHY/CODING/nrPolar_tools/nr_polar_dci_defs.h
openair1/PHY/CODING/nrPolar_tools/nr_polar_dci_defs.h
+46
-0
openair1/PHY/CODING/nrPolar_tools/nr_polar_decoder.c
openair1/PHY/CODING/nrPolar_tools/nr_polar_decoder.c
+40
-19
openair1/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c
openair1/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c
+21
-0
openair1/PHY/CODING/nrPolar_tools/nr_polar_defs.h
openair1/PHY/CODING/nrPolar_tools/nr_polar_defs.h
+55
-17
openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c
openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c
+36
-33
openair1/PHY/CODING/nrPolar_tools/nr_polar_info_bit_pattern.c
...air1/PHY/CODING/nrPolar_tools/nr_polar_info_bit_pattern.c
+23
-2
openair1/PHY/CODING/nrPolar_tools/nr_polar_interleaving_pattern.c
.../PHY/CODING/nrPolar_tools/nr_polar_interleaving_pattern.c
+21
-8
openair1/PHY/CODING/nrPolar_tools/nr_polar_kronecker_power_matrices.c
.../CODING/nrPolar_tools/nr_polar_kronecker_power_matrices.c
+21
-0
openair1/PHY/CODING/nrPolar_tools/nr_polar_matrix_and_array.c
...air1/PHY/CODING/nrPolar_tools/nr_polar_matrix_and_array.c
+21
-0
openair1/PHY/CODING/nrPolar_tools/nr_polar_output_length.c
openair1/PHY/CODING/nrPolar_tools/nr_polar_output_length.c
+21
-0
openair1/PHY/CODING/nrPolar_tools/nr_polar_pbch_defs.h
openair1/PHY/CODING/nrPolar_tools/nr_polar_pbch_defs.h
+32
-3
openair1/PHY/CODING/nrPolar_tools/nr_polar_rate_match.c
openair1/PHY/CODING/nrPolar_tools/nr_polar_rate_match.c
+22
-5
openair1/PHY/CODING/nrPolar_tools/nr_polar_sequence_pattern.c
...air1/PHY/CODING/nrPolar_tools/nr_polar_sequence_pattern.c
+22
-1
openair1/PHY/CODING/nrPolar_tools/nr_polar_uci_defs.h
openair1/PHY/CODING/nrPolar_tools/nr_polar_uci_defs.h
+36
-0
openair1/PHY/TOOLS/file_output.c
openair1/PHY/TOOLS/file_output.c
+0
-3
No files found.
cmake_targets/CMakeLists.txt
View file @
8b38bfc7
...
...
@@ -1063,18 +1063,14 @@ set(PHY_LDPCSRC
)
set
(
PHY_POLARSRC
${
OPENAIR1_DIR
}
/PHY/CODING/nrPolar_init.c
${
OPENAIR1_DIR
}
/PHY/CODING/nrPolar_tools/get_3GPP_info_bit_pattern.c
${
OPENAIR1_DIR
}
/PHY/CODING/nrPolar_tools/get_crc_generator_matrix.c
${
OPENAIR1_DIR
}
/PHY/CODING/nrPolar_tools/get_PC_bit_pattern.c
${
OPENAIR1_DIR
}
/PHY/CODING/nrPolar_tools/nr_bitwise_operations.c
${
OPENAIR1_DIR
}
/PHY/CODING/nrPolar_tools/nr_crc_byte.c
${
OPENAIR1_DIR
}
/PHY/CODING/nrPolar_tools/nr_polar_bit_insertion_2.c
${
OPENAIR1_DIR
}
/PHY/CODING/nrPolar_tools/nr_polar_bit_insertion.c
${
OPENAIR1_DIR
}
/PHY/CODING/nrPolar_tools/nr_polar_channel_interleaver_pattern.c
${
OPENAIR1_DIR
}
/PHY/CODING/nrPolar_tools/nr_polar_crc.c
${
OPENAIR1_DIR
}
/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c
${
OPENAIR1_DIR
}
/PHY/CODING/nrPolar_tools/nr_polar_info_bit_pattern.c
${
OPENAIR1_DIR
}
/PHY/CODING/nrPolar_tools/nr_polar_interleav
e
.c
${
OPENAIR1_DIR
}
/PHY/CODING/nrPolar_tools/nr_polar_interleav
ing_pattern
.c
${
OPENAIR1_DIR
}
/PHY/CODING/nrPolar_tools/nr_polar_kernal_operation.c
${
OPENAIR1_DIR
}
/PHY/CODING/nrPolar_tools/nr_polar_kronecker_power_matrices.c
${
OPENAIR1_DIR
}
/PHY/CODING/nrPolar_tools/nr_polar_matrix_and_array.c
...
...
openair1/PHY/CODING/TESTBENCH/ldpctest.c
View file @
8b38bfc7
...
...
@@ -24,7 +24,7 @@
#include <stdio.h>
#include <string.h>
#include "SIMULATION/TOOLS/
defs
.h"
#include "SIMULATION/TOOLS/
sim
.h"
...
...
openair1/PHY/CODING/nrPolar_init.c
View file @
8b38bfc7
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include "nrPolar_tools/nr_polar_defs.h"
#include "nrPolar_tools/nr_polar_pbch_defs.h"
...
...
@@ -8,6 +29,7 @@ void nr_polar_init(t_nrPolar_params* polarParams, int messageType) {
}
else
if
(
messageType
==
1
)
{
//PBCH
polarParams
->
n_max
=
NR_POLAR_PBCH_N_MAX
;
polarParams
->
i_il
=
NR_POLAR_PBCH_I_IL
;
polarParams
->
i_seg
=
NR_POLAR_PBCH_I_SEG
;
polarParams
->
n_pc
=
NR_POLAR_PBCH_N_PC
;
polarParams
->
n_pc_wm
=
NR_POLAR_PBCH_N_PC_WM
;
polarParams
->
i_bil
=
NR_POLAR_PBCH_I_BIL
;
...
...
@@ -22,19 +44,29 @@ void nr_polar_init(t_nrPolar_params* polarParams, int messageType) {
polarParams
->
crc_generator_matrix
=
crc24c_generator_matrix
(
polarParams
->
payloadBits
);
polarParams
->
G_N
=
nr_polar_kronecker_power_matrices
(
polarParams
->
n
);
//polar_encoder vectors:
polarParams
->
nr_polar_crc
=
malloc
(
sizeof
(
uint8_t
)
*
polarParams
->
crcParityBits
);
polarParams
->
nr_polar_cPrime
=
malloc
(
sizeof
(
uint8_t
)
*
polarParams
->
K
);
polarParams
->
nr_polar_d
=
malloc
(
sizeof
(
uint8_t
)
*
polarParams
->
N
);
//Polar Coding vectors
polarParams
->
nr_polar_u
=
malloc
(
sizeof
(
uint8_t
)
*
polarParams
->
N
);
//Decoder: nr_polar_uHat
polarParams
->
nr_polar_cPrime
=
malloc
(
sizeof
(
uint8_t
)
*
polarParams
->
K
);
//Decoder: nr_polar_cHat
polarParams
->
nr_polar_b
=
malloc
(
sizeof
(
uint8_t
)
*
polarParams
->
K
);
//Decoder: nr_polar_bHat
}
else
if
(
messageType
==
2
)
{
//UCI
}
polarParams
->
Q_0_Nminus1
=
nr_polar_sequence_pattern
(
polarParams
->
n
);
polarParams
->
interleaving_pattern
=
(
uint16_t
*
)
malloc
(
sizeof
(
uint16_t
)
*
polarParams
->
K
);
polarParams
->
interleaving_pattern
=
malloc
(
sizeof
(
uint16_t
)
*
polarParams
->
K
);
nr_polar_interleaving_pattern
(
polarParams
->
K
,
polarParams
->
i_il
,
polarParams
->
interleaving_pattern
);
polarParams
->
rate_matching_pattern
=
(
uint16_t
*
)
malloc
(
sizeof
(
uint16_t
)
*
polarParams
->
encoderLength
);
polarParams
->
rate_matching_pattern
=
malloc
(
sizeof
(
uint16_t
)
*
polarParams
->
encoderLength
);
uint16_t
*
J
=
malloc
(
sizeof
(
uint16_t
)
*
polarParams
->
N
);
nr_polar_rate_matching_pattern
(
polarParams
->
rate_matching_pattern
,
J
,
nr_polar_subblock_interleaver_pattern
,
polarParams
->
K
,
polarParams
->
N
,
polarParams
->
encoderLength
);
nr_polar_rate_matching_pattern
(
polarParams
->
rate_matching_pattern
,
J
,
nr_polar_subblock_interleaver_pattern
,
polarParams
->
K
,
polarParams
->
N
,
polarParams
->
encoderLength
);
polarParams
->
information_bit_pattern
=
malloc
(
sizeof
(
uint8_t
)
*
polarParams
->
N
);
...
...
openair1/PHY/CODING/nrPolar_tools/get_3GPP_info_bit_pattern.c
deleted
100644 → 0
View file @
cded3bd6
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdint.h>
void
get_3GPP_info_bit_pattern
(
uint16_t
K
,
uint16_t
n_PC
,
uint16_t
Q_N_length
,
uint8_t
E_r
,
uint8_t
*
P
,
uint16_t
*
Q_N
,
uint8_t
**
info_bit_pattern
)
{
// GET_3GPP_INFO_BIT_PATTERN Obtain the 3GPP information bit pattern,
// according to Section 5.4.1.1 of 3GPP TS 38.212
//
// I should be an integer scalar. It specifies the number of bits in the
// information, CRC and PC bit sequence. It should be no greater than N or E.
//
// Q_N should be a row vector comprising N number of unique integers in the
// range 1 to N. Each successive element of Q_N provides the index of the
// next most reliable input to the polar encoder kernal, where the first
// element of Q_N gives the index of the least reliable bit and the last
// element gives the index of the most reliable bit.
//
// rate_matching_pattern should be a vector comprising E_r number of
// integers, each having a value in the range 1 to N. Each integer
// identifies which one of the N outputs from the polar encoder kernal
// provides the corresponding bit in the encoded bit sequence e.
//
// mode should have the value 'repetition', 'puncturing' or 'shortening'.
// This specifies how the rate matching has been achieved. 'repetition'
// indicates that some outputs of the polar encoder kernal are repeated in
// the encoded bit sequence two or more times. 'puncturing' and
// 'shortening' indicate that some outputs of the polar encoder kernal
// have been excluded from the encoded bit sequence. In the case of
// 'puncturing' these excluded bits could have values of 0 or 1. In the
// case of 'shortening' these excluded bits are guaranteed to have values
// of 0.
//
// info_bit_pattern will be a vector comprising N number of logical
// elements, each having the value true or false. The number of elements
// in info_bit_pattern having the value true will be I. These elements
// having the value true identify the positions of the information and
// CRC bits within the input to the polar encoder kernal. The
// information bit arrangement can be achieved according to
// u(info_bit_pattern) = a.
int
I
=
K
+
n_PC
;
if
(
I
>
Q_N_length
)
//I=K+n_PC
{
fprintf
(
stderr
,
"I=K+n_PC should be no greater than N."
);
exit
(
-
1
);
}
if
(
I
>
E_r
)
{
fprintf
(
stderr
,
"I=K+n_PC should be no greater than E."
);
exit
(
-
1
);
}
//This is how the rate matching is described in TS 38.212
int
J
[
Q_N_length
];
int
i
,
j
;
for
(
j
=
0
;
j
<
Q_N_length
;
j
++
)
{
i
=
floor
(
32
*
(
double
)
j
/
Q_N_length
);
J
[
j
]
=
P
[
i
]
*
(
Q_N_length
/
32
)
+
(
j
%
(
Q_N_length
/
32
));
}
//Q_Ftmp_N = [];
int
Q_Ftmp_N_length
=
Q_N_length
-
E_r
;
if
(
E_r
<
Q_N_length
)
{
if
((
double
)(
I
)
/
E_r
<=
(
double
)
7
/
16
)
// puncturing
{
//Q_Ftmp_N_length = Q_Ftmp_N_length + N-E;
if
(
E_r
>=
(
double
)
3
*
Q_N_length
/
4
)
{
//Q_Ftmp_N = [Q_Ftmp_N,0:ceil(3*N/4-E/2)-1];
Q_Ftmp_N_length
=
Q_Ftmp_N_length
+
ceil
(
3
*
Q_N_length
/
4
-
(
double
)
E_r
/
2
);
}
else
{
//Q_Ftmp_N = [Q_Ftmp_N,0:ceil(9*N/16-E/4)-1];
Q_Ftmp_N_length
=
Q_Ftmp_N_length
+
ceil
(
9
*
Q_N_length
/
16
-
(
double
)
E_r
/
4
);
}
}
}
int
*
Q_Ftmp_N
=
(
int
*
)
malloc
(
sizeof
(
int
)
*
Q_Ftmp_N_length
);
if
(
Q_Ftmp_N
==
NULL
)
{
fprintf
(
stderr
,
"malloc failed
\n
"
);
exit
(
-
1
);
}
if
(
E_r
<
Q_N_length
)
{
if
((
double
)
I
/
E_r
<=
7
/
16
)
// puncturing
{
for
(
j
=
0
;
j
<
Q_N_length
-
E_r
;
j
++
)
{
Q_Ftmp_N
[
j
]
=
J
[
j
];
}
if
(
E_r
>=
3
*
Q_N_length
/
4
)
{
for
(
j
=
0
;
j
<
ceil
(
3
*
Q_N_length
/
4
-
(
double
)
E_r
/
2
);
j
++
)
{
Q_Ftmp_N
[
Q_N_length
-
E_r
+
1
+
j
]
=
j
;
}
}
else
{
for
(
j
=
0
;
j
<
ceil
(
9
*
Q_N_length
/
16
-
(
double
)
E_r
/
4
);
j
++
)
{
Q_Ftmp_N
[
Q_N_length
-
E_r
+
1
+
j
]
=
j
;
}
}
}
else
// shortening
{
for
(
j
=
E_r
;
j
<
Q_N_length
;
j
++
)
{
Q_Ftmp_N
[
j
-
E_r
]
=
J
[
j
];
}
}
}
//Q_Itmp_N = setdiff(Q_N-1,Q_Ftmp_N,'stable'); // -1 because TS 38.212 assumes that indices start at 0, not 1 like in Matlab
int
Q_Itmp_N_length
=
Q_N_length
;
int
Q_Itmp_N_common
[
Q_N_length
];
for
(
i
=
0
;
i
<
Q_N_length
;
i
++
)
{
Q_Itmp_N_common
[
i
]
=
0
;
//1 if in common, otherwise 0
for
(
j
=
0
;
j
<
Q_Ftmp_N_length
;
j
++
)
{
if
((
int
)
Q_N
[
i
]
==
Q_Ftmp_N
[
j
])
{
Q_Itmp_N_common
[
i
]
=
1
;
Q_Itmp_N_length
--
;
break
;
}
}
}
free
(
Q_Ftmp_N
);
if
(
Q_Itmp_N_length
<
I
)
{
fprintf
(
stderr
,
"Too many pre-frozen bits."
);
exit
(
-
1
);
}
int
*
Q_Itmp_N
=
(
int
*
)
malloc
(
sizeof
(
int
)
*
Q_Itmp_N_length
);
if
(
Q_Itmp_N
==
NULL
)
{
fprintf
(
stderr
,
"malloc failed
\n
"
);
exit
(
-
1
);
}
j
=
0
;
for
(
i
=
0
;
i
<
Q_N_length
;
i
++
)
{
if
(
!
Q_Itmp_N_common
[
i
])
//if not commonc
{
Q_Itmp_N
[
j
]
=
(
int
)
Q_N
[
i
];
j
++
;
}
}
int
*
Q_I_N
=
(
int
*
)
malloc
(
sizeof
(
int
)
*
(
I
));
if
(
Q_I_N
==
NULL
)
{
fprintf
(
stderr
,
"malloc failed
\n
"
);
exit
(
-
1
);
}
//Q_I_N=Q_Itmp_N(end-I+1:end);
for
(
j
=
Q_Itmp_N_length
-
(
I
);
j
<
Q_Itmp_N_length
;
j
++
)
{
Q_I_N
[
j
-
(
Q_Itmp_N_length
-
(
I
))]
=
Q_Itmp_N
[
j
];
}
free
(
Q_Itmp_N
);
//info_bit_pattern(Q_I_N+1) = true;
*
info_bit_pattern
=
(
uint8_t
*
)
malloc
(
sizeof
(
uint8_t
)
*
Q_N_length
);
if
(
*
info_bit_pattern
==
NULL
)
{
fprintf
(
stderr
,
"malloc failed
\n
"
);
exit
(
-
1
);
}
for
(
j
=
0
;
j
<
Q_N_length
;
j
++
)
{
(
*
info_bit_pattern
)[
j
]
=
0
;
for
(
i
=
0
;
i
<
I
;
i
++
)
{
if
(
Q_I_N
[
i
]
==
j
)
{
(
*
info_bit_pattern
)[
j
]
=
1
;
break
;
}
}
}
free
(
Q_I_N
);
}
openair1/PHY/CODING/nrPolar_tools/get_PC_bit_pattern.c
deleted
100644 → 0
View file @
cded3bd6
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdint.h>
void
get_PC_bit_pattern
(
uint16_t
Q_N_length
,
uint16_t
n_PC
,
uint8_t
n_PC_wm
,
uint16_t
*
Q_N
,
uint8_t
*
info_bit_pattern
,
uint8_t
**
PC_bit_pattern
)
{
// GET_PC_BIT_PATTERN Obtain the Parity Check (PC) bit pattern,
// according to Section 5.3.1.2 of 3GPP TS 38.212
//
// info_bit_pattern should be a vector comprising N number of logical
// elements, each having the value true or false. The number of elements
// in info_bit_pattern having the value true should be I, where
// I = A+P+n_PC. These elements having the value true identify the
// positions of the information, CRC and PC bits within the input to the
// polar encoder kernal.
//
// Q_N should be a row vector comprising N number of unique integers in the
// range 1 to N. Each successive element of Q_N provides the index of the
// next most reliable input to the polar encoder kernal, where the first
// element of Q_N gives the index of the least reliable bit and the last
// element gives the index of the most reliable bit.
//
// n_PC should be an integer scalar. It specifies the number of PC bits to
// use, where n_PC should be no greater than I.
//
// n_PC_wm should be an integer scalar. It specifies the number of PC bits
// that occupy some of the most reliable positions at the input to the
// polar encoder kernal. The remaining n_PC-n_PC_wm PC bits occupy some of
// the least reliable positions at the input to the polar encoder kernal.
// n_PC_wm should be no greater than n_PC.
//
// PC_bit_pattern will be a vector comprising N number of logical
// elements, each having the value true or false. The number of elements
// in PC_bit_pattern having the value true will be n_PC.
// These elements having the value true identify the positions of the
// PC bits within the input to the polar encoder kernal.
//N = length(info_bit_pattern); -> Q_N_length
//I = sum(info_bit_pattern);
int
totInfoBit
=
0
;
int
j
,
i
;
for
(
j
=
0
;
j
<
Q_N_length
;
j
++
)
{
if
(
info_bit_pattern
[
j
])
totInfoBit
++
;
}
if
(
n_PC
>
totInfoBit
)
{
fprintf
(
stderr
,
"n_PC should be no greater than totInfoBit."
);
exit
(
-
1
);
}
if
(
n_PC_wm
>
n_PC
)
{
fprintf
(
stderr
,
"n_PC_wm should be no greater than n_PC."
);
exit
(
-
1
);
}
//Q_I = 1:N;
int
*
Q_I
=
(
int
*
)
malloc
(
sizeof
(
int
)
*
Q_N_length
);
if
(
Q_I
==
NULL
)
{
fprintf
(
stderr
,
"malloc failed
\n
"
);
exit
(
-
1
);
}
for
(
j
=
0
;
j
<
Q_N_length
;
j
++
)
{
Q_I
[
j
]
=
j
+
1
;
}
//Q_N_I = intersect(Q_N, Q_I(info_bit_pattern), 'stable');
int
Q_N_I_length
=
0
;
int
*
Q_N_common
=
(
int
*
)
malloc
(
sizeof
(
int
)
*
Q_N_length
);
if
(
Q_N_common
==
NULL
)
{
fprintf
(
stderr
,
"malloc failed
\n
"
);
exit
(
-
1
);
}
for
(
j
=
0
;
j
<
Q_N_length
;
j
++
)
//init
{
Q_N_common
[
j
]
=
0
;
}
for
(
j
=
0
;
j
<
Q_N_length
;
j
++
)
//look in Q_I
{
if
(
info_bit_pattern
[
j
])
{
//Q_I(info_bit_pattern)
for
(
i
=
0
;
i
<
Q_N_length
;
i
++
)
//look in Q_N
{
if
(
Q_N
[
i
]
+
1
==
Q_I
[
j
])
{
Q_N_common
[
i
]
=
1
;
Q_N_I_length
++
;
break
;
}
}
}
}
free
(
Q_I
);
int
*
Q_N_I
=
(
int
*
)
malloc
(
sizeof
(
int
)
*
Q_N_I_length
);
if
(
Q_N_I
==
NULL
)
{
fprintf
(
stderr
,
"malloc failed
\n
"
);
exit
(
-
1
);
}
i
=
0
;
for
(
j
=
0
;
j
<
Q_N_length
;
j
++
)
{
if
(
Q_N_common
[
j
])
{
Q_N_I
[
i
]
=
Q_N
[
j
]
+
1
;
i
++
;
}
}
free
(
Q_N_common
);
//int G_N = get_G_N(N);
//int w_g = sum(G_N,2);
//useless, I do this
int
*
w_g
=
(
int
*
)
malloc
(
sizeof
(
int
)
*
Q_N_length
);
if
(
w_g
==
NULL
)
{
fprintf
(
stderr
,
"malloc failed
\n
"
);
exit
(
-
1
);
}
w_g
[
0
]
=
1
;
w_g
[
1
]
=
2
;
int
counter
=
2
;
int
n
=
log2
(
Q_N_length
);
for
(
i
=
0
;
i
<
n
-
1
;
i
++
)
//n=log2(N)
{
for
(
j
=
0
;
j
<
counter
;
j
++
)
{
w_g
[
counter
+
j
]
=
w_g
[
j
]
*
2
;
}
counter
=
counter
*
2
;
}
//Q_tilde_N_I = Q_N_I(n_PC+1:end); % This is what it says in TS 38.212
int
*
Q_tilde_N_I
=
(
int
*
)
malloc
(
sizeof
(
int
)
*
(
Q_N_I_length
-
n_PC
));
if
(
Q_tilde_N_I
==
NULL
)
{
fprintf
(
stderr
,
"malloc failed
\n
"
);
exit
(
-
1
);
}
int
*
Q_tilde_N_I_flip
=
(
int
*
)
malloc
(
sizeof
(
int
)
*
(
Q_N_I_length
-
n_PC
));
if
(
Q_tilde_N_I_flip
==
NULL
)
{
fprintf
(
stderr
,
"malloc failed
\n
"
);
exit
(
-
1
);
}
for
(
i
=
0
;
i
<
Q_N_I_length
-
n_PC
;
i
++
)
{
Q_tilde_N_I
[
i
]
=
Q_N_I
[
n_PC
+
i
];
//Q_tilde_N_I_flip = fliplr(Q_tilde_N_I);
Q_tilde_N_I_flip
[
Q_N_I_length
-
n_PC
-
i
-
1
]
=
Q_tilde_N_I
[
i
];
}
//%Q_tilde_N_I = Q_N_I(n_PC-n_PC_wm+1:end); % I think that this would be slightly more elegant
//[w_g_sorted, indices] = sort(w_g(Q_tilde_N_I_flip));
int
*
w_g_sorted
=
(
int
*
)
malloc
(
sizeof
(
int
)
*
(
Q_N_I_length
-
n_PC
));
if
(
w_g_sorted
==
NULL
)
{
fprintf
(
stderr
,
"malloc failed
\n
"
);
exit
(
-
1
);
}
int
*
indices
=
(
int
*
)
malloc
(
sizeof
(
int
)
*
(
Q_N_I_length
-
n_PC
));
if
(
indices
==
NULL
)
{
fprintf
(
stderr
,
"malloc failed
\n
"
);
exit
(
-
1
);
}
for
(
i
=
0
;
i
<
Q_N_I_length
-
n_PC
;
i
++
)
{
w_g_sorted
[
i
]
=
w_g
[
Q_tilde_N_I_flip
[
i
]
-
1
];
// w_g(Q_tilde_N_I_flip), yet to sort
indices
[
i
]
=
i
;
}
free
(
Q_tilde_N_I
);
free
(
w_g
);
//bubble sort
int
tempToSwap
=
0
;
for
(
i
=
0
;
i
<
(
Q_N_I_length
-
n_PC
)
-
1
;
i
++
)
{
for
(
j
=
0
;
j
<
(
Q_N_I_length
-
n_PC
)
-
i
-
1
;
j
++
)
{
if
(
w_g_sorted
[
j
]
>
w_g_sorted
[
j
+
1
])
//then swap
{
tempToSwap
=
w_g_sorted
[
j
];
w_g_sorted
[
j
]
=
w_g_sorted
[
j
+
1
];
w_g_sorted
[
j
+
1
]
=
tempToSwap
;
tempToSwap
=
indices
[
j
];
indices
[
j
]
=
indices
[
j
+
1
];
indices
[
j
+
1
]
=
tempToSwap
;
}
}
}
free
(
w_g_sorted
);
//Q_N_PC = [Q_N_I(1:n_PC-n_PC_wm), Q_tilde_N_I_flip(indices(1:n_PC_wm))];
int
*
Q_N_PC
=
(
int
*
)
malloc
(
sizeof
(
int
)
*
(
n_PC
));
if
(
Q_N_PC
==
NULL
)
{
fprintf
(
stderr
,
"malloc failed
\n
"
);
exit
(
-
1
);
}
for
(
i
=
0
;
i
<
n_PC
-
n_PC_wm
;
i
++
)
{
Q_N_PC
[
i
]
=
Q_N_I
[
i
];
//Q_N_PC = [Q_N_I(1:n_PC-n_PC_wm), ...
}
free
(
Q_N_I
);
for
(
i
=
0
;
i
<
n_PC_wm
;
i
++
)
{
Q_N_PC
[
n_PC
-
n_PC_wm
+
i
]
=
Q_tilde_N_I_flip
[
indices
[
i
]];
//... Q_tilde_N_I_flip(indices(1:n_PC_wm))];
}
free
(
Q_tilde_N_I_flip
);
free
(
indices
);
//PC_bit_pattern = false(1,N);
//PC_bit_pattern(Q_N_PC) = true;
*
PC_bit_pattern
=
(
uint8_t
*
)
malloc
(
sizeof
(
uint8_t
)
*
(
Q_N_length
));
if
(
*
PC_bit_pattern
==
NULL
)
{
fprintf
(
stderr
,
"malloc failed
\n
"
);
exit
(
-
1
);
}
for
(
i
=
0
;
i
<
Q_N_length
;
i
++
)
{
(
*
PC_bit_pattern
)[
i
]
=
0
;
for
(
j
=
0
;
j
<
n_PC
;
j
++
)
{
if
(
Q_N_PC
[
j
]
-
1
==
i
)
{
(
*
PC_bit_pattern
)[
i
]
=
1
;
break
;
}
}
}
//free(Q_I);
//free(Q_N_common);
//free(Q_N_I);
//free(w_g);
//free(Q_tilde_N_I);
//free(Q_tilde_N_I_flip);
//free(w_g_sorted);
//free(indices);
free
(
Q_N_PC
);
}
openair1/PHY/CODING/nrPolar_tools/get_crc_generator_matrix.c
deleted
100644 → 0
View file @
cded3bd6
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdint.h>
void
get_crc_generator_matrix
(
uint8_t
A
,
uint8_t
P
,
uint8_t
*
crc_polynomial_pattern
,
uint8_t
***
G_P
)
{
// GET_CRC_GENERATOR_MATRIX Obtain a Cyclic Redudancy Check (CRC) generator
// matrix.
//
// A should be an integer scalar. It specifies the number of bits in the
// information bit sequence.
//
// crc_polynomial_pattern should be a binary row vector comprising P+1
// number of bits, each having the value 0 or 1. These bits parameterise a
// Cyclic Redundancy Check (CRC) comprising P bits. Each bit provides the
// coefficient of the corresponding element in the CRC generator
// polynomial. From left to right, the bits provide the coefficients for
// the elements D^P, D^P-1, D^P-2, ..., D^2, D, 1.
//
// G_P will be a K by P binary matrix. The CRC bits can be generated
// according to mod(a*G_P,2).
*
G_P
=
(
uint8_t
**
)
malloc
(
A
*
sizeof
(
uint8_t
*
));
if
(
*
G_P
==
NULL
)
{
fprintf
(
stderr
,
"malloc failed
\n
"
);
exit
(
-
1
);
}
int
i
,
j
;
for
(
i
=
0
;
i
<
A
;
i
++
)
{
(
*
G_P
)[
i
]
=
(
uint8_t
*
)
malloc
(
P
*
sizeof
(
uint8_t
));
if
((
*
G_P
)[
i
]
==
NULL
)
{
fprintf
(
stderr
,
"malloc failed
\n
"
);
exit
(
-
1
);
}
}
if
(
A
>
0
)
{
//G_P(end,:) = crc_polynomial_pattern(2:end);
for
(
i
=
0
;
i
<
P
;
i
++
)
{
(
*
G_P
)[
A
-
1
][
i
]
=
crc_polynomial_pattern
[
i
+
1
];
}
//for k = A-1:-1:1
// G_P(k,:) = xor([G_P(k+1,2:end),0],G_P(k+1,1)*crc_polynomial_pattern(2:end));
//end
for
(
j
=
A
-
2
;
j
>-
1
;
j
--
)
{
for
(
i
=
0
;
i
<
P
;
i
++
)