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
spbro
OpenXG-RAN
Commits
8e92df78
Commit
8e92df78
authored
Jun 16, 2024
by
Laurent THOMAS
Committed by
Robert Schmidt
Jul 30, 2024
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Use gold cache in PUCCH decoding
parent
803b0289
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
39 additions
and
64 deletions
+39
-64
openair1/PHY/NR_TRANSPORT/pucch_rx.c
openair1/PHY/NR_TRANSPORT/pucch_rx.c
+13
-19
openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
+26
-45
No files found.
openair1/PHY/NR_TRANSPORT/pucch_rx.c
View file @
8e92df78
...
@@ -43,7 +43,6 @@
...
@@ -43,7 +43,6 @@
#include "PHY/sse_intrin.h"
#include "PHY/sse_intrin.h"
#include "PHY/NR_UE_TRANSPORT/pucch_nr.h"
#include "PHY/NR_UE_TRANSPORT/pucch_nr.h"
#include <openair1/PHY/CODING/nrSmallBlock/nr_small_block_defs.h>
#include <openair1/PHY/CODING/nrSmallBlock/nr_small_block_defs.h>
#include "openair1/PHY/LTE_TRANSPORT/transport_proto.h" // for lte_gold_generic()
#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
#include "PHY/NR_REFSIG/nr_refsig.h"
#include "PHY/NR_REFSIG/nr_refsig.h"
...
@@ -1146,26 +1145,21 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
...
@@ -1146,26 +1145,21 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
// first compute DMRS component
// first compute DMRS component
uint32_t
x1
=
0
,
x2
=
0
,
sGold
=
0
;
uint8_t
*
sGold8
=
(
uint8_t
*
)
&
sGold
;
const
int
scramble
=
pucch_pdu
->
dmrs_scrambling_id
*
2
;
const
int
scramble
=
pucch_pdu
->
dmrs_scrambling_id
*
2
;
// fixme: when MR2754 will be merged, use the gold sequence cache instead of regenerate each time
// fixme: when MR2754 will be merged, use the gold sequence cache instead of regenerate each time
x2
=
((
1ULL
<<
17
)
*
((
NR_NUMBER_OF_SYMBOLS_PER_SLOT
*
slot
+
pucch_pdu
->
start_symbol_index
+
symb
+
1
)
*
(
scramble
+
1
))
uint32_t
x2
=
+
scramble
)
((
1ULL
<<
17
)
*
((
NR_NUMBER_OF_SYMBOLS_PER_SLOT
*
slot
+
pucch_pdu
->
start_symbol_index
+
symb
+
1
)
*
(
scramble
+
1
))
%
(
1U
<<
31
);
// c_init calculation according to TS38.211 subclause
+
scramble
)
%
(
1U
<<
31
);
// c_init calculation according to TS38.211 subclause
#ifdef DEBUG_NR_PUCCH_RX
#ifdef DEBUG_NR_PUCCH_RX
printf
(
"slot %d, start_symbol_index %d, symbol %d, dmrs_scrambling_id %d
\n
"
,
printf
(
"slot %d, start_symbol_index %d, symbol %d, dmrs_scrambling_id %d
\n
"
,
slot
,
pucch_pdu
->
start_symbol_index
,
symb
,
pucch_pdu
->
dmrs_scrambling_id
);
slot
,
pucch_pdu
->
start_symbol_index
,
symb
,
pucch_pdu
->
dmrs_scrambling_id
);
#endif
#endif
int
reset
=
1
;
uint32_t
*
sGold
=
gold_cache
(
x2
,
pucch_pdu
->
prb_start
/
4
+
ngroup
/
2
);
for
(
int
i
=
0
;
i
<=
(
pucch_pdu
->
prb_start
>>
2
);
i
++
)
{
for
(
int
group
=
0
,
goldIdx
=
pucch_pdu
->
prb_start
/
4
;
group
<
ngroup
;
group
++
)
{
sGold
=
lte_gold_generic
(
&
x1
,
&
x2
,
reset
);
reset
=
0
;
}
for
(
int
group
=
0
;
group
<
ngroup
;
group
++
)
{
// each group has 8*nc_group_size elements, compute 1 complex correlation with DMRS per group
// each group has 8*nc_group_size elements, compute 1 complex correlation with DMRS per group
// non-coherent combining across groups
// non-coherent combining across groups
uint8_t
*
sGold8
=
(
uint8_t
*
)
&
sGold
[
goldIdx
];
simde__m64
dmrs_re
=
byte2m64_re
[
sGold8
[(
group
&
1
)
<<
1
]];
simde__m64
dmrs_re
=
byte2m64_re
[
sGold8
[(
group
&
1
)
<<
1
]];
int16_t
*
dmrs_re16
=
(
int16_t
*
)
&
dmrs_re
;
int16_t
*
dmrs_re16
=
(
int16_t
*
)
&
dmrs_re
;
simde__m64
dmrs_im
=
byte2m64_im
[
sGold8
[(
group
&
1
)
<<
1
]];
simde__m64
dmrs_im
=
byte2m64_im
[
sGold8
[(
group
&
1
)
<<
1
]];
...
@@ -1238,22 +1232,22 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
...
@@ -1238,22 +1232,22 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
}
//aa
}
//aa
if
((
group
&
1
)
==
1
)
if
((
group
&
1
)
==
1
)
sGold
=
lte_gold_generic
(
&
x1
,
&
x2
,
0
)
;
goldIdx
++
;
}
// group
}
// group
}
// symb
}
// symb
uint32_t
x1
,
x2
,
sGold
=
0
;
// unscrambling
// unscrambling
x2
=
((
pucch_pdu
->
rnti
)
<<
15
)
+
pucch_pdu
->
data_scrambling_id
;
uint32_t
x2
=
((
pucch_pdu
->
rnti
)
<<
15
)
+
pucch_pdu
->
data_scrambling_id
;
sGold
=
lte_gold_generic
(
&
x1
,
&
x2
,
1
);
uint8_t
*
sGold8
=
(
uint8_t
*
)
&
sGold
;
#ifdef DEBUG_NR_PUCCH_RX
#ifdef DEBUG_NR_PUCCH_RX
printf
(
"x2 %x
\n
"
,
x2
);
printf
(
"x2 %x
\n
"
,
x2
);
#endif
#endif
uint32_t
*
sGold
=
gold_cache
(
x2
,
pucch_pdu
->
nr_of_symbols
*
prb_size_ext
/
2
);
int
goldIdx
=
0
;
for
(
int
symb
=
0
;
symb
<
pucch_pdu
->
nr_of_symbols
;
symb
++
)
{
for
(
int
symb
=
0
;
symb
<
pucch_pdu
->
nr_of_symbols
;
symb
++
)
{
simde__m64
c_re
[
4
],
c_im
[
4
];
simde__m64
c_re
[
4
],
c_im
[
4
];
int
re_off
=
0
;
int
re_off
=
0
;
for
(
int
prb
=
0
;
prb
<
prb_size_ext
;
prb
+=
2
,
re_off
+=
16
)
{
for
(
int
prb
=
0
;
prb
<
prb_size_ext
;
prb
+=
2
,
re_off
+=
16
)
{
uint8_t
*
sGold8
=
(
uint8_t
*
)(
sGold
+
goldIdx
);
for
(
int
z
=
0
;
z
<
4
;
z
++
)
{
for
(
int
z
=
0
;
z
<
4
;
z
++
)
{
c_re
[
z
]
=
byte2m64_re
[
sGold8
[
z
]];
c_re
[
z
]
=
byte2m64_re
[
sGold8
[
z
]];
c_im
[
z
]
=
byte2m64_im
[
sGold8
[
z
]];
c_im
[
z
]
=
byte2m64_im
[
sGold8
[
z
]];
...
@@ -1333,7 +1327,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
...
@@ -1333,7 +1327,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
r_re_ext
[
aa
][
symb
][
re_off
+
15
],
r_im_ext
[
aa
][
symb
][
re_off
+
15
]);
r_re_ext
[
aa
][
symb
][
re_off
+
15
],
r_im_ext
[
aa
][
symb
][
re_off
+
15
]);
#endif
#endif
}
}
sGold
=
lte_gold_generic
(
&
x1
,
&
x2
,
0
)
;
goldIdx
++
;
#ifdef DEBUG_NR_PUCCH_RX
#ifdef DEBUG_NR_PUCCH_RX
printf
(
"
\n
"
);
printf
(
"
\n
"
);
#endif
#endif
...
...
openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
View file @
8e92df78
...
@@ -40,6 +40,7 @@
...
@@ -40,6 +40,7 @@
#include <openair1/PHY/CODING/nrSmallBlock/nr_small_block_defs.h>
#include <openair1/PHY/CODING/nrSmallBlock/nr_small_block_defs.h>
#include "common/utils/LOG/log.h"
#include "common/utils/LOG/log.h"
#include "common/utils/LOG/vcd_signal_dumper.h"
#include "common/utils/LOG/vcd_signal_dumper.h"
#include "openair1/PHY/NR_REFSIG/nr_refsig.h"
#include "T.h"
#include "T.h"
//#define NR_UNIT_TEST 1
//#define NR_UNIT_TEST 1
...
@@ -484,46 +485,32 @@ void nr_generate_pucch1(const PHY_VARS_NR_UE *ue,
...
@@ -484,46 +485,32 @@ void nr_generate_pucch1(const PHY_VARS_NR_UE *ue,
}
}
}
}
static
inline
void
nr_pucch2_3_4_scrambling
(
uint16_t
M_bit
,
uint16_t
rnti
,
uint16_t
n_id
,
uint64_t
*
B64
,
uint8_t
*
btilde
)
{
static
inline
void
nr_pucch2_3_4_scrambling
(
uint16_t
M_bit
,
uint16_t
rnti
,
uint16_t
n_id
,
uint64_t
*
B64
,
uint8_t
*
btilde
)
uint32_t
x1
=
0
,
x2
=
0
,
s
=
0
;
{
int
i
;
uint8_t
c
;
// c_init=nRNTI*2^15+n_id according to TS 38.211 Subclause 6.3.2.6.1
// c_init=nRNTI*2^15+n_id according to TS 38.211 Subclause 6.3.2.6.1
//x2 = (rnti) + ((uint32_t)(1+nr_slot_tx)<<16)*(1+(fp->Nid_cell<<1))
;
const
int
roundedSz
=
(
M_bit
+
31
)
/
32
;
x2
=
((
rnti
)
<<
15
)
+
n_id
;
uint32_t
*
seq
=
gold_cache
((
rnti
<<
15
)
+
n_id
,
roundedSz
)
;
#ifdef DEBUG_NR_PUCCH_TX
#ifdef DEBUG_NR_PUCCH_TX
printf
(
"
\t\t
[nr_pucch2_3_4_scrambling] gold sequence s=%x, M_bit %d
\n
"
,
s
,
M_bit
);
printf
(
"
\t\t
[nr_pucch2_3_4_scrambling] gold sequence s=%x, M_bit %d
\n
"
,
s
,
M_bit
);
#endif
#endif
uint8_t
*
btildep
=
btilde
;
uint8_t
*
btildep
=
btilde
;
int
M_bit2
=
M_bit
>
31
?
32
:
(
M_bit
&
31
),
M_bit3
=
M_bit
;
uint32_t
*
B32
=
(
uint32_t
*
)
B64
;
uint32_t
B
;
for
(
int
iprime
=
0
;
iprime
<=
(
M_bit
>>
5
);
iprime
++
,
btildep
+=
32
)
{
for
(
int
iprime
=
0
;
iprime
<
roundedSz
;
iprime
++
,
btildep
+=
32
)
{
s
=
lte_gold_generic
(
&
x1
,
&
x2
,
(
iprime
==
0
)
?
1
:
0
);
const
uint32_t
s
=
seq
[
iprime
];
B
=
((
uint32_t
*
)
B64
)[
iprime
];
const
uint32_t
B
=
B32
[
iprime
];
for
(
int
n
=
0
;
n
<
M_bit2
;
n
+=
8
)
LOG_D
(
PHY
,
"PUCCH2 encoded: %02x
\n
"
,
B
);
LOG_D
(
PHY
,
"PUCCH2 encoded %d : %d,%d,%d,%d,%d,%d,%d,%d
\n
"
,
n
,
int
M_bit2
=
iprime
==
M_bit
/
32
?
M_bit
%
32
:
32
;
(
B
>>
n
)
&
1
,
for
(
int
i
=
0
;
i
<
M_bit2
;
i
++
)
{
(
B
>>
(
n
+
1
))
&
1
,
uint8_t
c
=
(
uint8_t
)((
s
>>
i
)
&
1
);
(
B
>>
(
n
+
2
))
&
1
,
(
B
>>
(
n
+
3
))
&
1
,
(
B
>>
(
n
+
4
))
&
1
,
(
B
>>
(
n
+
5
))
&
1
,
(
B
>>
(
n
+
6
))
&
1
,
(
B
>>
(
n
+
7
))
&
1
);
for
(
i
=
0
;
i
<
M_bit2
;
i
++
)
{
c
=
(
uint8_t
)((
s
>>
i
)
&
1
);
btildep
[
i
]
=
(((
B
>>
i
)
&
1
)
^
c
);
btildep
[
i
]
=
(((
B
>>
i
)
&
1
)
^
c
);
#ifdef DEBUG_NR_PUCCH_TX
#ifdef DEBUG_NR_PUCCH_TX
printf
(
"
\t\t\t
btilde[%d]=%x from unscrambled bit %d and scrambling %d (%x)
\n
"
,
i
+
(
iprime
<<
5
),
btilde
[
i
],((
B
>>
i
)
&
1
),
c
,
s
>>
i
);
printf
(
"
\t\t\t
btilde[%d]=%x from unscrambled bit %d and scrambling %d (%x)
\n
"
,
i
+
(
iprime
<<
5
),
btilde
[
i
],((
B
>>
i
)
&
1
),
c
,
s
>>
i
);
#endif
#endif
}
}
M_bit3
-=
32
;
M_bit2
=
M_bit3
>
31
?
32
:
(
M_bit3
&
31
);
}
}
#ifdef DEBUG_NR_PUCCH_TX
#ifdef DEBUG_NR_PUCCH_TX
printf
(
"
\t\t
[nr_pucch2_3_4_scrambling] scrambling M_bit=%d bits
\n
"
,
M_bit
);
printf
(
"
\t\t
[nr_pucch2_3_4_scrambling] scrambling M_bit=%d bits
\n
"
,
M_bit
);
#endif
#endif
...
@@ -721,9 +708,7 @@ void nr_generate_pucch2(const PHY_VARS_NR_UE *ue,
...
@@ -721,9 +708,7 @@ void nr_generate_pucch2(const PHY_VARS_NR_UE *ue,
* Implementing TS 38.211 Subclause 6.3.2.5.3 Mapping to physical resources
* Implementing TS 38.211 Subclause 6.3.2.5.3 Mapping to physical resources
*/
*/
// int32_t *txptr;
// int32_t *txptr;
uint32_t
x1
=
0
,
x2
=
0
,
s
=
0
;
int
outSample
=
0
;
int
i
=
0
;
int
m
=
0
;
uint8_t
startingSymbolIndex
=
pucch_pdu
->
start_symbol_index
;
uint8_t
startingSymbolIndex
=
pucch_pdu
->
start_symbol_index
;
uint16_t
startingPRB
=
pucch_pdu
->
prb_start
+
pucch_pdu
->
bwp_start
;
uint16_t
startingPRB
=
pucch_pdu
->
prb_start
+
pucch_pdu
->
bwp_start
;
...
@@ -732,14 +717,10 @@ void nr_generate_pucch2(const PHY_VARS_NR_UE *ue,
...
@@ -732,14 +717,10 @@ void nr_generate_pucch2(const PHY_VARS_NR_UE *ue,
uint64_t
temp_x2
=
1ll
<<
17
;
uint64_t
temp_x2
=
1ll
<<
17
;
temp_x2
*=
14UL
*
nr_slot_tx
+
l
+
startingSymbolIndex
+
1
;
temp_x2
*=
14UL
*
nr_slot_tx
+
l
+
startingSymbolIndex
+
1
;
temp_x2
*=
2UL
*
pucch_pdu
->
dmrs_scrambling_id
+
1
;
temp_x2
*=
2UL
*
pucch_pdu
->
dmrs_scrambling_id
+
1
;
x2
=
(
temp_x2
+
2UL
*
pucch_pdu
->
dmrs_scrambling_id
)
%
(
1UL
<<
31
);
temp_x2
=
(
temp_x2
+
2ULL
*
pucch_pdu
->
dmrs_scrambling_id
)
%
(
1UL
<<
31
);
uint
idxGold
=
startingPRB
>>
2
;
int
reset
=
1
;
uint32_t
*
seq
=
gold_cache
(
temp_x2
,
idxGold
+
pucch_pdu
->
prb_size
);
for
(
int
ii
=
0
;
ii
<=
(
startingPRB
>>
2
);
ii
++
)
{
int
m
=
0
;
s
=
lte_gold_generic
(
&
x1
,
&
x2
,
reset
);
reset
=
0
;
}
m
=
0
;
for
(
int
rb
=
0
;
rb
<
pucch_pdu
->
prb_size
;
rb
++
)
{
for
(
int
rb
=
0
;
rb
<
pucch_pdu
->
prb_size
;
rb
++
)
{
//startingPRB = startingPRB + rb;
//startingPRB = startingPRB + rb;
const
bool
nb_rb_is_even
=
frame_parms
->
N_RB_DL
&
1
;
const
bool
nb_rb_is_even
=
frame_parms
->
N_RB_DL
&
1
;
...
@@ -773,7 +754,7 @@ void nr_generate_pucch2(const PHY_VARS_NR_UE *ue,
...
@@ -773,7 +754,7 @@ void nr_generate_pucch2(const PHY_VARS_NR_UE *ue,
}
}
if
(
n
%
3
!=
1
)
{
// mapping PUCCH according to TS38.211 subclause 6.3.2.5.3
if
(
n
%
3
!=
1
)
{
// mapping PUCCH according to TS38.211 subclause 6.3.2.5.3
txdataF
[
0
][
re_offset
]
=
d
[
i
+
k
];
txdataF
[
0
][
re_offset
]
=
d
[
outSample
+
k
];
#ifdef DEBUG_NR_PUCCH_TX
#ifdef DEBUG_NR_PUCCH_TX
printf
(
printf
(
"
\t
[nr_generate_pucch2] (n=%d,i=%d) mapping PUCCH to RE
\t
amp=%d
\t
ofdm_symbol_size=%d
\t
N_RB_DL=%d "
"
\t
[nr_generate_pucch2] (n=%d,i=%d) mapping PUCCH to RE
\t
amp=%d
\t
ofdm_symbol_size=%d
\t
N_RB_DL=%d "
...
@@ -795,8 +776,8 @@ void nr_generate_pucch2(const PHY_VARS_NR_UE *ue,
...
@@ -795,8 +776,8 @@ void nr_generate_pucch2(const PHY_VARS_NR_UE *ue,
}
}
if
(
n
%
3
==
1
)
{
// mapping DM-RS signal according to TS38.211 subclause 6.4.1.3.2
if
(
n
%
3
==
1
)
{
// mapping DM-RS signal according to TS38.211 subclause 6.4.1.3.2
txdataF
[
0
][
re_offset
].
r
=
(
int16_t
)(
baseVal
*
(
1
-
(
2
*
((
uint8_t
)((
s
>>
(
2
*
m
))
&
1
)))));
txdataF
[
0
][
re_offset
].
r
=
(
int16_t
)(
baseVal
*
(
1
-
(
2
*
((
uint8_t
)((
s
eq
[
idxGold
]
>>
(
2
*
m
))
&
1
)))));
txdataF
[
0
][
re_offset
].
i
=
(
int16_t
)(
baseVal
*
(
1
-
(
2
*
((
uint8_t
)((
s
>>
(
2
*
m
+
1
))
&
1
)))));
txdataF
[
0
][
re_offset
].
i
=
(
int16_t
)(
baseVal
*
(
1
-
(
2
*
((
uint8_t
)((
s
eq
[
idxGold
]
>>
(
2
*
m
+
1
))
&
1
)))));
m
++
;
m
++
;
#ifdef DEBUG_NR_PUCCH_TX
#ifdef DEBUG_NR_PUCCH_TX
printf
(
printf
(
...
@@ -821,10 +802,10 @@ void nr_generate_pucch2(const PHY_VARS_NR_UE *ue,
...
@@ -821,10 +802,10 @@ void nr_generate_pucch2(const PHY_VARS_NR_UE *ue,
re_offset
++
;
re_offset
++
;
}
}
i
+=
8
;
outSample
+=
8
;
if
(
(
m
&
((
1
<<
4
)
-
1
))
==
0
)
{
if
(
m
%
16
==
0
)
{
s
=
lte_gold_generic
(
&
x1
,
&
x2
,
0
)
;
idxGold
++
;
m
=
0
;
m
=
0
;
}
}
}
}
...
...
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