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
canghaiwuhen
OpenXG-RAN
Commits
a9ba117a
Commit
a9ba117a
authored
Jun 15, 2020
by
laurent
Browse files
Options
Browse Files
Download
Plain Diff
first version scope reworked
parents
64e3e971
90b10268
Changes
19
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
711 additions
and
828 deletions
+711
-828
ci-scripts/checkAddedWarnings.sh
ci-scripts/checkAddedWarnings.sh
+1
-1
ci-scripts/reportBuildLocally.sh
ci-scripts/reportBuildLocally.sh
+2
-2
cmake_targets/CMakeLists.txt
cmake_targets/CMakeLists.txt
+14
-13
cmake_targets/build_oai
cmake_targets/build_oai
+2
-2
cmake_targets/tools/build_helper
cmake_targets/tools/build_helper
+4
-3
common/ran_context.h
common/ran_context.h
+3
-3
executables/nr-ue.c
executables/nr-ue.c
+4
-3
executables/nr-uesoftmodem.c
executables/nr-uesoftmodem.c
+2
-55
openair1/PHY/LTE_ESTIMATION/lte_estimation.h
openair1/PHY/LTE_ESTIMATION/lte_estimation.h
+2
-2
openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
+1
-1
openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
+3
-4
openair1/PHY/MODULATION/slot_fep_nr.c
openair1/PHY/MODULATION/slot_fep_nr.c
+2
-2
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
+5
-3
openair1/PHY/TOOLS/nr_phy_scope.c
openair1/PHY/TOOLS/nr_phy_scope.c
+663
-687
openair1/PHY/TOOLS/nr_phy_scope.h
openair1/PHY/TOOLS/nr_phy_scope.h
+1
-41
openair2/ENB_APP/flexran_agent_extern.h
openair2/ENB_APP/flexran_agent_extern.h
+1
-3
openair2/GNB_APP/gnb_app.c
openair2/GNB_APP/gnb_app.c
+0
-1
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+0
-1
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+1
-1
No files found.
ci-scripts/checkAddedWarnings.sh
View file @
a9ba117a
...
...
@@ -110,7 +110,7 @@ MODIFIED_FILES=`git log $TARGET_INIT_COMMIT..$MERGE_COMMMIT --oneline --name-sta
NB_WARNINGS_FILES
=
0
# Retrieve list of warnings
LIST_WARNING_FILES
=
`
egrep
"error:|warning:"
archives/
*
/
*
.Rel15.txt
archives/
*
/basic_simulator_
*
txt
| egrep
-v
"jobserver unavailable|Clock skew detected.|flexran.proto"
|
sed
-e
"s#^.*/home/ubuntu/tmp/##"
-e
"s#^.*/tmp/CI-eNB/##"
-e
"s#common/utils/.*/itti#common/utils/itti#"
|
awk
-F
":"
'{print $1}'
|
sort
|
uniq
`
LIST_WARNING_FILES
=
`
egrep
"error:|warning:"
archives/
*
/
*
.Rel15.txt | egrep
-v
"jobserver unavailable|Clock skew detected.|flexran.proto"
|
sed
-e
"s#^.*/home/ubuntu/tmp/##"
-e
"s#^.*/tmp/CI-eNB/##"
-e
"s#common/utils/.*/itti#common/utils/itti#"
|
awk
-F
":"
'{print $1}'
|
sort
|
uniq
`
echo
""
echo
"List of files that have been modified by the Merge Request AND"
...
...
ci-scripts/reportBuildLocally.sh
View file @
a9ba117a
...
...
@@ -53,7 +53,7 @@ function details_table {
echo
" <th>Message</th>"
>>
$3
echo
" </tr>"
>>
$3
LIST_MESSAGES
=
`
egrep
"error:|warning:"
$2
| egrep
-v
"jobserver unavailable|Clock skew detected.|flexran.proto"
`
LIST_MESSAGES
=
`
egrep
"error:|warning:"
$2
| egrep
-v
"jobserver unavailable|Clock skew detected.|flexran.proto
|disabling jobserver mode
"
`
COMPLETE_MESSAGE
=
"start"
for
MESSAGE
in
$LIST_MESSAGES
do
...
...
@@ -146,7 +146,7 @@ function summary_table_row {
else
echo
" <td bgcolor =
\"
red
\"
>
$NB_ERRORS
</th>"
>>
./build_results.html
fi
NB_WARNINGS
=
`
egrep
"warning:"
$2
| egrep
-v
"jobserver unavailable|Clock skew detected.|flexran.proto"
| egrep
-c
"warning:"
`
NB_WARNINGS
=
`
egrep
"warning:"
$2
| egrep
-v
"jobserver unavailable|Clock skew detected.|flexran.proto
|disabling jobserver mode
"
| egrep
-c
"warning:"
`
if
[
$NB_WARNINGS
-eq
0
]
then
echo
" <td bgcolor =
\"
green
\"
>
$NB_WARNINGS
</th>"
>>
./build_results.html
...
...
cmake_targets/CMakeLists.txt
View file @
a9ba117a
...
...
@@ -185,7 +185,7 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath -Wl,${CMAKE_CU
# set a flag for changes in the source code
# these changes are related to hardcoded path to include .h files
set
(
CMAKE_C_FLAGS_DEBUG
"
${
CMAKE_C_FLAGS
}
-g3 -DMALLOC_CHECK_=3"
)
set
(
CMAKE_C_FLAGS_RELWITHDEBINFO
"
${
CMAKE_C_FLAGS
}
-g3 -DMALLOC_CHECK_=3 -O
g
-fno-delete-null-pointer-checks"
)
set
(
CMAKE_C_FLAGS_RELWITHDEBINFO
"
${
CMAKE_C_FLAGS
}
-g3 -DMALLOC_CHECK_=3 -O
0
-fno-delete-null-pointer-checks"
)
set
(
CMAKE_C_FLAGS_RELEASE
"
${
CMAKE_C_FLAGS
}
-O3"
)
set
(
GIT_BRANCH
"UNKNOWN"
)
...
...
@@ -2247,20 +2247,20 @@ add_library(SIMU_COMMON
# Simulation library
##########################
set
(
SIMUSRC
${
OPENAIR1_DIR
}
/SIMULATION/TOOLS/taus.c
${
OPENAIR1_DIR
}
/SIMULATION/TOOLS/multipath_channel.c
${
OPENAIR1_DIR
}
/SIMULATION/TOOLS/multipath_tv_channel.c
${
OPENAIR1_DIR
}
/SIMULATION/TOOLS/abstraction.c
${
OPENAIR1_DIR
}
/SIMULATION/TOOLS/channel_sim.c
${
OPENAIR1_DIR
}
/SIMULATION/RF/rf.c
${
OPENAIR1_DIR
}
/SIMULATION/RF/dac.c
${
OPENAIR1_DIR
}
/SIMULATION/RF/adc.c
#${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
)
${
OPENAIR1_DIR
}
/SIMULATION/TOOLS/taus.c
${
OPENAIR1_DIR
}
/SIMULATION/TOOLS/multipath_channel.c
${
OPENAIR1_DIR
}
/SIMULATION/TOOLS/multipath_tv_channel.c
${
OPENAIR1_DIR
}
/SIMULATION/TOOLS/abstraction.c
${
OPENAIR1_DIR
}
/SIMULATION/TOOLS/channel_sim.c
${
OPENAIR1_DIR
}
/SIMULATION/RF/rf.c
${
OPENAIR1_DIR
}
/SIMULATION/RF/dac.c
${
OPENAIR1_DIR
}
/SIMULATION/RF/adc.c
#${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
)
# Simulation library
##########################
add_library
(
SIMU SHARED
${
SIMUSRC
}
)
add_library
(
SIMU SHARED
${
SIMUSRC
}
)
add_library
(
SIMU_ETH
${
OPENAIR1_DIR
}
/SIMULATION/ETH_TRANSPORT/netlink_init.c
...
...
@@ -2638,7 +2638,8 @@ target_link_libraries (lte-uesoftmodem
-Wl,--start-group
RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP F1AP_LIB
GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON
PHY_UE PHY_RU LFDS L2_UE L2_LTE LFDS7 SIMU_COMMON SIMU_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
PHY_UE PHY_RU LFDS L2_UE L2_LTE LFDS7 SIMU_COMMON SIMU NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
${
MSC_LIB
}
${
RAL_LIB
}
${
NAS_UE_LIB
}
${
ITTI_LIB
}
${
FLPT_MSG_LIB
}
${
ASYNC_IF_LIB
}
${
ATLAS_LIBRARIES
}
-Wl,--end-group z dl
)
...
...
cmake_targets/build_oai
View file @
a9ba117a
...
...
@@ -406,7 +406,7 @@ function main() {
shift
1
;;
-k
|
--skip-shared-libraries
)
SKIP_SHARED_LIB_FLAG
=
"True"
echo_info
"Skipping build of shared libraries, rfsimulator
, basicsimulator
and transport protocol libraries"
echo_info
"Skipping build of shared libraries, rfsimulator and transport protocol libraries"
shift
;;
--ninja
)
CMAKE_CMD
=
"
$CMAKE_CMD
-GNinja"
...
...
@@ -896,7 +896,7 @@ function main() {
$build_dir
rfsimulator
\
librfsimulator.so
$dbin
/librfsimulator.so.
$REL
echo_info
"Compiling
basicsimulator
"
echo_info
"Compiling
tcp_bridge_oai
"
compilations
\
$build_dir
tcp_bridge_oai
\
libtcp_bridge_oai.so
$dbin
/libtcp_bridge_oai.so.
$REL
...
...
cmake_targets/tools/build_helper
View file @
a9ba117a
...
...
@@ -150,7 +150,9 @@ clean_all_files() {
set_openair_env
dir=$OPENAIR_DIR/cmake_targets
rm -rf $dir/log $OPENAIR_DIR/targets/bin/*
rm -rf $dir/ran_build $dir/lte-simulators/build
rm -rf $dir/ran_build $dir/ran_build_noLOG
rm -rf $dir/lte-simulators/build
rm -rf $dir/phy_simulators/build $dir/nas_sim_tools/build
rm -rf $dir/oaisim_build_oai/build $dir/oaisim_build_oai/CMakeLists.txt
rm -rf $dir/autotests/bin $dir/autotests/log $dir/autotests/*/build
}
...
...
@@ -167,7 +169,7 @@ check_warnings() {
#we look for 'warning:' in the compilation log file
#this is how gcc starts a warning
#this is not perfect, we may get false positive
warning_count=`grep "warning:" "$1"
|
wc -l`
warning_count=`grep "warning:" "$1"
| egrep -v "jobserver unavailable|disabling jobserver mode" |
wc -l`
if [ $warning_count -gt 0 ]; then
echo_error "WARNING: $warning_count warnings. See $1"
fi
...
...
@@ -177,7 +179,6 @@ compilations() {
cd $OPENAIR_DIR/cmake_targets/$1/build
set +e
{
rm -f $3
if [ "$BUILD_COVERITY_SCAN" == "1" ]; then
COV_SCAN_PREFIX="cov-build --dir cov-int"
else
...
...
common/ran_context.h
View file @
a9ba117a
...
...
@@ -113,11 +113,11 @@ typedef struct {
// LTS: not coherent (xxx_frame_parms cardinatlity wtih xNB (so one carrier))
struct
RU_t_s
**
ru
;
/// Mask to indicate fronthaul setup status of RU (hard-limit to 64 RUs)
//
uint64_t ru_mask;
uint64_t
ru_mask
;
/// Mutex for protecting ru_mask
//
pthread_mutex_t ru_mutex;
pthread_mutex_t
ru_mutex
;
/// condition variable for signaling setup completion of an RU
//
pthread_cond_t ru_cond;
pthread_cond_t
ru_cond
;
}
RAN_CONTEXT_t
;
...
...
executables/nr-ue.c
View file @
a9ba117a
...
...
@@ -634,7 +634,7 @@ void syncInFrame(PHY_VARS_NR_UE *UE, openair0_timestamp *timestamp) {
int
computeSamplesShift
(
PHY_VARS_NR_UE
*
UE
)
{
if
(
IS_SOFTMODEM_RFSIM
)
{
LOG_
E
(
PHY
,
"SET rx_offset %d
\n
"
,
UE
->
rx_offset
);
LOG_
D
(
PHY
,
"SET rx_offset %d
\n
"
,
UE
->
rx_offset
);
//UE->rx_offset_diff=0;
return
0
;
}
...
...
@@ -857,8 +857,9 @@ void *UE_thread(void *arg) {
usleep
(
200
);
}
if
(
decoded_frame_rx
!=
curMsg
->
proc
.
frame_rx
&&
((
decoded_frame_rx
+
1
)
%
MAX_FRAME_NUMBER
)
!=
curMsg
->
proc
.
frame_rx
)
if
(
(
decoded_frame_rx
!=
curMsg
->
proc
.
frame_rx
)
&&
(((
decoded_frame_rx
+
1
)
%
MAX_FRAME_NUMBER
)
!=
curMsg
->
proc
.
frame_rx
)
&&
(((
decoded_frame_rx
+
2
)
%
MAX_FRAME_NUMBER
)
!=
curMsg
->
proc
.
frame_rx
))
LOG_E
(
PHY
,
"Decoded frame index (%d) is not compatible with current context (%d), UE should go back to synch mode
\n
"
,
decoded_frame_rx
,
curMsg
->
proc
.
frame_rx
);
...
...
executables/nr-uesoftmodem.c
View file @
a9ba117a
...
...
@@ -76,37 +76,12 @@ unsigned short config_frames[4] = {2,9,11,13};
#include <openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h>
#include <openair1/SCHED_NR_UE/fapi_nr_ue_l1.h>
#include <forms.h>
/* Callbacks, globals and object handlers */
extern
void
reset_stats
(
FL_OBJECT
*
,
long
);
//extern void initTpool(char *params, tpool_t *pool, bool performanceMeas);
/* Forms and Objects */
typedef
struct
{
FL_FORM
*
stats_form
;
void
*
vdata
;
char
*
cdata
;
long
ldata
;
FL_OBJECT
*
stats_text
;
FL_OBJECT
*
stats_button
;
}
FD_stats_form
;
extern
FD_stats_form
*
create_form_stats_form
(
void
);
#include "PHY/TOOLS/nr_phy_scope.h"
//#include "stats.h"
// current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0)
// at eNB 0, an UL scope for every UE
FD_phy_scope_nrue
*
form_nrue
[
NUMBER_OF_UE_MAX
];
//FD_lte_phy_scope_enb *form_enb[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
//FD_stats_form *form_stats=NULL,*form_stats_l2=NULL;
char
title
[
255
];
static
pthread_t
forms_thread
;
//xforms
#include <executables/nr-uesoftmodem.h>
#include "executables/softmodem-common.h"
#include "executables/thread-common.h"
...
...
@@ -304,35 +279,6 @@ void reset_stats(FL_OBJECT *button, long arg) {
}*/
}
static
void
*
scope_thread
(
void
*
arg
)
{
sleep
(
5
);
while
(
!
oai_exit
)
{
phy_scope_nrUE
(
form_nrue
[
0
],
PHY_vars_UE_g
[
0
][
0
],
0
,
0
,
1
);
usleep
(
100
*
1000
);
}
pthread_exit
((
void
*
)
arg
);
}
void
init_scope
(
void
)
{
int
fl_argc
=
1
;
if
(
do_forms
==
1
)
{
char
*
name
=
"5G-UE-scope"
;
fl_initialize
(
&
fl_argc
,
&
name
,
NULL
,
0
,
0
);
int
UE_id
=
0
;
form_nrue
[
UE_id
]
=
create_phy_scope_nrue
();
sprintf
(
title
,
"NR DL SCOPE UE"
);
fl_show_form
(
form_nrue
[
UE_id
]
->
phy_scope_nrue
,
FL_PLACE_HOTSPOT
,
FL_FULLBORDER
,
title
);
threadCreate
(
&
forms_thread
,
scope_thread
,
NULL
,
"scope"
,
-
1
,
OAI_PRIORITY_RT_LOW
);
}
}
void
*
l2l1_task
(
void
*
arg
)
{
MessageDef
*
message_p
=
NULL
;
int
result
;
...
...
@@ -782,7 +728,8 @@ int main( int argc, char **argv ) {
memset
(
&
UE_PF_PO
[
0
][
0
],
0
,
sizeof
(
UE_PF_PO_t
)
*
NUMBER_OF_UE_MAX
*
MAX_NUM_CCs
);
configure_linux
();
mlockall
(
MCL_CURRENT
|
MCL_FUTURE
);
init_scope
();
if
(
do_forms
)
init_scope
(
PHY_vars_UE_g
[
0
][
0
]);
number_of_cards
=
1
;
for
(
int
CC_id
=
0
;
CC_id
<
MAX_NUM_CCs
;
CC_id
++
)
{
...
...
openair1/PHY/LTE_ESTIMATION/lte_estimation.h
View file @
a9ba117a
...
...
@@ -221,12 +221,12 @@ void phy_adjust_gain (PHY_VARS_UE *phy_vars_ue,
unsigned
char
eNB_id
);
int32_t
lte_ul_channel_estimation
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
L1_rxtx_proc_t
*
proc
,
L1_rxtx_proc_t
*
proc
,
LTE_eNB_ULSCH_t
*
ulsch
,
int32_t
**
ul_ch_estimates
,
int32_t
**
ul_ch_estimates_time
,
int32_t
**
rxdataF_ext
,
module_id_t
UE_id
,
module_id_t
UE_id
,
uint8_t
l
,
uint8_t
Ns
);
...
...
openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
View file @
a9ba117a
...
...
@@ -40,7 +40,7 @@ int32_t lte_ul_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms,
int32_t
**
ul_ch_estimates
,
int32_t
**
ul_ch_estimates_time
,
int32_t
**
rxdataF_ext
,
module_id_t
UE_id
,
module_id_t
UE_id
,
unsigned
char
l
,
unsigned
char
Ns
)
{
AssertFatal
(
ul_ch_estimates
!=
NULL
,
"ul_ch_estimates is null "
);
...
...
openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
View file @
a9ba117a
...
...
@@ -821,15 +821,14 @@ int rx_pdsch(PHY_VARS_UE *ue,
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 %p @LLR Buff(symb) %p\n",
LOG_D
(
PHY
,
"compute LLRs [AbsSubframe %d.%d-%d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %p @LLR Buff(symb) %p energy: %d
\n
"
,
frame
,
subframe
,
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_cw0
);
*/
pllr_symbol_cw0
,
signal_energy
(
pdsch_vars
[
eNB_id
]
->
rxdataF_comp0
[
0
],
7
*
2
*
frame_parms
->
N_RB_DL
*
12
));
switch
(
dlsch0_harq
->
Qm
)
{
case
2
:
if
((
rx_type
==
rx_standard
)
||
(
codeword_TB1
==
-
1
))
{
...
...
openair1/PHY/MODULATION/slot_fep_nr.c
View file @
a9ba117a
...
...
@@ -339,7 +339,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
#endif
dft
(
dftsize
,(
int16_t
*
)
&
common_vars
->
rxdata
[
aa
][
(
rx_offset
)
%
frame_length_samples
],
dft
(
dftsize
,(
int16_t
*
)
&
common_vars
->
rxdata
[
aa
][
rx_offset
],
(
int16_t
*
)
&
common_vars
->
common_vars_rx_data_per_thread
[
ue
->
current_thread_id
[
Ns
]].
rxdataF
[
aa
][
frame_parms
->
ofdm_symbol_size
*
symbol
],
1
);
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
rx_dft_stats
);
...
...
@@ -363,7 +363,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
dft
(
dftsize
,(
int16_t
*
)
tmp_dft_in
,
(
int16_t
*
)
&
common_vars
->
common_vars_rx_data_per_thread
[
ue
->
current_thread_id
[
Ns
]].
rxdataF
[
aa
][
frame_parms
->
ofdm_symbol_size
*
symbol
],
1
);
}
else
{
// use dft input from RX buffer directly
dft
(
dftsize
,(
int16_t
*
)
&
common_vars
->
rxdata
[
aa
][
(
rx_offset
)
%
frame_length_samples
],
dft
(
dftsize
,(
int16_t
*
)
&
common_vars
->
rxdata
[
aa
][
rx_offset
],
(
int16_t
*
)
&
common_vars
->
common_vars_rx_data_per_thread
[
ue
->
current_thread_id
[
Ns
]].
rxdataF
[
aa
][
frame_parms
->
ofdm_symbol_size
*
symbol
],
1
);
}
#if UE_TIMING_TRACE
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
View file @
a9ba117a
...
...
@@ -669,14 +669,16 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pdsch_vars
[
eNB_id
]
->
llr_offset
[
symbol
]
=
len
*
dlsch0_harq
->
Qm
+
llr_offset_symbol
;
/*LOG_I(PHY,"compute LLRs [symbol %d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %x @LLR Buff(symb) %x
\n",
LOG_I
(
PHY
,
"compute LLRs [symbol %d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %x @LLR Buff(symb) %x energy %d
\n
"
,
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_cw0);*/
pllr_symbol_cw0
,
signal_energy
(
pdsch_vars
[
eNB_id
]
->
rxdataF_comp0
[
0
],
7
*
2
*
frame_parms
->
N_RB_DL
*
12
));
//if (ue->current_thread_id[nr_tti_rx] ==0 )
//phy_scope_nrUE(NULL, ue, 0, 0, 0);
/*printf("compute LLRs [symbol %d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %p @LLR Buff(symb) %p\n",
symbol,
nb_rb,dlsch0_harq->Qm,
...
...
openair1/PHY/TOOLS/nr_phy_scope.c
View file @
a9ba117a
...
...
@@ -9,6 +9,8 @@
*
* http://www.openairinterface.org/?page_id=698
*
* Author and copyright: Laurent Thomas, open-cells.com
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
...
...
@@ -26,6 +28,7 @@
#include "executables/nr-softmodem-common.h"
#define TPUT_WINDOW_LENGTH 100
#define localBuff(NaMe,SiZe) float NaMe[SiZe]; memset(NaMe,0,sizeof(NaMe));
int
otg_enabled
;
FL_COLOR
rx_antenna_colors
[
4
]
=
{
FL_RED
,
FL_BLUE
,
FL_GREEN
,
FL_YELLOW
};
...
...
@@ -36,16 +39,34 @@ float tput_time_ue[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}};
float
tput_ue
[
NUMBER_OF_UE_MAX
][
TPUT_WINDOW_LENGTH
]
=
{{
0
}};
float
tput_ue_max
[
NUMBER_OF_UE_MAX
]
=
{
0
};
void
drawsymbol
(
FL_OBJECT
*
obj
,
int
id
,
FL_POINT
*
p
,
int
n
,
int
w
,
int
h
)
{
fl_points
(
p
,
n
,
FL_YELLOW
);
}
typedef
struct
OAIgraph
{
FL_OBJECT
*
graph
;
void
(
*
gNBfunct
)
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
);
void
(
*
nrUEfunct
)
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
);
}
OAIgraph_t
;
/* Forms and Objects */
typedef
struct
{
FL_FORM
*
phy_scope
;
OAIgraph_t
graph
[
20
];
FL_OBJECT
*
button_0
;
}
FD_phy_scope_t
;
typedef
struct
{
FL_FORM
*
stats_form
;
void
*
vdata
;
char
*
cdata
;
long
ldata
;
FL_OBJECT
*
stats_text
;
FL_OBJECT
*
stats_button
;
}
FD_stats_form
;
static
void
ia_receiver_on_off
(
FL_OBJECT
*
button
,
long
arg
)
{
static
void
drawsymbol
(
FL_OBJECT
*
obj
,
int
id
,
FL_POINT
*
p
,
int
n
,
int
w
,
int
h
)
{
fl_points
(
p
,
n
,
FL_YELLOW
);
}
static
void
ia_receiver_on_off
(
FL_OBJECT
*
button
,
long
arg
)
{
if
(
fl_get_button
(
button
))
{
fl_set_object_label
(
button
,
"IA Receiver ON"
);
// PHY_vars_UE_g[0][0]->use_ia_receiver = 1;
...
...
@@ -57,9 +78,7 @@ static void ia_receiver_on_off( FL_OBJECT *button, long arg)
}
}
static
void
dl_traffic_on_off
(
FL_OBJECT
*
button
,
long
arg
)
{
static
void
dl_traffic_on_off
(
FL_OBJECT
*
button
,
long
arg
)
{
if
(
fl_get_button
(
button
))
{
fl_set_object_label
(
button
,
"DL Traffic ON"
);
otg_enabled
=
1
;
...
...
@@ -71,224 +90,168 @@ static void dl_traffic_on_off( FL_OBJECT *button, long arg)
}
}
FD_phy_scope_gnb
*
create_phy_scope_gnb
(
void
)
{
FL_OBJECT
*
obj
;
FD_phy_scope_gnb
*
fdui
=
fl_malloc
(
sizeof
*
fdui
);
// Define form
fdui
->
phy_scope_gnb
=
fl_bgn_form
(
FL_NO_BOX
,
800
,
800
);
// This the whole UI box
obj
=
fl_add_box
(
FL_BORDER_BOX
,
0
,
0
,
800
,
800
,
""
);
fl_set_object_color
(
obj
,
FL_BLACK
,
FL_BLACK
);
// Received signal
fdui
->
rxsig_t
=
fl_add_xyplot
(
FL_NORMAL_XYPLOT
,
20
,
20
,
370
,
100
,
"Received Signal (Time-Domain, dB)"
);
fl_set_object_boxtype
(
fdui
->
rxsig_t
,
FL_EMBOSSED_BOX
);
fl_set_object_color
(
fdui
->
rxsig_t
,
FL_BLACK
,
FL_RED
);
fl_set_object_lcolor
(
fdui
->
rxsig_t
,
FL_WHITE
);
// Label color
fl_set_xyplot_ybounds
(
fdui
->
rxsig_t
,
10
,
70
);
fl_set_xyplot_symbol
(
fdui
->
rxsig_t
,
0
,
drawsymbol
);
// Time-domain channel response
fdui
->
chest_t
=
fl_add_xyplot
(
FL_NORMAL_XYPLOT
,
410
,
20
,
370
,
100
,
"SRS Frequency Response (samples, abs)"
);
fl_set_object_boxtype
(
fdui
->
chest_t
,
FL_EMBOSSED_BOX
);
fl_set_object_color
(
fdui
->
chest_t
,
FL_BLACK
,
FL_RED
);
fl_set_object_lcolor
(
fdui
->
chest_t
,
FL_WHITE
);
// Label color
fl_set_xyplot_symbol
(
fdui
->
chest_t
,
0
,
drawsymbol
);
// Frequency-domain channel response
fdui
->
chest_f
=
fl_add_xyplot
(
FL_IMPULSE_XYPLOT
,
20
,
140
,
760
,
100
,
"Channel Frequency Response (RE, dB)"
);
fl_set_object_boxtype
(
fdui
->
chest_f
,
FL_EMBOSSED_BOX
);
fl_set_object_color
(
fdui
->
chest_f
,
FL_BLACK
,
FL_RED
);
fl_set_object_lcolor
(
fdui
->
chest_f
,
FL_WHITE
);
// Label color
fl_set_xyplot_ybounds
(
fdui
->
chest_f
,
30
,
70
);
fl_set_xyplot_symbol
(
fdui
->
chest_f
,
0
,
drawsymbol
);
// LLR of PUSCH
fdui
->
pusch_llr
=
fl_add_xyplot
(
FL_POINTS_XYPLOT
,
20
,
260
,
500
,
200
,
"PUSCH Log-Likelihood Ratios (LLR, mag)"
);
fl_set_object_boxtype
(
fdui
->
pusch_llr
,
FL_EMBOSSED_BOX
);
fl_set_object_color
(
fdui
->
pusch_llr
,
FL_BLACK
,
FL_YELLOW
);
fl_set_object_lcolor
(
fdui
->
pusch_llr
,
FL_WHITE
);
// Label color
fl_set_xyplot_symbolsize
(
fdui
->
pusch_llr
,
2
);
fl_set_xyplot_symbol
(
fdui
->
pusch_llr
,
0
,
drawsymbol
);
// I/Q PUSCH comp
fdui
->
pusch_comp
=
fl_add_xyplot
(
FL_POINTS_XYPLOT
,
540
,
260
,
240
,
200
,
"PUSCH I/Q of MF Output"
);
fl_set_object_boxtype
(
fdui
->
pusch_comp
,
FL_EMBOSSED_BOX
);
fl_set_object_color
(
fdui
->
pusch_comp
,
FL_BLACK
,
FL_YELLOW
);
fl_set_object_lcolor
(
fdui
->
pusch_comp
,
FL_WHITE
);
// Label color
fl_set_xyplot_symbolsize
(
fdui
->
pusch_comp
,
2
);
fl_set_xyplot_xgrid
(
fdui
->
pusch_llr
,
FL_GRID_MAJOR
);
// I/Q PUCCH comp (format 1)
fdui
->
pucch_comp1
=
fl_add_xyplot
(
FL_POINTS_XYPLOT
,
540
,
480
,
240
,
100
,
"PUCCH1 Energy (SR)"
);
fl_set_object_boxtype
(
fdui
->
pucch_comp1
,
FL_EMBOSSED_BOX
);
fl_set_object_color
(
fdui
->
pucch_comp1
,
FL_BLACK
,
FL_YELLOW
);
fl_set_object_lcolor
(
fdui
->
pucch_comp1
,
FL_WHITE
);
// Label color
fl_set_xyplot_symbolsize
(
fdui
->
pucch_comp1
,
2
);
fl_set_xyplot_symbol
(
fdui
->
pucch_comp1
,
0
,
drawsymbol
);
// fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR);
// I/Q PUCCH comp (fromat 1a/b)
fdui
->
pucch_comp
=
fl_add_xyplot
(
FL_POINTS_XYPLOT
,
540
,
600
,
240
,
100
,
"PUCCH I/Q of MF Output"
);
fl_set_object_boxtype
(
fdui
->
pucch_comp
,
FL_EMBOSSED_BOX
);
fl_set_object_color
(
fdui
->
pucch_comp
,
FL_BLACK
,
FL_YELLOW
);
fl_set_object_lcolor
(
fdui
->
pucch_comp
,
FL_WHITE
);
// Label color
fl_set_xyplot_symbolsize
(
fdui
->
pucch_comp
,
2
);
fl_set_xyplot_symbol
(
fdui
->
pucch_comp
,
0
,
drawsymbol
);
// fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR);
// Throughput on PUSCH
fdui
->
pusch_tput
=
fl_add_xyplot
(
FL_NORMAL_XYPLOT
,
20
,
480
,
500
,
100
,
"PUSCH Throughput [frame]/[kbit/s]"
);
fl_set_object_boxtype
(
fdui
->
pusch_tput
,
FL_EMBOSSED_BOX
);
fl_set_object_color
(
fdui
->
pusch_tput
,
FL_BLACK
,
FL_WHITE
);
fl_set_object_lcolor
(
fdui
->
pusch_tput
,
FL_WHITE
);
// Label color
fl_set_xyplot_symbol
(
fdui
->
pusch_tput
,
0
,
drawsymbol
);
// Generic eNB Button
fdui
->
button_0
=
fl_add_button
(
FL_PUSH_BUTTON
,
20
,
600
,
240
,
40
,
""
);
fl_set_object_lalign
(
fdui
->
button_0
,
FL_ALIGN_CENTER
);
fl_set_button
(
fdui
->
button_0
,
0
);
otg_enabled
=
0
;
fl_set_object_label
(
fdui
->
button_0
,
"DL Traffic OFF"
);
fl_set_object_color
(
fdui
->
button_0
,
FL_RED
,
FL_RED
);
fl_set_object_callback
(
fdui
->
button_0
,
dl_traffic_on_off
,
0
);
static
FL_OBJECT
*
commonGraph
(
int
type
,
FL_Coord
x
,
FL_Coord
y
,
FL_Coord
w
,
FL_Coord
h
,
const
char
*
label
,
FL_COLOR
pointColor
)
{
FL_OBJECT
*
graph
;
graph
=
fl_add_xyplot
(
type
,
x
,
y
,
w
,
h
,
label
);
fl_set_object_boxtype
(
graph
,
FL_EMBOSSED_BOX
);
fl_set_object_lcolor
(
graph
,
FL_WHITE
);
// Label color
fl_set_xyplot_symbol
(
graph
,
0
,
drawsymbol
);
fl_set_object_color
(
graph
,
FL_BLACK
,
pointColor
);
return
graph
;
}
fl_end_form
(
);
fdui
->
phy_scope_gnb
->
fdui
=
fdui
;
static
OAIgraph_t
gNBcommonGraph
(
void
(
*
funct
)
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
),
int
type
,
FL_Coord
x
,
FL_Coord
y
,
FL_Coord
w
,
FL_Coord
h
,
const
char
*
label
,
FL_COLOR
pointColor
)
{
OAIgraph_t
graph
;
graph
.
graph
=
commonGraph
(
type
,
x
,
y
,
w
,
h
,
label
,
pointColor
);
graph
.
gNBfunct
=
funct
;
graph
.
nrUEfunct
=
NULL
;
return
graph
;
}
return
fdui
;
static
OAIgraph_t
nrUEcommonGraph
(
void
(
*
funct
)
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
),
int
type
,
FL_Coord
x
,
FL_Coord
y
,
FL_Coord
w
,
FL_Coord
h
,
const
char
*
label
,
FL_COLOR
pointColor
)
{
OAIgraph_t
graph
;
graph
.
graph
=
commonGraph
(
type
,
x
,
y
,
w
,
h
,
label
,
pointColor
);
graph
.
gNBfunct
=
NULL
;
graph
.
nrUEfunct
=
funct
;
return
graph
;
}
void
phy_scope_gNB
(
FD_phy_scope_
gnb
*
form
,
void
phy_scope_gNB
(
FD_phy_scope_
t
*
form
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
)
{
NR_DL_FRAME_PARMS
*
frame_parms
=
&
phy_vars_gnb
->
frame_parms
;
//int nsymb_ce = 12*frame_parms->N_RB_UL*frame_parms->symbols_per_tti;
uint8_t
nb_antennas_rx
=
frame_parms
->
nb_antennas_rx
;
//uint8_t nb_antennas_tx = 1; // frame_parms->nb_antennas_tx; // in LTE Rel. 8 and 9 only a single transmit antenna is assumed at the UE
// float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx];
// uint32_t total_dlsch_bitrate = phy_vars_gnb->total_dlsch_bitrate;
// uint8_t harq_pid; // in TDD config 3 it is sf-2, i.e., can be 0,1,2
int
Qm
=
2
;
RU_t
*
phy_vars_ru
,
int
UE_id
)
{
static
FD_phy_scope_t
*
remeberForm
=
NULL
;
if
(
form
==
NULL
)
form
=
remeberForm
;
else
remeberForm
=
form
;
if
(
form
==
NULL
)
return
;
int
i
=
0
;
while
(
form
->
graph
[
i
].
graph
)
{
form
->
graph
[
i
].
gNBfunct
(
form
->
graph
[
i
].
graph
,
phy_vars_gnb
,
phy_vars_ru
,
UE_id
);
i
++
;
}
/*
if (!RC.nrmac[0]->UE_info.active[UE_id])
fl_check_forms
();
}
static
void
timeSignal
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
)
{
// Received signal in time domain of receive antenna 0
if
(
!
phy_vars_ru
->
common
.
rxdata
)
return
;
// choose max MCS to compute coded_bits_per_codeword
if (phy_vars_gnb->ulsch[UE_id][0]!=NULL) {
for (harq_pid=0; harq_pid<3; harq_pid++) {
//Qm = cmax(phy_vars_gnb->ulsch[UE_id][0]->harq_processes->Qm,Qm);
NR_DL_FRAME_PARMS
*
frame_parms
=&
phy_vars_gnb
->
frame_parms
;
uint8_t
nb_antennas_rx
=
frame_parms
->
nb_antennas_rx
;
int16_t
**
rxsig_t
=
phy_vars_ru
->
common
.
rxdata
;
float
rxsig_t_dB
[
nb_antennas_rx
][
frame_parms
->
samples_per_frame
];
float
time
[
frame_parms
->
samples_per_frame
];
if
(
rxsig_t
[
0
]
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
frame_parms
->
samples_per_frame
;
i
++
)
{
rxsig_t_dB
[
0
][
i
]
=
10
*
log10
(
1
.
0
+
(
float
)
((
rxsig_t
[
0
][
2
*
i
])
*
(
rxsig_t
[
0
][
2
*
i
])
+
(
rxsig_t
[
0
][
2
*
i
+
1
])
*
(
rxsig_t
[
0
][
2
*
i
+
1
])));
time
[
i
]
=
(
float
)
i
;
}
fl_set_xyplot_data
(
graph
,
time
,
rxsig_t_dB
[
0
],
frame_parms
->
samples_per_frame
,
""
,
""
,
""
);
}
*/
int32_t
*
pucch1_thres
=
(
int32_t
*
)
NULL
;
// phy_vars_gnb->pucch1_stats_thres[UE_id];
// Received signal in time domain of receive antenna 0
if
(
phy_vars_ru
->
common
.
rxdata
)
{
int16_t
**
rxsig_t
=
phy_vars_ru
->
common
.
rxdata
;
float
rxsig_t_dB
[
nb_antennas_rx
][
frame_parms
->
samples_per_frame
];
float
time
[
frame_parms
->
samples_per_frame
];
if
(
rxsig_t
[
0
]
!=
NULL
)
{
for
(
int
arx
=
1
;
arx
<
nb_antennas_rx
;
arx
++
)
{
if
(
rxsig_t
[
arx
]
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
frame_parms
->
samples_per_frame
;
i
++
)
{
rxsig_t_dB
[
0
][
i
]
=
10
*
log10
(
1
.
0
+
(
float
)
((
rxsig_t
[
0
][
2
*
i
])
*
(
rxsig_t
[
0
][
2
*
i
])
+
(
rxsig_t
[
0
][
2
*
i
+
1
])
*
(
rxsig_t
[
0
][
2
*
i
+
1
])));
time
[
i
]
=
(
float
)
i
;
rxsig_t_dB
[
arx
][
i
]
=
10
*
log10
(
1
.
0
+
(
float
)
((
rxsig_t
[
arx
][
2
*
i
])
*
(
rxsig_t
[
arx
][
2
*
i
])
+
(
rxsig_t
[
arx
][
2
*
i
+
1
])
*
(
rxsig_t
[
arx
][
2
*
i
+
1
])))
;
}
fl_
set_xyplot_data
(
form
->
rxsig_t
,
time
,
rxsig_t_dB
[
0
],
frame_parms
->
samples_per_frame
,
""
,
""
,
""
);
fl_
add_xyplot_overlay
(
graph
,
arx
,
time
,
rxsig_t_dB
[
arx
],
frame_parms
->
samples_per_frame
,
rx_antenna_colors
[
arx
]
);
}
}
}
for
(
int
arx
=
1
;
arx
<
nb_antennas_rx
;
arx
++
)
{
if
(
rxsig_t
[
arx
]
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
frame_parms
->
samples_per_frame
;
i
++
)
{
rxsig_t_dB
[
arx
][
i
]
=
10
*
log10
(
1
.
0
+
(
float
)
((
rxsig_t
[
arx
][
2
*
i
])
*
(
rxsig_t
[
arx
][
2
*
i
])
+
(
rxsig_t
[
arx
][
2
*
i
+
1
])
*
(
rxsig_t
[
arx
][
2
*
i
+
1
])));
}
static
void
timeResponse
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
)
{
// Channel Impulse Response
if
(
!
phy_vars_gnb
->
pusch_vars
[
UE_id
]
->
ul_ch_estimates_time
)
return
;
fl_add_xyplot_overlay
(
form
->
rxsig_t
,
arx
,
time
,
rxsig_t_dB
[
arx
],
frame_parms
->
samples_per_frame
,
rx_antenna_colors
[
arx
]);
}
NR_DL_FRAME_PARMS
*
frame_parms
=&
phy_vars_gnb
->
frame_parms
;
uint8_t
nb_antennas_rx
=
frame_parms
->
nb_antennas_rx
;
int16_t
**
chest_t
=
(
int16_t
**
)
phy_vars_gnb
->
pusch_vars
[
UE_id
]
->
ul_ch_estimates_time
;
int
ymax
=
0
;
float
time2
[
2
*
frame_parms
->
ofdm_symbol_size
];
float
chest_t_abs
[
nb_antennas_rx
][
2
*
frame_parms
->
ofdm_symbol_size
];
if
(
chest_t
[
0
]
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
(
2
*
frame_parms
->
ofdm_symbol_size
);
i
++
)
{
//i2 = (i+(frame_parms->ofdm_symbol_size>>1))%frame_parms->ofdm_symbol_size;
int
i2
=
i
;
//time2[i] = (float)(i-(frame_parms->ofdm_symbol_size>>1));
time2
[
i
]
=
(
float
)
i
;
chest_t_abs
[
0
][
i
]
=
10
*
log10
((
float
)
(
1
+
chest_t
[
0
][
2
*
i2
]
*
chest_t
[
0
][
2
*
i2
]
+
chest_t
[
0
][
2
*
i2
+
1
]
*
chest_t
[
0
][
2
*
i2
+
1
]));
if
(
chest_t_abs
[
0
][
i
]
>
ymax
)
ymax
=
chest_t_abs
[
0
][
i
];
}
fl_set_xyplot_data
(
graph
,
time2
,
chest_t_abs
[
0
],(
2
*
frame_parms
->
ofdm_symbol_size
),
""
,
""
,
""
);
}
// Channel Impulse Response
if
(
phy_vars_gnb
->
pusch_vars
[
UE_id
]
->
ul_ch_estimates_time
)
{
int16_t
**
chest_t
=
(
int16_t
**
)
phy_vars_gnb
->
pusch_vars
[
UE_id
]
->
ul_ch_estimates_time
;
int
ymax
=
0
;
float
time2
[
2
*
frame_parms
->
ofdm_symbol_size
];
float
chest_t_abs
[
nb_antennas_rx
][
2
*
frame_parms
->
ofdm_symbol_size
];
if
(
chest_t
[
0
]
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
(
2
*
frame_parms
->
ofdm_symbol_size
);
i
++
)
{
//i2 = (i+(frame_parms->ofdm_symbol_size>>1))%frame_parms->ofdm_symbol_size;
int
i2
=
i
;
//time2[i] = (float)(i-(frame_parms->ofdm_symbol_size>>1));
time2
[
i
]
=
(
float
)
i
;
chest_t_abs
[
0
][
i
]
=
10
*
log10
((
float
)
(
1
+
chest_t
[
0
][
2
*
i2
]
*
chest_t
[
0
][
2
*
i2
]
+
chest_t
[
0
][
2
*
i2
+
1
]
*
chest_t
[
0
][
2
*
i2
+
1
]));
if
(
chest_t_abs
[
0
][
i
]
>
ymax
)
ymax
=
chest_t_abs
[
0
][
i
];
for
(
int
arx
=
1
;
arx
<
nb_antennas_rx
;
arx
++
)
{
if
(
chest_t
[
arx
]
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
(
frame_parms
->
ofdm_symbol_size
>>
3
);
i
++
)
{
chest_t_abs
[
arx
][
i
]
=
10
*
log10
((
float
)
(
1
+
chest_t
[
arx
][
2
*
i
]
*
chest_t
[
arx
][
2
*
i
]
+
chest_t
[
arx
][
2
*
i
+
1
]
*
chest_t
[
arx
][
2
*
i
+
1
]));
if
(
chest_t_abs
[
arx
][
i
]
>
ymax
)
ymax
=
chest_t_abs
[
arx
][
i
];
}
fl_set_xyplot_data
(
form
->
chest_t
,
time2
,
chest_t_abs
[
0
],(
2
*
frame_parms
->
ofdm_symbol_size
),
""
,
""
,
""
);
fl_add_xyplot_overlay
(
graph
,
arx
,
time2
,
chest_t_abs
[
arx
],(
frame_parms
->
ofdm_symbol_size
>>
3
),
rx_antenna_colors
[
arx
]);
fl_set_xyplot_overlay_type
(
graph
,
arx
,
FL_DASHED_XYPLOT
);
}
}
for
(
int
arx
=
1
;
arx
<
nb_antennas_rx
;
arx
++
)
{
if
(
chest_t
[
arx
]
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
(
frame_parms
->
ofdm_symbol_size
>>
3
);
i
++
)
{
chest_t_abs
[
arx
][
i
]
=
10
*
log10
((
float
)
(
1
+
chest_t
[
arx
][
2
*
i
]
*
chest_t
[
arx
][
2
*
i
]
+
chest_t
[
arx
][
2
*
i
+
1
]
*
chest_t
[
arx
][
2
*
i
+
1
]));
if
(
chest_t_abs
[
arx
][
i
]
>
ymax
)
ymax
=
chest_t_abs
[
arx
][
i
];
}
// Avoid flickering effect
// fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax);
fl_set_xyplot_ybounds
(
graph
,
0
,
ymax
);
}
fl_add_xyplot_overlay
(
form
->
chest_t
,
arx
,
time2
,
chest_t_abs
[
arx
],(
frame_parms
->
ofdm_symbol_size
>>
3
),
rx_antenna_colors
[
arx
]);
fl_set_xyplot_overlay_type
(
form
->
chest_t
,
arx
,
FL_DASHED_XYPLOT
);
}
static
void
frequencyResponse
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
)
{
// Channel Frequency Response
if
(
!
phy_vars_ru
->
common
.
rxdataF
)
return
;
NR_DL_FRAME_PARMS
*
frame_parms
=&
phy_vars_gnb
->
frame_parms
;
uint8_t
nb_antennas_rx
=
frame_parms
->
nb_antennas_rx
;
int16_t
**
rxsig_f
=
(
int16_t
**
)
phy_vars_ru
->
common
.
rxdataF
;
float
rxsig_f_dB
[
nb_antennas_rx
][
frame_parms
->
samples_per_slot_wCP
];
float
time
[
frame_parms
->
samples_per_slot_wCP
];
if
(
rxsig_f
[
0
]
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
frame_parms
->
samples_per_slot_wCP
;
i
++
)
{
rxsig_f_dB
[
0
][
i
]
=
10
*
log10
(
1
.
0
+
(
float
)
((
rxsig_f
[
0
][
2
*
i
])
*
(
rxsig_f
[
0
][
2
*
i
])
+
(
rxsig_f
[
0
][
2
*
i
+
1
])
*
(
rxsig_f
[
0
][
2
*
i
+
1
])));
time
[
i
]
=
(
float
)
i
;
}
// Avoid flickering effect
// fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax);
fl_set_xyplot_ybounds
(
form
->
chest_t
,
0
,
ymax
);
fl_set_xyplot_data
(
graph
,
time
,
rxsig_f_dB
[
0
],
frame_parms
->
samples_per_slot_wCP
,
""
,
""
,
""
);
}
// Channel Frequency Response
if
(
phy_vars_ru
->
common
.
rxdataF
)
{
int16_t
**
rxsig_f
=
(
int16_t
**
)
phy_vars_ru
->
common
.
rxdataF
;
float
rxsig_f_dB
[
nb_antennas_rx
][
frame_parms
->
samples_per_slot_wCP
];
float
time
[
frame_parms
->
samples_per_slot_wCP
];
if
(
rxsig_f
[
0
]
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
frame_parms
->
samples_per_slot_wCP
;
i
++
)
{
rxsig_f_dB
[
0
][
i
]
=
10
*
log10
(
1
.
0
+
(
float
)
((
rxsig_f
[
0
][
2
*
i
])
*
(
rxsig_f
[
0
][
2
*
i
])
+
(
rxsig_f
[
0
][
2
*
i
+
1
])
*
(
rxsig_f
[
0
][
2
*
i
+
1
])));
time
[
i
]
=
(
float
)
i
;
}
fl_set_xyplot_data
(
form
->
chest_t
,
time
,
rxsig_f_dB
[
0
],
frame_parms
->
samples_per_slot_wCP
,
""
,
""
,
""
);
}
/*
/*
for (arx=0; arx<nb_antennas_rx; arx++) {
if (chest_f[(atx<<1)+arx] != NULL) {
for (k=0; k<nsymb_ce; k++) {
freq[ind] = (float)ind;
Re = (float)(chest_f[(atx<<1)+arx][(2*k)]);
Im = (float)(chest_f[(atx<<1)+arx][(2*k)+1]);
chest_f_abs[ind] = (short)10*log10(1.0+((double)Re*Re + (double)Im*Im));
ind++;
}
}
if (chest_f[(atx<<1)+arx] != NULL) {
for (k=0; k<nsymb_ce; k++) {
freq[ind] = (float)ind;
Re = (float)(chest_f[(atx<<1)+arx][(2*k)]);
Im = (float)(chest_f[(atx<<1)+arx][(2*k)+1]);
chest_f_abs[ind] = (short)10*log10(1.0+((double)Re*Re + (double)Im*Im));
ind++;
}
}
}
// tx antenna 0
fl_set_xyplot_xbounds(form->chest_f,0,nb_antennas_rx*nb_antennas_tx*nsymb_ce);
fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,3);
...
...
@@ -296,532 +259,510 @@ void phy_scope_gNB(FD_phy_scope_gnb *form,
fl_set_xyplot_data(form->chest_f,freq,chest_f_abs,nsymb_ce,"","","");
for (arx=1; arx<nb_antennas_rx; arx++) {
fl_add_xyplot_overlay(form->chest_f,1,&freq[arx*nsymb_ce],&chest_f_abs[arx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
fl_add_xyplot_overlay(form->chest_f,1,&freq[arx*nsymb_ce],&chest_f_abs[arx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
}
// other tx antennas
if (nb_antennas_tx > 1) {
if (nb_antennas_rx > 1) {
for (atx=1; atx<nb_antennas_tx; atx++) {
for (arx=0; arx<nb_antennas_rx; arx++) {
fl_add_xyplot_overlay(form->chest_f,(atx<<1)+arx,&freq[((atx<<1)+arx)*nsymb_ce],&chest_f_abs[((atx<<1)+arx)*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
}
}
} else { // 1 rx antenna
atx=1;
arx=0;
fl_add_xyplot_overlay(form->chest_f,atx,&freq[atx*nsymb_ce],&chest_f_abs[atx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
}
if (nb_antennas_rx > 1) {
for (atx=1; atx<nb_antennas_tx; atx++) {
for (arx=0; arx<nb_antennas_rx; arx++) {
fl_add_xyplot_overlay(form->chest_f,(atx<<1)+arx,&freq[((atx<<1)+arx)*nsymb_ce],&chest_f_abs[((atx<<1)+arx)*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
}
*/
}
}
} else { // 1 rx antenna
atx=1;
arx=0;
fl_add_xyplot_overlay(form->chest_f,atx,&freq[atx*nsymb_ce],&chest_f_abs[atx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
}
}
*/
}
static
void
puschLLR
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
)
{
// PUSCH LLRs
if
(
phy_vars_gnb
->
pusch_vars
[
UE_id
]
->
llr
)
{
int16_t
*
pusch_llr
=
(
int16_t
*
)
phy_vars_gnb
->
pusch_vars
[
UE_id
]
->
llr
;
int
coded_bits_per_codeword
=
frame_parms
->
N_RB_UL
*
12
*
Qm
*
frame_parms
->
symbols_per_tti
;
float
llr
[
coded_bits_per_codeword
];
float
bit
[
coded_bits_per_codeword
];
for
(
int
i
=
0
;
i
<
coded_bits_per_codeword
;
i
++
)
{
llr
[
i
]
=
(
float
)
pusch_llr
[
i
];
bit
[
i
]
=
(
float
)
i
;
}
fl_set_xyplot_data
(
form
->
pusch_llr
,
bit
,
llr
,
coded_bits_per_codeword
,
""
,
""
,
""
);
if
(
!
phy_vars_gnb
->
pusch_vars
[
UE_id
]
->
llr
)
return
;
NR_DL_FRAME_PARMS
*
frame_parms
=&
phy_vars_gnb
->
frame_parms
;
int
Qm
=
2
;
int16_t
*
pusch_llr
=
(
int16_t
*
)
phy_vars_gnb
->
pusch_vars
[
UE_id
]
->
llr
;
int
coded_bits_per_codeword
=
frame_parms
->
N_RB_UL
*
12
*
Qm
*
frame_parms
->
symbols_per_tti
;
float
llr
[
coded_bits_per_codeword
];
float
bit
[
coded_bits_per_codeword
];
for
(
int
i
=
0
;
i
<
coded_bits_per_codeword
;
i
++
)
{
llr
[
i
]
=
(
float
)
pusch_llr
[
i
];
bit
[
i
]
=
(
float
)
i
;
}
fl_set_xyplot_data
(
graph
,
bit
,
llr
,
coded_bits_per_codeword
,
""
,
""
,
""
);
}
static
void
puschIQ
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
)
{
// PUSCH I/Q of MF Output
if
(
phy_vars_gnb
->
pusch_vars
[
UE_id
]
->
rxdataF_comp
)
{
int32_t
*
pusch_comp
=
(
int32_t
*
)
phy_vars_gnb
->
pusch_vars
[
UE_id
]
->
rxdataF_comp
;
int
sz
=
frame_parms
->
symbols_per_tti
*
12
*
frame_parms
->
N_RB_UL
;
float
I
[
sz
],
Q
[
sz
];
int
ind
=
0
;
for
(
int
k
=
0
;
k
<
frame_parms
->
symbols_per_tti
;
k
++
)
{
for
(
int
i
=
0
;
i
<
12
*
frame_parms
->
N_RB_UL
;
i
++
)
{
I
[
ind
]
=
pusch_comp
[(
2
*
frame_parms
->
N_RB_UL
*
12
*
k
)
+
2
*
i
];
Q
[
ind
]
=
pusch_comp
[(
2
*
frame_parms
->
N_RB_UL
*
12
*
k
)
+
2
*
i
+
1
];
ind
++
;
}
}
if
(
!
phy_vars_gnb
->
pusch_vars
[
UE_id
]
->
rxdataF_comp
)
return
;
fl_set_xyplot_data
(
form
->
pusch_comp
,
I
,
Q
,
ind
,
""
,
""
,
""
);
NR_DL_FRAME_PARMS
*
frame_parms
=&
phy_vars_gnb
->
frame_parms
;
int32_t
*
pusch_comp
=
(
int32_t
*
)
phy_vars_gnb
->
pusch_vars
[
UE_id
]
->
rxdataF_comp
;
int
sz
=
frame_parms
->
symbols_per_tti
*
12
*
frame_parms
->
N_RB_UL
;
float
I
[
sz
],
Q
[
sz
];
int
ind
=
0
;
for
(
int
k
=
0
;
k
<
frame_parms
->
symbols_per_tti
;
k
++
)
{
for
(
int
i
=
0
;
i
<
12
*
frame_parms
->
N_RB_UL
;
i
++
)
{
I
[
ind
]
=
pusch_comp
[(
2
*
frame_parms
->
N_RB_UL
*
12
*
k
)
+
2
*
i
];
Q
[
ind
]
=
pusch_comp
[(
2
*
frame_parms
->
N_RB_UL
*
12
*
k
)
+
2
*
i
+
1
];
ind
++
;
}
}
fl_set_xyplot_data
(
graph
,
I
,
Q
,
ind
,
""
,
""
,
""
);
// PUSCH I/Q of MF Output
if
(
NULL
)
{
int32_t
*
pucch1ab_comp
=
(
int32_t
*
)
NULL
;
//phy_vars_gnb->pucch1ab_stats[UE_id];
int32_t
*
pucch1_comp
=
(
int32_t
*
)
NULL
;
//phy_vars_gnb->pucch1_stats[UE_id];
int32_t
*
pucch1ab_comp
=
(
int32_t
*
)
NULL
;
//phy_vars_gnb->pucch1ab_stats[UE_id];
int32_t
*
pucch1_comp
=
(
int32_t
*
)
NULL
;
//phy_vars_gnb->pucch1_stats[UE_id];
float
I_pucch
[
10240
],
Q_pucch
[
10240
],
A_pucch
[
10240
],
B_pucch
[
10240
],
C_pucch
[
10240
];
for
(
int
ind
=
0
;
ind
<
10240
;
ind
++
)
{
for
(
int
ind
=
0
;
ind
<
10240
;
ind
++
)
{
I_pucch
[
ind
]
=
(
float
)
pucch1ab_comp
[
2
*
(
ind
)];
Q_pucch
[
ind
]
=
(
float
)
pucch1ab_comp
[
2
*
(
ind
)
+
1
];
A_pucch
[
ind
]
=
pucch1_comp
?
(
10
*
log10
(
pucch1_comp
[
ind
]))
:
0
;
B_pucch
[
ind
]
=
ind
;
int32_t
*
pucch1_thres
=
(
int32_t
*
)
NULL
;
// phy_vars_gnb->pucch1_stats_thres[UE_id];
C_pucch
[
ind
]
=
pucch1_thres
?
(
float
)
pucch1_thres
[
ind
]
:
0
;
}
fl_set_xyplot_data
(
form
->
pucch_comp
,
I_pucch
,
Q_pucch
,
10240
,
""
,
""
,
""
);
fl_set_xyplot_data
(
form
->
pucch_comp1
,
B_pucch
,
A_pucch
,
1024
,
""
,
""
,
""
);
fl_add_xyplot_overlay
(
form
->
pucch_comp1
,
1
,
B_pucch
,
C_pucch
,
1024
,
FL_RED
);
fl_set_xyplot_ybounds
(
form
->
pucch_comp
,
-
5000
,
5000
);
fl_set_xyplot_xbounds
(
form
->
pucch_comp
,
-
5000
,
5000
);
fl_set_xyplot_ybounds
(
form
->
pucch_comp1
,
0
,
80
);
fl_set_xyplot_data
(
graph
,
I_pucch
,
Q_pucch
,
10240
,
""
,
""
,
""
);
fl_set_xyplot_data
(
graph
,
B_pucch
,
A_pucch
,
1024
,
""
,
""
,
""
);
fl_add_xyplot_overlay
(
graph
,
1
,
B_pucch
,
C_pucch
,
1024
,
FL_RED
);
fl_set_xyplot_ybounds
(
graph
,
-
5000
,
5000
);
fl_set_xyplot_xbounds
(
graph
,
-
5000
,
5000
);
fl_set_xyplot_ybounds
(
graph
,
0
,
80
);
}
}
static
void
pucchEnergy
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
)
{
}
static
void
pucchIQ
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
)
{
}
static
void
puschThroughtput
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
)
{
// PUSCH Throughput
memmove
(
tput_time_enb
[
UE_id
],
&
tput_time_enb
[
UE_id
][
1
],
(
TPUT_WINDOW_LENGTH
-
1
)
*
sizeof
(
float
)
);
memmove
(
tput_enb
[
UE_id
],
&
tput_enb
[
UE_id
][
1
],
(
TPUT_WINDOW_LENGTH
-
1
)
*
sizeof
(
float
)
);
tput_time_enb
[
UE_id
][
TPUT_WINDOW_LENGTH
-
1
]
=
(
float
)
0
;
// tput_enb[UE_id][TPUT_WINDOW_LENGTH-1] = ((float) total_dlsch_bitrate)/1000.0;
fl_set_xyplot_data
(
form
->
pusch_tput
,
tput_time_enb
[
UE_id
],
tput_enb
[
UE_id
],
TPUT_WINDOW_LENGTH
,
""
,
""
,
""
);
// tput_enb[UE_id][TPUT_WINDOW_LENGTH-1] = ((float) total_dlsch_bitrate)/1000.0;
fl_set_xyplot_data
(
graph
,
tput_time_enb
[
UE_id
],
tput_enb
[
UE_id
],
TPUT_WINDOW_LENGTH
,
""
,
""
,
""
);
// fl_get_xyplot_ybounds(form->pusch_tput,&ymin,&ymax);
// fl_set_xyplot_ybounds(form->pusch_tput,0,ymax);
fl_check_forms
();
}
FD_phy_scope_nrue
*
create_phy_scope_nrue
(
void
)
{
static
FD_phy_scope_t
*
create_phy_scope_gnb
(
int
UE_id
)
{
FL_OBJECT
*
obj
;
FD_phy_scope_nrue
*
fdui
=
fl_malloc
(
sizeof
*
fdui
);
FD_phy_scope_t
*
fdui
=
fl_malloc
(
sizeof
*
fdui
);
// Define form
fdui
->
phy_scope_nrue
=
fl_bgn_form
(
FL_NO_BOX
,
800
,
900
);
fdui
->
phy_scope
=
fl_bgn_form
(
FL_NO_BOX
,
800
,
800
);
// This the whole UI box
obj
=
fl_add_box
(
FL_BORDER_BOX
,
0
,
0
,
800
,
9
00
,
""
);
obj
=
fl_add_box
(
FL_BORDER_BOX
,
0
,
0
,
800
,
8
00
,
""
);
fl_set_object_color
(
obj
,
FL_BLACK
,
FL_BLACK
);
// Received signal
fdui
->
rxsig_t
=
fl_add_xyplot
(
FL_NORMAL_XYPLOT
,
20
,
20
,
370
,
100
,
"Received Signal (Time-Domain, dB)"
);
fl_set_object_boxtype
(
fdui
->
rxsig_t
,
FL_EMBOSSED_BOX
);
fl_set_object_color
(
fdui
->
rxsig_t
,
FL_BLACK
,
FL_RED
);
fl_set_object_lcolor
(
fdui
->
rxsig_t
,
FL_WHITE
);
// Label color
fl_set_xyplot_ybounds
(
fdui
->
rxsig_t
,
10
,
70
);
fl_set_xyplot_symbol
(
fdui
->
rxsig_t
,
0
,
drawsymbol
);
fdui
->
graph
[
0
]
=
gNBcommonGraph
(
timeSignal
,
FL_IMPULSE_XYPLOT
,
20
,
20
,
370
,
100
,
"Received Signal (Time-Domain, dB)"
,
FL_RED
);
// Time-domain channel response
fdui
->
chest_t
=
fl_add_xyplot
(
FL_NORMAL_XYPLOT
,
410
,
20
,
370
,
100
,
"Channel Impulse Response (samples, abs)"
);
fl_set_object_boxtype
(
fdui
->
chest_t
,
FL_EMBOSSED_BOX
);
fl_set_object_color
(
fdui
->
chest_t
,
FL_BLACK
,
FL_RED
);
fl_set_object_lcolor
(
fdui
->
chest_t
,
FL_WHITE
);
// Label color
fl_set_xyplot_symbol
(
fdui
->
chest_t
,
0
,
drawsymbol
);
fdui
->
graph
[
1
]
=
gNBcommonGraph
(
timeResponse
,
FL_NORMAL_XYPLOT
,
410
,
20
,
370
,
100
,
"SRS Frequency Response (samples, abs)"
,
FL_RED
);
// Frequency-domain channel response
fdui
->
chest_f
=
fl_add_xyplot
(
FL_IMPULSE_XYPLOT
,
20
,
140
,
760
,
100
,
"Channel Frequency data (RE, dB)"
);
fl_set_object_boxtype
(
fdui
->
chest_f
,
FL_EMBOSSED_BOX
);
fl_set_object_color
(
fdui
->
chest_f
,
FL_BLACK
,
FL_RED
);
fl_set_object_lcolor
(
fdui
->
chest_f
,
FL_WHITE
);
// Label color
fl_set_xyplot_ybounds
(
fdui
->
chest_f
,
30
,
70
);
fl_set_xyplot_symbol
(
fdui
->
chest_f
,
0
,
drawsymbol
);
// LLR of PBCH
fdui
->
pbch_llr
=
fl_add_xyplot
(
FL_POINTS_XYPLOT
,
20
,
260
,
500
,
100
,
"PBCH Log-Likelihood Ratios (LLR, mag)"
);
fl_set_object_boxtype
(
fdui
->
pbch_llr
,
FL_EMBOSSED_BOX
);
fl_set_object_color
(
fdui
->
pbch_llr
,
FL_BLACK
,
FL_GREEN
);
fl_set_object_lcolor
(
fdui
->
pbch_llr
,
FL_WHITE
);
// Label color
fl_set_xyplot_symbolsize
(
fdui
->
pbch_llr
,
2
);
fl_set_xyplot_xgrid
(
fdui
->
pbch_llr
,
FL_GRID_MAJOR
);
//fl_set_xyplot_xbounds( fdui->pbch_llr,0,1920);
fl_set_xyplot_symbol
(
fdui
->
pbch_llr
,
0
,
drawsymbol
);
// I/Q PBCH comp
fdui
->
pbch_comp
=
fl_add_xyplot
(
FL_POINTS_XYPLOT
,
540
,
260
,
240
,
100
,
"PBCH I/Q of MF Output"
);
fl_set_object_boxtype
(
fdui
->
pbch_comp
,
FL_EMBOSSED_BOX
);
fl_set_object_color
(
fdui
->
pbch_comp
,
FL_BLACK
,
FL_GREEN
);
fl_set_object_lcolor
(
fdui
->
pbch_comp
,
FL_WHITE
);
// Label color
fl_set_xyplot_symbolsize
(
fdui
->
pbch_comp
,
2
);
// fl_set_xyplot_xbounds( fdui->pbch_comp,-100,100);
// fl_set_xyplot_ybounds( fdui->pbch_comp,-100,100);
// LLR of PDCCH
fdui
->
pdcch_llr
=
fl_add_xyplot
(
FL_POINTS_XYPLOT
,
20
,
380
,
500
,
100
,
"PDCCH Log-Likelihood Ratios (LLR, mag)"
);
fl_set_object_boxtype
(
fdui
->
pdcch_llr
,
FL_EMBOSSED_BOX
);
fl_set_object_color
(
fdui
->
pdcch_llr
,
FL_BLACK
,
FL_CYAN
);
fl_set_object_lcolor
(
fdui
->
pdcch_llr
,
FL_WHITE
);
// Label color
fl_set_xyplot_symbolsize
(
fdui
->
pdcch_llr
,
2
);
fl_set_xyplot_symbol
(
fdui
->
pdcch_llr
,
0
,
drawsymbol
);
// I/Q PDCCH comp
fdui
->
pdcch_comp
=
fl_add_xyplot
(
FL_POINTS_XYPLOT
,
540
,
380
,
240
,
100
,
"PDCCH I/Q of MF Output"
);
fl_set_object_boxtype
(
fdui
->
pdcch_comp
,
FL_EMBOSSED_BOX
);
fl_set_object_color
(
fdui
->
pdcch_comp
,
FL_BLACK
,
FL_CYAN
);
fl_set_object_lcolor
(
fdui
->
pdcch_comp
,
FL_WHITE
);
// Label color
fl_set_xyplot_symbolsize
(
fdui
->
pdcch_comp
,
2
);
fl_set_xyplot_xgrid
(
fdui
->
pdcch_comp
,
FL_GRID_MAJOR
);
fl_set_xyplot_symbol
(
fdui
->
pdcch_comp
,
0
,
drawsymbol
);
// LLR of PDSCH
fdui
->
pdsch_llr
=
fl_add_xyplot
(
FL_POINTS_XYPLOT
,
20
,
500
,
500
,
200
,
"PDSCH Log-Likelihood Ratios (LLR, mag)"
);
fl_set_object_boxtype
(
fdui
->
pdsch_llr
,
FL_EMBOSSED_BOX
);
fl_set_object_color
(
fdui
->
pdsch_llr
,
FL_BLACK
,
FL_YELLOW
);
fl_set_object_lcolor
(
fdui
->
pdsch_llr
,
FL_WHITE
);
// Label color
fl_set_xyplot_symbolsize
(
fdui
->
pdsch_llr
,
2
);
fl_set_xyplot_xgrid
(
fdui
->
pdsch_llr
,
FL_GRID_MAJOR
);
fl_set_xyplot_symbol
(
fdui
->
pdsch_llr
,
0
,
drawsymbol
);
// I/Q PDSCH comp
fdui
->
pdsch_comp
=
fl_add_xyplot
(
FL_POINTS_XYPLOT
,
540
,
500
,
240
,
200
,
"PDSCH I/Q of MF Output"
);
fl_set_object_boxtype
(
fdui
->
pdsch_comp
,
FL_EMBOSSED_BOX
);
fl_set_object_color
(
fdui
->
pdsch_comp
,
FL_BLACK
,
FL_YELLOW
);
fl_set_object_lcolor
(
fdui
->
pdsch_comp
,
FL_WHITE
);
// Label color
fl_set_xyplot_symbolsize
(
fdui
->
pdsch_comp
,
2
);
fl_set_xyplot_symbol
(
fdui
->
pdsch_comp
,
0
,
drawsymbol
);
// Throughput on PDSCH
fdui
->
pdsch_tput
=
fl_add_xyplot
(
FL_NORMAL_XYPLOT
,
20
,
720
,
500
,
100
,
"PDSCH Throughput [frame]/[kbit/s]"
);
fl_set_object_boxtype
(
fdui
->
pdsch_tput
,
FL_EMBOSSED_BOX
);
fl_set_object_color
(
fdui
->
pdsch_tput
,
FL_BLACK
,
FL_WHITE
);
fl_set_object_lcolor
(
fdui
->
pdsch_tput
,
FL_WHITE
);
// Label color
fl_set_xyplot_symbol
(
fdui
->
pdsch_tput
,
0
,
drawsymbol
);
fdui
->
graph
[
2
]
=
gNBcommonGraph
(
frequencyResponse
,
FL_IMPULSE_XYPLOT
,
20
,
140
,
760
,
100
,
"Channel Frequency Response (RE, dB)"
,
FL_RED
);
// LLR of PUSCH
fdui
->
graph
[
3
]
=
gNBcommonGraph
(
puschLLR
,
FL_POINTS_XYPLOT
,
20
,
260
,
500
,
200
,
"PUSCH Log-Likelihood Ratios (LLR, mag)"
,
FL_YELLOW
);
// I/Q PUSCH comp
fdui
->
graph
[
4
]
=
gNBcommonGraph
(
puschIQ
,
FL_POINTS_XYPLOT
,
540
,
260
,
240
,
200
,
"PUSCH I/Q of MF Output"
,
FL_YELLOW
);
// I/Q PUCCH comp (format 1)
fdui
->
graph
[
5
]
=
gNBcommonGraph
(
pucchEnergy
,
FL_POINTS_XYPLOT
,
540
,
480
,
240
,
100
,
"PUCCH1 Energy (SR)"
,
FL_YELLOW
);
// fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR);
// I/Q PUCCH comp (fromat 1a/b)
fdui
->
graph
[
6
]
=
gNBcommonGraph
(
pucchIQ
,
FL_POINTS_XYPLOT
,
540
,
600
,
240
,
100
,
"PUCCH I/Q of MF Output"
,
FL_YELLOW
);
// Throughput on PUSCH
fdui
->
graph
[
7
]
=
gNBcommonGraph
(
puschThroughtput
,
FL_NORMAL_XYPLOT
,
20
,
480
,
500
,
100
,
"PUSCH Throughput [frame]/[kbit/s]"
,
FL_WHITE
);
fdui
->
graph
[
8
].
graph
=
NULL
;
// Generic UE Button
fdui
->
button_0
=
fl_add_button
(
FL_PUSH_BUTTON
,
540
,
720
,
240
,
40
,
""
);
fl_set_object_lalign
(
fdui
->
button_0
,
FL_ALIGN_CENTER
);
//openair_daq_vars.use_ia_receiver = 0;
fl_set_button
(
fdui
->
button_0
,
0
);
fl_set_object_label
(
fdui
->
button_0
,
"IA Receiver OFF"
);
fl_set_object_color
(
fdui
->
button_0
,
FL_RED
,
FL_RED
);
fl_set_object_callback
(
fdui
->
button_0
,
ia_receiver_on_off
,
0
);
fl_hide_object
(
fdui
->
button_0
);
// Generic eNB Button
if
(
0
)
{
// code kept to later add command buttons
fdui
->
button_0
=
fl_add_button
(
FL_PUSH_BUTTON
,
20
,
600
,
240
,
40
,
""
);
fl_set_object_lalign
(
fdui
->
button_0
,
FL_ALIGN_CENTER
);
fl_set_button
(
fdui
->
button_0
,
0
);
otg_enabled
=
0
;
fl_set_object_label
(
fdui
->
button_0
,
"DL Traffic OFF"
);
fl_set_object_color
(
fdui
->
button_0
,
FL_RED
,
FL_RED
);
fl_set_object_callback
(
fdui
->
button_0
,
dl_traffic_on_off
,
0
);
}
fl_end_form
(
);
fdui
->
phy_scope_nrue
->
fdui
=
fdui
;
fdui
->
phy_scope
->
fdui
=
fdui
;
char
title
[
100
];
sprintf
(
title
,
"LTE UL SCOPE eNB for UE %d"
,
UE_id
);
fl_show_form
(
fdui
->
phy_scope
,
FL_PLACE_HOTSPOT
,
FL_FULLBORDER
,
title
);
return
fdui
;
}
void
phy_scope_nrUE
(
FD_phy_scope_nrue
*
form
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
,
uint8_t
subframe
)
{
int
i
,
arx
,
atx
,
ind
,
k
;
NR_DL_FRAME_PARMS
*
frame_parms
=
&
phy_vars_ue
->
frame_parms
;
//int nsymb_ce = frame_parms->ofdm_symbol_size;//*frame_parms->symbols_per_tti;
int
samples_per_frame
=
frame_parms
->
samples_per_frame
;
uint8_t
nb_antennas_rx
=
frame_parms
->
nb_antennas_rx
;
uint8_t
nb_antennas_tx
=
frame_parms
->
nb_antenna_ports_gNB
;
//int16_t *pdsch_mag;
int
num_pdcch_symbols
=
2
;
int
symbol
,
first_symbol
=
2
,
nb_re
;
int
nb_rb_pdsch
=
50
,
nb_symb_sch
=
9
;
float
ymax
=
1
;
static
int
overlay
=
0
;
/*
int frame = phy_vars_ue->proc.proc_rxtx[0].frame_rx;
int mcs = 0;
unsigned char harq_pid = 0;
*/
/*
if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) {
harq_pid = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->current_harq_pid;
static
FD_phy_scope_t
*
form_gnb
[
NUMBER_OF_UE_MAX
]
=
{
0
};
static
unsigned
char
scope_enb_num_ue
=
1
;
if (harq_pid>=8)
return;
static
void
*
scope_thread_gNB
(
void
*
arg
)
{
scopeParms_t
*
p
=
(
scopeParms_t
*
)
arg
;
//# ifdef ENABLE_XFORMS_WRITE_STATS
// FILE *gNB_stats = fopen("gNB_stats.txt", "w");
//#endif
mcs = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->mcs;
while
(
!
oai_exit
)
{
int
ue_cnt
=
0
;
// Button 0
if(!phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->dl_power_off) {
// we are in TM5
fl_show_object(form->button_0);
for
(
int
UE_id
=
0
;
UE_id
<
NUMBER_OF_UE_MAX
;
UE_id
++
)
{
if
((
ue_cnt
<
scope_enb_num_ue
))
{
//this function needs to be written
phy_scope_gNB
(
form_gnb
[
ue_cnt
],
p
->
gNB
,
p
->
ru
,
UE_id
);
ue_cnt
++
;
}
}
}
if (phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]!=NULL) {
num_pdcch_symbols = phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->num_pdcch_symbols;
usleep
(
99
*
1000
);
}
// coded_bits_per_codeword = frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) {
coded_bits_per_codeword = get_G(frame_parms,
phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->nb_rb,
phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even,
get_Qm(mcs),
phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->Nl,
num_pdcch_symbols,
frame,
subframe,
beamforming_mode);
} else {
coded_bits_per_codeword = 0; //frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
}
*/
// printf("%s",stats_buffer);
/*#ifdef ENABLE_XFORMS_WRITE_STATS
if (eNB_stats) {
rewind (gNB_stats);
fwrite (stats_buffer, 1, len, gNB_stats);
fclose (gNB_stats);
}
#endif
pthread_exit((void *)arg);
}*/
return
NULL
;
}
void
startScope
(
scopeParms_t
*
p
)
{
//FD_stats_form *form_stats=NULL,*form_stats_l2=NULL;
fl_initialize
(
p
->
argc
,
p
->
argv
,
NULL
,
0
,
0
);
/*
form_stats_l2 = create_form_stats_form();
fl_show_form (form_stats_l2->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "l2 stats");
form_stats = create_form_stats_form();
fl_show_form (form_stats->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "stats");
*/
for
(
int
UE_id
=
0
;
UE_id
<
scope_enb_num_ue
;
UE_id
++
)
{
form_gnb
[
UE_id
]
=
create_phy_scope_gnb
(
UE_id
);
}
// UE_id
//pdsch_mag = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag0[0];
pthread_t
forms_thread
;
threadCreate
(
&
forms_thread
,
scope_thread_gNB
,
p
,
"scope"
,
-
1
,
OAI_PRIORITY_RT_LOW
);
}
static
void
ueTimeResponse
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
// Received signal in time domain of receive antenna 0
if
(
phy_vars_ue
->
common_vars
.
rxdata
)
{
int16_t
**
rxsig_t
=
(
int16_t
**
)
phy_vars_ue
->
common_vars
.
rxdata
;
if
(
!
phy_vars_ue
->
common_vars
.
rxdata
)
return
;
NR_DL_FRAME_PARMS
*
frame_parms
=
&
phy_vars_ue
->
frame_parms
;
uint8_t
nb_antennas_rx
=
frame_parms
->
nb_antennas_rx
;
int
samples_per_frame
=
frame_parms
->
samples_per_frame
;
int16_t
**
rxsig_t
=
(
int16_t
**
)
phy_vars_ue
->
common_vars
.
rxdata
;
float
rxsig_t_dB
[
nb_antennas_rx
][
samples_per_frame
];
float
time
[
samples_per_frame
];
if
(
rxsig_t
[
0
]
!=
NULL
)
{
for
(
i
=
0
;
i
<
samples_per_frame
;
i
++
)
{
rxsig_t_dB
[
0
][
i
]
=
10
*
log10
(
1
.
0
+
(
float
)
((
rxsig_t
[
0
][
2
*
i
])
*
(
rxsig_t
[
0
][
2
*
i
])
+
(
rxsig_t
[
0
][
2
*
i
+
1
])
*
(
rxsig_t
[
0
][
2
*
i
+
1
])));
time
[
i
]
=
(
float
)
i
;
}
fl_set_xyplot_data
(
form
->
rxsig_t
,
time
,
rxsig_t_dB
[
0
],
samples_per_frame
,
""
,
""
,
""
);
if
(
rxsig_t
[
0
]
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
samples_per_frame
;
i
++
)
{
rxsig_t_dB
[
0
][
i
]
=
10
*
log10
(
1
.
0
+
(
float
)
((
rxsig_t
[
0
][
2
*
i
])
*
(
rxsig_t
[
0
][
2
*
i
])
+
(
rxsig_t
[
0
][
2
*
i
+
1
])
*
(
rxsig_t
[
0
][
2
*
i
+
1
])));
time
[
i
]
=
(
float
)
i
;
}
/*
for (arx=1; arx<nb_antennas_rx; arx++) {
if (rxsig_t[arx] != NULL) {
for (i=0; i<FRAME_LENGTH_COMPLEX_SAMPLES; i++) {
rxsig_t_dB[arx][i] = 10*log10(1.0+(float) ((rxsig_t[arx][2*i])*(rxsig_t[arx][2*i])+(rxsig_t[arx][2*i+1])*(rxsig_t[arx][2*i+1])));
}
fl_set_xyplot_data
(
graph
,
time
,
rxsig_t_dB
[
0
],
samples_per_frame
,
""
,
""
,
""
);
}
fl_add_xyplot_overlay(form->rxsig_t,arx,time,rxsig_t_dB[arx],FRAME_LENGTH_COMPLEX_SAMPLES,rx_antenna_colors[arx]);
for
(
int
arx
=
1
;
arx
<
nb_antennas_rx
;
arx
++
)
{
if
(
rxsig_t
[
arx
]
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
FRAME_LENGTH_COMPLEX_SAMPLES
;
i
++
)
{
rxsig_t_dB
[
arx
][
i
]
=
10
*
log10
(
1
.
0
+
(
float
)
((
rxsig_t
[
arx
][
2
*
i
])
*
(
rxsig_t
[
arx
][
2
*
i
])
+
(
rxsig_t
[
arx
][
2
*
i
+
1
])
*
(
rxsig_t
[
arx
][
2
*
i
+
1
])));
}
fl_add_xyplot_overlay
(
graph
,
arx
,
time
,
rxsig_t_dB
[
arx
],
FRAME_LENGTH_COMPLEX_SAMPLES
,
rx_antenna_colors
[
arx
]);
}
*/
}
if
(
phy_vars_ue
->
is_synchronized
==
0
)
{
//float corr[samples_per_frame];
for
(
in
d
=
0
;
ind
<
3
;
ind
++
)
{
for
(
in
t
ind
=
0
;
ind
<
3
;
ind
++
)
{
/*
if (pss_corr_ue[ind]) {
for (i=0; i<samples_per_frame; i++) {
corr[i] = (float) pss_corr_ue[ind][i];
time[i] = (float) i;
}
if (ind==0)
fl_set_xyplot_data(form->chest_t,time,corr,samples_per_frame,"","","");
else
fl_add_xyplot_overlay(form->chest_t,ind,time,corr,samples_per_frame,rx_antenna_colors[ind]);
overlay = 1;
}
if (pss_corr_ue[ind]) {
for (i=0; i<samples_per_frame; i++) {
corr[i] = (float) pss_corr_ue[ind][i];
time[i] = (float) i;
}
if (ind==0)
fl_set_xyplot_data(form->chest_t,time,corr,samples_per_frame,"","","");
else
fl_add_xyplot_overlay(form->chest_t,ind,time,corr,samples_per_frame,rx_antenna_colors[ind]);
overlay = 1;
}
*/
}
}
else
{
if
(
overlay
)
{
//there was a previous overlay
fl_clear_xyplot
(
form
->
chest_t
);
overlay
=
0
;
// if the UE is not synchronized, we can make only the time*power graph
}
}
static
void
ueChannelResponse
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
// Channel Impulse Response
if
(
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
dl_ch_estimates_time
)
{
int16_t
**
chest_t
=
(
int16_t
**
)
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
dl_ch_estimates_time
;
ymax
=
0
;
float
chest_t_abs
[
nb_antennas_rx
][
frame_parms
->
ofdm_symbol_size
];
float
time
[
frame_parms
->
ofdm_symbol_size
>>
3
];
if
(
chest_t
[
0
]
!=
NULL
)
{
for
(
i
=
0
;
i
<
(
frame_parms
->
ofdm_symbol_size
>>
3
);
i
++
)
{
chest_t_abs
[
0
][
i
]
=
(
float
)
(
chest_t
[
0
][
2
*
i
]
*
chest_t
[
0
][
2
*
i
]
+
chest_t
[
0
][
2
*
i
+
1
]
*
chest_t
[
0
][
2
*
i
+
1
]);
time
[
i
]
=
(
float
)
i
;
if
(
chest_t_abs
[
0
][
i
]
>
ymax
)
ymax
=
chest_t_abs
[
0
][
i
];
}
if
(
!
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
dl_ch_estimates_time
)
return
;
fl_set_xyplot_data
(
form
->
chest_t
,
time
,
chest_t_abs
[
0
],(
frame_parms
->
ofdm_symbol_size
>>
3
),
""
,
""
,
""
);
NR_DL_FRAME_PARMS
*
frame_parms
=
&
phy_vars_ue
->
frame_parms
;
uint8_t
nb_antennas_rx
=
frame_parms
->
nb_antennas_rx
;
int16_t
**
chest_t
=
(
int16_t
**
)
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
dl_ch_estimates_time
;
int
ymax
=
0
;
float
chest_t_abs
[
nb_antennas_rx
][
frame_parms
->
ofdm_symbol_size
];
float
time
[
frame_parms
->
ofdm_symbol_size
>>
3
];
if
(
chest_t
[
0
]
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
(
frame_parms
->
ofdm_symbol_size
>>
3
);
i
++
)
{
chest_t_abs
[
0
][
i
]
=
(
float
)
(
chest_t
[
0
][
2
*
i
]
*
chest_t
[
0
][
2
*
i
]
+
chest_t
[
0
][
2
*
i
+
1
]
*
chest_t
[
0
][
2
*
i
+
1
]);
time
[
i
]
=
(
float
)
i
;
if
(
chest_t_abs
[
0
][
i
]
>
ymax
)
ymax
=
chest_t_abs
[
0
][
i
];
}
/*
for (arx=1; arx<nb_antennas_rx; arx++) {
if (chest_t[arx] !=NULL) {
for (i=0; i<(frame_parms->ofdm_symbol_size>>3); i++) {
chest_t_abs[arx][i] = (float) (chest_t[arx][4*i]*chest_t[arx][4*i]+chest_t[arx][4*i+1]*chest_t[arx][4*i+1]);
if (chest_t_abs[arx][i] > ymax)
ymax = chest_t_abs[arx][i];
}
fl_set_xyplot_data
(
graph
,
time
,
chest_t_abs
[
0
],(
frame_parms
->
ofdm_symbol_size
>>
3
),
""
,
""
,
""
);
}
for
(
int
arx
=
1
;
arx
<
nb_antennas_rx
;
arx
++
)
{
if
(
chest_t
[
arx
]
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
(
frame_parms
->
ofdm_symbol_size
>>
3
);
i
++
)
{
chest_t_abs
[
arx
][
i
]
=
(
float
)
(
chest_t
[
arx
][
4
*
i
]
*
chest_t
[
arx
][
4
*
i
]
+
chest_t
[
arx
][
4
*
i
+
1
]
*
chest_t
[
arx
][
4
*
i
+
1
]);
fl_add_xyplot_overlay(form->chest_t,arx,time,chest_t_abs[arx],(frame_parms->ofdm_symbol_size>>3),rx_antenna_colors[arx]);
fl_set_xyplot_overlay_type(form->chest_t,arx,FL_DASHED_XYPLOT)
;
if
(
chest_t_abs
[
arx
][
i
]
>
ymax
)
ymax
=
chest_t_abs
[
arx
][
i
]
;
}
fl_add_xyplot_overlay
(
graph
,
arx
,
time
,
chest_t_abs
[
arx
],(
frame_parms
->
ofdm_symbol_size
>>
3
),
rx_antenna_colors
[
arx
]);
fl_set_xyplot_overlay_type
(
graph
,
arx
,
FL_DASHED_XYPLOT
);
}
*/
// Avoid flickering effect
// fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax); // Does not always work...
fl_set_xyplot_ybounds
(
form
->
chest_t
,
0
,(
double
)
ymax
);
}
}
// Channel Frequency Response (includes 5 complex sample for filter)
if
(
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
dl_ch_estimates
)
{
int16_t
**
chest_f
=
(
int16_t
**
)
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
dl_ch_estimates
;
ind
=
0
;
float
chest_f_abs
[
frame_parms
->
ofdm_symbol_size
];
float
freq
[
frame_parms
->
ofdm_symbol_size
];
for
(
atx
=
0
;
atx
<
nb_antennas_tx
;
atx
++
)
{
for
(
arx
=
0
;
arx
<
nb_antennas_rx
;
arx
++
)
{
if
(
chest_f
[(
atx
<<
1
)
+
arx
]
!=
NULL
)
{
for
(
k
=
0
;
k
<
frame_parms
->
ofdm_symbol_size
;
k
++
)
{
freq
[
ind
]
=
(
float
)
ind
;
float
Re
=
(
float
)(
chest_f
[(
atx
<<
1
)
+
arx
][
6144
+
(
2
*
k
)]);
float
Im
=
(
float
)(
chest_f
[(
atx
<<
1
)
+
arx
][
6144
+
(
2
*
k
)
+
1
]);
chest_f_abs
[
ind
]
=
(
short
)
10
*
log10
(
1
.
0
+
((
double
)
Re
*
Re
+
(
double
)
Im
*
Im
));
ind
++
;
}
}
}
}
// Avoid flickering effect
// fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax); // Does not always work...
fl_set_xyplot_ybounds
(
graph
,
0
,(
double
)
ymax
);
}
// tx antenna 0
//fl_set_xyplot_xbounds(form->chest_f,0,nb_antennas_rx*nb_antennas_tx*nsymb_ce);
//fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,2);
// fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*2,2);
//fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR);
fl_set_xyplot_data
(
form
->
chest_f
,
freq
,
chest_f_abs
,
frame_parms
->
ofdm_symbol_size
,
""
,
""
,
""
);
static
void
uePbchFrequencyResp
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
// Channel Frequency Response (includes 5 complex sample for filter)
if
(
!
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
dl_ch_estimates
)
return
;
/*
for (arx=1; arx<nb_antennas_rx; arx++) {
fl_add_xyplot_overlay(form->chest_f,1,&freq[arx*nsymb_ce],&chest_f_abs[arx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
}
NR_DL_FRAME_PARMS
*
frame_parms
=
&
phy_vars_ue
->
frame_parms
;
uint8_t
nb_antennas_rx
=
frame_parms
->
nb_antennas_rx
;
uint8_t
nb_antennas_tx
=
frame_parms
->
nb_antenna_ports_gNB
;
int16_t
**
chest_f
=
(
int16_t
**
)
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
dl_ch_estimates
;
int
ind
=
0
;
float
chest_f_abs
[
frame_parms
->
ofdm_symbol_size
];
float
freq
[
frame_parms
->
ofdm_symbol_size
];
// other tx antennas
if (nb_antennas_tx > 1) {
if (nb_antennas_rx > 1) {
for (atx=1; atx<nb_antennas_tx; atx++) {
for (arx=0; arx<nb_antennas_rx; arx++) {
fl_add_xyplot_overlay(form->chest_f,(atx<<1)+arx,&freq[((atx<<1)+arx)*nsymb_ce],&chest_f_abs[((atx<<1)+arx)*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
}
for
(
int
atx
=
0
;
atx
<
nb_antennas_tx
;
atx
++
)
{
for
(
int
arx
=
0
;
arx
<
nb_antennas_rx
;
arx
++
)
{
if
(
chest_f
[(
atx
<<
1
)
+
arx
]
!=
NULL
)
{
for
(
int
k
=
0
;
k
<
frame_parms
->
ofdm_symbol_size
;
k
++
)
{
freq
[
ind
]
=
(
float
)
ind
;
float
Re
=
(
float
)(
chest_f
[(
atx
<<
1
)
+
arx
][
6144
+
(
2
*
k
)]);
float
Im
=
(
float
)(
chest_f
[(
atx
<<
1
)
+
arx
][
6144
+
(
2
*
k
)
+
1
]);
chest_f_abs
[
ind
]
=
(
short
)
10
*
log10
(
1
.
0
+
((
double
)
Re
*
Re
+
(
double
)
Im
*
Im
));
ind
++
;
}
} else { // 1 rx antenna
atx=1;
arx=0;
fl_add_xyplot_overlay(form->chest_f,atx,&freq[atx*nsymb_ce],&chest_f_abs[atx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
}
}
*/
}
// tx antenna 0
//fl_set_xyplot_xbounds(form->chest_f,0,nb_antennas_rx*nb_antennas_tx*nsymb_ce);
//fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,2);
// fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*2,2);
//fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR);
fl_set_xyplot_data
(
graph
,
freq
,
chest_f_abs
,
frame_parms
->
ofdm_symbol_size
,
""
,
""
,
""
);
}
static
void
uePbchLLR
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
// PBCH LLRs
if
(
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
llr
)
{
int16_t
*
pbch_llr
=
(
int16_t
*
)
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
llr
;
if
(
!
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
llr
)
return
;
int16_t
*
pbch_llr
=
(
int16_t
*
)
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
llr
;
float
llr_pbch
[
1920
],
bit_pbch
[
1920
];
for
(
i
=
0
;
i
<
864
;
i
++
)
{
llr_pbch
[
i
]
=
(
float
)
pbch_llr
[
i
];
bit_pbch
[
i
]
=
(
float
)
i
;
for
(
int
i
=
0
;
i
<
864
;
i
++
)
{
llr_pbch
[
i
]
=
(
float
)
pbch_llr
[
i
];
bit_pbch
[
i
]
=
(
float
)
i
;
}
fl_set_xyplot_data
(
graph
,
bit_pbch
,
llr_pbch
,
864
,
""
,
""
,
""
);
}
static
void
uePbchIQ
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
// PBCH I/Q of MF Output
if
(
!
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
rxdataF_comp
[
0
])
return
;
int16_t
*
pbch_comp
=
(
int16_t
*
)
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
rxdataF_comp
[
0
];
localBuff
(
I
,
180
*
3
);
localBuff
(
Q
,
180
*
3
);
int
first_symbol
=
1
;
int
base
=
0
;
for
(
int
symbol
=
first_symbol
;
symbol
<
(
first_symbol
+
3
);
symbol
++
)
{
int
nb_re
;
if
(
symbol
==
2
||
symbol
==
6
)
nb_re
=
72
;
else
nb_re
=
180
;
AssertFatal
(
base
+
nb_re
<
180
*
3
,
""
);
for
(
int
i
=
0
;
i
<
nb_re
;
i
++
)
{
I
[
base
+
i
]
=
pbch_comp
[
2
*
symbol
*
20
*
12
+
2
*
i
];
Q
[
base
+
i
]
=
pbch_comp
[
2
*
symbol
*
20
*
12
+
2
*
i
+
1
];
}
fl_set_xyplot_data
(
form
->
pbch_llr
,
bit_pbch
,
llr_pbch
,
864
,
""
,
""
,
""
)
;
base
+=
nb_re
;
}
first_symbol
=
1
;
fl_set_xyplot_data
(
graph
,
I
,
Q
,
base
,
""
,
""
,
""
);
}
// PBCH I/Q of MF Output
if
(
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
rxdataF_comp
[
0
])
{
int16_t
*
pbch_comp
=
(
int16_t
*
)
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
rxdataF_comp
[
0
];
float
I
[
432
];
float
Q
[
432
];
for
(
symbol
=
first_symbol
;
symbol
<
(
first_symbol
+
3
);
symbol
++
)
{
if
(
symbol
==
2
||
symbol
==
6
)
nb_re
=
72
;
else
nb_re
=
180
;
for
(
i
=
0
;
i
<
nb_re
;
i
++
)
{
I
[
i
]
=
pbch_comp
[
2
*
symbol
*
20
*
12
+
2
*
i
];
Q
[
i
]
=
pbch_comp
[
2
*
symbol
*
20
*
12
+
2
*
i
+
1
];
static
void
uePcchLLR
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
// PDCCH LLRs
if
(
!
phy_vars_ue
->
pdcch_vars
[
0
][
eNB_id
]
->
llr
)
return
;
NR_DL_FRAME_PARMS
*
frame_parms
=
&
phy_vars_ue
->
frame_parms
;
uint8_t
nb_antennas_rx
=
frame_parms
->
nb_antennas_rx
;
uint8_t
nb_antennas_tx
=
frame_parms
->
nb_antennas_tx
;
int16_t
**
chest_f
=
(
int16_t
**
)
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
dl_ch_estimates
;
int
ind
=
0
;
float
chest_f_abs
[
frame_parms
->
ofdm_symbol_size
];
float
freq
[
frame_parms
->
ofdm_symbol_size
];
for
(
int
atx
=
0
;
atx
<
nb_antennas_tx
;
atx
++
)
{
for
(
int
arx
=
0
;
arx
<
nb_antennas_rx
;
arx
++
)
{
if
(
chest_f
[(
atx
<<
1
)
+
arx
]
!=
NULL
)
{
for
(
int
k
=
0
;
k
<
frame_parms
->
ofdm_symbol_size
;
k
++
)
{
freq
[
ind
]
=
(
float
)
ind
;
float
Re
=
(
float
)(
chest_f
[(
atx
<<
1
)
+
arx
][
6144
+
(
2
*
k
)]);
float
Im
=
(
float
)(
chest_f
[(
atx
<<
1
)
+
arx
][
6144
+
(
2
*
k
)
+
1
]);
chest_f_abs
[
ind
]
=
(
short
)
10
*
log10
(
1
.
0
+
((
double
)
Re
*
Re
+
(
double
)
Im
*
Im
));
ind
++
;
}
}
}
fl_set_xyplot_data
(
form
->
pbch_comp
,
I
,
Q
,
432
,
""
,
""
,
""
);
}
// PDCCH LLRs
if
(
phy_vars_ue
->
pdcch_vars
[
phy_vars_ue
->
current_thread_id
[
subframe
]][
eNB_id
]
->
llr
)
{
int8_t
*
pdcch_llr
=
(
int8_t
*
)
phy_vars_ue
->
pdcch_vars
[
phy_vars_ue
->
current_thread_id
[
subframe
]][
eNB_id
]
->
llr
;
// tx antenna 0
//fl_set_xyplot_xbounds(form->chest_f,0,nb_antennas_rx*nb_antennas_tx*nsymb_ce);
//fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,2);
// fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*2,2);
//fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR);
fl_set_xyplot_data
(
graph
,
freq
,
chest_f_abs
,
frame_parms
->
ofdm_symbol_size
,
""
,
""
,
""
);
}
static
void
uePcchIQ
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
// PDCCH I/Q of MF Output
if
(
!
phy_vars_ue
->
pdcch_vars
[
0
][
eNB_id
]
->
rxdataF_comp
[
0
])
return
;
int
nb
=
12
*
273
*
4
;
// 12*frame_parms->N_RB_DL*num_pdcch_symbols
localBuff
(
I
,
nb
*
RX_NB_TH_MAX
);
localBuff
(
Q
,
nb
*
RX_NB_TH_MAX
);
int
base
=
0
;
float
llr_pdcch
[
12
*
frame_parms
->
N_RB_DL
*
num_pdcch_symbols
*
2
];
float
bit_pdcch
[
12
*
frame_parms
->
N_RB_DL
*
num_pdcch_symbols
*
2
];
for
(
int
thr
=
0
;
thr
<
RX_NB_TH_MAX
;
thr
++
)
{
int16_t
*
pdcch_comp
=
(
int16_t
*
)
phy_vars_ue
->
pdcch_vars
[
thr
][
eNB_id
]
->
rxdataF_comp
[
0
];
for
(
i
=
0
;
i
<
100
;
i
++
)
{
//12*frame_parms->N_RB_DL*2*num_pdcch_symbols
llr_pdcch
[
i
]
=
(
float
)
pdcch_llr
[
2
*
24
*
9
+
i
];
bit_pdcch
[
i
]
=
(
float
)
i
;
for
(
i
nt
i
=
0
;
i
<
nb
;
i
++
)
{
I
[
base
+
i
]
=
pdcch_comp
[
i
*
2
];
Q
[
base
+
i
]
=
pdcch_comp
[
i
*
2
+
1
]
;
}
fl_set_xyplot_data
(
form
->
pdcch_llr
,
bit_pdcch
,
llr_pdcch
,
12
*
frame_parms
->
N_RB_DL
*
num_pdcch_symbols
,
""
,
""
,
""
)
;
base
+=
nb
;
}
// PDCCH I/Q of MF Output
if
(
phy_vars_ue
->
pdcch_vars
[
phy_vars_ue
->
current_thread_id
[
subframe
]][
eNB_id
]
->
rxdataF_comp
[
0
])
{
int16_t
*
pdcch_comp
=
(
int16_t
*
)
phy_vars_ue
->
pdcch_vars
[
phy_vars_ue
->
current_thread_id
[
subframe
]][
eNB_id
]
->
rxdataF_comp
[
0
];
float
I
[
frame_parms
->
ofdm_symbol_size
*
frame_parms
->
symbols_per_slot
*
2
];
float
Q
[
frame_parms
->
ofdm_symbol_size
*
frame_parms
->
symbols_per_slot
*
2
];
for
(
i
=
0
;
i
<
100
;
i
++
)
{
I
[
i
]
=
pdcch_comp
[
2
*
50
*
12
+
2
*
i
];
Q
[
i
]
=
pdcch_comp
[
2
*
50
*
12
+
2
*
i
+
1
];
}
fl_set_xyplot_data
(
form
->
pdcch_comp
,
I
,
Q
,
12
*
frame_parms
->
N_RB_DL
*
num_pdcch_symbols
,
""
,
""
,
""
);
}
fl_set_xyplot_data
(
graph
,
I
,
Q
,
base
,
""
,
""
,
""
);
}
static
void
uePdschLLR
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
// PDSCH LLRs
if
(
phy_vars_ue
->
pdsch_vars
[
phy_vars_ue
->
current_thread_id
[
subframe
]][
eNB_id
]
->
llr
[
0
])
{
int16_t
*
pdsch_llr
=
(
int16_t
*
)
phy_vars_ue
->
pdsch_vars
[
phy_vars_ue
->
current_thread_id
[
subframe
]][
eNB_id
]
->
llr
[
0
];
// stream 0
// pdsch_llr = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id]->llr[0]; // stream 0
int
num_re
=
4500
;
int
Qm
=
2
;
int
coded_bits_per_codeword
=
num_re
*
Qm
;
float
llr
[
coded_bits_per_codeword
];
float
bit
[
coded_bits_per_codeword
];
for
(
i
=
0
;
i
<
coded_bits_per_codeword
;
i
++
)
{
llr
[
i
]
=
(
float
)
pdsch_llr
[
i
];
bit
[
i
]
=
(
float
)
i
;
if
(
!
phy_vars_ue
->
pdsch_vars
[
0
][
eNB_id
]
->
llr
[
0
])
return
;
int
num_re
=
4500
;
int
Qm
=
2
;
int
coded_bits_per_codeword
=
num_re
*
Qm
;
localBuff
(
llr
,
coded_bits_per_codeword
*
RX_NB_TH_MAX
);
localBuff
(
bit
,
coded_bits_per_codeword
*
RX_NB_TH_MAX
);
int
base
=
0
;
for
(
int
thr
=
0
;
thr
<
RX_NB_TH_MAX
;
thr
++
)
{
int16_t
*
pdsch_llr
=
(
int16_t
*
)
phy_vars_ue
->
pdsch_vars
[
thr
][
eNB_id
]
->
llr
[
0
];
// stream 0
for
(
int
i
=
0
;
i
<
coded_bits_per_codeword
;
i
++
)
{
llr
[
base
+
i
]
=
(
float
)
pdsch_llr
[
i
];
bit
[
base
+
i
]
=
(
float
)
base
+
i
;
}
//fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword);
fl_set_xyplot_data
(
form
->
pdsch_llr
,
bit
,
llr
,
coded_bits_per_codeword
,
""
,
""
,
""
);
base
+=
coded_bits_per_codeword
;
}
first_symbol
=
2
;
ind
=
0
;
//fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword);
fl_set_xyplot_data
(
graph
,
bit
,
llr
,
base
,
""
,
""
,
""
);
}
static
void
uePdschIQ
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
// PDSCH I/Q of MF Output
if
(
phy_vars_ue
->
pdsch_vars
[
phy_vars_ue
->
current_thread_id
[
subframe
]][
eNB_id
]
->
rxdataF_comp0
[
0
])
{
int16_t
*
pdsch_comp
=
(
int16_t
*
)
phy_vars_ue
->
pdsch_vars
[
phy_vars_ue
->
current_thread_id
[
subframe
]][
eNB_id
]
->
rxdataF_comp0
[
0
];
float
I
[
nb_symb_sch
];
float
Q
[
nb_symb_sch
];
for
(
symbol
=
0
;
symbol
<
nb_symb_sch
;
symbol
++
)
{
for
(
i
=
0
;
i
<
nb_rb_pdsch
*
12
;
i
++
)
{
I
[
ind
]
=
pdsch_comp
[
2
*
((
first_symbol
+
symbol
)
*
frame_parms
->
N_RB_DL
*
12
+
i
)
];
Q
[
ind
]
=
pdsch_comp
[
2
*
((
first_symbol
+
symbol
)
*
frame_parms
->
N_RB_DL
*
12
+
i
)
+
1
];
ind
++
;
}
if
(
!
phy_vars_ue
->
pdsch_vars
[
0
][
eNB_id
]
->
rxdataF_comp0
[
0
])
return
;
NR_DL_FRAME_PARMS
*
frame_parms
=
&
phy_vars_ue
->
frame_parms
;
int
sz
=
7
*
2
*
frame_parms
->
N_RB_DL
*
12
;
// size of the malloced buffer
localBuff
(
I
,
sz
*
RX_NB_TH_MAX
);
localBuff
(
Q
,
sz
*
RX_NB_TH_MAX
);
int
base
=
0
;
for
(
int
thr
=
0
;
thr
<
RX_NB_TH_MAX
;
thr
++
)
{
int16_t
*
pdsch_comp
=
(
int16_t
*
)
phy_vars_ue
->
pdsch_vars
[
thr
][
eNB_id
]
->
rxdataF_comp0
[
0
];
for
(
int
s
=
0
;
s
<
sz
;
s
++
)
{
I
[
s
+
base
]
+=
pdsch_comp
[
2
*
s
];
Q
[
s
+
base
]
+=
pdsch_comp
[
2
*
s
+
1
];
}
fl_set_xyplot_data
(
form
->
pdsch_comp
,
I
,
Q
,
nb_symb_sch
*
nb_rb_pdsch
*
12
,
""
,
""
,
""
)
;
base
+=
sz
;
}
fl_set_xyplot_data
(
graph
,
I
,
Q
,
base
,
""
,
""
,
""
);
/*
// PDSCH Throughput
...
...
@@ -832,97 +773,123 @@ void phy_scope_nrUE(FD_phy_scope_nrue *form,
tput_ue[UE_id][TPUT_WINDOW_LENGTH-1] = ((float) total_dlsch_bitrate)/1000.0;
if (tput_ue[UE_id][TPUT_WINDOW_LENGTH-1] > tput_ue_max[UE_id]) {
tput_ue_max[UE_id] = tput_ue[UE_id][TPUT_WINDOW_LENGTH-1];
tput_ue_max[UE_id] = tput_ue[UE_id][TPUT_WINDOW_LENGTH-1];
}
fl_set_xyplot_data(form->pdsch_tput,tput_time_ue[UE_id],tput_ue[UE_id],TPUT_WINDOW_LENGTH,"","","");
fl_set_xyplot_ybounds(form->pdsch_tput,0,tput_ue_max[UE_id]);
*/
}
fl_check_forms
();
static
void
uePdschThroughput
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
}
static
FD_phy_scope_t
*
create_phy_scope_nrue
(
int
ID
)
{
FL_OBJECT
*
obj
;
FD_phy_scope_t
*
fdui
=
fl_malloc
(
sizeof
*
fdui
);
// Define form
fdui
->
phy_scope
=
fl_bgn_form
(
FL_NO_BOX
,
800
,
900
);
// This the whole UI box
obj
=
fl_add_box
(
FL_BORDER_BOX
,
0
,
0
,
800
,
900
,
""
);
fl_set_object_color
(
obj
,
FL_BLACK
,
FL_BLACK
);
// Received signal
fdui
->
graph
[
0
]
=
nrUEcommonGraph
(
ueTimeResponse
,
FL_IMPULSE_XYPLOT
,
20
,
20
,
370
,
100
,
"Received Signal (Time-Domain, dB)"
,
FL_RED
);
// Time-domain channel response
fdui
->
graph
[
1
]
=
nrUEcommonGraph
(
ueChannelResponse
,
FL_NORMAL_XYPLOT
,
410
,
20
,
370
,
100
,
"Channel Impulse Response (samples, abs)"
,
FL_RED
);
// Frequency-domain channel response
fdui
->
graph
[
2
]
=
nrUEcommonGraph
(
uePbchFrequencyResp
,
FL_IMPULSE_XYPLOT
,
20
,
140
,
760
,
100
,
"Channel Frequency data (RE, dB)"
,
FL_RED
);
// LLR of PBCH
fdui
->
graph
[
3
]
=
nrUEcommonGraph
(
uePbchLLR
,
FL_POINTS_XYPLOT
,
20
,
260
,
500
,
100
,
"PBCH Log-Likelihood Ratios (LLR, mag)"
,
FL_GREEN
);
fl_set_xyplot_xgrid
(
fdui
->
graph
[
3
].
graph
,
FL_GRID_MAJOR
);
// I/Q PBCH comp
fdui
->
graph
[
4
]
=
nrUEcommonGraph
(
uePbchIQ
,
FL_POINTS_XYPLOT
,
540
,
260
,
240
,
100
,
"PBCH I/Q of MF Output"
,
FL_GREEN
);
// LLR of PDCCH
fdui
->
graph
[
5
]
=
nrUEcommonGraph
(
uePcchLLR
,
FL_POINTS_XYPLOT
,
20
,
380
,
500
,
100
,
"PDCCH Log-Likelihood Ratios (LLR, mag)"
,
FL_CYAN
);
// I/Q PDCCH comp
fdui
->
graph
[
6
]
=
nrUEcommonGraph
(
uePcchIQ
,
FL_POINTS_XYPLOT
,
540
,
380
,
240
,
100
,
"PDCCH I/Q of MF Output"
,
FL_CYAN
);
// LLR of PDSCH
fdui
->
graph
[
7
]
=
nrUEcommonGraph
(
uePdschLLR
,
FL_POINTS_XYPLOT
,
20
,
500
,
500
,
200
,
"PDSCH Log-Likelihood Ratios (LLR, mag)"
,
FL_YELLOW
);
// I/Q PDSCH comp
fdui
->
graph
[
8
]
=
nrUEcommonGraph
(
uePdschIQ
,
FL_POINTS_XYPLOT
,
540
,
500
,
240
,
200
,
"PDSCH I/Q of MF Output"
,
FL_YELLOW
);
// Throughput on PDSCH
fdui
->
graph
[
9
]
=
nrUEcommonGraph
(
uePdschThroughput
,
FL_NORMAL_XYPLOT
,
20
,
720
,
500
,
100
,
"PDSCH Throughput [frame]/[kbit/s]"
,
FL_WHITE
);
fdui
->
graph
[
10
].
graph
=
NULL
;
// Generic UE Button
fdui
->
button_0
=
fl_add_button
(
FL_PUSH_BUTTON
,
540
,
720
,
240
,
40
,
""
);
fl_set_object_lalign
(
fdui
->
button_0
,
FL_ALIGN_CENTER
);
//openair_daq_vars.use_ia_receiver = 0;
fl_set_button
(
fdui
->
button_0
,
0
);
fl_set_object_label
(
fdui
->
button_0
,
"IA Receiver OFF"
);
fl_set_object_color
(
fdui
->
button_0
,
FL_RED
,
FL_RED
);
fl_set_object_callback
(
fdui
->
button_0
,
ia_receiver_on_off
,
0
);
fl_hide_object
(
fdui
->
button_0
);
fl_end_form
(
);
fdui
->
phy_scope
->
fdui
=
fdui
;
char
buf
[
100
];
sprintf
(
buf
,
"NR DL SCOPE UE %d"
,
ID
);
fl_show_form
(
fdui
->
phy_scope
,
FL_PLACE_HOTSPOT
,
FL_FULLBORDER
,
buf
);
return
fdui
;
}
typedef
struct
{
FL_FORM
*
stats_form
;
void
*
vdata
;
char
*
cdata
;
long
ldata
;
FL_OBJECT
*
stats_text
;
FL_OBJECT
*
stats_button
;
}
FD_stats_form
;
void
phy_scope_nrUE
(
FD_phy_scope_t
*
form
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
static
FD_phy_scope_t
*
remeberForm
=
NULL
;
if
(
form
==
NULL
)
form
=
remeberForm
;
else
remeberForm
=
form
;
if
(
form
==
NULL
)
return
;
int
i
=
0
;
while
(
form
->
graph
[
i
].
graph
)
{
form
->
graph
[
i
].
nrUEfunct
(
form
->
graph
[
i
].
graph
,
phy_vars_ue
,
eNB_id
,
UE_id
);
i
++
;
}
fl_check_forms
();
}
// current status is that every UE has a DL scope for a SINGLE eNB (gnb_id=0)
// at eNB 0, an UL scope for every UE
FD_phy_scope_gnb
*
form_gnb
[
NUMBER_OF_UE_MAX
];
//FD_stats_form *form_stats=NULL,*form_stats_l2=NULL;
//char title[255];
unsigned
char
scope_enb_num_ue
=
1
;
//static pthread_t forms_thread; //xforms
void
reset_stats_gNB
(
FL_OBJECT
*
button
,
long
arg
)
{
static
void
reset_stats_gNB
(
FL_OBJECT
*
button
,
long
arg
)
{
int
i
,
k
;
//PHY_VARS_gNB *phy_vars_gNB = RC.gNB[0][0];
for
(
i
=
0
;
i
<
NUMBER_OF_UE_MAX
;
i
++
)
{
for
(
k
=
0
;
k
<
8
;
k
++
)
{
//harq_processes
/* for (j=0; j<phy_vars_gNB->dlsch[i][0]->Mlimit; j++) {
phy_vars_gNB->UE_stats[i].dlsch_NAK[k][j]=0;
phy_vars_gNB->UE_stats[i].dlsch_ACK[k][j]=0;
phy_vars_gNB->UE_stats[i].dlsch_trials[k][j]=0;
}
phy_vars_gNB->UE_stats[i].dlsch_l2_errors[k]=0;
phy_vars_gNB->UE_stats[i].ulsch_errors[k]=0;
phy_vars_gNB->UE_stats[i].ulsch_consecutive_errors=0;
phy_vars_gNB->UE_stats[i].dlsch_sliding_cnt=0;
phy_vars_gNB->UE_stats[i].dlsch_NAK_round0=0;
phy_vars_gNB->UE_stats[i].dlsch_mcs_offset=0;*/
}
}
}
static
void
*
scope_thread_gNB
(
void
*
arg
)
{
scopeParms_t
*
p
=
(
scopeParms_t
*
)
arg
;
//# ifdef ENABLE_XFORMS_WRITE_STATS
// FILE *gNB_stats = fopen("gNB_stats.txt", "w");
//#endif
while
(
!
oai_exit
)
{
int
ue_cnt
=
0
;
for
(
int
UE_id
=
0
;
UE_id
<
NUMBER_OF_UE_MAX
;
UE_id
++
)
{
if
((
ue_cnt
<
scope_enb_num_ue
))
{
//this function needs to be written
phy_scope_gNB
(
form_gnb
[
ue_cnt
],
p
->
gNB
,
p
->
ru
,
UE_id
);
ue_cnt
++
;
phy_vars_gNB->UE_stats[i].dlsch_NAK[k][j]=0;
phy_vars_gNB->UE_stats[i].dlsch_ACK[k][j]=0;
phy_vars_gNB->UE_stats[i].dlsch_trials[k][j]=0;
}
phy_vars_gNB->UE_stats[i].dlsch_l2_errors[k]=0;
phy_vars_gNB->UE_stats[i].ulsch_errors[k]=0;
phy_vars_gNB->UE_stats[i].ulsch_consecutive_errors=0;
phy_vars_gNB->UE_stats[i].dlsch_sliding_cnt=0;
phy_vars_gNB->UE_stats[i].dlsch_NAK_round0=0;
phy_vars_gNB->UE_stats[i].dlsch_mcs_offset=0;*/
}
sleep
(
1
);
}
// printf("%s",stats_buffer);
/*#ifdef ENABLE_XFORMS_WRITE_STATS
if (eNB_stats) {
rewind (gNB_stats);
fwrite (stats_buffer, 1, len, gNB_stats);
fclose (gNB_stats);
}
#endif
pthread_exit((void *)arg);
}*/
return
NULL
;
}
FD_stats_form
*
create_form_stats_form
(
void
)
{
static
FD_stats_form
*
create_form_stats_form
(
int
ID
)
{
FL_OBJECT
*
obj
;
FD_stats_form
*
fdui
=
fl_malloc
(
sizeof
*
fdui
);
fdui
->
vdata
=
fdui
->
cdata
=
NULL
;
...
...
@@ -941,23 +908,32 @@ FD_stats_form * create_form_stats_form( void ) {
return
fdui
;
}
void
startScope
(
scopeParms_t
*
p
)
{
//FD_stats_form *form_stats=NULL,*form_stats_l2=NULL;
char
title
[
255
];
fl_initialize
(
p
->
argc
,
p
->
argv
,
NULL
,
0
,
0
);
/*
form_stats_l2 = create_form_stats_form();
fl_show_form (form_stats_l2->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "l2 stats");
form_stats = create_form_stats_form();
fl_show_form (form_stats->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "stats");
*/
for
(
int
UE_id
=
0
;
UE_id
<
scope_enb_num_ue
;
UE_id
++
)
{
form_gnb
[
UE_id
]
=
create_phy_scope_gnb
();
sprintf
(
title
,
"LTE UL SCOPE eNB for UE %d"
,
UE_id
);
fl_show_form
(
form_gnb
[
UE_id
]
->
phy_scope_gnb
,
FL_PLACE_HOTSPOT
,
FL_FULLBORDER
,
title
);
}
// UE_id
static
FD_phy_scope_t
*
form_nrue
[
NUMBER_OF_UE_MAX
];
static
pthread_t
forms_thread
;
pthread_t
forms_thread
;
threadCreate
(
&
forms_thread
,
scope_thread_gNB
,
p
,
"scope"
,
-
1
,
OAI_PRIORITY_RT_LOW
);
static
void
*
scope_thread
(
void
*
arg
)
{
PHY_VARS_NR_UE
*
ue
=
(
PHY_VARS_NR_UE
*
)
arg
;
while
(
!
oai_exit
)
{
phy_scope_nrUE
(
form_nrue
[
0
],
ue
,
0
,
0
);
sleep
(
100
*
1000
);
}
pthread_exit
((
void
*
)
arg
);
}
void
init_scope
(
PHY_VARS_NR_UE
*
ue
)
{
int
fl_argc
=
1
;
char
*
name
=
"5G-UE-scope"
;
fl_initialize
(
&
fl_argc
,
&
name
,
NULL
,
0
,
0
);
form_nrue
[
0
]
=
create_phy_scope_nrue
(
0
);
threadCreate
(
&
forms_thread
,
scope_thread
,
ue
,
"scope"
,
-
1
,
OAI_PRIORITY_RT_LOW
);
}
openair1/PHY/TOOLS/nr_phy_scope.h
View file @
a9ba117a
...
...
@@ -35,37 +35,6 @@
//#include "PHY/impl_defs_top.h"
#include "PHY/defs_nr_UE.h"
/* Forms and Objects */
typedef
struct
{
FL_FORM
*
phy_scope_gnb
;
FL_OBJECT
*
rxsig_t
;
FL_OBJECT
*
chest_f
;
FL_OBJECT
*
chest_t
;
FL_OBJECT
*
pusch_comp
;
FL_OBJECT
*
pucch_comp
;
FL_OBJECT
*
pucch_comp1
;
FL_OBJECT
*
pusch_llr
;
FL_OBJECT
*
pusch_tput
;
FL_OBJECT
*
button_0
;
}
FD_phy_scope_gnb
;
typedef
struct
{
FL_FORM
*
phy_scope_nrue
;
FL_OBJECT
*
rxsig_t
;
FL_OBJECT
*
chest_f
;
FL_OBJECT
*
chest_t
;
FL_OBJECT
*
pbch_comp
;
FL_OBJECT
*
pbch_llr
;
FL_OBJECT
*
pdcch_comp
;
FL_OBJECT
*
pdcch_llr
;
FL_OBJECT
*
pdsch_comp
;
FL_OBJECT
*
pdsch_llr
;
FL_OBJECT
*
pdsch_comp1
;
FL_OBJECT
*
pdsch_llr1
;
FL_OBJECT
*
pdsch_tput
;
FL_OBJECT
*
button_0
;
}
FD_phy_scope_nrue
;
typedef
struct
{
int
*
argc
;
char
**
argv
;
...
...
@@ -73,17 +42,8 @@ typedef struct {
PHY_VARS_gNB
*
gNB
;
}
scopeParms_t
;
extern
unsigned
char
scope_enb_num_ue
;
FD_phy_scope_nrue
*
create_phy_scope_nrue
(
void
);
void
phy_scope_nrUE
(
FD_phy_scope_nrue
*
form
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
,
uint8_t
subframe
);
void
startScope
(
scopeParms_t
*
p
);
void
init_scope
(
PHY_VARS_NR_UE
*
ue
);
extern
RAN_CONTEXT_t
RC
;
#endif
openair2/ENB_APP/flexran_agent_extern.h
View file @
a9ba117a
...
...
@@ -41,11 +41,9 @@
AGENT_PHY_xface
*
flexran_agent_get_phy_xface
(
mid_t
mod_id
);
/* Control module interface for the communication of the MAC Control Module with the agent */
//AGENT_MAC_xface *flexran_agent_get_mac_xface(mid_t mod_id);
extern
AGENT_MAC_xface
*
agent_mac_xface
[
NUM_MAX_ENB
];
#define flexran_agent_get_mac_xface(mod_id) (agent_mac_xface[mod_id])
/* Control module interface for the communication of the RRC Control Module with the agent */
// AGENT_RRC_xface *flexran_agent_get_rrc_xface(mid_t mod_id);
extern
AGENT_RRC_xface
*
agent_rrc_xface
[
NUM_MAX_ENB
];
...
...
openair2/GNB_APP/gnb_app.c
View file @
a9ba117a
...
...
@@ -131,7 +131,6 @@ void *gNB_app_task(void *args_p)
uint32_t
gnb_nb
=
RC
.
nb_nr_inst
;
uint32_t
gnb_id_start
=
0
;
uint32_t
gnb_id_end
=
gnb_id_start
+
gnb_nb
;
uint32_t
x2_register_gnb_pending
=
0
;
uint32_t
gnb_id
;
MessageDef
*
msg_p
=
NULL
;
const
char
*
msg_name
=
NULL
;
...
...
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
View file @
a9ba117a
...
...
@@ -2670,7 +2670,6 @@ void nr_ue_send_sdu(module_id_t module_idP,
LOG_D
(
MAC
,
"Handling PDU frame %d slot %d
\n
"
,
frameP
,
slotP
);
uint8_t
*
pduP
=
pdu
;
NR_UE_MAC_INST_t
*
UE_mac_inst
=
get_mac_inst
(
module_idP
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU
,
VCD_FUNCTION_IN
);
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
View file @
a9ba117a
...
...
@@ -375,7 +375,6 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
int
CC_id
,
UE_id
=
0
;
gNB_MAC_INST
*
gNB
=
RC
.
nrmac
[
module_idP
];
NR_UE_list_t
*
UE_list
=
&
gNB
->
UE_list
;
NR_UE_sched_ctrl_t
*
ue_sched_ctl
=
&
UE_list
->
UE_sched_ctrl
[
UE_id
];
NR_COMMON_channels_t
*
cc
=
gNB
->
common_channels
;
NR_sched_pucch
*
pucch_sched
=
(
NR_sched_pucch
*
)
malloc
(
sizeof
(
NR_sched_pucch
));
...
...
@@ -424,6 +423,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
// TbD once RACH is available, start ta_timer when UE is connected
#if 0
NR_UE_sched_ctrl_t *ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id];
if (ue_sched_ctl->ta_timer) ue_sched_ctl->ta_timer--;
if (ue_sched_ctl->ta_timer == 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