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
ec40b34b
Commit
ec40b34b
authored
Aug 16, 2024
by
francescomani
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
initial cleanup
parent
9126e3dd
Changes
3
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
64 additions
and
312 deletions
+64
-312
openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c
openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c
+60
-88
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c
+4
-188
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+0
-36
No files found.
openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c
View file @
ec40b34b
This diff is collapsed.
Click to expand it.
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c
View file @
ec40b34b
...
...
@@ -36,6 +36,10 @@
#include "PHY/TOOLS/tools_defs.h"
#include "PHY/sse_intrin.h"
#ifdef __aarch64__
#define USE_128BIT
#endif
//#define DEBUG_LLR_SIC
//==============================================================================================
...
...
@@ -323,191 +327,3 @@ void nr_dlsch_256qam_llr(NR_DL_FRAME_PARMS *frame_parms,
simde_m_empty
();
}
//==============================================================================================
// DUAL-STREAM
//==============================================================================================
//----------------------------------------------------------------------------------------------
// QPSK
//----------------------------------------------------------------------------------------------
simde__m128i
y0r_over2
__attribute__
((
aligned
(
16
)));
simde__m128i
y0i_over2
__attribute__
((
aligned
(
16
)));
simde__m128i
y1r_over2
__attribute__
((
aligned
(
16
)));
simde__m128i
y1i_over2
__attribute__
((
aligned
(
16
)));
simde__m128i
A
__attribute__
((
aligned
(
16
)));
simde__m128i
B
__attribute__
((
aligned
(
16
)));
simde__m128i
C
__attribute__
((
aligned
(
16
)));
simde__m128i
D
__attribute__
((
aligned
(
16
)));
simde__m128i
E
__attribute__
((
aligned
(
16
)));
simde__m128i
F
__attribute__
((
aligned
(
16
)));
simde__m128i
G
__attribute__
((
aligned
(
16
)));
simde__m128i
H
__attribute__
((
aligned
(
16
)));
void
nr_qpsk_qpsk
(
short
*
stream0_in
,
short
*
stream1_in
,
short
*
stream0_out
,
short
*
rho01
,
int
length
)
{
/*
This function computes the LLRs of stream 0 (s_0) in presence of the interfering stream 1 (s_1) assuming that both symbols are QPSK. It can be used for both MU-MIMO interference-aware receiver or for SU-MIMO receivers.
Parameters:
stream0_in = Matched filter output y0' = (h0*g0)*y0
stream1_in = Matched filter output y1' = (h0*g1)*y0
stream0_out = LLRs
rho01 = Correlation between the two effective channels \rho_{10} = (h1*g1)*(h0*g0)
length = number of resource elements
*/
simde__m128i
*
rho01_128i
=
(
simde__m128i
*
)
rho01
;
simde__m128i
*
stream0_128i_in
=
(
simde__m128i
*
)
stream0_in
;
simde__m128i
*
stream1_128i_in
=
(
simde__m128i
*
)
stream1_in
;
simde__m128i
*
stream0_128i_out
=
(
simde__m128i
*
)
stream0_out
;
simde__m128i
ONE_OVER_SQRT_8
=
simde_mm_set1_epi16
(
23170
);
//round(2^16/sqrt(8))
int
i
;
for
(
i
=
0
;
i
<
length
>>
2
;
i
+=
2
)
{
// in each iteration, we take 8 complex samples
simde__m128i
xmm0
=
rho01_128i
[
i
];
// 4 symbols
simde__m128i
xmm1
=
rho01_128i
[
i
+
1
];
// put (rho_r + rho_i)/2sqrt2 in rho_rpi
// put (rho_r - rho_i)/2sqrt2 in rho_rmi
xmm0
=
simde_mm_shufflelo_epi16
(
xmm0
,
0xd8
);
// SIMDE_MM_SHUFFLE(0,2,1,3));
xmm0
=
simde_mm_shufflehi_epi16
(
xmm0
,
0xd8
);
// SIMDE_MM_SHUFFLE(0,2,1,3));
xmm0
=
simde_mm_shuffle_epi32
(
xmm0
,
0xd8
);
// SIMDE_MM_SHUFFLE(0,2,1,3));
xmm1
=
simde_mm_shufflelo_epi16
(
xmm1
,
0xd8
);
// SIMDE_MM_SHUFFLE(0,2,1,3));
xmm1
=
simde_mm_shufflehi_epi16
(
xmm1
,
0xd8
);
// SIMDE_MM_SHUFFLE(0,2,1,3));
xmm1
=
simde_mm_shuffle_epi32
(
xmm1
,
0xd8
);
// SIMDE_MM_SHUFFLE(0,2,1,3));
//xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
//xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
simde__m128i
xmm2
=
simde_mm_unpacklo_epi64
(
xmm0
,
xmm1
);
// Re(rho)
simde__m128i
xmm3
=
simde_mm_unpackhi_epi64
(
xmm0
,
xmm1
);
// Im(rho)
simde__m128i
rho_rpi
=
simde_mm_adds_epi16
(
xmm2
,
xmm3
);
// rho = Re(rho) + Im(rho)
simde__m128i
rho_rmi
=
simde_mm_subs_epi16
(
xmm2
,
xmm3
);
// rho* = Re(rho) - Im(rho)
// divide by sqrt(8), no shift needed ONE_OVER_SQRT_8 = Q1.16
rho_rpi
=
simde_mm_mulhi_epi16
(
rho_rpi
,
ONE_OVER_SQRT_8
);
rho_rmi
=
simde_mm_mulhi_epi16
(
rho_rmi
,
ONE_OVER_SQRT_8
);
// Compute LLR for first bit of stream 0
// Compute real and imaginary parts of MF output for stream 0
xmm0
=
stream0_128i_in
[
i
];
xmm1
=
stream0_128i_in
[
i
+
1
];
xmm0
=
simde_mm_shufflelo_epi16
(
xmm0
,
0xd8
);
// SIMDE_MM_SHUFFLE(0,2,1,3));
xmm0
=
simde_mm_shufflehi_epi16
(
xmm0
,
0xd8
);
// SIMDE_MM_SHUFFLE(0,2,1,3));
xmm0
=
simde_mm_shuffle_epi32
(
xmm0
,
0xd8
);
// SIMDE_MM_SHUFFLE(0,2,1,3));
xmm1
=
simde_mm_shufflelo_epi16
(
xmm1
,
0xd8
);
// SIMDE_MM_SHUFFLE(0,2,1,3));
xmm1
=
simde_mm_shufflehi_epi16
(
xmm1
,
0xd8
);
// SIMDE_MM_SHUFFLE(0,2,1,3));
xmm1
=
simde_mm_shuffle_epi32
(
xmm1
,
0xd8
);
// SIMDE_MM_SHUFFLE(0,2,1,3));
//xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
//xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
simde__m128i
y0r
=
simde_mm_unpacklo_epi64
(
xmm0
,
xmm1
);
// = [y0r(1),y0r(2),y0r(3),y0r(4)]
simde__m128i
y0i
=
simde_mm_unpackhi_epi64
(
xmm0
,
xmm1
);
simde__m128i
y0r_over2
=
simde_mm_srai_epi16
(
y0r
,
1
);
// divide by 2
simde__m128i
y0i_over2
=
simde_mm_srai_epi16
(
y0i
,
1
);
// divide by 2
// Compute real and imaginary parts of MF output for stream 1
xmm0
=
stream1_128i_in
[
i
];
xmm1
=
stream1_128i_in
[
i
+
1
];
xmm0
=
simde_mm_shufflelo_epi16
(
xmm0
,
0xd8
);
// SIMDE_MM_SHUFFLE(0,2,1,3));
xmm0
=
simde_mm_shufflehi_epi16
(
xmm0
,
0xd8
);
// SIMDE_MM_SHUFFLE(0,2,1,3));
xmm0
=
simde_mm_shuffle_epi32
(
xmm0
,
0xd8
);
// SIMDE_MM_SHUFFLE(0,2,1,3));
xmm1
=
simde_mm_shufflelo_epi16
(
xmm1
,
0xd8
);
// SIMDE_MM_SHUFFLE(0,2,1,3));
xmm1
=
simde_mm_shufflehi_epi16
(
xmm1
,
0xd8
);
// SIMDE_MM_SHUFFLE(0,2,1,3));
xmm1
=
simde_mm_shuffle_epi32
(
xmm1
,
0xd8
);
// SIMDE_MM_SHUFFLE(0,2,1,3));
//xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
//xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
simde__m128i
y1r
=
simde_mm_unpacklo_epi64
(
xmm0
,
xmm1
);
//[y1r(1),y1r(2),y1r(3),y1r(4)]
simde__m128i
y1i
=
simde_mm_unpackhi_epi64
(
xmm0
,
xmm1
);
//[y1i(1),y1i(2),y1i(3),y1i(4)]
simde__m128i
y1r_over2
=
simde_mm_srai_epi16
(
y1r
,
1
);
// divide by 2
simde__m128i
y1i_over2
=
simde_mm_srai_epi16
(
y1i
,
1
);
// divide by 2
// Compute the terms for the LLR of first bit
xmm0
=
simde_mm_setzero_si128
();
// ZERO
// 1 term for numerator of LLR
xmm3
=
simde_mm_subs_epi16
(
y1r_over2
,
rho_rpi
);
A
=
simde_mm_abs_epi16
(
xmm3
);
// A = |y1r/2 - rho/sqrt(8)|
xmm2
=
simde_mm_adds_epi16
(
A
,
y0i_over2
);
// = |y1r/2 - rho/sqrt(8)| + y0i/2
xmm3
=
simde_mm_subs_epi16
(
y1i_over2
,
rho_rmi
);
B
=
simde_mm_abs_epi16
(
xmm3
);
// B = |y1i/2 - rho*/sqrt(8)|
simde__m128i
logmax_num_re0
=
simde_mm_adds_epi16
(
B
,
xmm2
);
// = |y1r/2 - rho/sqrt(8)|+|y1i/2 - rho*/sqrt(8)| + y0i/2
// 2 term for numerator of LLR
xmm3
=
simde_mm_subs_epi16
(
y1r_over2
,
rho_rmi
);
C
=
simde_mm_abs_epi16
(
xmm3
);
// C = |y1r/2 - rho*/4|
xmm2
=
simde_mm_subs_epi16
(
C
,
y0i_over2
);
// = |y1r/2 - rho*/4| - y0i/2
xmm3
=
simde_mm_adds_epi16
(
y1i_over2
,
rho_rpi
);
D
=
simde_mm_abs_epi16
(
xmm3
);
// D = |y1i/2 + rho/4|
xmm2
=
simde_mm_adds_epi16
(
xmm2
,
D
);
// |y1r/2 - rho*/4| + |y1i/2 + rho/4| - y0i/2
logmax_num_re0
=
simde_mm_max_epi16
(
logmax_num_re0
,
xmm2
);
// max, numerator done
// 1 term for denominator of LLR
xmm3
=
simde_mm_adds_epi16
(
y1r_over2
,
rho_rmi
);
E
=
simde_mm_abs_epi16
(
xmm3
);
// E = |y1r/2 + rho*/4|
xmm2
=
simde_mm_adds_epi16
(
E
,
y0i_over2
);
// = |y1r/2 + rho*/4| + y0i/2
xmm3
=
simde_mm_subs_epi16
(
y1i_over2
,
rho_rpi
);
F
=
simde_mm_abs_epi16
(
xmm3
);
// F = |y1i/2 - rho/4|
simde__m128i
logmax_den_re0
=
simde_mm_adds_epi16
(
F
,
xmm2
);
// = |y1r/2 + rho*/4| + |y1i/2 - rho/4| + y0i/2
// 2 term for denominator of LLR
xmm3
=
simde_mm_adds_epi16
(
y1r_over2
,
rho_rpi
);
G
=
simde_mm_abs_epi16
(
xmm3
);
// G = |y1r/2 + rho/4|
xmm2
=
simde_mm_subs_epi16
(
G
,
y0i_over2
);
// = |y1r/2 + rho/4| - y0i/2
xmm3
=
simde_mm_adds_epi16
(
y1i_over2
,
rho_rmi
);
H
=
simde_mm_abs_epi16
(
xmm3
);
// H = |y1i/2 + rho*/4|
xmm2
=
simde_mm_adds_epi16
(
xmm2
,
H
);
// = |y1r/2 + rho/4| + |y1i/2 + rho*/4| - y0i/2
logmax_den_re0
=
simde_mm_max_epi16
(
logmax_den_re0
,
xmm2
);
// max, denominator done
// Compute the terms for the LLR of first bit
// 1 term for nominator of LLR
xmm2
=
simde_mm_adds_epi16
(
A
,
y0r_over2
);
simde__m128i
logmax_num_im0
=
simde_mm_adds_epi16
(
B
,
xmm2
);
// = |y1r/2 - rho/4| + |y1i/2 - rho*/4| + y0r/2
// 2 term for nominator of LLR
xmm2
=
simde_mm_subs_epi16
(
E
,
y0r_over2
);
xmm2
=
simde_mm_adds_epi16
(
xmm2
,
F
);
// = |y1r/2 + rho*/4| + |y1i/2 - rho/4| - y0r/2
logmax_num_im0
=
simde_mm_max_epi16
(
logmax_num_im0
,
xmm2
);
// max, nominator done
// 1 term for denominator of LLR
xmm2
=
simde_mm_adds_epi16
(
C
,
y0r_over2
);
simde__m128i
logmax_den_im0
=
simde_mm_adds_epi16
(
D
,
xmm2
);
// = |y1r/2 - rho*/4| + |y1i/2 + rho/4| - y0r/2
xmm2
=
simde_mm_subs_epi16
(
G
,
y0r_over2
);
xmm2
=
simde_mm_adds_epi16
(
xmm2
,
H
);
// = |y1r/2 + rho/4| + |y1i/2 + rho*/4| - y0r/2
logmax_den_im0
=
simde_mm_max_epi16
(
logmax_den_im0
,
xmm2
);
// max, denominator done
// LLR of first bit [L1(1), L1(2), L1(3), L1(4)]
y0r
=
simde_mm_adds_epi16
(
y0r
,
logmax_num_re0
);
y0r
=
simde_mm_subs_epi16
(
y0r
,
logmax_den_re0
);
// LLR of second bit [L2(1), L2(2), L2(3), L2(4)]
y0i
=
simde_mm_adds_epi16
(
y0i
,
logmax_num_im0
);
y0i
=
simde_mm_subs_epi16
(
y0i
,
logmax_den_im0
);
simde_mm_storeu_si128
(
&
stream0_128i_out
[
i
],
simde_mm_unpacklo_epi16
(
y0r
,
y0i
));
// = [L1(1), L2(1), L1(2), L2(2)]
if
(
i
<
((
length
>>
1
)
-
1
))
// false if only 2 REs remain
simde_mm_storeu_si128
(
&
stream0_128i_out
[
i
+
1
],
simde_mm_unpackhi_epi16
(
y0r
,
y0i
));
}
}
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
View file @
ec40b34b
...
...
@@ -52,42 +52,6 @@
*/
void
nr_ue_dlsch_init
(
NR_UE_DLSCH_t
*
dlsch_list
,
int
num_dlsch
,
uint8_t
max_ldpc_iterations
);
/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream QPSK/QPSK reception.
@param stream0_in Input from channel compensated (MR combined) stream 0
@param stream1_in Input from channel compensated (MR combined) stream 1
@param stream0_out Output from LLR unit for stream0
@param rho01 Cross-correlation between channels (MR combined)
@param length in complex channel outputs*/
void
nr_qpsk_qpsk
(
int16_t
*
stream0_in
,
int16_t
*
stream1_in
,
int16_t
*
stream0_out
,
int16_t
*
rho01
,
int32_t
length
);
/** \brief This function perform LLR computation for dual-stream (QPSK/QPSK) transmission.
@param frame_parms Frame descriptor structure
@param rxdataF_comp Compensated channel output
@param rxdataF_comp_i Compensated channel output for interference
@param rho_i Correlation between channel of signal and inteference
@param dlsch_llr llr output
@param symbol OFDM symbol index in sub-frame
@param len
@param first_symbol_flag flag to indicate this is the first symbol of the dlsch
@param nb_rb number of RBs for this allocation
@param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS
@param llr128p pointer to pointer to symbol in dlsch_llr*/
int32_t
nr_dlsch_qpsk_qpsk_llr
(
NR_DL_FRAME_PARMS
*
frame_parms
,
int32_t
**
rxdataF_comp
,
int32_t
**
rxdataF_comp_i
,
int32_t
**
rho_i
,
int16_t
*
dlsch_llr
,
uint8_t
symbol
,
uint32_t
len
,
uint8_t
first_symbol_flag
,
uint16_t
nb_rb
,
uint16_t
pbch_pss_sss_adj
,
int16_t
**
llr128p
);
/** \brief This function generates log-likelihood ratios (decoder input) for single-stream QPSK received waveforms
@param frame_parms Frame descriptor structure
@param rxdataF_comp Compensated channel output
...
...
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