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
Michael Black
OpenXG UE
Commits
c7022d55
Commit
c7022d55
authored
Mar 06, 2017
by
hbilel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[OAI-UE] Mimo LLR computation AVX2 + fix in TM3 deprecoding
parent
ae75ae97
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
70 additions
and
12 deletions
+70
-12
cmake_targets/CMakeLists.txt
cmake_targets/CMakeLists.txt
+1
-0
openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
+14
-9
openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c
openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c
+30
-1
openair1/PHY/LTE_TRANSPORT/proto.h
openair1/PHY/LTE_TRANSPORT/proto.h
+16
-0
openair1/PHY/Makefile.inc
openair1/PHY/Makefile.inc
+1
-0
openair3/NAS/UE/ESM/esm_ebr_context.c
openair3/NAS/UE/ESM/esm_ebr_context.c
+1
-1
targets/RT/USER/lte-softmodem.c
targets/RT/USER/lte-softmodem.c
+7
-1
No files found.
cmake_targets/CMakeLists.txt
View file @
c7022d55
...
@@ -1034,6 +1034,7 @@ set(PHY_SRC
...
@@ -1034,6 +1034,7 @@ set(PHY_SRC
${
OPENAIR1_DIR
}
/PHY/LTE_TRANSPORT/dlsch_modulation.c
${
OPENAIR1_DIR
}
/PHY/LTE_TRANSPORT/dlsch_modulation.c
${
OPENAIR1_DIR
}
/PHY/LTE_TRANSPORT/dlsch_demodulation.c
${
OPENAIR1_DIR
}
/PHY/LTE_TRANSPORT/dlsch_demodulation.c
${
OPENAIR1_DIR
}
/PHY/LTE_TRANSPORT/dlsch_llr_computation.c
${
OPENAIR1_DIR
}
/PHY/LTE_TRANSPORT/dlsch_llr_computation.c
${
OPENAIR1_DIR
}
/PHY/LTE_TRANSPORT/dlsch_llr_computation_avx2.c
${
OPENAIR1_DIR
}
/PHY/LTE_TRANSPORT/power_control.c
${
OPENAIR1_DIR
}
/PHY/LTE_TRANSPORT/power_control.c
${
OPENAIR1_DIR
}
/PHY/LTE_TRANSPORT/dlsch_decoding.c
${
OPENAIR1_DIR
}
/PHY/LTE_TRANSPORT/dlsch_decoding.c
${
OPENAIR1_DIR
}
/PHY/LTE_TRANSPORT/dlsch_scrambling.c
${
OPENAIR1_DIR
}
/PHY/LTE_TRANSPORT/dlsch_scrambling.c
...
...
openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
View file @
c7022d55
...
@@ -42,6 +42,7 @@
...
@@ -42,6 +42,7 @@
#define NOCYGWIN_STATIC
#define NOCYGWIN_STATIC
#endif
#endif
extern
int16_t
dlsch_demod_shift
;
//#define DEBUG_HARQ
//#define DEBUG_HARQ
//#undef LOG_D
//#undef LOG_D
...
@@ -402,8 +403,8 @@ int rx_pdsch(PHY_VARS_UE *ue,
...
@@ -402,8 +403,8 @@ int rx_pdsch(PHY_VARS_UE *ue,
LOG_D
(
PHY
,
"Channel Level TM34 avg_0 %d, avg_1 %d, rx_type %d, rx_standard %d, interf_unaw_shift %d
\n
"
,
avg_0
[
0
],
LOG_D
(
PHY
,
"Channel Level TM34 avg_0 %d, avg_1 %d, rx_type %d, rx_standard %d, interf_unaw_shift %d
\n
"
,
avg_0
[
0
],
avg_1
[
0
],
rx_type
,
rx_standard
,
interf_unaw_shift
);
avg_1
[
0
],
rx_type
,
rx_standard
,
interf_unaw_shift
);
if
(
rx_type
>
rx_standard
)
{
if
(
rx_type
>
rx_standard
)
{
avg_0
[
0
]
=
(
log2_approx
(
avg_0
[
0
])
/
2
)
-
5
+
2
;
//+ 2
;
avg_0
[
0
]
=
(
log2_approx
(
avg_0
[
0
])
/
2
)
+
dlsch_demod_shift
;
// + 2 ;//+ 4
;
avg_1
[
0
]
=
(
log2_approx
(
avg_1
[
0
])
/
2
)
-
5
+
2
;
//+ 2
;
avg_1
[
0
]
=
(
log2_approx
(
avg_1
[
0
])
/
2
)
+
dlsch_demod_shift
;
// + 2 ;//+ 4
;
pdsch_vars
[
eNB_id
]
->
log2_maxh0
=
cmax
(
avg_0
[
0
],
0
);
pdsch_vars
[
eNB_id
]
->
log2_maxh0
=
cmax
(
avg_0
[
0
],
0
);
pdsch_vars
[
eNB_id
]
->
log2_maxh1
=
cmax
(
avg_1
[
0
],
0
);
pdsch_vars
[
eNB_id
]
->
log2_maxh1
=
cmax
(
avg_1
[
0
],
0
);
//printf("TM4 I-A log2_maxh0 = %d\n", pdsch_vars[eNB_id]->log2_maxh0);
//printf("TM4 I-A log2_maxh0 = %d\n", pdsch_vars[eNB_id]->log2_maxh0);
...
@@ -1067,9 +1068,9 @@ int rx_pdsch(PHY_VARS_UE *ue,
...
@@ -1067,9 +1068,9 @@ int rx_pdsch(PHY_VARS_UE *ue,
write_output("dl_ch_estimates_ext10.m", "dl_ch_estimates_ext10", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[2][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("dl_ch_estimates_ext10.m", "dl_ch_estimates_ext10", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[2][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("dl_ch_estimates_ext11.m", "dl_ch_estimates_ext11", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[3][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("dl_ch_estimates_ext11.m", "dl_ch_estimates_ext11", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[3][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("rxdataF_comp00.m","rxdataF_comp00", &pdsch_vars[eNB_id]->rxdataF_comp0[0][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("rxdataF_comp00.m","rxdataF_comp00", &pdsch_vars[eNB_id]->rxdataF_comp0[0][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("rxdataF_comp01.m","rxdataF_comp01", &pdsch_vars[eNB_id]->rxdataF_comp0[
0
][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("rxdataF_comp01.m","rxdataF_comp01", &pdsch_vars[eNB_id]->rxdataF_comp0[
1
][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("rxdataF_comp10.m","rxdataF_comp10", &pdsch_vars[eNB_id]->rxdataF_comp
0
[0][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("rxdataF_comp10.m","rxdataF_comp10", &pdsch_vars[eNB_id]->rxdataF_comp
1[harq_pid][round]
[0][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("rxdataF_comp11.m","rxdataF_comp11", &pdsch_vars[eNB_id]->rxdataF_comp
0[0
][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("rxdataF_comp11.m","rxdataF_comp11", &pdsch_vars[eNB_id]->rxdataF_comp
1[harq_pid][round][1
][0],14*frame_parms->N_RB_DL*12,1,1);
#endif
#endif
write_output("llr0.m","llr0", &pdsch_vars[eNB_id]->llr[0][0],(14*nb_rb*12*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm),1,0);
write_output("llr0.m","llr0", &pdsch_vars[eNB_id]->llr[0][0],(14*nb_rb*12*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm),1,0);
write_output("llr1.m","llr1", &pdsch_vars[eNB_id]->llr[1][0],(14*nb_rb*12*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm),1,0);
write_output("llr1.m","llr1", &pdsch_vars[eNB_id]->llr[1][0],(14*nb_rb*12*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm),1,0);
...
@@ -1666,9 +1667,8 @@ void prec2A_TM3_128(__m128i *ch0,__m128i *ch1) {
...
@@ -1666,9 +1667,8 @@ void prec2A_TM3_128(__m128i *ch0,__m128i *ch1) {
__m128i
tmp0
,
tmp1
;
__m128i
tmp0
,
tmp1
;
// sqrt(2) is already taken into account in computation sqrt_rho_a, sqrt_rho_b,
//so divide by 2 is replaced by divide by sqrt(2).
//_mm_mulhi_epi16
// print_shorts("prec2A_TM3 ch0 (before):",ch0);
// print_shorts("prec2A_TM3 ch0 (before):",ch0);
// print_shorts("prec2A_TM3 ch1 (before):",ch1);
// print_shorts("prec2A_TM3 ch1 (before):",ch1);
...
@@ -1679,6 +1679,11 @@ void prec2A_TM3_128(__m128i *ch0,__m128i *ch1) {
...
@@ -1679,6 +1679,11 @@ void prec2A_TM3_128(__m128i *ch0,__m128i *ch1) {
ch0
[
0
]
=
_mm_adds_epi16
(
ch0
[
0
],
tmp1
);
ch0
[
0
]
=
_mm_adds_epi16
(
ch0
[
0
],
tmp1
);
ch1
[
0
]
=
_mm_subs_epi16
(
tmp0
,
tmp1
);
ch1
[
0
]
=
_mm_subs_epi16
(
tmp0
,
tmp1
);
ch0
[
0
]
=
_mm_mulhi_epi16
(
ch0
[
0
],
amp
);
ch0
[
0
]
=
_mm_slli_epi16
(
ch0
[
0
],
1
);
ch1
[
0
]
=
_mm_mulhi_epi16
(
ch1
[
0
],
amp
);
ch1
[
0
]
=
_mm_slli_epi16
(
ch1
[
0
],
1
);
// print_shorts("prec2A_TM3 ch0 (mid):",&tmp0);
// print_shorts("prec2A_TM3 ch0 (mid):",&tmp0);
// print_shorts("prec2A_TM3 ch1 (mid):",ch1);
// print_shorts("prec2A_TM3 ch1 (mid):",ch1);
...
@@ -1688,8 +1693,8 @@ void prec2A_TM3_128(__m128i *ch0,__m128i *ch1) {
...
@@ -1688,8 +1693,8 @@ void prec2A_TM3_128(__m128i *ch0,__m128i *ch1) {
ch1
[
0
]
=
_mm_mulhi_epi16
(
ch1
[
0
],
amp
);
ch1
[
0
]
=
_mm_mulhi_epi16
(
ch1
[
0
],
amp
);
ch1
[
0
]
=
_mm_slli_epi16
(
ch1
[
0
],
1
);
ch1
[
0
]
=
_mm_slli_epi16
(
ch1
[
0
],
1
);
//
ch0[0] = _mm_srai_epi16(ch0[0],1);
//ch0[0] = _mm_srai_epi16(ch0[0],1);
//
ch1[0] = _mm_srai_epi16(ch1[0],1);
//ch1[0] = _mm_srai_epi16(ch1[0],1);
// print_shorts("prec2A_TM3 ch0 (after):",ch0);
// print_shorts("prec2A_TM3 ch0 (after):",ch0);
// print_shorts("prec2A_TM3 ch1 (after):",ch1);
// print_shorts("prec2A_TM3 ch1 (after):",ch1);
...
...
openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c
View file @
c7022d55
...
@@ -8831,6 +8831,7 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
...
@@ -8831,6 +8831,7 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
len
=
(
nb_rb
*
12
)
-
pbch_pss_sss_adjust
;
len
=
(
nb_rb
*
12
)
-
pbch_pss_sss_adjust
;
}
}
#if 0
qam64_qam64((short *)rxF,
qam64_qam64((short *)rxF,
(short *)rxF_i,
(short *)rxF_i,
(short *)ch_mag,
(short *)ch_mag,
...
@@ -8838,7 +8839,35 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
...
@@ -8838,7 +8839,35 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
(short *)llr16,
(short *)llr16,
(short *)rho,
(short *)rho,
len);
len);
#else
// Round length up to multiple of 16 words
uint32_t
len256i
=
((
len
+
16
)
>>
4
)
*
16
;
int32_t
*
rxF_256i
=
(
int32_t
*
)
malloc16_clear
(
len256i
*
4
);
int32_t
*
rxF_i_256i
=
(
int32_t
*
)
malloc16_clear
(
len256i
*
4
);
int32_t
*
ch_mag_256i
=
(
int32_t
*
)
malloc16_clear
(
len256i
*
4
);
int32_t
*
ch_mag_i_256i
=
(
int32_t
*
)
malloc16_clear
(
len256i
*
4
);
int32_t
*
rho_256i
=
(
int32_t
*
)
malloc16_clear
(
len256i
*
4
);
memcpy
(
rxF_256i
,
rxF
,
len
*
4
);
memcpy
(
rxF_i_256i
,
rxF_i
,
len
*
4
);
memcpy
(
ch_mag_256i
,
ch_mag
,
len
*
4
);
memcpy
(
ch_mag_i_256i
,
ch_mag_i
,
len
*
4
);
memcpy
(
rho_256i
,
rho
,
len
*
4
);
qam64_qam64_avx2
((
int32_t
*
)
rxF_256i
,
(
int32_t
*
)
rxF_i_256i
,
(
int32_t
*
)
ch_mag_256i
,
(
int32_t
*
)
ch_mag_i_256i
,
(
int16_t
*
)
llr16
,
(
int32_t
*
)
rho_256i
,
len
);
free16
(
rxF_256i
,
sizeof
(
rxF_256i
));
free16
(
rxF_i_256i
,
sizeof
(
rxF_i_256i
));
free16
(
ch_mag_256i
,
sizeof
(
ch_mag_256i
));
free16
(
ch_mag_i_256i
,
sizeof
(
ch_mag_i_256i
));
free16
(
rho_256i
,
sizeof
(
rho_256i
));
#endif
llr16
+=
(
6
*
len
);
llr16
+=
(
6
*
len
);
*
llr16p
=
(
short
*
)
llr16
;
*
llr16p
=
(
short
*
)
llr16
;
return
(
0
);
return
(
0
);
...
...
openair1/PHY/LTE_TRANSPORT/proto.h
View file @
c7022d55
...
@@ -746,6 +746,22 @@ void qam64_qam64(short *stream0_in,
...
@@ -746,6 +746,22 @@ void qam64_qam64(short *stream0_in,
short
*
rho01
,
short
*
rho01
,
int
length
);
int
length
);
/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream 64QAM/64QAM reception.
@param stream0_in Input from channel compensated (MR combined) stream 0
@param stream1_in Input from channel compensated (MR combined) stream 1
@param ch_mag Input from scaled channel magnitude square of h0'*g0
@param ch_mag_i Input from scaled channel magnitude square of h0'*g1
@param stream0_out Output from LLR unit for stream0
@param rho01 Cross-correlation between channels (MR combined)
@param length in complex channel outputs*/
void
qam64_qam64_avx2
(
int32_t
*
stream0_in
,
int32_t
*
stream1_in
,
int32_t
*
ch_mag
,
int32_t
*
ch_mag_i
,
int16_t
*
stream0_out
,
int32_t
*
rho01
,
int
length
);
/** \brief This function perform LLR computation for dual-stream (64QAM/64QAM) transmission.
/** \brief This function perform LLR computation for dual-stream (64QAM/64QAM) transmission.
@param frame_parms Frame descriptor structure
@param frame_parms Frame descriptor structure
@param rxdataF_comp Compensated channel output
@param rxdataF_comp Compensated channel output
...
...
openair1/PHY/Makefile.inc
View file @
c7022d55
...
@@ -7,6 +7,7 @@ PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/dlsch_coding.o
...
@@ -7,6 +7,7 @@ PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/dlsch_coding.o
PHY_OBJS
+=
$(TOP_DIR)
/PHY/LTE_TRANSPORT/dlsch_modulation.o
PHY_OBJS
+=
$(TOP_DIR)
/PHY/LTE_TRANSPORT/dlsch_modulation.o
PHY_OBJS
+=
$(TOP_DIR)
/PHY/LTE_TRANSPORT/dlsch_demodulation.o
PHY_OBJS
+=
$(TOP_DIR)
/PHY/LTE_TRANSPORT/dlsch_demodulation.o
PHY_OBJS
+=
$(TOP_DIR)
/PHY/LTE_TRANSPORT/dlsch_llr_computation.o
PHY_OBJS
+=
$(TOP_DIR)
/PHY/LTE_TRANSPORT/dlsch_llr_computation.o
PHY_OBJS
+=
$(TOP_DIR)
/PHY/LTE_TRANSPORT/dlsch_llr_computation_avx2.o
PHY_OBJS
+=
$(TOP_DIR)
/PHY/LTE_TRANSPORT/power_control.o
PHY_OBJS
+=
$(TOP_DIR)
/PHY/LTE_TRANSPORT/power_control.o
PHY_OBJS
+=
$(TOP_DIR)
/PHY/LTE_TRANSPORT/dlsch_decoding.o
PHY_OBJS
+=
$(TOP_DIR)
/PHY/LTE_TRANSPORT/dlsch_decoding.o
PHY_OBJS
+=
$(TOP_DIR)
/PHY/LTE_TRANSPORT/dlsch_scrambling.o
PHY_OBJS
+=
$(TOP_DIR)
/PHY/LTE_TRANSPORT/dlsch_scrambling.o
...
...
openair3/NAS/UE/ESM/esm_ebr_context.c
View file @
c7022d55
...
@@ -286,7 +286,7 @@ int esm_ebr_context_create(
...
@@ -286,7 +286,7 @@ int esm_ebr_context_create(
LOG_TRACE
(
INFO
,
"ESM-PROC - executing %s "
,
LOG_TRACE
(
INFO
,
"ESM-PROC - executing %s "
,
command_line
);
command_line
);
if
(
system
(
command_line
))
;
/* TODO: what to do? */
//
if (system(command_line)) ; /* TODO: what to do? */
break
;
break
;
...
...
targets/RT/USER/lte-softmodem.c
View file @
c7022d55
...
@@ -151,6 +151,8 @@ uint8_t usim_test = 0;
...
@@ -151,6 +151,8 @@ uint8_t usim_test = 0;
uint8_t
nb_antenna_tx
=
1
;
uint8_t
nb_antenna_tx
=
1
;
uint8_t
nb_antenna_rx
=
1
;
uint8_t
nb_antenna_rx
=
1
;
int16_t
dlsch_demod_shift
=
0
;
char
ref
[
128
]
=
"internal"
;
char
ref
[
128
]
=
"internal"
;
char
channels
[
128
]
=
"0"
;
char
channels
[
128
]
=
"0"
;
...
@@ -635,6 +637,7 @@ static void get_options (int argc, char **argv) {
...
@@ -635,6 +637,7 @@ static void get_options (int argc, char **argv) {
LONG_OPTION_THREADIQ
,
LONG_OPTION_THREADIQ
,
LONG_OPTION_THREADODDSUBFRAME
,
LONG_OPTION_THREADODDSUBFRAME
,
LONG_OPTION_THREADEVENSUBFRAME
,
LONG_OPTION_THREADEVENSUBFRAME
,
LONG_OPTION_DEMOD_SHIFT
,
#if T_TRACER
#if T_TRACER
LONG_OPTION_T_PORT
,
LONG_OPTION_T_PORT
,
LONG_OPTION_T_NOWAIT
,
LONG_OPTION_T_NOWAIT
,
...
@@ -670,6 +673,7 @@ static void get_options (int argc, char **argv) {
...
@@ -670,6 +673,7 @@ static void get_options (int argc, char **argv) {
{
"threadIQ"
,
required_argument
,
NULL
,
LONG_OPTION_THREADIQ
},
{
"threadIQ"
,
required_argument
,
NULL
,
LONG_OPTION_THREADIQ
},
{
"threadOddSubframe"
,
required_argument
,
NULL
,
LONG_OPTION_THREADODDSUBFRAME
},
{
"threadOddSubframe"
,
required_argument
,
NULL
,
LONG_OPTION_THREADODDSUBFRAME
},
{
"threadEvenSubframe"
,
required_argument
,
NULL
,
LONG_OPTION_THREADEVENSUBFRAME
},
{
"threadEvenSubframe"
,
required_argument
,
NULL
,
LONG_OPTION_THREADEVENSUBFRAME
},
{
"dlsch-demod-shift"
,
required_argument
,
NULL
,
LONG_OPTION_DEMOD_SHIFT
},
#if T_TRACER
#if T_TRACER
{
"T_port"
,
required_argument
,
0
,
LONG_OPTION_T_PORT
},
{
"T_port"
,
required_argument
,
0
,
LONG_OPTION_T_PORT
},
{
"T_nowait"
,
no_argument
,
0
,
LONG_OPTION_T_NOWAIT
},
{
"T_nowait"
,
no_argument
,
0
,
LONG_OPTION_T_NOWAIT
},
...
@@ -800,7 +804,9 @@ static void get_options (int argc, char **argv) {
...
@@ -800,7 +804,9 @@ static void get_options (int argc, char **argv) {
case
LONG_OPTION_THREADEVENSUBFRAME
:
case
LONG_OPTION_THREADEVENSUBFRAME
:
threads
.
even
=
atoi
(
optarg
);
threads
.
even
=
atoi
(
optarg
);
break
;
break
;
case
LONG_OPTION_DEMOD_SHIFT
:
dlsch_demod_shift
=
atof
(
optarg
);
break
;
#if T_TRACER
#if T_TRACER
case
LONG_OPTION_T_PORT
:
{
case
LONG_OPTION_T_PORT
:
{
extern
int
T_port
;
extern
int
T_port
;
...
...
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