Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG UE
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lizhongxiao
OpenXG UE
Commits
a0bcd41b
Commit
a0bcd41b
authored
Apr 14, 2019
by
yilmazt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added clean_gNB_ulsch, fully working polartest, and many other minor warning removals.
parent
f8eff2f9
Changes
26
Show whitespace changes
Inline
Side-by-side
Showing
26 changed files
with
419 additions
and
1106 deletions
+419
-1106
cmake_targets/CMakeLists.txt
cmake_targets/CMakeLists.txt
+3
-1
cmake_targets/autotests/test_case_list.xml
cmake_targets/autotests/test_case_list.xml
+8
-9
cmake_targets/build_oai
cmake_targets/build_oai
+0
-2
openair1/PHY/CODING/TESTBENCH/polartest.c
openair1/PHY/CODING/TESTBENCH/polartest.c
+180
-303
openair1/PHY/CODING/TESTBENCH/smallblocktest.c
openair1/PHY/CODING/TESTBENCH/smallblocktest.c
+1
-5
openair1/PHY/CODING/crc_byte.c
openair1/PHY/CODING/crc_byte.c
+1
-32
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/time_meas.c
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/time_meas.c
+0
-117
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/time_meas.h
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/time_meas.h
+0
-156
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
+1
-1
openair1/PHY/CODING/nrPolar_tools/nr_bitwise_operations.c
openair1/PHY/CODING/nrPolar_tools/nr_bitwise_operations.c
+13
-14
openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c
openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c
+21
-35
openair1/PHY/CODING/nrPolar_tools/nr_polar_decoder.c
openair1/PHY/CODING/nrPolar_tools/nr_polar_decoder.c
+8
-285
openair1/PHY/CODING/nrPolar_tools/nr_polar_defs.h
openair1/PHY/CODING/nrPolar_tools/nr_polar_defs.h
+20
-36
openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c
openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c
+26
-77
openair1/PHY/CODING/nrSmallBlock/decodeSmallBlock.c
openair1/PHY/CODING/nrSmallBlock/decodeSmallBlock.c
+1
-1
openair1/PHY/CODING/nr_polar_init.c
openair1/PHY/CODING/nr_polar_init.c
+9
-10
openair1/PHY/NR_TRANSPORT/nr_dci.h
openair1/PHY/NR_TRANSPORT/nr_dci.h
+0
-2
openair1/PHY/NR_TRANSPORT/nr_dlsch.h
openair1/PHY/NR_TRANSPORT/nr_dlsch.h
+2
-0
openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
+99
-1
openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
+2
-2
openair1/SCHED_NR/fapi_nr_l1.h
openair1/SCHED_NR/fapi_nr_l1.h
+3
-1
openair1/SIMULATION/NR_PHY/dlschsim.c
openair1/SIMULATION/NR_PHY/dlschsim.c
+1
-1
openair1/SIMULATION/NR_PHY/dlsim.c
openair1/SIMULATION/NR_PHY/dlsim.c
+5
-2
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+8
-8
openair2/LAYER2/NR_MAC_gNB/mac_proto.h
openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+7
-1
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+0
-4
No files found.
cmake_targets/CMakeLists.txt
View file @
a0bcd41b
...
@@ -2511,7 +2511,9 @@ add_executable(polartest
...
@@ -2511,7 +2511,9 @@ add_executable(polartest
target_link_libraries
(
polartest SIMU PHY PHY_NR PHY_COMMON m
${
ATLAS_LIBRARIES
}
)
target_link_libraries
(
polartest SIMU PHY PHY_NR PHY_COMMON m
${
ATLAS_LIBRARIES
}
)
add_executable
(
smallblocktest
${
OPENAIR1_DIR
}
/PHY/CODING/TESTBENCH/smallblocktest.c
)
add_executable
(
smallblocktest
${
OPENAIR1_DIR
}
/PHY/CODING/TESTBENCH/smallblocktest.c
${
OPENAIR_DIR
}
/common/utils/backtrace.c
)
target_link_libraries
(
smallblocktest SIMU PHY PHY_NR PHY_COMMON m
${
ATLAS_LIBRARIES
}
)
target_link_libraries
(
smallblocktest SIMU PHY PHY_NR PHY_COMMON m
${
ATLAS_LIBRARIES
}
)
add_executable
(
ldpctest
add_executable
(
ldpctest
...
...
cmake_targets/autotests/test_case_list.xml
View file @
a0bcd41b
...
@@ -1120,16 +1120,15 @@
...
@@ -1120,16 +1120,15 @@
<testCase
id=
"015107"
>
<testCase
id=
"015107"
>
<class>
execution
</class>
<class>
execution
</class>
<desc>
shortblocktest Test cases. (Test1: 3 bits),
<desc>
shortblocktest Test cases. (Test1: 3 bits),
(Test2: 6 bits)
(Test2: 6 bits),
(Test3: 7 bits)
(Test3: 7 bits),
(Test4: 11 bits)
(Test4: 11 bits)
</desc>
</desc>
<main_exec>
$OPENAIR_DIR/targets/bin/smallblocktest.Rel15
</main_exec>
<main_exec>
$OPENAIR_DIR/targets/bin/smallblocktest.Rel15
</main_exec>
<main_exec_args>
-l 3
<main_exec_args>
-l 3
-s -4 -d 1 -i 10000
-l 6
-l 6
-s -4 -d 1 -i 10000
-l 7
-l 7
-s -4 -d 1 -i 10000
-l 11
</main_exec_args>
-l 11
-s -4 -d 1 -i 10000
</main_exec_args>
<tags>
smallblocktest.test1 smallblocktest.test2 smallblocktest.test3 smallblocktest.test
3
</tags>
<tags>
smallblocktest.test1 smallblocktest.test2 smallblocktest.test3 smallblocktest.test
4
</tags>
<search_expr_true>
BLER= 0.000000
</search_expr_true>
<search_expr_true>
BLER= 0.000000
</search_expr_true>
<search_expr_false>
segmentation fault|assertion|exiting|fatal
</search_expr_false>
<search_expr_false>
segmentation fault|assertion|exiting|fatal
</search_expr_false>
<nruns>
3
</nruns>
<nruns>
3
</nruns>
...
...
cmake_targets/build_oai
View file @
a0bcd41b
...
@@ -80,8 +80,6 @@ function print_help() {
...
@@ -80,8 +80,6 @@ function print_help() {
This program installs OpenAirInterface Software
This program installs OpenAirInterface Software
You should have ubuntu 16.xx or 18.04 updated
You should have ubuntu 16.xx or 18.04 updated
Options
Options
-h
This help
-c | --clean
-c | --clean
Erase all files to make a rebuild from start
Erase all files to make a rebuild from start
-C | --clean-all
-C | --clean-all
...
...
openair1/PHY/CODING/TESTBENCH/polartest.c
View file @
a0bcd41b
...
@@ -16,43 +16,11 @@
...
@@ -16,43 +16,11 @@
//#define DEBUG_DCI_POLAR_PARAMS
//#define DEBUG_DCI_POLAR_PARAMS
//#define DEBUG_POLAR_TIMING
//#define DEBUG_POLAR_TIMING
//#define DEBUG_CRC
//#define DEBUG_POLARTEST
//#define DEBUG_POLARTEST
uint8_t
nr_pbch_payload_interleaving_pattern
[
32
]
=
{
16
,
23
,
18
,
17
,
8
,
30
,
10
,
6
,
24
,
7
,
0
,
5
,
3
,
2
,
1
,
4
,
9
,
11
,
12
,
13
,
14
,
15
,
19
,
20
,
21
,
22
,
25
,
26
,
27
,
28
,
29
,
31
};
void
nr_init_pbch_interleaver
(
uint8_t
*
interleaver
)
{
uint8_t
j_sfn
=
0
,
j_hrf
=
10
,
j_ssb
=
11
,
j_other
=
14
;
memset
((
void
*
)
interleaver
,
0
,
NR_POLAR_PBCH_PAYLOAD_BITS
);
for
(
uint8_t
i
=
0
;
i
<
NR_POLAR_PBCH_PAYLOAD_BITS
;
i
++
)
if
(
!
i
)
// choice bit:1
*
(
interleaver
+
i
)
=
*
(
nr_pbch_payload_interleaving_pattern
+
j_other
++
);
else
if
(
i
<
7
)
//Sfn bits:6
*
(
interleaver
+
i
)
=
*
(
nr_pbch_payload_interleaving_pattern
+
j_sfn
++
);
else
if
(
i
<
24
)
// other:17
*
(
interleaver
+
i
)
=
*
(
nr_pbch_payload_interleaving_pattern
+
j_other
++
);
else
if
(
i
<
28
)
// Sfn:4
*
(
interleaver
+
i
)
=
*
(
nr_pbch_payload_interleaving_pattern
+
j_sfn
++
);
else
if
(
i
==
28
)
// Hrf bit:1
*
(
interleaver
+
i
)
=
*
(
nr_pbch_payload_interleaving_pattern
+
j_hrf
);
else
// Ssb bits:3
*
(
interleaver
+
i
)
=
*
(
nr_pbch_payload_interleaving_pattern
+
j_ssb
++
);
}
int
main
(
int
argc
,
char
*
argv
[])
{
int
main
(
int
argc
,
char
*
argv
[])
{
//Initiate timing. (Results depend on CPU Frequency. Therefore, might change due to performance variances during simulation.)
time_stats_t
timeEncoder
,
timeDecoder
;
opp_enabled
=
1
;
int
decoder_int16
=
0
;
cpu_freq_GHz
=
get_cpu_freq_GHz
();
reset_meas
(
&
timeEncoder
);
reset_meas
(
&
timeDecoder
);
randominit
(
0
);
crcTableInit
();
//Default simulation values (Aim for iterations = 1000000.)
//Default simulation values (Aim for iterations = 1000000.)
int
decoder_int16
=
0
;
int
itr
,
iterations
=
1000
,
arguments
,
polarMessageType
=
0
;
//0=PBCH, 1=DCI, -1=UCI
int
itr
,
iterations
=
1000
,
arguments
,
polarMessageType
=
0
;
//0=PBCH, 1=DCI, -1=UCI
double
SNRstart
=
-
20
.
0
,
SNRstop
=
0
.
0
,
SNRinc
=
0
.
5
;
//dB
double
SNRstart
=
-
20
.
0
,
SNRstop
=
0
.
0
,
SNRinc
=
0
.
5
;
//dB
double
SNR
,
SNR_lin
;
double
SNR
,
SNR_lin
;
...
@@ -60,9 +28,10 @@ int main(int argc, char *argv[]) {
...
@@ -60,9 +28,10 @@ int main(int argc, char *argv[]) {
uint32_t
decoderState
=
0
,
blockErrorState
=
0
;
//0 = Success, -1 = Decoding failed, 1 = Block Error.
uint32_t
decoderState
=
0
,
blockErrorState
=
0
;
//0 = Success, -1 = Decoding failed, 1 = Block Error.
uint16_t
testLength
=
NR_POLAR_PBCH_PAYLOAD_BITS
,
coderLength
=
NR_POLAR_PBCH_E
,
blockErrorCumulative
=
0
,
bitErrorCumulative
=
0
;
uint16_t
testLength
=
NR_POLAR_PBCH_PAYLOAD_BITS
,
coderLength
=
NR_POLAR_PBCH_E
,
blockErrorCumulative
=
0
,
bitErrorCumulative
=
0
;
double
timeEncoderCumulative
=
0
,
timeDecoderCumulative
=
0
;
double
timeEncoderCumulative
=
0
,
timeDecoderCumulative
=
0
;
uint8_t
aggregation_level
=
NR_POLAR_PBCH_AGGREGATION_LEVEL
,
decoderListSize
=
8
,
pathMetricAppr
=
0
;
uint8_t
aggregation_level
=
8
,
decoderListSize
=
8
,
pathMetricAppr
=
0
,
logFlag
=
0
;
uint16_t
rnti
=
0
;
while
((
arguments
=
getopt
(
argc
,
argv
,
"s:d:f:m:i:l:a:hqgL:K:"
))
!=
-
1
)
while
((
arguments
=
getopt
(
argc
,
argv
,
"s:d:f:m:i:l:a:hqg
F
L:K:"
))
!=
-
1
)
switch
(
arguments
)
{
switch
(
arguments
)
{
case
's'
:
case
's'
:
SNRstart
=
atof
(
optarg
);
SNRstart
=
atof
(
optarg
);
...
@@ -78,10 +47,8 @@ int main(int argc, char *argv[]) {
...
@@ -78,10 +47,8 @@ int main(int argc, char *argv[]) {
case
'm'
:
case
'm'
:
polarMessageType
=
atoi
(
optarg
);
polarMessageType
=
atoi
(
optarg
);
if
(
polarMessageType
!=
0
&&
polarMessageType
!=
1
&&
polarMessageType
!=
2
)
{
if
(
polarMessageType
!=
0
&&
polarMessageType
!=
1
&&
polarMessageType
!=
2
)
printf
(
"Illegal polar message type %d (should be 0,1 or 2)
\n
"
,
printf
(
"Illegal polar message type %d (should be 0,1 or 2)
\n
"
,
polarMessageType
);
polarMessageType
);
}
break
;
break
;
case
'i'
:
case
'i'
:
...
@@ -107,30 +74,30 @@ int main(int argc, char *argv[]) {
...
@@ -107,30 +74,30 @@ int main(int argc, char *argv[]) {
decoder_int16
=
1
;
decoder_int16
=
1
;
break
;
break
;
case
'F'
:
logFlag
=
1
;
break
;
case
'L'
:
case
'L'
:
aggregation_level
=
atoi
(
optarg
);
aggregation_level
=
atoi
(
optarg
);
if
(
aggregation_level
!=
1
&&
if
(
aggregation_level
!=
1
&&
aggregation_level
!=
2
&&
aggregation_level
!=
4
&&
aggregation_level
!=
8
&&
aggregation_level
!=
16
)
{
aggregation_level
!=
2
&&
aggregation_level
!=
4
&&
aggregation_level
!=
8
&&
aggregation_level
!=
16
)
{
printf
(
"Illegal aggregation level %d
\n
"
,
aggregation_level
);
printf
(
"Illegal aggregation level %d
\n
"
,
aggregation_level
);
exit
(
-
1
);
exit
(
-
1
);
}
}
break
;
break
;
case
'K'
:
case
'K'
:
testLength
=
atoi
(
optarg
);
testLength
=
atoi
(
optarg
);
if
(
testLength
<
12
||
testLength
>
60
)
{
if
(
testLength
<
12
||
testLength
>
60
)
{
printf
(
"Illegal packet bitlength
\n
"
,
testLength
);
printf
(
"Illegal packet bitlength %d
\n
"
,
testLength
);
exit
(
-
1
);
exit
(
-
1
);
}
}
break
;
break
;
case
'h'
:
case
'h'
:
printf
(
"./polartest -s SNRstart -d SNRinc -f SNRstop -m [0=PBCH|1=DCI|2=UCI] -i iterations -l decoderListSize -a pathMetricAppr -L aggregation level (for DCI) -K packet_length (bits) for DCI/UCI
\n
"
);
printf
(
"./polartest
\n
Options
\n
-h Print this help
\n
-s SNRstart (dB)
\n
-d SNRinc (dB)
\n
-f SNRstop (dB)
\n
-m [0=PBCH|1=DCI|2=UCI]
\n
"
"-i Number of iterations
\n
-l decoderListSize
\n
-a pathMetricAppr
\n
-q Flag for optimized coders usage
\n
-F Flag for test results logging
\n
"
"-L aggregation level (for DCI)
\n
-K packet_length (bits) for DCI/UCI
\n
"
);
exit
(
-
1
);
exit
(
-
1
);
break
;
break
;
...
@@ -140,7 +107,17 @@ int main(int argc, char *argv[]) {
...
@@ -140,7 +107,17 @@ int main(int argc, char *argv[]) {
break
;
break
;
}
}
//Initiate timing. (Results depend on CPU Frequency. Therefore, might change due to performance variances during simulation.)
time_stats_t
timeEncoder
,
timeDecoder
;
opp_enabled
=
1
;
cpu_freq_GHz
=
get_cpu_freq_GHz
();
reset_meas
(
&
timeEncoder
);
reset_meas
(
&
timeDecoder
);
randominit
(
0
);
crcTableInit
();
if
(
polarMessageType
==
0
)
{
//PBCH
if
(
polarMessageType
==
0
)
{
//PBCH
aggregation_level
=
NR_POLAR_PBCH_AGGREGATION_LEVEL
;
}
else
if
(
polarMessageType
==
1
)
{
//DCI
}
else
if
(
polarMessageType
==
1
)
{
//DCI
coderLength
=
108
*
aggregation_level
;
coderLength
=
108
*
aggregation_level
;
}
else
if
(
polarMessageType
==
-
1
)
{
//UCI
}
else
if
(
polarMessageType
==
-
1
)
{
//UCI
...
@@ -150,13 +127,14 @@ int main(int argc, char *argv[]) {
...
@@ -150,13 +127,14 @@ int main(int argc, char *argv[]) {
//Logging
//Logging
time_t
currentTime
;
time_t
currentTime
;
time
(
&
currentTime
);
char
fileName
[
512
],
currentTimeInfo
[
25
];
char
fileName
[
512
],
currentTimeInfo
[
25
];
char
folderName
[]
=
"."
;
char
folderName
[]
=
"."
;
/*
FILE
*
logFile
;
folderName=getenv("HOME");
/*folderName=getenv("HOME");
strcat(folderName,"/Desktop/polartestResults");
strcat(folderName,"/Desktop/polartestResults");*/
*/
if
(
logFlag
){
time
(
&
currentTime
);
#ifdef DEBUG_POLAR_TIMING
#ifdef DEBUG_POLAR_TIMING
sprintf
(
fileName
,
"%s/TIMING_ListSize_%d_pmAppr_%d_Payload_%d_Itr_%d"
,
folderName
,
decoderListSize
,
pathMetricAppr
,
testLength
,
iterations
);
sprintf
(
fileName
,
"%s/TIMING_ListSize_%d_pmAppr_%d_Payload_%d_Itr_%d"
,
folderName
,
decoderListSize
,
pathMetricAppr
,
testLength
,
iterations
);
#else
#else
...
@@ -165,11 +143,8 @@ int main(int argc, char *argv[]) {
...
@@ -165,11 +143,8 @@ int main(int argc, char *argv[]) {
strftime
(
currentTimeInfo
,
25
,
"_%Y-%m-%d-%H-%M-%S.csv"
,
localtime
(
&
currentTime
));
strftime
(
currentTimeInfo
,
25
,
"_%Y-%m-%d-%H-%M-%S.csv"
,
localtime
(
&
currentTime
));
strcat
(
fileName
,
currentTimeInfo
);
strcat
(
fileName
,
currentTimeInfo
);
//Create "~/Desktop/polartestResults" folder if it doesn't already exist.
//Create "~/Desktop/polartestResults" folder if it doesn't already exist.
/*
/*struct stat folder = {0};
struct stat folder = {0};
if (stat(folderName, &folder) == -1) mkdir(folderName, S_IRWXU | S_IRWXG | S_IRWXO);*/
if (stat(folderName, &folder) == -1) mkdir(folderName, S_IRWXU | S_IRWXG | S_IRWXO);
*/
FILE
*
logFile
;
logFile
=
fopen
(
fileName
,
"w"
);
logFile
=
fopen
(
fileName
,
"w"
);
if
(
logFile
==
NULL
)
{
if
(
logFile
==
NULL
)
{
...
@@ -178,11 +153,12 @@ int main(int argc, char *argv[]) {
...
@@ -178,11 +153,12 @@ int main(int argc, char *argv[]) {
}
}
#ifdef DEBUG_POLAR_TIMING
#ifdef DEBUG_POLAR_TIMING
fprintf
(
logFile
,
fprintf
(
logFile
,
",timeEncoderCRCByte[us],timeEncoderCRCBit[us],timeEncoderInterleaver[us],timeEncoderBitInsertion[us],timeEncoder1[us],timeEncoder2[us],timeEncoderRateMatching[us],timeEncoderByte2Bit[us]
\n
"
);
",timeEncoderCRCByte[us],timeEncoderCRCBit[us],timeEncoderInterleaver[us],timeEncoderBitInsertion[us],timeEncoder1[us],timeEncoder2[us],timeEncoderRateMatching[us],timeEncoderByte2Bit[us]
\n
"
);
#else
#else
fprintf
(
logFile
,
",SNR,nBitError,blockErrorState,t_encoder[us],t_decoder[us]
\n
"
);
fprintf
(
logFile
,
",SNR,nBitError,blockErrorState,t_encoder[us],t_decoder[us]
\n
"
);
#endif
#endif
}
uint8_t
testArrayLength
=
ceil
(
testLength
/
32
.
0
);
uint8_t
testArrayLength
=
ceil
(
testLength
/
32
.
0
);
uint8_t
coderArrayLength
=
ceil
(
coderLength
/
32
.
0
);
uint8_t
coderArrayLength
=
ceil
(
coderLength
/
32
.
0
);
uint32_t
testInput
[
testArrayLength
];
//generate randomly
uint32_t
testInput
[
testArrayLength
];
//generate randomly
...
@@ -196,151 +172,48 @@ int main(int argc, char *argv[]) {
...
@@ -196,151 +172,48 @@ int main(int argc, char *argv[]) {
double
channelOutput
[
coderLength
];
//add noise
double
channelOutput
[
coderLength
];
//add noise
int16_t
channelOutput_int16
[
coderLength
];
int16_t
channelOutput_int16
[
coderLength
];
t_nrPolar_params
*
currentPtr
=
nr_polar_params
(
polarMessageType
,
testLength
,
aggregation_level
);
t_nrPolar_params
*
currentPtr
=
nr_polar_params
(
polarMessageType
,
testLength
,
aggregation_level
);
#ifdef DEBUG_DCI_POLAR_PARAMS
#ifdef DEBUG_DCI_POLAR_PARAMS
uint32_t
dci_pdu
[
4
];
uint32_t
dci_pdu
[
4
];
memset
(
dci_pdu
,
0
,
sizeof
(
uint32_t
)
*
4
);
memset
(
dci_pdu
,
0
,
sizeof
(
uint32_t
)
*
4
);
dci_pdu
[
0
]
=
0x01189400
;
dci_pdu
[
0
]
=
0x01189400
;
printf
(
"dci_pdu: [0]->0x%08x
\t
[1]->0x%08x
\t
[2]->0x%08x
\t
[3]->0x%08x
\n
"
,
printf
(
"dci_pdu: [0]->0x%08x
\t
[1]->0x%08x
\t
[2]->0x%08x
\t
[3]->0x%08x
\n
"
,
dci_pdu
[
0
],
dci_pdu
[
1
],
dci_pdu
[
2
],
dci_pdu
[
3
]);
dci_pdu
[
0
],
dci_pdu
[
1
],
dci_pdu
[
2
],
dci_pdu
[
3
]);
uint32_t
encoder_output
[
54
];
memset
(
encoder_output
,
0
,
sizeof
(
uint32_t
)
*
54
);
uint16_t
size
=
41
;
uint16_t
size
=
41
;
uint16_t
rnti
=
3
;
rnti
=
3
;
aggregation_level
=
8
;
aggregation_level
=
8
;
uint32_t
encoder_output
[
54
];
memset
(
encoder_output
,
0
,
sizeof
(
uint32_t
)
*
54
);
t_nrPolar_params
*
currentPtrDCI
=
nr_polar_params
(
1
,
size
,
aggregation_level
);
t_nrPolar_params
*
currentPtrDCI
=
nr_polar_params
(
1
,
size
,
aggregation_level
);
polar_encoder_dci
(
dci_pdu
,
encoder_output
,
currentPtrDCI
,
rnti
);
for
(
int
i
=
0
;
i
<
54
;
i
++
)
polar_encoder_dci
(
dci_pdu
,
encoder_output
,
currentPtrDCI
,
rnti
);
printf
(
"encoder_output: [%2d]->0x%08x
\n
"
,
i
,
encoder_output
[
i
]);
for
(
int
i
=
0
;
i
<
54
;
i
++
)
printf
(
"encoder_output: [%2d]->0x%08x
\n
"
,
i
,
encoder_output
[
i
]);
uint8_t
*
encoder_outputByte
=
malloc
(
sizeof
(
uint8_t
)
*
currentPtrDCI
->
encoderLength
);
uint8_t
*
encoder_outputByte
=
malloc
(
sizeof
(
uint8_t
)
*
currentPtrDCI
->
encoderLength
);
double
*
modulated_input
=
malloc
(
sizeof
(
double
)
*
currentPtrDCI
->
encoderLength
);
double
*
channel_output
=
malloc
(
sizeof
(
double
)
*
currentPtrDCI
->
encoderLength
);
double
*
channel_output
=
malloc
(
sizeof
(
double
)
*
currentPtrDCI
->
encoderLength
);
uint32_t
dci_estimation
[
4
];
uint32_t
dci_est
[
4
];
memset
(
dci_estimation
,
0
,
sizeof
(
uint32_t
)
*
4
);
memset
(
dci_est
,
0
,
sizeof
(
uint32_t
)
*
4
);
printf
(
"dci_estimation: [0]->0x%08x
\t
[1]->0x%08x
\t
[2]->0x%08x
\t
[3]->0x%08x
\n
"
,
printf
(
"dci_est: [0]->0x%08x
\t
[1]->0x%08x
\t
[2]->0x%08x
\t
[3]->0x%08x
\n
"
,
dci_est
[
0
],
dci_est
[
1
],
dci_est
[
2
],
dci_est
[
3
]);
dci_estimation
[
0
],
dci_estimation
[
1
],
dci_estimation
[
2
],
dci_estimation
[
3
]);
nr_bit2byte_uint32_8
(
encoder_output
,
currentPtrDCI
->
encoderLength
,
encoder_outputByte
);
nr_bit2byte_uint32_8
(
encoder_output
,
currentPtrDCI
->
encoderLength
,
encoder_outputByte
);
printf
(
"[polartest] encoder_outputByte: "
);
printf
(
"[polartest] encoder_outputByte: "
);
for
(
int
i
=
0
;
i
<
currentPtrDCI
->
encoderLength
;
i
++
)
printf
(
"%d-"
,
encoder_outputByte
[
i
]);
printf
(
"
\n
"
);
for
(
int
i
=
0
;
i
<
currentPtrDCI
->
encoderLength
;
i
++
)
printf
(
"%d-"
,
encoder_outputByte
[
i
]);
SNR_lin
=
pow
(
10
,
0
/
10
);
//SNR = 0 dB
printf
(
"
\n
"
);
for
(
int
i
=
0
;
i
<
currentPtrDCI
->
encoderLength
;
i
++
)
{
for
(
int
i
=
0
;
i
<
currentPtrDCI
->
encoderLength
;
i
++
)
{
if
(
encoder_outputByte
[
i
]
==
0
)
{
if
(
encoder_outputByte
[
i
]
==
0
)
channel_out
put
[
i
]
=
1
/
sqrt
(
2
);
modulated_in
put
[
i
]
=
1
/
sqrt
(
2
);
}
else
{
else
channel_out
put
[
i
]
=
(
-
1
)
/
sqrt
(
2
);
modulated_in
put
[
i
]
=
(
-
1
)
/
sqrt
(
2
);
}
channel_output
[
i
]
=
modulated_input
[
i
]
+
(
gaussdouble
(
0
.
0
,
1
.
0
)
*
(
1
/
sqrt
(
2
*
SNR_lin
)));
}
}
decoderState
=
polar_decoder_dci
(
channel_output
,
dci_est
,
currentPtrDCI
,
NR_POLAR_DECODER_LISTSIZE
,
NR_POLAR_DECODER_PATH_METRIC_APPROXIMATION
,
rnti
);
decoderState
=
polar_decoder_dci
(
channel_output
,
printf
(
"dci_est: [0]->0x%08x
\t
[1]->0x%08x
\t
[2]->0x%08x
\t
[3]->0x%08x
\n
"
,
dci_est
[
0
],
dci_est
[
1
],
dci_est
[
2
],
dci_est
[
3
]);
dci_estimation
,
currentPtrDCI
,
NR_POLAR_DECODER_LISTSIZE
,
NR_POLAR_DECODER_PATH_METRIC_APPROXIMATION
,
rnti
);
printf
(
"dci_estimation: [0]->0x%08x
\t
[1]->0x%08x
\t
[2]->0x%08x
\t
[3]->0x%08x
\n
"
,
dci_estimation
[
0
],
dci_estimation
[
1
],
dci_estimation
[
2
],
dci_estimation
[
3
]);
free
(
encoder_outputByte
);
free
(
encoder_outputByte
);
free
(
channel_output
);
free
(
channel_output
);
free
(
modulated_input
);
return
0
;
return
0
;
#endif
#endif
#ifdef DEBUG_CRC
uint32_t
crc
;
unsigned
int
poly24c
=
0xb2b11700
;
uint32_t
testInputCRC
[
4
];
testInputCRC
[
0
]
=
0x00291880
;
//testInputCRC[0]=0x01189400;
testInputCRC
[
1
]
=
0x00000000
;
testInputCRC
[
2
]
=
0x00000000
;
testInputCRC
[
3
]
=
0x00000000
;
uint32_t
testInputcrc
=
0x01189400
;
uint32_t
testInputcrc2
=
0x00291880
;
uint8_t
testInputCRC2
[
8
];
nr_crc_bit2bit_uint32_8
(
testInputCRC
,
32
,
testInputCRC2
);
printf
(
"testInputCRC2: [0]->%x
\t
[1]->%x
\t
[2]->%x
\t
[3]->%x
\n
"
" [4]->%x
\t
[5]->%x
\t
[6]->%x
\t
[7]->%x
\n
"
,
testInputCRC2
[
0
],
testInputCRC2
[
1
],
testInputCRC2
[
2
],
testInputCRC2
[
3
],
testInputCRC2
[
4
],
testInputCRC2
[
5
],
testInputCRC2
[
6
],
testInputCRC2
[
7
]);
unsigned
int
crc41
=
crc24c
(
testInputCRC
,
32
);
unsigned
int
crc65
=
crc24c
(
testInputCRC
,
56
);
printf
(
"crc41: [0]->0x%08x
\t
crc65: [0]->0x%08x
\n
"
,
crc41
,
crc65
);
for
(
int
i
=
0
;
i
<
32
;
i
++
)
printf
(
"crc41[%d]=%d
\t
crc65[%d]=%d
\n
"
,
i
,(
crc41
>>
i
)
&
1
,
i
,(
crc65
>>
i
)
&
1
);
crc
=
crc24c
(
testInputCRC
,
testLength
)
>>
8
;
for
(
int
i
=
0
;
i
<
24
;
i
++
)
printf
(
"[i]=%d
\n
"
,(
crc
>>
i
)
&
1
);
printf
(
"crc: [0]->0x%08x
\n
"
,
crc
);
//crcbit(testInputCRC, sizeof(test) - 1, poly24c));
testInputCRC
[
testLength
>>
3
]
=
((
uint8_t
*
)
&
crc
)[
2
];
testInputCRC
[
1
+
(
testLength
>>
3
)]
=
((
uint8_t
*
)
&
crc
)[
1
];
testInputCRC
[
2
+
(
testLength
>>
3
)]
=
((
uint8_t
*
)
&
crc
)[
0
];
printf
(
"testInputCRC: [0]->0x%08x
\t
[1]->0x%08x
\t
[2]->0x%08x
\t
[3]->0x%08x
\n
"
,
testInputCRC
[
0
],
testInputCRC
[
1
],
testInputCRC
[
2
],
testInputCRC
[
3
]);
//uint32_t trial32 = 0xffffffff;
uint32_t
trial32
=
0xf10fffff
;
uint8_t
a
[
4
];
//memcpy(a, &trial32, sizeof(trial32));
*
(
uint32_t
*
)
a
=
trial32
;
unsigned
char
trial
[
4
];
trial
[
0
]
=
0xff
;
trial
[
1
]
=
0xff
;
trial
[
2
]
=
0x0f
;
trial
[
3
]
=
0xf1
;
uint32_t
trialcrc
=
crc24c
(
trial
,
32
);
uint32_t
trialcrc32
=
crc24c
((
uint8_t
*
)
&
trial32
,
32
);
//uint32_t trialcrc32 = crc24c(a, 32);
printf
(
"crcbit(trial = %x
\n
"
,
crcbit
(
trial
,
4
,
poly24c
));
printf
(
"trialcrc = %x
\n
"
,
trialcrc
);
printf
(
"trialcrc32 = %x
\n
"
,
trialcrc32
);
for
(
int
i
=
0
;
i
<
32
;
i
++
)
printf
(
"trialcrc[%2d]=%d
\t
trialcrc32[%2d]=%d
\n
"
,
i
,(
trialcrc
>>
i
)
&
1
,
i
,(
trialcrc32
>>
i
)
&
1
);
//uint8_t nr_polar_A[32] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
uint8_t
nr_polar_A
[
32
]
=
{
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
1
};
uint8_t
nr_polar_crc
[
24
];
uint8_t
**
crc_generator_matrix
=
crc24c_generator_matrix
(
32
);
nr_matrix_multiplication_uint8_1D_uint8_2D
(
nr_polar_A
,
crc_generator_matrix
,
nr_polar_crc
,
32
,
24
);
for
(
uint8_t
i
=
0
;
i
<
24
;
i
++
)
{
nr_polar_crc
[
i
]
=
(
nr_polar_crc
[
i
]
%
2
);
printf
(
"nr_polar_crc[%d]=%d
\n
"
,
i
,
nr_polar_crc
[
i
]);
}
return
0
;
#endif
#ifdef DEBUG_POLAR_TIMING
for
(
SNR
=
SNRstart
;
SNR
<=
SNRstop
;
SNR
+=
SNRinc
)
{
SNR_lin
=
pow
(
10
,
SNR
/
10
);
for
(
itr
=
1
;
itr
<=
iterations
;
itr
++
)
{
for
(
int
j
=
0
;
j
<
ceil
(
testLength
/
32
.
0
);
j
++
)
{
for
(
int
i
=
0
;
i
<
32
;
i
++
)
{
testInput
[
j
]
|=
(
((
uint32_t
)
(
rand
()
%
2
))
&
1
);
testInput
[
j
]
<<=
1
;
}
}
printf
(
"testInput: [0]->0x%08x
\n
"
,
testInput
[
0
]);
polar_encoder_timing
(
testInput
,
encoderOutput
,
currentPtr
,
cpu_freq_GHz
,
logFile
);
}
}
fclose
(
logFile
);
free
(
testInput
);
free
(
encoderOutput
);
free
(
modulatedInput
);
free
(
channelOutput
);
free
(
estimatedOutput
);
return
(
0
);
#endif
// We assume no a priori knowledge available about the payload.
// We assume no a priori knowledge available about the payload.
double
aPrioriArray
[
currentPtr
->
payloadBits
];
double
aPrioriArray
[
currentPtr
->
payloadBits
];
...
@@ -351,33 +224,39 @@ int main(int argc, char *argv[]) {
...
@@ -351,33 +224,39 @@ int main(int argc, char *argv[]) {
SNR_lin
=
pow
(
10
,
SNR
/
10
);
SNR_lin
=
pow
(
10
,
SNR
/
10
);
for
(
itr
=
1
;
itr
<=
iterations
;
itr
++
)
{
for
(
itr
=
1
;
itr
<=
iterations
;
itr
++
)
{
//Generate random values for all the bits of "testInput", not just as much as "currentPtr->payloadBits".
for
(
int
i
=
0
;
i
<
testArrayLength
;
i
++
)
{
for
(
int
i
=
0
;
i
<
testArrayLength
;
i
++
)
{
for
(
int
j
=
0
;
j
<
(
sizeof
(
testInput
[
0
])
*
8
)
-
1
;
j
++
)
{
for
(
int
j
=
0
;
j
<
(
sizeof
(
testInput
[
0
])
*
8
)
-
1
;
j
++
)
{
testInput
[
i
]
|=
(
((
uint32_t
)
(
rand
()
%
2
))
&
1
);
testInput
[
i
]
|=
(
((
uint32_t
)
(
rand
()
%
2
))
&
1
);
testInput
[
i
]
<<=
1
;
testInput
[
i
]
<<=
1
;
}
}
testInput
[
i
]
|=
(
((
uint32_t
)
(
rand
()
%
2
))
&
1
);
testInput
[
i
]
|=
(
((
uint32_t
)
(
rand
()
%
2
))
&
1
);
}
}
#ifdef DEBUG_POLARTEST
/*printf("testInput: [0]->0x%08x\n", testInput[0]);
//testInput[0] = 0x360f8a5c;
for (int i=0; i<32; i++)
printf
(
"testInput: [0]->0x%08x
\n
"
,
testInput
[
0
]);
printf("%d\n",(testInput[0]>>i)&1);*/
//for (int i=0; i<32; i++) printf("%d-",(testInput[0]>>i)&1); printf("\n");
#endif
int
len_mod64
=
currentPtr
->
payloadBits
&
63
;
int
len_mod64
=
currentPtr
->
payloadBits
&
63
;
((
uint64_t
*
)
testInput
)[
currentPtr
->
payloadBits
/
64
]
&=
((((
uint64_t
)
1
)
<<
len_mod64
)
-
1
);
((
uint64_t
*
)
testInput
)[
currentPtr
->
payloadBits
/
64
]
&=
((((
uint64_t
)
1
)
<<
len_mod64
)
-
1
);
start_meas
(
&
timeEncoder
);
if
(
decoder_int16
==
0
)
{
if
(
polarMessageType
==
0
)
polar_encoder
(
testInput
,
encoderOutput
,
currentPtr
);
else
polar_encoder_dci
(
testInput
,
encoderOutput
,
currentPtr
,
0
);
}
else
polar_encoder_fast
((
uint64_t
*
)
testInput
,
encoderOutput
,
0
,
currentPtr
);
start_meas
(
&
timeEncoder
);
if
(
decoder_int16
==
1
)
{
polar_encoder_fast
((
uint64_t
*
)
testInput
,
encoderOutput
,
0
,
currentPtr
);
//polar_encoder_fast((uint64_t*)testInput, (uint64_t*)encoderOutput,0, currentPtr);
//polar_encoder_fast((uint64_t*)testInput, (uint64_t*)encoderOutput,0, currentPtr);
}
else
{
//0 --> PBCH, 1 --> DCI, -1 --> UCI
if
(
polarMessageType
==
0
)
polar_encoder
(
testInput
,
encoderOutput
,
currentPtr
);
else
if
(
polarMessageType
==
1
)
polar_encoder_dci
(
testInput
,
encoderOutput
,
currentPtr
,
rnti
);
}
stop_meas
(
&
timeEncoder
);
stop_meas
(
&
timeEncoder
);
/*printf("encoderOutput: [0]->0x%08x\n", encoderOutput[0]);
printf("encoderOutput: [1]->0x%08x\n", encoderOutput[1]);*/
#ifdef DEBUG_POLARTEST
printf
(
"encoderOutput: [0]->0x%08x
\n
"
,
encoderOutput
[
0
]);
//for (int i=1;i<coderArrayLength;i++) printf("encoderOutput: [i]->0x%08x\n", i, encoderOutput[1]);
#endif
//Bit-to-byte:
//Bit-to-byte:
nr_bit2byte_uint32_8
(
encoderOutput
,
coderLength
,
encoderOutputByte
);
nr_bit2byte_uint32_8
(
encoderOutput
,
coderLength
,
encoderOutputByte
);
...
@@ -399,58 +278,54 @@ int main(int argc, char *argv[]) {
...
@@ -399,58 +278,54 @@ int main(int argc, char *argv[]) {
start_meas
(
&
timeDecoder
);
start_meas
(
&
timeDecoder
);
/*decoderState = polar_decoder(channelOutput,
if
(
decoder_int16
==
1
)
{
estimatedOutput,
decoderState
=
polar_decoder_int16
(
channelOutput_int16
,
(
uint64_t
*
)
estimatedOutput
,
currentPtr
);
currentPtr,
}
else
{
//0 --> PBCH, 1 --> DCI, -1 --> UCI
NR_POLAR_DECODER_LISTSIZE,
aPrioriArray,
NR_POLAR_DECODER_PATH_METRIC_APPROXIMATION);*/
if
(
decoder_int16
==
0
)
{
if
(
polarMessageType
==
0
)
if
(
polarMessageType
==
0
)
decoderState
=
polar_decoder_aPriori
(
channelOutput
,
decoderState
=
polar_decoder
(
channelOutput
,
estimatedOutput
,
estimatedOutput
,
currentPtr
,
currentPtr
,
NR_POLAR_DECODER_LISTSIZE
,
decoderListSize
,
NR_POLAR_DECODER_PATH_METRIC_APPROXIMATION
,
NR_POLAR_DECODER_PATH_METRIC_APPROXIMATION
);
aPrioriArray
);
else
if
(
polarMessageType
==
1
)
else
if
(
polarMessageType
==
1
)
decoderState
=
polar_decoder_dci
(
channelOutput
,
decoderState
=
polar_decoder_dci
(
channelOutput
,
estimatedOutput
,
estimatedOutput
,
currentPtr
,
currentPtr
,
NR_POLAR_DECODER_LISTSIZE
,
decoderListSize
,
NR_POLAR_DECODER_PATH_METRIC_APPROXIMATION
,
NR_POLAR_DECODER_PATH_METRIC_APPROXIMATION
,
0
);
rnti
);
}
}
else
decoderState
=
polar_decoder_int16
(
channelOutput_int16
,
(
uint64_t
*
)
estimatedOutput
,
currentPtr
);
stop_meas
(
&
timeDecoder
);
stop_meas
(
&
timeDecoder
);
/*printf("testInput: [0]->0x%08x\n", testInput[0]);
printf("estimatedOutput: [0]->0x%08x\n", estimatedOutput[0]);*/
#ifdef DEBUG_POLARTEST
printf
(
"estimatedOutput: [0]->0x%08x
\n
"
,
estimatedOutput
[
0
]);
#endif
//calculate errors
//calculate errors
if
(
decoderState
!=
0
)
{
if
(
decoderState
!=
0
)
{
blockErrorState
=-
1
;
blockErrorState
=-
1
;
nBitError
=-
1
;
nBitError
=-
1
;
}
else
{
}
else
{
for
(
int
j
=
0
;
j
<
currentPtr
->
payloadBits
;
j
++
)
{
for
(
int
i
=
0
;
i
<
(
testArrayLength
-
1
);
i
++
)
{
if
(((
estimatedOutput
[
0
]
>>
j
)
&
1
)
!=
((
testInput
[
0
]
>>
j
)
&
1
))
nBitError
++
;
for
(
int
j
=
0
;
j
<
32
;
j
++
)
{
if
(
((
estimatedOutput
[
i
]
>>
j
)
&
1
)
!=
((
testInput
[
i
]
>>
j
)
&
1
)
)
// printf("bit %d: %d => %d\n",j,(testInput[0]>>j)&1,(estimatedOutput[0]>>j)&1)
;
nBitError
++
;
}
}
if
(
nBitError
>
0
)
{
blockErrorState
=
1
;
// printf("Error: Input %x, Output %x\n",testInput[0],estimatedOutput[0]);
}
}
for
(
int
j
=
0
;
j
<
testLength
-
((
testArrayLength
-
1
)
*
32
);
j
++
)
if
(
((
estimatedOutput
[(
testArrayLength
-
1
)]
>>
j
)
&
1
)
!=
((
testInput
[(
testArrayLength
-
1
)]
>>
j
)
&
1
)
)
nBitError
++
;
}
}
if
(
nBitError
>
0
)
blockErrorState
=
1
;
#ifdef DEBUG_POLARTEST
for
(
int
i
=
0
;
i
<
testArrayLength
;
i
++
)
printf
(
"[polartest/decoderState=%d] testInput[%d]=0x%08x, estimatedOutput[%d]=0x%08x
\n
"
,
decoderState
,
i
,
testInput
[
i
],
i
,
estimatedOutput
[
i
]);
#endif
//Iteration times are in microseconds.
//Iteration times are in microseconds.
timeEncoderCumulative
+=
(
timeEncoder
.
diff
/
(
cpu_freq_GHz
*
1000
.
0
));
timeEncoderCumulative
+=
(
timeEncoder
.
diff
/
(
cpu_freq_GHz
*
1000
.
0
));
timeDecoderCumulative
+=
(
timeDecoder
.
diff
/
(
cpu_freq_GHz
*
1000
.
0
));
timeDecoderCumulative
+=
(
timeDecoder
.
diff
/
(
cpu_freq_GHz
*
1000
.
0
));
fprintf
(
logFile
,
",%f,%d,%d,%f,%f
\n
"
,
SNR
,
nBitError
,
blockErrorState
,
if
(
logFlag
)
fprintf
(
logFile
,
",%f,%d,%d,%f,%f
\n
"
,
SNR
,
nBitError
,
blockErrorState
,
(
timeEncoder
.
diff
/
(
cpu_freq_GHz
*
1000
.
0
)),
(
timeDecoder
.
diff
/
(
cpu_freq_GHz
*
1000
.
0
)));
(
timeEncoder
.
diff
/
(
cpu_freq_GHz
*
1000
.
0
)),
(
timeDecoder
.
diff
/
(
cpu_freq_GHz
*
1000
.
0
)));
if
(
nBitError
<
0
)
{
if
(
nBitError
<
0
)
{
blockErrorCumulative
++
;
blockErrorCumulative
++
;
...
@@ -463,6 +338,9 @@ int main(int argc, char *argv[]) {
...
@@ -463,6 +338,9 @@ int main(int argc, char *argv[]) {
decoderState
=
0
;
decoderState
=
0
;
nBitError
=
0
;
nBitError
=
0
;
blockErrorState
=
0
;
blockErrorState
=
0
;
memset
(
testInput
,
0
,
sizeof
(
uint32_t
)
*
testArrayLength
);
memset
(
encoderOutput
,
0
,
sizeof
(
uint32_t
)
*
coderArrayLength
);
memset
(
estimatedOutput
,
0
,
sizeof
(
uint32_t
)
*
testArrayLength
);
}
}
//Calculate error statistics for the SNR.
//Calculate error statistics for the SNR.
...
@@ -472,8 +350,7 @@ int main(int argc, char *argv[]) {
...
@@ -472,8 +350,7 @@ int main(int argc, char *argv[]) {
(
double
)
timeEncoder
.
diff
/
timeEncoder
.
trials
/
(
cpu_freq_GHz
*
1000
.
0
),(
double
)
timeDecoder
.
diff
/
timeDecoder
.
trials
/
(
cpu_freq_GHz
*
1000
.
0
));
(
double
)
timeEncoder
.
diff
/
timeEncoder
.
trials
/
(
cpu_freq_GHz
*
1000
.
0
),(
double
)
timeDecoder
.
diff
/
timeDecoder
.
trials
/
(
cpu_freq_GHz
*
1000
.
0
));
//(timeEncoderCumulative/iterations),timeDecoderCumulative/iterations);
//(timeEncoderCumulative/iterations),timeDecoderCumulative/iterations);
if
(
blockErrorCumulative
==
0
&&
bitErrorCumulative
==
0
)
if
(
blockErrorCumulative
==
0
&&
bitErrorCumulative
==
0
)
break
;
break
;
blockErrorCumulative
=
0
;
blockErrorCumulative
=
0
;
bitErrorCumulative
=
0
;
bitErrorCumulative
=
0
;
...
@@ -483,6 +360,6 @@ int main(int argc, char *argv[]) {
...
@@ -483,6 +360,6 @@ int main(int argc, char *argv[]) {
print_meas
(
&
timeEncoder
,
"polar_encoder"
,
NULL
,
NULL
);
print_meas
(
&
timeEncoder
,
"polar_encoder"
,
NULL
,
NULL
);
print_meas
(
&
timeDecoder
,
"polar_decoder"
,
NULL
,
NULL
);
print_meas
(
&
timeDecoder
,
"polar_decoder"
,
NULL
,
NULL
);
fclose
(
logFile
);
if
(
logFlag
)
fclose
(
logFile
);
return
(
0
);
return
(
0
);
}
}
openair1/PHY/CODING/TESTBENCH/smallblocktest.c
View file @
a0bcd41b
...
@@ -127,17 +127,13 @@ int main(int argc, char *argv[]) {
...
@@ -127,17 +127,13 @@ int main(int argc, char *argv[]) {
#ifdef DEBUG_SMALLBLOCKTEST
#ifdef DEBUG_SMALLBLOCKTEST
printf
(
"[smallblocktest] Input = 0x%x, Output = 0x%x, DecoderOutput = 0x%x
\n
"
,
testInput
,
encoderOutput
,
estimatedOutput
);
printf
(
"[smallblocktest] Input = 0x%x, Output = 0x%x, DecoderOutput = 0x%x
\n
"
,
testInput
,
encoderOutput
,
estimatedOutput
);
for
(
int
i
=
0
;
i
<
32
;
i
++
)
for
(
int
i
=
0
;
i
<
32
;
i
++
)
printf
(
"[smallblocktest] Input[%d] = %d, Output[%d] = %d,
Mask[%d] = %d
\n
"
,
i
,
(
testInput
>>
i
)
&
1
,
i
,
(
estimatedOutput
>>
i
)
&
1
,
i
,
(
mask
>>
i
)
&
1
);
printf
(
"[smallblocktest] Input[%d] = %d, Output[%d] = %d,
codingDifference[%d]=%d, Mask[%d] = %d
\n
"
,
i
,
(
testInput
>>
i
)
&
1
,
i
,
(
estimatedOutput
>>
i
)
&
1
,
i
,
(
codingDifference
>>
i
)
&
1
,
i
,
(
mask
>>
i
)
&
1
);
#endif
#endif
//Error Calculation
//Error Calculation
estimatedOutput
&=
mask
;
estimatedOutput
&=
mask
;
codingDifference
=
((
uint32_t
)
estimatedOutput
)
^
testInput
;
// Count the # of 1's in codingDifference by Brian Kernighan’s algorithm.
codingDifference
=
((
uint32_t
)
estimatedOutput
)
^
testInput
;
// Count the # of 1's in codingDifference by Brian Kernighan’s algorithm.
//for (int i=0;i<32;i++)
//printf("[smallblocktest] Input[%d] = %d, Output[%d] = %d, codingDifference[%d]=%d, Mask[%d] = %d, bitError = %d\n", i, (testInput>>i)&1, i, (estimatedOutput>>i)&1, i, (codingDifference>>i)&1, i, (mask>>i)&1, nBitError);
for
(
nBitError
=
0
;
codingDifference
;
nBitError
++
)
for
(
nBitError
=
0
;
codingDifference
;
nBitError
++
)
codingDifference
&=
codingDifference
-
1
;
codingDifference
&=
codingDifference
-
1
;
...
...
openair1/PHY/CODING/crc_byte.c
View file @
a0bcd41b
...
@@ -106,17 +106,6 @@ void crcTableInit (void)
...
@@ -106,17 +106,6 @@ void crcTableInit (void)
}
while
(
++
c
);
}
while
(
++
c
);
}
}
//Generic version
void
crcTable256Init
(
uint32_t
poly
,
uint32_t
*
crc256Table
)
{
unsigned
char
c
=
0
;
do
{
crc256Table
[
c
]
=
crcbit
(
&
c
,
1
,
poly
);
}
while
(
++
c
);
}
/*********************************************************
/*********************************************************
Byte by byte implementations,
Byte by byte implementations,
...
@@ -236,26 +225,6 @@ crc8 (unsigned char * inptr, int bitlen)
...
@@ -236,26 +225,6 @@ crc8 (unsigned char * inptr, int bitlen)
return
crc
;
return
crc
;
}
}
//Generic version
unsigned
int
crcPayload
(
unsigned
char
*
inptr
,
int
bitlen
,
uint32_t
*
crc256Table
)
{
int
octetlen
,
resbit
;
unsigned
int
crc
=
0
;
octetlen
=
bitlen
/
8
;
// Change in bytes
resbit
=
(
bitlen
%
8
);
while
(
octetlen
--
>
0
)
{
crc
=
(
crc
<<
8
)
^
crc256Table
[(
*
inptr
++
)
^
(
crc
>>
24
)];
}
if
(
resbit
>
0
)
{
crc
=
(
crc
<<
resbit
)
^
crc256Table
[((
*
inptr
)
>>
(
8
-
resbit
))
^
(
crc
>>
(
32
-
resbit
))];
}
return
crc
;
}
int
check_crc
(
uint8_t
*
decoded_bytes
,
uint32_t
n
,
uint32_t
F
,
uint8_t
crc_type
)
int
check_crc
(
uint8_t
*
decoded_bytes
,
uint32_t
n
,
uint32_t
F
,
uint8_t
crc_type
)
{
{
uint32_t
crc
=
0
,
oldcrc
=
0
;
uint32_t
crc
=
0
,
oldcrc
=
0
;
...
@@ -335,7 +304,7 @@ main()
...
@@ -335,7 +304,7 @@ main()
{
{
unsigned
char
test
[]
=
"Thebigredfox"
;
unsigned
char
test
[]
=
"Thebigredfox"
;
crcTableInit
();
crcTableInit
();
printf
(
"%x
\n
"
,
crcbit
(
test
,
sizeof
(
test
)
-
1
,
poly24
));
printf
(
"%x
\n
"
,
crcbit
(
test
,
sizeof
(
test
)
-
1
,
poly24
a
));
printf
(
"%x
\n
"
,
crc24
(
test
,
(
sizeof
(
test
)
-
1
)
*
8
));
printf
(
"%x
\n
"
,
crc24
(
test
,
(
sizeof
(
test
)
-
1
)
*
8
));
printf
(
"%x
\n
"
,
crcbit
(
test
,
sizeof
(
test
)
-
1
,
poly8
));
printf
(
"%x
\n
"
,
crcbit
(
test
,
sizeof
(
test
)
-
1
,
poly8
));
printf
(
"%x
\n
"
,
crc8
(
test
,
(
sizeof
(
test
)
-
1
)
*
8
));
printf
(
"%x
\n
"
,
crc8
(
test
,
(
sizeof
(
test
)
-
1
)
*
8
));
...
...
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/time_meas.c
deleted
100644 → 0
View file @
f8eff2f9
/*
* 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 <stdio.h>
#include "time_meas.h"
#include <math.h>
#include <unistd.h>
// global var for openair performance profiler
extern
int
opp_enabled
;
double
get_cpu_freq_GHz
(
void
)
{
time_stats_t
ts
=
{
0
};
reset_meas
(
&
ts
);
ts
.
trials
++
;
ts
.
in
=
rdtsc_oai
();
sleep
(
1
);
ts
.
diff
=
(
rdtsc_oai
()
-
ts
.
in
);
cpu_freq_GHz
=
(
double
)
ts
.
diff
/
1000000000
;
printf
(
"CPU Freq is %f
\n
"
,
cpu_freq_GHz
);
return
cpu_freq_GHz
;
}
void
print_meas_now
(
time_stats_t
*
ts
,
const
char
*
name
,
FILE
*
file_name
){
if
(
opp_enabled
)
{
//static double cpu_freq_GHz = 3.2;
//if (cpu_freq_GHz == 0.0)
//cpu_freq_GHz = get_cpu_freq_GHz(); // super slow
if
(
ts
->
trials
>
0
)
{
//fprintf(file_name,"Name %25s: Processing %15.3f ms for SF %d, diff_now %15.3f \n", name,(ts->diff_now/(cpu_freq_GHz*1000000.0)),subframe,ts->diff_now);
fprintf
(
file_name
,
"%15.3f ms, diff_now %15.3f
\n
"
,(
ts
->
diff_now
/
(
cpu_freq_GHz
*
1000000
.
0
)),(
double
)
ts
->
diff_now
);
}
}
}
void
print_meas
(
time_stats_t
*
ts
,
const
char
*
name
,
time_stats_t
*
total_exec_time
,
time_stats_t
*
sf_exec_time
)
{
if
(
opp_enabled
)
{
static
int
first_time
=
0
;
static
double
cpu_freq_GHz
=
0
.
0
;
if
(
cpu_freq_GHz
==
0
.
0
)
cpu_freq_GHz
=
get_cpu_freq_GHz
();
if
(
first_time
==
0
)
{
first_time
=
1
;
if
((
total_exec_time
==
NULL
)
||
(
sf_exec_time
==
NULL
))
fprintf
(
stderr
,
"%25s %25s %25s %25s %25s %6f
\n
"
,
"Name"
,
"Total"
,
"Per Trials"
,
"Num Trials"
,
"CPU_F_GHz"
,
cpu_freq_GHz
);
else
fprintf
(
stderr
,
"%25s %25s %25s %20s %15s %6f
\n
"
,
"Name"
,
"Total"
,
"Average/Frame"
,
"Trials"
,
"CPU_F_GHz"
,
cpu_freq_GHz
);
}
if
(
ts
->
trials
>
0
)
{
//printf("%20s: total: %10.3f ms, average: %10.3f us (%10d trials)\n", name, ts->diff/cpu_freq_GHz/1000000.0, ts->diff/ts->trials/cpu_freq_GHz/1000.0, ts->trials);
if
((
total_exec_time
==
NULL
)
||
(
sf_exec_time
==
NULL
))
{
fprintf
(
stderr
,
"%25s: %15.3f ms ; %15.3f us; %15d;
\n
"
,
name
,
(
ts
->
diff
/
cpu_freq_GHz
/
1000000
.
0
),
(
ts
->
diff
/
ts
->
trials
/
cpu_freq_GHz
/
1000
.
0
),
ts
->
trials
);
}
else
{
fprintf
(
stderr
,
"%25s: %15.3f ms (%5.2f%%); %15.3f us (%5.2f%%); %15d;
\n
"
,
name
,
(
ts
->
diff
/
cpu_freq_GHz
/
1000000
.
0
),
((
ts
->
diff
/
cpu_freq_GHz
/
1000000
.
0
)
/
(
total_exec_time
->
diff
/
cpu_freq_GHz
/
1000000
.
0
))
*
100
,
// percentage
(
ts
->
diff
/
ts
->
trials
/
cpu_freq_GHz
/
1000
.
0
),
((
ts
->
diff
/
ts
->
trials
/
cpu_freq_GHz
/
1000
.
0
)
/
(
sf_exec_time
->
diff
/
sf_exec_time
->
trials
/
cpu_freq_GHz
/
1000
.
0
))
*
100
,
// percentage
ts
->
trials
);
}
}
}
}
double
get_time_meas_us
(
time_stats_t
*
ts
)
{
static
double
cpu_freq_GHz
=
0
.
0
;
if
(
cpu_freq_GHz
==
0
.
0
)
cpu_freq_GHz
=
get_cpu_freq_GHz
();
if
(
ts
->
trials
>
0
)
return
(
ts
->
diff
/
ts
->
trials
/
cpu_freq_GHz
/
1000
.
0
);
return
0
;
}
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/time_meas.h
deleted
100644 → 0
View file @
f8eff2f9
/*
* 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
*/
#ifndef __TIME_MEAS_DEFS__H__
#define __TIME_MEAS_DEFS__H__
#include <unistd.h>
#include <math.h>
#include <stdint.h>
#include <time.h>
#include <errno.h>
#include <stdio.h>
#include <pthread.h>
#include <linux/kernel.h>
#include <linux/types.h>
// global var to enable openair performance profiler
static
int
opp_enabled
=
1
;
double
cpu_freq_GHz
;
#if defined(__x86_64__) || defined(__i386__)
typedef
struct
{
long
long
in
;
long
long
diff
;
long
long
diff_now
;
long
long
p_time
;
/*!< \brief absolute process duration */
long
long
diff_square
;
/*!< \brief process duration square */
long
long
max
;
int
trials
;
int
meas_flag
;
}
time_stats_t
;
#elif defined(__arm__)
typedef
struct
{
uint32_t
in
;
uint32_t
diff_now
;
uint32_t
diff
;
uint32_t
p_time
;
/*!< \brief absolute process duration */
uint32_t
diff_square
;
/*!< \brief process duration square */
uint32_t
max
;
int
trials
;
}
time_stats_t
;
#endif
static
inline
void
start_meas
(
time_stats_t
*
ts
)
__attribute__
((
always_inline
));
static
inline
void
stop_meas
(
time_stats_t
*
ts
)
__attribute__
((
always_inline
));
void
print_meas_now
(
time_stats_t
*
ts
,
const
char
*
name
,
FILE
*
file_name
);
//void print_meas(time_stats_t *ts, const char* name, time_stats_t * total_exec_time, time_stats_t * sf_exec_time);
double
get_time_meas_us
(
time_stats_t
*
ts
);
double
get_cpu_freq_GHz
(
void
);
#if defined(__i386__)
static
inline
unsigned
long
long
rdtsc_oai
(
void
)
__attribute__
((
always_inline
));
static
inline
unsigned
long
long
rdtsc_oai
(
void
)
{
unsigned
long
long
int
x
;
__asm__
volatile
(
".byte 0x0f, 0x31"
:
"=A"
(
x
));
return
x
;
}
#elif defined(__x86_64__)
static
inline
unsigned
long
long
rdtsc_oai
(
void
)
__attribute__
((
always_inline
));
static
inline
unsigned
long
long
rdtsc_oai
(
void
)
{
unsigned
long
long
a
,
d
;
__asm__
volatile
(
"rdtsc"
:
"=a"
(
a
),
"=d"
(
d
));
return
(
d
<<
32
)
|
a
;
}
#elif defined(__arm__)
static
inline
uint32_t
rdtsc_oai
(
void
)
__attribute__
((
always_inline
));
static
inline
uint32_t
rdtsc_oai
(
void
)
{
uint32_t
r
=
0
;
asm
volatile
(
"mrc p15, 0, %0, c9, c13, 0"
:
"=r"
(
r
)
);
return
r
;
}
#endif
static
inline
void
start_meas
(
time_stats_t
*
ts
)
{
if
(
opp_enabled
)
{
if
(
ts
->
meas_flag
==
0
)
{
ts
->
trials
++
;
ts
->
in
=
rdtsc_oai
();
ts
->
meas_flag
=
1
;
}
else
{
ts
->
in
=
rdtsc_oai
();
}
}
}
static
inline
void
stop_meas
(
time_stats_t
*
ts
)
{
if
(
opp_enabled
)
{
long
long
out
=
rdtsc_oai
();
ts
->
diff_now
=
(
out
-
ts
->
in
);
ts
->
diff_now
=
(
out
-
ts
->
in
);
ts
->
diff
+=
(
out
-
ts
->
in
);
/// process duration is the difference between two clock points
ts
->
p_time
=
(
out
-
ts
->
in
);
ts
->
diff_square
+=
(
out
-
ts
->
in
)
*
(
out
-
ts
->
in
);
if
((
out
-
ts
->
in
)
>
ts
->
max
)
ts
->
max
=
out
-
ts
->
in
;
ts
->
meas_flag
=
0
;
}
}
static
inline
void
reset_meas
(
time_stats_t
*
ts
)
{
ts
->
trials
=
0
;
ts
->
diff
=
0
;
ts
->
diff_now
=
0
;
ts
->
p_time
=
0
;
ts
->
diff_square
=
0
;
ts
->
max
=
0
;
ts
->
meas_flag
=
0
;
}
static
inline
void
copy_meas
(
time_stats_t
*
dst_ts
,
time_stats_t
*
src_ts
)
{
if
(
opp_enabled
)
{
dst_ts
->
trials
=
src_ts
->
trials
;
dst_ts
->
diff
=
src_ts
->
diff
;
dst_ts
->
max
=
src_ts
->
max
;
}
}
#endif
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
View file @
a0bcd41b
...
@@ -31,7 +31,7 @@
...
@@ -31,7 +31,7 @@
#ifndef __NR_LDPC_TYPES__H__
#ifndef __NR_LDPC_TYPES__H__
#define __NR_LDPC_TYPES__H__
#define __NR_LDPC_TYPES__H__
#include "
./nrLDPC_tools
/time_meas.h"
#include "
PHY/TOOLS
/time_meas.h"
// ==============================================================================
// ==============================================================================
// TYPES
// TYPES
...
...
openair1/PHY/CODING/nrPolar_tools/nr_bitwise_operations.c
View file @
a0bcd41b
...
@@ -19,6 +19,17 @@
...
@@ -19,6 +19,17 @@
* contact@openairinterface.org
* contact@openairinterface.org
*/
*/
/*!\file PHY/CODING/nrPolar_tools/nr_bitwise_operations.c
* \brief
* \author Turker Yilmaz
* \date 2018
* \version 0.1
* \company EURECOM
* \email turker.yilmaz@eurecom.fr
* \note
* \warning
*/
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
void
nr_bit2byte_uint32_8
(
uint32_t
*
in
,
uint16_t
arraySize
,
uint8_t
*
out
)
{
void
nr_bit2byte_uint32_8
(
uint32_t
*
in
,
uint16_t
arraySize
,
uint8_t
*
out
)
{
...
@@ -29,7 +40,8 @@ void nr_bit2byte_uint32_8(uint32_t *in, uint16_t arraySize, uint8_t *out) {
...
@@ -29,7 +40,8 @@ void nr_bit2byte_uint32_8(uint32_t *in, uint16_t arraySize, uint8_t *out) {
}
}
}
}
for
(
int
j
=
0
;
j
<
arraySize
-
((
arrayInd
-
1
)
*
32
);
j
++
)
out
[
j
+
((
arrayInd
-
1
)
*
32
)]
=
(
in
[(
arrayInd
-
1
)]
>>
j
)
&
1
;
for
(
int
j
=
0
;
j
<
arraySize
-
((
arrayInd
-
1
)
*
32
);
j
++
)
out
[
j
+
((
arrayInd
-
1
)
*
32
)]
=
(
in
[(
arrayInd
-
1
)]
>>
j
)
&
1
;
}
}
void
nr_byte2bit_uint8_32
(
uint8_t
*
in
,
uint16_t
arraySize
,
uint32_t
*
out
)
{
void
nr_byte2bit_uint8_32
(
uint8_t
*
in
,
uint16_t
arraySize
,
uint32_t
*
out
)
{
...
@@ -43,16 +55,3 @@ void nr_byte2bit_uint8_32(uint8_t *in, uint16_t arraySize, uint32_t *out) {
...
@@ -43,16 +55,3 @@ void nr_byte2bit_uint8_32(uint8_t *in, uint16_t arraySize, uint32_t *out) {
out
[
i
]
|=
in
[(
i
*
32
)];
out
[
i
]
|=
in
[(
i
*
32
)];
}
}
}
}
void
nr_crc_bit2bit_uint32_8
(
uint32_t
*
in
,
uint16_t
arraySize
,
uint8_t
*
out
)
{
out
[
0
]
=
0xff
;
out
[
1
]
=
0xff
;
out
[
2
]
=
0xff
;
uint8_t
arrayInd
=
ceil
(
arraySize
/
32
.
0
);
for
(
int
i
=
0
;
i
<
arrayInd
;
i
++
)
{
out
[
3
+
i
*
4
]
=
((
in
[
i
]
&
(
0x0000000f
))
<<
4
)
|
((
in
[
i
]
&
(
0x000000f0
))
>>
4
);
out
[
4
+
i
*
4
]
=
(((
in
[
i
]
&
(
0x00000f00
))
<<
4
)
|
((
in
[
i
]
&
(
0x0000f000
))
>>
4
))
>>
8
;
out
[
5
+
i
*
4
]
=
(((
in
[
i
]
&
(
0x000f0000
))
<<
4
)
|
((
in
[
i
]
&
(
0x00f00000
))
>>
4
))
>>
16
;
out
[
6
+
i
*
4
]
=
(((
in
[
i
]
&
(
0x0f000000
))
<<
4
)
|
((
in
[
i
]
&
(
0xf0000000
))
>>
4
))
>>
24
;
}
}
openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c
View file @
a0bcd41b
...
@@ -21,43 +21,36 @@
...
@@ -21,43 +21,36 @@
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
// ----- Old implementation ----
// ----- Old implementation ----
uint8_t
**
crc24c_generator_matrix
(
uint16_t
payloadSizeBits
){
uint8_t
**
crc24c_generator_matrix
(
uint16_t
payloadSizeBits
){
uint8_t
crcPolynomialPattern
[
25
]
=
{
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
1
};
uint8_t
crcPolynomialPattern
[
25
]
=
{
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
1
};
// 1011 0010 1011 0001 0001 0111 D^24 + D^23 + D^21 + D^20 + D^17 + D^15 + D^13 + D^12 + D^8 + D^4 + D^2 + D + 1
// 1011 0010 1011 0001 0001 0111 D^24 + D^23 + D^21 + D^20 + D^17 + D^15 + D^13 + D^12 + D^8 + D^4 + D^2 + D + 1
uint8_t
crcPolynomialSize
=
24
;
// 24 because crc24c
uint8_t
crcPolynomialSize
=
24
;
uint8_t
temp1
[
crcPolynomialSize
],
temp2
[
crcPolynomialSize
];
uint8_t
temp1
[
crcPolynomialSize
],
temp2
[
crcPolynomialSize
];
uint8_t
**
crc_generator_matrix
=
malloc
(
payloadSizeBits
*
sizeof
(
uint8_t
*
));
uint8_t
**
crc_generator_matrix
=
malloc
(
payloadSizeBits
*
sizeof
(
uint8_t
*
));
if
(
crc_generator_matrix
)
if
(
crc_generator_matrix
)
{
for
(
int
i
=
0
;
i
<
payloadSizeBits
;
i
++
)
for
(
int
i
=
0
;
i
<
payloadSizeBits
;
i
++
)
{
crc_generator_matrix
[
i
]
=
malloc
(
crcPolynomialSize
*
sizeof
(
uint8_t
));
crc_generator_matrix
[
i
]
=
malloc
(
crcPolynomialSize
*
sizeof
(
uint8_t
));
}
}
for
(
int
i
=
0
;
i
<
crcPolynomialSize
;
i
++
)
crc_generator_matrix
[
payloadSizeBits
-
1
][
i
]
=
crcPolynomialPattern
[
i
+
1
];
for
(
int
i
=
0
;
i
<
crcPolynomialSize
;
i
++
)
crc_generator_matrix
[
payloadSizeBits
-
1
][
i
]
=
crcPolynomialPattern
[
i
+
1
];
for
(
int
i
=
payloadSizeBits
-
2
;
i
>=
0
;
i
--
){
for
(
int
i
=
payloadSizeBits
-
2
;
i
>=
0
;
i
--
){
for
(
int
j
=
0
;
j
<
crcPolynomialSize
-
1
;
j
++
)
temp1
[
j
]
=
crc_generator_matrix
[
i
+
1
][
j
+
1
];
for
(
int
j
=
0
;
j
<
crcPolynomialSize
-
1
;
j
++
)
temp1
[
j
]
=
crc_generator_matrix
[
i
+
1
][
j
+
1
];
temp1
[
crcPolynomialSize
-
1
]
=
0
;
temp1
[
crcPolynomialSize
-
1
]
=
0
;
for
(
int
j
=
0
;
j
<
crcPolynomialSize
;
j
++
)
temp2
[
j
]
=
crc_generator_matrix
[
i
+
1
][
0
]
*
crcPolynomialPattern
[
j
+
1
];
for
(
int
j
=
0
;
j
<
crcPolynomialSize
;
j
++
)
temp2
[
j
]
=
crc_generator_matrix
[
i
+
1
][
0
]
*
crcPolynomialPattern
[
j
+
1
];
for
(
int
j
=
0
;
j
<
crcPolynomialSize
;
j
++
){
for
(
int
j
=
0
;
j
<
crcPolynomialSize
;
j
++
){
if
(
temp1
[
j
]
+
temp2
[
j
]
==
1
)
{
if
(
temp1
[
j
]
+
temp2
[
j
]
==
1
)
crc_generator_matrix
[
i
][
j
]
=
1
;
crc_generator_matrix
[
i
][
j
]
=
1
;
}
else
{
else
crc_generator_matrix
[
i
][
j
]
=
0
;
crc_generator_matrix
[
i
][
j
]
=
0
;
}
}
}
}
}
return
crc_generator_matrix
;
return
crc_generator_matrix
;
}
}
...
@@ -70,32 +63,28 @@ uint8_t **crc11_generator_matrix(uint16_t payloadSizeBits){
...
@@ -70,32 +63,28 @@ uint8_t **crc11_generator_matrix(uint16_t payloadSizeBits){
uint8_t
**
crc_generator_matrix
=
malloc
(
payloadSizeBits
*
sizeof
(
uint8_t
*
));
uint8_t
**
crc_generator_matrix
=
malloc
(
payloadSizeBits
*
sizeof
(
uint8_t
*
));
if
(
crc_generator_matrix
)
if
(
crc_generator_matrix
)
{
for
(
int
i
=
0
;
i
<
payloadSizeBits
;
i
++
)
for
(
int
i
=
0
;
i
<
payloadSizeBits
;
i
++
)
{
crc_generator_matrix
[
i
]
=
malloc
(
crcPolynomialSize
*
sizeof
(
uint8_t
));
crc_generator_matrix
[
i
]
=
malloc
(
crcPolynomialSize
*
sizeof
(
uint8_t
));
}
}
for
(
int
i
=
0
;
i
<
crcPolynomialSize
;
i
++
)
crc_generator_matrix
[
payloadSizeBits
-
1
][
i
]
=
crcPolynomialPattern
[
i
+
1
];
for
(
int
i
=
0
;
i
<
crcPolynomialSize
;
i
++
)
crc_generator_matrix
[
payloadSizeBits
-
1
][
i
]
=
crcPolynomialPattern
[
i
+
1
];
for
(
int
i
=
payloadSizeBits
-
2
;
i
>=
0
;
i
--
){
for
(
int
i
=
payloadSizeBits
-
2
;
i
>=
0
;
i
--
){
for
(
int
j
=
0
;
j
<
crcPolynomialSize
-
1
;
j
++
)
temp1
[
j
]
=
crc_generator_matrix
[
i
+
1
][
j
+
1
];
for
(
int
j
=
0
;
j
<
crcPolynomialSize
-
1
;
j
++
)
temp1
[
j
]
=
crc_generator_matrix
[
i
+
1
][
j
+
1
];
temp1
[
crcPolynomialSize
-
1
]
=
0
;
temp1
[
crcPolynomialSize
-
1
]
=
0
;
for
(
int
j
=
0
;
j
<
crcPolynomialSize
;
j
++
)
temp2
[
j
]
=
crc_generator_matrix
[
i
+
1
][
0
]
*
crcPolynomialPattern
[
j
+
1
];
for
(
int
j
=
0
;
j
<
crcPolynomialSize
;
j
++
)
temp2
[
j
]
=
crc_generator_matrix
[
i
+
1
][
0
]
*
crcPolynomialPattern
[
j
+
1
];
for
(
int
j
=
0
;
j
<
crcPolynomialSize
;
j
++
){
for
(
int
j
=
0
;
j
<
crcPolynomialSize
;
j
++
){
if
(
temp1
[
j
]
+
temp2
[
j
]
==
1
)
{
if
(
temp1
[
j
]
+
temp2
[
j
]
==
1
)
crc_generator_matrix
[
i
][
j
]
=
1
;
crc_generator_matrix
[
i
][
j
]
=
1
;
}
else
{
else
crc_generator_matrix
[
i
][
j
]
=
0
;
crc_generator_matrix
[
i
][
j
]
=
0
;
}
}
}
}
}
return
crc_generator_matrix
;
return
crc_generator_matrix
;
}
}
...
@@ -105,34 +94,31 @@ uint8_t **crc6_generator_matrix(uint16_t payloadSizeBits){
...
@@ -105,34 +94,31 @@ uint8_t **crc6_generator_matrix(uint16_t payloadSizeBits){
// 0110 0001 D^6 + D^5 + 1
// 0110 0001 D^6 + D^5 + 1
uint8_t
crcPolynomialSize
=
6
;
uint8_t
crcPolynomialSize
=
6
;
uint8_t
temp1
[
crcPolynomialSize
],
temp2
[
crcPolynomialSize
];
uint8_t
temp1
[
crcPolynomialSize
],
temp2
[
crcPolynomialSize
];
uint8_t
**
crc_generator_matrix
=
malloc
(
payloadSizeBits
*
sizeof
(
uint8_t
*
));
uint8_t
**
crc_generator_matrix
=
malloc
(
payloadSizeBits
*
sizeof
(
uint8_t
*
));
if
(
crc_generator_matrix
)
if
(
crc_generator_matrix
)
{
for
(
int
i
=
0
;
i
<
payloadSizeBits
;
i
++
)
for
(
int
i
=
0
;
i
<
payloadSizeBits
;
i
++
)
{
crc_generator_matrix
[
i
]
=
malloc
(
crcPolynomialSize
*
sizeof
(
uint8_t
));
crc_generator_matrix
[
i
]
=
malloc
(
crcPolynomialSize
*
sizeof
(
uint8_t
));
}
}
for
(
int
i
=
0
;
i
<
crcPolynomialSize
;
i
++
)
crc_generator_matrix
[
payloadSizeBits
-
1
][
i
]
=
crcPolynomialPattern
[
i
+
1
];
for
(
int
i
=
0
;
i
<
crcPolynomialSize
;
i
++
)
crc_generator_matrix
[
payloadSizeBits
-
1
][
i
]
=
crcPolynomialPattern
[
i
+
1
];
for
(
int
i
=
payloadSizeBits
-
2
;
i
>=
0
;
i
--
){
for
(
int
i
=
payloadSizeBits
-
2
;
i
>=
0
;
i
--
){
for
(
int
j
=
0
;
j
<
crcPolynomialSize
-
1
;
j
++
)
temp1
[
j
]
=
crc_generator_matrix
[
i
+
1
][
j
+
1
];
for
(
int
j
=
0
;
j
<
crcPolynomialSize
-
1
;
j
++
)
temp1
[
j
]
=
crc_generator_matrix
[
i
+
1
][
j
+
1
];
temp1
[
crcPolynomialSize
-
1
]
=
0
;
temp1
[
crcPolynomialSize
-
1
]
=
0
;
for
(
int
j
=
0
;
j
<
crcPolynomialSize
;
j
++
)
temp2
[
j
]
=
crc_generator_matrix
[
i
+
1
][
0
]
*
crcPolynomialPattern
[
j
+
1
];
for
(
int
j
=
0
;
j
<
crcPolynomialSize
;
j
++
)
temp2
[
j
]
=
crc_generator_matrix
[
i
+
1
][
0
]
*
crcPolynomialPattern
[
j
+
1
];
for
(
int
j
=
0
;
j
<
crcPolynomialSize
;
j
++
){
for
(
int
j
=
0
;
j
<
crcPolynomialSize
;
j
++
){
if
(
temp1
[
j
]
+
temp2
[
j
]
==
1
)
{
if
(
temp1
[
j
]
+
temp2
[
j
]
==
1
)
crc_generator_matrix
[
i
][
j
]
=
1
;
crc_generator_matrix
[
i
][
j
]
=
1
;
}
else
{
else
crc_generator_matrix
[
i
][
j
]
=
0
;
crc_generator_matrix
[
i
][
j
]
=
0
;
}
}
}
}
}
return
crc_generator_matrix
;
return
crc_generator_matrix
;
}
}
openair1/PHY/CODING/nrPolar_tools/nr_polar_decoder.c
View file @
a0bcd41b
...
@@ -21,11 +21,11 @@
...
@@ -21,11 +21,11 @@
/*!\file PHY/CODING/nrPolar_tools/nr_polar_decoder.c
/*!\file PHY/CODING/nrPolar_tools/nr_polar_decoder.c
* \brief
* \brief
* \author Turker Yilmaz
* \author
Raymond Knopp,
Turker Yilmaz
* \date 2018
* \date 2018
* \version 0.1
* \version 0.1
* \company EURECOM
* \company EURECOM
* \email turker.yilmaz@eurecom.fr
* \email
raymond.knopp@eurecom.fr,
turker.yilmaz@eurecom.fr
* \note
* \note
* \warning
* \warning
*/
*/
...
@@ -39,9 +39,8 @@
...
@@ -39,9 +39,8 @@
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
#include "assertions.h"
#include "assertions.h"
int8_t
polar_decoder
(
int8_t
polar_decoder
(
double
*
input
,
double
*
input
,
uint32_t
*
out
,
uint8_t
*
out
,
t_nrPolar_params
*
polarParams
,
t_nrPolar_params
*
polarParams
,
uint8_t
listSize
,
uint8_t
listSize
,
uint8_t
pathMetricAppr
)
{
uint8_t
pathMetricAppr
)
{
...
@@ -293,7 +292,7 @@ int8_t polar_decoder(
...
@@ -293,7 +292,7 @@ int8_t polar_decoder(
/*
/*
* Return bits.
* Return bits.
*/
*/
//nr_byte2bit_uint8_32_t
(polarParams->nr_polar_A, polarParams->payloadBits, out);
nr_byte2bit_uint8_32
(
polarParams
->
nr_polar_A
,
polarParams
->
payloadBits
,
out
);
return
(
0
);
return
(
0
);
}
}
...
@@ -572,282 +571,6 @@ int8_t polar_decoder_aPriori(double *input,
...
@@ -572,282 +571,6 @@ int8_t polar_decoder_aPriori(double *input,
}
}
int8_t
polar_decoder_aPriori_timing
(
double
*
input
,
uint32_t
*
out
,
t_nrPolar_params
*
polarParams
,
uint8_t
listSize
,
uint8_t
pathMetricAppr
,
double
*
aPrioriPayload
,
double
cpuFreqGHz
,
FILE
*
logFile
)
{
uint8_t
***
bit
=
nr_alloc_uint8_3D_array
(
polarParams
->
N
,
(
polarParams
->
n
+
1
),
2
*
listSize
);
uint8_t
**
bitUpdated
=
nr_alloc_uint8_2D_array
(
polarParams
->
N
,
(
polarParams
->
n
+
1
));
//0=False, 1=True
uint8_t
**
llrUpdated
=
nr_alloc_uint8_2D_array
(
polarParams
->
N
,
(
polarParams
->
n
+
1
));
//0=False, 1=True
double
***
llr
=
nr_alloc_double_3D_array
(
polarParams
->
N
,
(
polarParams
->
n
+
1
),
2
*
listSize
);
uint8_t
**
crcChecksum
=
nr_alloc_uint8_2D_array
(
polarParams
->
crcParityBits
,
2
*
listSize
);
double
*
pathMetric
=
malloc
(
sizeof
(
double
)
*
(
2
*
listSize
));
uint8_t
*
crcState
=
malloc
(
sizeof
(
uint8_t
)
*
(
2
*
listSize
));
//0=False, 1=True
for
(
int
i
=
0
;
i
<
(
2
*
listSize
);
i
++
)
{
pathMetric
[
i
]
=
0
;
crcState
[
i
]
=
1
;
}
for
(
int
i
=
0
;
i
<
polarParams
->
N
;
i
++
)
{
llrUpdated
[
i
][
polarParams
->
n
]
=
1
;
bitUpdated
[
i
][
0
]
=
((
polarParams
->
information_bit_pattern
[
i
]
+
1
)
%
2
);
}
uint8_t
**
extended_crc_generator_matrix
=
malloc
(
polarParams
->
K
*
sizeof
(
uint8_t
*
));
//G_P3
uint8_t
**
tempECGM
=
malloc
(
polarParams
->
K
*
sizeof
(
uint8_t
*
));
//G_P2
for
(
int
i
=
0
;
i
<
polarParams
->
K
;
i
++
)
{
extended_crc_generator_matrix
[
i
]
=
malloc
(
polarParams
->
crcParityBits
*
sizeof
(
uint8_t
));
tempECGM
[
i
]
=
malloc
(
polarParams
->
crcParityBits
*
sizeof
(
uint8_t
));
}
for
(
int
i
=
0
;
i
<
polarParams
->
payloadBits
;
i
++
)
{
for
(
int
j
=
0
;
j
<
polarParams
->
crcParityBits
;
j
++
)
{
tempECGM
[
i
][
j
]
=
polarParams
->
crc_generator_matrix
[
i
][
j
];
}
}
for
(
int
i
=
polarParams
->
payloadBits
;
i
<
polarParams
->
K
;
i
++
)
{
for
(
int
j
=
0
;
j
<
polarParams
->
crcParityBits
;
j
++
)
{
if
(
(
i
-
polarParams
->
payloadBits
)
==
j
)
{
tempECGM
[
i
][
j
]
=
1
;
}
else
{
tempECGM
[
i
][
j
]
=
0
;
}
}
}
for
(
int
i
=
0
;
i
<
polarParams
->
K
;
i
++
)
{
for
(
int
j
=
0
;
j
<
polarParams
->
crcParityBits
;
j
++
)
{
extended_crc_generator_matrix
[
i
][
j
]
=
tempECGM
[
polarParams
->
interleaving_pattern
[
i
]][
j
];
}
}
//The index of the last 1-valued bit that appears in each column.
uint16_t
last1ind
[
polarParams
->
crcParityBits
];
for
(
int
j
=
0
;
j
<
polarParams
->
crcParityBits
;
j
++
)
{
for
(
int
i
=
0
;
i
<
polarParams
->
K
;
i
++
)
{
if
(
extended_crc_generator_matrix
[
i
][
j
]
==
1
)
last1ind
[
j
]
=
i
;
}
}
double
*
d_tilde
=
malloc
(
sizeof
(
double
)
*
polarParams
->
N
);
nr_polar_rate_matching
(
input
,
d_tilde
,
polarParams
->
rate_matching_pattern
,
polarParams
->
K
,
polarParams
->
N
,
polarParams
->
encoderLength
);
for
(
int
j
=
0
;
j
<
polarParams
->
N
;
j
++
)
llr
[
j
][
polarParams
->
n
][
0
]
=
d_tilde
[
j
];
/*
* SCL polar decoder.
*/
uint32_t
nonFrozenBit
=
0
;
uint8_t
currentListSize
=
1
;
uint8_t
decoderIterationCheck
=
0
;
int16_t
checkCrcBits
=-
1
;
uint8_t
listIndex
[
2
*
listSize
],
copyIndex
;
for
(
uint16_t
currentBit
=
0
;
currentBit
<
polarParams
->
N
;
currentBit
++
)
{
updateLLR
(
llr
,
llrUpdated
,
bit
,
bitUpdated
,
currentListSize
,
currentBit
,
0
,
polarParams
->
N
,
(
polarParams
->
n
+
1
),
pathMetricAppr
);
if
(
polarParams
->
information_bit_pattern
[
currentBit
]
==
0
)
{
//Frozen bit.
updatePathMetric
(
pathMetric
,
llr
,
currentListSize
,
0
,
currentBit
,
pathMetricAppr
);
//approximation=0 --> 11b, approximation=1 --> 12
}
else
{
//Information or CRC bit.
if
(
(
polarParams
->
interleaving_pattern
[
nonFrozenBit
]
<=
polarParams
->
payloadBits
)
&&
(
aPrioriPayload
[
polarParams
->
interleaving_pattern
[
nonFrozenBit
]]
==
0
)
)
{
//Information bit with known value of "0".
updatePathMetric
(
pathMetric
,
llr
,
currentListSize
,
0
,
currentBit
,
pathMetricAppr
);
bitUpdated
[
currentBit
][
0
]
=
1
;
//0=False, 1=True
}
else
if
(
(
polarParams
->
interleaving_pattern
[
nonFrozenBit
]
<=
polarParams
->
payloadBits
)
&&
(
aPrioriPayload
[
polarParams
->
interleaving_pattern
[
nonFrozenBit
]]
==
1
)
)
{
//Information bit with known value of "1".
updatePathMetric
(
pathMetric
,
llr
,
currentListSize
,
1
,
currentBit
,
pathMetricAppr
);
for
(
uint8_t
i
=
0
;
i
<
currentListSize
;
i
++
)
bit
[
currentBit
][
0
][
i
]
=
1
;
bitUpdated
[
currentBit
][
0
]
=
1
;
updateCrcChecksum
(
crcChecksum
,
extended_crc_generator_matrix
,
currentListSize
,
nonFrozenBit
,
polarParams
->
crcParityBits
);
}
else
{
updatePathMetric2
(
pathMetric
,
llr
,
currentListSize
,
currentBit
,
pathMetricAppr
);
for
(
int
i
=
0
;
i
<
currentListSize
;
i
++
)
{
for
(
int
j
=
0
;
j
<
polarParams
->
N
;
j
++
)
{
for
(
int
k
=
0
;
k
<
(
polarParams
->
n
+
1
);
k
++
)
{
bit
[
j
][
k
][
i
+
currentListSize
]
=
bit
[
j
][
k
][
i
];
llr
[
j
][
k
][
i
+
currentListSize
]
=
llr
[
j
][
k
][
i
];
}
}
}
for
(
int
i
=
0
;
i
<
currentListSize
;
i
++
)
{
bit
[
currentBit
][
0
][
i
]
=
0
;
crcState
[
i
+
currentListSize
]
=
crcState
[
i
];
}
for
(
int
i
=
currentListSize
;
i
<
2
*
currentListSize
;
i
++
)
bit
[
currentBit
][
0
][
i
]
=
1
;
bitUpdated
[
currentBit
][
0
]
=
1
;
updateCrcChecksum2
(
crcChecksum
,
extended_crc_generator_matrix
,
currentListSize
,
nonFrozenBit
,
polarParams
->
crcParityBits
);
currentListSize
*=
2
;
//Keep only the best "listSize" number of entries.
if
(
currentListSize
>
listSize
)
{
for
(
uint8_t
i
=
0
;
i
<
2
*
listSize
;
i
++
)
listIndex
[
i
]
=
i
;
nr_sort_asc_double_1D_array_ind
(
pathMetric
,
listIndex
,
currentListSize
);
//sort listIndex[listSize, ..., 2*listSize-1] in descending order.
uint8_t
swaps
,
tempInd
;
for
(
uint8_t
i
=
0
;
i
<
listSize
;
i
++
)
{
swaps
=
0
;
for
(
uint8_t
j
=
listSize
;
j
<
(
2
*
listSize
-
i
)
-
1
;
j
++
)
{
if
(
listIndex
[
j
+
1
]
>
listIndex
[
j
])
{
tempInd
=
listIndex
[
j
];
listIndex
[
j
]
=
listIndex
[
j
+
1
];
listIndex
[
j
+
1
]
=
tempInd
;
swaps
++
;
}
}
if
(
swaps
==
0
)
break
;
}
//First, backup the best "listSize" number of entries.
for
(
int
k
=
(
listSize
-
1
);
k
>
0
;
k
--
)
{
for
(
int
i
=
0
;
i
<
polarParams
->
N
;
i
++
)
{
for
(
int
j
=
0
;
j
<
(
polarParams
->
n
+
1
);
j
++
)
{
bit
[
i
][
j
][
listIndex
[(
2
*
listSize
-
1
)
-
k
]]
=
bit
[
i
][
j
][
listIndex
[
k
]];
llr
[
i
][
j
][
listIndex
[(
2
*
listSize
-
1
)
-
k
]]
=
llr
[
i
][
j
][
listIndex
[
k
]];
}
}
}
for
(
int
k
=
(
listSize
-
1
);
k
>
0
;
k
--
)
{
for
(
int
i
=
0
;
i
<
polarParams
->
crcParityBits
;
i
++
)
{
crcChecksum
[
i
][
listIndex
[(
2
*
listSize
-
1
)
-
k
]]
=
crcChecksum
[
i
][
listIndex
[
k
]];
}
}
for
(
int
k
=
(
listSize
-
1
);
k
>
0
;
k
--
)
crcState
[
listIndex
[(
2
*
listSize
-
1
)
-
k
]]
=
crcState
[
listIndex
[
k
]];
//Copy the best "listSize" number of entries to the first indices.
for
(
int
k
=
0
;
k
<
listSize
;
k
++
)
{
if
(
k
>
listIndex
[
k
])
{
copyIndex
=
listIndex
[(
2
*
listSize
-
1
)
-
k
];
}
else
{
//Use the backup.
copyIndex
=
listIndex
[
k
];
}
for
(
int
i
=
0
;
i
<
polarParams
->
N
;
i
++
)
{
for
(
int
j
=
0
;
j
<
(
polarParams
->
n
+
1
);
j
++
)
{
bit
[
i
][
j
][
k
]
=
bit
[
i
][
j
][
copyIndex
];
llr
[
i
][
j
][
k
]
=
llr
[
i
][
j
][
copyIndex
];
}
}
}
for
(
int
k
=
0
;
k
<
listSize
;
k
++
)
{
if
(
k
>
listIndex
[
k
])
{
copyIndex
=
listIndex
[(
2
*
listSize
-
1
)
-
k
];
}
else
{
//Use the backup.
copyIndex
=
listIndex
[
k
];
}
for
(
int
i
=
0
;
i
<
polarParams
->
crcParityBits
;
i
++
)
{
crcChecksum
[
i
][
k
]
=
crcChecksum
[
i
][
copyIndex
];
}
}
for
(
int
k
=
0
;
k
<
listSize
;
k
++
)
{
if
(
k
>
listIndex
[
k
])
{
copyIndex
=
listIndex
[(
2
*
listSize
-
1
)
-
k
];
}
else
{
//Use the backup.
copyIndex
=
listIndex
[
k
];
}
crcState
[
k
]
=
crcState
[
copyIndex
];
}
currentListSize
=
listSize
;
}
}
for
(
int
i
=
0
;
i
<
polarParams
->
crcParityBits
;
i
++
)
{
if
(
last1ind
[
i
]
==
nonFrozenBit
)
{
checkCrcBits
=
i
;
break
;
}
}
if
(
checkCrcBits
>
(
-
1
)
)
{
for
(
uint8_t
i
=
0
;
i
<
currentListSize
;
i
++
)
{
if
(
crcChecksum
[
checkCrcBits
][
i
]
==
1
)
{
crcState
[
i
]
=
0
;
//0=False, 1=True
}
}
}
for
(
uint8_t
i
=
0
;
i
<
currentListSize
;
i
++
)
decoderIterationCheck
+=
crcState
[
i
];
if
(
decoderIterationCheck
==
0
)
{
//perror("[SCL polar decoder] All list entries have failed the CRC checks.");
free
(
d_tilde
);
free
(
pathMetric
);
free
(
crcState
);
nr_free_uint8_3D_array
(
bit
,
polarParams
->
N
,
(
polarParams
->
n
+
1
));
nr_free_double_3D_array
(
llr
,
polarParams
->
N
,
(
polarParams
->
n
+
1
));
nr_free_uint8_2D_array
(
crcChecksum
,
polarParams
->
crcParityBits
);
return
(
-
1
);
}
nonFrozenBit
++
;
decoderIterationCheck
=
0
;
checkCrcBits
=-
1
;
}
}
for
(
uint8_t
i
=
0
;
i
<
2
*
listSize
;
i
++
)
listIndex
[
i
]
=
i
;
nr_sort_asc_double_1D_array_ind
(
pathMetric
,
listIndex
,
currentListSize
);
for
(
uint8_t
i
=
0
;
i
<
fmin
(
listSize
,
(
pow
(
2
,
polarParams
->
crcCorrectionBits
))
);
i
++
)
{
if
(
crcState
[
listIndex
[
i
]]
==
1
)
{
for
(
int
j
=
0
;
j
<
polarParams
->
N
;
j
++
)
polarParams
->
nr_polar_U
[
j
]
=
bit
[
j
][
0
][
listIndex
[
i
]];
//Extract the information bits (û to ĉ)
nr_polar_info_bit_extraction
(
polarParams
->
nr_polar_U
,
polarParams
->
nr_polar_CPrime
,
polarParams
->
information_bit_pattern
,
polarParams
->
N
);
//Deinterleaving (ĉ to b)
nr_polar_deinterleaver
(
polarParams
->
nr_polar_CPrime
,
polarParams
->
nr_polar_B
,
polarParams
->
interleaving_pattern
,
polarParams
->
K
);
//Remove the CRC (â)
for
(
int
j
=
0
;
j
<
polarParams
->
payloadBits
;
j
++
)
polarParams
->
nr_polar_A
[
j
]
=
polarParams
->
nr_polar_B
[
j
];
break
;
}
}
free
(
d_tilde
);
free
(
pathMetric
);
free
(
crcState
);
nr_free_uint8_3D_array
(
bit
,
polarParams
->
N
,
(
polarParams
->
n
+
1
));
nr_free_double_3D_array
(
llr
,
polarParams
->
N
,
(
polarParams
->
n
+
1
));
nr_free_uint8_2D_array
(
crcChecksum
,
polarParams
->
crcParityBits
);
nr_free_uint8_2D_array
(
extended_crc_generator_matrix
,
polarParams
->
K
);
nr_free_uint8_2D_array
(
tempECGM
,
polarParams
->
K
);
/*
* Return bits.
*/
nr_byte2bit_uint8_32
(
polarParams
->
nr_polar_A
,
polarParams
->
payloadBits
,
out
);
return
(
0
);
}
int8_t
polar_decoder_dci
(
double
*
input
,
int8_t
polar_decoder_dci
(
double
*
input
,
uint32_t
*
out
,
uint32_t
*
out
,
t_nrPolar_params
*
polarParams
,
t_nrPolar_params
*
polarParams
,
...
...
openair1/PHY/CODING/nrPolar_tools/nr_polar_defs.h
View file @
a0bcd41b
...
@@ -21,11 +21,11 @@
...
@@ -21,11 +21,11 @@
/*!\file PHY/CODING/nrPolar_tools/nr_polar_defs.h
/*!\file PHY/CODING/nrPolar_tools/nr_polar_defs.h
* \brief
* \brief
* \author Turker Yilmaz
* \author
Raymond Knopp,
Turker Yilmaz
* \date 2018
* \date 2018
* \version 0.1
* \version 0.1
* \company EURECOM
* \company EURECOM
* \email turker.yilmaz@eurecom.fr
* \email
raymond.knopp@eurecom.fr,
turker.yilmaz@eurecom.fr
* \note
* \note
* \warning
* \warning
*/
*/
...
@@ -105,7 +105,7 @@ struct nrPolar_params {
...
@@ -105,7 +105,7 @@ struct nrPolar_params {
int16_t
*
Q_PC_N
;
int16_t
*
Q_PC_N
;
uint8_t
*
information_bit_pattern
;
uint8_t
*
information_bit_pattern
;
uint16_t
*
channel_interleaver_pattern
;
uint16_t
*
channel_interleaver_pattern
;
uint32_t
crc_polynomial
;
//
uint32_t crc_polynomial;
uint8_t
**
crc_generator_matrix
;
//G_P
uint8_t
**
crc_generator_matrix
;
//G_P
uint8_t
**
G_N
;
uint8_t
**
G_N
;
...
@@ -116,7 +116,6 @@ struct nrPolar_params {
...
@@ -116,7 +116,6 @@ struct nrPolar_params {
uint64_t
cprime_tab1
[
32
][
256
];
uint64_t
cprime_tab1
[
32
][
256
];
uint64_t
B_tab0
[
32
][
256
];
uint64_t
B_tab0
[
32
][
256
];
uint64_t
B_tab1
[
32
][
256
];
uint64_t
B_tab1
[
32
][
256
];
uint32_t
*
crc256Table
;
uint8_t
**
extended_crc_generator_matrix
;
uint8_t
**
extended_crc_generator_matrix
;
//lowercase: bits, Uppercase: Bits stored in bytes
//lowercase: bits, Uppercase: Bits stored in bytes
//polar_encoder vectors
//polar_encoder vectors
...
@@ -151,7 +150,7 @@ void polar_encoder_fast(uint64_t *A,
...
@@ -151,7 +150,7 @@ void polar_encoder_fast(uint64_t *A,
t_nrPolar_params
*
polarParams
);
t_nrPolar_params
*
polarParams
);
int8_t
polar_decoder
(
double
*
input
,
int8_t
polar_decoder
(
double
*
input
,
uint8
_t
*
output
,
uint32
_t
*
output
,
t_nrPolar_params
*
polarParams
,
t_nrPolar_params
*
polarParams
,
uint8_t
listSize
,
uint8_t
listSize
,
uint8_t
pathMetricAppr
);
uint8_t
pathMetricAppr
);
...
@@ -167,15 +166,6 @@ int8_t polar_decoder_aPriori(double *input,
...
@@ -167,15 +166,6 @@ int8_t polar_decoder_aPriori(double *input,
uint8_t
pathMetricAppr
,
uint8_t
pathMetricAppr
,
double
*
aPrioriPayload
);
double
*
aPrioriPayload
);
int8_t
polar_decoder_aPriori_timing
(
double
*
input
,
uint32_t
*
output
,
t_nrPolar_params
*
polarParams
,
uint8_t
listSize
,
uint8_t
pathMetricAppr
,
double
*
aPrioriPayload
,
double
cpuFreqGHz
,
FILE
*
logFile
);
int8_t
polar_decoder_dci
(
double
*
input
,
int8_t
polar_decoder_dci
(
double
*
input
,
uint32_t
*
out
,
uint32_t
*
out
,
t_nrPolar_params
*
polarParams
,
t_nrPolar_params
*
polarParams
,
...
@@ -192,7 +182,7 @@ void init_polar_deinterleaver_table(t_nrPolar_params *polarParams);
...
@@ -192,7 +182,7 @@ void init_polar_deinterleaver_table(t_nrPolar_params *polarParams);
void
nr_polar_print_polarParams
(
t_nrPolar_params
*
polarParams
);
void
nr_polar_print_polarParams
(
t_nrPolar_params
*
polarParams
);
t_nrPolar_params
*
nr_polar_params
(
int8_t
messageType
,
t_nrPolar_params
*
nr_polar_params
(
int8_t
messageType
,
uint16_t
messageLength
,
uint16_t
messageLength
,
uint8_t
aggregation_level
);
uint8_t
aggregation_level
);
...
@@ -263,9 +253,11 @@ void nr_byte2bit_uint8_32(uint8_t *in,
...
@@ -263,9 +253,11 @@ void nr_byte2bit_uint8_32(uint8_t *in,
uint16_t
arraySize
,
uint16_t
arraySize
,
uint32_t
*
out
);
uint32_t
*
out
);
void
nr_crc_bit2bit_uint32_8
(
uint32_t
*
in
,
uint8_t
**
crc24c_generator_matrix
(
uint16_t
payloadSizeBits
);
uint16_t
arraySize
,
uint8_t
*
out
);
uint8_t
**
crc11_generator_matrix
(
uint16_t
payloadSizeBits
);
uint8_t
**
crc6_generator_matrix
(
uint16_t
payloadSizeBits
);
void
nr_polar_bit_insertion
(
uint8_t
*
input
,
void
nr_polar_bit_insertion
(
uint8_t
*
input
,
uint8_t
*
output
,
uint8_t
*
output
,
...
@@ -370,12 +362,6 @@ void updateCrcChecksum2(uint8_t **crcChecksum,
...
@@ -370,12 +362,6 @@ void updateCrcChecksum2(uint8_t **crcChecksum,
uint32_t
i2
,
uint32_t
i2
,
uint8_t
len
);
uint8_t
len
);
uint8_t
**
crc24c_generator_matrix
(
uint16_t
payloadSizeBits
);
uint8_t
**
crc11_generator_matrix
(
uint16_t
payloadSizeBits
);
uint8_t
**
crc6_generator_matrix
(
uint16_t
payloadSizeBits
);
//Also nr_polar_rate_matcher
//Also nr_polar_rate_matcher
static
inline
void
nr_polar_interleaver
(
uint8_t
*
input
,
static
inline
void
nr_polar_interleaver
(
uint8_t
*
input
,
uint8_t
*
output
,
uint8_t
*
output
,
...
@@ -388,9 +374,7 @@ static inline void nr_polar_deinterleaver(uint8_t *input,
...
@@ -388,9 +374,7 @@ static inline void nr_polar_deinterleaver(uint8_t *input,
uint8_t
*
output
,
uint8_t
*
output
,
uint16_t
*
pattern
,
uint16_t
*
pattern
,
uint16_t
size
)
{
uint16_t
size
)
{
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
for
(
int
i
=
0
;
i
<
size
;
i
++
)
output
[
pattern
[
i
]]
=
input
[
i
];
output
[
pattern
[
i
]]
=
input
[
i
];
}
}
}
#endif
#endif
openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c
View file @
a0bcd41b
...
@@ -32,7 +32,6 @@
...
@@ -32,7 +32,6 @@
//#define DEBUG_POLAR_ENCODER
//#define DEBUG_POLAR_ENCODER
//#define DEBUG_POLAR_ENCODER_DCI
//#define DEBUG_POLAR_ENCODER_DCI
//#define DEBUG_POLAR_ENCODER_TIMING
//#define DEBUG_POLAR_MATLAB
//#define DEBUG_POLAR_MATLAB
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
...
@@ -51,7 +50,7 @@ void polar_encoder(uint32_t *in,
...
@@ -51,7 +50,7 @@ void polar_encoder(uint32_t *in,
printf("polar_B %llx (crc %x)\n",B,crc24c((uint8_t*)in,polarParams->payloadBits)>>8);
printf("polar_B %llx (crc %x)\n",B,crc24c((uint8_t*)in,polarParams->payloadBits)>>8);
#endif
#endif
nr_bit2byte_uint32_8_t((uint32_t*)&B, polarParams->K, polarParams->nr_polar_B);*/
nr_bit2byte_uint32_8_t((uint32_t*)&B, polarParams->K, polarParams->nr_polar_B);*/
nr_bit2byte_uint32_8
(
(
uint32_t
*
)
in
,
polarParams
->
payloadBits
,
polarParams
->
nr_polar_A
);
nr_bit2byte_uint32_8
(
in
,
polarParams
->
payloadBits
,
polarParams
->
nr_polar_A
);
/*
/*
* Bytewise operations
* Bytewise operations
*/
*/
...
@@ -78,6 +77,8 @@ void polar_encoder(uint32_t *in,
...
@@ -78,6 +77,8 @@ void polar_encoder(uint32_t *in,
for
(
int
i
=
0
;
i
<
polarParams
->
K
;
i
++
)
B2
=
B2
|
((
uint64_t
)
polarParams
->
nr_polar_B
[
i
]
<<
i
);
for
(
int
i
=
0
;
i
<
polarParams
->
K
;
i
++
)
B2
=
B2
|
((
uint64_t
)
polarParams
->
nr_polar_B
[
i
]
<<
i
);
printf
(
"polar_B %llx
\n
"
,
B2
);
printf
(
"polar_B %llx
\n
"
,
B2
);
for
(
int
i
=
0
;
i
<
polarParams
->
payloadBits
;
i
++
)
printf
(
"a[%d]=%d
\n
"
,
i
,
polarParams
->
nr_polar_A
[
i
]);
for
(
int
i
=
0
;
i
<
polarParams
->
K
;
i
++
)
printf
(
"b[%d]=%d
\n
"
,
i
,
polarParams
->
nr_polar_B
[
i
]);
#endif
#endif
/* for (int j=0;j<polarParams->crcParityBits;j++) {
/* for (int j=0;j<polarParams->crcParityBits;j++) {
for (int i=0;i<polarParams->payloadBits;i++)
for (int i=0;i<polarParams->payloadBits;i++)
...
@@ -169,19 +170,15 @@ void polar_encoder_dci(uint32_t *in,
...
@@ -169,19 +170,15 @@ void polar_encoder_dci(uint32_t *in,
#ifdef DEBUG_POLAR_ENCODER_DCI
#ifdef DEBUG_POLAR_ENCODER_DCI
printf
(
"[polar_encoder_dci] A: "
);
printf
(
"[polar_encoder_dci] A: "
);
for
(
int
i
=
0
;
i
<
polarParams
->
payloadBits
;
i
++
)
printf
(
"%d-"
,
polarParams
->
nr_polar_A
[
i
]);
for
(
int
i
=
0
;
i
<
polarParams
->
payloadBits
;
i
++
)
printf
(
"%d-"
,
polarParams
->
nr_polar_A
[
i
]);
printf
(
"
\n
"
);
printf
(
"
\n
"
);
printf
(
"[polar_encoder_dci] APrime: "
);
printf
(
"[polar_encoder_dci] APrime: "
);
for
(
int
i
=
0
;
i
<
polarParams
->
K
;
i
++
)
printf
(
"%d-"
,
polarParams
->
nr_polar_APrime
[
i
]);
for
(
int
i
=
0
;
i
<
polarParams
->
K
;
i
++
)
printf
(
"%d-"
,
polarParams
->
nr_polar_APrime
[
i
]);
printf
(
"
\n
"
);
printf
(
"
\n
"
);
printf
(
"[polar_encoder_dci] GP: "
);
printf
(
"[polar_encoder_dci] GP: "
);
for
(
int
i
=
0
;
i
<
polarParams
->
crcParityBits
;
i
++
)
printf
(
"%d-"
,
polarParams
->
crc_generator_matrix
[
0
][
i
]);
for
(
int
i
=
0
;
i
<
polarParams
->
crcParityBits
;
i
++
)
printf
(
"%d-"
,
polarParams
->
crc_generator_matrix
[
0
][
i
]);
printf
(
"
\n
"
);
printf
(
"
\n
"
);
#endif
#endif
//Calculate CRC.
//Calculate CRC.
...
@@ -195,9 +192,7 @@ void polar_encoder_dci(uint32_t *in,
...
@@ -195,9 +192,7 @@ void polar_encoder_dci(uint32_t *in,
#ifdef DEBUG_POLAR_ENCODER_DCI
#ifdef DEBUG_POLAR_ENCODER_DCI
printf
(
"[polar_encoder_dci] CRC: "
);
printf
(
"[polar_encoder_dci] CRC: "
);
for
(
int
i
=
0
;
i
<
polarParams
->
crcParityBits
;
i
++
)
printf
(
"%d-"
,
polarParams
->
nr_polar_crc
[
i
]);
for
(
int
i
=
0
;
i
<
polarParams
->
crcParityBits
;
i
++
)
printf
(
"%d-"
,
polarParams
->
nr_polar_crc
[
i
]);
printf
(
"
\n
"
);
printf
(
"
\n
"
);
#endif
#endif
...
@@ -209,55 +204,16 @@ void polar_encoder_dci(uint32_t *in,
...
@@ -209,55 +204,16 @@ void polar_encoder_dci(uint32_t *in,
polarParams
->
nr_polar_B
[
i
]
=
polarParams
->
nr_polar_crc
[
i
-
(
polarParams
->
payloadBits
)];
polarParams
->
nr_polar_B
[
i
]
=
polarParams
->
nr_polar_crc
[
i
-
(
polarParams
->
payloadBits
)];
//Scrambling (b to c)
//Scrambling (b to c)
for
(
int
i
=
0
;
i
<
16
;
i
++
)
{
for
(
int
i
=
0
;
i
<
16
;
i
++
)
polarParams
->
nr_polar_B
[
polarParams
->
payloadBits
+
8
+
i
]
=
polarParams
->
nr_polar_B
[
polarParams
->
payloadBits
+
8
+
i
]
=
(
polarParams
->
nr_polar_B
[
polarParams
->
payloadBits
+
8
+
i
]
+
((
n_RNTI
>>
(
15
-
i
))
&
1
)
)
%
2
;
(
polarParams
->
nr_polar_B
[
polarParams
->
payloadBits
+
8
+
i
]
+
((
n_RNTI
>>
(
15
-
i
))
&
1
)
)
%
2
;
}
/* //(a to a')
nr_crc_bit2bit_uint32_8_t(in, polarParams->payloadBits, polarParams->nr_polar_aPrime);
//Parity bits computation (p)
polarParams->crcBit = crc24c(polarParams->nr_polar_aPrime, (polarParams->payloadBits+polarParams->crcParityBits));
#ifdef DEBUG_POLAR_ENCODER_DCI
printf("[polar_encoder_dci] crc: 0x%08x\n", polarParams->crcBit);
for (int i=0; i<32; i++)
{
printf("%d\n",((polarParams->crcBit)>>i)&1);
}
#endif
//(a to b)
//
// Bytewise operations
//
uint8_t arrayInd = ceil(polarParams->payloadBits / 8.0);
for (int i=0; i<arrayInd-1; i++){
for (int j=0; j<8; j++) {
polarParams->nr_polar_B[j+(i*8)] = ((polarParams->nr_polar_aPrime[3+i]>>(7-j)) & 1);
}
}
for (int i=0; i<((polarParams->payloadBits)%8); i++) {
polarParams->nr_polar_B[i+(arrayInd-1)*8] = ((polarParams->nr_polar_aPrime[3+(arrayInd-1)]>>(7-i)) & 1);
}
for (int i=0; i<8; i++) {
polarParams->nr_polar_B[polarParams->payloadBits+i] = ((polarParams->crcBit)>>(31-i))&1;
}
//Scrambling (b to c)
for (int i=0; i<16; i++) {
polarParams->nr_polar_B[polarParams->payloadBits+8+i] =
( (((polarParams->crcBit)>>(23-i))&1) + ((n_RNTI>>(15-i))&1) ) % 2;
}*/
#ifdef DEBUG_POLAR_ENCODER_DCI
#ifdef DEBUG_POLAR_ENCODER_DCI
printf
(
"[polar_encoder_dci] B: "
);
printf
(
"[polar_encoder_dci] B: "
);
for
(
int
i
=
0
;
i
<
polarParams
->
K
;
i
++
)
printf
(
"%d-"
,
polarParams
->
nr_polar_B
[
i
]);
for
(
int
i
=
0
;
i
<
polarParams
->
K
;
i
++
)
printf
(
"%d-"
,
polarParams
->
nr_polar_B
[
i
]);
printf
(
"
\n
"
);
printf
(
"
\n
"
);
#endif
#endif
//Interleaving (c to c')
//Interleaving (c to c')
nr_polar_interleaver
(
polarParams
->
nr_polar_B
,
nr_polar_interleaver
(
polarParams
->
nr_polar_B
,
polarParams
->
nr_polar_CPrime
,
polarParams
->
interleaving_pattern
,
polarParams
->
K
);
polarParams
->
nr_polar_CPrime
,
polarParams
->
interleaving_pattern
,
polarParams
->
K
);
//Bit insertion (c' to u)
//Bit insertion (c' to u)
nr_polar_bit_insertion
(
polarParams
->
nr_polar_CPrime
,
nr_polar_bit_insertion
(
polarParams
->
nr_polar_CPrime
,
polarParams
->
nr_polar_U
,
polarParams
->
nr_polar_U
,
...
@@ -272,9 +228,7 @@ void polar_encoder_dci(uint32_t *in,
...
@@ -272,9 +228,7 @@ void polar_encoder_dci(uint32_t *in,
polarParams
->
nr_polar_D
,
polarParams
->
nr_polar_D
,
polarParams
->
N
,
polarParams
->
N
,
polarParams
->
N
);
polarParams
->
N
);
for
(
uint16_t
i
=
0
;
i
<
polarParams
->
N
;
i
++
)
polarParams
->
nr_polar_D
[
i
]
=
(
polarParams
->
nr_polar_D
[
i
]
%
2
);
for
(
uint16_t
i
=
0
;
i
<
polarParams
->
N
;
i
++
)
polarParams
->
nr_polar_D
[
i
]
=
(
polarParams
->
nr_polar_D
[
i
]
%
2
);
//Rate matching
//Rate matching
//Sub-block interleaving (d to y) and Bit selection (y to e)
//Sub-block interleaving (d to y) and Bit selection (y to e)
...
@@ -288,16 +242,11 @@ void polar_encoder_dci(uint32_t *in,
...
@@ -288,16 +242,11 @@ void polar_encoder_dci(uint32_t *in,
nr_byte2bit_uint8_32
(
polarParams
->
nr_polar_E
,
polarParams
->
encoderLength
,
out
);
nr_byte2bit_uint8_32
(
polarParams
->
nr_polar_E
,
polarParams
->
encoderLength
,
out
);
#ifdef DEBUG_POLAR_ENCODER_DCI
#ifdef DEBUG_POLAR_ENCODER_DCI
printf
(
"[polar_encoder_dci] E: "
);
printf
(
"[polar_encoder_dci] E: "
);
for
(
int
i
=
0
;
i
<
polarParams
->
encoderLength
;
i
++
)
printf
(
"%d-"
,
polarParams
->
nr_polar_E
[
i
]);
for
(
int
i
=
0
;
i
<
polarParams
->
encoderLength
;
i
++
)
printf
(
"%d-"
,
polarParams
->
nr_polar_E
[
i
]);
uint8_t
outputInd
=
ceil
(
polarParams
->
encoderLength
/
32
.
0
);
uint8_t
outputInd
=
ceil
(
polarParams
->
encoderLength
/
32
.
0
);
printf
(
"
\n
[polar_encoder_dci] out: "
);
printf
(
"
\n
[polar_encoder_dci] out: "
);
for
(
int
i
=
0
;
i
<
outputInd
;
i
++
)
printf
(
"[%d]->0x%08x
\t
"
,
i
,
out
[
i
]);
for
(
int
i
=
0
;
i
<
outputInd
;
i
++
)
{
printf
(
"[%d]->0x%08x
\t
"
,
i
,
out
[
i
]);
}
#endif
#endif
}
}
...
...
openair1/PHY/CODING/nrSmallBlock/decodeSmallBlock.c
View file @
a0bcd41b
...
@@ -48,7 +48,7 @@ uint16_t decodeSmallBlock(int8_t *in, uint8_t len){
...
@@ -48,7 +48,7 @@ uint16_t decodeSmallBlock(int8_t *in, uint8_t len){
int16_t
Rhat
[
NR_SMALL_BLOCK_CODED_BITS
]
=
{
0
},
Rhatabs
[
NR_SMALL_BLOCK_CODED_BITS
]
=
{
0
};
int16_t
Rhat
[
NR_SMALL_BLOCK_CODED_BITS
]
=
{
0
},
Rhatabs
[
NR_SMALL_BLOCK_CODED_BITS
]
=
{
0
};
uint16_t
maxVal
;
uint16_t
maxVal
;
uint8_t
maxInd
=
0
;
uint8_t
maxInd
=
0
;
in
t
jmax
=
(
1
<<
(
len
-
1
));
uint8_
t
jmax
=
(
1
<<
(
len
-
1
));
for
(
int
j
=
0
;
j
<
jmax
;
++
j
)
for
(
int
j
=
0
;
j
<
jmax
;
++
j
)
for
(
int
k
=
0
;
k
<
NR_SMALL_BLOCK_CODED_BITS
;
++
k
)
for
(
int
k
=
0
;
k
<
NR_SMALL_BLOCK_CODED_BITS
;
++
k
)
Rhat
[
j
]
+=
in
[
k
]
*
hadamard32InterleavedTransposed
[
j
][
k
];
Rhat
[
j
]
+=
in
[
k
]
*
hadamard32InterleavedTransposed
[
j
][
k
];
...
...
openair1/PHY/CODING/nr_polar_init.c
View file @
a0bcd41b
...
@@ -21,19 +21,16 @@
...
@@ -21,19 +21,16 @@
/*!\file PHY/CODING/nr_polar_init.h
/*!\file PHY/CODING/nr_polar_init.h
* \brief
* \brief
* \author Turker Yilmaz
* \author Turker Yilmaz
, Raymond Knopp
* \date 2018
* \date 2018
* \version 0.1
* \version 0.1
* \company EURECOM
* \company EURECOM
* \email turker.yilmaz@eurecom.fr
* \email turker.yilmaz@eurecom.fr
, raymond.knopp@eurecom.fr
* \note
* \note
* \warning
* \warning
*/
*/
#include "nrPolar_tools/nr_polar_defs.h"
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
#include "PHY/CODING/nrPolar_tools/nr_polar_dci_defs.h"
#include "PHY/CODING/nrPolar_tools/nr_polar_uci_defs.h"
#include "PHY/CODING/nrPolar_tools/nr_polar_pbch_defs.h"
#include "PHY/NR_TRANSPORT/nr_dci.h"
#include "PHY/NR_TRANSPORT/nr_dci.h"
static
int
intcmp
(
const
void
*
p1
,
const
void
*
p2
)
{
static
int
intcmp
(
const
void
*
p1
,
const
void
*
p2
)
{
...
@@ -95,7 +92,9 @@ static void nr_polar_init(t_nrPolar_params * *polarParams,
...
@@ -95,7 +92,9 @@ static void nr_polar_init(t_nrPolar_params * *polarParams,
}
}
newPolarInitNode
->
K
=
newPolarInitNode
->
payloadBits
+
newPolarInitNode
->
crcParityBits
;
// Number of bits to encode.
newPolarInitNode
->
K
=
newPolarInitNode
->
payloadBits
+
newPolarInitNode
->
crcParityBits
;
// Number of bits to encode.
newPolarInitNode
->
N
=
nr_polar_output_length
(
newPolarInitNode
->
K
,
newPolarInitNode
->
encoderLength
,
newPolarInitNode
->
n_max
);
newPolarInitNode
->
N
=
nr_polar_output_length
(
newPolarInitNode
->
K
,
newPolarInitNode
->
encoderLength
,
newPolarInitNode
->
n_max
);
newPolarInitNode
->
n
=
log2
(
newPolarInitNode
->
N
);
newPolarInitNode
->
n
=
log2
(
newPolarInitNode
->
N
);
newPolarInitNode
->
G_N
=
nr_polar_kronecker_power_matrices
(
newPolarInitNode
->
n
);
newPolarInitNode
->
G_N
=
nr_polar_kronecker_power_matrices
(
newPolarInitNode
->
n
);
//polar_encoder vectors:
//polar_encoder vectors:
...
@@ -182,7 +181,7 @@ void nr_polar_print_polarParams(t_nrPolar_params *polarParams) {
...
@@ -182,7 +181,7 @@ void nr_polar_print_polarParams(t_nrPolar_params *polarParams) {
return
;
return
;
}
}
t_nrPolar_params
*
nr_polar_params
(
int8_t
messageType
,
t_nrPolar_params
*
nr_polar_params
(
int8_t
messageType
,
uint16_t
messageLength
,
uint16_t
messageLength
,
uint8_t
aggregation_level
)
{
uint8_t
aggregation_level
)
{
static
t_nrPolar_params
*
polarList
=
NULL
;
static
t_nrPolar_params
*
polarList
=
NULL
;
...
...
openair1/PHY/NR_TRANSPORT/nr_dci.h
View file @
a0bcd41b
...
@@ -25,8 +25,6 @@
...
@@ -25,8 +25,6 @@
#include "PHY/defs_gNB.h"
#include "PHY/defs_gNB.h"
#include "PHY/NR_REFSIG/nr_refsig.h"
#include "PHY/NR_REFSIG/nr_refsig.h"
typedef
unsigned
__int128
uint128_t
;
uint16_t
nr_get_dci_size
(
nfapi_nr_dci_format_e
format
,
uint16_t
nr_get_dci_size
(
nfapi_nr_dci_format_e
format
,
nfapi_nr_rnti_type_e
rnti_type
,
nfapi_nr_rnti_type_e
rnti_type
,
uint16_t
N_RB
,
uint16_t
N_RB
,
...
...
openair1/PHY/NR_TRANSPORT/nr_dlsch.h
View file @
a0bcd41b
...
@@ -96,6 +96,8 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t *dlsch);
...
@@ -96,6 +96,8 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t *dlsch);
void
clean_gNB_dlsch
(
NR_gNB_DLSCH_t
*
dlsch
);
void
clean_gNB_dlsch
(
NR_gNB_DLSCH_t
*
dlsch
);
void
clean_gNB_ulsch
(
NR_gNB_ULSCH_t
*
ulsch
);
int
nr_dlsch_encoding
(
unsigned
char
*
a
,
int
nr_dlsch_encoding
(
unsigned
char
*
a
,
uint8_t
subframe
,
uint8_t
subframe
,
NR_gNB_DLSCH_t
*
dlsch
,
NR_gNB_DLSCH_t
*
dlsch
,
...
...
openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
View file @
a0bcd41b
...
@@ -171,6 +171,104 @@ NR_gNB_ULSCH_t *new_gNB_ulsch(uint8_t max_ldpc_iterations,uint8_t N_RB_UL, uint8
...
@@ -171,6 +171,104 @@ NR_gNB_ULSCH_t *new_gNB_ulsch(uint8_t max_ldpc_iterations,uint8_t N_RB_UL, uint8
return
(
NULL
);
return
(
NULL
);
}
}
void
clean_gNB_ulsch
(
NR_gNB_ULSCH_t
*
ulsch
)
{
unsigned
char
i
,
j
;
if
(
ulsch
)
{
ulsch
->
harq_mask
=
0
;
ulsch
->
bundling
=
0
;
ulsch
->
beta_offset_cqi_times8
=
0
;
ulsch
->
beta_offset_ri_times8
=
0
;
ulsch
->
beta_offset_harqack_times8
=
0
;
ulsch
->
Msg3_active
=
0
;
ulsch
->
Msg3_flag
=
0
;
ulsch
->
Msg3_subframe
=
0
;
ulsch
->
Msg3_frame
=
0
;
ulsch
->
rnti
=
0
;
ulsch
->
rnti_type
=
0
;
ulsch
->
cyclicShift
=
0
;
ulsch
->
cooperation_flag
=
0
;
ulsch
->
Mlimit
=
0
;
ulsch
->
max_ldpc_iterations
=
0
;
ulsch
->
last_iteration_cnt
=
0
;
ulsch
->
num_active_cba_groups
=
0
;
for
(
i
=
0
;
i
<
NUM_MAX_CBA_GROUP
;
i
++
)
ulsch
->
cba_rnti
[
i
]
=
0
;
for
(
i
=
0
;
i
<
NR_MAX_SLOTS_PER_FRAME
;
i
++
)
ulsch
->
harq_process_id
[
i
]
=
0
;
for
(
i
=
0
;
i
<
NR_MAX_ULSCH_HARQ_PROCESSES
;
i
++
)
{
if
(
ulsch
->
harq_processes
[
i
]){
/// Nfapi ULSCH PDU
//nfapi_nr_ul_config_ulsch_pdu ulsch_pdu;
ulsch
->
harq_processes
[
i
]
->
frame
=
0
;
ulsch
->
harq_processes
[
i
]
->
subframe
=
0
;
ulsch
->
harq_processes
[
i
]
->
round
=
0
;
ulsch
->
harq_processes
[
i
]
->
TPC
=
0
;
ulsch
->
harq_processes
[
i
]
->
mimo_mode
=
0
;
ulsch
->
harq_processes
[
i
]
->
dci_alloc
=
0
;
ulsch
->
harq_processes
[
i
]
->
rar_alloc
=
0
;
ulsch
->
harq_processes
[
i
]
->
status
=
0
;
ulsch
->
harq_processes
[
i
]
->
subframe_scheduling_flag
=
0
;
ulsch
->
harq_processes
[
i
]
->
subframe_cba_scheduling_flag
=
0
;
ulsch
->
harq_processes
[
i
]
->
phich_active
=
0
;
ulsch
->
harq_processes
[
i
]
->
phich_ACK
=
0
;
ulsch
->
harq_processes
[
i
]
->
previous_first_rb
=
0
;
ulsch
->
harq_processes
[
i
]
->
handled
=
0
;
ulsch
->
harq_processes
[
i
]
->
delta_TF
=
0
;
ulsch
->
harq_processes
[
i
]
->
TBS
=
0
;
/// Pointer to the payload (38.212 V15.4.0 section 5.1)
//uint8_t *b;
ulsch
->
harq_processes
[
i
]
->
B
=
0
;
/// Pointers to code blocks after code block segmentation and CRC attachment (38.212 V15.4.0 section 5.2.2)
//uint8_t *c[MAX_NUM_NR_ULSCH_SEGMENTS];
ulsch
->
harq_processes
[
i
]
->
K
=
0
;
ulsch
->
harq_processes
[
i
]
->
F
=
0
;
ulsch
->
harq_processes
[
i
]
->
C
=
0
;
/// Pointers to code blocks after LDPC coding (38.212 V15.4.0 section 5.3.2)
//int16_t *d[MAX_NUM_NR_ULSCH_SEGMENTS];
/// LDPC processing buffer
//t_nrLDPC_procBuf* p_nrLDPC_procBuf[MAX_NUM_NR_ULSCH_SEGMENTS];
ulsch
->
harq_processes
[
i
]
->
Z
=
0
;
/// code blocks after bit selection in rate matching for LDPC code (38.212 V15.4.0 section 5.4.2.1)
//int16_t e[MAX_NUM_NR_DLSCH_SEGMENTS][3*8448];
ulsch
->
harq_processes
[
i
]
->
E
;
ulsch
->
harq_processes
[
i
]
->
G
;
ulsch
->
harq_processes
[
i
]
->
n_DMRS
=
0
;
ulsch
->
harq_processes
[
i
]
->
n_DMRS2
=
0
;
ulsch
->
harq_processes
[
i
]
->
previous_n_DMRS
=
0
;
ulsch
->
harq_processes
[
i
]
->
cqi_crc_status
=
0
;
for
(
j
=
0
;
j
<
MAX_CQI_BYTES
;
j
++
)
ulsch
->
harq_processes
[
i
]
->
o
[
j
]
=
0
;
ulsch
->
harq_processes
[
i
]
->
uci_format
=
0
;
ulsch
->
harq_processes
[
i
]
->
Or1
=
0
;
ulsch
->
harq_processes
[
i
]
->
Or2
=
0
;
ulsch
->
harq_processes
[
i
]
->
o_RI
[
0
]
=
0
;
ulsch
->
harq_processes
[
i
]
->
o_RI
[
1
]
=
0
;
ulsch
->
harq_processes
[
i
]
->
O_RI
=
0
;
ulsch
->
harq_processes
[
i
]
->
o_ACK
[
0
]
=
0
;
ulsch
->
harq_processes
[
i
]
->
o_ACK
[
1
]
=
0
;
ulsch
->
harq_processes
[
i
]
->
o_ACK
[
2
]
=
0
;
ulsch
->
harq_processes
[
i
]
->
o_ACK
[
3
]
=
0
;
ulsch
->
harq_processes
[
i
]
->
O_ACK
=
0
;
ulsch
->
harq_processes
[
i
]
->
V_UL_DAI
=
0
;
/// "q" sequences for CQI/PMI (for definition see 36-212 V8.6 2009-03, p.27)
//int8_t q[MAX_CQI_PAYLOAD];
ulsch
->
harq_processes
[
i
]
->
o_RCC
=
0
;
/// coded and interleaved CQI bits
//int8_t o_w[(MAX_CQI_BITS+8)*3];
/// coded CQI bits
//int8_t o_d[96+((MAX_CQI_BITS+8)*3)];
for
(
j
=
0
;
j
<
MAX_ACK_PAYLOAD
;
j
++
)
ulsch
->
harq_processes
[
i
]
->
q_ACK
[
j
]
=
0
;
for
(
j
=
0
;
j
<
MAX_RI_PAYLOAD
;
j
++
)
ulsch
->
harq_processes
[
i
]
->
q_RI
[
j
]
=
0
;
/// Temporary h sequence to flag PUSCH_x/PUSCH_y symbols which are not scrambled
//uint8_t h[MAX_NUM_CHANNEL_BITS];
/// soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15)
//int16_t w[MAX_NUM_ULSCH_SEGMENTS][3*(6144+64)];
}
}
}
}
uint32_t
nr_ulsch_decoding
(
PHY_VARS_gNB
*
phy_vars_gNB
,
uint32_t
nr_ulsch_decoding
(
PHY_VARS_gNB
*
phy_vars_gNB
,
uint8_t
UE_id
,
uint8_t
UE_id
,
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
View file @
a0bcd41b
...
@@ -39,6 +39,7 @@
...
@@ -39,6 +39,7 @@
#include "PHY/CODING/nrLDPC_encoder/defs.h"
#include "PHY/CODING/nrLDPC_encoder/defs.h"
#include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h"
#include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h"
#include "common/utils/LOG/vcd_signal_dumper.h"
#include "common/utils/LOG/vcd_signal_dumper.h"
#include "PHY/NR_TRANSPORT/nr_dlsch.h"
...
@@ -92,7 +93,7 @@ NR_UE_ULSCH_t *new_nr_ue_ulsch(unsigned char N_RB_UL, int number_of_harq_pids, u
...
@@ -92,7 +93,7 @@ NR_UE_ULSCH_t *new_nr_ue_ulsch(unsigned char N_RB_UL, int number_of_harq_pids, u
{
{
NR_UE_ULSCH_t
*
ulsch
;
NR_UE_ULSCH_t
*
ulsch
;
unsigned
char
exit_flag
=
0
,
i
,
j
,
r
;
unsigned
char
exit_flag
=
0
,
i
,
r
;
unsigned
char
bw_scaling
=
1
;
unsigned
char
bw_scaling
=
1
;
switch
(
N_RB_UL
)
{
switch
(
N_RB_UL
)
{
...
@@ -211,7 +212,6 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
...
@@ -211,7 +212,6 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
uint32_t
Tbslbrm
;
uint32_t
Tbslbrm
;
uint8_t
nb_re_dmrs
;
uint8_t
nb_re_dmrs
;
uint16_t
length_dmrs
;
uint16_t
length_dmrs
;
int
i
;
float
Coderate
;
float
Coderate
;
///////////
///////////
...
...
openair1/SCHED_NR/fapi_nr_l1.h
View file @
a0bcd41b
...
@@ -32,7 +32,9 @@
...
@@ -32,7 +32,9 @@
#include "PHY/defs_gNB.h"
#include "PHY/defs_gNB.h"
#include "PHY/phy_extern.h"
#include "PHY/phy_extern.h"
#include "PHY/LTE_TRANSPORT/transport_proto.h"
//#include "PHY/LTE_TRANSPORT/transport_proto.h"
//#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h
#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
#include "SCHED/sched_eNB.h"
#include "SCHED/sched_eNB.h"
#include "SCHED/sched_common.h"
#include "SCHED/sched_common.h"
#include "SCHED_NR/sched_nr.h"
#include "SCHED_NR/sched_nr.h"
...
...
openair1/SIMULATION/NR_PHY/dlschsim.c
View file @
a0bcd41b
...
@@ -494,7 +494,7 @@ int main(int argc, char **argv) {
...
@@ -494,7 +494,7 @@ int main(int argc, char **argv) {
unsigned
char
*
test_input_bit
=
malloc16
(
sizeof
(
unsigned
char
)
*
16
*
68
*
384
);
unsigned
char
*
test_input_bit
=
malloc16
(
sizeof
(
unsigned
char
)
*
16
*
68
*
384
);
unsigned
int
errors_bit
=
0
;
unsigned
int
errors_bit
=
0
;
test_input_bit
=
(
unsigned
char
*
)
malloc16
(
sizeof
(
unsigned
char
)
*
16
*
68
*
384
);
test_input_bit
=
(
unsigned
char
*
)
malloc16
(
sizeof
(
unsigned
char
)
*
16
*
68
*
384
);
estimated_output
=
(
unsigned
char
*
)
malloc16
(
sizeof
(
unsigned
char
)
*
16
*
68
*
384
);
//
estimated_output = (unsigned char *) malloc16(sizeof(unsigned char) * 16 * 68 * 384);
estimated_output_bit
=
(
unsigned
char
*
)
malloc16
(
sizeof
(
unsigned
char
)
*
16
*
68
*
384
);
estimated_output_bit
=
(
unsigned
char
*
)
malloc16
(
sizeof
(
unsigned
char
)
*
16
*
68
*
384
);
NR_UE_DLSCH_t
*
dlsch0_ue
=
UE
->
dlsch
[
0
][
0
][
0
];
NR_UE_DLSCH_t
*
dlsch0_ue
=
UE
->
dlsch
[
0
][
0
][
0
];
NR_DL_UE_HARQ_t
*
harq_process
=
dlsch0_ue
->
harq_processes
[
harq_pid
];
NR_DL_UE_HARQ_t
*
harq_process
=
dlsch0_ue
->
harq_processes
[
harq_pid
];
...
...
openair1/SIMULATION/NR_PHY/dlsim.c
View file @
a0bcd41b
...
@@ -42,11 +42,13 @@
...
@@ -42,11 +42,13 @@
#include "PHY/MODULATION/modulation_UE.h"
#include "PHY/MODULATION/modulation_UE.h"
#include "PHY/INIT/phy_init.h"
#include "PHY/INIT/phy_init.h"
#include "PHY/NR_TRANSPORT/nr_transport.h"
#include "PHY/NR_TRANSPORT/nr_transport.h"
//#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
//openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
#include "SCHED_NR/sched_nr.h"
#include "SCHED_NR/sched_nr.h"
#include "SCHED_NR_UE/fapi_nr_ue_l1.h"
#include "SCHED_NR_UE/fapi_nr_ue_l1.h"
#include "SCHED_NR/fapi_nr_l1.h"
#include "SCHED_NR/fapi_nr_l1.h"
#include "SCHED_NR_UE/defs.h"
#include "LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
#include "LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
#include "LAYER2/NR_MAC_UE/mac_defs.h"
#include "LAYER2/NR_MAC_UE/mac_defs.h"
...
@@ -58,6 +60,7 @@
...
@@ -58,6 +60,7 @@
#include "LAYER2/NR_MAC_UE/mac_proto.h"
#include "LAYER2/NR_MAC_UE/mac_proto.h"
//#include "LAYER2/NR_MAC_gNB/mac_proto.h"
//#include "LAYER2/NR_MAC_gNB/mac_proto.h"
//#include "openair2/LAYER2/NR_MAC_UE/mac_proto.h"
//#include "openair2/LAYER2/NR_MAC_UE/mac_proto.h"
#include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
#include "RRC/NR/MESSAGES/asn1_msg.h"
#include "RRC/NR/MESSAGES/asn1_msg.h"
...
@@ -515,7 +518,7 @@ int main(int argc, char **argv)
...
@@ -515,7 +518,7 @@ int main(int argc, char **argv)
gNB_mac
=
RC
.
nrmac
[
0
];
gNB_mac
=
RC
.
nrmac
[
0
];
config_common
(
0
,
0
,
Nid_cell
,
78
,
ssb_pattern
,(
uint64_t
)
3640000000L
,
N_RB_DL
);
config_common
(
0
,
0
,
Nid_cell
,
78
,
ssb_pattern
,(
uint64_t
)
3640000000L
,
N_RB_DL
);
config_nr_mib
(
0
,
0
,
1
,
kHz30
,
0
,
0
,
0
,
0
);
config_nr_mib
(
0
,
0
,
1
,
kHz30
,
0
,
0
,
0
,
0
,
0
);
nr_l2_init_ue
();
nr_l2_init_ue
();
UE_mac
=
get_mac_inst
(
0
);
UE_mac
=
get_mac_inst
(
0
);
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
View file @
a0bcd41b
...
@@ -387,10 +387,10 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
...
@@ -387,10 +387,10 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
// Note: This should not be done in the MAC!
// Note: This should not be done in the MAC!
for
(
int
ii
=
0
;
ii
<
MAX_MOBILES_PER_GNB
;
ii
++
)
{
for
(
int
ii
=
0
;
ii
<
MAX_MOBILES_PER_GNB
;
ii
++
)
{
LTE_eNB_ULSCH_t
*
ulsch
=
RC
.
gNB
[
module_idP
][
CC_id
]
->
ulsch
[
ii
];
NR_gNB_ULSCH_t
*
ulsch
=
RC
.
gNB
[
module_idP
][
CC_id
]
->
ulsch
[
ii
][
0
];
if
((
ulsch
!=
NULL
)
&&
(
ulsch
->
rnti
==
rnti
)){
if
((
ulsch
!=
NULL
)
&&
(
ulsch
->
rnti
==
rnti
)){
LOG_I
(
MAC
,
"clean_eNb_ulsch UE %x
\n
"
,
rnti
);
LOG_I
(
MAC
,
"clean_eNb_ulsch UE %x
\n
"
,
rnti
);
clean_
eNb
_ulsch
(
ulsch
);
clean_
gNB
_ulsch
(
ulsch
);
}
}
}
}
...
@@ -398,8 +398,8 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
...
@@ -398,8 +398,8 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
NR_gNB_DLSCH_t
*
dlsch
=
RC
.
gNB
[
module_idP
][
CC_id
]
->
dlsch
[
ii
][
0
];
NR_gNB_DLSCH_t
*
dlsch
=
RC
.
gNB
[
module_idP
][
CC_id
]
->
dlsch
[
ii
][
0
];
if
((
dlsch
!=
NULL
)
&&
(
dlsch
->
rnti
==
rnti
)){
if
((
dlsch
!=
NULL
)
&&
(
dlsch
->
rnti
==
rnti
)){
LOG_I
(
MAC
,
"clean_eNb_dlsch UE %x
\n
"
,
rnti
);
LOG_I
(
MAC
,
"clean_eNb_dlsch UE %x
\n
"
,
rnti
);
LOG_E
(
PHY
,
"Calling with wrong param
ter type
\n
"
);
LOG_E
(
PHY
,
"Calling with wrong parame
ter type
\n
"
);
clean_eNb
_dlsch
(
dlsch
);
clean_gNB
_dlsch
(
dlsch
);
}
}
}
}
...
...
openair2/LAYER2/NR_MAC_gNB/mac_proto.h
View file @
a0bcd41b
...
@@ -53,7 +53,9 @@ void config_nr_mib(int Mod_idP,
...
@@ -53,7 +53,9 @@ void config_nr_mib(int Mod_idP,
void
config_common
(
int
Mod_idP
,
void
config_common
(
int
Mod_idP
,
int
CC_idP
,
int
CC_idP
,
int
Nid_cell
,
int
nr_bandP
,
int
nr_bandP
,
uint64_t
ssb_pattern
,
uint64_t
dl_CarrierFreqP
,
uint64_t
dl_CarrierFreqP
,
uint32_t
dl_BandwidthP
uint32_t
dl_BandwidthP
);
);
...
@@ -89,6 +91,10 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP,
...
@@ -89,6 +91,10 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP,
frame_t
frameP
,
frame_t
frameP
,
sub_frame_t
subframeP
);
sub_frame_t
subframeP
);
void
nr_schedule_uss_dlsch_phytest
(
module_id_t
module_idP
,
frame_t
frameP
,
sub_frame_t
slotP
);
void
nr_configure_css_dci_initial
(
nfapi_nr_dl_config_pdcch_parameters_rel15_t
*
pdcch_params
,
void
nr_configure_css_dci_initial
(
nfapi_nr_dl_config_pdcch_parameters_rel15_t
*
pdcch_params
,
nr_scs_e
scs_common
,
nr_scs_e
scs_common
,
...
...
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
View file @
a0bcd41b
...
@@ -171,8 +171,4 @@ typedef struct gNB_MAC_INST_s {
...
@@ -171,8 +171,4 @@ typedef struct gNB_MAC_INST_s {
time_stats_t
schedule_pch
;
time_stats_t
schedule_pch
;
}
gNB_MAC_INST
;
}
gNB_MAC_INST
;
void
nr_schedule_css_dlsch_phytest
(
module_id_t
module_idP
,
frame_t
frameP
,
sub_frame_t
subframeP
);
#endif
/*__LAYER2_NR_MAC_GNB_H__ */
#endif
/*__LAYER2_NR_MAC_GNB_H__ */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment