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
lizhongxiao
OpenXG UE
Commits
acdfffe7
Commit
acdfffe7
authored
Jun 13, 2017
by
hbilel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[OAI-UE] slot0 / slot1 parallelization
parent
d555f4a1
Changes
11
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
1448 additions
and
429 deletions
+1448
-429
openair1/PHY/LTE_TRANSPORT/dci_tools.c
openair1/PHY/LTE_TRANSPORT/dci_tools.c
+116
-3
openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
+33
-13
openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c
openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c
+50
-9
openair1/PHY/LTE_TRANSPORT/proto.h
openair1/PHY/LTE_TRANSPORT/proto.h
+8
-3
openair1/PHY/MODULATION/defs.h
openair1/PHY/MODULATION/defs.h
+11
-0
openair1/PHY/MODULATION/slot_fep.c
openair1/PHY/MODULATION/slot_fep.c
+212
-0
openair1/PHY/defs.h
openair1/PHY/defs.h
+27
-0
openair1/PHY/impl_defs_lte.h
openair1/PHY/impl_defs_lte.h
+4
-0
openair1/SCHED/defs.h
openair1/SCHED/defs.h
+2
-0
openair1/SCHED/phy_procedures_lte_ue.c
openair1/SCHED/phy_procedures_lte_ue.c
+722
-389
targets/RT/USER/lte-ue.c
targets/RT/USER/lte-ue.c
+263
-12
No files found.
openair1/PHY/LTE_TRANSPORT/dci_tools.c
View file @
acdfffe7
...
@@ -5138,10 +5138,70 @@ int check_dci_format2_2a_coherency(DCI_format_t dci_format,
...
@@ -5138,10 +5138,70 @@ int check_dci_format2_2a_coherency(DCI_format_t dci_format,
return
(
1
);
return
(
1
);
}
}
void
compute_llr_offset
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
LTE_UE_PDCCH
*
pdcch_vars
,
LTE_UE_PDSCH
*
pdsch_vars
,
LTE_DL_UE_HARQ_t
*
dlsch0_harq
,
uint8_t
nb_rb_alloc
,
uint8_t
subframe
)
{
uint32_t
pbch_pss_sss_re
;
uint32_t
crs_re
;
uint32_t
granted_re
;
uint32_t
data_re
;
uint32_t
llr_offset
;
uint8_t
symbol
;
uint8_t
symbol_mod
;
pdsch_vars
->
llr_offset
[
pdcch_vars
->
num_pdcch_symbols
]
=
0
;
LOG_I
(
PHY
,
"compute_llr_offset: nb RB %d - Qm %d
\n
"
,
nb_rb_alloc
,
dlsch0_harq
->
Qm
);
//dlsch0_harq->rb_alloc_even;
//dlsch0_harq->rb_alloc_odd;
for
(
symbol
=
pdcch_vars
->
num_pdcch_symbols
;
symbol
<
frame_parms
->
symbols_per_tti
;
symbol
++
)
{
symbol_mod
=
(
symbol
>=
(
7
-
frame_parms
->
Ncp
))
?
(
symbol
-
(
7
-
frame_parms
->
Ncp
))
:
symbol
;
if
((
symbol_mod
==
0
)
||
symbol_mod
==
(
4
-
frame_parms
->
Ncp
))
{
if
(
frame_parms
->
mode1_flag
==
0
)
crs_re
=
4
;
else
crs_re
=
2
;
}
else
{
crs_re
=
0
;
}
granted_re
=
nb_rb_alloc
*
(
12
-
crs_re
);
pbch_pss_sss_re
=
adjust_G2
(
frame_parms
,
dlsch0_harq
->
rb_alloc_even
,
dlsch0_harq
->
Qm
,
subframe
,
symbol
);
pbch_pss_sss_re
=
(
double
)
pbch_pss_sss_re
*
((
double
)(
12
-
crs_re
)
/
12
);
data_re
=
granted_re
-
pbch_pss_sss_re
;
llr_offset
=
data_re
*
dlsch0_harq
->
Qm
*
2
;
pdsch_vars
->
llr_length
[
symbol
]
=
data_re
;
if
(
symbol
<
(
frame_parms
->
symbols_per_tti
-
1
))
pdsch_vars
->
llr_offset
[
symbol
+
1
]
=
pdsch_vars
->
llr_offset
[
symbol
]
+
llr_offset
;
//LOG_I(PHY,"Granted Re subframe %d / symbol %d => %d (%d RBs)\n", subframe, symbol_mod, granted_re,dlsch0_harq->nb_rb);
//LOG_I(PHY,"Pbch/PSS/SSS Re subframe %d / symbol %d => %d \n", subframe, symbol_mod, pbch_pss_sss_re);
//LOG_I(PHY,"CRS Re Per PRB subframe %d / symbol %d => %d \n", subframe, symbol_mod, crs_re);
//LOG_I(PHY,"Data Re subframe %d / symbol %d => %d \n", subframe, symbol_mod, data_re);
//LOG_I(PHY,"Data Re subframe %d-symbol %d => llr length %d, llr offset %d \n", subframe, symbol,
// pdsch_vars->llr_length[symbol], pdsch_vars->llr_offset[symbol]);
}
}
void
prepare_dl_decoding_format1_1A
(
DCI_format_t
dci_format
,
void
prepare_dl_decoding_format1_1A
(
DCI_format_t
dci_format
,
uint8_t
N_RB_DL
,
uint8_t
N_RB_DL
,
DCI_INFO_EXTRACTED_t
*
pdci_info_extarcted
,
DCI_INFO_EXTRACTED_t
*
pdci_info_extarcted
,
LTE_DL_FRAME_PARMS
*
frame_parms
,
LTE_DL_FRAME_PARMS
*
frame_parms
,
LTE_UE_PDCCH
*
pdcch_vars
,
LTE_UE_PDSCH
*
pdsch_vars
,
uint8_t
subframe
,
uint8_t
subframe
,
uint16_t
rnti
,
uint16_t
rnti
,
uint16_t
tc_rnti
,
uint16_t
tc_rnti
,
...
@@ -5163,12 +5223,27 @@ void prepare_dl_decoding_format1_1A(DCI_format_t dci_format,
...
@@ -5163,12 +5223,27 @@ void prepare_dl_decoding_format1_1A(DCI_format_t dci_format,
uint8_t
dai
=
pdci_info_extarcted
->
dai
;
uint8_t
dai
=
pdci_info_extarcted
->
dai
;
uint8_t
NPRB
=
0
;
uint8_t
NPRB
=
0
;
uint8_t
nb_rb_alloc
=
0
;
if
(
dci_format
==
format1A
)
if
(
dci_format
==
format1A
)
{
{
if
((
rnti
==
si_rnti
)
||
(
rnti
==
p_rnti
)
||
(
rnti
==
ra_rnti
))
if
((
rnti
==
si_rnti
)
||
(
rnti
==
p_rnti
)
||
(
rnti
==
ra_rnti
))
{
{
NPRB
=
(
TPC
&
1
)
+
2
;
NPRB
=
(
TPC
&
1
)
+
2
;
switch
(
N_RB_DL
)
{
case
6
:
nb_rb_alloc
=
RIV2nb_rb_LUT6
[
rballoc
];
//NPRB;
break
;
case
25
:
nb_rb_alloc
=
RIV2nb_rb_LUT25
[
rballoc
];
//NPRB;
break
;
case
50
:
nb_rb_alloc
=
RIV2nb_rb_LUT50
[
rballoc
];
//NPRB;
break
;
case
100
:
nb_rb_alloc
=
RIV2nb_rb_LUT100
[
rballoc
];
//NPRB;
break
;
}
}
}
else
else
{
{
...
@@ -5186,6 +5261,7 @@ void prepare_dl_decoding_format1_1A(DCI_format_t dci_format,
...
@@ -5186,6 +5261,7 @@ void prepare_dl_decoding_format1_1A(DCI_format_t dci_format,
NPRB
=
RIV2nb_rb_LUT100
[
rballoc
];
//NPRB;
NPRB
=
RIV2nb_rb_LUT100
[
rballoc
];
//NPRB;
break
;
break
;
}
}
nb_rb_alloc
=
NPRB
;
}
}
}
}
else
// format1
else
// format1
...
@@ -5345,7 +5421,6 @@ void prepare_dl_decoding_format1_1A(DCI_format_t dci_format,
...
@@ -5345,7 +5421,6 @@ void prepare_dl_decoding_format1_1A(DCI_format_t dci_format,
pdlsch0_harq
->
rb_alloc_odd
[
2
]
=
pdlsch0_harq
->
rb_alloc_even
[
2
];
pdlsch0_harq
->
rb_alloc_odd
[
2
]
=
pdlsch0_harq
->
rb_alloc_even
[
2
];
pdlsch0_harq
->
rb_alloc_odd
[
3
]
=
pdlsch0_harq
->
rb_alloc_even
[
3
];
pdlsch0_harq
->
rb_alloc_odd
[
3
]
=
pdlsch0_harq
->
rb_alloc_even
[
3
];
}
}
if
((
rnti
==
si_rnti
)
||
(
rnti
==
p_rnti
)
||
(
rnti
==
ra_rnti
))
if
((
rnti
==
si_rnti
)
||
(
rnti
==
p_rnti
)
||
(
rnti
==
ra_rnti
))
{
{
pdlsch0_harq
->
TBS
=
TBStable
[
mcs1
][
NPRB
-
1
];
pdlsch0_harq
->
TBS
=
TBStable
[
mcs1
][
NPRB
-
1
];
...
@@ -5359,11 +5434,20 @@ void prepare_dl_decoding_format1_1A(DCI_format_t dci_format,
...
@@ -5359,11 +5434,20 @@ void prepare_dl_decoding_format1_1A(DCI_format_t dci_format,
pdlsch0_harq
->
Qm
=
get_Qm
(
mcs1
);
pdlsch0_harq
->
Qm
=
get_Qm
(
mcs1
);
}
}
}
}
compute_llr_offset
(
frame_parms
,
pdcch_vars
,
pdsch_vars
,
pdlsch0_harq
,
nb_rb_alloc
,
subframe
);
}
}
void
prepare_dl_decoding_format1C
(
uint8_t
N_RB_DL
,
void
prepare_dl_decoding_format1C
(
uint8_t
N_RB_DL
,
DCI_INFO_EXTRACTED_t
*
pdci_info_extarcted
,
DCI_INFO_EXTRACTED_t
*
pdci_info_extarcted
,
LTE_DL_FRAME_PARMS
*
frame_parms
,
LTE_DL_FRAME_PARMS
*
frame_parms
,
LTE_UE_PDCCH
*
pdcch_vars
,
LTE_UE_PDSCH
*
pdsch_vars
,
uint32_t
rnti
,
uint32_t
rnti
,
uint32_t
si_rnti
,
uint32_t
si_rnti
,
uint32_t
ra_rnti
,
uint32_t
ra_rnti
,
...
@@ -5466,6 +5550,14 @@ void prepare_dl_decoding_format1C(uint8_t N_RB_DL,
...
@@ -5466,6 +5550,14 @@ void prepare_dl_decoding_format1C(uint8_t N_RB_DL,
AssertFatal
(
0
,
"Format 1C: Unknown N_RB_DL %d
\n
"
,
frame_parms
->
N_RB_DL
);
AssertFatal
(
0
,
"Format 1C: Unknown N_RB_DL %d
\n
"
,
frame_parms
->
N_RB_DL
);
break
;
break
;
}
}
compute_llr_offset
(
frame_parms
,
pdcch_vars
,
pdsch_vars
,
pdlsch0_harq
,
pdlsch0_harq
->
nb_rb
,
subframe
);
}
}
void
compute_precoding_info_2cw
(
uint8_t
tpmi
,
uint8_t
tbswap
,
uint16_t
pmi_alloc
,
LTE_DL_FRAME_PARMS
*
frame_parms
,
LTE_DL_UE_HARQ_t
*
dlsch0_harq
,
LTE_DL_UE_HARQ_t
*
dlsch1_harq
)
void
compute_precoding_info_2cw
(
uint8_t
tpmi
,
uint8_t
tbswap
,
uint16_t
pmi_alloc
,
LTE_DL_FRAME_PARMS
*
frame_parms
,
LTE_DL_UE_HARQ_t
*
dlsch0_harq
,
LTE_DL_UE_HARQ_t
*
dlsch1_harq
)
...
@@ -5639,6 +5731,8 @@ void compute_precoding_info_format2A(uint8_t tpmi,
...
@@ -5639,6 +5731,8 @@ void compute_precoding_info_format2A(uint8_t tpmi,
void
prepare_dl_decoding_format2_2A
(
DCI_format_t
dci_format
,
void
prepare_dl_decoding_format2_2A
(
DCI_format_t
dci_format
,
DCI_INFO_EXTRACTED_t
*
pdci_info_extarcted
,
DCI_INFO_EXTRACTED_t
*
pdci_info_extarcted
,
LTE_DL_FRAME_PARMS
*
frame_parms
,
LTE_DL_FRAME_PARMS
*
frame_parms
,
LTE_UE_PDCCH
*
pdcch_vars
,
LTE_UE_PDSCH
*
pdsch_vars
,
uint16_t
rnti
,
uint16_t
rnti
,
uint8_t
subframe
,
uint8_t
subframe
,
LTE_DL_UE_HARQ_t
*
dlsch0_harq
,
LTE_DL_UE_HARQ_t
*
dlsch0_harq
,
...
@@ -5890,9 +5984,16 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
...
@@ -5890,9 +5984,16 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
dlsch1_harq
->
Qm
=
(
mcs2
-
28
)
<<
1
;
dlsch1_harq
->
Qm
=
(
mcs2
-
28
)
<<
1
;
}
}
//#ifdef DEBUG_HARQ
compute_llr_offset
(
frame_parms
,
pdcch_vars
,
pdsch_vars
,
dlsch0_harq
,
dlsch0_harq
->
nb_rb
,
subframe
);
#ifdef DEBUG_HARQ
printf
(
"[DCI UE]: dlsch0_harq status %d , dlsch1_harq status %d
\n
"
,
dlsch0_harq
->
status
,
dlsch1_harq
->
status
);
printf
(
"[DCI UE]: dlsch0_harq status %d , dlsch1_harq status %d
\n
"
,
dlsch0_harq
->
status
,
dlsch1_harq
->
status
);
//
#endif
#endif
#ifdef DEBUG_HARQ
#ifdef DEBUG_HARQ
if
(
dlsch0
!=
NULL
&&
dlsch1
!=
NULL
)
if
(
dlsch0
!=
NULL
&&
dlsch1
!=
NULL
)
...
@@ -5909,6 +6010,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
...
@@ -5909,6 +6010,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
void
*
dci_pdu
,
void
*
dci_pdu
,
uint16_t
rnti
,
uint16_t
rnti
,
DCI_format_t
dci_format
,
DCI_format_t
dci_format
,
LTE_UE_PDCCH
*
pdcch_vars
,
LTE_UE_PDSCH
*
pdsch_vars
,
LTE_UE_DLSCH_t
**
dlsch
,
LTE_UE_DLSCH_t
**
dlsch
,
LTE_DL_FRAME_PARMS
*
frame_parms
,
LTE_DL_FRAME_PARMS
*
frame_parms
,
PDSCH_CONFIG_DEDICATED
*
pdsch_config_dedicated
,
PDSCH_CONFIG_DEDICATED
*
pdsch_config_dedicated
,
...
@@ -5998,6 +6101,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
...
@@ -5998,6 +6101,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
frame_parms
->
N_RB_DL
,
frame_parms
->
N_RB_DL
,
&
dci_info_extarcted
,
&
dci_info_extarcted
,
frame_parms
,
frame_parms
,
pdcch_vars
,
pdsch_vars
,
subframe
,
subframe
,
rnti
,
rnti
,
tc_rnti
,
tc_rnti
,
...
@@ -6048,6 +6153,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
...
@@ -6048,6 +6153,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
prepare_dl_decoding_format1C
(
frame_parms
->
N_RB_DL
,
prepare_dl_decoding_format1C
(
frame_parms
->
N_RB_DL
,
&
dci_info_extarcted
,
&
dci_info_extarcted
,
frame_parms
,
frame_parms
,
pdcch_vars
,
pdsch_vars
,
rnti
,
rnti
,
si_rnti
,
si_rnti
,
ra_rnti
,
ra_rnti
,
...
@@ -6099,6 +6206,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
...
@@ -6099,6 +6206,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
frame_parms
->
N_RB_DL
,
frame_parms
->
N_RB_DL
,
&
dci_info_extarcted
,
&
dci_info_extarcted
,
frame_parms
,
frame_parms
,
pdcch_vars
,
pdsch_vars
,
subframe
,
subframe
,
rnti
,
rnti
,
tc_rnti
,
tc_rnti
,
...
@@ -6153,6 +6262,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
...
@@ -6153,6 +6262,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
prepare_dl_decoding_format2_2A
(
format2
,
prepare_dl_decoding_format2_2A
(
format2
,
&
dci_info_extarcted
,
&
dci_info_extarcted
,
frame_parms
,
frame_parms
,
pdcch_vars
,
pdsch_vars
,
rnti
,
rnti
,
subframe
,
subframe
,
dlsch0_harq
,
dlsch0_harq
,
...
@@ -6207,6 +6318,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
...
@@ -6207,6 +6318,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
prepare_dl_decoding_format2_2A
(
format2A
,
prepare_dl_decoding_format2_2A
(
format2A
,
&
dci_info_extarcted
,
&
dci_info_extarcted
,
frame_parms
,
frame_parms
,
pdcch_vars
,
pdsch_vars
,
rnti
,
rnti
,
subframe
,
subframe
,
dlsch0_harq
,
dlsch0_harq
,
...
...
openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
View file @
acdfffe7
...
@@ -91,6 +91,7 @@ extern void print_shorts(char *s,int16_t *x);
...
@@ -91,6 +91,7 @@ extern void print_shorts(char *s,int16_t *x);
int
rx_pdsch
(
PHY_VARS_UE
*
ue
,
int
rx_pdsch
(
PHY_VARS_UE
*
ue
,
UE_rxtx_proc_t
*
proc
,
PDSCH_t
type
,
PDSCH_t
type
,
unsigned
char
eNB_id
,
unsigned
char
eNB_id
,
unsigned
char
eNB_id_i
,
//if this == ue->n_connected_eNB, we assume MU interference
unsigned
char
eNB_id_i
,
//if this == ue->n_connected_eNB, we assume MU interference
...
@@ -747,18 +748,35 @@ int rx_pdsch(PHY_VARS_UE *ue,
...
@@ -747,18 +748,35 @@ int rx_pdsch(PHY_VARS_UE *ue,
}
}
//printf("LLR dlsch0_harq->Qm %d rx_type %d cw0 %d cw1 %d symbol %d \n",dlsch0_harq->Qm,rx_type,codeword_TB0,codeword_TB1,symbol);
//printf("LLR dlsch0_harq->Qm %d rx_type %d cw0 %d cw1 %d symbol %d \n",dlsch0_harq->Qm,rx_type,codeword_TB0,codeword_TB1,symbol);
// compute LLRs
// -> // compute @pointer where llrs should filled for this ofdm-symbol
int8_t
*
pllr_symbol_cw0
;
int8_t
*
pllr_symbol_cw1
;
uint32_t
llr_offset_symbol
;
llr_offset_symbol
=
pdsch_vars
[
eNB_id
]
->
llr_offset
[
symbol
];
pllr_symbol_cw0
=
(
int8_t
*
)
pdsch_vars
[
eNB_id
]
->
llr
[
0
];
pllr_symbol_cw1
=
(
int8_t
*
)
pdsch_vars
[
eNB_id
]
->
llr
[
1
];
pllr_symbol_cw0
+=
llr_offset_symbol
;
pllr_symbol_cw1
+=
llr_offset_symbol
;
/*LOG_I(PHY,"compute LLRs [AbsSubframe %d.%d-%d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %x @LLR Buff(symb) %x\n",
proc->frame_rx, proc->subframe_rx,symbol,
nb_rb,dlsch0_harq->Qm,
pdsch_vars[eNB_id]->llr_length[symbol],
pdsch_vars[eNB_id]->llr_offset[symbol],
(int16_t*)pdsch_vars[eNB_id]->llr[0],
pllr_symbol);*/
switch
(
dlsch0_harq
->
Qm
)
{
switch
(
dlsch0_harq
->
Qm
)
{
case
2
:
case
2
:
if
((
rx_type
==
rx_standard
)
||
(
codeword_TB0
==
-
1
)
||
(
codeword_TB1
==
-
1
))
{
if
((
rx_type
==
rx_standard
)
||
(
codeword_TB0
==
-
1
)
||
(
codeword_TB1
==
-
1
))
{
dlsch_qpsk_llr
(
frame_parms
,
dlsch_qpsk_llr
(
frame_parms
,
pdsch_vars
[
eNB_id
]
->
rxdataF_comp0
,
pdsch_vars
[
eNB_id
]
->
rxdataF_comp0
,
pdsch_vars
[
eNB_id
]
->
llr
[
0
]
,
(
int16_t
*
)
pllr_symbol_cw0
,
symbol
,
symbol
,
first_symbol_flag
,
first_symbol_flag
,
nb_rb
,
nb_rb
,
adjust_G2
(
frame_parms
,
dlsch0_harq
->
rb_alloc_even
,
2
,
subframe
,
symbol
),
adjust_G2
(
frame_parms
,
dlsch0_harq
->
rb_alloc_even
,
2
,
subframe
,
symbol
),
pdsch_vars
[
eNB_id
]
->
llr128
,
beamforming_mode
);
beamforming_mode
);
}
}
else
if
(
rx_type
>=
rx_IC_single_stream
)
{
else
if
(
rx_type
>=
rx_IC_single_stream
)
{
...
@@ -918,12 +936,12 @@ int rx_pdsch(PHY_VARS_UE *ue,
...
@@ -918,12 +936,12 @@ int rx_pdsch(PHY_VARS_UE *ue,
if
((
rx_type
==
rx_standard
)
||
(
codeword_TB0
==
-
1
)
||
(
codeword_TB1
==
-
1
))
{
if
((
rx_type
==
rx_standard
)
||
(
codeword_TB0
==
-
1
)
||
(
codeword_TB1
==
-
1
))
{
dlsch_64qam_llr
(
frame_parms
,
dlsch_64qam_llr
(
frame_parms
,
pdsch_vars
[
eNB_id
]
->
rxdataF_comp0
,
pdsch_vars
[
eNB_id
]
->
rxdataF_comp0
,
pdsch_vars
[
eNB_id
]
->
llr
[
0
]
,
(
int16_t
*
)
pllr_symbol_cw0
,
pdsch_vars
[
eNB_id
]
->
dl_ch_mag0
,
pdsch_vars
[
eNB_id
]
->
dl_ch_mag0
,
pdsch_vars
[
eNB_id
]
->
dl_ch_magb0
,
pdsch_vars
[
eNB_id
]
->
dl_ch_magb0
,
symbol
,
first_symbol_flag
,
nb_rb
,
symbol
,
first_symbol_flag
,
nb_rb
,
adjust_G2
(
frame_parms
,
dlsch0_harq
->
rb_alloc_even
,
6
,
subframe
,
symbol
),
adjust_G2
(
frame_parms
,
dlsch0_harq
->
rb_alloc_even
,
6
,
subframe
,
symbol
),
pdsch_vars
[
eNB_id
]
->
llr
128
,
pdsch_vars
[
eNB_id
]
->
llr
_offset
[
symbol
]
,
beamforming_mode
);
beamforming_mode
);
}
}
else
if
(
rx_type
>=
rx_IC_single_stream
)
{
else
if
(
rx_type
>=
rx_IC_single_stream
)
{
...
@@ -980,10 +998,10 @@ int rx_pdsch(PHY_VARS_UE *ue,
...
@@ -980,10 +998,10 @@ int rx_pdsch(PHY_VARS_UE *ue,
pdsch_vars
[
eNB_id
]
->
dl_ch_mag0
,
pdsch_vars
[
eNB_id
]
->
dl_ch_mag0
,
dl_ch_mag_ptr
,
//i
dl_ch_mag_ptr
,
//i
pdsch_vars
[
eNB_id
]
->
dl_ch_rho2_ext
,
pdsch_vars
[
eNB_id
]
->
dl_ch_rho2_ext
,
pdsch_vars
[
eNB_id
]
->
llr
[
0
]
,
(
int16_t
*
)
pllr_symbol_cw0
,
symbol
,
first_symbol_flag
,
nb_rb
,
symbol
,
first_symbol_flag
,
nb_rb
,
adjust_G2
(
frame_parms
,
dlsch0_harq
->
rb_alloc_even
,
6
,
subframe
,
symbol
),
adjust_G2
(
frame_parms
,
dlsch0_harq
->
rb_alloc_even
,
6
,
subframe
,
symbol
),
pdsch_vars
[
eNB_id
]
->
llr
128
);
pdsch_vars
[
eNB_id
]
->
llr
_offset
[
symbol
]
);
if
(
rx_type
==
rx_IC_dual_stream
)
{
if
(
rx_type
==
rx_IC_dual_stream
)
{
dlsch_64qam_64qam_llr
(
frame_parms
,
dlsch_64qam_64qam_llr
(
frame_parms
,
rxdataF_comp_ptr
,
rxdataF_comp_ptr
,
...
@@ -991,10 +1009,10 @@ int rx_pdsch(PHY_VARS_UE *ue,
...
@@ -991,10 +1009,10 @@ int rx_pdsch(PHY_VARS_UE *ue,
dl_ch_mag_ptr
,
dl_ch_mag_ptr
,
pdsch_vars
[
eNB_id
]
->
dl_ch_mag0
,
//i
pdsch_vars
[
eNB_id
]
->
dl_ch_mag0
,
//i
pdsch_vars
[
eNB_id
]
->
dl_ch_rho_ext
[
harq_pid
][
round
],
pdsch_vars
[
eNB_id
]
->
dl_ch_rho_ext
[
harq_pid
][
round
],
pdsch_vars
[
eNB_id
]
->
llr
[
1
]
,
(
int16_t
*
)
pllr_symbol_cw1
,
symbol
,
first_symbol_flag
,
nb_rb
,
symbol
,
first_symbol_flag
,
nb_rb
,
adjust_G2
(
frame_parms
,
dlsch1_harq
->
rb_alloc_even
,
6
,
subframe
,
symbol
),
adjust_G2
(
frame_parms
,
dlsch1_harq
->
rb_alloc_even
,
6
,
subframe
,
symbol
),
pdsch_vars
[
eNB_id
]
->
llr
128_2ndstream
);
pdsch_vars
[
eNB_id
]
->
llr
_offset
[
symbol
]
);
}
}
}
}
}
}
...
@@ -1010,10 +1028,9 @@ int rx_pdsch(PHY_VARS_UE *ue,
...
@@ -1010,10 +1028,9 @@ int rx_pdsch(PHY_VARS_UE *ue,
if
(
rx_type
==
rx_standard
)
{
if
(
rx_type
==
rx_standard
)
{
dlsch_qpsk_llr
(
frame_parms
,
dlsch_qpsk_llr
(
frame_parms
,
pdsch_vars
[
eNB_id
]
->
rxdataF_comp0
,
pdsch_vars
[
eNB_id
]
->
rxdataF_comp0
,
pdsch_vars
[
eNB_id
]
->
llr
[
0
]
,
(
int16_t
*
)
pllr_symbol_cw0
,
symbol
,
first_symbol_flag
,
nb_rb
,
symbol
,
first_symbol_flag
,
nb_rb
,
adjust_G2
(
frame_parms
,
dlsch0_harq
->
rb_alloc_even
,
2
,
subframe
,
symbol
),
adjust_G2
(
frame_parms
,
dlsch0_harq
->
rb_alloc_even
,
2
,
subframe
,
symbol
),
pdsch_vars
[
eNB_id
]
->
llr128
,
beamforming_mode
);
beamforming_mode
);
}
}
break
;
break
;
...
@@ -1033,12 +1050,12 @@ int rx_pdsch(PHY_VARS_UE *ue,
...
@@ -1033,12 +1050,12 @@ int rx_pdsch(PHY_VARS_UE *ue,
if
(
rx_type
==
rx_standard
)
{
if
(
rx_type
==
rx_standard
)
{
dlsch_64qam_llr
(
frame_parms
,
dlsch_64qam_llr
(
frame_parms
,
pdsch_vars
[
eNB_id
]
->
rxdataF_comp0
,
pdsch_vars
[
eNB_id
]
->
rxdataF_comp0
,
pdsch_vars
[
eNB_id
]
->
llr
[
0
]
,
(
int16_t
*
)
pllr_symbol_cw0
,
pdsch_vars
[
eNB_id
]
->
dl_ch_mag0
,
pdsch_vars
[
eNB_id
]
->
dl_ch_mag0
,
pdsch_vars
[
eNB_id
]
->
dl_ch_magb0
,
pdsch_vars
[
eNB_id
]
->
dl_ch_magb0
,
symbol
,
first_symbol_flag
,
nb_rb
,
symbol
,
first_symbol_flag
,
nb_rb
,
adjust_G2
(
frame_parms
,
dlsch0_harq
->
rb_alloc_even
,
6
,
subframe
,
symbol
),
adjust_G2
(
frame_parms
,
dlsch0_harq
->
rb_alloc_even
,
6
,
subframe
,
symbol
),
pdsch_vars
[
eNB_id
]
->
llr
128
,
pdsch_vars
[
eNB_id
]
->
llr
_offset
[
symbol
]
,
beamforming_mode
);
beamforming_mode
);
}
}
break
;
break
;
...
@@ -1096,6 +1113,9 @@ int rx_pdsch(PHY_VARS_UE *ue,
...
@@ -1096,6 +1113,9 @@ int rx_pdsch(PHY_VARS_UE *ue,
2
*
/* ulsch[UE_id]->harq_processes[harq_pid]->nb_rb */
frame_parms
->
N_RB_UL
*
12
*
frame_parms
->
symbols_per_tti
*
2
));
2
*
/* ulsch[UE_id]->harq_processes[harq_pid]->nb_rb */
frame_parms
->
N_RB_UL
*
12
*
frame_parms
->
symbols_per_tti
*
2
));
#endif
#endif
if
(
symbol
==
(
ue
->
frame_parms
.
symbols_per_tti
>>
1
))
//(first_symbol_flag)
proc
->
first_symbol_available
=
1
;
return
(
0
);
return
(
0
);
}
}
...
@@ -4604,7 +4624,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
...
@@ -4604,7 +4624,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
unsigned
char
subframe
,
unsigned
char
subframe
,
uint32_t
high_speed_flag
,
uint32_t
high_speed_flag
,
LTE_DL_FRAME_PARMS
*
frame_parms
,
LTE_DL_FRAME_PARMS
*
frame_parms
,
MIMO_mode_t
mimo_mode
)
{
MIMO_mode_t
mimo_mode
)
{
int
prb
,
nb_rb
=
0
;
int
prb
,
nb_rb
=
0
;
int
prb_off
,
prb_off2
;
int
prb_off
,
prb_off2
;
...
...
openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c
View file @
acdfffe7
...
@@ -636,7 +636,6 @@ int dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
...
@@ -636,7 +636,6 @@ int dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
uint8_t
first_symbol_flag
,
uint8_t
first_symbol_flag
,
uint16_t
nb_rb
,
uint16_t
nb_rb
,
uint16_t
pbch_pss_sss_adjust
,
uint16_t
pbch_pss_sss_adjust
,
int16_t
**
llr32p
,
uint8_t
beamforming_mode
)
uint8_t
beamforming_mode
)
{
{
...
@@ -645,12 +644,14 @@ int dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
...
@@ -645,12 +644,14 @@ int dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
int
i
,
len
;
int
i
,
len
;
uint8_t
symbol_mod
=
(
symbol
>=
(
7
-
frame_parms
->
Ncp
))
?
(
symbol
-
(
7
-
frame_parms
->
Ncp
))
:
symbol
;
uint8_t
symbol_mod
=
(
symbol
>=
(
7
-
frame_parms
->
Ncp
))
?
(
symbol
-
(
7
-
frame_parms
->
Ncp
))
:
symbol
;
/*
if (first_symbol_flag==1) {
if (first_symbol_flag==1) {
llr32 = (uint32_t*)dlsch_llr;
llr32 = (uint32_t*)dlsch_llr;
} else {
} else {
llr32 = (uint32_t*)(*llr32p);
llr32 = (uint32_t*)(*llr32p);
}
}
*/
llr32
=
(
uint32_t
*
)
dlsch_llr
;
if
(
!
llr32
)
{
if
(
!
llr32
)
{
msg
(
"dlsch_qpsk_llr: llr is null, symbol %d, llr32=%p
\n
"
,
symbol
,
llr32
);
msg
(
"dlsch_qpsk_llr: llr is null, symbol %d, llr32=%p
\n
"
,
symbol
,
llr32
);
return
(
-
1
);
return
(
-
1
);
...
@@ -672,6 +673,13 @@ int dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
...
@@ -672,6 +673,13 @@ int dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
//printf("dlsch_qpsk_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
//printf("dlsch_qpsk_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
/*LOG_I(PHY,"dlsch_qpsk_llr: [symb %d / FirstSym %d / Length %d]: @LLR Buff %x, @LLR Buff(symb) %x \n",
symbol,
first_symbol_flag,
len,
dlsch_llr,
llr32);*/
//printf("ll32p=%p , dlsch_llr=%p, symbol=%d, flag=%d \n", llr32, dlsch_llr, symbol, first_symbol_flag);
//printf("ll32p=%p , dlsch_llr=%p, symbol=%d, flag=%d \n", llr32, dlsch_llr, symbol, first_symbol_flag);
for
(
i
=
0
;
i
<
len
;
i
++
)
{
for
(
i
=
0
;
i
<
len
;
i
++
)
{
*
llr32
=
*
rxF
;
*
llr32
=
*
rxF
;
...
@@ -680,7 +688,7 @@ int dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
...
@@ -680,7 +688,7 @@ int dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
llr32
++
;
llr32
++
;
}
}
*
llr32p
=
(
int16_t
*
)
llr32
;
//
*llr32p = (int16_t *)llr32;
return
(
0
);
return
(
0
);
}
}
...
@@ -1043,7 +1051,8 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
...
@@ -1043,7 +1051,8 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
uint8_t
first_symbol_flag
,
uint8_t
first_symbol_flag
,
uint16_t
nb_rb
,
uint16_t
nb_rb
,
uint16_t
pbch_pss_sss_adjust
,
uint16_t
pbch_pss_sss_adjust
,
int16_t
**
llr_save
,
//int16_t **llr_save,
uint32_t
llr_offset
,
uint8_t
beamforming_mode
)
uint8_t
beamforming_mode
)
{
{
#if defined(__x86_64__) || defined(__i386__)
#if defined(__x86_64__) || defined(__i386__)
...
@@ -1057,11 +1066,18 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
...
@@ -1057,11 +1066,18 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
unsigned
char
symbol_mod
,
len_mod4
;
unsigned
char
symbol_mod
,
len_mod4
;
short
*
llr
;
short
*
llr
;
int16_t
*
llr2
;
int16_t
*
llr2
;
int8_t
*
pllr_symbol
;
/*
if (first_symbol_flag==1)
if (first_symbol_flag==1)
llr = dlsch_llr;
llr = dlsch_llr;
else
else
llr = *llr_save;
llr = *llr_save;
*/
llr
=
dlsch_llr
;
pllr_symbol
=
(
int8_t
*
)
dlsch_llr
;
pllr_symbol
+=
llr_offset
;
symbol_mod
=
(
symbol
>=
(
7
-
frame_parms
->
Ncp
))
?
symbol
-
(
7
-
frame_parms
->
Ncp
)
:
symbol
;
symbol_mod
=
(
symbol
>=
(
7
-
frame_parms
->
Ncp
))
?
symbol
-
(
7
-
frame_parms
->
Ncp
)
:
symbol
;
...
@@ -1085,6 +1101,15 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
...
@@ -1085,6 +1101,15 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
len
=
(
nb_rb
*
12
)
-
pbch_pss_sss_adjust
;
len
=
(
nb_rb
*
12
)
-
pbch_pss_sss_adjust
;
}
}
// printf("dlsch_64qam_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
/* LOG_I(PHY,"dlsch_64qam_llr [symb %d / FirstSym %d / Length %d]: @LLR Buff %x \n",
symbol,
first_symbol_flag,
len,
dlsch_llr,
pllr_symbol);*/
llr2
=
llr
;
llr2
=
llr
;
llr
+=
(
len
*
6
);
llr
+=
(
len
*
6
);
...
@@ -1179,7 +1204,6 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
...
@@ -1179,7 +1204,6 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
}
}
*
llr_save
=
llr
;
#if defined(__x86_64__) || defined(__i386__)
#if defined(__x86_64__) || defined(__i386__)
_mm_empty
();
_mm_empty
();
_m_empty
();
_m_empty
();
...
@@ -8794,7 +8818,8 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
...
@@ -8794,7 +8818,8 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
uint8_t
first_symbol_flag
,
uint8_t
first_symbol_flag
,
uint16_t
nb_rb
,
uint16_t
nb_rb
,
uint16_t
pbch_pss_sss_adjust
,
uint16_t
pbch_pss_sss_adjust
,
int16_t
**
llr16p
)
//int16_t **llr16p,
uint32_t
llr_offset
)
{
{
int16_t
*
rxF
=
(
int16_t
*
)
&
rxdataF_comp
[
0
][(
symbol
*
frame_parms
->
N_RB_DL
*
12
)];
int16_t
*
rxF
=
(
int16_t
*
)
&
rxdataF_comp
[
0
][(
symbol
*
frame_parms
->
N_RB_DL
*
12
)];
...
@@ -8803,16 +8828,18 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
...
@@ -8803,16 +8828,18 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
int16_t
*
ch_mag_i
=
(
int16_t
*
)
&
dl_ch_mag_i
[
0
][(
symbol
*
frame_parms
->
N_RB_DL
*
12
)];
int16_t
*
ch_mag_i
=
(
int16_t
*
)
&
dl_ch_mag_i
[
0
][(
symbol
*
frame_parms
->
N_RB_DL
*
12
)];
int16_t
*
rho
=
(
int16_t
*
)
&
rho_i
[
0
][(
symbol
*
frame_parms
->
N_RB_DL
*
12
)];
int16_t
*
rho
=
(
int16_t
*
)
&
rho_i
[
0
][(
symbol
*
frame_parms
->
N_RB_DL
*
12
)];
int16_t
*
llr16
;
int16_t
*
llr16
;
int8_t
*
pllr_symbol
;
// pointer where llrs should filled for this ofdm symbol
int
len
;
int
len
;
uint8_t
symbol_mod
=
(
symbol
>=
(
7
-
frame_parms
->
Ncp
))
?
(
symbol
-
(
7
-
frame_parms
->
Ncp
))
:
symbol
;
uint8_t
symbol_mod
=
(
symbol
>=
(
7
-
frame_parms
->
Ncp
))
?
(
symbol
-
(
7
-
frame_parms
->
Ncp
))
:
symbol
;
//first symbol has different structure due to more pilots
//first symbol has different structure due to more pilots
if
(
first_symbol_flag
==
1
)
{
/*
if (first_symbol_flag == 1) {
llr16 = (int16_t*)dlsch_llr;
llr16 = (int16_t*)dlsch_llr;
} else {
} else {
llr16 = (int16_t*)(*llr16p);
llr16 = (int16_t*)(*llr16p);
}
}
*/
llr16
=
(
int16_t
*
)
dlsch_llr
;
if
(
!
llr16
)
{
if
(
!
llr16
)
{
msg
(
"dlsch_64qam_64qam_llr: llr is null, symbol %d
\n
"
,
symbol
);
msg
(
"dlsch_64qam_64qam_llr: llr is null, symbol %d
\n
"
,
symbol
);
return
(
-
1
);
return
(
-
1
);
...
@@ -8831,6 +8858,18 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
...
@@ -8831,6 +8858,18 @@ 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
;
}
}
pllr_symbol
=
(
int8_t
*
)
dlsch_llr
;
pllr_symbol
+=
llr_offset
;
//printf("dlsch_64qam_64qam_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
/*LOG_I(PHY,"dlsch_64qam_64qam_llr [symb %d / FirstSym %d / Length %d / LLR Offset %d]: @LLR Buff %x, @LLR Buff(symb) %x, , @Compute LLR Buff(symb) %x \n",
symbol,
first_symbol_flag,
len,
llr_offset,
(int16_t*)dlsch_llr,
llr16,
pllr_symbol);*/
#ifdef __AVX2__
#ifdef __AVX2__
// Round length up to multiple of 16 words
// Round length up to multiple of 16 words
...
@@ -8864,6 +8903,7 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
...
@@ -8864,6 +8903,7 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
(
int32_t
*
)
rho_256i
,
(
int32_t
*
)
rho_256i
,
len
);
len
);
#endif
#endif
free16
(
rxF_256i
,
sizeof
(
rxF_256i
));
free16
(
rxF_256i
,
sizeof
(
rxF_256i
));
free16
(
rxF_i_256i
,
sizeof
(
rxF_i_256i
));
free16
(
rxF_i_256i
,
sizeof
(
rxF_i_256i
));
free16
(
ch_mag_256i
,
sizeof
(
ch_mag_256i
));
free16
(
ch_mag_256i
,
sizeof
(
ch_mag_256i
));
...
@@ -8881,6 +8921,7 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
...
@@ -8881,6 +8921,7 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
#endif
#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 @
acdfffe7
...
@@ -802,7 +802,8 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
...
@@ -802,7 +802,8 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
unsigned
char
first_symbol_flag
,
unsigned
char
first_symbol_flag
,
unsigned
short
nb_rb
,
unsigned
short
nb_rb
,
uint16_t
pbch_pss_sss_adjust
,
uint16_t
pbch_pss_sss_adjust
,
short
**
llr16p
);
//short **llr16p,
uint32_t
llr_offset
);
/** \brief This function generates log-likelihood ratios (decoder input) for single-stream QPSK received waveforms.
/** \brief This function generates log-likelihood ratios (decoder input) for single-stream QPSK received waveforms.
...
@@ -823,7 +824,7 @@ int32_t dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
...
@@ -823,7 +824,7 @@ int32_t dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
uint8_t
first_symbol_flag
,
uint8_t
first_symbol_flag
,
uint16_t
nb_rb
,
uint16_t
nb_rb
,
uint16_t
pbch_pss_sss_adj
,
uint16_t
pbch_pss_sss_adj
,
int16_t
**
llr128p
,
//
int16_t **llr128p,
uint8_t
beamforming_mode
);
uint8_t
beamforming_mode
);
/**
/**
...
@@ -912,7 +913,8 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
...
@@ -912,7 +913,8 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
uint8_t
first_symbol_flag
,
uint8_t
first_symbol_flag
,
uint16_t
nb_rb
,
uint16_t
nb_rb
,
uint16_t
pbch_pss_sss_adjust
,
uint16_t
pbch_pss_sss_adjust
,
int16_t
**
llr_save
,
//int16_t **llr_save,
uint32_t
llr_offset
,
uint8_t
beamforming_mode
);
uint8_t
beamforming_mode
);
...
@@ -1297,6 +1299,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
...
@@ -1297,6 +1299,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
@param i_mod Modulation order of the interfering stream
@param i_mod Modulation order of the interfering stream
*/
*/
int32_t
rx_pdsch
(
PHY_VARS_UE
*
phy_vars_ue
,
int32_t
rx_pdsch
(
PHY_VARS_UE
*
phy_vars_ue
,
UE_rxtx_proc_t
*
proc
,
PDSCH_t
type
,
PDSCH_t
type
,
uint8_t
eNB_id
,
uint8_t
eNB_id
,
uint8_t
eNB_id_i
,
uint8_t
eNB_id_i
,
...
@@ -1646,6 +1649,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
...
@@ -1646,6 +1649,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
void
*
dci_pdu
,
void
*
dci_pdu
,
rnti_t
rnti
,
rnti_t
rnti
,
DCI_format_t
dci_format
,
DCI_format_t
dci_format
,
LTE_UE_PDCCH
*
pdcch_vars
,
LTE_UE_PDSCH
*
pdsch_vars
,
LTE_UE_DLSCH_t
**
dlsch
,
LTE_UE_DLSCH_t
**
dlsch
,
LTE_DL_FRAME_PARMS
*
frame_parms
,
LTE_DL_FRAME_PARMS
*
frame_parms
,
PDSCH_CONFIG_DEDICATED
*
pdsch_config_dedicated
,
PDSCH_CONFIG_DEDICATED
*
pdsch_config_dedicated
,
...
...
openair1/PHY/MODULATION/defs.h
View file @
acdfffe7
...
@@ -78,6 +78,17 @@ int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms,
...
@@ -78,6 +78,17 @@ int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms,
unsigned
char
eNb_id
,
unsigned
char
eNb_id
,
int
no_prefix
);
int
no_prefix
);
int
front_end_fft
(
PHY_VARS_UE
*
ue
,
unsigned
char
l
,
unsigned
char
Ns
,
int
sample_offset
,
int
no_prefix
);
int
front_end_chanEst
(
PHY_VARS_UE
*
ue
,
unsigned
char
l
,
unsigned
char
Ns
,
int
reset_freq_est
);
void
normal_prefix_mod
(
int32_t
*
txdataF
,
int32_t
*
txdata
,
uint8_t
nsymb
,
LTE_DL_FRAME_PARMS
*
frame_parms
);
void
normal_prefix_mod
(
int32_t
*
txdataF
,
int32_t
*
txdata
,
uint8_t
nsymb
,
LTE_DL_FRAME_PARMS
*
frame_parms
);
void
do_OFDM_mod
(
int32_t
**
txdataF
,
int32_t
**
txdata
,
uint32_t
frame
,
uint16_t
next_slot
,
LTE_DL_FRAME_PARMS
*
frame_parms
);
void
do_OFDM_mod
(
int32_t
**
txdataF
,
int32_t
**
txdata
,
uint32_t
frame
,
uint16_t
next_slot
,
LTE_DL_FRAME_PARMS
*
frame_parms
);
...
...
openair1/PHY/MODULATION/slot_fep.c
View file @
acdfffe7
...
@@ -240,3 +240,215 @@ int slot_fep(PHY_VARS_UE *ue,
...
@@ -240,3 +240,215 @@ int slot_fep(PHY_VARS_UE *ue,
#endif
#endif
return
(
0
);
return
(
0
);
}
}
int
front_end_fft
(
PHY_VARS_UE
*
ue
,
unsigned
char
l
,
unsigned
char
Ns
,
int
sample_offset
,
int
no_prefix
)
{
LTE_DL_FRAME_PARMS
*
frame_parms
=
&
ue
->
frame_parms
;
LTE_UE_COMMON
*
common_vars
=
&
ue
->
common_vars
;
unsigned
char
aa
;
unsigned
char
symbol
=
l
+
((
7
-
frame_parms
->
Ncp
)
*
(
Ns
&
1
));
///symbol within sub-frame
unsigned
int
nb_prefix_samples
=
(
no_prefix
?
0
:
frame_parms
->
nb_prefix_samples
);
unsigned
int
nb_prefix_samples0
=
(
no_prefix
?
0
:
frame_parms
->
nb_prefix_samples0
);
unsigned
int
subframe_offset
;
//,subframe_offset_F;
unsigned
int
slot_offset
;
unsigned
int
frame_length_samples
=
frame_parms
->
samples_per_tti
*
10
;
unsigned
int
rx_offset
;
/*LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id];
unsigned char harq_pid = dlsch_ue[0]->current_harq_pid;
LTE_DL_UE_HARQ_t *dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid];
int uespec_pilot[9][1200];*/
void
(
*
dft
)(
int16_t
*
,
int16_t
*
,
int
);
int
tmp_dft_in
[
2048
]
__attribute__
((
aligned
(
32
)));
// This is for misalignment issues for 6 and 15 PRBs
switch
(
frame_parms
->
ofdm_symbol_size
)
{
case
128
:
dft
=
dft128
;
break
;
case
256
:
dft
=
dft256
;
break
;
case
512
:
dft
=
dft512
;
break
;
case
1024
:
dft
=
dft1024
;
break
;
case
1536
:
dft
=
dft1536
;
break
;
case
2048
:
dft
=
dft2048
;
break
;
default:
dft
=
dft512
;
break
;
}
if
(
no_prefix
)
{
subframe_offset
=
frame_parms
->
ofdm_symbol_size
*
frame_parms
->
symbols_per_tti
*
(
Ns
>>
1
);
slot_offset
=
frame_parms
->
ofdm_symbol_size
*
(
frame_parms
->
symbols_per_tti
>>
1
)
*
(
Ns
%
2
);
}
else
{
subframe_offset
=
frame_parms
->
samples_per_tti
*
(
Ns
>>
1
);
slot_offset
=
(
frame_parms
->
samples_per_tti
>>
1
)
*
(
Ns
%
2
);
}
// subframe_offset_F = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_tti * (Ns>>1);
if
(
l
<
0
||
l
>=
7
-
frame_parms
->
Ncp
)
{
printf
(
"slot_fep: l must be between 0 and %d
\n
"
,
7
-
frame_parms
->
Ncp
);
return
(
-
1
);
}
if
(
Ns
<
0
||
Ns
>=
20
)
{
printf
(
"slot_fep: Ns must be between 0 and 19
\n
"
);
return
(
-
1
);
}
for
(
aa
=
0
;
aa
<
frame_parms
->
nb_antennas_rx
;
aa
++
)
{
memset
(
&
common_vars
->
common_vars_rx_data_per_thread
[(
Ns
>>
1
)
&
0x1
].
rxdataF
[
aa
][
frame_parms
->
ofdm_symbol_size
*
symbol
],
0
,
frame_parms
->
ofdm_symbol_size
*
sizeof
(
int
));
rx_offset
=
sample_offset
+
slot_offset
+
nb_prefix_samples0
+
subframe_offset
-
SOFFSET
;
// Align with 256 bit
// rx_offset = rx_offset&0xfffffff8;
if
(
l
==
0
)
{
if
(
rx_offset
>
(
frame_length_samples
-
frame_parms
->
ofdm_symbol_size
))
memcpy
((
short
*
)
&
common_vars
->
rxdata
[
aa
][
frame_length_samples
],
(
short
*
)
&
common_vars
->
rxdata
[
aa
][
0
],
frame_parms
->
ofdm_symbol_size
*
sizeof
(
int
));
if
((
rx_offset
&
7
)
!=
0
)
{
// if input to dft is not 256-bit aligned, issue for size 6,15 and 25 PRBs
memcpy
((
void
*
)
tmp_dft_in
,
(
void
*
)
&
common_vars
->
rxdata
[
aa
][
rx_offset
%
frame_length_samples
],
frame_parms
->
ofdm_symbol_size
*
sizeof
(
int
));
dft
((
int16_t
*
)
tmp_dft_in
,
(
int16_t
*
)
&
common_vars
->
common_vars_rx_data_per_thread
[(
Ns
>>
1
)
&
0x1
].
rxdataF
[
aa
][
frame_parms
->
ofdm_symbol_size
*
symbol
],
1
);
}
else
{
// use dft input from RX buffer directly
start_meas
(
&
ue
->
rx_dft_stats
);
dft
((
int16_t
*
)
&
common_vars
->
rxdata
[
aa
][(
rx_offset
)
%
frame_length_samples
],
(
int16_t
*
)
&
common_vars
->
common_vars_rx_data_per_thread
[(
Ns
>>
1
)
&
0x1
].
rxdataF
[
aa
][
frame_parms
->
ofdm_symbol_size
*
symbol
],
1
);
stop_meas
(
&
ue
->
rx_dft_stats
);
}
}
else
{
rx_offset
+=
(
frame_parms
->
ofdm_symbol_size
+
nb_prefix_samples
)
*
l
;
// +
// (frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1);
#ifdef DEBUG_FEP
// if (ue->frame <100)
LOG_I
(
PHY
,
"slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, subframe_offset %d, sample_offset %d,rx_offset %d, frame_length_samples %d
\n
"
,
ue
->
proc
.
proc_rxtx
[(
Ns
>>
1
)
&
1
].
frame_rx
,
Ns
,
symbol
,
nb_prefix_samples
,
nb_prefix_samples0
,
slot_offset
,
subframe_offset
,
sample_offset
,
rx_offset
,
frame_length_samples
);
#endif
if
(
rx_offset
>
(
frame_length_samples
-
frame_parms
->
ofdm_symbol_size
))
memcpy
((
void
*
)
&
common_vars
->
rxdata
[
aa
][
frame_length_samples
],
(
void
*
)
&
common_vars
->
rxdata
[
aa
][
0
],
frame_parms
->
ofdm_symbol_size
*
sizeof
(
int
));
start_meas
(
&
ue
->
rx_dft_stats
);
if
((
rx_offset
&
7
)
!=
0
)
{
// if input to dft is not 128-bit aligned, issue for size 6 and 15 PRBs
memcpy
((
void
*
)
tmp_dft_in
,
(
void
*
)
&
common_vars
->
rxdata
[
aa
][(
rx_offset
)
%
frame_length_samples
],
frame_parms
->
ofdm_symbol_size
*
sizeof
(
int
));
dft
((
int16_t
*
)
tmp_dft_in
,
(
int16_t
*
)
&
common_vars
->
common_vars_rx_data_per_thread
[(
Ns
>>
1
)
&
0x1
].
rxdataF
[
aa
][
frame_parms
->
ofdm_symbol_size
*
symbol
],
1
);
}
else
{
// use dft input from RX buffer directly
dft
((
int16_t
*
)
&
common_vars
->
rxdata
[
aa
][(
rx_offset
)
%
frame_length_samples
],
(
int16_t
*
)
&
common_vars
->
common_vars_rx_data_per_thread
[(
Ns
>>
1
)
&
0x1
].
rxdataF
[
aa
][
frame_parms
->
ofdm_symbol_size
*
symbol
],
1
);
}
stop_meas
(
&
ue
->
rx_dft_stats
);
}
#ifdef DEBUG_FEP
// if (ue->frame <100)
printf
(
"slot_fep: frame %d: symbol %d rx_offset %d
\n
"
,
ue
->
proc
.
proc_rxtx
[(
Ns
>>
1
)
&
1
].
frame_rx
,
symbol
,
rx_offset
);
#endif
}
return
(
0
);
}
int
front_end_chanEst
(
PHY_VARS_UE
*
ue
,
unsigned
char
l
,
unsigned
char
Ns
,
int
reset_freq_est
)
{
LTE_DL_FRAME_PARMS
*
frame_parms
=
&
ue
->
frame_parms
;
LTE_UE_COMMON
*
common_vars
=
&
ue
->
common_vars
;
uint8_t
eNB_id
=
0
;
//ue_common_vars->eNb_id;
unsigned
char
aa
;
unsigned
char
symbol
=
l
+
((
7
-
frame_parms
->
Ncp
)
*
(
Ns
&
1
));
///symbol within sub-frame
int
i
;
/*LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id];
unsigned char harq_pid = dlsch_ue[0]->current_harq_pid;
LTE_DL_UE_HARQ_t *dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid];
int uespec_pilot[9][1200];*/
if
(
ue
->
perfect_ce
==
0
)
{
if
((
l
==
0
)
||
(
l
==
(
4
-
frame_parms
->
Ncp
)))
{
for
(
aa
=
0
;
aa
<
frame_parms
->
nb_antenna_ports_eNB
;
aa
++
)
{
#ifdef DEBUG_FEP
printf
(
"Channel estimation eNB %d, aatx %d, slot %d, symbol %d
\n
"
,
eNB_id
,
aa
,
Ns
,
l
);
#endif
start_meas
(
&
ue
->
dlsch_channel_estimation_stats
);
lte_dl_channel_estimation
(
ue
,
eNB_id
,
0
,
Ns
,
aa
,
l
,
symbol
);
stop_meas
(
&
ue
->
dlsch_channel_estimation_stats
);
for
(
i
=
0
;
i
<
ue
->
measurements
.
n_adj_cells
;
i
++
)
{
lte_dl_channel_estimation
(
ue
,
eNB_id
,
i
+
1
,
Ns
,
aa
,
l
,
symbol
);
}
}
// do frequency offset estimation here!
// use channel estimates from current symbol (=ch_t) and last symbol (ch_{t-1})
#ifdef DEBUG_FEP
printf
(
"Frequency offset estimation
\n
"
);
#endif
if
(
l
==
(
4
-
frame_parms
->
Ncp
))
{
start_meas
(
&
ue
->
dlsch_freq_offset_estimation_stats
);
lte_est_freq_offset
(
common_vars
->
common_vars_rx_data_per_thread
[(
Ns
>>
1
)
&
0x1
].
dl_ch_estimates
[
0
],
frame_parms
,
l
,
&
common_vars
->
freq_offset
,
reset_freq_est
);
stop_meas
(
&
ue
->
dlsch_freq_offset_estimation_stats
);
}
}
}
return
(
0
);
}
openair1/PHY/defs.h
View file @
acdfffe7
...
@@ -392,6 +392,25 @@ typedef struct {
...
@@ -392,6 +392,25 @@ typedef struct {
pthread_mutex_t
mutex_rxtx
;
pthread_mutex_t
mutex_rxtx
;
/// scheduling parameters for RXn-TXnp4 thread
/// scheduling parameters for RXn-TXnp4 thread
struct
sched_param
sched_param_rxtx
;
struct
sched_param
sched_param_rxtx
;
/// internal This variable is protected by ref mutex_fep_slot1.
int
instance_cnt_fep_slot1
;
/// pthread descriptor fep_slot1 thread
pthread_t
pthread_fep_slot1
;
/// pthread attributes for fep_slot1 processing thread
pthread_attr_t
attr_fep_slot1
;
/// condition variable for UE fep_slot1 thread;
pthread_cond_t
cond_fep_slot1
;
/// mutex for UE synch thread
pthread_mutex_t
mutex_fep_slot1
;
//
uint8_t
chan_est_pilot0_slot1_available
;
uint8_t
llr_slot1_available
;
uint8_t
dci_slot0_available
;
uint8_t
first_symbol_available
;
/// scheduling parameters for fep_slot1 thread
struct
sched_param
sched_param_fep_slot1
;
int
sub_frame_start
;
int
sub_frame_start
;
int
sub_frame_step
;
int
sub_frame_step
;
unsigned
long
long
gotIQs
;
unsigned
long
long
gotIQs
;
...
@@ -931,6 +950,14 @@ typedef struct {
...
@@ -931,6 +950,14 @@ typedef struct {
}
PHY_VARS_UE
;
}
PHY_VARS_UE
;
/* this structure is used to pass both UE phy vars and
* proc to the function UE_thread_rxn_txnp4
*/
struct
rx_tx_thread_data
{
PHY_VARS_UE
*
UE
;
UE_rxtx_proc_t
*
proc
;
};
void
exit_fun
(
const
char
*
s
);
void
exit_fun
(
const
char
*
s
);
static
inline
int
wait_on_condition
(
pthread_mutex_t
*
mutex
,
pthread_cond_t
*
cond
,
int
*
instance_cnt
,
char
*
name
)
{
static
inline
int
wait_on_condition
(
pthread_mutex_t
*
mutex
,
pthread_cond_t
*
cond
,
int
*
instance_cnt
,
char
*
name
)
{
...
...
openair1/PHY/impl_defs_lte.h
View file @
acdfffe7
...
@@ -925,6 +925,10 @@ typedef struct {
...
@@ -925,6 +925,10 @@ typedef struct {
//uint32_t *rb_alloc;
//uint32_t *rb_alloc;
//uint8_t Qm[2];
//uint8_t Qm[2];
//MIMO_mode_t mimo_mode;
//MIMO_mode_t mimo_mode;
// llr offset per ofdm symbol
uint32_t
llr_offset
[
14
];
// llr length per ofdm symbol
uint32_t
llr_length
[
14
];
}
LTE_UE_PDSCH
;
}
LTE_UE_PDSCH
;
typedef
struct
{
typedef
struct
{
...
...
openair1/SCHED/defs.h
View file @
acdfffe7
...
@@ -140,6 +140,8 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t
...
@@ -140,6 +140,8 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t
*/
*/
int
phy_procedures_UE_RX
(
PHY_VARS_UE
*
phy_vars_ue
,
UE_rxtx_proc_t
*
proc
,
uint8_t
eNB_id
,
uint8_t
abstraction_flag
,
runmode_t
mode
,
relaying_type_t
r_type
,
PHY_VARS_RN
*
phy_vars_rn
);
int
phy_procedures_UE_RX
(
PHY_VARS_UE
*
phy_vars_ue
,
UE_rxtx_proc_t
*
proc
,
uint8_t
eNB_id
,
uint8_t
abstraction_flag
,
runmode_t
mode
,
relaying_type_t
r_type
,
PHY_VARS_RN
*
phy_vars_rn
);
void
*
UE_thread_fep_slot1
(
void
*
arg
);
/*! \brief Scheduling for UE TX procedures in TDD S-subframes.
/*! \brief Scheduling for UE TX procedures in TDD S-subframes.
@param phy_vars_ue Pointer to UE variables on which to act
@param phy_vars_ue Pointer to UE variables on which to act
@param eNB_id Local id of eNB on which to act
@param eNB_id Local id of eNB on which to act
...
...
openair1/SCHED/phy_procedures_lte_ue.c
View file @
acdfffe7
This diff is collapsed.
Click to expand it.
targets/RT/USER/lte-ue.c
View file @
acdfffe7
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