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
canghaiwuhen
OpenXG-RAN
Commits
1a5efc74
Commit
1a5efc74
authored
Oct 11, 2019
by
Francesco Mani
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'ldpc-endian' into nr-coreset-bug-fix
parents
7e3d2cc0
2109c768
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
25 additions
and
14 deletions
+25
-14
openair1/PHY/CODING/TESTBENCH/ldpctest.c
openair1/PHY/CODING/TESTBENCH/ldpctest.c
+2
-2
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h
+17
-6
openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c
openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c
+5
-5
openair1/PHY/CODING/nrLDPC_encoder/ldpc_generate_coefficient.c
...ir1/PHY/CODING/nrLDPC_encoder/ldpc_generate_coefficient.c
+1
-1
No files found.
openair1/PHY/CODING/TESTBENCH/ldpctest.c
View file @
1a5efc74
...
@@ -362,7 +362,7 @@ int test_ldpc(short No_iteration,
...
@@ -362,7 +362,7 @@ int test_ldpc(short No_iteration,
printf
(
"
\n
e %d..%d: "
,
i
,
i
+
15
);
printf
(
"
\n
e %d..%d: "
,
i
,
i
+
15
);
#endif
#endif
if
(
channel_input
[
j
][
i
-
2
*
Zc
]
==
0
)
if
(
channel_input
_optim
[
j
][
i
-
2
*
Zc
]
==
0
)
modulated_input
[
j
][
i
]
=
1
.
0
;
///sqrt(2); //QPSK
modulated_input
[
j
][
i
]
=
1
.
0
;
///sqrt(2); //QPSK
else
else
modulated_input
[
j
][
i
]
=-
1
.
0
;
///sqrt(2);
modulated_input
[
j
][
i
]
=-
1
.
0
;
///sqrt(2);
...
@@ -386,7 +386,7 @@ int test_ldpc(short No_iteration,
...
@@ -386,7 +386,7 @@ int test_ldpc(short No_iteration,
else
else
channel_output_uncoded
[
j
][
i
]
=
0
;
channel_output_uncoded
[
j
][
i
]
=
0
;
if
(
channel_output_uncoded
[
j
][
i
]
!=
channel_input
[
j
][
i
-
2
*
Zc
])
if
(
channel_output_uncoded
[
j
][
i
]
!=
channel_input
_optim
[
j
][
i
-
2
*
Zc
])
*
errors_bit_uncoded
=
(
*
errors_bit_uncoded
)
+
1
;
*
errors_bit_uncoded
=
(
*
errors_bit_uncoded
)
+
1
;
}
}
...
...
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h
View file @
1a5efc74
...
@@ -47,7 +47,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
...
@@ -47,7 +47,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
int8_t
*
bnProcBufRes
=
p_procBuf
->
bnProcBufRes
;
int8_t
*
bnProcBufRes
=
p_procBuf
->
bnProcBufRes
;
int8_t
*
llrRes
=
p_procBuf
->
llrRes
;
int8_t
*
llrRes
=
p_procBuf
->
llrRes
;
int8_t
*
llrProcBuf
=
p_procBuf
->
llrProcBuf
;
int8_t
*
llrProcBuf
=
p_procBuf
->
llrProcBuf
;
__m128i
*
p_bnProcBuf
;
__m128i
*
p_bnProcBuf
;
__m256i
*
p_bnProcBufRes
;
__m256i
*
p_bnProcBufRes
;
__m128i
*
p_llrProcBuf
;
__m128i
*
p_llrProcBuf
;
...
@@ -1693,7 +1693,7 @@ static inline void nrLDPC_bnProc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBu
...
@@ -1693,7 +1693,7 @@ static inline void nrLDPC_bnProc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBu
int8_t
*
bnProcBuf
=
p_procBuf
->
bnProcBuf
;
int8_t
*
bnProcBuf
=
p_procBuf
->
bnProcBuf
;
int8_t
*
bnProcBufRes
=
p_procBuf
->
bnProcBufRes
;
int8_t
*
bnProcBufRes
=
p_procBuf
->
bnProcBufRes
;
int8_t
*
llrRes
=
p_procBuf
->
llrRes
;
int8_t
*
llrRes
=
p_procBuf
->
llrRes
;
__m256i
*
p_bnProcBuf
;
__m256i
*
p_bnProcBuf
;
__m256i
*
p_bnProcBufRes
;
__m256i
*
p_bnProcBufRes
;
__m256i
*
p_llrRes
;
__m256i
*
p_llrRes
;
...
@@ -2775,24 +2775,35 @@ static inline void nrLDPC_llr2bit(int8_t* out, int8_t* llrOut, uint16_t numLLR)
...
@@ -2775,24 +2775,35 @@ static inline void nrLDPC_llr2bit(int8_t* out, int8_t* llrOut, uint16_t numLLR)
}
}
/**
/**
\brief Performs hard-decision on output LLRs and packs the output in 32 bit values.
\brief Performs hard-decision on output LLRs and packs the output in byte aligned output according to TS 38.321 Section 6.1.1.
i = 0,1,2,...
IN[i] : a0, a1, a2, ..., a_{A-1}
OUT[i]: a7,a6,a5,a4,a3,a2,a1,a0|a15,14,...,a8|a23,a22,...,a16|a31,a30,...,a24|...
\param out Pointer hard-decision output, every int8_t contains 8 bits
\param out Pointer hard-decision output, every int8_t contains 8 bits
\param llrOut Pointer to output LLRs
\param llrOut Pointer to output LLRs
\param numLLR Number of LLRs
\param numLLR Number of LLRs
*/
*/
static
inline
void
nrLDPC_llr2bitPacked
(
int8_t
*
out
,
int8_t
*
llrOut
,
uint16_t
numLLR
)
static
inline
void
nrLDPC_llr2bitPacked
(
int8_t
*
out
,
int8_t
*
llrOut
,
uint16_t
numLLR
)
{
{
/** Vector of indices for shuffling input */
const
uint8_t
constShuffle_256_epi8
[
32
]
__attribute__
((
aligned
(
32
)))
=
{
7
,
6
,
5
,
4
,
3
,
2
,
1
,
0
,
15
,
14
,
13
,
12
,
11
,
10
,
9
,
8
,
7
,
6
,
5
,
4
,
3
,
2
,
1
,
0
,
15
,
14
,
13
,
12
,
11
,
10
,
9
,
8
};
__m256i
*
p_llrOut
=
(
__m256i
*
)
llrOut
;
__m256i
*
p_llrOut
=
(
__m256i
*
)
llrOut
;
uint32_t
*
p_bits
=
(
uint32_t
*
)
out
;
uint32_t
*
p_bits
=
(
uint32_t
*
)
out
;
__m256i
inPerm
;
int8_t
*
p_llrOut8
;
int8_t
*
p_llrOut8
;
uint32_t
bitsTmp
=
0
;
uint32_t
bitsTmp
=
0
;
uint32_t
i
;
uint32_t
i
;
uint32_t
M
=
numLLR
>>
5
;
uint32_t
M
=
numLLR
>>
5
;
uint32_t
Mr
=
numLLR
&
31
;
uint32_t
Mr
=
numLLR
&
31
;
const
__m256i
*
p_shuffle
=
(
__m256i
*
)
constShuffle_256_epi8
;
for
(
i
=
0
;
i
<
M
;
i
++
)
for
(
i
=
0
;
i
<
M
;
i
++
)
{
{
*
p_bits
++
=
_mm256_movemask_epi8
(
*
p_llrOut
);
// Move LSB to MSB on 8 bits
inPerm
=
_mm256_shuffle_epi8
(
*
p_llrOut
,
*
p_shuffle
);
// Hard decision
*
p_bits
++
=
_mm256_movemask_epi8
(
inPerm
);
p_llrOut
++
;
p_llrOut
++
;
}
}
...
@@ -2805,11 +2816,11 @@ static inline void nrLDPC_llr2bitPacked(int8_t* out, int8_t* llrOut, uint16_t nu
...
@@ -2805,11 +2816,11 @@ static inline void nrLDPC_llr2bitPacked(int8_t* out, int8_t* llrOut, uint16_t nu
{
{
if
(
p_llrOut8
[
i
]
<
0
)
if
(
p_llrOut8
[
i
]
<
0
)
{
{
bitsTmp
|=
(
1
<<
i
);
bitsTmp
|=
(
1
<<
((
7
-
i
)
+
(
16
*
(
i
/
8
)))
);
}
}
else
else
{
{
bitsTmp
&=
(
0
<<
i
);
bitsTmp
|=
(
0
<<
((
7
-
i
)
+
(
16
*
(
i
/
8
)))
);
}
}
}
}
}
}
...
...
openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c
View file @
1a5efc74
...
@@ -273,7 +273,7 @@ int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,sh
...
@@ -273,7 +273,7 @@ int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,sh
if
(
tinput
!=
NULL
)
start_meas
(
tinput
);
if
(
tinput
!=
NULL
)
start_meas
(
tinput
);
for
(
i
=
0
;
i
<
block_length
;
i
++
)
{
for
(
i
=
0
;
i
<
block_length
;
i
++
)
{
c
[
i
]
=
(
test_input
[
i
/
8
]
&
(
128
>>
(
i
&
7
)))
>>
(
i
&
7
);
c
[
i
]
=
(
test_input
[
i
/
8
]
&
(
128
>>
(
i
&
7
)))
>>
(
7
-
(
i
&
7
)
);
//printf("c(%d,%d)=%d\n",j,i,temp);
//printf("c(%d,%d)=%d\n",j,i,temp);
}
}
...
@@ -330,7 +330,7 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i
...
@@ -330,7 +330,7 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i
#ifdef __AVX2__
#ifdef __AVX2__
__m256i
shufmask
=
_mm256_set_epi64x
(
0x0303030303030303
,
0x0202020202020202
,
0x0101010101010101
,
0x0000000000000000
);
__m256i
shufmask
=
_mm256_set_epi64x
(
0x0303030303030303
,
0x0202020202020202
,
0x0101010101010101
,
0x0000000000000000
);
__m256i
andmask
=
_mm256_set1_epi64x
(
0x
8040201008040201
);
// every 8 bits -> 8 bytes, pattern repeats.
__m256i
andmask
=
_mm256_set1_epi64x
(
0x
0102040810204080
);
// every 8 bits -> 8 bytes, pattern repeats.
__m256i
zero256
=
_mm256_setzero_si256
();
__m256i
zero256
=
_mm256_setzero_si256
();
__m256i
masks
[
8
];
__m256i
masks
[
8
];
register
__m256i
c256
;
register
__m256i
c256
;
...
@@ -413,7 +413,7 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i
...
@@ -413,7 +413,7 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i
for (i=0; i<block_length; i++) {
for (i=0; i<block_length; i++) {
for (j=0; j<n_segments; j++) {
for (j=0; j<n_segments; j++) {
temp = (test_input[j][i/8]&(1
<<(i&7)))>>(i&7
);
temp = (test_input[j][i/8]&(1
28>>(i&7)))>>(7-(i&7)
);
//printf("c(%d,%d)=%d\n",j,i,temp);
//printf("c(%d,%d)=%d\n",j,i,temp);
c[i] |= (temp << j);
c[i] |= (temp << j);
}
}
...
@@ -431,7 +431,7 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i
...
@@ -431,7 +431,7 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i
for
(
i
=
(
block_length
>>
5
)
<<
5
;
i
<
block_length
;
i
++
)
{
for
(
i
=
(
block_length
>>
5
)
<<
5
;
i
<
block_length
;
i
++
)
{
for
(
j
=
0
;
j
<
n_segments
;
j
++
)
{
for
(
j
=
0
;
j
<
n_segments
;
j
++
)
{
temp
=
(
test_input
[
j
][
i
/
8
]
&
(
128
>>
(
i
&
7
)))
>>
(
i
&
7
);
temp
=
(
test_input
[
j
][
i
/
8
]
&
(
128
>>
(
i
&
7
)))
>>
(
7
-
(
i
&
7
)
);
//printf("c(%d,%d)=%d\n",j,i,temp);
//printf("c(%d,%d)=%d\n",j,i,temp);
c
[
i
]
|=
(
temp
<<
j
);
c
[
i
]
|=
(
temp
<<
j
);
}
}
...
@@ -639,7 +639,7 @@ int ldpc_encoder_optim_8seg_multi(unsigned char **test_input,unsigned char **cha
...
@@ -639,7 +639,7 @@ int ldpc_encoder_optim_8seg_multi(unsigned char **test_input,unsigned char **cha
//for (j=0; j<n_segments; j++) {
//for (j=0; j<n_segments; j++) {
for
(
j
=
macro_segment
;
j
<
macro_segment_end
;
j
++
)
{
for
(
j
=
macro_segment
;
j
<
macro_segment_end
;
j
++
)
{
temp
=
(
test_input
[
j
][
i
/
8
]
&
(
128
>>
(
i
&
7
)))
>>
(
i
&
7
);
temp
=
(
test_input
[
j
][
i
/
8
]
&
(
128
>>
(
i
&
7
)))
>>
(
7
-
(
i
&
7
)
);
//printf("c(%d,%d)=%d\n",j,i,temp);
//printf("c(%d,%d)=%d\n",j,i,temp);
c
[
i
]
|=
(
temp
<<
(
j
-
macro_segment
));
c
[
i
]
|=
(
temp
<<
(
j
-
macro_segment
));
}
}
...
...
openair1/PHY/CODING/nrLDPC_encoder/ldpc_generate_coefficient.c
View file @
1a5efc74
...
@@ -460,7 +460,7 @@ int ldpc_encoder_orig(unsigned char *test_input,unsigned char *channel_input,sho
...
@@ -460,7 +460,7 @@ int ldpc_encoder_orig(unsigned char *test_input,unsigned char *channel_input,sho
{
{
//c[i] = test_input[i/8]<<(i%8);
//c[i] = test_input[i/8]<<(i%8);
//c[i]=c[i]>>7&1;
//c[i]=c[i]>>7&1;
c
[
i
]
=
(
test_input
[
i
/
8
]
&
(
1
<<
(
i
&
7
)))
>>
(
i
&
7
);
c
[
i
]
=
(
test_input
[
i
/
8
]
&
(
1
28
>>
(
i
&
7
)))
>>
(
7
-
(
i
&
7
)
);
}
}
// parity check part
// parity check part
...
...
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