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
ac4c0af1
Commit
ac4c0af1
authored
Jun 26, 2017
by
fnabet
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
prepare for rebase from 2017.w25
parent
4969fbac
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
503 additions
and
0 deletions
+503
-0
openair1/SCHED/phy_procedures_lte_ue.c
openair1/SCHED/phy_procedures_lte_ue.c
+503
-0
No files found.
openair1/SCHED/phy_procedures_lte_ue.c
View file @
ac4c0af1
...
@@ -4937,6 +4937,509 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
...
@@ -4937,6 +4937,509 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
return
(
0
);
return
(
0
);
}
}
static
int
phy_procedures_UE_RX_new
(
PHY_VARS_UE
*
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
l
,
l2
;
int
pmch_flag
=
0
;
int
frame_rx
=
proc
->
frame_rx
;
int
subframe_rx
=
proc
->
subframe_rx
;
uint8_t
pilot0
;
uint8_t
pilot1
;
uint8_t
slot0
;
uint8_t
slot1
;
uint8_t
first_ofdm_sym
;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX
,
VCD_FUNCTION_IN
);
#if T_TRACER
T
(
T_UE_PHY_DL_TICK
,
T_INT
(
ue
->
Mod_id
),
T_INT
(
frame_rx
%
1024
),
T_INT
(
subframe_rx
));
#endif
T
(
T_UE_PHY_INPUT_SIGNAL
,
T_INT
(
ue
->
Mod_id
),
T_INT
(
frame_rx
%
1024
),
T_INT
(
subframe_rx
),
T_INT
(
0
),
T_BUFFER
(
&
ue
->
common_vars
.
rxdata
[
0
][
subframe_rx
*
ue
->
frame_parms
.
samples_per_tti
],
ue
->
frame_parms
.
samples_per_tti
*
4
));
// start timers
LOG_I
(
PHY
,
" ****** start RX-Chain for AbsSubframe %d.%d ******
\n
"
,
frame_rx
%
1024
,
subframe_rx
);
start_meas
(
&
ue
->
phy_proc_rx
[
subframe_rx
&
0x1
]);
start_meas
(
&
ue
->
generic_stat
);
pmch_flag
=
is_pmch_subframe
(
frame_rx
,
subframe_rx
,
&
ue
->
frame_parms
)
?
1
:
0
;
// deactivate reception until we scan pdcch
if
(
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
0
])
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
active
=
0
;
if
(
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
1
])
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
1
]
->
active
=
0
;
if
(
ue
->
dlsch_SI
[
eNB_id
])
ue
->
dlsch_SI
[
eNB_id
]
->
active
=
0
;
if
(
ue
->
dlsch_p
[
eNB_id
])
ue
->
dlsch_p
[
eNB_id
]
->
active
=
0
;
if
(
ue
->
dlsch_ra
[
eNB_id
])
ue
->
dlsch_ra
[
eNB_id
]
->
active
=
0
;
if
(
subframe_select
(
&
ue
->
frame_parms
,
subframe_rx
)
==
SF_S
)
{
// S-subframe, do first 5 symbols only
l2
=
5
;
}
else
if
(
pmch_flag
==
1
)
{
// do first 2 symbols only
l2
=
1
;
}
else
{
// normal subframe, last symbol to be processed is the first of the second slot
l2
=
(
ue
->
frame_parms
.
symbols_per_tti
/
2
)
-
1
;
}
int
prev_subframe_rx
=
(
subframe_rx
-
1
)
<
0
?
9
:
(
subframe_rx
-
1
);
if
(
subframe_select
(
&
ue
->
frame_parms
,
prev_subframe_rx
)
!=
SF_DL
)
{
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// RX processing of symbols l=0...l2
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
first_ofdm_sym
=
0
;
}
else
{
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// RX processing of symbols l=1...l2 (l=0 is done in last scheduling epoch)
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
first_ofdm_sym
=
1
;
}
slot0
=
(
subframe_rx
<<
1
);
slot1
=
(
subframe_rx
<<
1
)
+
1
;
pilot0
=
0
;
if
(
ue
->
frame_parms
.
Ncp
==
0
)
{
// normal prefix
pilot1
=
4
;
}
else
{
// extended prefix
pilot1
=
3
;
}
//LOG_I(PHY,"Set available channelEst to 0 AbsSubframe %d.%d \n",frame_rx,subframe_rx);
//LOG_I(PHY,"Set available llrs slot1 to 0 AbsSubframe %d.%d \n",frame_rx,subframe_rx);
//LOG_I(PHY,"Set available dci info slot0 to 0 AbsSubframe %d.%d \n",frame_rx,subframe_rx);
proc
->
chan_est_pilot0_slot1_available
=
0
;
proc
->
llr_slot1_available
=
0
;
proc
->
dci_slot0_available
=
0
;
proc
->
first_symbol_available
=
0
;
#ifdef UE_SLOT_PARALLELISATION
//LOG_I(PHY,"fep slot1 thread : instance_cnt %d \n",
// proc->instance_cnt_fep_slot1);
proc
->
instance_cnt_fep_slot1
++
;
if
(
proc
->
instance_cnt_fep_slot1
==
0
)
{
LOG_I
(
PHY
,
"unblock fep slot1 thread blocked on cond_fep_slot1 : instance_cnt_fep_slot1 %d
\n
"
,
proc
->
instance_cnt_fep_slot1
);
if
(
pthread_cond_signal
(
&
proc
->
cond_fep_slot1
)
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][UE %d] ERROR pthread_cond_signal for UE FEP slot1 thread
\n
"
,
ue
->
Mod_id
);
exit_fun
(
"nothing to add"
);
}
}
else
{
LOG_E
(
PHY
,
"[SCHED][UE %d] UE RX thread busy (IC %d)!!
\n
"
,
ue
->
Mod_id
,
proc
->
instance_cnt_fep_slot1
);
if
(
proc
->
instance_cnt_fep_slot1
>
2
)
exit_fun
(
"instance_cnt_fep_slot1 > 2"
);
}
AssertFatal
(
pthread_cond_signal
(
&
proc
->
cond_fep_slot1
)
==
0
,
""
);
AssertFatal
(
pthread_mutex_unlock
(
&
proc
->
mutex_fep_slot1
)
==
0
,
""
);
#endif
/**** FFT Slot0 + Slot1 ****/
// I- start main thread for FFT/ChanEst symbol: 0/1 --> 7
// 1- perform FFT for pilot ofdm symbols first (ofdmSym7 ofdmSym4 or (ofdmSym6 ofdmSym3))
LOG_I
(
PHY
,
"FFT symbol %d slot %d
\n
"
,
pilot0
,
slot1
);
front_end_fft
(
ue
,
pilot0
,
slot1
,
0
,
0
);
LOG_I
(
PHY
,
"FFT symbol %d slot %d
\n
"
,
pilot1
,
slot0
);
front_end_fft
(
ue
,
pilot1
,
slot0
,
0
,
0
);
LOG_I
(
PHY
,
"ChanEst symbol %d slot %d
\n
"
,
pilot1
,
slot0
);
front_end_chanEst
(
ue
,
pilot1
,
slot0
,
0
);
LOG_I
(
PHY
,
"ChanEst symbol %d slot %d
\n
"
,
pilot0
,
slot1
);
front_end_chanEst
(
ue
,
pilot0
,
slot1
,
0
);
proc
->
chan_est_pilot0_slot1_available
=
1
;
LOG_I
(
PHY
,
"Set available channelEst to 1 AbsSubframe %d.%d
\n
"
,
frame_rx
,
subframe_rx
);
// 2- perform FFT for other ofdm symbols other than pilots
for
(
l
=
first_ofdm_sym
;
l
<=
l2
;
l
++
)
{
if
(
(
l
!=
pilot0
)
&&
(
l
!=
pilot1
))
{
LOG_I
(
PHY
,
"FFT symbol %d slot %d
\n
"
,
l
,
slot0
);
start_meas
(
&
ue
->
ofdm_demod_stats
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP
,
VCD_FUNCTION_IN
);
front_end_fft
(
ue
,
l
,
slot0
,
0
,
0
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP
,
VCD_FUNCTION_OUT
);
stop_meas
(
&
ue
->
ofdm_demod_stats
);
}
}
// for l=1..l2
// 3- perform Channel Estimation for slot0
for
(
l
=
first_ofdm_sym
;
l
<=
l2
;
l
++
)
{
if
(
(
l
!=
pilot0
)
&&
(
l
!=
pilot1
))
{
LOG_I
(
PHY
,
"ChanEst symbol %d slot %d
\n
"
,
l
,
slot0
);
front_end_chanEst
(
ue
,
l
,
slot0
,
0
);
}
ue_measurement_procedures
(
l
-
1
,
ue
,
proc
,
eNB_id
,(
subframe_rx
<<
1
),
abstraction_flag
,
mode
);
}
// PDCCH decoding
if
(
ue_pdcch_procedures
(
eNB_id
,
ue
,
proc
,
abstraction_flag
)
==
-
1
)
{
LOG_E
(
PHY
,
"[UE %d] Frame %d, subframe %d: Error in pdcch procedures
\n
"
,
ue
->
Mod_id
,
frame_rx
,
subframe_rx
);
return
(
-
1
);
}
LOG_I
(
PHY
,
"num_pdcch_symbols %d
\n
"
,
ue
->
pdcch_vars
[
subframe_rx
&
0x1
][
eNB_id
]
->
num_pdcch_symbols
);
LOG_I
(
PHY
,
"Set available dci slot0 to 1 AbsSubframe %d.%d
\n
"
,
frame_rx
%
1024
,
subframe_rx
);
proc
->
dci_slot0_available
=
1
;
// If this is PMCH, call procedures and return
if
(
pmch_flag
==
1
)
{
ue_pmch_procedures
(
ue
,
proc
,
eNB_id
,
abstraction_flag
);
return
0
;
}
#if 1
// II- start slave thread for FFT/ChanEst
// do first symbol of next downlink subframe for channel estimation
int
next_subframe_rx
=
(
1
+
subframe_rx
)
%
10
;
uint8_t
next_subframe_slot0
=
next_subframe_rx
<<
1
;
// 1- perform FFT for pilot ofdm symbols first (ofdmSym0 next subframe ofdmSym11)
if
(
subframe_select
(
&
ue
->
frame_parms
,
next_subframe_rx
)
!=
SF_UL
)
{
LOG_I
(
PHY
,
"FFT symbol %d slot %d
\n
"
,
pilot0
,
next_subframe_slot0
);
front_end_fft
(
ue
,
pilot0
,
next_subframe_slot0
,
0
,
0
);
}
LOG_I
(
PHY
,
"FFT symbol %d slot %d
\n
"
,
pilot1
,
slot1
);
front_end_fft
(
ue
,
pilot1
,
slot1
,
0
,
0
);
// 2- perform FFT for other ofdm symbols other than pilots
for
(
l
=
1
;
l
<
ue
->
frame_parms
.
symbols_per_tti
>>
1
;
l
++
)
{
if
(
(
l
!=
pilot0
)
&&
(
l
!=
pilot1
))
{
LOG_I
(
PHY
,
"FFT symbol %d slot %d
\n
"
,
l
,
slot1
);
start_meas
(
&
ue
->
ofdm_demod_stats
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP
,
VCD_FUNCTION_IN
);
front_end_fft
(
ue
,
l
,
slot1
,
0
,
0
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP
,
VCD_FUNCTION_OUT
);
stop_meas
(
&
ue
->
ofdm_demod_stats
);
}
}
// for l=1..l2
// 3- perform Channel Estimation for slot1
for
(
l
=
1
;
l
<
ue
->
frame_parms
.
symbols_per_tti
>>
1
;
l
++
)
{
if
(
l
==
pilot0
)
{
//wait until channel estimation for pilot0/slot1 is available
uint32_t
wait
=
0
;
while
(
proc
->
chan_est_pilot0_slot1_available
==
0
)
{
wait
++
;
}
}
LOG_I
(
PHY
,
"ChanEst symbol %d slot %d
\n
"
,
l
,
slot1
);
front_end_chanEst
(
ue
,
l
,
slot1
,
0
);
ue_measurement_procedures
(
l
-
1
,
ue
,
proc
,
eNB_id
,
1
+
(
subframe_rx
<<
1
),
abstraction_flag
,
mode
);
}
LOG_I
(
PHY
,
"ChanEst symbol %d slot %d
\n
"
,
0
,
next_subframe_slot0
);
front_end_chanEst
(
ue
,
pilot0
,
next_subframe_slot0
,
0
);
if
(
(
subframe_rx
==
0
)
&&
(
ue
->
decode_MIB
==
1
))
{
ue_pbch_procedures
(
eNB_id
,
ue
,
proc
,
abstraction_flag
);
}
#endif
stop_meas
(
&
ue
->
generic_stat
);
//printf("------Front-End PROC [SFN %d]: %5.2f ------\n",subframe_rx,ue->generic_stat.p_time/(cpuf*1000.0));
/**** End Subframe FFT-ChannelEst ****/
/**** Pdsch Procedure Slot0 + Slot1 ****/
// start main thread for Pdsch Procedure (slot0)
// do procedures for C-RNTI
//LOG_I(PHY,"AbsSubframe %d.%d Pdsch Procedure (slot0)\n",frame_rx%1024,subframe_rx);
//LOG_I(PHY,"AbsSubframe %d.%d Pdsch Procedure PDSCH Active %d \n",frame_rx%1024,subframe_rx, ue->dlsch[subframe_rx&0x1][0][0]->active);
start_meas
(
&
ue
->
generic_stat
);
if
(
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
active
==
1
)
{
LOG_I
(
PHY
,
"AbsSubframe %d.%d Pdsch Procedure PDSCH
\n
"
,
frame_rx
%
1024
,
subframe_rx
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC
,
VCD_FUNCTION_IN
);
ue_pdsch_procedures
(
ue
,
proc
,
eNB_id
,
PDSCH
,
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
0
],
NULL
,
ue
->
pdcch_vars
[
subframe_rx
&
0x1
][
eNB_id
]
->
num_pdcch_symbols
,
ue
->
frame_parms
.
symbols_per_tti
>>
1
,
abstraction_flag
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC
,
VCD_FUNCTION_OUT
);
}
// do procedures for SI-RNTI
if
((
ue
->
dlsch_SI
[
eNB_id
])
&&
(
ue
->
dlsch_SI
[
eNB_id
]
->
active
==
1
))
{
LOG_I
(
PHY
,
"AbsSubframe %d.%d Pdsch Procedure SI-PDSCH
\n
"
,
frame_rx
%
1024
,
subframe_rx
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI
,
VCD_FUNCTION_IN
);
ue_pdsch_procedures
(
ue
,
proc
,
eNB_id
,
SI_PDSCH
,
ue
->
dlsch_SI
[
eNB_id
],
NULL
,
ue
->
pdcch_vars
[
subframe_rx
&
0x1
][
eNB_id
]
->
num_pdcch_symbols
,
ue
->
frame_parms
.
symbols_per_tti
>>
1
,
abstraction_flag
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI
,
VCD_FUNCTION_OUT
);
}
// do procedures for SI-RNTI
if
((
ue
->
dlsch_p
[
eNB_id
])
&&
(
ue
->
dlsch_p
[
eNB_id
]
->
active
==
1
))
{
LOG_I
(
PHY
,
"AbsSubframe %d.%d Pdsch Procedure P-PDSCH
\n
"
,
frame_rx
%
1024
,
subframe_rx
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P
,
VCD_FUNCTION_IN
);
ue_pdsch_procedures
(
ue
,
proc
,
eNB_id
,
P_PDSCH
,
ue
->
dlsch_p
[
eNB_id
],
NULL
,
ue
->
pdcch_vars
[
subframe_rx
&
0x1
][
eNB_id
]
->
num_pdcch_symbols
,
ue
->
frame_parms
.
symbols_per_tti
>>
1
,
abstraction_flag
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P
,
VCD_FUNCTION_OUT
);
}
// do procedures for RA-RNTI
if
((
ue
->
dlsch_ra
[
eNB_id
])
&&
(
ue
->
dlsch_ra
[
eNB_id
]
->
active
==
1
))
{
LOG_I
(
PHY
,
"AbsSubframe %d.%d Pdsch Procedure RA-PDSCH
\n
"
,
frame_rx
%
1024
,
subframe_rx
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA
,
VCD_FUNCTION_IN
);
ue_pdsch_procedures
(
ue
,
proc
,
eNB_id
,
RA_PDSCH
,
ue
->
dlsch_ra
[
eNB_id
],
NULL
,
ue
->
pdcch_vars
[
subframe_rx
&
0x1
][
eNB_id
]
->
num_pdcch_symbols
,
ue
->
frame_parms
.
symbols_per_tti
>>
1
,
abstraction_flag
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA
,
VCD_FUNCTION_OUT
);
}
stop_meas
(
&
ue
->
generic_stat
);
//printf("------LLR-Slot0 [SFN %d]: %5.2f ------\n",subframe_rx,ue->generic_stat.p_time/(cpuf*1000.0));
#if 1
// start slave thread for Pdsch Procedure (slot1)
// do procedures for C-RNTI
if
(
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
active
==
1
)
{
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC
,
VCD_FUNCTION_IN
);
start_meas
(
&
ue
->
pdsch_procedures_stat
);
ue_pdsch_procedures
(
ue
,
proc
,
eNB_id
,
PDSCH
,
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
0
],
NULL
,
1
+
(
ue
->
frame_parms
.
symbols_per_tti
>>
1
),
ue
->
frame_parms
.
symbols_per_tti
-
1
,
abstraction_flag
);
stop_meas
(
&
ue
->
pdsch_procedures_stat
);
}
// do procedures for SI-RNTI
if
((
ue
->
dlsch_SI
[
eNB_id
])
&&
(
ue
->
dlsch_SI
[
eNB_id
]
->
active
==
1
))
{
ue_pdsch_procedures
(
ue
,
proc
,
eNB_id
,
SI_PDSCH
,
ue
->
dlsch_SI
[
eNB_id
],
NULL
,
1
+
(
ue
->
frame_parms
.
symbols_per_tti
>>
1
),
ue
->
frame_parms
.
symbols_per_tti
-
1
,
abstraction_flag
);
}
// do procedures for P-RNTI
if
((
ue
->
dlsch_p
[
eNB_id
])
&&
(
ue
->
dlsch_p
[
eNB_id
]
->
active
==
1
))
{
ue_pdsch_procedures
(
ue
,
proc
,
eNB_id
,
P_PDSCH
,
ue
->
dlsch_p
[
eNB_id
],
NULL
,
1
+
(
ue
->
frame_parms
.
symbols_per_tti
>>
1
),
ue
->
frame_parms
.
symbols_per_tti
-
1
,
abstraction_flag
);
}
// do procedures for RA-RNTI
if
((
ue
->
dlsch_ra
[
eNB_id
])
&&
(
ue
->
dlsch_ra
[
eNB_id
]
->
active
==
1
))
{
ue_pdsch_procedures
(
ue
,
proc
,
eNB_id
,
RA_PDSCH
,
ue
->
dlsch_ra
[
eNB_id
],
NULL
,
1
+
(
ue
->
frame_parms
.
symbols_per_tti
>>
1
),
ue
->
frame_parms
.
symbols_per_tti
-
1
,
abstraction_flag
);
}
proc
->
llr_slot1_available
=
1
;
#endif
start_meas
(
&
ue
->
generic_stat
);
// wait until llr on slot1 are available
uint32_t
wait
=
0
;
while
(
proc
->
llr_slot1_available
==
0
)
{
//wait until channel estimation for pilot0/slot1 is available
usleep
(
1
);
wait
++
;
}
stop_meas
(
&
ue
->
generic_stat
);
//printf("------ Waiting for LLR-Slot1 [SFN %d]: %5.2f ------\n",subframe_rx,ue->generic_stat.p_time/(cpuf*1000.0));
LOG_I
(
PHY
,
"==> Start Turbo Decoder wait %d
\n
"
,
wait
);
// Start Turbo decoder
if
(
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
0
]
->
active
==
1
)
{
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC
,
VCD_FUNCTION_IN
);
start_meas
(
&
ue
->
dlsch_procedures_stat
);
ue_dlsch_procedures
(
ue
,
proc
,
eNB_id
,
PDSCH
,
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
0
],
ue
->
dlsch
[
subframe_rx
&
0x1
][
eNB_id
][
1
],
&
ue
->
dlsch_errors
[
eNB_id
],
mode
,
abstraction_flag
);
stop_meas
(
&
ue
->
dlsch_procedures_stat
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC
,
VCD_FUNCTION_OUT
);
}
// do procedures for SI-RNTI
if
((
ue
->
dlsch_SI
[
eNB_id
])
&&
(
ue
->
dlsch_SI
[
eNB_id
]
->
active
==
1
))
{
ue_dlsch_procedures
(
ue
,
proc
,
eNB_id
,
SI_PDSCH
,
ue
->
dlsch_SI
[
eNB_id
],
NULL
,
&
ue
->
dlsch_SI_errors
[
eNB_id
],
mode
,
abstraction_flag
);
ue
->
dlsch_SI
[
eNB_id
]
->
active
=
0
;
}
// do procedures for P-RNTI
if
((
ue
->
dlsch_p
[
eNB_id
])
&&
(
ue
->
dlsch_p
[
eNB_id
]
->
active
==
1
))
{
ue_dlsch_procedures
(
ue
,
proc
,
eNB_id
,
P_PDSCH
,
ue
->
dlsch_p
[
eNB_id
],
NULL
,
&
ue
->
dlsch_p_errors
[
eNB_id
],
mode
,
abstraction_flag
);
ue
->
dlsch_p
[
eNB_id
]
->
active
=
0
;
}
// do procedures for RA-RNTI
if
((
ue
->
dlsch_ra
[
eNB_id
])
&&
(
ue
->
dlsch_ra
[
eNB_id
]
->
active
==
1
))
{
ue_dlsch_procedures
(
ue
,
proc
,
eNB_id
,
RA_PDSCH
,
ue
->
dlsch_ra
[
eNB_id
],
NULL
,
&
ue
->
dlsch_ra_errors
[
eNB_id
],
mode
,
abstraction_flag
);
ue
->
dlsch_ra
[
eNB_id
]
->
active
=
0
;
}
//printf("------ Turbo Decoding [SFN %d]: %5.2f ------\n",subframe_rx,ue->dlsch_procedures_stat.p_time/(cpuf*1000.0));
/**** End Pdsch processing for this subframe ****/
if
(
subframe_rx
==
9
)
{
if
(
frame_rx
%
10
==
0
)
{
if
((
ue
->
dlsch_received
[
eNB_id
]
-
ue
->
dlsch_received_last
[
eNB_id
])
!=
0
)
ue
->
dlsch_fer
[
eNB_id
]
=
(
100
*
(
ue
->
dlsch_errors
[
eNB_id
]
-
ue
->
dlsch_errors_last
[
eNB_id
]))
/
(
ue
->
dlsch_received
[
eNB_id
]
-
ue
->
dlsch_received_last
[
eNB_id
]);
ue
->
dlsch_errors_last
[
eNB_id
]
=
ue
->
dlsch_errors
[
eNB_id
];
ue
->
dlsch_received_last
[
eNB_id
]
=
ue
->
dlsch_received
[
eNB_id
];
}
ue
->
bitrate
[
eNB_id
]
=
(
ue
->
total_TBS
[
eNB_id
]
-
ue
->
total_TBS_last
[
eNB_id
])
*
100
;
ue
->
total_TBS_last
[
eNB_id
]
=
ue
->
total_TBS
[
eNB_id
];
LOG_D
(
PHY
,
"[UE %d] Calculating bitrate Frame %d: total_TBS = %d, total_TBS_last = %d, bitrate %f kbits
\n
"
,
ue
->
Mod_id
,
frame_rx
,
ue
->
total_TBS
[
eNB_id
],
ue
->
total_TBS_last
[
eNB_id
],(
float
)
ue
->
bitrate
[
eNB_id
]
/
1000
.
0
);
#if UE_AUTOTEST_TRACE
if
((
frame_rx
%
100
==
0
))
{
LOG_I
(
PHY
,
"[UE %d] AUTOTEST Metric : UE_DLSCH_BITRATE = %5.2f kbps (frame = %d)
\n
"
,
ue
->
Mod_id
,
(
float
)
ue
->
bitrate
[
eNB_id
]
/
1000
.
0
,
frame_rx
);
}
#endif
}
//printf("after tubo until end of Rx %5.2f \n",ue->generic_stat.p_time/(cpuf*1000.0));
#ifdef EMOS
phy_procedures_emos_UE_RX
(
ue
,
slot
,
eNB_id
);
#endif
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX
,
VCD_FUNCTION_OUT
);
stop_meas
(
&
ue
->
phy_proc_rx
[
subframe_rx
&
0x1
]);
//printf("------FULL RX PROC [SFN %d]: %5.2f ------\n",subframe_rx,ue->phy_proc_rx[subframe_rx&0x1].p_time/(cpuf*1000.0));
LOG_I
(
PHY
,
" ****** end RX-Chain for AbsSubframe %d.%d ******
\n
"
,
frame_rx
%
1024
,
subframe_rx
);
return
(
0
);
}
#if defined(Rel10) || defined(Rel14)
#if defined(Rel10) || defined(Rel14)
int
phy_procedures_RN_UE_RX
(
uint8_t
slot_rx
,
uint8_t
next_slot
,
relaying_type_t
r_type
)
int
phy_procedures_RN_UE_RX
(
uint8_t
slot_rx
,
uint8_t
next_slot
,
relaying_type_t
r_type
)
...
...
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