Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
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
wangwenhui
OpenXG-RAN
Commits
59c4ddef
Commit
59c4ddef
authored
6 years ago
by
Raymond Knopp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
completed most of code generation tool for polar decoder integrated into "polartest"
parent
8cda0a0f
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
186 additions
and
176 deletions
+186
-176
openair1/PHY/CODING/nrPolar_tools/nr_polar_decoder.c
openair1/PHY/CODING/nrPolar_tools/nr_polar_decoder.c
+110
-93
openair1/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c
openair1/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c
+74
-81
openair1/PHY/CODING/nrPolar_tools/nr_polar_defs.h
openair1/PHY/CODING/nrPolar_tools/nr_polar_defs.h
+2
-2
No files found.
openair1/PHY/CODING/nrPolar_tools/nr_polar_decoder.c
View file @
59c4ddef
...
...
@@ -30,7 +30,6 @@
#include "PHY/TOOLS/time_meas.h"
int8_t
polar_decoder
(
double
*
input
,
uint8_t
*
output
,
...
...
@@ -294,6 +293,92 @@ int8_t polar_decoder(
}
#define decoder_int8_A(sorted_dlist,currentListSize,polarParams) {for (int i = 0; i < currentListSize; i++) { \
for (int k = 0; k < (polarParams->n+1); k++) { \
memcpy((void*)&sorted_dlist[i+currentListSize]->bit[k][0],\
(void*)&sorted_dlist[i]->bit[k][0],\
sizeof(uint8_t)*polarParams->N);\
memcpy((void*)&sorted_dlist[i+currentListSize]->llr[k][0],\
(void*)&sorted_dlist[i]->llr[k][0],\
sizeof(int16_t)*polarParams->N);}}}
#define decoder_int8_B(sorted_dlist,currentListSize) {for (int i = 0; i < currentListSize; i++) {sorted_dlist[i]->bit[0][currentBit]=0;sorted_dlist[i+currentListSize]->bit[0][currentBit]=1;}}
void
inline
decoder_int8_C
(
decoder_list_int8_t
*
sorted_dlist
[],
t_nrPolar_params
*
polarParams
,
int
currentBit
,
int
currentListSize
,
int
listSize
)
{
int32_t
pathMetric
[
2
*
listSize
];
decoder_list_int8_t
*
temp_dlist
[
2
*
listSize
];
int
listIndex
[
2
*
listSize
];
int
listIndex2
[
2
*
listSize
];
for
(
int
i
=
0
;
i
<
currentListSize
;
i
++
)
{
listIndex
[
i
]
=
i
;
pathMetric
[
i
]
=
sorted_dlist
[
i
]
->
pathMetric
;
}
nr_sort_asc_int16_1D_array_ind
(
pathMetric
,
listIndex
,
currentListSize
);
for
(
int
i
=
0
;
i
<
currentListSize
;
i
++
)
{
listIndex2
[
listIndex
[
i
]]
=
i
;
}
// copy the llr/bit arrays that are needed
for
(
int
i
=
0
;
i
<
listSize
;
i
++
)
{
// printf("listIndex[%d] %d\n",i,listIndex[i]);
if
((
listIndex2
[
i
+
listSize
]
<
listSize
)
&&
(
listIndex2
[
i
]
<
listSize
))
{
// both '0' and '1' path metrics are to be kept
// do memcpy of LLR and Bit arrays
for
(
int
k
=
0
;
k
<
(
polarParams
->
n
+
1
);
k
++
)
{
memcpy
((
void
*
)
&
sorted_dlist
[
i
+
listSize
]
->
bit
[
k
][
0
],
(
void
*
)
&
sorted_dlist
[
i
]
->
bit
[
k
][
0
],
sizeof
(
uint8_t
)
*
polarParams
->
N
);
memcpy
((
void
*
)
&
sorted_dlist
[
i
+
listSize
]
->
llr
[
k
][
0
],
(
void
*
)
&
sorted_dlist
[
i
]
->
llr
[
k
][
0
],
sizeof
(
int16_t
)
*
polarParams
->
N
);
}
sorted_dlist
[
i
]
->
bit
[
0
][
currentBit
]
=
0
;
sorted_dlist
[
i
+
listSize
]
->
bit
[
0
][
currentBit
]
=
1
;
}
else
if
(
listIndex2
[
i
+
listSize
]
<
listSize
)
{
// only '1' path metric is to be kept
// just change the current bit from '0' to '1'
for
(
int
k
=
0
;
k
<
(
polarParams
->
n
+
1
);
k
++
)
{
memcpy
((
void
*
)
&
sorted_dlist
[
i
+
listSize
]
->
bit
[
k
][
0
],
(
void
*
)
&
sorted_dlist
[
i
]
->
bit
[
k
][
0
],
sizeof
(
uint8_t
)
*
polarParams
->
N
);
memcpy
((
void
*
)
&
sorted_dlist
[
i
+
listSize
]
->
llr
[
k
][
0
],
(
void
*
)
&
sorted_dlist
[
i
]
->
llr
[
k
][
0
],
sizeof
(
int16_t
)
*
polarParams
->
N
);
}
sorted_dlist
[
i
+
listSize
]
->
bit
[
0
][
currentBit
]
=
1
;
/*
decoder_list_t *tmp = sorted_dlist[i+listSize];
sorted_dlist[i+listSize] = sorted_dlist[i];
sorted_dlist[i+listSize]->pathMetric = tmp->pathMetric;
sorted_dlist[i+listSize]->bit[0][currentBit]=1;
memcpy((void*)&sorted_dlist[i+listSize]->crcChecksum[0],
(void*)&tmp->crcChecksum[0],
24*sizeof(uint8_t));*/
}
}
for
(
int
i
=
0
;
i
<
2
*
listSize
;
i
++
)
{
temp_dlist
[
i
]
=
sorted_dlist
[
i
];
}
for
(
int
i
=
0
;
i
<
2
*
listSize
;
i
++
)
{
// printf("i %d => %d\n",i,listIndex[i]);
sorted_dlist
[
i
]
=
temp_dlist
[
listIndex
[
i
]];
}
}
int8_t
polar_decoder_int8
(
int16_t
*
input
,
uint8_t
*
output
,
t_nrPolar_params
*
polarParams
,
...
...
@@ -380,9 +465,6 @@ int8_t polar_decoder_int8(int16_t *input,
uint8_t
currentListSize
=
1
;
decoder_list_int8_t
*
sorted_dlist
[
2
*
listSize
];
decoder_list_int8_t
*
temp_dlist
[
2
*
listSize
];
int
listIndex
[
2
*
listSize
];
int32_t
pathMetric
[
2
*
listSize
];
for
(
uint8_t
i
=
0
;
i
<
2
*
listSize
;
i
++
)
sorted_dlist
[
i
]
=
&
dlist
[
i
];
...
...
@@ -403,101 +485,36 @@ int8_t polar_decoder_int8(int16_t *input,
start_meas
(
sorting
);
// for (int i=0;i<currentListSize;i++) {
// printf("sorted_dlist[%d] pathmetric %d\n",i,sorted_dlist[i]->pathMetric);
// }
if
(
currentListSize
<=
listSize
/
2
)
{
// until listsize is full we need to copy bit and LLR arrays to new entries
// below we only copy the ones we need to keep for sure
for
(
int
i
=
0
;
i
<
currentListSize
;
i
++
)
{
for
(
int
k
=
0
;
k
<
(
polarParams
->
n
+
1
);
k
++
)
{
memcpy
((
void
*
)
&
sorted_dlist
[
i
+
currentListSize
]
->
bit
[
k
][
0
],
(
void
*
)
&
sorted_dlist
[
i
]
->
bit
[
k
][
0
],
sizeof
(
uint8_t
)
*
polarParams
->
N
);
memcpy
((
void
*
)
&
sorted_dlist
[
i
+
currentListSize
]
->
llr
[
k
][
0
],
(
void
*
)
&
sorted_dlist
[
i
]
->
llr
[
k
][
0
],
sizeof
(
int16_t
)
*
polarParams
->
N
);
}
}
decoder_int8_A
(
sorted_dlist
,
currentListSize
,
polarParams
);
#ifdef SHOWCOMP
printf
(
"decoder_int8_A(sorted_dlist,%d,polarParams);
\n
"
,
currentListSize
);
#endif
}
decoder_int8_B
(
sorted_dlist
,
currentListSize
);
#ifdef SHOWCOMP
printf
(
"decoder_int8_B(sorted_dlist,%d);
\n
"
,
currentListSize
);
#endif
for
(
int
i
=
0
;
i
<
currentListSize
;
i
++
)
{
sorted_dlist
[
i
]
->
bit
[
0
][
currentBit
]
=
0
;
sorted_dlist
[
i
+
currentListSize
]
->
bit
[
0
][
currentBit
]
=
1
;
}
bitUpdated
[
currentBit
][
0
]
=
1
;
updateCrcChecksum2_int8
(
sorted_dlist
,
extended_crc_generator_matrix
,
currentListSize
,
nonFrozenBit
,
polarParams
->
crcParityBits
);
currentListSize
*=
2
;
//Keep only the best "listSize" number of entries.
if
(
currentListSize
>
listSize
)
{
int
listIndex2
[
listSize
];
for
(
int
i
=
0
;
i
<
currentListSize
;
i
++
)
{
listIndex
[
i
]
=
i
;
pathMetric
[
i
]
=
sorted_dlist
[
i
]
->
pathMetric
;
}
nr_sort_asc_int16_1D_array_ind
(
pathMetric
,
listIndex
,
currentListSize
);
for
(
int
i
=
0
;
i
<
currentListSize
;
i
++
)
{
listIndex2
[
listIndex
[
i
]]
=
i
;
}
// copy the llr/bit arrays that are needed
for
(
int
i
=
0
;
i
<
listSize
;
i
++
)
{
// printf("listIndex[%d] %d\n",i,listIndex[i]);
if
((
listIndex2
[
i
+
listSize
]
<
listSize
)
&&
(
listIndex2
[
i
]
<
listSize
))
{
// both '0' and '1' path metrics are to be kept
// do memcpy of LLR and Bit arrays
for
(
int
k
=
0
;
k
<
(
polarParams
->
n
+
1
);
k
++
)
{
memcpy
((
void
*
)
&
sorted_dlist
[
i
+
listSize
]
->
bit
[
k
][
0
],
(
void
*
)
&
sorted_dlist
[
i
]
->
bit
[
k
][
0
],
sizeof
(
uint8_t
)
*
polarParams
->
N
);
memcpy
((
void
*
)
&
sorted_dlist
[
i
+
listSize
]
->
llr
[
k
][
0
],
(
void
*
)
&
sorted_dlist
[
i
]
->
llr
[
k
][
0
],
sizeof
(
int16_t
)
*
polarParams
->
N
);
}
sorted_dlist
[
i
]
->
bit
[
0
][
currentBit
]
=
0
;
sorted_dlist
[
i
+
listSize
]
->
bit
[
0
][
currentBit
]
=
1
;
}
else
if
(
listIndex2
[
i
+
listSize
]
<
listSize
)
{
// only '1' path metric is to be kept
// just change the current bit from '0' to '1'
for
(
int
k
=
0
;
k
<
(
polarParams
->
n
+
1
);
k
++
)
{
memcpy
((
void
*
)
&
sorted_dlist
[
i
+
listSize
]
->
bit
[
k
][
0
],
(
void
*
)
&
sorted_dlist
[
i
]
->
bit
[
k
][
0
],
sizeof
(
uint8_t
)
*
polarParams
->
N
);
memcpy
((
void
*
)
&
sorted_dlist
[
i
+
listSize
]
->
llr
[
k
][
0
],
(
void
*
)
&
sorted_dlist
[
i
]
->
llr
[
k
][
0
],
sizeof
(
int16_t
)
*
polarParams
->
N
);
}
sorted_dlist
[
i
+
listSize
]
->
bit
[
0
][
currentBit
]
=
1
;
/*
decoder_list_t *tmp = sorted_dlist[i+listSize];
sorted_dlist[i+listSize] = sorted_dlist[i];
sorted_dlist[i+listSize]->pathMetric = tmp->pathMetric;
sorted_dlist[i+listSize]->bit[0][currentBit]=1;
memcpy((void*)&sorted_dlist[i+listSize]->crcChecksum[0],
(void*)&tmp->crcChecksum[0],
24*sizeof(uint8_t));*/
}
}
decoder_int8_C
(
sorted_dlist
,
polarParams
,
currentBit
,
currentListSize
,
listSize
);
currentListSize
=
listSize
;
for
(
int
i
=
0
;
i
<
2
*
listSize
;
i
++
)
{
temp_dlist
[
i
]
=
sorted_dlist
[
i
];
}
for
(
int
i
=
0
;
i
<
2
*
listSize
;
i
++
)
{
// printf("i %d => %d\n",i,listIndex[i]);
sorted_dlist
[
i
]
=
temp_dlist
[
listIndex
[
i
]];
}
}
stop_meas
(
sorting
);
nonFrozenBit
++
;
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c
View file @
59c4ddef
...
...
@@ -32,9 +32,6 @@ inline void computeLLR(double llr[1+nmax][Nmax], uint16_t row, uint16_t col,
double
absA
,
absB
;
#ifdef SHOWCOMP
printf
(
"computeLLR (%d,%d,%d)
\n
"
,
row
,
col
,
offset
);
#endif
a
=
llr
[
col
+
1
][
row
];
b
=
llr
[
col
+
1
][
row
+
offset
];
...
...
@@ -60,7 +57,7 @@ inline void computeLLR_int8(int16_t llr[1+nmax][Nmax], uint16_t row, uint16_t co
int16_t
minabs
;
#ifdef SHOWCOMP
printf
(
"computeLLR_int8
(%d,%d,%d)
\n
"
,
row
,
col
,
offset
);
printf
(
"computeLLR_int8
(llr,%d,%d,%d);
\n
"
,
row
,
col
,
offset
);
#endif
a
=
llr
[
col
+
1
][
row
];
b
=
llr
[
col
+
1
][
row
+
offset
];
...
...
@@ -87,13 +84,7 @@ void updateLLR(decoder_list_t **dlist,uint8_t **llrU, uint8_t **bitU,
if
(
llrU
[
row
-
offset
][
col
+
1
]
==
0
)
updateLLR
(
dlist
,
llrU
,
bitU
,
listSize
,
(
row
-
offset
),
(
col
+
1
),
xlen
,
ylen
,
approximation
);
if
(
llrU
[
row
][
col
+
1
]
==
0
)
updateLLR
(
dlist
,
llrU
,
bitU
,
listSize
,
row
,
(
col
+
1
),
xlen
,
ylen
,
approximation
);
for
(
uint8_t
i
=
0
;
i
<
listSize
;
i
++
)
{
#ifdef SHOWCOMP
printf
(
"updatingLLR (%d,%d,%d) (bit %d,%d,%d, llr0 %d,%d,%d, llr1 %d,%d,%d
\n
"
,
row
,
col
,
i
,
row
-
offset
,
col
,
i
,
row
-
offset
,
col
+
1
,
i
,
row
,
col
+
1
,
i
);
#endif
dlist
[
i
]
->
llr
[
col
][
row
]
=
(
pow
((
-
1
),
dlist
[
i
]
->
bit
[
col
][
row
-
offset
])
*
dlist
[
i
]
->
llr
[
col
+
1
][
row
-
offset
])
+
dlist
[
i
]
->
llr
[
col
+
1
][
row
];
// printf("updating dlist[%d]->llr[%d][%d] => %f (%f,%f) offset %d\n",i,col,row,32*dlist[i]->llr[col][row],
// (pow((-1),dlist[i]->bit[col][row-offset])*32*dlist[i]->llr[col+1][row-offset]),32*dlist[i]->llr[col+1][row],offset);
}
}
else
{
if
(
llrU
[
row
][
col
+
1
]
==
0
)
updateLLR
(
dlist
,
llrU
,
bitU
,
listSize
,
row
,
(
col
+
1
),
xlen
,
ylen
,
approximation
);
...
...
@@ -104,6 +95,9 @@ void updateLLR(decoder_list_t **dlist,uint8_t **llrU, uint8_t **bitU,
llrU
[
row
][
col
]
=
1
;
}
#define updateLLR_int8_A(dlist,i,col,row,offset) if (dlist[(i)]->bit[(col)][(row)-(offset)]==0) dlist[(i)]->llr[(col)][(row)] = dlist[(i)]->llr[(col)+1][(row)-(offset)] + dlist[(i)]->llr[(col)+1][(row)]; else dlist[(i)]->llr[(col)][(row)] = -dlist[(i)]->llr[(col)+1][(row)-(offset)] + dlist[(i)]->llr[(col)+1][(row)];
void
updateLLR_int8
(
decoder_list_int8_t
**
dlist
,
uint8_t
**
llrU
,
uint8_t
**
bitU
,
uint8_t
listSize
,
uint16_t
row
,
uint16_t
col
,
uint16_t
xlen
,
uint8_t
ylen
)
{
uint16_t
offset
=
(
xlen
/
(
1
<<
(
ylen
-
col
-
1
)));
...
...
@@ -111,17 +105,18 @@ void updateLLR_int8(decoder_list_int8_t **dlist,uint8_t **llrU, uint8_t **bitU,
if
(
bitU
[
row
-
offset
][
col
]
==
0
)
updateBit_int8
(
dlist
,
bitU
,
listSize
,
(
row
-
offset
),
col
,
xlen
,
ylen
);
if
(
llrU
[
row
-
offset
][
col
+
1
]
==
0
)
updateLLR_int8
(
dlist
,
llrU
,
bitU
,
listSize
,
(
row
-
offset
),
(
col
+
1
),
xlen
,
ylen
);
if
(
llrU
[
row
][
col
+
1
]
==
0
)
updateLLR_int8
(
dlist
,
llrU
,
bitU
,
listSize
,
row
,
(
col
+
1
),
xlen
,
ylen
);
for
(
uint8_t
i
=
0
;
i
<
listSize
;
i
++
)
{
#ifdef SHOWCOMP
printf
(
"updatingLLR_int8 (%d,%d,%d) (bit %d,%d,%d, llr0 %d,%d,%d, llr1 %d,%d,%d
\n
"
,
row
,
col
,
i
,
row
-
offset
,
col
,
i
,
row
-
offset
,
col
+
1
,
i
,
row
,
col
+
1
,
i
);
printf
(
"updateLLR_int8_A(dlist,%d,%d,%d,%d);
\n
"
,
i
,
row
,
col
,
offset
);
#endif
updateLLR_int8_A
(
dlist
,
i
,
col
,
row
,
offset
);
/*
if (dlist[i]->bit[col][row-offset]==0)
dlist[i]->llr[col][row] = dlist[i]->llr[col+1][row-offset] + dlist[i]->llr[col+1][row];
else
dlist
[
i
]
->
llr
[
col
][
row
]
=
-
dlist
[
i
]
->
llr
[
col
+
1
][
row
-
offset
]
+
dlist
[
i
]
->
llr
[
col
+
1
][
row
];
// printf("updating dlist[%d]->llr[%d][%d] => %d (%d,%d) offset %d\n",i,col,row,dlist[i]->llr[col][row],
// (dlist[i]->bit[col][row-offset]==0 ? 1 : -1)*dlist[i]->llr[col+1][row-offset],dlist[i]->llr[col+1][row], offset);
dlist[i]->llr[col][row] = -dlist[i]->llr[col+1][row-offset] + dlist[i]->llr[col+1][row];*/
}
}
else
{
if
(
llrU
[
row
][
col
+
1
]
==
0
)
updateLLR_int8
(
dlist
,
llrU
,
bitU
,
listSize
,
row
,
(
col
+
1
),
xlen
,
ylen
);
...
...
@@ -140,25 +135,19 @@ void updateBit(decoder_list_t **dlist, uint8_t **bitU, uint8_t listSize, uint16_
if
((
(
row
)
%
(
2
*
offset
)
)
>=
offset
)
{
if
(
bitU
[
row
][
col
-
1
]
==
0
)
updateBit
(
dlist
,
bitU
,
listSize
,
row
,
(
col
-
1
),
xlen
,
ylen
);
dlist
[
i
]
->
bit
[
col
][
row
]
=
dlist
[
i
]
->
bit
[
col
-
1
][
row
];
#ifdef SHOWCOMP
printf
(
"updating bit (%d,%d,%d) from (%d,%d,%d)
\n
"
,
row
,
col
,
i
,
row
,
col
-
1
,
i
);
#endif
}
else
{
if
(
bitU
[
row
][
col
-
1
]
==
0
)
updateBit
(
dlist
,
bitU
,
listSize
,
row
,
(
col
-
1
),
xlen
,
ylen
);
if
(
bitU
[
row
+
offset
][
col
-
1
]
==
0
)
updateBit
(
dlist
,
bitU
,
listSize
,
(
row
+
offset
),
(
col
-
1
),
xlen
,
ylen
);
dlist
[
i
]
->
bit
[
col
][
row
]
=
(
(
dlist
[
i
]
->
bit
[
col
-
1
][
row
]
+
dlist
[
i
]
->
bit
[
col
-
1
][
row
+
offset
])
%
2
);
// printf("updating dlist[%d]->bit[%d][%d] => %d\n",i,col,row,dlist[i]->bit[col][row]);
#ifdef SHOWCOMP
printf
(
"updating bit (%d,%d,%d) from (%d,%d,%d)+(%d,%d,%d)
\n
"
,
row
,
col
,
i
,
row
,
col
-
1
,
i
,
row
+
offset
,
col
-
1
,
i
);
#endif
}
}
bitU
[
row
][
col
]
=
1
;
}
#define updateBit_int8_A(dlist,i,col,row) dlist[(i)]->bit[(col)][(row)] = dlist[(i)]->bit[(col)-1][(row)]
#define updateBit_int8_B(dlist,i,col,row,offset) dlist[(i)]->bit[(col)][(row)] = dlist[(i)]->bit[(col)-1][(row)]^dlist[(i)]->bit[(col)-1][(row)+(offset)]
void
updateBit_int8
(
decoder_list_int8_t
**
dlist
,
uint8_t
**
bitU
,
uint8_t
listSize
,
uint16_t
row
,
uint16_t
col
,
uint16_t
xlen
,
uint8_t
ylen
)
{
uint16_t
offset
=
(
xlen
/
(
pow
(
2
,(
ylen
-
col
)))
);
...
...
@@ -166,20 +155,21 @@ void updateBit_int8(decoder_list_int8_t **dlist, uint8_t **bitU, uint8_t listSiz
for
(
uint8_t
i
=
0
;
i
<
listSize
;
i
++
)
{
if
((
(
row
)
%
(
2
*
offset
)
)
>=
offset
)
{
if
(
bitU
[
row
][
col
-
1
]
==
0
)
updateBit_int8
(
dlist
,
bitU
,
listSize
,
row
,
(
col
-
1
),
xlen
,
ylen
);
dlist
[
i
]
->
bit
[
col
][
row
]
=
dlist
[
i
]
->
bit
[
col
-
1
][
row
];
//
dlist[i]->bit[col][row] = dlist[i]->bit[col-1][row];
#ifdef SHOWCOMP
printf
(
"updating bit (%d,%d,%d) from (%d,%d,%d)
\n
"
,
row
,
col
,
i
,
row
,
col
-
1
,
i
);
printf
(
"updateBit_int8_A(dlist,%d,%d,%d);
\n
"
,
i
,
col
,
row
);
#endif
updateBit_int8_A
(
dlist
,
i
,
col
,
row
);
}
else
{
if
(
bitU
[
row
][
col
-
1
]
==
0
)
updateBit_int8
(
dlist
,
bitU
,
listSize
,
row
,
(
col
-
1
),
xlen
,
ylen
);
if
(
bitU
[
row
+
offset
][
col
-
1
]
==
0
)
updateBit_int8
(
dlist
,
bitU
,
listSize
,
(
row
+
offset
),
(
col
-
1
),
xlen
,
ylen
);
dlist
[
i
]
->
bit
[
col
][
row
]
=
dlist
[
i
]
->
bit
[
col
-
1
][
row
]
^
dlist
[
i
]
->
bit
[
col
-
1
][
row
+
offset
];
//
dlist[i]->bit[col][row] = dlist[i]->bit[col-1][row]^dlist[i]->bit[col-1][row+offset];
// printf("updating dlist[%d]->bit[%d][%d] => %d\n",i,col,row,dlist[i]->bit[col][row]);
#ifdef SHOWCOMP
printf
(
"updating bit (%d,%d,%d) from (%d,%d,%d)+(%d,%d,%d)
\n
"
,
row
,
col
,
i
,
row
,
col
-
1
,
i
,
row
+
offset
,
col
-
1
,
i
);
printf
(
"updateBit_int8_B(dlist,%d,%d,%d,%d);
\n
"
,
i
,
col
,
row
,
offset
);
#endif
updateBit_int8_B
(
dlist
,
i
,
col
,
row
,
offset
);
}
}
...
...
@@ -189,47 +179,41 @@ void updateBit_int8(decoder_list_int8_t **dlist, uint8_t **bitU, uint8_t listSiz
void
updatePathMetric
(
decoder_list_t
**
dlist
,
uint8_t
listSize
,
uint8_t
bitValue
,
uint16_t
row
,
uint8_t
approximation
)
{
#ifdef SHOWCOMP
printf
(
"updating path_metric from Frozen bit (%d,%d)
\n
"
,
row
,
0
);
#endif
if
(
approximation
)
{
//eq. (12)
for
(
uint8_t
i
=
0
;
i
<
listSize
;
i
++
)
{
if
((
2
*
bitValue
)
!=
(
1
-
copysign
(
1
.
0
,
dlist
[
i
]
->
llr
[
0
][
row
])
))
dlist
[
i
]
->
pathMetric
+=
fabs
(
dlist
[
i
]
->
llr
[
0
][
row
]);
// printf("updatepathmetric : llr %f pathMetric %f (bitValue %d)\n",32*dlist[i]->llr[0][row],32*dlist[i]->pathMetric,bitValue);
}
}
else
{
//eq. (11b)
int8_t
multiplier
=
(
2
*
bitValue
)
-
1
;
for
(
uint8_t
i
=
0
;
i
<
listSize
;
i
++
)
{
dlist
[
i
]
->
pathMetric
+=
log
(
1
+
exp
(
multiplier
*
dlist
[
i
]
->
llr
[
0
][
row
])
)
;
// printf("updatepathmetric : llr %f pathMetric %f\n",32*dlist[i]->llr[0][row],32*dlist[i]->pathMetric);
}
}
}
#define updatePathMetric0_int8_A(dlist,i,row,mask,absllr) { mask=dlist[i]->llr[0][row]>>15;if(mask!=0){absllr=(dlist[i]->llr[0][row]+mask)^mask;dlist[i]->pathMetric+=absllr;}}
void
updatePathMetric0_int8
(
decoder_list_int8_t
**
dlist
,
uint8_t
listSize
,
uint16_t
row
)
{
int16_t
mask
,
absllr
;
for
(
uint8_t
i
=
0
;
i
<
listSize
;
i
++
)
{
updatePathMetric0_int8_A
(
dlist
,
i
,
row
,
mask
,
absllr
);
#ifdef SHOWCOMP
printf
(
"updating path_metric from Frozen bit (%d,%d)
\n
"
,
row
,
0
);
printf
(
"updatePathMetric0_int8_A(dlist,i,%d,%d);
\n
"
,
listSize
,
row
);
#endif
int16_t
mask
;
for
(
uint8_t
i
=
0
;
i
<
listSize
;
i
++
)
{
// if ((2*bitValue) != ( 1 - copysign(1.0,dlist[i]->llr[0][row]) )) dlist[i]->pathMetric += fabs(dlist[i]->llr[0][row]);
// equiv: if ((llr>0 && bitValue==1) || (llr<0 && bitValue==0) ...
// equiv: (llr>>7 + bitValue) != 0, in opposite case (llr>8 + bitValue) = -1 or 1
/*
mask = dlist[i]->llr[0][row]>>15;
if (mask != 0) {
int16_t absllr = (dlist[i]->llr[0][row]+mask)^mask;
dlist[i]->pathMetric += absllr;
}
// printf("updatepathmetric : llr %d, pathMetric %d (bitValue %d)\n",dlist[i]->llr[0][row],dlist[i]->pathMetric);
}*/
}
}
...
...
@@ -241,10 +225,6 @@ void updatePathMetric2(decoder_list_t **dlist, uint8_t listSize, uint16_t row, u
for
(
i
=
0
;
i
<
listSize
;
i
++
)
dlist
[
i
+
listSize
]
->
pathMetric
=
dlist
[
i
]
->
pathMetric
;
decoder_list_t
**
dlist2
=
&
dlist
[
listSize
];
#ifdef SHOWCOMP
printf
(
"updating path_metric from information bit (%d,%d)
\n
"
,
row
,
0
);
#endif
if
(
appr
)
{
//eq. (12)
for
(
i
=
0
;
i
<
listSize
;
i
++
)
{
// bitValue=0
...
...
@@ -263,22 +243,23 @@ void updatePathMetric2(decoder_list_t **dlist, uint8_t listSize, uint16_t row, u
}
}
#define updatePathMetric2_int8_A(dlist,i,listSize,row) {dlist[i+listSize]->pathMetric = dlist[i]->pathMetric;if (dlist[i]->llr[0][row]<0) dlist[i]->pathMetric-=dlist[i]->llr[0][row];else dlist[i+listSize]->pathMetric += dlist[i]->llr[0][row];}
void
updatePathMetric2_int8
(
decoder_list_int8_t
**
dlist
,
uint8_t
listSize
,
uint16_t
row
)
{
int
i
;
for
(
i
=
0
;
i
<
listSize
;
i
++
)
dlist
[
i
+
listSize
]
->
pathMetric
=
dlist
[
i
]
->
pathMetric
;
decoder_list_int8_t
**
dlist2
=
&
dlist
[
listSize
];
for
(
i
=
0
;
i
<
listSize
;
i
++
)
{
#ifdef SHOWCOMP
printf
(
"updating path_metric from information bit (%d,%d)
\n
"
,
row
,
0
);
printf
(
"updatePathMetric2_int8_A(dlist,%d,%d,%d);
\n
"
,
i
,
listSize
,
row
);
#endif
for
(
i
=
0
;
i
<
listSize
;
i
++
)
{
// bitValue=0
if
(
dlist
[
i
]
->
llr
[
0
][
row
]
<
0
)
dlist
[
i
]
->
pathMetric
-=
dlist
[
i
]
->
llr
[
0
][
row
];
// bitValue=1
else
dlist2
[
i
]
->
pathMetric
+=
dlist
[
i
]
->
llr
[
0
][
row
];
updatePathMetric2_int8_A
(
dlist
,
i
,
listSize
,
row
);
// dlist[i+listSize]->pathMetric = dlist[i]->pathMetric;
//if (dlist[i]->llr[0][row]<0) dlist[i]->pathMetric -= dlist[i]->llr[0][row];
//else dlist[i+listSize]->pathMetric += dlist[i]->llr[0][row];
}
}
...
...
@@ -301,20 +282,32 @@ void updateCrcChecksum2(decoder_list_t **dlist, uint8_t **crcGen,
}
}
#define updateCrcChecksum_int8_A(dlist,i,crcGen,i2,len) {for (uint8_t j = 0; j < len; j++) dlist[i]->crcChecksum[j] = (dlist[i]->crcChecksum[j]^crcGen[i2][j]);}
void
updateCrcChecksum_int8
(
decoder_list_int8_t
**
dlist
,
uint8_t
**
crcGen
,
uint8_t
listSize
,
uint32_t
i2
,
uint8_t
len
)
{
for
(
uint8_t
i
=
0
;
i
<
listSize
;
i
++
)
{
for
(
uint8_t
j
=
0
;
j
<
len
;
j
++
)
{
dlist
[
i
]
->
crcChecksum
[
j
]
=
(
(
dlist
[
i
]
->
crcChecksum
[
j
]
+
crcGen
[
i2
][
j
])
%
2
);
}
#ifdef SHOWCOMP
printf
(
"updateCrcChecksum_int8_A(dlist,%d,crcGen,%d,%d);
\n
"
,
i
,
i2
,
len
);
#endif
updateCrcChecksum_int8_A
(
dlist
,
i
,
crcGen
,
i2
,
len
);
// for (uint8_t j = 0; j < len; j++) {
// dlist[i]->crcChecksum[j] = ( (dlist[i]->crcChecksum[j] + crcGen[i2][j]) % 2 );
// }
}
}
#define updateCrcChecksum2_int8_A(dlist,i,listSize,crcGen,i2,len) {for (uint8_t j = 0; j < len; j++) dlist[i+listSize]->crcChecksum[j]=dlist[i]->crcChecksum[j]^crcGen[i2][j];}
void
updateCrcChecksum2_int8
(
decoder_list_int8_t
**
dlist
,
uint8_t
**
crcGen
,
uint8_t
listSize
,
uint32_t
i2
,
uint8_t
len
)
{
for
(
uint8_t
i
=
0
;
i
<
listSize
;
i
++
)
{
for
(
uint8_t
j
=
0
;
j
<
len
;
j
++
)
{
dlist
[
i
+
listSize
]
->
crcChecksum
[
j
]
=
(
(
dlist
[
i
]
->
crcChecksum
[
j
]
+
crcGen
[
i2
][
j
])
%
2
);
}
#ifdef SHOWCOMP
printf
(
"updateCrcChecksum2_int8_A(dlist,%d,%d,crcGen,%d,%d);
\n
"
,
i
,
listSize
,
i2
,
len
);
#endif
updateCrcChecksum2_int8_A
(
dlist
,
i
,
listSize
,
crcGen
,
i2
,
len
);
// for (uint8_t j = 0; j < len; j++) {
// dlist[i+listSize]->crcChecksum[j] = ( (dlist[i]->crcChecksum[j] + crcGen[i2][j]) % 2 );
// }
}
}
This diff is collapsed.
Click to expand it.
openair1/PHY/CODING/nrPolar_tools/nr_polar_defs.h
View file @
59c4ddef
...
...
@@ -147,8 +147,8 @@ typedef struct decoder_list_s {
typedef
struct
decoder_list_int8_s
{
uint8_t
bit
[
1
+
nmax
][
Nmax
];
int16_t
llr
[
1
+
nmax
][
Nmax
];
uint8_t
bit
[
1
+
nmax
][
Nmax
]
__attribute__
((
aligned
(
32
)))
;
int16_t
llr
[
1
+
nmax
][
Nmax
]
__attribute__
((
aligned
(
32
)))
;
uint8_t
crcChecksum
[
24
];
int32_t
pathMetric
;
...
...
This diff is collapsed.
Click to expand it.
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