Merge remote-tracking branch 'origin/develop' into develop-new-LMSSDR
Conflicts: targets/RT/USER/lte-softmodem.c
This commit is contained in:
+2
-1
@@ -34,4 +34,5 @@ job1:
|
||||
- sshpass -p "$OAI_PASS" rsync -az -e "ssh -o StrictHostKeyChecking=no " --rsync-path="mkdir -p $NFS_TEST_RESULTS_DIR && rsync" $OPENAIR_DIR/cmake_targets/autotests/log $OAI_USER@localhost:$NFS_TEST_RESULTS_DIR
|
||||
- sshpass -p "$OAI_PASS" rsync -az -e "ssh -o StrictHostKeyChecking=no " --rsync-path="mkdir -p $EXTERNAL_SHARE_DIR && rsync" $OPENAIR_DIR/cmake_targets/autotests/log $OAI_USER@localhost:$EXTERNAL_SHARE_DIR
|
||||
- cat $OPENAIR_DIR/cmake_targets/autotests/log/results_autotests.xml
|
||||
when: manual
|
||||
only:
|
||||
- triggers
|
||||
|
||||
@@ -38,3 +38,4 @@ v0.2 -> Merge of enhancement-10-harmony to include NGFI RRH + New Interface for
|
||||
v0.3 -> Last stable commit on develop branch before the merge of feature-131-new-license. This is the last commit with GPL License
|
||||
v0.4 -> Merge of feature-131-new-license. It closes issue#131 and changes the license to OAI Public License V1.0
|
||||
v0.5 -> Merge of enhancement-10-harmony-lts. It includes fixes for Ubuntu 16.04 support
|
||||
v0.5.1 -> Merge of bugfix-137-uplink-fixes. It includes stablity fixes for eNB
|
||||
|
||||
+149
-12
@@ -114,6 +114,7 @@ endmacro(add_list_string_option)
|
||||
####################################################
|
||||
# compilation flags
|
||||
#############################################
|
||||
#set(CMAKE_BUILD_TYPE "Debug")
|
||||
if (CMAKE_BUILD_TYPE STREQUAL "")
|
||||
set(CMAKE_BUILD_TYPE "RelWithDebInfo")
|
||||
endif()
|
||||
@@ -230,6 +231,7 @@ add_boolean_option(DEBUG_OMG False "???")
|
||||
add_boolean_option(XFORMS False "This adds the possibility to see the signal oscilloscope")
|
||||
add_boolean_option(PRINT_STATS False "This adds the possibility to see the status")
|
||||
add_boolean_option(T_TRACER False "Activate the T tracer, a debugging/monitoring framework" )
|
||||
add_boolean_option(UE_AUTOTEST_TRACE False "Activate UE autotest specific logs")
|
||||
|
||||
add_boolean_option(DEBUG_CONSOLE False "makes debugging easier, disables stdout/stderr buffering")
|
||||
|
||||
@@ -470,7 +472,7 @@ include_directories ("${X2AP_DIR}")
|
||||
# Hardware dependant options
|
||||
###################################
|
||||
add_list1_option(NB_ANTENNAS_RX "2" "Number of antennas in reception" "1" "2" "4")
|
||||
add_list1_option(NB_ANTENNAS_TX "2" "Number of antennas in transmission" "1" "2" "4")
|
||||
add_list1_option(NB_ANTENNAS_TX "4" "Number of antennas in transmission" "1" "2" "4")
|
||||
add_list1_option(NB_ANTENNAS_TXRX "2" "Number of antennas in ????" "1" "2" "4")
|
||||
|
||||
add_list2_option(RF_BOARD "EXMIMO" "RF head type" "None" "EXMIMO" "OAI_USRP" "OAI_BLADERF" "CPRIGW" "OAI_LMSSDR")
|
||||
@@ -612,7 +614,7 @@ add_boolean_option(MESSAGE_CHART_GENERATOR False "For generating sequenc
|
||||
add_boolean_option(MESSAGE_CHART_GENERATOR_RLC_MAC False "trace RLC-MAC exchanges in sequence diagrams")
|
||||
add_boolean_option(MESSAGE_CHART_GENERATOR_PHY False "trace some PHY exchanges in sequence diagrams")
|
||||
|
||||
add_boolean_option(ENB_AGENT True "enable eNB agent to inteface with a SDN contrller")
|
||||
add_boolean_option(FLEXRAN_AGENT_SB_IF False "enable FlexRAN agent to inteface with a SDN controller")
|
||||
|
||||
########################
|
||||
# Include order
|
||||
@@ -808,8 +810,10 @@ include_directories("${OPENAIR_DIR}/targets/ARCH/COMMON")
|
||||
include_directories("${OPENAIR_DIR}/targets/ARCH/EXMIMO/USERSPACE/LIB/")
|
||||
include_directories("${OPENAIR_DIR}/targets/ARCH/EXMIMO/DEFS")
|
||||
include_directories("${OPENAIR2_DIR}/ENB_APP")
|
||||
include_directories("${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/MAC")
|
||||
include_directories("${OPENAIR2_DIR}/UTIL/OSA")
|
||||
include_directories("${OPENAIR2_DIR}/UTIL/LFDS/liblfds6.1.1/liblfds611/inc")
|
||||
include_directories("${OPENAIR2_DIR}/UTIL/LFDS/liblfds7.0.0/liblfds700/inc")
|
||||
include_directories("${OPENAIR2_DIR}/UTIL/MEM")
|
||||
include_directories("${OPENAIR2_DIR}/UTIL/LISTS")
|
||||
include_directories("${OPENAIR2_DIR}/UTIL/FIFO")
|
||||
@@ -828,6 +832,94 @@ include_directories("${OPENAIR_DIR}")
|
||||
|
||||
# Utilities Library
|
||||
################
|
||||
if (FLEXRAN_AGENT_SB_IF)
|
||||
# set the version of protobuf messages, V3 not supported yet
|
||||
add_list1_option(FLPT_VERSION V2 "FLPT MSG protobuf grammar version" V2 V3)
|
||||
|
||||
if (${FLPT_VERSION} STREQUAL "V2")
|
||||
set (FLPTDIR V2)
|
||||
elseif (${FLPT_VERSION} STREQUAL "V3")
|
||||
set (FLPTDIR V3)
|
||||
endif(${FLPT_VERSION} STREQUAL "V2")
|
||||
|
||||
set(FLPT_MSG_DIR ${OPENAIR2_DIR}/ENB_APP/MESSAGES/${FLPTDIR} )
|
||||
set(FLPT_MSG_FILES
|
||||
${FLPT_MSG_DIR}/header.proto
|
||||
${FLPT_MSG_DIR}/flexran.proto
|
||||
${FLPT_MSG_DIR}/stats_common.proto
|
||||
${FLPT_MSG_DIR}/stats_messages.proto
|
||||
${FLPT_MSG_DIR}/time_common.proto
|
||||
${FLPT_MSG_DIR}/controller_commands.proto
|
||||
${FLPT_MSG_DIR}/mac_primitives.proto
|
||||
${FLPT_MSG_DIR}/config_messages.proto
|
||||
${FLPT_MSG_DIR}/config_common.proto
|
||||
${FLPT_MSG_DIR}/control_delegation.proto
|
||||
)
|
||||
|
||||
set(FLPT_C_DIR ${protobuf_generated_dir}/${FLPTDIR})
|
||||
#message("calling protoc_call=${protoc_call} FLPT_C_DIR=${FLPT_C_DIR} FLPT_MSG_FILES=${FLPT_MSG_FILES}")
|
||||
execute_process(COMMAND ${protoc_call} ${FLPT_C_DIR} ${FLPT_MSG_DIR} ${FLPT_MSG_FILES})
|
||||
file(GLOB FLPT_source ${FLPT_C_DIR}/*.c)
|
||||
set(FLPT_OAI_generated
|
||||
${FLPT_C_DIR}/header.pb-c.c
|
||||
${FLPT_C_DIR}/flexran.pb-c.c
|
||||
${FLPT_C_DIR}/stats_common.pb-c.c
|
||||
${FLPT_C_DIR}/stats_messages.pb-c.c
|
||||
${FLPT_C_DIR}/time_common.pb-c.c
|
||||
${FLPT_C_DIR}/controller_commands.pb-c.c
|
||||
${FLPT_C_DIR}/mac_primitives.pb-c.c
|
||||
${FLPT_C_DIR}/config_messages.pb-c.c
|
||||
${FLPT_C_DIR}/config_common.pb-c.c
|
||||
${FLPT_C_DIR}/control_delegation.pb-c.c
|
||||
)
|
||||
|
||||
file(GLOB flpt_h ${FLPT_C_DIR}/*.h)
|
||||
set(flpt_h ${flpt_h} )
|
||||
|
||||
add_library(FLPT_MSG
|
||||
${FLPT_OAI_generated}
|
||||
${FLPT_source}
|
||||
)
|
||||
set(FLPT_MSG_LIB FLPT_MSG)
|
||||
#message("prpt c dir is : ${FLPT_C_DIR}")
|
||||
include_directories (${FLPT_C_DIR})
|
||||
|
||||
add_library(ASYNC_IF
|
||||
${OPENAIR2_DIR}/UTIL/ASYNC_IF/socket_link.c
|
||||
${OPENAIR2_DIR}/UTIL/ASYNC_IF/link_manager.c
|
||||
${OPENAIR2_DIR}/UTIL/ASYNC_IF/message_queue.c
|
||||
${OPENAIR2_DIR}/UTIL/ASYNC_IF/ringbuffer_queue.c
|
||||
)
|
||||
set(ASYNC_IF_LIB ASYNC_IF)
|
||||
include_directories(${OPENAIR2_DIR}/UTIL/ASYNC_IF)
|
||||
|
||||
add_library(FLEXRAN_AGENT
|
||||
${OPENAIR2_DIR}/ENB_APP/flexran_agent_handler.c
|
||||
${OPENAIR2_DIR}/ENB_APP/flexran_agent_common.c
|
||||
${OPENAIR2_DIR}/ENB_APP/flexran_agent_common_internal.c
|
||||
${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c
|
||||
${OPENAIR2_DIR}/ENB_APP/flexran_agent.c
|
||||
${OPENAIR2_DIR}/ENB_APP/flexran_agent_task_manager.c
|
||||
${OPENAIR2_DIR}/ENB_APP/flexran_agent_net_comm.c
|
||||
${OPENAIR2_DIR}/ENB_APP/flexran_agent_async.c
|
||||
${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.c
|
||||
)
|
||||
set(FLEXRAN_AGENT_LIB FLEXRAN_AGENT)
|
||||
#include_directories(${OPENAIR2_DIR}/ENB_APP)
|
||||
|
||||
set(PROTOBUF_LIB "protobuf-c")
|
||||
|
||||
FIND_PATH(LIBYAML_INCLUDE_DIR NAMES yaml.h)
|
||||
FIND_LIBRARY(LIBYAML_LIBRARIES NAMES yaml libyaml)
|
||||
|
||||
INCLUDE(FindPackageHandleStandardArgs)
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Yaml DEFAULT_MSG LIBYAML_LIBRARIES LIBYAML_INCLUDE_DIR)
|
||||
MARK_AS_ADVANCED(LIBYAML_INCLUDE_DIR LIBYAML_LIBRARIES)
|
||||
|
||||
#set(PROTOBUF_LIB "protobuf") #for Cpp
|
||||
endif()
|
||||
|
||||
|
||||
add_library(HASHTABLE
|
||||
${OPENAIR_DIR}/common/utils/hashtable/hashtable.c
|
||||
${OPENAIR_DIR}/common/utils/hashtable/obj_hashtable.c
|
||||
@@ -921,6 +1013,7 @@ set(SCHED_SRC
|
||||
${OPENAIR1_DIR}/SCHED/phy_mac_stub.c
|
||||
${OPENAIR1_DIR}/SCHED/pucch_pc.c
|
||||
${OPENAIR1_DIR}/SCHED/pusch_pc.c
|
||||
${OPENAIR1_DIR}/SCHED/srs_pc.c
|
||||
)
|
||||
add_library(SCHED_LIB ${SCHED_SRC})
|
||||
|
||||
@@ -969,11 +1062,14 @@ set(PHY_SRC
|
||||
${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_mbsfn.c
|
||||
${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_ul.c
|
||||
${OPENAIR1_DIR}/PHY/MODULATION/ul_7_5_kHz.c
|
||||
${OPENAIR1_DIR}/PHY/MODULATION/beamforming.c
|
||||
${OPENAIR1_DIR}/PHY/MODULATION/compute_bf_weights.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/freq_equalization.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_sync_time.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_sync_timefreq.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_adjust_sync.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_est_freq_offset.c
|
||||
@@ -1086,7 +1182,17 @@ set (MAC_SRC
|
||||
${MAC_DIR}/eNB_scheduler_RA.c
|
||||
${MAC_DIR}/pre_processor.c
|
||||
${MAC_DIR}/config.c
|
||||
)
|
||||
)
|
||||
|
||||
if (FLEXRAN_AGENT_SB_IF)
|
||||
|
||||
set (MAC_SRC ${MAC_SRC}
|
||||
${MAC_DIR}/flexran_agent_scheduler_dlsch_ue.c
|
||||
${MAC_DIR}/flexran_agent_scheduler_dataplane.c
|
||||
${MAC_DIR}/flexran_agent_scheduler_dlsch_ue_remote.c
|
||||
)
|
||||
|
||||
endif()
|
||||
|
||||
set (ENB_APP_SRC
|
||||
${OPENAIR2_DIR}/ENB_APP/enb_app.c
|
||||
@@ -1099,6 +1205,14 @@ add_library(L2
|
||||
${ENB_APP_SRC})
|
||||
# ${OPENAIR2_DIR}/RRC/L2_INTERFACE/openair_rrc_L2_interface.c)
|
||||
|
||||
if (FLEXRAN_AGENT_SB_IF)
|
||||
|
||||
#Test for adding a shared library
|
||||
add_library(default_sched SHARED ${MAC_DIR}/flexran_agent_scheduler_dlsch_ue.c)
|
||||
add_library(remote_sched SHARED ${MAC_DIR}/flexran_agent_scheduler_dlsch_ue_remote.c)
|
||||
|
||||
endif()
|
||||
|
||||
# L3 Libs
|
||||
##########################
|
||||
|
||||
@@ -1459,6 +1573,23 @@ add_library(LFDS
|
||||
${lfds}/lfds611_abstraction/lfds611_abstraction_malloc.c
|
||||
)
|
||||
|
||||
set(lfds7 ${OPENAIR2_DIR}/UTIL/LFDS/liblfds7.0.0/liblfds700/src/)
|
||||
file(GLOB lfds7_queue ${lfds7}/lfds700_queue/*.c)
|
||||
file(GLOB lfds7_ring ${lfds7}/lfds700_ringbuffer/*.c)
|
||||
file(GLOB lfds7_qbss ${lfds7}/lfds700_queue_bounded_singleconsumer_singleproducer/*.c)
|
||||
file(GLOB lfds7_stack ${lfds7}/lfds700_stack/*.c)
|
||||
file(GLOB lfds7_freelist ${lfds7}/lfds700_freelist/*.c)
|
||||
file(GLOB lfds7_btree ${lfds7}/lfds700_btree_addonly_unbalanced/*.c)
|
||||
file(GLOB lfds7_hash ${lfds7}/lfds700_hash_addonly/*.c)
|
||||
file(GLOB lfds7_ordered_list ${lfds7}/lfds700_list_addonly_ordered_singlylinked/*.c)
|
||||
file(GLOB lfds7_unordered_list ${lfds7}/lfds700_list_addonly_singlylinked_unordered/*.c)
|
||||
file(GLOB lfds7_misc ${lfds7}/lfds700_misc/*.c)
|
||||
|
||||
include_directories(${lfds7})
|
||||
add_library(LFDS7
|
||||
${lfds7_queue} ${lfds7_ring} ${lfds7_qbss} ${lfds7_stack} ${lfds7_freelist} ${lfds7_btree} ${lfds7_hash} ${lfds7_ordered_list} ${lfds7_unordered_list} ${lfds7_misc}
|
||||
)
|
||||
|
||||
# Simulation library
|
||||
##########################
|
||||
add_library(SIMU
|
||||
@@ -1635,11 +1766,11 @@ add_executable(lte-softmodem
|
||||
|
||||
target_link_libraries (lte-softmodem -ldl
|
||||
-Wl,--start-group
|
||||
RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${MIH_LIB}
|
||||
RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${MIH_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7
|
||||
-Wl,--end-group )
|
||||
|
||||
target_link_libraries (lte-softmodem ${LIBXML2_LIBRARIES})
|
||||
target_link_libraries (lte-softmodem pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} )
|
||||
target_link_libraries (lte-softmodem pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES})
|
||||
target_link_libraries (lte-softmodem ${LIB_LMS_LIBRARIES})
|
||||
target_link_libraries (lte-softmodem ${T_LIB})
|
||||
|
||||
@@ -1669,11 +1800,11 @@ add_executable(lte-softmodem-nos1
|
||||
)
|
||||
target_link_libraries (lte-softmodem-nos1
|
||||
-Wl,--start-group
|
||||
RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${ITTI_LIB} ${MIH_LIB}
|
||||
RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${ITTI_LIB} ${MIH_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7
|
||||
-Wl,--end-group )
|
||||
|
||||
target_link_libraries (lte-softmodem-nos1 ${LIBXML2_LIBRARIES})
|
||||
target_link_libraries (lte-softmodem-nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} )
|
||||
target_link_libraries (lte-softmodem-nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES})
|
||||
target_link_libraries (lte-softmodem-nos1 ${LIB_LMS_LIBRARIES})
|
||||
target_link_libraries (lte-softmodem-nos1 ${T_LIB})
|
||||
|
||||
@@ -1806,20 +1937,24 @@ add_executable(oaisim_nos1
|
||||
target_include_directories(oaisim_nos1 PUBLIC ${OPENAIR_TARGETS}/SIMU/USER)
|
||||
target_link_libraries (oaisim_nos1
|
||||
-Wl,--start-group
|
||||
RRC_LIB X2AP_LIB SECU_CN UTIL HASHTABLE SCHED_LIB PHY LFDS ${MSC_LIB} L2 ${RAL_LIB} SIMU SIMU_ETH SECU_OSA ${ITTI_LIB} ${MIH_LIB}
|
||||
RRC_LIB X2AP_LIB SECU_CN UTIL HASHTABLE SCHED_LIB PHY LFDS ${MSC_LIB} L2 ${RAL_LIB} SIMU SIMU_ETH SECU_OSA ${ITTI_LIB} ${MIH_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7
|
||||
-Wl,--end-group )
|
||||
|
||||
target_link_libraries (oaisim_nos1 ${LIBXML2_LIBRARIES} ${LAPACK_LIBRARIES})
|
||||
target_link_libraries (oaisim_nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${option_HW_lib} ${option_TP_lib}
|
||||
${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${OPENPGM_LIBRARIES})
|
||||
target_link_libraries (oaisim_nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${option_HW_lib} ${option_TP_lib}
|
||||
${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${OPENPGM_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES})
|
||||
#Force link with forms, regardless XFORMS option
|
||||
target_link_libraries (oaisim_nos1 forms)
|
||||
|
||||
#message("protobuflib is ${PROTOBUF_LIB}")
|
||||
|
||||
target_link_libraries (oaisim_nos1 ${T_LIB})
|
||||
|
||||
|
||||
# Unitary tests for each piece of L1: example, mbmssim is MBMS L1 simulator
|
||||
#####################################
|
||||
|
||||
foreach(myExe dlsim ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim syncsim)
|
||||
foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim syncsim)
|
||||
add_executable(${myExe}
|
||||
${OPENAIR_BIN_DIR}/messages_xml.h
|
||||
${OPENAIR1_DIR}/SIMULATION/LTE_PHY/${myExe}.c
|
||||
@@ -1827,7 +1962,8 @@ foreach(myExe dlsim ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim syn
|
||||
${T_SOURCE}
|
||||
)
|
||||
target_link_libraries (${myExe}
|
||||
-Wl,--start-group SIMU UTIL SCHED_LIB PHY LFDS ${ITTI_LIB} -Wl,--end-group
|
||||
|
||||
-Wl,--start-group SIMU UTIL SCHED_LIB PHY LFDS ${ITTI_LIB} LFDS7 -Wl,--end-group
|
||||
pthread m rt ${CONFIG_LIBRARIES} ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${T_LIB}
|
||||
)
|
||||
endforeach(myExe)
|
||||
@@ -1900,6 +2036,7 @@ if (${T_TRACER})
|
||||
add_dependencies(oaisim generate_T)
|
||||
add_dependencies(oaisim_nos1 generate_T)
|
||||
add_dependencies(dlsim generate_T)
|
||||
add_dependencies(dlsim_tm7 generate_T)
|
||||
add_dependencies(ulsim generate_T)
|
||||
add_dependencies(pbchsim generate_T)
|
||||
add_dependencies(scansim generate_T)
|
||||
|
||||
@@ -218,7 +218,7 @@ Obj.# Case# Test# Description
|
||||
01 70 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
|
||||
|
||||
|
||||
01 75 00 lte-softmodem + RRH tests with B210 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
|
||||
01 75 00 lte-softmodem + RRU (NGFI IF4P5, RAW) tests with B210 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
|
||||
01 75 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
01 75 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
01 75 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
@@ -226,7 +226,7 @@ Obj.# Case# Test# Description
|
||||
01 75 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
|
||||
01 75 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
|
||||
|
||||
01 80 00 lte-softmodem + RRH tests with BladeRF RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
|
||||
01 80 00 lte-softmodem + RRU (NGFI) tests with BladeRF RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
|
||||
01 80 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
01 80 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
01 80 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
@@ -234,7 +234,7 @@ Obj.# Case# Test# Description
|
||||
01 80 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
|
||||
01 80 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
|
||||
|
||||
01 85 00 lte-softmodem + RRH tests with USRP X310 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
|
||||
01 85 00 lte-softmodem + RRU (NGFI) tests with USRP X310 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
|
||||
01 85 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
01 85 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
01 85 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
@@ -268,6 +268,15 @@ Obj.# Case# Test# Description
|
||||
02 55 22 Band 7 FDD 10MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2)
|
||||
02 55 23 Band 7 FDD 20MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2)
|
||||
|
||||
02 57 lte-softmodem tests with USRP B210 RF as eNB and OAI EPC (eNB and EPC are on different machines) w/ OAI UE
|
||||
02 57 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
02 57 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
02 57 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
02 57 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX
|
||||
02 57 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
|
||||
02 57 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
|
||||
|
||||
|
||||
01 64 lte-softmodem-noS1 tests
|
||||
|
||||
02 Functional test case
|
||||
|
||||
@@ -75,7 +75,7 @@ class openair(core):
|
||||
return (stdout, stderr)
|
||||
|
||||
def connect(self, username, password, prompt='PEXPECT_OAI'):
|
||||
max_retries=100
|
||||
max_retries=10
|
||||
i=0
|
||||
while i <= max_retries:
|
||||
self.prompt1 = prompt
|
||||
@@ -97,9 +97,9 @@ class openair(core):
|
||||
# need to look for twice the string of the prompt
|
||||
self.oai.prompt()
|
||||
self.oai.prompt()
|
||||
self.oai.sendline('uptime')
|
||||
self.oai.prompt()
|
||||
print self.oai.before
|
||||
# self.oai.sendline('uptime')
|
||||
# self.oai.prompt()
|
||||
# print self.oai.before
|
||||
break
|
||||
except Exception, e:
|
||||
error=''
|
||||
@@ -171,7 +171,7 @@ class openair(core):
|
||||
sys.exit(1)
|
||||
|
||||
def disconnect(self):
|
||||
print 'disconnecting the ssh connection to ' + self.address + '\n'
|
||||
# print 'disconnecting the ssh connection to ' + self.address + '\n'
|
||||
self.oai.send('exit')
|
||||
# self.cancel()
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,87 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>OAI5G UE Autotest Report</title>
|
||||
<script type="text/javascript">
|
||||
function showhide(id) {
|
||||
var e = document.getElementById(id);
|
||||
e.style.display = (e.style.display == 'block') ? 'none' : 'block';
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<style>
|
||||
table, th, td {
|
||||
border: 1px solid black;
|
||||
border-collapse: collapse;
|
||||
padding: 5px;
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
<center>
|
||||
<h2>OAI5G UE Autotest Report</h2>
|
||||
</center>
|
||||
|
||||
<p>
|
||||
<table border>
|
||||
<caption>Test session configuration</caption>
|
||||
<tr><td>Start time</td><td>{{test_session_start_time}}</td></tr>
|
||||
<tr><td>Stop time</td><td>{{test_session_stop_time}}</td></tr>
|
||||
<tr><td>Duration</td><td>{{test_session_duration}}</td></tr>
|
||||
<tr><td>MTC host</td><td>{{mtc_host}}</td></tr>
|
||||
<tr><td>User</td><td>{{user}}</td></tr>
|
||||
<tr><td>Password</td><td>{{password}}</td></tr>
|
||||
</table>
|
||||
</p>
|
||||
|
||||
|
||||
<h3>Test Setup</h3>
|
||||
To be complete
|
||||
|
||||
<br></br>
|
||||
<h3>UE phy-test performances tests results</h3>
|
||||
<h4>Objectives</h4>
|
||||
<p>Checks that OAI UE can achieve at least 75 percent of the theoretical throughput.</p>
|
||||
<p>Tests are done for all MCS (0 to 28) for 5MHz and 10MHz bandwidth.</p>
|
||||
<h4>Results</h4>
|
||||
|
||||
<table>
|
||||
<TR><TH>ID</TH><TH>TAG</TH><TH>VERDICT</TH><TH>NB RUNS</TH><TH>PASS</TH><TH>FAILED</TH><TH>INCON</TH><TH>SKIPPED</TH><TH>SEG FAULT</TH><TH>TC Timeout</TH><TH>Start</TH><TH>Stop</TH><TH>Duration</TH><TH>Details</TH></TR>
|
||||
{% for result in test_results|sort(attribute='testcase_name') %}
|
||||
<TR>
|
||||
<TD >{{result.testcase_name}}</TD>
|
||||
<TD align="right">{{result.tags}}</TD>
|
||||
{% if result.testcase_verdict == "PASS" %}
|
||||
<TD align="center" style="background-color:green">{{result.testcase_verdict}}</TD>
|
||||
{% elif result.testcase_verdict == "FAIL" %}
|
||||
<TD align="center" style="background-color:red">{{result.testcase_verdict}}</TD>
|
||||
{% else %}
|
||||
<TD align="center" style="background-color:orange">{{result.testcase_verdict}}</TD>
|
||||
{% endif %}
|
||||
<TD align='center'>{{result.nruns}}</TD>
|
||||
<TD align='center'>{{result.nb_run_pass}}</TD>
|
||||
<TD align='center'>{{result.nb_run_failed}}</TD>
|
||||
<TD align='center'>{{result.nb_run_inc}}</TD>
|
||||
<TD align='center'>{{result.nb_run_skip}}</TD>
|
||||
<TD align='center'>{{result.nb_seg_fault}}</TD>
|
||||
<TD >{{result.testcase_timeout}}</TD>
|
||||
<TD >{{result.testcase_time_start.strftime('%Y-%m-%d %H:%M:%S')}}</TD>
|
||||
<TD >{{result.testcase_time_stop.strftime('%Y-%m-%d %H:%M:%S')}}</TD>
|
||||
<TD >{{result.testcase_duration}}</TD>
|
||||
<TD ><a href="{{ result.testcase_name }}/{{ result.testcase_name }}_report.html">{{ result.testcase_name }}_report.html</a></TD>
|
||||
</TR>
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
|
||||
<br></br>
|
||||
<h3>UE phy-test stability tests results</h3>
|
||||
<h4>Objectives</h4>
|
||||
<p>To be complete</p>
|
||||
<h4>Results</h4>
|
||||
To be complete
|
||||
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -0,0 +1,142 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>OAI5G UE test case report</title>
|
||||
<script type="text/javascript">
|
||||
function showhide(id) {
|
||||
var e = document.getElementById(id);
|
||||
e.style.display = (e.style.display == 'block') ? 'none' : 'block';
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<style>
|
||||
table, th, td {
|
||||
border: 1px solid black;
|
||||
border-collapse: collapse;
|
||||
padding: 5px;
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
<center>
|
||||
<h2>OAI5G UE test case report details</h2>
|
||||
</center>
|
||||
|
||||
<h3>Test Case description</h3>
|
||||
<p>
|
||||
<table border>
|
||||
|
||||
<tr><td>ID</td><td>{{testcase_name}}</td></tr>
|
||||
<tr><td>TAG</td><td>{{tags}}</td></tr>
|
||||
<tr><td>class</td><td>{{testcaseclass}}</td></tr>
|
||||
<tr><td>description</td><td></td></tr>
|
||||
<tr><td>timeout</td><td>{{testcase_timeout}}</td></tr>
|
||||
<tr><td>number of runs</td><td>{{nruns}}</td></tr>
|
||||
<tr><td>eNB machine</td><td>{{testcase_eNBMachine}}</td></tr>
|
||||
<tr><td>UE machine</td><td>{{testcase_UEMachine}}</td></tr>
|
||||
|
||||
</table>
|
||||
</p>
|
||||
|
||||
|
||||
<h3>Test Case execution</h3>
|
||||
<p>
|
||||
<table border>
|
||||
|
||||
<tr><td>testcase_time_start</td><td>{{testcase_time_start}}</td></tr>
|
||||
<tr><td>testcase_time_stop</td><td>{{testcase_time_stop}}</td></tr>
|
||||
<tr><td>testcase_duration</td><td>{{testcase_duration}}</td></tr>
|
||||
<tr><td>Nb runs</td><td>{{nruns}}</td></tr>
|
||||
<tr><td>Nb PASS</td><td>{{nb_run_pass}}</td></tr>
|
||||
<tr><td>Nb FAILED</td><td>{{nb_run_failed}}</td></tr>
|
||||
<tr><td>Nb INCONCLUSIVE</td><td>{{nb_run_inc}}</td></tr>
|
||||
<tr>
|
||||
<td>testcase_verdict</td>
|
||||
{% if testcase_verdict == "PASS" %}
|
||||
<TD align="center" style="background-color:green">{{testcase_verdict}}</TD>
|
||||
{% elif testcase_verdict == "FAIL" %}
|
||||
<TD align="center" style="background-color:red">{{testcase_verdict}}</TD>
|
||||
{% else %}
|
||||
<TD align="center" style="background-color:orange">{{testcase_verdict}}</TD>
|
||||
{% endif %}
|
||||
</tr>
|
||||
<tr><td>Nb Seg Fault</td><td>{{nb_seg_fault}}</td></tr>
|
||||
|
||||
</table>
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<h3>Test Case runs results</h3>
|
||||
|
||||
{% for run_results in runs_results|sort(attribute='run_id') %}
|
||||
<h4>RUN {{run_results.run_id}} </h4>
|
||||
<table border>
|
||||
<tr><td>run_start_time </td><td>{{run_results.run_start_time}}</td></tr>
|
||||
<tr><td>run_stop_time</td><td>{{run_results.run_stop_time}}</td></tr>
|
||||
<tr><td>run_duration</td><td>{{run_results.run_duration}}</td></tr>
|
||||
<tr>
|
||||
<td>run_verdict</td>
|
||||
{% if run_results.run_verdict == "PASS" %}
|
||||
<TD align="center" style="background-color:green">{{run_results.run_verdict}}</TD>
|
||||
{% elif run_results.run_verdict == "FAIL" %}
|
||||
<TD align="center" style="background-color:red">{{run_results.run_verdict}}</TD>
|
||||
{% else %}
|
||||
<TD align="center" style="background-color:orange">{{run_results.run_verdict}}</TD>
|
||||
{% endif %}
|
||||
</tr>
|
||||
<tr><td>Seg Fault Satus</td>
|
||||
{% if run_results.ue_seg_fault_status == "NO_SEG_FAULT" %}
|
||||
<TD align="center" style="background-color:green">{{run_results.ue_seg_fault_status}}</TD>
|
||||
{% elif run_results.ue_seg_fault_status == "SEG_FAULT" %}
|
||||
<TD align="center" style="background-color:red">{{run_results.ue_seg_fault_status}}</TD>
|
||||
{% else %}
|
||||
<TD align="center" style="background-color:orange">unknown</TD>
|
||||
{% endif %}
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
{% for run_metrics in run_results.runs_metrics %}
|
||||
<br></br>
|
||||
<table border>
|
||||
<tr><td>metric_id</td><td>{{run_metrics.metric_id}}</td></tr>
|
||||
<tr><td>Description</td><td>{{run_metrics.metric_desc}}</td></tr>
|
||||
<tr><td>Unit of measure</td><td>{{run_metrics.metric_uom}}</td></tr>
|
||||
<tr><td>metric_min</td><td>{{run_metrics.metric_min}}</td></tr>
|
||||
<tr><td>metric_max</td><td>{{run_metrics.metric_max}}</td></tr>
|
||||
<tr><td>metric_mean</td><td>{{run_metrics.metric_mean}}</td></tr>
|
||||
<tr><td>metric_median</td><td>{{run_metrics.metric_median}}</td></tr>
|
||||
<tr><td colspan="2"></td></tr>
|
||||
{% if run_metrics.pass_fail_stat is defined %}
|
||||
<tr><td>Pass/fail stat</td><td>{{run_metrics.pass_fail_stat}}</td></tr>
|
||||
{% endif %}
|
||||
{% if run_metrics.pass_fail_min_limit is defined %}
|
||||
<tr><td>Pass/fail min limit</td><td>{{run_metrics.pass_fail_min_limit}}</td></tr>
|
||||
{% endif %}
|
||||
{% if run_metrics.pass_fail_max_limit is defined %}
|
||||
<tr><td>Pass/fail max limit</td><td>{{run_metrics.pass_fail_max_limit}}</td></tr>
|
||||
{% endif %}
|
||||
<tr><td colspan="2"></td></tr>
|
||||
<tr><td>metric_fig</td><td><IMG src={{run_metrics.metric_fig}}></td></tr>
|
||||
</table>
|
||||
|
||||
{% endfor %}
|
||||
|
||||
{% if run_results.run_traffic.traffic_count != 0 %}
|
||||
<br></br>
|
||||
<table border>
|
||||
<TR><TH>Iperf metric</TH><TH>min</TH><TH>max</TH><TH>mean</TH><TH>median</TH><TR>
|
||||
<TR><td>Bandwidth </td><td>{{run_results.run_traffic.bw_min}}</td><td>{{run_results.run_traffic.bw_max}}</td><td>{{run_results.run_traffic.bw_mean}}</td><td>{{run_results.run_traffic.bw_median}}</td><TR>
|
||||
<TR><td>Jitter</td><td>{{run_results.run_traffic.jitter_min}}</td><td>{{run_results.run_traffic.jitter_max}}</td><td>{{run_results.run_traffic.jitter_mean}}</td><td>{{run_results.run_traffic.jitter_median}}</td><TR>
|
||||
<TR><td>Loss rate</td><td>{{run_results.run_traffic.rl_min}}</td><td>{{run_results.run_traffic.rl_max}}</td><td>{{run_results.run_traffic.rl_mean}}</td><td>{{run_results.run_traffic.rl_median}}</td><TR>
|
||||
<TR><td colspan="5"></td></TR>
|
||||
<TR><td>Iperf duration</td><td>{{run_results.run_traffic.iperf_duration}}</td><td></td><td>Pass/Fail criteria (min duration)</td><td>{{run_results.run_traffic.dur_pass_fail_crit}}</td><TR>
|
||||
<TR><td colspan="5"></td></TR>
|
||||
<tr><td>traffic_fig</td><td colspan="4"><IMG src={{run_results.run_traffic.traffic_fig}}></td></tr>
|
||||
</table>
|
||||
{% endif %}
|
||||
|
||||
{% endfor %}
|
||||
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+174
@@ -0,0 +1,174 @@
|
||||
#! /usr/bin/python
|
||||
#******************************************************************************
|
||||
#
|
||||
# \file autotest_analyser.py
|
||||
#
|
||||
# \par Informations
|
||||
# - \b Project : UED Autotest Framework
|
||||
# - \b Software :
|
||||
#
|
||||
# \date 16 september 2016
|
||||
#
|
||||
# \version 0.1
|
||||
#
|
||||
# \brief helper to test lib_autotest_analyser.py
|
||||
#
|
||||
# \author Benoit ROBERT (benoit.robert@syrtem.com)
|
||||
#
|
||||
# \par Statement of Ownership
|
||||
# COPYRIGHT (c) 2016 BY SYRTEM S.A.R.L
|
||||
# This software is furnished under license and may be used and copied
|
||||
# only in accordance with the terms of such license and with the inclusion
|
||||
# of the above COPYRIGHT notice. This SOFTWARE or any other copies thereof
|
||||
# may not be provided or otherwise made available to any other person.
|
||||
# No title to and ownership of the SOFTWARE is hereby transferred.
|
||||
#
|
||||
# The information in this SOFTWARE is subject to change without notice
|
||||
# and should not be constructed as a commitment by SYRTEM.
|
||||
# SYRTEM assumes no responsibility for the use or reliability of its
|
||||
# SOFTWARE on equipment or platform not explicitly validated by SYRTEM.
|
||||
#
|
||||
# *******************************************************************************
|
||||
|
||||
import os
|
||||
import getopt
|
||||
import sys
|
||||
from subprocess import call
|
||||
|
||||
import encoder
|
||||
|
||||
sys.path.append(os.path.expandvars('$OPENAIR_DIR/cmake_targets/autotests/tools/'))
|
||||
|
||||
|
||||
#test_cases = ('030001', '030901', '031001', '031601', '031701', '031801', '031901', '032001', '032101', '032201', '032301', '032501', '032601', '032801')
|
||||
test_cases = ('032800' , '032730' )
|
||||
|
||||
nb_run = 2
|
||||
|
||||
def error_opt(msg):
|
||||
print("Option error: " + msg)
|
||||
|
||||
|
||||
def main(args):
|
||||
try:
|
||||
analyser = __import__("lib_autotest_analyser")
|
||||
except ImportError as err:
|
||||
print('Import error: ' + str(err))
|
||||
exit(0)
|
||||
|
||||
|
||||
log_path = 'log_save_2016-08-14/log/'
|
||||
|
||||
|
||||
|
||||
# metric = {}
|
||||
# metric['id'] = 'UE_DLSCH_BITRATE'
|
||||
# metric['description'] = 'UE downlink physical throughput'
|
||||
# metric['regex'] = '(UE_DLSCH_BITRATE) =\s+(\d+\.\d+) kbps.+frame = (\d+)\)'
|
||||
# metric['unit_of_meas'] = 'kbps'
|
||||
# metric['min_limit'] = 14668.8
|
||||
|
||||
|
||||
#AUTOTEST Metric : RRC Measurments RSRP[0]=-97.60 dBm/RE, RSSI=-72.83 dBm, RSRQ[0] 9.03 dB, N0 -125 dBm/RE, NF 7.2 dB (frame = 4490)
|
||||
|
||||
metric = {}
|
||||
metric['id'] = 'UE_DL_RRC_MEAS'
|
||||
metric['description'] = 'UE downlink RRC Measurments'
|
||||
metric['nb_metric'] = 5
|
||||
# metric['regex'] = 'AUTOTEST Metric : RRC Measurments (RSRP\[0\])=(-?\d+\.?\d*)\s+(.+),\s+(RSRQ\[0\])=(-?\d+\.?\d*)\s+(.+),,\s+(N0)=(-?\d+\.?\d*)\s+(.+),,\s+(NF)=(-?\d+\.?\d*)\s+(.+)\s+\(frame = (\d+)\) '
|
||||
metric['regex'] = 'AUTOTEST Metric : RRC Measurments (RSRP\[0\])=(-?\d+\.?\d*)\s+(.+)\,\s+(RSSI)=(-?\d+\.?\d*)\s+(.+)\,\s+(RSRQ\[0\])=(-?\d+\.?\d*)\s+(.+)\,\s+(N0)=(-?\d+\.?\d*)\s+(.+)\,\s+(NF)=(-?\d+\.?\d*)\s+(.+)\s+\(frame = (\d+)\)'
|
||||
metric['unit_of_meas'] = 'kbps'
|
||||
metric['min_limit'] = 14668.8
|
||||
|
||||
|
||||
|
||||
#report_path = log_path+'/report/'
|
||||
|
||||
#os.system(' mkdir -p ' + report_path)
|
||||
|
||||
#analyser.create_report_html(report_path)
|
||||
|
||||
#return(0)
|
||||
|
||||
test_results = []
|
||||
|
||||
for test_case in test_cases:
|
||||
|
||||
for i in range(0, nb_run):
|
||||
fname = '..//log//'+test_case+'/run_'+str(i)+'/UE_exec_'+str(i)+'_.log'
|
||||
args = {'metric' : metric,
|
||||
'file' : fname }
|
||||
|
||||
# cell_synch_status = analyser.check_cell_synchro(fname)
|
||||
# if cell_synch_status == 'CELL_SYNCH':
|
||||
# print '!!!!!!!!!!!!!! Cell synchronized !!!!!!!!!!!'
|
||||
# metric_checks_flag = 0
|
||||
# else :
|
||||
# print '!!!!!!!!!!!!!! Cell NOT NOT synchronized !!!!!!!!!!!'
|
||||
|
||||
# metrics_extracted = analyser.do_extract_metrics_new(args)
|
||||
|
||||
|
||||
# de-xmlfy test report
|
||||
xml_file = '..//log//'+test_case+'/test.'+test_case+'_ng.xml'
|
||||
print xml_file
|
||||
|
||||
# test_result =
|
||||
|
||||
|
||||
# test_results.append(test_result)
|
||||
|
||||
# xmlFile = logdir_local_testcase + '/test.' + testcasename + '.xml'
|
||||
# xml="\n<testcase classname=\'"+ testcaseclass + "\' name=\'" + testcasename + "."+tags + "\' Run_result=\'" + test_result_string + "\' time=\'" + str(duration) + " s \' RESULT=\'" + testcase_verdict + "\'></testcase> \n"
|
||||
# write_file(xmlFile, xml, mode="w")
|
||||
|
||||
# xmlFile_ng = logdir_local_testcase + '/test.' + testcasename + '_ng.xml'
|
||||
# xml_ng = xmlify(test_result, wrap=testcasename, indent=" ")
|
||||
# write_file(xmlFile_ng, xml_ng, mode="w")
|
||||
|
||||
|
||||
|
||||
|
||||
# print "min = "+ str( metric_extracted['metric_min'] )
|
||||
# print "min_index = "+ str( metric_extracted['metric_min_index'] )
|
||||
# print "max = "+ str( metric_extracted['metric_max'] )
|
||||
# print "max_index = "+ str( metric_extracted['metric_max_index'] )
|
||||
# print "mean = "+ str( metric_extracted['metric_mean'] )
|
||||
# print "median = "+ str( metric_extracted['metric_median'] )
|
||||
|
||||
# verdict = analyser.do_check_verdict(metric, metric_extracted)
|
||||
# print verdict
|
||||
|
||||
# fname= 'report/2016-9-8_toto/'+test_case+'/UE_metric_UE_DLSCH_BITRATE_'+str(i)+'_.png'
|
||||
# fname= 'report/UE_metric_UE_DLSCH_BITRATE_'+test_case+'_'+str(i)+'.png'
|
||||
|
||||
# print fname
|
||||
# analyser.do_img_metrics(metric, metric_extracted, fname)
|
||||
|
||||
# fname = 'log//'+test_case+'/run_'+str(i)+'/UE_traffic_'+str(i)+'_.log'
|
||||
|
||||
# args = {'file' : fname }
|
||||
|
||||
# traffic_metrics = analyser.do_extract_traffic_metrics(args)
|
||||
|
||||
# fname= 'report/iperf_'+test_case+'_'+str(i)+'.png'
|
||||
|
||||
# print fname
|
||||
# analyser.do_img_traffic(traffic_metrics, fname)
|
||||
|
||||
|
||||
for test_result in test_results:
|
||||
cmd = 'mkdir -p ' + report_dir + '/'+ test_result['testcase_name']
|
||||
result = os.system(cmd)
|
||||
|
||||
report_file = report_dir + '/'+ test_result['testcase_name'] + '/'+ test_result['testcase_name']+ '_report.html'
|
||||
|
||||
analyser.create_test_report_detailed_html(test_result, report_file )
|
||||
|
||||
print test_result
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv)
|
||||
|
||||
@@ -0,0 +1,544 @@
|
||||
#******************************************************************************
|
||||
#
|
||||
# \file lib_autotest_analyser.py
|
||||
#
|
||||
# \par Informations
|
||||
# - \b Project : UED Autotest Framework
|
||||
# - \b Software :
|
||||
#
|
||||
# \date 16 september 2016
|
||||
#
|
||||
# \version 0.1
|
||||
#
|
||||
# \brief library to extract metrics from autotest logs and assign a verdict
|
||||
#
|
||||
# \author Benoit ROBERT (benoit.robert@syrtem.com)
|
||||
#
|
||||
# \par Statement of Ownership
|
||||
# COPYRIGHT (c) 2016 BY SYRTEM S.A.R.L
|
||||
# This software is furnished under license and may be used and copied
|
||||
# only in accordance with the terms of such license and with the inclusion
|
||||
# of the above COPYRIGHT notice. This SOFTWARE or any other copies thereof
|
||||
# may not be provided or otherwise made available to any other person.
|
||||
# No title to and ownership of the SOFTWARE is hereby transferred.
|
||||
#
|
||||
# The information in this SOFTWARE is subject to change without notice
|
||||
# and should not be constructed as a commitment by SYRTEM.
|
||||
# SYRTEM assumes no responsibility for the use or reliability of its
|
||||
# SOFTWARE on equipment or platform not explicitly validated by SYRTEM.
|
||||
#
|
||||
# *******************************************************************************
|
||||
|
||||
|
||||
import re
|
||||
from pylab import *
|
||||
from matplotlib.font_manager import FontProperties
|
||||
|
||||
import os
|
||||
from jinja2 import Environment, FileSystemLoader
|
||||
|
||||
|
||||
PATH = os.path.dirname(os.path.abspath(__file__))
|
||||
TEMPLATE_ENVIRONMENT = Environment(
|
||||
autoescape=False,
|
||||
loader=FileSystemLoader(os.path.join(PATH, '../templates')),
|
||||
trim_blocks=False)
|
||||
|
||||
|
||||
def render_template(template_filename, context):
|
||||
return TEMPLATE_ENVIRONMENT.get_template(template_filename).render(context)
|
||||
|
||||
|
||||
|
||||
def init(args = None):
|
||||
return
|
||||
|
||||
|
||||
#
|
||||
#
|
||||
#
|
||||
def do_extract_metrics(args):
|
||||
|
||||
# print ""
|
||||
# print "do_extract_metrics ... "
|
||||
|
||||
fname = args['file']
|
||||
metric = args['metric']
|
||||
# print(fname)
|
||||
# print 'metric id = ' + metric['id']
|
||||
# print 'metric regex = ' + metric['regex']
|
||||
|
||||
count = 0
|
||||
mmin = 0
|
||||
mmin_index = 0
|
||||
mmax = 0
|
||||
mmax_index = 0
|
||||
mean = 0
|
||||
median = 0
|
||||
|
||||
|
||||
output = np.fromregex(fname,metric['regex'], [('id', 'S20'), ('metric', np.float), ('frame', np.int)] )
|
||||
# print 'T0T0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
|
||||
# print output
|
||||
count = output['metric'].size
|
||||
# print count
|
||||
if count > 0:
|
||||
mmin = np.amin(output['metric']);
|
||||
mmin_index = np.argmin(output['metric']);
|
||||
mmax = np.amax(output['metric']);
|
||||
mmax_index = np.argmax(output['metric']);
|
||||
mean = np.mean(output['metric']);
|
||||
median = np.median(output['metric']);
|
||||
|
||||
# print ( ( (metric['min_limit'] > output['metric']).sum() / float(output['metric'].size) ) * 100 )
|
||||
|
||||
ret = { 'metric_count' : count,
|
||||
'metric_buf' : output,
|
||||
'metric_min' : mmin,
|
||||
'metric_min_index' : mmin_index,
|
||||
'metric_max' : mmax,
|
||||
'metric_max_index' : mmax_index,
|
||||
'metric_mean' : mean,
|
||||
'metric_median' : median,
|
||||
}
|
||||
return(ret)
|
||||
|
||||
|
||||
def do_extract_metrics_new(args):
|
||||
|
||||
# print ""
|
||||
# print "do_extract_metrics ... "
|
||||
|
||||
fname = args['file']
|
||||
metric = args['metric']
|
||||
print(fname)
|
||||
print 'metric id = ' + metric['id']
|
||||
print 'metric regex = ' + metric['regex']
|
||||
|
||||
|
||||
|
||||
count = 0
|
||||
mmin = 0
|
||||
mmin_index = 0
|
||||
mmax = 0
|
||||
mmax_index = 0
|
||||
mean = 0
|
||||
median = 0
|
||||
|
||||
toto = [('id', 'S20'), ('metric', np.float), ('frame', np.int)]
|
||||
print toto
|
||||
|
||||
|
||||
np_format = []
|
||||
|
||||
for x in range(0, metric['nb_metric']):
|
||||
np_format.append( ('id'+str(x), 'S20') )
|
||||
np_format.append( ('metric'+str(x), np.float) )
|
||||
np_format.append( ('uom'+str(x), 'S20') )
|
||||
np_format.append( ('frame', np.int))
|
||||
|
||||
print np_format
|
||||
|
||||
output = np.fromregex(fname,metric['regex'], np_format)
|
||||
print output
|
||||
count = output['frame'].size
|
||||
print count
|
||||
if count > 0:
|
||||
|
||||
|
||||
fontP = FontProperties()
|
||||
fontP.set_size('small')
|
||||
|
||||
fig = plt.figure(1)
|
||||
plt.figure(figsize=(10,10))
|
||||
|
||||
plot_xmax = np.amax(output['frame'])+np.amin(output['frame'])
|
||||
|
||||
for x in range(0, metric['nb_metric']):
|
||||
|
||||
metric_name = output['id'+str(x)][0]
|
||||
metric_uom = output['uom'+str(x)][0]
|
||||
|
||||
mmin = np.amin(output['metric'+str(x)])
|
||||
mmax = np.amax(output['metric'+str(x)])
|
||||
mmean = np.mean(output['metric'+str(x)])
|
||||
mmedian = np.median(output['metric'+str(x)])
|
||||
|
||||
plot_loc = 100*metric['nb_metric']+10+x+1
|
||||
|
||||
sbplt = plt.subplot(plot_loc)
|
||||
sbplt.plot(output['frame'], output['metric'+str(x)], color='b' )
|
||||
sbplt.set_title( metric_name+' ('+metric_uom+')')
|
||||
if mmin < 0:
|
||||
sbplot_ymin=mmin+mmin/10
|
||||
else:
|
||||
sbplot_ymin=0
|
||||
sbplt.set_ylim(ymin=sbplot_ymin)
|
||||
if mmax > 0:
|
||||
sbplot_ymax=mmax+mmax/10
|
||||
else:
|
||||
sbplot_ymax=0
|
||||
sbplt.set_ylim(ymax=sbplot_ymax)
|
||||
|
||||
sbplt.set_xlim(xmax=plot_xmax)
|
||||
sbplt.set_xlim(xmin=0)
|
||||
text='min: '+str(mmin)+'\nmax: '+str(mmax)+'\nmean: '+str(mmean)+'\nmedian: '+str(mmedian)
|
||||
sbplt.text( plot_xmax+10,sbplot_ymin,text)
|
||||
sbplt.set_xlabel('frame')
|
||||
sbplt.set_ylabel(metric_name)
|
||||
|
||||
plt.tight_layout()
|
||||
|
||||
fname = "toto.png"
|
||||
|
||||
# lgd = plt.legend(prop=fontP, bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
|
||||
mng = plt.get_current_fig_manager()
|
||||
plt.savefig(fname, bbox_inches='tight')
|
||||
plt.close()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
mmin = np.amin(output['metric']);
|
||||
mmin_index = np.argmin(output['metric']);
|
||||
mmax = np.amax(output['metric']);
|
||||
mmax_index = np.argmax(output['metric']);
|
||||
mean = np.mean(output['metric']);
|
||||
median = np.median(output['metric']);
|
||||
|
||||
# print ( ( (metric['min_limit'] > output['metric']).sum() / float(output['metric'].size) ) * 100 )
|
||||
|
||||
ret = { 'metric_count' : count,
|
||||
'metric_buf' : output,
|
||||
|
||||
|
||||
'metric_min' : mmin,
|
||||
'metric_min_index' : mmin_index,
|
||||
'metric_max' : mmax,
|
||||
'metric_max_index' : mmax_index,
|
||||
'metric_mean' : mean,
|
||||
'metric_median' : median,
|
||||
}
|
||||
return(ret)
|
||||
|
||||
#
|
||||
#
|
||||
#
|
||||
def do_check_verdict(metric_def, metric_data):
|
||||
verdict = 'INCON'
|
||||
|
||||
pass_fail_stat = metric_def['pass_fail_stat']
|
||||
|
||||
if pass_fail_stat == 'max_value':
|
||||
metric_stat = metric_data['metric_max']
|
||||
elif pass_fail_stat == 'min_value':
|
||||
metric_stat = metric_data['metric_min']
|
||||
elif pass_fail_stat == 'mean_value':
|
||||
metric_stat = metric_data['metric_mean']
|
||||
elif pass_fail_stat == 'median_value':
|
||||
metric_stat = metric_data['metric_median']
|
||||
else :
|
||||
print "do_check_verdict -> undef metric stat (pass_fail_stat in xml file)"
|
||||
return verdict
|
||||
|
||||
if 'max_limit' in metric_def:
|
||||
if metric_stat > metric_def['max_limit']:
|
||||
verdict = 'FAIL'
|
||||
else:
|
||||
verdict = 'PASS'
|
||||
|
||||
if 'min_limit' in metric_def:
|
||||
if metric_stat < metric_def['min_limit']:
|
||||
verdict = 'FAIL'
|
||||
else:
|
||||
verdict = 'PASS'
|
||||
return verdict
|
||||
|
||||
|
||||
def do_print_metrics(metric_def, metric_data):
|
||||
|
||||
|
||||
if metric_data['metric_count'] > 0 :
|
||||
|
||||
# output = np.array( metric_data['metric_buf'] , [('id', 'S20'), ('metric', np.float), ('frame', np.int)])
|
||||
output = metric_data['metric_buf']
|
||||
# print output
|
||||
|
||||
fontP = FontProperties()
|
||||
fontP.set_size('small')
|
||||
|
||||
plt.scatter(output['frame'], output['metric'], color='b', alpha=0.33, s = 1 )
|
||||
plt.plot([0, output['frame'][metric_data['metric_count']-1]],[ metric_def['min_limit'],metric_def['min_limit']], 'r-', lw=2) # Red straight line
|
||||
|
||||
plt.title('Physical throughput ')
|
||||
plt.xlabel('frame')
|
||||
plt.ylabel(metric_def['id'])
|
||||
plt.legend(prop=fontP)
|
||||
mng = plt.get_current_fig_manager()
|
||||
plt.show()
|
||||
|
||||
def do_img_metrics(metric_def, metric_data, fname):
|
||||
|
||||
|
||||
if metric_data['metric_count'] > 0 :
|
||||
|
||||
# output = np.array( metric_data['metric_buf'] , [('id', 'S20'), ('metric', np.float), ('frame', np.int)])
|
||||
output = metric_data['metric_buf']
|
||||
# print 'TITI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
|
||||
# print output
|
||||
|
||||
# print metric_def['min_limit']
|
||||
# print metric_data['metric_count']
|
||||
# print output['frame'][metric_data['metric_count']-1]
|
||||
|
||||
fontP = FontProperties()
|
||||
fontP.set_size('small')
|
||||
|
||||
plt.figure()
|
||||
|
||||
# print output['frame'].size
|
||||
# print output['metric'].size
|
||||
|
||||
plt.scatter(output['frame'], output['metric'], color='b', alpha=0.33, s = 1 , label=metric_def['id'])
|
||||
|
||||
if 'min_limit' in metric_def:
|
||||
plt.plot([0, output['frame'][metric_data['metric_count']-1]],[ metric_def['min_limit'],metric_def['min_limit']], 'r-', lw=2, label='min limit') # Red straight line
|
||||
|
||||
plt.title(metric_def['id'] +' ('+metric_def['unit_of_meas']+')')
|
||||
plt.xlabel('frame')
|
||||
plt.ylabel(metric_def['id'])
|
||||
|
||||
# Set graphic minimum Y axis
|
||||
# -------------------------
|
||||
if metric_data['metric_min'] < 0:
|
||||
plt.ylim(ymin=metric_data['metric_min']+metric_data['metric_min']/10)
|
||||
else :
|
||||
plt.ylim(ymin=0)
|
||||
|
||||
y_axis_max = 0
|
||||
if 'min_limit' in metric_def:
|
||||
if metric_data['metric_max'] > metric_def['min_limit']:
|
||||
y_axis_max =metric_data['metric_max']+metric_data['metric_max']/10
|
||||
else:
|
||||
y_axis_max =metric_def['min_limit']+metric_def['min_limit']/10
|
||||
else:
|
||||
y_axis_max =metric_data['metric_max']+metric_data['metric_max']/10
|
||||
|
||||
|
||||
plt.ylim(ymax=y_axis_max)
|
||||
|
||||
lgd = plt.legend(prop=fontP, bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
|
||||
mng = plt.get_current_fig_manager()
|
||||
plt.savefig(fname, bbox_extra_artists=(lgd,), bbox_inches='tight')
|
||||
plt.close()
|
||||
|
||||
# with open(fname, 'r') as f:
|
||||
# for line in f:
|
||||
# m = re.search(metric['regex'], line)
|
||||
# if m :
|
||||
# print m.group(1) + " -> "+m.group(2)
|
||||
|
||||
|
||||
|
||||
|
||||
def do_extract_traffic_metrics(args):
|
||||
|
||||
fname = args['file']
|
||||
|
||||
# print(fname)
|
||||
# print 'metric id = ' + metric['id']
|
||||
|
||||
#[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
|
||||
#[ 3] 0.0- 1.0 sec 238 KBytes 1.95 Mbits/sec 0.980 ms 2/ 174 (1.1%)
|
||||
# [ 3] 0.0- 1.0 sec 63.2 KBytes 517 Kbits/sec 0.146 ms 1/ 45 (2.2%)
|
||||
|
||||
# iperf_regex = '[\s*(\d+)]\s+\d+\.\d+-\s*(\d+\.\d+)\s+sec\s+(\d+).+(\d+\.\d+).+(\d+\.\d+).+(\d+)\/\s*(\d+)\s+\((\d+\.\d+)\%\)'
|
||||
# ID 0.0 1.0 63.2 KByte 517 Kbits/s 0.146
|
||||
iperf_regex = '\[\s*(\d+)\]\s+(\d+\.*\d*)-\s*(\d+\.*\d*)\s+sec\s+(\d+\.*\d*)\s+(\D+)\s+(\d+\.*\d*)\s+(\D+)\s+(\d+\.*\d*)\s+ms\s+(\d+)\/\s*(\d+)\s+\((\d+\.*\d*)\%\)'
|
||||
# print 'iperf regex = ' + iperf_regex
|
||||
|
||||
count = 0
|
||||
bw_min = 0
|
||||
bw_max = 0
|
||||
bw_mean = 0
|
||||
bw_median = 0
|
||||
jitter_min = 0
|
||||
jitter_max = 0
|
||||
jitter_mean = 0
|
||||
jitter_median = 0
|
||||
|
||||
rl_min = 0
|
||||
rl_max = 0
|
||||
rl_mean = 0
|
||||
rl_median = 0
|
||||
|
||||
interval_stop_max = 0
|
||||
|
||||
output = np.fromregex(fname,iperf_regex, [('id', np.int) , ('interval_start', np.float), ('interval_stop', np.float), ('transfer', np.float), ('transfer_uom', 'S20') ,('bandwidth', np.float), ('bandwidth_uom', 'S20') ,('jitter', np.float), ('lost', np.int) , ('total', np.int), ('rate_lost', np.float) ] )
|
||||
|
||||
count = output['id'].size -1
|
||||
# remove last line that is an iperf result resume
|
||||
|
||||
if count > 0:
|
||||
|
||||
output= np.delete(output, (count), axis=0 )
|
||||
# print output
|
||||
|
||||
bw_min = np.amin(output['bandwidth']);
|
||||
bw_max = np.amax(output['bandwidth']);
|
||||
bw_mean = np.mean(output['bandwidth']);
|
||||
bw_median = np.median(output['bandwidth']);
|
||||
|
||||
jitter_min = np.amin(output['jitter']);
|
||||
jitter_max = np.amax(output['jitter']);
|
||||
jitter_mean = np.mean(output['jitter']);
|
||||
jitter_median = np.median(output['jitter']);
|
||||
|
||||
rl_min = np.amin(output['rate_lost']);
|
||||
rl_max = np.amax(output['rate_lost']);
|
||||
rl_mean = np.mean(output['rate_lost']);
|
||||
rl_median = np.median(output['rate_lost']);
|
||||
|
||||
interval_stop_max = np.amax(output['interval_stop']);
|
||||
|
||||
else :
|
||||
count = 0
|
||||
|
||||
|
||||
ret = { 'traffic_count' : count,
|
||||
'traffic_buf' : output,
|
||||
'bw_min' : bw_min,
|
||||
'bw_max' : bw_max,
|
||||
'bw_mean' : bw_mean,
|
||||
'bw_median' : bw_median,
|
||||
'jitter_min' : jitter_min,
|
||||
'jitter_max' : jitter_max,
|
||||
'jitter_mean' : jitter_mean,
|
||||
'jitter_median' : jitter_median,
|
||||
'rl_min' : rl_min,
|
||||
'rl_max' : rl_max,
|
||||
'rl_mean' : rl_mean,
|
||||
'rl_median' : rl_median,
|
||||
'interval_stop_max' : interval_stop_max
|
||||
}
|
||||
return(ret)
|
||||
|
||||
|
||||
|
||||
|
||||
def do_img_traffic(traffic_data, fname):
|
||||
|
||||
|
||||
if traffic_data['traffic_count'] > 0 :
|
||||
|
||||
output = traffic_data['traffic_buf']
|
||||
|
||||
|
||||
fontP = FontProperties()
|
||||
fontP.set_size('small')
|
||||
|
||||
fig = plt.figure(1)
|
||||
|
||||
ax1= plt.subplot(311)
|
||||
plt.plot(output['interval_stop'], output['bandwidth'], color='b' )
|
||||
ax1.set_title('Bandwidth (Mbits/s)')
|
||||
ax1.set_ylim(ymin=-1)
|
||||
ax1.set_xlim(xmax=np.amax(output['interval_stop']))
|
||||
text='min: '+str(traffic_data['bw_min'])+'\nmax: '+str(traffic_data['bw_max'])+'\nmean: '+str(traffic_data['bw_mean'])+'\nmedian: '+str(traffic_data['bw_median'])
|
||||
ax1.text( np.amax(output['interval_stop'])+10,0,text)
|
||||
ax1.set_xlabel('time (s)')
|
||||
ax1.set_ylabel(' ')
|
||||
|
||||
ax2=plt.subplot(312)
|
||||
plt.plot(output['interval_stop'], output['jitter'], color='b' )
|
||||
ax2.set_title('Jitter (ms)')
|
||||
ax2.set_xlim(xmax=np.amax(output['interval_stop']))
|
||||
ax2.set_ylim(ymin=-1)
|
||||
text='min: '+str(traffic_data['jitter_min'])+'\nmax: '+str(traffic_data['jitter_max'])+'\nmean: '+str(traffic_data['jitter_mean'])+'\nmedian: '+str(traffic_data['jitter_median'])
|
||||
ax2.text( np.amax(output['interval_stop'])+10,0,text)
|
||||
ax2.set_xlabel('time (s)')
|
||||
ax2.set_ylabel(' ')
|
||||
|
||||
ax3=plt.subplot(313)
|
||||
plt.plot(output['interval_stop'], output['rate_lost'], color='b')
|
||||
ax3.set_title('Loss rate %')
|
||||
ax3.set_xlim(xmax=np.amax(output['interval_stop']))
|
||||
ax3.set_ylim(ymin=-1)
|
||||
text='min: '+str(traffic_data['rl_min'])+'\nmax: '+str(traffic_data['rl_max'])+'\nmean: '+str(traffic_data['rl_mean'])+'\nmedian: '+str(traffic_data['rl_median'])
|
||||
ax3.text( np.amax(output['interval_stop'])+10,0,text)
|
||||
ax3.set_xlabel('time (s)')
|
||||
ax3.set_ylabel(' ')
|
||||
|
||||
# plt.title('Physical throughput ('+metric_def['unit_of_meas']+')')
|
||||
# plt.xlabel('time (s)')
|
||||
# plt.ylabel(metric_def['id'])
|
||||
|
||||
# Set graphic minimum Y axis
|
||||
# -------------------------
|
||||
# if traffic_data['bw_min'] == 0 :
|
||||
# plt.ylim(ymin=-metric_def['min_limit']/10)
|
||||
# else :
|
||||
# plt.ylim(ymin=0)
|
||||
|
||||
# y_axis_max = 0
|
||||
# if traffic_data['metric_max'] > metric_def['min_limit']:
|
||||
# y_axis_max =traffic_data['metric_max']+traffic_data['metric_max']/10
|
||||
# else:
|
||||
# y_axis_max =metric_def['min_limit']+metric_def['min_limit']/10
|
||||
#
|
||||
# plt.ylim(ymax=y_axis_max)
|
||||
|
||||
plt.tight_layout()
|
||||
|
||||
# lgd = plt.legend(prop=fontP, bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
|
||||
mng = plt.get_current_fig_manager()
|
||||
plt.savefig(fname, bbox_inches='tight')
|
||||
plt.close()
|
||||
|
||||
|
||||
|
||||
|
||||
def create_report_html(context):
|
||||
fname = context['report_path']+"/index.html"
|
||||
|
||||
#
|
||||
with open(fname, 'w') as f:
|
||||
html = render_template('index.html', context)
|
||||
f.write(html)
|
||||
|
||||
|
||||
def create_test_report_detailed_html(context, fname ):
|
||||
with open(fname, 'w') as f:
|
||||
html = render_template('testcase_report.html', context)
|
||||
f.write(html)
|
||||
|
||||
|
||||
def check_cell_synchro(fname):
|
||||
|
||||
with open(fname, 'r') as f:
|
||||
for line in f:
|
||||
|
||||
m = re.search('AUTOTEST Cell Sync \:', line)
|
||||
if m :
|
||||
#print line
|
||||
return 'CELL_SYNCH'
|
||||
|
||||
return 'CELL_NOT_SYNCH'
|
||||
|
||||
|
||||
def check_exec_seg_fault(fname):
|
||||
|
||||
with open(fname, 'r') as f:
|
||||
for line in f:
|
||||
m = re.search('Segmentation fault', line)
|
||||
if m :
|
||||
#print line
|
||||
return 'SEG_FAULT'
|
||||
|
||||
return 'NO_SEG_FAULT'
|
||||
|
||||
+25
-1
@@ -35,6 +35,7 @@ source $THIS_SCRIPT_PATH/tools/build_helper
|
||||
|
||||
MSC_GEN="False"
|
||||
XFORMS="True"
|
||||
FLEXRAN_AGENT_SB_IF="True"
|
||||
PRINT_STATS="False"
|
||||
VCD_TIMING="False"
|
||||
DEADLINE_SCHEDULER_FLAG_USER="False"
|
||||
@@ -53,6 +54,7 @@ BUILD_DOXYGEN=0
|
||||
T_TRACER="False"
|
||||
DISABLE_HARDWARE_DEPENDENCY="False"
|
||||
CMAKE_BUILD_TYPE=""
|
||||
UE_AUTOTEST_TRACE="False"
|
||||
trap handle_ctrl_c INT
|
||||
|
||||
function print_help() {
|
||||
@@ -83,6 +85,8 @@ Options
|
||||
Makes the UE specific parts (ue_ip, usim, nvram)
|
||||
--RRH
|
||||
Makes the RRH
|
||||
-a | --agent
|
||||
Enables agent for software-defined control of the eNB
|
||||
-r | --3gpp-release
|
||||
default is Rel10,
|
||||
Rel8 limits the implementation to 3GPP Release 8 version
|
||||
@@ -127,6 +131,8 @@ Options
|
||||
Enables the T tracer.
|
||||
--disable-hardware-dependency
|
||||
Disable HW dependency during installation
|
||||
--ue-autotest-trace
|
||||
Enable specific traces for UE autotest framework
|
||||
Usage (first build):
|
||||
oaisim (eNB + UE): ./build_oai -I --oaisim -x --install-system-files
|
||||
Eurecom EXMIMO + COTS UE : ./build_oai -I --eNB -x --install-system-files
|
||||
@@ -169,6 +175,10 @@ function main() {
|
||||
eNB=1
|
||||
echo_info "Will compile eNB"
|
||||
shift;;
|
||||
-a | --agent)
|
||||
FLEXRAN_AGENT=1
|
||||
echo_info "Will compile eNB with agent support"
|
||||
shift;;
|
||||
--UE)
|
||||
UE=1
|
||||
echo_info "Will compile UE"
|
||||
@@ -278,6 +288,10 @@ function main() {
|
||||
echo_info "Disabling hardware dependency for compiling software"
|
||||
DISABLE_HARDWARE_DEPENDENCY="True"
|
||||
shift 1;;
|
||||
--ue-autotest-trace)
|
||||
UE_AUTOTEST_TRACE="True"
|
||||
echo_info "Enabling autotest specific trace for UE"
|
||||
shift 1;;
|
||||
-h | --help)
|
||||
print_help
|
||||
exit 1;;
|
||||
@@ -321,7 +335,7 @@ function main() {
|
||||
#By default: EXMIMO: enable
|
||||
if [ "$FORCE_DEADLINE_SCHEDULER_FLAG_USER" = "" ]; then
|
||||
if [ "$HW" = "EXMIMO" ] ; then
|
||||
DEADLINE_SCHEDULER_FLAG_USER="False"
|
||||
DEADLINE_SCHEDULER_FLAG_USER="True"
|
||||
elif [ "$HW" = "ETHERNET" ] ; then
|
||||
DEADLINE_SCHEDULER_FLAG_USER="False"
|
||||
elif [ "$HW" = "OAI_USRP" ] ; then
|
||||
@@ -439,6 +453,9 @@ function main() {
|
||||
echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file
|
||||
echo "set ( CFLAGS_PROCESSOR_USER \"$CFLAGS_PROCESSOR_USER\" )" >> $cmake_file
|
||||
echo "set ( XFORMS $XFORMS )" >> $cmake_file
|
||||
if [ "$FLEXRAN_AGENT" = "1" ] ; then
|
||||
echo "set ( FLEXRAN_AGENT_SB_IF $FLEXRAN_AGENT_SB_IF )" >> $cmake_file
|
||||
fi
|
||||
echo "set ( RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file
|
||||
echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file
|
||||
echo "set ( RF_BOARD \"${HW}\")" >> $cmake_file
|
||||
@@ -447,6 +464,7 @@ function main() {
|
||||
echo "set (DEADLINE_SCHEDULER \"${DEADLINE_SCHEDULER_FLAG_USER}\" )" >>$cmake_file
|
||||
echo "set (CPU_AFFINITY \"${CPU_AFFINITY_FLAG_USER}\" )" >>$cmake_file
|
||||
echo "set ( T_TRACER $T_TRACER )" >> $cmake_file
|
||||
echo "set (UE_AUTOTEST_TRACE $UE_AUTOTEST_TRACE)" >> $cmake_file
|
||||
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file
|
||||
cd $DIR/$lte_build_dir/build
|
||||
cmake ..
|
||||
@@ -581,6 +599,9 @@ function main() {
|
||||
echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file
|
||||
echo "set ( CFLAGS_PROCESSOR_USER \"$CFLAGS_PROCESSOR_USER\" )" >> $cmake_file
|
||||
echo "set ( XFORMS $XFORMS )" >> $cmake_file
|
||||
if [ "$FLEXRAN_AGENT" = "1" ] ; then
|
||||
echo "set ( FLEXRAN_AGENT_SB_IF $FLEXRAN_AGENT_SB_IF )" >> $cmake_file
|
||||
fi
|
||||
echo "set ( PRINT_STATS $PRINT_STATS )" >> $cmake_file
|
||||
echo "set ( RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file
|
||||
echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file
|
||||
@@ -649,6 +670,9 @@ function main() {
|
||||
cp $DIR/oaisim_mme_build_oai/CMakeLists.template $cmake_file
|
||||
echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file
|
||||
echo "set ( XFORMS $XFORMS )" >> $cmake_file
|
||||
if [ "$FLEXRAN_AGENT" = "1" ] ; then
|
||||
echo "set ( FLEXRAN_AGENT_SB_IF $FLEXRAN_AGENT_SB_IF )" >> $cmake_file
|
||||
fi
|
||||
echo "set ( RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file
|
||||
echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file
|
||||
echo "set ( T_TRACER $T_TRACER )" >> $cmake_file
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
cmake_minimum_required(VERSION 2.8)
|
||||
|
||||
set ( CMAKE_BUILD_TYPE "RelWithDebInfo" )
|
||||
set ( ADDR_CONF False )
|
||||
set ( DEBUG_OMG False )
|
||||
set ( DISABLE_XER_PRINT False )
|
||||
@@ -48,7 +47,7 @@ set ( NEW_FFT True )
|
||||
set ( NO_RRM True )
|
||||
set ( OAI_EMU True )
|
||||
set ( OAISIM True )
|
||||
set ( OAI_NW_DRIVER_TYPE_ETHERNET True )
|
||||
set ( OAI_NW_DRIVER_TYPE_ETHERNET False )
|
||||
set ( OAI_NW_DRIVER_USE_NETLINK True )
|
||||
set ( OPENAIR1 True )
|
||||
set ( OPENAIR2 True )
|
||||
|
||||
@@ -163,6 +163,42 @@ compilations() {
|
||||
# External packages installers
|
||||
############################################
|
||||
|
||||
install_protobuf_from_source(){
|
||||
protobuf_install_log=$OPENAIR_DIR/cmake_targets/log/protobuf_install_log.txt
|
||||
echo_info "\nInstalling Google Protobuf from sources. The log file for Protobuf installation is here: $protobuf_install_log "
|
||||
(
|
||||
cd /tmp
|
||||
echo "Downloading protobuf"
|
||||
rm -rf /tmp/protobuf-2.6.1.tar.gz* /tmp/protobuf-2.6.1
|
||||
wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
|
||||
tar -xzvf protobuf-2.6.1.tar.gz
|
||||
cd protobuf-2.6.1/
|
||||
./configure
|
||||
echo "Compiling protobuf"
|
||||
make -j`nproc`
|
||||
$SUDO make install
|
||||
$SUDO ldconfig
|
||||
) >& $protobuf_install_log
|
||||
}
|
||||
|
||||
install_protobuf_c_from_source(){
|
||||
protobuf_c_install_log=$OPENAIR_DIR/cmake_targets/log/protobuf_c_install_log.txt
|
||||
echo_info "\nInstalling Google Protobuf_C from sources. The log file for Protobuf_C installation is here: $protobuf_c_install_log "
|
||||
(
|
||||
cd /tmp
|
||||
echo "Downloading protobuf-c"
|
||||
rm -rf /tmp/protobuf-c
|
||||
git clone https://github.com/protobuf-c/protobuf-c.git
|
||||
cd protobuf-c
|
||||
./autogen.sh
|
||||
./configure
|
||||
echo "Compiling protobuf-c"
|
||||
make -j`nproc`
|
||||
$SUDO make install
|
||||
$SUDO ldconfig
|
||||
) >& $protobuf_c_install_log
|
||||
}
|
||||
|
||||
check_install_usrp_uhd_driver(){
|
||||
#first we remove old installation
|
||||
$SUDO apt-get remove -y uhd || true
|
||||
@@ -223,13 +259,15 @@ check_install_additional_tools (){
|
||||
android-tools-adb \
|
||||
wvdial \
|
||||
python-numpy \
|
||||
sshpass \
|
||||
nscd \
|
||||
bc \
|
||||
ntp
|
||||
sshpass \
|
||||
nscd \
|
||||
bc \
|
||||
ntp \
|
||||
python-scipy \
|
||||
python-matplotlib
|
||||
|
||||
$SUDO pip install paramiko
|
||||
$SUDO pip install pyroute2
|
||||
$SUDO pip install pyroute2 colorama
|
||||
$SUDO rm -fr /opt/ssh
|
||||
$SUDO GIT_SSL_NO_VERIFY=true git clone https://gitlab.eurecom.fr/oai/ssh.git /opt/ssh
|
||||
|
||||
@@ -322,6 +360,7 @@ check_install_oai_software() {
|
||||
xmlstarlet \
|
||||
python-pip \
|
||||
pydb \
|
||||
libyaml-dev \
|
||||
wget
|
||||
|
||||
$SUDO update-alternatives --set liblapack.so /usr/lib/atlas-base/atlas/liblapack.so
|
||||
@@ -335,6 +374,10 @@ check_install_oai_software() {
|
||||
$SUDO apt-get install -y libgnutls-dev
|
||||
|
||||
install_asn1c_from_source
|
||||
$SUDO rm -fr /opt/ssh
|
||||
$SUDO git clone https://gist.github.com/2190472.git /opt/ssh
|
||||
install_protobuf_from_source
|
||||
install_protobuf_c_from_source
|
||||
}
|
||||
|
||||
### Remove Nettle installation which was done from sources
|
||||
@@ -359,6 +402,7 @@ remove_nettle_from_source() {
|
||||
cd nettle-2.5/
|
||||
./configure --disable-openssl --enable-shared --prefix=/usr
|
||||
$SUDO make uninstall || true
|
||||
$SUDO ldconfig
|
||||
) >& $nettle_uninstall_log
|
||||
}
|
||||
|
||||
@@ -382,6 +426,7 @@ remove_gnutls_from_source(){
|
||||
cd gnutls-3.1.23/
|
||||
./configure --prefix=/usr
|
||||
$SUDO make uninstall || true
|
||||
$SUDO ldconfig
|
||||
)>& $gnutls_uninstall_log
|
||||
}
|
||||
|
||||
@@ -396,6 +441,7 @@ install_asn1c_from_source(){
|
||||
make -j`nproc`
|
||||
$SUDO make install
|
||||
cd -
|
||||
$SUDO ldconfig
|
||||
) > $asn1_install_log 2>&1
|
||||
}
|
||||
|
||||
|
||||
Executable
+19
@@ -0,0 +1,19 @@
|
||||
#!/bin/bash
|
||||
|
||||
function main()
|
||||
{
|
||||
mkdir -p $1
|
||||
|
||||
#echo generate protobuf messages inside $1 $2
|
||||
|
||||
c_out=$1
|
||||
shift
|
||||
proto_path=$1
|
||||
shift
|
||||
|
||||
protoc-c --c_out=$c_out --proto_path=$proto_path $*
|
||||
#protoc --cpp_out=$c_out --proto_path=$proto_path $*
|
||||
|
||||
}
|
||||
|
||||
main "$@"
|
||||
Executable
+21
@@ -0,0 +1,21 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CACHE_DIR=/mnt/oai_agent_cache
|
||||
|
||||
if [ ! -d $CACHE_DIR ]; then
|
||||
echo "Creating cache dir in $CACHE_DIR"
|
||||
sudo mkdir $CACHE_DIR
|
||||
fi
|
||||
|
||||
if grep -qs "$CACHE_DIR" /proc/mounts; then
|
||||
echo "Agent cache is already mounted"
|
||||
else
|
||||
echo "Agent cache was not mounted"
|
||||
echo "Mounting..."
|
||||
sudo mount -o size=100m -t tmpfs none "$CACHE_DIR"
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "Mount success"
|
||||
else
|
||||
echo "Something went wrong with the mount"
|
||||
fi
|
||||
fi
|
||||
@@ -5,14 +5,14 @@ linux := $(shell if [ `uname` = "Linux" ] ; then echo "1" ; else echo "0" ; fi)
|
||||
|
||||
|
||||
CFLAGS += -std=gnu99
|
||||
#CFLAGS += -Wall -g -ggdb -Wstrict-prototypes -fno-strict-aliasing
|
||||
CFLAGS += -Wall -g -ggdb -Wstrict-prototypes -fno-strict-aliasing
|
||||
|
||||
# Need to force this option because default kernel module builder is wrong
|
||||
CFLAGS += $(call cc-option,-mpreferred-stack-boundary=4)
|
||||
|
||||
#For performance, if some option doesn't exist in all gcc versions, use $(call cc-option,MY_OPTION)
|
||||
CFLAGS += -O2
|
||||
CFLAGS += -funroll-loops
|
||||
#CFLAGS += -O2
|
||||
#CFLAGS += -funroll-loops
|
||||
CFLAGS += -Wno-packed-bitfield-compat
|
||||
|
||||
# This is the minimum CPU faetures for OAI
|
||||
|
||||
@@ -16,7 +16,7 @@ ID = ENB_PHY_DL_TICK
|
||||
ID = ENB_PHY_DLSCH_UE_DCI
|
||||
DESC = eNodeB downlink UE specific DCI as sent by the PHY layer
|
||||
GROUP = ALL:PHY:GRAPHIC:ENB
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,dci_format : int,harq_pid
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,dci_format : int,harq_pid : int,mcs : int,TBS
|
||||
ID = ENB_PHY_DLSCH_UE_ACK
|
||||
DESC = eNodeB downlink UE ACK as seen by the PHY layer in process_HARQ_feedback
|
||||
GROUP = ALL:PHY:GRAPHIC:ENB
|
||||
@@ -28,7 +28,7 @@ ID = ENB_PHY_DLSCH_UE_NACK
|
||||
ID = ENB_PHY_ULSCH_UE_DCI
|
||||
DESC = eNodeB uplink UE specific DCI as sent by the PHY layer
|
||||
GROUP = ALL:PHY:GRAPHIC:ENB
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid : int,mcs : int,round : int,first_rb : int,nb_rb : int,TBS
|
||||
ID = ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION
|
||||
DESC = eNodeB uplink UE retransmission due to PHICH NACK (see generate_phich_top)
|
||||
GROUP = ALL:PHY:GRAPHIC:ENB
|
||||
@@ -61,6 +61,18 @@ ID = ENB_PHY_PUCCH_1_ENERGY
|
||||
DESC = eNodeB PUCCH 1 energy and threshold
|
||||
GROUP = ALL:PHY:GRAPHIC:HEAVY:ENB
|
||||
FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,energy : int,threshold
|
||||
ID = ENB_PHY_PHICH
|
||||
DESC = eNodeB PHICH
|
||||
GROUP = ALL:PHY:ENB
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid : int,NGROUP : int,NSF : int,ngroup : int,nseq : int,ACK : int,first_rb : int,n_DMRS
|
||||
ID = ENB_PHY_MSG3_ALLOCATION
|
||||
DESC = eNodeB Msg3 allocation/reallocation
|
||||
GROUP = ALL:PHY:ENB
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,first_transmission : int,Msg3_frame : int,Msg3_subframe
|
||||
ID = ENB_PHY_INITIATE_RA_PROCEDURE
|
||||
DESC = eNodeB initiates a random access procedure after detecting enough energy for one of the preambles
|
||||
GROUP = ALL:PHY:ENB
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,preamble : int,energy : int,delay
|
||||
|
||||
#MAC logs
|
||||
ID = ENB_MAC_UE_DL_SDU
|
||||
@@ -70,7 +82,7 @@ ID = ENB_MAC_UE_DL_SDU
|
||||
ID = ENB_MAC_UE_UL_SCHEDULE
|
||||
DESC = MAC uplink UE scheduling decision
|
||||
GROUP = ALL:MAC:ENB
|
||||
FORMAT = int,eNB_ID : int,CC_id : int,rnti : int,frame : int,subframe : int,harq_pid : int,mcs : int,first_rb : int,nb_rb : int,TBS
|
||||
FORMAT = int,eNB_ID : int,CC_id : int,rnti : int,frame : int,subframe : int,harq_pid : int,mcs : int,first_rb : int,nb_rb : int,TBS : int,ndi
|
||||
ID = ENB_MAC_UE_UL_SCHEDULE_RETRANSMISSION
|
||||
DESC = MAC uplink UE scheduling retransmission decision
|
||||
GROUP = ALL:MAC:ENB
|
||||
@@ -411,6 +423,27 @@ ID = LEGACY_ENB_APP_TRACE
|
||||
GROUP = ALL:LEGACY_ENB_APP:LEGACY_GROUP_TRACE:LEGACY
|
||||
FORMAT = string,log
|
||||
|
||||
ID = LEGACY_FLEXRAN_AGENT_INFO
|
||||
DESC = FLEXRAN_AGENT legacy logs - info level
|
||||
GROUP = ALL:LEGACY_FLEXRAN_AGENT:LEGACY_GROUP_INFO:LEGACY
|
||||
FORMAT = string,log
|
||||
ID = LEGACY_FLEXRAN_AGENT_ERROR
|
||||
DESC = FLEXRAN_AGENT legacy logs - error level
|
||||
GROUP = ALL:LEGACY_FLEXRAN_AGENT:LEGACY_GROUP_ERROR:LEGACY
|
||||
FORMAT = string,log
|
||||
ID = LEGACY_FLEXRAN_AGENT_WARNING
|
||||
DESC = FLEXRAN_AGENT legacy logs - warning level
|
||||
GROUP = ALL:LEGACY_FLEXRAN_AGENT:LEGACY_GROUP_WARNING:LEGACY
|
||||
FORMAT = string,log
|
||||
ID = LEGACY_FLEXRAN_AGENT_DEBUG
|
||||
DESC = FLEXRAN_AGENT legacy logs - debug level
|
||||
GROUP = ALL:LEGACY_FLEXRAN_AGENT:LEGACY_GROUP_DEBUG:LEGACY
|
||||
FORMAT = string,log
|
||||
ID = LEGACY_FLEXRAN_AGENT_TRACE
|
||||
DESC = FLEXRAN_AGENT legacy logs - trace level
|
||||
GROUP = ALL:LEGACY_FLEXRAN_AGENT:LEGACY_GROUP_TRACE:LEGACY
|
||||
FORMAT = string,log
|
||||
|
||||
ID = LEGACY_SCTP_INFO
|
||||
DESC = SCTP legacy logs - info level
|
||||
GROUP = ALL:LEGACY_SCTP:LEGACY_GROUP_INFO:LEGACY
|
||||
@@ -1234,6 +1267,14 @@ ID = VCD_VARIABLE_UE0_SFN7
|
||||
DESC = VCD variable UE0_SFN7
|
||||
GROUP = ALL:VCD:ENB:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_UE0_TRX_READ_NS
|
||||
DESC = VCD variable UE0_TRX_READ_NS
|
||||
GROUP = ALL:VCD:ENB:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_UE0_TRX_WRITE_NS
|
||||
DESC = VCD variable UE0_TRX_WRITE_NS
|
||||
GROUP = ALL:VCD:ENB:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
|
||||
#functions
|
||||
|
||||
@@ -1277,6 +1318,50 @@ ID = VCD_FUNCTION_UE_THREAD_RXTX1
|
||||
DESC = VCD function UE_THREAD_RXTX1
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_TRX_READ_SF9
|
||||
DESC = VCD function TRX_READ_SF9
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_TRX_WRITE_SF9
|
||||
DESC = VCD function TRX_WRITE_SF9
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_SIGNAL_COND_RXTX
|
||||
DESC = VCD function UE_SIGNAL_COND_RXTX
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_WAIT_COND_RXTX0
|
||||
DESC = VCD function UE_WAIT_COND_RXTX0
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_WAIT_COND_RXTX1
|
||||
DESC = VCD function UE_WAIT_COND_RXTX1
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT0
|
||||
DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT0
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT1
|
||||
DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT1
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT0
|
||||
DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT0
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT1
|
||||
DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT1
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT0
|
||||
DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT0
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT1
|
||||
DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT1
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_eNB_TX
|
||||
DESC = VCD function eNB_TX
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
@@ -1369,8 +1454,8 @@ ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_UESPEC1
|
||||
DESC = VCD function PHY_PROCEDURES_ENB_RX_UESPEC1
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_SLOT_FEP
|
||||
DESC = VCD function PHY_PROCEDURES_ENB_SLOT_FEP
|
||||
ID = VCD_FUNCTION_ENB_SLOT_FEP
|
||||
DESC = VCD function ENB_SLOT_FEP
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX
|
||||
@@ -1381,6 +1466,26 @@ ID = VCD_FUNCTION_PHY_PROCEDURES_UE_RX
|
||||
DESC = VCD function PHY_PROCEDURES_UE_RX
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_UESPEC
|
||||
DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_UESPEC
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_PUCCH
|
||||
DESC = VCD function PHY_PROCEDURES_UE_TX_PUCCH
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_COMMON
|
||||
DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_COMMON
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_PRACH
|
||||
DESC = VCD function PHY_PROCEDURES_UE_TX_PRACH
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_RAR
|
||||
DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_RAR
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_LTE
|
||||
DESC = VCD function PHY_PROCEDURES_ENB_LTE
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
@@ -1469,6 +1574,22 @@ ID = VCD_FUNCTION_RX_PHICH
|
||||
DESC = VCD function RX_PHICH
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PDSCH_PROC
|
||||
DESC = VCD function PDSCH_PROC
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PDSCH_PROC_SI
|
||||
DESC = VCD function PDSCH_PROC_SI
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PDSCH_PROC_P
|
||||
DESC = VCD function PDSCH_PROC_P
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PDSCH_PROC_RA
|
||||
DESC = VCD function PDSCH_PROC_RA
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PHY_UE_CONFIG_SIB2
|
||||
DESC = VCD function PHY_UE_CONFIG_SIB2
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
@@ -1573,6 +1694,14 @@ ID = VCD_FUNCTION_ENB_DLSCH_SCRAMBLING
|
||||
DESC = VCD function ENB_DLSCH_SCRAMBLING
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_ENB_BEAM_PRECODING
|
||||
DESC = VCD function ENB_BEAM_PRECODING
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_ENB_OFDM_MODULATION
|
||||
DESC = VCD function ENB_OFDM_MODULATION
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_MACPHY_INIT
|
||||
DESC = VCD function MACPHY_INIT
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
@@ -1685,6 +1814,10 @@ ID = VCD_FUNCTION_RLC_DATA_REQ
|
||||
DESC = VCD function RLC_DATA_REQ
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_RLC_DATA_IND
|
||||
DESC = VCD function RLC_DATA_IND
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_MAC_RLC_STATUS_IND
|
||||
DESC = VCD function MAC_RLC_STATUS_IND
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
|
||||
+209
-57
@@ -24,6 +24,30 @@ typedef struct {
|
||||
view *pdcpview;
|
||||
view *rrcview;
|
||||
view *legacy;
|
||||
widget *current_ue_label;
|
||||
widget *prev_ue_button;
|
||||
widget *next_ue_button;
|
||||
widget *pusch_iq_ue_xy_plot;
|
||||
widget *ul_estimate_ue_xy_plot;
|
||||
widget *pucch1_energy_ue_xy_plot;
|
||||
widget *pucch_iq_ue_xy_plot;
|
||||
widget *dl_ul_harq_ue_label;
|
||||
widget *dl_mcs_xy_plot;
|
||||
widget *ul_mcs_xy_plot;
|
||||
logger *pusch_iq_ue_logger;
|
||||
logger *ul_estimate_ue_logger;
|
||||
logger *pucch1_energy_ue_threshold_logger;
|
||||
logger *pucch1_energy_ue_energy_logger;
|
||||
logger *pucch_iq_ue_logger;
|
||||
logger *dl_dci_logger[8];
|
||||
logger *dl_ack_logger[8];
|
||||
logger *dl_nack_logger[8];
|
||||
logger *ul_dci_logger[8];
|
||||
logger *ul_dci_retransmission_logger[8];
|
||||
logger *ul_ack_logger[8];
|
||||
logger *ul_nack_logger[8];
|
||||
logger *dl_mcs_logger;
|
||||
logger *ul_mcs_logger;
|
||||
} enb_gui;
|
||||
|
||||
typedef struct {
|
||||
@@ -31,6 +55,9 @@ typedef struct {
|
||||
int *is_on;
|
||||
int nevents;
|
||||
pthread_mutex_t lock;
|
||||
enb_gui *e;
|
||||
int ue; /* what UE is displayed in the UE specific views */
|
||||
void *database;
|
||||
} enb_data;
|
||||
|
||||
void is_on_changed(void *_d)
|
||||
@@ -86,18 +113,109 @@ static void *gui_thread(void *_g)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static filter *ticktime_filter(void *database, char *event, int i)
|
||||
static filter *ticktime_filter(void *database, char *event, int i, int ue)
|
||||
{
|
||||
/* filter is "harq_pid == i && UE_id == 0 && eNB_id == 0" */
|
||||
return
|
||||
filter_and(
|
||||
filter_eq(filter_evarg(database, event, "harq_pid"), filter_int(i)),
|
||||
filter_and(
|
||||
filter_eq(filter_evarg(database, event, "UE_id"), filter_int(0)),
|
||||
filter_eq(filter_evarg(database, event, "UE_id"), filter_int(ue)),
|
||||
filter_eq(filter_evarg(database, event, "eNB_ID"), filter_int(0))));
|
||||
}
|
||||
|
||||
static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
static void set_current_ue(gui *g, enb_data *e, int ue)
|
||||
{
|
||||
int i;
|
||||
char s[256];
|
||||
|
||||
sprintf(s, "[UE %d] ", ue);
|
||||
label_set_text(g, e->e->current_ue_label, s);
|
||||
sprintf(s, "PUSCH IQ [UE %d]", ue);
|
||||
xy_plot_set_title(g, e->e->pusch_iq_ue_xy_plot, s);
|
||||
sprintf(s, "UL estimated channel [UE %d]", ue);
|
||||
xy_plot_set_title(g, e->e->ul_estimate_ue_xy_plot, s);
|
||||
sprintf(s, "PUCCH1 energy (SR) [UE %d]", ue);
|
||||
xy_plot_set_title(g, e->e->pucch1_energy_ue_xy_plot, s);
|
||||
sprintf(s, "PUCCH IQ [UE %d]", ue);
|
||||
xy_plot_set_title(g, e->e->pucch_iq_ue_xy_plot, s);
|
||||
sprintf(s, "DL/UL HARQ (x8) [UE %d]", ue);
|
||||
label_set_text(g, e->e->dl_ul_harq_ue_label, s);
|
||||
sprintf(s, "DL MCS [UE %d]", ue);
|
||||
xy_plot_set_title(g, e->e->dl_mcs_xy_plot, s);
|
||||
sprintf(s, "UL MCS [UE %d]", ue);
|
||||
xy_plot_set_title(g, e->e->ul_mcs_xy_plot, s);
|
||||
|
||||
logger_set_filter(e->e->pusch_iq_ue_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "ENB_PHY_PUSCH_IQ", "UE_ID"),
|
||||
filter_int(ue)));
|
||||
logger_set_filter(e->e->ul_estimate_ue_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "ENB_PHY_UL_CHANNEL_ESTIMATE", "UE_ID"),
|
||||
filter_int(ue)));
|
||||
logger_set_filter(e->e->pucch1_energy_ue_threshold_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "ENB_PHY_PUCCH_1_ENERGY", "UE_ID"),
|
||||
filter_int(ue)));
|
||||
logger_set_filter(e->e->pucch1_energy_ue_energy_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "ENB_PHY_PUCCH_1_ENERGY", "UE_ID"),
|
||||
filter_int(ue)));
|
||||
logger_set_filter(e->e->pucch_iq_ue_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "ENB_PHY_PUCCH_1AB_IQ", "UE_ID"),
|
||||
filter_int(ue)));
|
||||
for (i = 0; i < 8; i++) {
|
||||
logger_set_filter(e->e->dl_dci_logger[i],
|
||||
ticktime_filter(e->database, "ENB_PHY_DLSCH_UE_DCI", i, ue));
|
||||
logger_set_filter(e->e->dl_ack_logger[i],
|
||||
ticktime_filter(e->database, "ENB_PHY_DLSCH_UE_ACK", i, ue));
|
||||
logger_set_filter(e->e->dl_nack_logger[i],
|
||||
ticktime_filter(e->database, "ENB_PHY_DLSCH_UE_NACK", i, ue));
|
||||
logger_set_filter(e->e->ul_dci_logger[i],
|
||||
ticktime_filter(e->database, "ENB_PHY_ULSCH_UE_DCI", i, ue));
|
||||
logger_set_filter(e->e->ul_dci_retransmission_logger[i],
|
||||
ticktime_filter(e->database,
|
||||
"ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION", i, ue));
|
||||
logger_set_filter(e->e->ul_ack_logger[i],
|
||||
ticktime_filter(e->database, "ENB_PHY_ULSCH_UE_ACK", i, ue));
|
||||
logger_set_filter(e->e->ul_nack_logger[i],
|
||||
ticktime_filter(e->database, "ENB_PHY_ULSCH_UE_NACK", i, ue));
|
||||
}
|
||||
logger_set_filter(e->e->dl_mcs_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "ENB_PHY_DLSCH_UE_DCI", "UE_id"),
|
||||
filter_int(ue)));
|
||||
logger_set_filter(e->e->ul_mcs_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "ENB_PHY_ULSCH_UE_DCI", "UE_id"),
|
||||
filter_int(ue)));
|
||||
}
|
||||
|
||||
static void click(void *private, gui *g,
|
||||
char *notification, widget *w, void *notification_data)
|
||||
{
|
||||
int *d = notification_data;
|
||||
int button = d[0];
|
||||
enb_data *ed = private;
|
||||
enb_gui *e = ed->e;
|
||||
int ue = ed->ue;
|
||||
|
||||
if (button != 1) return;
|
||||
if (w == e->prev_ue_button) { ue--; if (ue < 0) ue = 0; }
|
||||
if (w == e->next_ue_button) ue++;
|
||||
|
||||
if (pthread_mutex_lock(&ed->lock)) abort();
|
||||
if (ue != ed->ue) {
|
||||
set_current_ue(g, ed, ue);
|
||||
ed->ue = ue;
|
||||
}
|
||||
if (pthread_mutex_unlock(&ed->lock)) abort();
|
||||
}
|
||||
|
||||
static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database,
|
||||
enb_data *ed)
|
||||
{
|
||||
widget *main_window;
|
||||
widget *top_container;
|
||||
@@ -113,7 +231,7 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
widget *text;
|
||||
view *textview;
|
||||
int i;
|
||||
widget *w;
|
||||
widget *w, *w2;
|
||||
view *v;
|
||||
logger *l;
|
||||
|
||||
@@ -124,7 +242,26 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
line = new_container(g, HORIZONTAL);
|
||||
widget_add_child(g, top_container, line, -1);
|
||||
logo = new_image(g, openair_logo_png, openair_logo_png_len);
|
||||
widget_add_child(g, line, logo, -1);
|
||||
|
||||
/* logo + prev/next UE buttons */
|
||||
col = new_container(g, VERTICAL);
|
||||
widget_add_child(g, col, logo, -1);
|
||||
w = new_container(g, HORIZONTAL);
|
||||
widget_add_child(g, col, w, -1);
|
||||
w2 = new_label(g, "");
|
||||
widget_add_child(g, w, w2, -1);
|
||||
e->current_ue_label = w2;
|
||||
/* TODO: use button widget, not label widget */
|
||||
w2 = new_label(g, " [prev UE] ");
|
||||
widget_add_child(g, w, w2, -1);
|
||||
label_set_clickable(g, w2, 1);
|
||||
e->prev_ue_button = w2;
|
||||
w2 = new_label(g, " [next UE] ");
|
||||
widget_add_child(g, w, w2, -1);
|
||||
label_set_clickable(g, w2, 1);
|
||||
e->next_ue_button = w2;
|
||||
widget_add_child(g, line, col, -1);
|
||||
|
||||
input_signal_plot = new_xy_plot(g, 256, 55, "input signal", 20);
|
||||
widget_add_child(g, line, input_signal_plot, -1);
|
||||
xy_plot_set_range(g, input_signal_plot, 0, 7680*10, 20, 70);
|
||||
@@ -138,21 +275,20 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
g, input_signal_plot, new_color(g, "#0c0c72"), XY_LOOP_MODE);
|
||||
logger_add_view(input_signal_log, input_signal_view);
|
||||
|
||||
/* UE 0 PUSCH IQ data */
|
||||
w = new_xy_plot(g, 55, 55, "PUSCH IQ [UE 0]", 50);
|
||||
/* UE x PUSCH IQ data */
|
||||
w = new_xy_plot(g, 55, 55, "", 50);
|
||||
e->pusch_iq_ue_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
xy_plot_set_range(g, w, -1000, 1000, -1000, 1000);
|
||||
l = new_iqlog(h, database, "ENB_PHY_PUSCH_IQ", "nb_rb",
|
||||
"N_RB_UL", "symbols_per_tti", "pusch_comp");
|
||||
v = new_view_xy(100*12*14,10,g,w,new_color(g,"#000"),XY_FORCED_MODE);
|
||||
logger_add_view(l, v);
|
||||
logger_set_filter(l,
|
||||
filter_eq(
|
||||
filter_evarg(database, "ENB_PHY_PUSCH_IQ", "UE_ID"),
|
||||
filter_int(0)));
|
||||
e->pusch_iq_ue_logger = l;
|
||||
|
||||
/* UE 0 estimated UL channel */
|
||||
w = new_xy_plot(g, 280, 55, "UL estimated channel [UE 0]", 50);
|
||||
/* UE x estimated UL channel */
|
||||
w = new_xy_plot(g, 280, 55, "", 50);
|
||||
e->ul_estimate_ue_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
xy_plot_set_range(g, w, 0, 512*10, -10, 80);
|
||||
l = new_framelog(h, database,
|
||||
@@ -161,43 +297,57 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
framelog_set_update_only_at_sf9(l, 0);
|
||||
v = new_view_xy(512*10, 10, g, w, new_color(g, "#0c0c72"), XY_LOOP_MODE);
|
||||
logger_add_view(l, v);
|
||||
logger_set_filter(l,
|
||||
filter_eq(
|
||||
filter_evarg(database, "ENB_PHY_UL_CHANNEL_ESTIMATE", "UE_ID"),
|
||||
filter_int(0)));
|
||||
e->ul_estimate_ue_logger = l;
|
||||
|
||||
/* UE 0 PUCCH energy */
|
||||
w = new_xy_plot(g, 128, 55, "PUCCH1 energy (SR) [UE 0]", 50);
|
||||
/* UE x PUCCH energy */
|
||||
w = new_xy_plot(g, 128, 55, "", 50);
|
||||
e->pucch1_energy_ue_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
xy_plot_set_range(g, w, 0, 1024*10, -10, 80);
|
||||
l = new_ttilog(h, database,
|
||||
"ENB_PHY_PUCCH_1_ENERGY", "frame", "subframe", "threshold", 0);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#ff0000"));
|
||||
logger_add_view(l, v);
|
||||
logger_set_filter(l,
|
||||
filter_eq(
|
||||
filter_evarg(database, "ENB_PHY_PUCCH_1_ENERGY", "UE_ID"),
|
||||
filter_int(0)));
|
||||
e->pucch1_energy_ue_threshold_logger = l;
|
||||
l = new_ttilog(h, database,
|
||||
"ENB_PHY_PUCCH_1_ENERGY", "frame", "subframe", "energy", 1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"));
|
||||
logger_add_view(l, v);
|
||||
logger_set_filter(l,
|
||||
filter_eq(
|
||||
filter_evarg(database, "ENB_PHY_PUCCH_1_ENERGY", "UE_ID"),
|
||||
filter_int(0)));
|
||||
e->pucch1_energy_ue_energy_logger = l;
|
||||
|
||||
/* UE 0 PUCCH IQ data */
|
||||
w = new_xy_plot(g, 55, 55, "PUCCH IQ [UE 0]", 50);
|
||||
/* UE x PUCCH IQ data */
|
||||
w = new_xy_plot(g, 55, 55, "", 50);
|
||||
e->pucch_iq_ue_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
xy_plot_set_range(g, w, -100, 100, -100, 100);
|
||||
xy_plot_set_range(g, w, -2000, 2000, -2000, 2000);
|
||||
l = new_iqdotlog(h, database, "ENB_PHY_PUCCH_1AB_IQ", "I", "Q");
|
||||
v = new_view_xy(500, 10, g, w, new_color(g,"#000"), XY_LOOP_MODE);
|
||||
logger_add_view(l, v);
|
||||
logger_set_filter(l,
|
||||
filter_eq(
|
||||
filter_evarg(database, "ENB_PHY_PUCCH_1AB_IQ", "UE_ID"),
|
||||
filter_int(0)));
|
||||
e->pucch_iq_ue_logger = l;
|
||||
|
||||
/* UE x DL mcs */
|
||||
line = new_container(g, HORIZONTAL);
|
||||
widget_add_child(g, top_container, line, -1);
|
||||
w = new_xy_plot(g, 128, 55, "", 20);
|
||||
xy_plot_set_range(g, w, 0, 1024*10, -2, 30);
|
||||
e->dl_mcs_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
l = new_ticked_ttilog(h, database, "ENB_PHY_DL_TICK", "frame", "subframe",
|
||||
"ENB_PHY_DLSCH_UE_DCI", "mcs", 0, -1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"));
|
||||
logger_add_view(l, v);
|
||||
e->dl_mcs_logger = l;
|
||||
|
||||
/* UE x UL mcs */
|
||||
w = new_xy_plot(g, 128, 55, "", 20);
|
||||
xy_plot_set_range(g, w, 0, 1024*10, -2, 30);
|
||||
e->ul_mcs_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
l = new_ticked_ttilog(h, database, "ENB_PHY_DL_TICK", "frame", "subframe",
|
||||
"ENB_PHY_ULSCH_UE_DCI", "mcs", 0, -1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"));
|
||||
logger_add_view(l, v);
|
||||
e->ul_mcs_logger = l;
|
||||
|
||||
/* downlink/uplink UE DCIs */
|
||||
widget_add_child(g, top_container,
|
||||
@@ -250,8 +400,8 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
logger_add_view(timelog, subview);
|
||||
|
||||
/* harq processes' ticktime view */
|
||||
widget_add_child(g, top_container,
|
||||
new_label(g,"DL/UL HARQ (x8) [UE 0]"), -1);
|
||||
e->dl_ul_harq_ue_label = new_label(g, "");
|
||||
widget_add_child(g, top_container, e->dl_ul_harq_ue_label, -1);
|
||||
line = new_container(g, HORIZONTAL);
|
||||
widget_add_child(g, top_container, line, -1);
|
||||
timeline_plot = new_timeline(g, 512, 2*8+2, 3);
|
||||
@@ -271,15 +421,14 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
/* tick on UL view */
|
||||
subview = new_subview_ticktime(timeview, 9, new_color(g,"#bbb"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
/* DL harq pids */
|
||||
/* DL DCI */
|
||||
for (i = 0; i < 8; i++) {
|
||||
timelog = new_ticklog(h, database, "ENB_PHY_DLSCH_UE_DCI",
|
||||
"frame", "subframe");
|
||||
subview = new_subview_ticktime(timeview, i+1,
|
||||
new_color(g,"#55f"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
logger_set_filter(timelog,
|
||||
ticktime_filter(database, "ENB_PHY_DLSCH_UE_DCI", i));
|
||||
e->dl_dci_logger[i] = timelog;
|
||||
}
|
||||
/* DL ACK */
|
||||
for (i = 0; i < 8; i++) {
|
||||
@@ -288,8 +437,7 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
subview = new_subview_ticktime(timeview, i+1,
|
||||
new_color(g,"#282"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
logger_set_filter(timelog,
|
||||
ticktime_filter(database, "ENB_PHY_DLSCH_UE_ACK", i));
|
||||
e->dl_ack_logger[i] = timelog;
|
||||
}
|
||||
/* DL NACK */
|
||||
for (i = 0; i < 8; i++) {
|
||||
@@ -298,10 +446,9 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
subview = new_subview_ticktime(timeview, i+1,
|
||||
new_color(g,"#f22"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
logger_set_filter(timelog,
|
||||
ticktime_filter(database, "ENB_PHY_DLSCH_UE_NACK", i));
|
||||
e->dl_nack_logger[i] = timelog;
|
||||
}
|
||||
/* UL harq pids */
|
||||
/* UL DCI/retransmission without DCI */
|
||||
for (i = 0; i < 8; i++) {
|
||||
/* first transmission */
|
||||
timelog = new_ticklog(h, database, "ENB_PHY_ULSCH_UE_DCI",
|
||||
@@ -309,17 +456,14 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
subview = new_subview_ticktime(timeview, i+9+1,
|
||||
new_color(g,"#55f"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
logger_set_filter(timelog,
|
||||
ticktime_filter(database, "ENB_PHY_ULSCH_UE_DCI", i));
|
||||
e->ul_dci_logger[i] = timelog;
|
||||
/* retransmission */
|
||||
timelog = new_ticklog(h, database,
|
||||
"ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION", "frame", "subframe");
|
||||
subview = new_subview_ticktime(timeview, i+9+1,
|
||||
new_color(g,"#99f"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
logger_set_filter(timelog,
|
||||
ticktime_filter(database,
|
||||
"ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION", i));
|
||||
e->ul_dci_retransmission_logger[i] = timelog;
|
||||
}
|
||||
/* UL ACK */
|
||||
for (i = 0; i < 8; i++) {
|
||||
@@ -328,8 +472,7 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
subview = new_subview_ticktime(timeview, i+9+1,
|
||||
new_color(g,"#282"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
logger_set_filter(timelog,
|
||||
ticktime_filter(database, "ENB_PHY_ULSCH_UE_ACK", i));
|
||||
e->ul_ack_logger[i] = timelog;
|
||||
}
|
||||
/* UL NACK */
|
||||
for (i = 0; i < 8; i++) {
|
||||
@@ -338,8 +481,7 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
subview = new_subview_ticktime(timeview, i+9+1,
|
||||
new_color(g,"#f22"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
logger_set_filter(timelog,
|
||||
ticktime_filter(database, "ENB_PHY_ULSCH_UE_NACK", i));
|
||||
e->ul_nack_logger[i] = timelog;
|
||||
}
|
||||
|
||||
/* phy/mac/rlc/pdcp/rrc textlog */
|
||||
@@ -416,6 +558,10 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
widget_add_child(g, top_container, text, -1);
|
||||
container_set_child_growable(g, top_container, text, 1);
|
||||
e->legacy = new_view_textlist(10000, 10, g, text);
|
||||
|
||||
set_current_ue(g, ed, 0);
|
||||
register_notifier(g, "click", e->prev_ue_button, click, ed);
|
||||
register_notifier(g, "click", e->next_ue_button, click, ed);
|
||||
}
|
||||
|
||||
void view_add_log(view *v, char *log, event_handler *h, void *database,
|
||||
@@ -495,7 +641,11 @@ int main(int n, char **v)
|
||||
g = gui_init();
|
||||
new_thread(gui_thread, g);
|
||||
|
||||
enb_main_gui(&eg, g, h, database);
|
||||
enb_data.ue = 0;
|
||||
enb_data.e = ⪚
|
||||
enb_data.database = database;
|
||||
|
||||
enb_main_gui(&eg, g, h, database, &enb_data);
|
||||
|
||||
for (i = 0; i < number_of_events; i++) {
|
||||
logger *textlog;
|
||||
@@ -525,9 +675,9 @@ int main(int n, char **v)
|
||||
on_off(database, "ENB_PHY_PUCCH_1_ENERGY", is_on, 1);
|
||||
on_off(database, "ENB_PHY_PUCCH_1AB_IQ", is_on, 1);
|
||||
|
||||
on_off(database, "LEGACY_RRC_INFO", is_on, 1);
|
||||
on_off(database, "LEGACY_RRC_ERROR", is_on, 1);
|
||||
on_off(database, "LEGACY_RRC_WARNING", is_on, 1);
|
||||
on_off(database, "LEGACY_GROUP_INFO", is_on, 1);
|
||||
on_off(database, "LEGACY_GROUP_ERROR", is_on, 1);
|
||||
on_off(database, "LEGACY_GROUP_WARNING", is_on, 1);
|
||||
|
||||
view_add_log(eg.phyview, "ENB_PHY_DLSCH_UE_DCI", h, database, is_on);
|
||||
view_add_log(eg.phyview, "ENB_PHY_DLSCH_UE_ACK", h, database, is_on);
|
||||
@@ -639,7 +789,9 @@ restart:
|
||||
event e;
|
||||
e = get_event(enb_data.socket, v, database);
|
||||
if (e.type == -1) goto restart;
|
||||
if (pthread_mutex_lock(&enb_data.lock)) abort();
|
||||
handle_event(h, e);
|
||||
if (pthread_mutex_unlock(&enb_data.lock)) abort();
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -13,6 +13,7 @@ struct filter {
|
||||
} v;
|
||||
|
||||
int (*eval)(struct filter *this, event e);
|
||||
void (*free)(struct filter *this);
|
||||
};
|
||||
|
||||
/****************************************************************************/
|
||||
@@ -52,7 +53,23 @@ int eval_evarg(struct filter *f, event e)
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
/* filter construction functions */
|
||||
/* free memory functions */
|
||||
/****************************************************************************/
|
||||
|
||||
void free_op2(struct filter *f)
|
||||
{
|
||||
free_filter(f->v.op2.a);
|
||||
free_filter(f->v.op2.b);
|
||||
free(f);
|
||||
}
|
||||
|
||||
void free_noop(struct filter *f)
|
||||
{
|
||||
free(f);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
/* filter construction/destruction functions */
|
||||
/****************************************************************************/
|
||||
|
||||
filter *filter_and(filter *a, filter *b)
|
||||
@@ -60,6 +77,7 @@ filter *filter_and(filter *a, filter *b)
|
||||
struct filter *ret = calloc(1, sizeof(struct filter));
|
||||
if (ret == NULL) abort();
|
||||
ret->eval = eval_and;
|
||||
ret->free = free_op2;
|
||||
ret->v.op2.a = a;
|
||||
ret->v.op2.b = b;
|
||||
return ret;
|
||||
@@ -70,6 +88,7 @@ filter *filter_eq(filter *a, filter *b)
|
||||
struct filter *ret = calloc(1, sizeof(struct filter));
|
||||
if (ret == NULL) abort();
|
||||
ret->eval = eval_eq;
|
||||
ret->free = free_op2;
|
||||
ret->v.op2.a = a;
|
||||
ret->v.op2.b = b;
|
||||
return ret;
|
||||
@@ -80,6 +99,7 @@ filter *filter_int(int v)
|
||||
struct filter *ret = calloc(1, sizeof(struct filter));
|
||||
if (ret == NULL) abort();
|
||||
ret->eval = eval_int;
|
||||
ret->free = free_noop;
|
||||
ret->v.v = v;
|
||||
return ret;
|
||||
}
|
||||
@@ -97,6 +117,7 @@ filter *filter_evarg(void *database, char *event_name, char *varname)
|
||||
f = get_format(database, event_id);
|
||||
|
||||
ret->eval = eval_evarg;
|
||||
ret->free = free_noop;
|
||||
ret->v.evarg.event_type = event_id;
|
||||
ret->v.evarg.arg_index = -1;
|
||||
|
||||
@@ -114,6 +135,14 @@ filter *filter_evarg(void *database, char *event_name, char *varname)
|
||||
return ret;
|
||||
}
|
||||
|
||||
void free_filter(filter *_f)
|
||||
{
|
||||
struct filter *f;
|
||||
if (_f == NULL) return;
|
||||
f = _f;
|
||||
f->free(f);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
/* eval function */
|
||||
/****************************************************************************/
|
||||
|
||||
@@ -12,4 +12,6 @@ filter *filter_evarg(void *database, char *event_name, char *varname);
|
||||
|
||||
int filter_eval(filter *f, event e);
|
||||
|
||||
void free_filter(filter *f);
|
||||
|
||||
#endif /* _FILTER_H_ */
|
||||
|
||||
@@ -2,8 +2,8 @@ CC=gcc
|
||||
CFLAGS=-Wall -g -pthread -I/usr/include/X11/Xft -I/usr/include/freetype2
|
||||
|
||||
OBJS=init.o loop.o toplevel_window.o x.o container.o widget.o \
|
||||
gui.o label.o event.o xy_plot.o textlist.o notify.o positioner.o \
|
||||
timeline.o space.o image.o
|
||||
gui.o label.o textarea.o event.o xy_plot.o textlist.o notify.o \
|
||||
positioner.o timeline.o space.o image.o
|
||||
|
||||
gui.a: $(OBJS)
|
||||
ar cr gui.a $(OBJS)
|
||||
|
||||
@@ -14,6 +14,10 @@ typedef void widget;
|
||||
|
||||
#define DEFAULT_FONT 0
|
||||
|
||||
/* tic type for XY plot */
|
||||
#define XY_PLOT_DEFAULT_TICK 0
|
||||
#define XY_PLOT_SCROLL_TICK 1
|
||||
|
||||
/* key modifiers */
|
||||
#define KEY_SHIFT (1<<0)
|
||||
#define KEY_CONTROL (1<<1)
|
||||
@@ -30,6 +34,7 @@ widget *new_toplevel_window(gui *gui, int width, int height, char *title);
|
||||
widget *new_container(gui *gui, int vertical);
|
||||
widget *new_positioner(gui *gui);
|
||||
widget *new_label(gui *gui, const char *text);
|
||||
widget *new_textarea(gui *gui, int width, int height, int maxsize);
|
||||
widget *new_xy_plot(gui *gui, int width, int height, char *label,
|
||||
int vruler_width);
|
||||
widget *new_textlist(gui *gui, int width, int nlines, int background_color);
|
||||
@@ -39,6 +44,9 @@ widget *new_space(gui *gui, int width, int height);
|
||||
widget *new_image(gui *gui, unsigned char *data, int length);
|
||||
|
||||
void label_set_clickable(gui *gui, widget *label, int clickable);
|
||||
void label_set_text(gui *gui, widget *label, char *text);
|
||||
|
||||
void textarea_set_text(gui *gui, widget *textarea, char *text);
|
||||
|
||||
void container_set_child_growable(gui *_gui, widget *_this,
|
||||
widget *child, int growable);
|
||||
@@ -49,6 +57,8 @@ void xy_plot_set_range(gui *gui, widget *this,
|
||||
void xy_plot_set_points(gui *gui, widget *this,
|
||||
int plot, int npoints, float *x, float *y);
|
||||
void xy_plot_get_dimensions(gui *gui, widget *this, int *width, int *height);
|
||||
void xy_plot_set_title(gui *gui, widget *this, char *label);
|
||||
void xy_plot_set_tick_type(gui *gui, widget *this, int type);
|
||||
|
||||
void textlist_add(gui *gui, widget *this, const char *text, int position,
|
||||
int color);
|
||||
|
||||
@@ -31,7 +31,7 @@ extern int volatile gui_logd;
|
||||
|
||||
enum widget_type {
|
||||
TOPLEVEL_WINDOW, CONTAINER, POSITIONER, TEXT_LIST, XY_PLOT, BUTTON, LABEL,
|
||||
TIMELINE, SPACE, IMAGE
|
||||
TEXTAREA, TIMELINE, SPACE, IMAGE
|
||||
};
|
||||
|
||||
struct widget_list;
|
||||
@@ -117,6 +117,7 @@ struct xy_plot_widget {
|
||||
int wanted_height;
|
||||
struct xy_plot_plot *plots;
|
||||
int nplots;
|
||||
int tick_type;
|
||||
};
|
||||
|
||||
struct timeline_subline {
|
||||
@@ -141,13 +142,24 @@ struct button_widget {
|
||||
|
||||
struct label_widget {
|
||||
struct widget common;
|
||||
const char *t;
|
||||
char *t;
|
||||
int color;
|
||||
int width; /* as given by the graphic's backend */
|
||||
int height; /* as given by the graphic's backend */
|
||||
int baseline; /* as given by the graphic's backend */
|
||||
};
|
||||
|
||||
struct textarea_widget {
|
||||
struct widget common;
|
||||
char *t;
|
||||
int tmaxsize;
|
||||
int color;
|
||||
int wanted_width;
|
||||
int wanted_height;
|
||||
int baseline; /* as given by the graphic's backend */
|
||||
int text_width; /* as given by the graphic's backend */
|
||||
};
|
||||
|
||||
struct space_widget {
|
||||
struct widget common;
|
||||
int wanted_width;
|
||||
|
||||
@@ -81,3 +81,21 @@ void label_set_clickable(gui *_g, widget *_this, int clickable)
|
||||
|
||||
gunlock(g);
|
||||
}
|
||||
|
||||
void label_set_text(gui *_g, widget *_this, char *text)
|
||||
{
|
||||
struct gui *g = _g;
|
||||
struct label_widget *this = _this;
|
||||
|
||||
glock(g);
|
||||
|
||||
free(this->t);
|
||||
this->t = strdup(text); if (this->t == NULL) OOM;
|
||||
|
||||
x_text_get_dimensions(g->x, DEFAULT_FONT, text,
|
||||
&this->width, &this->height, &this->baseline);
|
||||
|
||||
send_event(g, REPACK, this->common.id);
|
||||
|
||||
gunlock(g);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
#include "gui.h"
|
||||
#include "gui_defs.h"
|
||||
#include "x.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
static void paint(gui *_gui, widget *_w)
|
||||
{
|
||||
struct gui *g = _gui;
|
||||
struct textarea_widget *t = _w;
|
||||
LOGD("PAINT textarea '%s'\n", t->t);
|
||||
x_fill_rectangle(g->x, g->xwin, BACKGROUND_COLOR,
|
||||
t->common.x, t->common.y,
|
||||
t->common.width, t->common.height);
|
||||
x_draw_clipped_string(g->x, g->xwin, DEFAULT_FONT, t->color,
|
||||
t->common.x + t->common.width - t->text_width,
|
||||
t->common.y + t->baseline, t->t,
|
||||
t->common.x, t->common.y,
|
||||
t->common.width, t->common.height);
|
||||
}
|
||||
|
||||
static void hints(gui *_gui, widget *_w, int *width, int *height)
|
||||
{
|
||||
struct textarea_widget *t = _w;
|
||||
LOGD("HINTS textarea '%s'\n", t->t);
|
||||
*width = t->wanted_width;
|
||||
*height = t->wanted_height;
|
||||
}
|
||||
|
||||
widget *new_textarea(gui *_gui, int width, int height, int maxsize)
|
||||
{
|
||||
struct gui *g = _gui;
|
||||
struct textarea_widget *w;
|
||||
int _;
|
||||
|
||||
glock(g);
|
||||
|
||||
w = new_widget(g, TEXTAREA, sizeof(struct textarea_widget));
|
||||
|
||||
w->t = calloc(maxsize, 1);
|
||||
if (w->t == NULL) OOM;
|
||||
w->tmaxsize = maxsize;
|
||||
w->wanted_width = width;
|
||||
w->wanted_height = height;
|
||||
w->color = FOREGROUND_COLOR;
|
||||
w->text_width = 0;
|
||||
|
||||
x_text_get_dimensions(g->x, DEFAULT_FONT, "jlM",
|
||||
&_, &_, &w->baseline);
|
||||
|
||||
w->common.paint = paint;
|
||||
w->common.hints = hints;
|
||||
|
||||
gunlock(g);
|
||||
|
||||
return w;
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
/* public functions */
|
||||
/*************************************************************************/
|
||||
|
||||
void textarea_set_text(gui *_g, widget *_this, char *text)
|
||||
{
|
||||
struct gui *g = _g;
|
||||
struct textarea_widget *this = _this;
|
||||
int _;
|
||||
int len = strlen(text);
|
||||
if (len >= this->tmaxsize) {
|
||||
fprintf(stderr, "ERROR: string '%s' too big for textarea\n", text);
|
||||
return;
|
||||
}
|
||||
|
||||
glock(g);
|
||||
|
||||
strcpy(this->t, text);
|
||||
x_text_get_dimensions(g->x, DEFAULT_FONT, text,
|
||||
&this->text_width, &_, &this->baseline);
|
||||
send_event(g, DIRTY, this->common.id);
|
||||
|
||||
gunlock(g);
|
||||
}
|
||||
@@ -265,7 +265,7 @@ void widget_dirty(gui *_gui, widget *_this)
|
||||
|
||||
static const char *names[] = {
|
||||
"TOPLEVEL_WINDOW", "CONTAINER", "POSITIONER", "TEXT_LIST",
|
||||
"XY_PLOT", "BUTTON", "LABEL", "TIMELINE", "SPACE", "IMAGE"
|
||||
"XY_PLOT", "BUTTON", "LABEL", "TEXTAREA", "TIMELINE", "SPACE", "IMAGE"
|
||||
};
|
||||
const char *widget_name(enum widget_type type)
|
||||
{
|
||||
@@ -277,6 +277,7 @@ const char *widget_name(enum widget_type type)
|
||||
case XY_PLOT:
|
||||
case BUTTON:
|
||||
case LABEL:
|
||||
case TEXTAREA:
|
||||
case TIMELINE:
|
||||
case SPACE:
|
||||
case IMAGE:
|
||||
|
||||
@@ -1,11 +1,20 @@
|
||||
#include "gui.h"
|
||||
#include "gui_defs.h"
|
||||
#include "x.h"
|
||||
#include "../utils.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
#if 0
|
||||
/* this version behaves differently when you resize the XY plot. Say
|
||||
* you increase the size. The old (smaller) view is put at the center
|
||||
* of the new view. Everything inside keeps the same size/aspect ratio.
|
||||
* The other version below resizes the old view so that it fully occupies
|
||||
* the new view. It may introduce aspect ratio changes, but usage seems
|
||||
* to suggest it's a better behaviour.
|
||||
*/
|
||||
static void paint(gui *_gui, widget *_this)
|
||||
{
|
||||
struct gui *g = _gui;
|
||||
@@ -70,9 +79,9 @@ static void paint(gui *_gui, widget *_this)
|
||||
*/
|
||||
char v[64];
|
||||
int vwidth, dummy;
|
||||
float x = (k * ticstep - allocated_xmin) /
|
||||
(allocated_xmax - allocated_xmin) *
|
||||
(allocated_plot_width - 1);
|
||||
int x = (k * ticstep - allocated_xmin) /
|
||||
(allocated_xmax - allocated_xmin) *
|
||||
(allocated_plot_width - 1);
|
||||
x_draw_line(g->x, g->xwin, FOREGROUND_COLOR,
|
||||
this->common.x + this->vrule_width + x,
|
||||
this->common.y + this->common.height - this->label_height * 2,
|
||||
@@ -85,7 +94,7 @@ static void paint(gui *_gui, widget *_this)
|
||||
this->common.y + this->common.height - this->label_height * 2 +
|
||||
this->label_baseline,
|
||||
v);
|
||||
LOGD("tic k %d val %g x %g\n", k, k * ticstep, x);
|
||||
LOGD("tic k %d val %g x %d\n", k, k * ticstep, x);
|
||||
}
|
||||
|
||||
/* vertical tics */
|
||||
@@ -112,9 +121,9 @@ static void paint(gui *_gui, widget *_this)
|
||||
for (k = kmin; k <= kmax; k++) {
|
||||
char v[64];
|
||||
int vwidth, dummy;
|
||||
float y = (k * ticstep - allocated_ymin) /
|
||||
(allocated_ymax - allocated_ymin) *
|
||||
(allocated_plot_height - 1);
|
||||
int y = (k * ticstep - allocated_ymin) /
|
||||
(allocated_ymax - allocated_ymin) *
|
||||
(allocated_plot_height - 1);
|
||||
sprintf(v, "%g", k * ticstep);
|
||||
x_text_get_dimensions(g->x, DEFAULT_FONT, v, &vwidth, &dummy, &dummy);
|
||||
x_draw_line(g->x, g->xwin, FOREGROUND_COLOR,
|
||||
@@ -155,6 +164,184 @@ static void paint(gui *_gui, widget *_this)
|
||||
x_plot_points(g->x, g->xwin, this->plots[n].color);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void paint(gui *_gui, widget *_this)
|
||||
{
|
||||
struct gui *g = _gui;
|
||||
struct xy_plot_widget *this = _this;
|
||||
int allocated_plot_width;
|
||||
int allocated_plot_height;
|
||||
float pxsize;
|
||||
float ticdist;
|
||||
float tic;
|
||||
float ticstep;
|
||||
int k, kmin, kmax;
|
||||
float allocated_xmin, allocated_xmax;
|
||||
float allocated_ymin, allocated_ymax;
|
||||
int i;
|
||||
int n;
|
||||
char v[64];
|
||||
int vwidth, dummy;
|
||||
|
||||
# define FLIP(v) (-(v) + allocated_plot_height-1)
|
||||
|
||||
LOGD("PAINT xy plot xywh %d %d %d %d\n", this->common.x, this->common.y, this->common.width, this->common.height);
|
||||
|
||||
//x_draw_rectangle(g->x, g->xwin, 1, this->common.x, this->common.y, this->common.width, this->common.height);
|
||||
|
||||
allocated_plot_width = this->common.width - this->vrule_width;
|
||||
allocated_plot_height = this->common.height - this->label_height * 2;
|
||||
|
||||
if (allocated_plot_width <= 1 || allocated_plot_height <= 1) {
|
||||
WARN("PAINT xy plot: width (%d) or height (%d) is wrong, not painting\n",
|
||||
this->common.width, this->common.height);
|
||||
return;
|
||||
}
|
||||
|
||||
/* plot zone */
|
||||
/* TODO: refine height - height of hrule text may be != from label */
|
||||
x_draw_rectangle(g->x, g->xwin, 1,
|
||||
this->common.x + this->vrule_width,
|
||||
this->common.y,
|
||||
this->common.width - this->vrule_width -1, /* -1 to see right border */
|
||||
this->common.height - this->label_height * 2);
|
||||
|
||||
/* horizontal tics */
|
||||
pxsize = (this->xmax - this->xmin) / allocated_plot_width;
|
||||
ticdist = 100;
|
||||
tic = floor(log10(ticdist * pxsize));
|
||||
ticstep = powf(10, tic);
|
||||
allocated_xmin = this->xmin;
|
||||
allocated_xmax = this->xmax;
|
||||
/* adjust tic if too tight */
|
||||
LOGD("pre x ticstep %g\n", ticstep);
|
||||
while (1) {
|
||||
if (ticstep / (allocated_xmax - allocated_xmin)
|
||||
* (allocated_plot_width - 1) > 40) break;
|
||||
ticstep *= 2;
|
||||
}
|
||||
LOGD("post x ticstep %g\n", ticstep);
|
||||
LOGD("xmin/max %g %g width allocated %d alloc xmin/max %g %g ticstep %g\n", this->xmin, this->xmax, allocated_plot_width, allocated_xmin, allocated_xmax, ticstep);
|
||||
kmin = ceil(allocated_xmin / ticstep);
|
||||
kmax = floor(allocated_xmax / ticstep);
|
||||
for (k = kmin; k <= kmax; k++) {
|
||||
/*
|
||||
(k * ticstep - allocated_xmin) / (allocated_max - allocated_xmin) =
|
||||
(x - 0) / (allocated_plot_width-1 - 0)
|
||||
*/
|
||||
int x = (k * ticstep - allocated_xmin) /
|
||||
(allocated_xmax - allocated_xmin) *
|
||||
(allocated_plot_width - 1);
|
||||
int px;
|
||||
x_draw_line(g->x, g->xwin, FOREGROUND_COLOR,
|
||||
this->common.x + this->vrule_width + x,
|
||||
this->common.y + this->common.height - this->label_height * 2,
|
||||
this->common.x + this->vrule_width + x,
|
||||
this->common.y + this->common.height - this->label_height * 2 - 5);
|
||||
sprintf(v, "%g", k * ticstep);
|
||||
x_text_get_dimensions(g->x, DEFAULT_FONT, v, &vwidth, &dummy, &dummy);
|
||||
|
||||
/* do not draw after the widget ('width-1' for if we use 'width'
|
||||
* it is still off by 1 pixel for whatever reason) */
|
||||
px = this->vrule_width + x - vwidth/2;
|
||||
if (px + vwidth > this->common.width-1)
|
||||
px = this->common.width-1 - vwidth;
|
||||
|
||||
x_draw_string(g->x, g->xwin, DEFAULT_FONT, FOREGROUND_COLOR,
|
||||
this->common.x + px,
|
||||
this->common.y + this->common.height - this->label_height * 2 +
|
||||
this->label_baseline,
|
||||
v);
|
||||
LOGD("tic k %d val %g x %d\n", k, k * ticstep, x);
|
||||
}
|
||||
|
||||
/* vertical tics */
|
||||
allocated_ymin = this->ymin;
|
||||
allocated_ymax = this->ymax;
|
||||
switch (this->tick_type) {
|
||||
case XY_PLOT_DEFAULT_TICK:
|
||||
pxsize = (this->ymax - this->ymin) / allocated_plot_height;
|
||||
ticdist = 30;
|
||||
tic = floor(log10(ticdist * pxsize));
|
||||
ticstep = powf(10, tic);
|
||||
/* adjust tic if too tight */
|
||||
LOGD("pre y ticstep %g\n", ticstep);
|
||||
while (1) {
|
||||
if (ticstep / (allocated_ymax - allocated_ymin)
|
||||
* (allocated_plot_height - 1) > 20) break;
|
||||
ticstep *= 2;
|
||||
}
|
||||
LOGD("post y ticstep %g\n", ticstep);
|
||||
LOGD("ymin/max %g %g height allocated %d alloc "
|
||||
"ymin/max %g %g ticstep %g\n", this->ymin, this->ymax,
|
||||
allocated_plot_height, allocated_ymin, allocated_ymax, ticstep);
|
||||
kmin = ceil(allocated_ymin / ticstep);
|
||||
kmax = floor(allocated_ymax / ticstep);
|
||||
for (k = kmin; k <= kmax; k++) {
|
||||
int y = (k * ticstep - allocated_ymin) /
|
||||
(allocated_ymax - allocated_ymin) *
|
||||
(allocated_plot_height - 1);
|
||||
sprintf(v, "%g", k * ticstep);
|
||||
x_text_get_dimensions(g->x, DEFAULT_FONT, v, &vwidth, &dummy, &dummy);
|
||||
x_draw_line(g->x, g->xwin, FOREGROUND_COLOR,
|
||||
this->common.x + this->vrule_width,
|
||||
this->common.y + FLIP(y),
|
||||
this->common.x + this->vrule_width + 5,
|
||||
this->common.y + FLIP(y));
|
||||
x_draw_string(g->x, g->xwin, DEFAULT_FONT, FOREGROUND_COLOR,
|
||||
this->common.x + this->vrule_width - vwidth - 2,
|
||||
this->common.y + FLIP(y)-this->label_height/2+this->label_baseline,
|
||||
v);
|
||||
}
|
||||
break;
|
||||
case XY_PLOT_SCROLL_TICK:
|
||||
/* print only max value, formatted using 'bps' for readability */
|
||||
bps(v, this->ymax, "");
|
||||
x_text_get_dimensions(g->x, DEFAULT_FONT, v, &vwidth, &dummy, &dummy);
|
||||
x_draw_string(g->x, g->xwin, DEFAULT_FONT, FOREGROUND_COLOR,
|
||||
this->common.x + this->vrule_width - vwidth - 2,
|
||||
this->common.y + +this->label_baseline,
|
||||
v);
|
||||
/* vertically divide into 5 */
|
||||
for (k = 1; k < 5; k++) {
|
||||
int y = round((k * (allocated_plot_height - 1)) / 5.);
|
||||
x_draw_line(g->x, g->xwin, FOREGROUND_COLOR,
|
||||
this->common.x + this->vrule_width,
|
||||
this->common.y + y,
|
||||
this->common.x + this->vrule_width + 5,
|
||||
this->common.y + y);
|
||||
}
|
||||
break;
|
||||
} /* swich (this->tick_type) */
|
||||
|
||||
/* label at bottom, in the middle */
|
||||
x_draw_string(g->x, g->xwin, DEFAULT_FONT, FOREGROUND_COLOR,
|
||||
this->common.x + (this->common.width - this->label_width) / 2,
|
||||
this->common.y + this->common.height - this->label_height
|
||||
+ this->label_baseline,
|
||||
this->label);
|
||||
|
||||
for (n = 0; n < this->nplots; n++) {
|
||||
/* points */
|
||||
float ax, bx, ay, by;
|
||||
ax = (allocated_plot_width-1) / (allocated_xmax - allocated_xmin);
|
||||
bx = -ax * allocated_xmin;
|
||||
ay = (allocated_plot_height-1) / (allocated_ymax - allocated_ymin);
|
||||
by = -ay * allocated_ymin;
|
||||
for (i = 0; i < this->plots[n].npoints; i++) {
|
||||
int x, y;
|
||||
x = ax * this->plots[n].x[i] + bx;
|
||||
y = ay * this->plots[n].y[i] + by;
|
||||
if (x >= 0 && x < allocated_plot_width &&
|
||||
y >= 0 && y < allocated_plot_height)
|
||||
x_add_point(g->x,
|
||||
this->common.x + this->vrule_width + x,
|
||||
this->common.y + FLIP(y));
|
||||
}
|
||||
x_plot_points(g->x, g->xwin, this->plots[n].color);
|
||||
}
|
||||
}
|
||||
|
||||
static void hints(gui *_gui, widget *_w, int *width, int *height)
|
||||
{
|
||||
@@ -191,6 +378,7 @@ widget *new_xy_plot(gui *_gui, int width, int height, char *label,
|
||||
w->ymax = 1;
|
||||
w->plots = NULL;
|
||||
w->nplots = 0;
|
||||
w->tick_type = XY_PLOT_DEFAULT_TICK;
|
||||
|
||||
w->common.paint = paint;
|
||||
w->common.hints = hints;
|
||||
@@ -290,3 +478,36 @@ void xy_plot_get_dimensions(gui *_gui, widget *_this, int *width, int *height)
|
||||
|
||||
gunlock(g);
|
||||
}
|
||||
|
||||
void xy_plot_set_title(gui *_gui, widget *_this, char *label)
|
||||
{
|
||||
struct gui *g = _gui;
|
||||
struct xy_plot_widget *this = _this;
|
||||
|
||||
glock(g);
|
||||
|
||||
free(this->label);
|
||||
this->label = strdup(label); if (this->label == NULL) OOM;
|
||||
/* TODO: be sure calling X there is valid wrt "global model" (we are
|
||||
* not in the "gui thread") */
|
||||
x_text_get_dimensions(g->x, DEFAULT_FONT, label,
|
||||
&this->label_width, &this->label_height, &this->label_baseline);
|
||||
|
||||
send_event(g, REPACK, this->common.id);
|
||||
|
||||
gunlock(g);
|
||||
}
|
||||
|
||||
void xy_plot_set_tick_type(gui *_gui, widget *_this, int type)
|
||||
{
|
||||
struct gui *g = _gui;
|
||||
struct xy_plot_widget *this = _this;
|
||||
|
||||
glock(g);
|
||||
|
||||
this->tick_type = type;
|
||||
|
||||
send_event(g, DIRTY, this->common.id);
|
||||
|
||||
gunlock(g);
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ CC=gcc
|
||||
CFLAGS=-Wall -g -pthread -I..
|
||||
|
||||
OBJS=logger.o textlog.o framelog.o ttilog.o timelog.o ticklog.o iqlog.o \
|
||||
iqdotlog.o
|
||||
iqdotlog.o ticked_ttilog.o throughputlog.o
|
||||
|
||||
logger.a: $(OBJS)
|
||||
ar cr logger.a $(OBJS)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#include "logger.h"
|
||||
#include "logger_defs.h"
|
||||
#include "filter/filter.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
void logger_add_view(logger *_l, view *v)
|
||||
@@ -13,5 +14,6 @@ void logger_add_view(logger *_l, view *v)
|
||||
void logger_set_filter(logger *_l, void *filter)
|
||||
{
|
||||
struct logger *l = _l;
|
||||
free_filter(l->filter);
|
||||
l->filter = filter;
|
||||
}
|
||||
|
||||
@@ -10,6 +10,13 @@ logger *new_textlog(void *event_handler, void *database,
|
||||
logger *new_ttilog(void *event_handler, void *database,
|
||||
char *event_name, char *frame_varname, char *subframe_varname,
|
||||
char *data_varname, int convert_to_dB);
|
||||
logger *new_ticked_ttilog(void *event_handler, void *database,
|
||||
char *tick_event_name, char *frame_varname, char *subframe_varname,
|
||||
char *event_name, char *data_varname,
|
||||
int convert_to_dB, float empty_value);
|
||||
logger *new_throughputlog(void *event_handler, void *database,
|
||||
char *tick_event_name, char *frame_varname, char *subframe_varname,
|
||||
char *event_name, char *data_varname);
|
||||
logger *new_timelog(void *event_handler, void *database, char *event_name);
|
||||
logger *new_ticklog(void *event_handler, void *database,
|
||||
char *event_name, char *frame_name, char *subframe_name);
|
||||
@@ -28,5 +35,6 @@ void textlog_dump_buffer(logger *_this, int dump_buffer);
|
||||
|
||||
void logger_add_view(logger *l, view *v);
|
||||
void logger_set_filter(logger *l, void *filter);
|
||||
void ticked_ttilog_set_tick_filter(logger *l, void *filter);
|
||||
|
||||
#endif /* _LOGGER_H_ */
|
||||
|
||||
@@ -0,0 +1,194 @@
|
||||
#include "logger.h"
|
||||
#include "logger_defs.h"
|
||||
#include "event.h"
|
||||
#include "database.h"
|
||||
#include "handler.h"
|
||||
#include "filter/filter.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
struct throughputlog {
|
||||
struct logger common;
|
||||
void *database;
|
||||
int tick_frame_arg;
|
||||
int tick_subframe_arg;
|
||||
int data_frame_arg;
|
||||
int data_subframe_arg;
|
||||
int data_arg;
|
||||
int last_tick_frame;
|
||||
int last_tick_subframe;
|
||||
unsigned long bits[1000];
|
||||
unsigned long total;
|
||||
int insert_point;
|
||||
char *tick_event_name;
|
||||
unsigned long tick_handler_id;
|
||||
/* tick filter - NULL is no filter set */
|
||||
void *tick_filter;
|
||||
};
|
||||
|
||||
static void _event(void *p, event e)
|
||||
{
|
||||
struct throughputlog *l = p;
|
||||
int frame;
|
||||
int subframe;
|
||||
unsigned long value;
|
||||
|
||||
if (l->common.filter != NULL && filter_eval(l->common.filter, e) == 0)
|
||||
return;
|
||||
|
||||
frame = e.e[l->data_frame_arg].i;
|
||||
subframe = e.e[l->data_subframe_arg].i;
|
||||
|
||||
if (frame != l->last_tick_frame || subframe != l->last_tick_subframe) {
|
||||
printf("WARNING: %s:%d: data comes without previous tick!\n",
|
||||
__FILE__, __LINE__);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (e.e[l->data_arg].type) {
|
||||
case EVENT_INT: value = e.e[l->data_arg].i; break;
|
||||
case EVENT_ULONG: value = e.e[l->data_arg].ul; break;
|
||||
default: printf("%s:%d: unsupported type\n", __FILE__, __LINE__); abort();
|
||||
}
|
||||
|
||||
l->total += value;
|
||||
l->bits[l->insert_point] += value;
|
||||
}
|
||||
|
||||
static void _tick_event(void *p, event e)
|
||||
{
|
||||
struct throughputlog *l = p;
|
||||
int i;
|
||||
int frame;
|
||||
int subframe;
|
||||
|
||||
if (l->tick_filter != NULL && filter_eval(l->tick_filter, e) == 0)
|
||||
return;
|
||||
|
||||
frame = e.e[l->tick_frame_arg].i;
|
||||
subframe = e.e[l->tick_subframe_arg].i;
|
||||
|
||||
for (i = 0; i < l->common.vsize; i++)
|
||||
l->common.v[i]->append(l->common.v[i], frame, subframe, (double)l->total);
|
||||
|
||||
l->insert_point = (l->insert_point + 1) % 1000;
|
||||
l->total -= l->bits[l->insert_point];
|
||||
l->bits[l->insert_point] = 0;
|
||||
|
||||
l->last_tick_frame = frame;
|
||||
l->last_tick_subframe = subframe;
|
||||
}
|
||||
|
||||
logger *new_throughputlog(event_handler *h, void *database,
|
||||
char *tick_event_name, char *frame_varname, char *subframe_varname,
|
||||
char *event_name, char *data_varname)
|
||||
{
|
||||
struct throughputlog *ret;
|
||||
int event_id;
|
||||
database_event_format f;
|
||||
int i;
|
||||
|
||||
ret = calloc(1, sizeof(struct throughputlog)); if (ret == NULL) abort();
|
||||
|
||||
ret->common.event_name = strdup(event_name);
|
||||
if (ret->common.event_name == NULL) abort();
|
||||
ret->database = database;
|
||||
|
||||
ret->tick_event_name = strdup(tick_event_name);
|
||||
if (ret->tick_event_name == NULL) abort();
|
||||
|
||||
/* tick event */
|
||||
event_id = event_id_from_name(database, tick_event_name);
|
||||
|
||||
ret->tick_handler_id=register_handler_function(h,event_id,_tick_event,ret);
|
||||
|
||||
f = get_format(database, event_id);
|
||||
|
||||
/* look for frame and subframe */
|
||||
ret->tick_frame_arg = -1;
|
||||
ret->tick_subframe_arg = -1;
|
||||
for (i = 0; i < f.count; i++) {
|
||||
if (!strcmp(f.name[i], frame_varname)) ret->tick_frame_arg = i;
|
||||
if (!strcmp(f.name[i], subframe_varname)) ret->tick_subframe_arg = i;
|
||||
}
|
||||
if (ret->tick_frame_arg == -1) {
|
||||
printf("%s:%d: frame argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, frame_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (ret->tick_subframe_arg == -1) {
|
||||
printf("%s:%d: subframe argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, subframe_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->tick_frame_arg], "int") != 0) {
|
||||
printf("%s:%d: argument '%s' has wrong type (should be 'int')\n",
|
||||
__FILE__, __LINE__, frame_varname);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->tick_subframe_arg], "int") != 0) {
|
||||
printf("%s:%d: argument '%s' has wrong type (should be 'int')\n",
|
||||
__FILE__, __LINE__, subframe_varname);
|
||||
abort();
|
||||
}
|
||||
|
||||
/* data event */
|
||||
event_id = event_id_from_name(database, event_name);
|
||||
|
||||
ret->common.handler_id = register_handler_function(h,event_id,_event,ret);
|
||||
|
||||
f = get_format(database, event_id);
|
||||
|
||||
/* look for frame, subframe and data args */
|
||||
ret->data_frame_arg = -1;
|
||||
ret->data_subframe_arg = -1;
|
||||
ret->data_arg = -1;
|
||||
for (i = 0; i < f.count; i++) {
|
||||
if (!strcmp(f.name[i], frame_varname)) ret->data_frame_arg = i;
|
||||
if (!strcmp(f.name[i], subframe_varname)) ret->data_subframe_arg = i;
|
||||
if (!strcmp(f.name[i], data_varname)) ret->data_arg = i;
|
||||
}
|
||||
if (ret->data_frame_arg == -1) {
|
||||
printf("%s:%d: frame argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, frame_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (ret->data_subframe_arg == -1) {
|
||||
printf("%s:%d: subframe argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, subframe_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (ret->data_arg == -1) {
|
||||
printf("%s:%d: data argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, data_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->data_frame_arg], "int") != 0) {
|
||||
printf("%s:%d: argument '%s' has wrong type (should be 'int')\n",
|
||||
__FILE__, __LINE__, frame_varname);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->data_subframe_arg], "int") != 0) {
|
||||
printf("%s:%d: argument '%s' has wrong type (should be 'int')\n",
|
||||
__FILE__, __LINE__, subframe_varname);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->data_arg], "int") != 0 &&
|
||||
strcmp(f.type[ret->data_arg], "float") != 0) {
|
||||
printf("%s:%d: argument '%s' has wrong type"
|
||||
" (should be 'int' or 'float')\n",
|
||||
__FILE__, __LINE__, data_varname);
|
||||
abort();
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void throughputlog_set_tick_filter(logger *_l, void *filter)
|
||||
{
|
||||
struct throughputlog *l = (struct throughputlog *)_l;
|
||||
free(l->tick_filter);
|
||||
l->tick_filter = filter;
|
||||
}
|
||||
@@ -0,0 +1,196 @@
|
||||
#include "logger.h"
|
||||
#include "logger_defs.h"
|
||||
#include "event.h"
|
||||
#include "database.h"
|
||||
#include "handler.h"
|
||||
#include "filter/filter.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
struct ticked_ttilog {
|
||||
struct logger common;
|
||||
void *database;
|
||||
int tick_frame_arg;
|
||||
int tick_subframe_arg;
|
||||
int data_frame_arg;
|
||||
int data_subframe_arg;
|
||||
int data_arg;
|
||||
int convert_to_dB;
|
||||
int last_tick_frame;
|
||||
int last_tick_subframe;
|
||||
float last_value;
|
||||
float empty_value;
|
||||
char *tick_event_name;
|
||||
unsigned long tick_handler_id;
|
||||
/* tick filter - NULL is no filter set */
|
||||
void *tick_filter;
|
||||
};
|
||||
|
||||
static void _event(void *p, event e)
|
||||
{
|
||||
struct ticked_ttilog *l = p;
|
||||
int frame;
|
||||
int subframe;
|
||||
float value;
|
||||
|
||||
if (l->common.filter != NULL && filter_eval(l->common.filter, e) == 0)
|
||||
return;
|
||||
|
||||
frame = e.e[l->data_frame_arg].i;
|
||||
subframe = e.e[l->data_subframe_arg].i;
|
||||
|
||||
if (frame != l->last_tick_frame || subframe != l->last_tick_subframe) {
|
||||
printf("WARNING: %s:%d: data comes without previous tick!\n",
|
||||
__FILE__, __LINE__);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (e.e[l->data_arg].type) {
|
||||
case EVENT_INT: value = e.e[l->data_arg].i; break;
|
||||
case EVENT_ULONG: value = e.e[l->data_arg].ul; break;
|
||||
default: printf("%s:%d: unsupported type\n", __FILE__, __LINE__); abort();
|
||||
}
|
||||
|
||||
if (l->convert_to_dB) value = 10 * log10(value);
|
||||
|
||||
l->last_value = value;
|
||||
}
|
||||
|
||||
static void _tick_event(void *p, event e)
|
||||
{
|
||||
struct ticked_ttilog *l = p;
|
||||
int i;
|
||||
int frame;
|
||||
int subframe;
|
||||
|
||||
if (l->tick_filter != NULL && filter_eval(l->tick_filter, e) == 0)
|
||||
return;
|
||||
|
||||
frame = e.e[l->tick_frame_arg].i;
|
||||
subframe = e.e[l->tick_subframe_arg].i;
|
||||
|
||||
for (i = 0; i < l->common.vsize; i++)
|
||||
l->common.v[i]->append(l->common.v[i], frame, subframe, l->last_value);
|
||||
|
||||
l->last_value = l->empty_value;
|
||||
l->last_tick_frame = frame;
|
||||
l->last_tick_subframe = subframe;
|
||||
}
|
||||
|
||||
logger *new_ticked_ttilog(event_handler *h, void *database,
|
||||
char *tick_event_name, char *frame_varname, char *subframe_varname,
|
||||
char *event_name, char *data_varname,
|
||||
int convert_to_dB, float empty_value)
|
||||
{
|
||||
struct ticked_ttilog *ret;
|
||||
int event_id;
|
||||
database_event_format f;
|
||||
int i;
|
||||
|
||||
ret = calloc(1, sizeof(struct ticked_ttilog)); if (ret == NULL) abort();
|
||||
|
||||
ret->common.event_name = strdup(event_name);
|
||||
if (ret->common.event_name == NULL) abort();
|
||||
ret->database = database;
|
||||
ret->convert_to_dB = convert_to_dB;
|
||||
|
||||
ret->tick_event_name = strdup(tick_event_name);
|
||||
if (ret->tick_event_name == NULL) abort();
|
||||
ret->empty_value = empty_value;
|
||||
ret->last_value = empty_value;
|
||||
|
||||
/* tick event */
|
||||
event_id = event_id_from_name(database, tick_event_name);
|
||||
|
||||
ret->tick_handler_id=register_handler_function(h,event_id,_tick_event,ret);
|
||||
|
||||
f = get_format(database, event_id);
|
||||
|
||||
/* look for frame and subframe */
|
||||
ret->tick_frame_arg = -1;
|
||||
ret->tick_subframe_arg = -1;
|
||||
for (i = 0; i < f.count; i++) {
|
||||
if (!strcmp(f.name[i], frame_varname)) ret->tick_frame_arg = i;
|
||||
if (!strcmp(f.name[i], subframe_varname)) ret->tick_subframe_arg = i;
|
||||
}
|
||||
if (ret->tick_frame_arg == -1) {
|
||||
printf("%s:%d: frame argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, frame_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (ret->tick_subframe_arg == -1) {
|
||||
printf("%s:%d: subframe argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, subframe_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->tick_frame_arg], "int") != 0) {
|
||||
printf("%s:%d: argument '%s' has wrong type (should be 'int')\n",
|
||||
__FILE__, __LINE__, frame_varname);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->tick_subframe_arg], "int") != 0) {
|
||||
printf("%s:%d: argument '%s' has wrong type (should be 'int')\n",
|
||||
__FILE__, __LINE__, subframe_varname);
|
||||
abort();
|
||||
}
|
||||
|
||||
/* data event */
|
||||
event_id = event_id_from_name(database, event_name);
|
||||
|
||||
ret->common.handler_id = register_handler_function(h,event_id,_event,ret);
|
||||
|
||||
f = get_format(database, event_id);
|
||||
|
||||
/* look for frame, subframe and data args */
|
||||
ret->data_frame_arg = -1;
|
||||
ret->data_subframe_arg = -1;
|
||||
ret->data_arg = -1;
|
||||
for (i = 0; i < f.count; i++) {
|
||||
if (!strcmp(f.name[i], frame_varname)) ret->data_frame_arg = i;
|
||||
if (!strcmp(f.name[i], subframe_varname)) ret->data_subframe_arg = i;
|
||||
if (!strcmp(f.name[i], data_varname)) ret->data_arg = i;
|
||||
}
|
||||
if (ret->data_frame_arg == -1) {
|
||||
printf("%s:%d: frame argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, frame_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (ret->data_subframe_arg == -1) {
|
||||
printf("%s:%d: subframe argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, subframe_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (ret->data_arg == -1) {
|
||||
printf("%s:%d: data argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, data_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->data_frame_arg], "int") != 0) {
|
||||
printf("%s:%d: argument '%s' has wrong type (should be 'int')\n",
|
||||
__FILE__, __LINE__, frame_varname);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->data_subframe_arg], "int") != 0) {
|
||||
printf("%s:%d: argument '%s' has wrong type (should be 'int')\n",
|
||||
__FILE__, __LINE__, subframe_varname);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->data_arg], "int") != 0 &&
|
||||
strcmp(f.type[ret->data_arg], "float") != 0) {
|
||||
printf("%s:%d: argument '%s' has wrong type"
|
||||
" (should be 'int' or 'float')\n",
|
||||
__FILE__, __LINE__, data_varname);
|
||||
abort();
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void ticked_ttilog_set_tick_filter(logger *_l, void *filter)
|
||||
{
|
||||
struct ticked_ttilog *l = (struct ticked_ttilog *)_l;
|
||||
free(l->tick_filter);
|
||||
l->tick_filter = filter;
|
||||
}
|
||||
@@ -177,7 +177,7 @@ void usage(void)
|
||||
printf(
|
||||
"options:\n"
|
||||
" -d <database file> this option is mandatory\n"
|
||||
" -in <dump file> read events from this dump file\n"
|
||||
" -i <dump file> read events from this dump file\n"
|
||||
" -ip <IP address> send packets to this IP address (default %s)\n"
|
||||
" -p <port> send packets to this port (default %d)\n",
|
||||
DEFAULT_IP,
|
||||
@@ -205,7 +205,7 @@ int main(int n, char **v)
|
||||
if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
|
||||
if (!strcmp(v[i], "-d"))
|
||||
{ if (i > n-2) usage(); database_filename = v[++i]; continue; }
|
||||
if (!strcmp(v[i], "-in"))
|
||||
if (!strcmp(v[i], "-i"))
|
||||
{ if (i > n-2) usage(); input_filename = v[++i]; continue; }
|
||||
if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; }
|
||||
if (!strcmp(v[i], "-p")) {if(i>n-2)usage(); port=atoi(v[++i]); continue; }
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <ctype.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <math.h>
|
||||
|
||||
void new_thread(void *(*f)(void *), void *data)
|
||||
{
|
||||
@@ -36,6 +37,16 @@ void sleepms(int ms)
|
||||
if (nanosleep(&t, NULL)) abort();
|
||||
}
|
||||
|
||||
void bps(char *out, float v, char *suffix)
|
||||
{
|
||||
static char *bps_unit[4] = { "", "k", "M", "G" };
|
||||
int flog;
|
||||
if (v < 1000) flog = 0; else flog = floor(floor(log10(v)) / 3);
|
||||
if (flog > 3) flog = 3;
|
||||
v /= pow(10, flog*3);
|
||||
sprintf(out, "%g%s%s", round(v*100)/100, bps_unit[flog], suffix);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
/* list */
|
||||
/****************************************************************************/
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
void new_thread(void *(*f)(void *), void *data);
|
||||
void sleepms(int ms);
|
||||
void bps(char *out, float v, char *suffix);
|
||||
|
||||
/****************************************************************************/
|
||||
/* list */
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
CC=gcc
|
||||
CFLAGS=-Wall -g -pthread -I.. -I../logger
|
||||
|
||||
OBJS=stdout.o textlist.o xy.o tti.o time.o ticktime.o
|
||||
OBJS=stdout.o textlist.o xy.o tti.o time.o ticktime.o scrolltti.o
|
||||
|
||||
view.a: $(OBJS)
|
||||
ar cr view.a $(OBJS)
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
#include "view.h"
|
||||
#include "../utils.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <pthread.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
struct scrolltti {
|
||||
view common;
|
||||
gui *g;
|
||||
widget *w;
|
||||
widget *throughput_textarea;
|
||||
int plot;
|
||||
float refresh_rate;
|
||||
pthread_mutex_t lock;
|
||||
unsigned long data[1000];
|
||||
unsigned long total; /* sum data[0..999] to have smoother value printed */
|
||||
float xout[1000];
|
||||
float yout[1000];
|
||||
int insert_point;
|
||||
};
|
||||
|
||||
/* this array is used to get Y range 1000, 2000, 5000, 10000, ... */
|
||||
static int tolog[11] = { -1, 1, 2, 5, 5, 5, 10, 10, 10, 10, 10 };
|
||||
|
||||
static void *scrolltti_thread(void *_this)
|
||||
{
|
||||
struct scrolltti *this = _this;
|
||||
int i;
|
||||
int p;
|
||||
float max, mlog;
|
||||
char o[64];
|
||||
|
||||
while (1) {
|
||||
if (pthread_mutex_lock(&this->lock)) abort();
|
||||
/* TODO: optimize */
|
||||
p = this->insert_point;
|
||||
max = 0;
|
||||
for (i = 0; i < 1000; i++) {
|
||||
this->xout[i] = i;
|
||||
this->yout[i] = this->data[p];
|
||||
if (this->data[p] > max) max = this->data[p];
|
||||
p = (p + 1) % 1000;
|
||||
}
|
||||
bps(o, this->total/1000., "b/s");
|
||||
textarea_set_text(this->g, this->throughput_textarea, o);
|
||||
/* for Y range we want 1000, 2000, 5000, 10000, 20000, 50000, etc. */
|
||||
if (max < 1000) max = 1000;
|
||||
mlog = pow(10, floor(log10(max)));
|
||||
max = tolog[(int)ceil(max/mlog)] * mlog;
|
||||
xy_plot_set_range(this->g, this->w, 0, 1000, 0, max);
|
||||
xy_plot_set_points(this->g, this->w, this->plot,
|
||||
1000, this->xout, this->yout);
|
||||
if (pthread_mutex_unlock(&this->lock)) abort();
|
||||
sleepms(1000/this->refresh_rate);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void clear(view *this)
|
||||
{
|
||||
/* TODO */
|
||||
}
|
||||
|
||||
static void append(view *_this, int frame, int subframe, double value)
|
||||
{
|
||||
struct scrolltti *this = (struct scrolltti *)_this;
|
||||
|
||||
if (pthread_mutex_lock(&this->lock)) abort();
|
||||
this->total -= this->data[this->insert_point];
|
||||
this->data[this->insert_point] = value;
|
||||
this->total += this->data[this->insert_point];
|
||||
this->insert_point = (this->insert_point + 1) % 1000;
|
||||
if (pthread_mutex_unlock(&this->lock)) abort();
|
||||
}
|
||||
|
||||
view *new_view_scrolltti(float refresh_rate, gui *g, widget *w, int color,
|
||||
widget *throughput_textarea)
|
||||
{
|
||||
struct scrolltti *ret = calloc(1, sizeof(struct scrolltti));
|
||||
if (ret == NULL) abort();
|
||||
|
||||
ret->common.clear = clear;
|
||||
ret->common.append = (void (*)(view *, ...))append;
|
||||
|
||||
ret->refresh_rate = refresh_rate;
|
||||
ret->g = g;
|
||||
ret->w = w;
|
||||
ret->throughput_textarea = throughput_textarea;
|
||||
ret->plot = xy_plot_new_plot(g, w, color);
|
||||
|
||||
if (pthread_mutex_init(&ret->lock, NULL)) abort();
|
||||
|
||||
new_thread(scrolltti_thread, ret);
|
||||
|
||||
return (view *)ret;
|
||||
}
|
||||
@@ -19,6 +19,8 @@ view *new_view_xy(int length, float refresh_rate, gui *g, widget *w,
|
||||
int color, enum xy_mode mode);
|
||||
view *new_view_tti(float refresh_rate, gui *g, widget *w,
|
||||
int color);
|
||||
view *new_view_scrolltti(float refresh_rate, gui *g, widget *w,
|
||||
int color, widget *throughput_label);
|
||||
view *new_view_time(int number_of_seconds, float refresh_rate,
|
||||
gui *g, widget *w);
|
||||
view *new_subview_time(view *time, int line, int color, int size);
|
||||
|
||||
+177
-54
@@ -1,4 +1,8 @@
|
||||
/*
|
||||
/* $NetBSD: tree.h,v 1.8 2004/03/28 19:38:30 provos Exp $ */
|
||||
/* $OpenBSD: tree.h,v 1.7 2002/10/17 21:51:54 art Exp $ */
|
||||
/* $FreeBSD$ */
|
||||
|
||||
/*-
|
||||
* Copyright 2002 Niels Provos <provos@citi.umich.edu>
|
||||
* All rights reserved.
|
||||
*
|
||||
@@ -26,6 +30,8 @@
|
||||
#ifndef _SYS_TREE_H_
|
||||
#define _SYS_TREE_H_
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
/*
|
||||
* This file defines data structures for different types of trees:
|
||||
* splay trees and red-black trees.
|
||||
@@ -63,7 +69,7 @@ struct name { \
|
||||
|
||||
#define SPLAY_INIT(root) do { \
|
||||
(root)->sph_root = NULL; \
|
||||
} while (0)
|
||||
} while (/*CONSTCOND*/ 0)
|
||||
|
||||
#define SPLAY_ENTRY(type) \
|
||||
struct { \
|
||||
@@ -81,32 +87,32 @@ struct { \
|
||||
SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(tmp, field); \
|
||||
SPLAY_RIGHT(tmp, field) = (head)->sph_root; \
|
||||
(head)->sph_root = tmp; \
|
||||
} while (0)
|
||||
} while (/*CONSTCOND*/ 0)
|
||||
|
||||
#define SPLAY_ROTATE_LEFT(head, tmp, field) do { \
|
||||
SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(tmp, field); \
|
||||
SPLAY_LEFT(tmp, field) = (head)->sph_root; \
|
||||
(head)->sph_root = tmp; \
|
||||
} while (0)
|
||||
} while (/*CONSTCOND*/ 0)
|
||||
|
||||
#define SPLAY_LINKLEFT(head, tmp, field) do { \
|
||||
SPLAY_LEFT(tmp, field) = (head)->sph_root; \
|
||||
tmp = (head)->sph_root; \
|
||||
(head)->sph_root = SPLAY_LEFT((head)->sph_root, field); \
|
||||
} while (0)
|
||||
} while (/*CONSTCOND*/ 0)
|
||||
|
||||
#define SPLAY_LINKRIGHT(head, tmp, field) do { \
|
||||
SPLAY_RIGHT(tmp, field) = (head)->sph_root; \
|
||||
tmp = (head)->sph_root; \
|
||||
(head)->sph_root = SPLAY_RIGHT((head)->sph_root, field); \
|
||||
} while (0)
|
||||
} while (/*CONSTCOND*/ 0)
|
||||
|
||||
#define SPLAY_ASSEMBLE(head, node, left, right, field) do { \
|
||||
SPLAY_RIGHT(left, field) = SPLAY_LEFT((head)->sph_root, field); \
|
||||
SPLAY_LEFT(right, field) = SPLAY_RIGHT((head)->sph_root, field);\
|
||||
SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(node, field); \
|
||||
SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(node, field); \
|
||||
} while (0)
|
||||
} while (/*CONSTCOND*/ 0)
|
||||
|
||||
/* Generates prototypes and inline functions */
|
||||
|
||||
@@ -207,7 +213,7 @@ name##_SPLAY(struct name *head, struct type *elm) \
|
||||
SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL;\
|
||||
__left = __right = &__node; \
|
||||
\
|
||||
while ((__comp = (cmp)(elm, (head)->sph_root))) { \
|
||||
while ((__comp = (cmp)(elm, (head)->sph_root)) != 0) { \
|
||||
if (__comp < 0) { \
|
||||
__tmp = SPLAY_LEFT((head)->sph_root, field); \
|
||||
if (__tmp == NULL) \
|
||||
@@ -286,7 +292,7 @@ void name##_SPLAY_MINMAX(struct name *head, int __comp) \
|
||||
(x) != NULL; \
|
||||
(x) = SPLAY_NEXT(name, head, x))
|
||||
|
||||
/* Macros that define a red-back tree */
|
||||
/* Macros that define a red-black tree */
|
||||
#define RB_HEAD(name, type) \
|
||||
struct name { \
|
||||
struct type *rbh_root; /* root of the tree */ \
|
||||
@@ -297,7 +303,7 @@ struct name { \
|
||||
|
||||
#define RB_INIT(root) do { \
|
||||
(root)->rbh_root = NULL; \
|
||||
} while (0)
|
||||
} while (/*CONSTCOND*/ 0)
|
||||
|
||||
#define RB_BLACK 0
|
||||
#define RB_RED 1
|
||||
@@ -320,24 +326,24 @@ struct { \
|
||||
RB_PARENT(elm, field) = parent; \
|
||||
RB_LEFT(elm, field) = RB_RIGHT(elm, field) = NULL; \
|
||||
RB_COLOR(elm, field) = RB_RED; \
|
||||
} while (0)
|
||||
} while (/*CONSTCOND*/ 0)
|
||||
|
||||
#define RB_SET_BLACKRED(black, red, field) do { \
|
||||
RB_COLOR(black, field) = RB_BLACK; \
|
||||
RB_COLOR(red, field) = RB_RED; \
|
||||
} while (0)
|
||||
} while (/*CONSTCOND*/ 0)
|
||||
|
||||
#ifndef RB_AUGMENT
|
||||
#define RB_AUGMENT(x)
|
||||
#define RB_AUGMENT(x) do {} while (0)
|
||||
#endif
|
||||
|
||||
#define RB_ROTATE_LEFT(head, elm, tmp, field) do { \
|
||||
(tmp) = RB_RIGHT(elm, field); \
|
||||
if ((RB_RIGHT(elm, field) = RB_LEFT(tmp, field))) { \
|
||||
if ((RB_RIGHT(elm, field) = RB_LEFT(tmp, field)) != NULL) { \
|
||||
RB_PARENT(RB_LEFT(tmp, field), field) = (elm); \
|
||||
} \
|
||||
RB_AUGMENT(elm); \
|
||||
if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field))) { \
|
||||
if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \
|
||||
if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \
|
||||
RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \
|
||||
else \
|
||||
@@ -349,15 +355,15 @@ struct { \
|
||||
RB_AUGMENT(tmp); \
|
||||
if ((RB_PARENT(tmp, field))) \
|
||||
RB_AUGMENT(RB_PARENT(tmp, field)); \
|
||||
} while (0)
|
||||
} while (/*CONSTCOND*/ 0)
|
||||
|
||||
#define RB_ROTATE_RIGHT(head, elm, tmp, field) do { \
|
||||
(tmp) = RB_LEFT(elm, field); \
|
||||
if ((RB_LEFT(elm, field) = RB_RIGHT(tmp, field))) { \
|
||||
if ((RB_LEFT(elm, field) = RB_RIGHT(tmp, field)) != NULL) { \
|
||||
RB_PARENT(RB_RIGHT(tmp, field), field) = (elm); \
|
||||
} \
|
||||
RB_AUGMENT(elm); \
|
||||
if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field))) { \
|
||||
if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \
|
||||
if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \
|
||||
RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \
|
||||
else \
|
||||
@@ -369,28 +375,66 @@ struct { \
|
||||
RB_AUGMENT(tmp); \
|
||||
if ((RB_PARENT(tmp, field))) \
|
||||
RB_AUGMENT(RB_PARENT(tmp, field)); \
|
||||
} while (0)
|
||||
} while (/*CONSTCOND*/ 0)
|
||||
|
||||
/* Generates prototypes and inline functions */
|
||||
#define RB_PROTOTYPE(name, type, field, cmp) \
|
||||
void name##_RB_INSERT_COLOR(struct name *, struct type *); \
|
||||
void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *);\
|
||||
struct type *name##_RB_REMOVE(struct name *, struct type *); \
|
||||
struct type *name##_RB_INSERT(struct name *, struct type *); \
|
||||
struct type *name##_RB_FIND(struct name *, struct type *); \
|
||||
struct type *name##_RB_NEXT(struct type *); \
|
||||
struct type *name##_RB_MINMAX(struct name *, int); \
|
||||
\
|
||||
#define RB_PROTOTYPE(name, type, field, cmp) \
|
||||
RB_PROTOTYPE_INTERNAL(name, type, field, cmp,)
|
||||
#define RB_PROTOTYPE_STATIC(name, type, field, cmp) \
|
||||
RB_PROTOTYPE_INTERNAL(name, type, field, cmp, __unused static)
|
||||
#define RB_PROTOTYPE_INTERNAL(name, type, field, cmp, attr) \
|
||||
RB_PROTOTYPE_INSERT_COLOR(name, type, attr); \
|
||||
RB_PROTOTYPE_REMOVE_COLOR(name, type, attr); \
|
||||
RB_PROTOTYPE_INSERT(name, type, attr); \
|
||||
RB_PROTOTYPE_REMOVE(name, type, attr); \
|
||||
RB_PROTOTYPE_FIND(name, type, attr); \
|
||||
RB_PROTOTYPE_NFIND(name, type, attr); \
|
||||
RB_PROTOTYPE_NEXT(name, type, attr); \
|
||||
RB_PROTOTYPE_PREV(name, type, attr); \
|
||||
RB_PROTOTYPE_MINMAX(name, type, attr);
|
||||
#define RB_PROTOTYPE_INSERT_COLOR(name, type, attr) \
|
||||
attr void name##_RB_INSERT_COLOR(struct name *, struct type *)
|
||||
#define RB_PROTOTYPE_REMOVE_COLOR(name, type, attr) \
|
||||
attr void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *)
|
||||
#define RB_PROTOTYPE_REMOVE(name, type, attr) \
|
||||
attr struct type *name##_RB_REMOVE(struct name *, struct type *)
|
||||
#define RB_PROTOTYPE_INSERT(name, type, attr) \
|
||||
attr struct type *name##_RB_INSERT(struct name *, struct type *)
|
||||
#define RB_PROTOTYPE_FIND(name, type, attr) \
|
||||
attr struct type *name##_RB_FIND(struct name *, struct type *)
|
||||
#define RB_PROTOTYPE_NFIND(name, type, attr) \
|
||||
attr struct type *name##_RB_NFIND(struct name *, struct type *)
|
||||
#define RB_PROTOTYPE_NEXT(name, type, attr) \
|
||||
attr struct type *name##_RB_NEXT(struct type *)
|
||||
#define RB_PROTOTYPE_PREV(name, type, attr) \
|
||||
attr struct type *name##_RB_PREV(struct type *)
|
||||
#define RB_PROTOTYPE_MINMAX(name, type, attr) \
|
||||
attr struct type *name##_RB_MINMAX(struct name *, int)
|
||||
|
||||
/* Main rb operation.
|
||||
* Moves node close to the key of elm to top
|
||||
*/
|
||||
#define RB_GENERATE(name, type, field, cmp) \
|
||||
void \
|
||||
#define RB_GENERATE(name, type, field, cmp) \
|
||||
RB_GENERATE_INTERNAL(name, type, field, cmp,)
|
||||
#define RB_GENERATE_STATIC(name, type, field, cmp) \
|
||||
RB_GENERATE_INTERNAL(name, type, field, cmp, __unused static)
|
||||
#define RB_GENERATE_INTERNAL(name, type, field, cmp, attr) \
|
||||
RB_GENERATE_INSERT_COLOR(name, type, field, attr) \
|
||||
RB_GENERATE_REMOVE_COLOR(name, type, field, attr) \
|
||||
RB_GENERATE_INSERT(name, type, field, cmp, attr) \
|
||||
RB_GENERATE_REMOVE(name, type, field, attr) \
|
||||
RB_GENERATE_FIND(name, type, field, cmp, attr) \
|
||||
RB_GENERATE_NFIND(name, type, field, cmp, attr) \
|
||||
RB_GENERATE_NEXT(name, type, field, attr) \
|
||||
RB_GENERATE_PREV(name, type, field, attr) \
|
||||
RB_GENERATE_MINMAX(name, type, field, attr)
|
||||
|
||||
#define RB_GENERATE_INSERT_COLOR(name, type, field, attr) \
|
||||
attr void \
|
||||
name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \
|
||||
{ \
|
||||
struct type *parent, *gparent, *tmp; \
|
||||
while ((parent = RB_PARENT(elm, field)) && \
|
||||
while ((parent = RB_PARENT(elm, field)) != NULL && \
|
||||
RB_COLOR(parent, field) == RB_RED) { \
|
||||
gparent = RB_PARENT(parent, field); \
|
||||
if (parent == RB_LEFT(gparent, field)) { \
|
||||
@@ -428,9 +472,10 @@ name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \
|
||||
} \
|
||||
} \
|
||||
RB_COLOR(head->rbh_root, field) = RB_BLACK; \
|
||||
} \
|
||||
\
|
||||
void \
|
||||
}
|
||||
|
||||
#define RB_GENERATE_REMOVE_COLOR(name, type, field, attr) \
|
||||
attr void \
|
||||
name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm) \
|
||||
{ \
|
||||
struct type *tmp; \
|
||||
@@ -454,7 +499,8 @@ name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm)
|
||||
if (RB_RIGHT(tmp, field) == NULL || \
|
||||
RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK) {\
|
||||
struct type *oleft; \
|
||||
if ((oleft = RB_LEFT(tmp, field)))\
|
||||
if ((oleft = RB_LEFT(tmp, field)) \
|
||||
!= NULL) \
|
||||
RB_COLOR(oleft, field) = RB_BLACK;\
|
||||
RB_COLOR(tmp, field) = RB_RED; \
|
||||
RB_ROTATE_RIGHT(head, tmp, oleft, field);\
|
||||
@@ -486,7 +532,8 @@ name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm)
|
||||
if (RB_LEFT(tmp, field) == NULL || \
|
||||
RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) {\
|
||||
struct type *oright; \
|
||||
if ((oright = RB_RIGHT(tmp, field)))\
|
||||
if ((oright = RB_RIGHT(tmp, field)) \
|
||||
!= NULL) \
|
||||
RB_COLOR(oright, field) = RB_BLACK;\
|
||||
RB_COLOR(tmp, field) = RB_RED; \
|
||||
RB_ROTATE_LEFT(head, tmp, oright, field);\
|
||||
@@ -504,9 +551,10 @@ name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm)
|
||||
} \
|
||||
if (elm) \
|
||||
RB_COLOR(elm, field) = RB_BLACK; \
|
||||
} \
|
||||
\
|
||||
struct type * \
|
||||
}
|
||||
|
||||
#define RB_GENERATE_REMOVE(name, type, field, attr) \
|
||||
attr struct type * \
|
||||
name##_RB_REMOVE(struct name *head, struct type *elm) \
|
||||
{ \
|
||||
struct type *child, *parent, *old = elm; \
|
||||
@@ -518,7 +566,7 @@ name##_RB_REMOVE(struct name *head, struct type *elm) \
|
||||
else { \
|
||||
struct type *left; \
|
||||
elm = RB_RIGHT(elm, field); \
|
||||
while ((left = RB_LEFT(elm, field))) \
|
||||
while ((left = RB_LEFT(elm, field)) != NULL) \
|
||||
elm = left; \
|
||||
child = RB_RIGHT(elm, field); \
|
||||
parent = RB_PARENT(elm, field); \
|
||||
@@ -551,7 +599,7 @@ name##_RB_REMOVE(struct name *head, struct type *elm) \
|
||||
left = parent; \
|
||||
do { \
|
||||
RB_AUGMENT(left); \
|
||||
} while ((left = RB_PARENT(left, field))); \
|
||||
} while ((left = RB_PARENT(left, field)) != NULL); \
|
||||
} \
|
||||
goto color; \
|
||||
} \
|
||||
@@ -572,9 +620,10 @@ color: \
|
||||
name##_RB_REMOVE_COLOR(head, parent, child); \
|
||||
return (old); \
|
||||
} \
|
||||
\
|
||||
|
||||
#define RB_GENERATE_INSERT(name, type, field, cmp, attr) \
|
||||
/* Inserts a node into the RB tree */ \
|
||||
struct type * \
|
||||
attr struct type * \
|
||||
name##_RB_INSERT(struct name *head, struct type *elm) \
|
||||
{ \
|
||||
struct type *tmp; \
|
||||
@@ -599,15 +648,14 @@ name##_RB_INSERT(struct name *head, struct type *elm) \
|
||||
RB_RIGHT(parent, field) = elm; \
|
||||
RB_AUGMENT(parent); \
|
||||
} else \
|
||||
{ \
|
||||
RB_ROOT(head) = elm; \
|
||||
} \
|
||||
name##_RB_INSERT_COLOR(head, elm); \
|
||||
return (NULL); \
|
||||
} \
|
||||
\
|
||||
}
|
||||
|
||||
#define RB_GENERATE_FIND(name, type, field, cmp, attr) \
|
||||
/* Finds the node with the same key as elm */ \
|
||||
struct type * \
|
||||
attr struct type * \
|
||||
name##_RB_FIND(struct name *head, struct type *elm) \
|
||||
{ \
|
||||
struct type *tmp = RB_ROOT(head); \
|
||||
@@ -622,9 +670,33 @@ name##_RB_FIND(struct name *head, struct type *elm) \
|
||||
return (tmp); \
|
||||
} \
|
||||
return (NULL); \
|
||||
} \
|
||||
\
|
||||
struct type * \
|
||||
}
|
||||
|
||||
#define RB_GENERATE_NFIND(name, type, field, cmp, attr) \
|
||||
/* Finds the first node greater than or equal to the search key */ \
|
||||
attr struct type * \
|
||||
name##_RB_NFIND(struct name *head, struct type *elm) \
|
||||
{ \
|
||||
struct type *tmp = RB_ROOT(head); \
|
||||
struct type *res = NULL; \
|
||||
int comp; \
|
||||
while (tmp) { \
|
||||
comp = cmp(elm, tmp); \
|
||||
if (comp < 0) { \
|
||||
res = tmp; \
|
||||
tmp = RB_LEFT(tmp, field); \
|
||||
} \
|
||||
else if (comp > 0) \
|
||||
tmp = RB_RIGHT(tmp, field); \
|
||||
else \
|
||||
return (tmp); \
|
||||
} \
|
||||
return (res); \
|
||||
}
|
||||
|
||||
#define RB_GENERATE_NEXT(name, type, field, attr) \
|
||||
/* ARGSUSED */ \
|
||||
attr struct type * \
|
||||
name##_RB_NEXT(struct type *elm) \
|
||||
{ \
|
||||
if (RB_RIGHT(elm, field)) { \
|
||||
@@ -643,9 +715,33 @@ name##_RB_NEXT(struct type *elm) \
|
||||
} \
|
||||
} \
|
||||
return (elm); \
|
||||
} \
|
||||
\
|
||||
struct type * \
|
||||
}
|
||||
|
||||
#define RB_GENERATE_PREV(name, type, field, attr) \
|
||||
/* ARGSUSED */ \
|
||||
attr struct type * \
|
||||
name##_RB_PREV(struct type *elm) \
|
||||
{ \
|
||||
if (RB_LEFT(elm, field)) { \
|
||||
elm = RB_LEFT(elm, field); \
|
||||
while (RB_RIGHT(elm, field)) \
|
||||
elm = RB_RIGHT(elm, field); \
|
||||
} else { \
|
||||
if (RB_PARENT(elm, field) && \
|
||||
(elm == RB_RIGHT(RB_PARENT(elm, field), field))) \
|
||||
elm = RB_PARENT(elm, field); \
|
||||
else { \
|
||||
while (RB_PARENT(elm, field) && \
|
||||
(elm == RB_LEFT(RB_PARENT(elm, field), field)))\
|
||||
elm = RB_PARENT(elm, field); \
|
||||
elm = RB_PARENT(elm, field); \
|
||||
} \
|
||||
} \
|
||||
return (elm); \
|
||||
}
|
||||
|
||||
#define RB_GENERATE_MINMAX(name, type, field, attr) \
|
||||
attr struct type * \
|
||||
name##_RB_MINMAX(struct name *head, int val) \
|
||||
{ \
|
||||
struct type *tmp = RB_ROOT(head); \
|
||||
@@ -666,7 +762,9 @@ name##_RB_MINMAX(struct name *head, int val) \
|
||||
#define RB_INSERT(name, x, y) name##_RB_INSERT(x, y)
|
||||
#define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y)
|
||||
#define RB_FIND(name, x, y) name##_RB_FIND(x, y)
|
||||
#define RB_NFIND(name, x, y) name##_RB_NFIND(x, y)
|
||||
#define RB_NEXT(name, x, y) name##_RB_NEXT(y)
|
||||
#define RB_PREV(name, x, y) name##_RB_PREV(y)
|
||||
#define RB_MIN(name, x) name##_RB_MINMAX(x, RB_NEGINF)
|
||||
#define RB_MAX(name, x) name##_RB_MINMAX(x, RB_INF)
|
||||
|
||||
@@ -675,4 +773,29 @@ name##_RB_MINMAX(struct name *head, int val) \
|
||||
(x) != NULL; \
|
||||
(x) = name##_RB_NEXT(x))
|
||||
|
||||
#define RB_FOREACH_FROM(x, name, y) \
|
||||
for ((x) = (y); \
|
||||
((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \
|
||||
(x) = (y))
|
||||
|
||||
#define RB_FOREACH_SAFE(x, name, head, y) \
|
||||
for ((x) = RB_MIN(name, head); \
|
||||
((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \
|
||||
(x) = (y))
|
||||
|
||||
#define RB_FOREACH_REVERSE(x, name, head) \
|
||||
for ((x) = RB_MAX(name, head); \
|
||||
(x) != NULL; \
|
||||
(x) = name##_RB_PREV(x))
|
||||
|
||||
#define RB_FOREACH_REVERSE_FROM(x, name, y) \
|
||||
for ((x) = (y); \
|
||||
((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \
|
||||
(x) = (y))
|
||||
|
||||
#define RB_FOREACH_REVERSE_SAFE(x, name, head, y) \
|
||||
for ((x) = RB_MAX(name, head); \
|
||||
((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \
|
||||
(x) = (y))
|
||||
|
||||
#endif /* _SYS_TREE_H_ */
|
||||
|
||||
@@ -86,8 +86,8 @@ int timer_handle_signal(siginfo_t *info)
|
||||
timer_p = (struct timer_elm_s *)info->si_ptr;
|
||||
|
||||
// LG: To many traces for msc timer:
|
||||
// TMR_DEBUG("Timer with id 0x%lx has expired\n", (long)timer_p->timer);
|
||||
|
||||
TMR_DEBUG("Timer with id 0x%lx has expired\n", (long)timer_p->timer);
|
||||
|
||||
task_id = timer_p->task_id;
|
||||
instance = timer_p->instance;
|
||||
message_p = itti_alloc_new_message(TASK_TIMER, TIMER_HAS_EXPIRED);
|
||||
@@ -120,6 +120,10 @@ int timer_handle_signal(siginfo_t *info)
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if defined(ENB_AGENT_SB_IF)
|
||||
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#!/bin/sh
|
||||
echo "building ctags for openair1 and openair2 ..."
|
||||
ctags -e -R --exclude=openair1/DOCS/ --exclude=openair2/DOCS/ --exclude=openair2/RRC/CELLULAR/ --exclude=openair2/NAS/DRIVER/CELLULAR/ --exclude=openair2/SIMULATION/ --exclude=targets/DOCS/ --exclude=targets/PROJECTS/ openair1 openair2 openair3 targets cmake_targets common
|
||||
|
||||
|
||||
@@ -1058,7 +1058,7 @@ unsigned char phy_threegpplte_turbo_decoder_scalar(llr_t *y,
|
||||
break;
|
||||
}
|
||||
|
||||
if ((crc == oldcrc) && (crc!=0)) {
|
||||
if (crc == oldcrc) {
|
||||
return(iteration_cnt);
|
||||
}
|
||||
|
||||
|
||||
@@ -1375,7 +1375,7 @@ unsigned char phy_threegpplte_turbo_decoder16avx2(int16_t *y,
|
||||
fprintf(fdavx2b,"oldcrc %x, crc %x, oldcrc_cw2 %x, crc_cw2 %x\n",oldcrc,crc,oldcrc_cw2,crc_cw2);
|
||||
#endif
|
||||
|
||||
if ((crc == oldcrc) && (crc!=0) && (crc_cw2 == oldcrc_cw2) && (crc_cw2!=0)) {
|
||||
if (crc == oldcrc && crc_cw2 == oldcrc_cw2) {
|
||||
return(iteration_cnt);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2556,7 +2556,7 @@ unsigned char phy_threegpplte_turbo_decoder(short *y,
|
||||
|
||||
stop_meas(intl2_stats);
|
||||
|
||||
if ((crc == oldcrc) && (crc!=0)) {
|
||||
if (crc == oldcrc) {
|
||||
return(iteration_cnt);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1612,7 +1612,7 @@ unsigned char phy_threegpplte_turbo_decoder16(short *y,
|
||||
fprintf(fdsse4,"oldcrc %x, crc %x\n",oldcrc,crc);
|
||||
#endif
|
||||
|
||||
if ((crc == oldcrc) && (crc!=0)) {
|
||||
if (crc == oldcrc) {
|
||||
return(iteration_cnt);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -486,7 +486,7 @@ void compute_beta8(llr_t* alpha,llr_t* beta,llr_t *m_11,llr_t* m_10,unsigned sho
|
||||
|
||||
#endif
|
||||
|
||||
if (frame_length > 6143) {
|
||||
if (frame_length > 6144) {
|
||||
LOG_E(PHY,"compute_beta: frame_length %d\n",frame_length);
|
||||
return;
|
||||
}
|
||||
@@ -1625,7 +1625,7 @@ unsigned char phy_threegpplte_turbo_decoder8(short *y,
|
||||
|
||||
if (intl2_stats) stop_meas(intl2_stats);
|
||||
|
||||
if ((crc == oldcrc) && (crc!=0)) {
|
||||
if (crc == oldcrc) {
|
||||
return(iteration_cnt);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ int lte_segmentation(unsigned char *input_buffer,
|
||||
}
|
||||
|
||||
if ((*C)>MAX_NUM_DLSCH_SEGMENTS) {
|
||||
msg("lte_segmentation.c: too many segments %d\n",*C);
|
||||
LOG_E(PHY,"lte_segmentation.c: too many segments %d, B %d, L %d, Bprime %d\n",*C,B,L,Bprime);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
|
||||
@@ -206,7 +206,19 @@ void phy_config_dedicated_ue(module_id_t Mod_id,
|
||||
uint8_t CH_index,
|
||||
struct PhysicalConfigDedicated *physicalConfigDedicated);
|
||||
|
||||
/*!
|
||||
\fn void phy_config_harq_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t CH_index,
|
||||
uint16_t max_harq_tx)
|
||||
\brief Configure UE UL max harq Tx.
|
||||
\details Invoked upon reception of RRCConnectionSetup or RRCConnectionReconfiguration from eNB.
|
||||
@param Mod_id Instance ID for eNB
|
||||
@param CC_id Component Carrier index
|
||||
@param CH_index Index of eNB for this configuration
|
||||
@param max_harq_tx max harq tx information
|
||||
|
||||
*/
|
||||
void phy_config_harq_ue(module_id_t Mod_id,int CC_id,uint8_t CH_index,
|
||||
uint16_t max_harq_tx);
|
||||
/**
|
||||
\brief Configure UE MBSFN common parameters.
|
||||
\details Invoked upon reception of SIB13 from eNB.
|
||||
@@ -292,7 +304,8 @@ void phy_init_lte_top(LTE_DL_FRAME_PARMS *lte_frame_parms);
|
||||
|
||||
//void copy_lte_parms_to_phy_framing(LTE_DL_FRAME_PARMS *frame_parm, PHY_FRAMING *phy_framing);
|
||||
|
||||
void lte_param_init(unsigned char N_tx,
|
||||
void lte_param_init(unsigned char N_tx_port_eNB,
|
||||
unsigned char N_tx,
|
||||
unsigned char N_rx,
|
||||
unsigned char transmission_mode,
|
||||
uint8_t extended_prefix_flag,
|
||||
@@ -327,7 +340,8 @@ void phy_cleanup(void);
|
||||
int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf);
|
||||
void dump_frame_parms(LTE_DL_FRAME_PARMS *frame_parms);
|
||||
|
||||
void lte_param_init(unsigned char N_tx,
|
||||
void lte_param_init(unsigned char N_tx_port_eNB,
|
||||
unsigned char N_tx_phy,
|
||||
unsigned char N_rx,
|
||||
unsigned char transmission_mode,
|
||||
uint8_t extended_prefix_flag,
|
||||
@@ -338,7 +352,6 @@ void lte_param_init(unsigned char N_tx,
|
||||
uint8_t threequarter_fs,
|
||||
uint8_t osf,
|
||||
uint32_t perfect_ce);
|
||||
|
||||
/** @} */
|
||||
#endif
|
||||
|
||||
|
||||
+161
-42
@@ -46,13 +46,12 @@ void phy_config_mib(LTE_DL_FRAME_PARMS *fp,
|
||||
uint8_t p_eNB,
|
||||
PHICH_CONFIG_COMMON *phich_config)
|
||||
{
|
||||
|
||||
fp->N_RB_DL = N_RB_DL;
|
||||
fp->Nid_cell = Nid_cell;
|
||||
fp->nushift = Nid_cell%6;
|
||||
fp->Ncp = Ncp;
|
||||
fp->frame_type = frame_type;
|
||||
fp->nb_antennas_tx_eNB = p_eNB;
|
||||
fp->nb_antenna_ports_eNB = p_eNB;
|
||||
fp->phich_config_common.phich_resource = phich_config->phich_resource;
|
||||
fp->phich_config_common.phich_duration = phich_config->phich_duration;
|
||||
}
|
||||
@@ -482,6 +481,26 @@ void phy_config_dedicated_eNB_step2(PHY_VARS_eNB *eNB)
|
||||
|
||||
}
|
||||
|
||||
if (physicalConfigDedicated->soundingRS_UL_ConfigDedicated) {
|
||||
if (physicalConfigDedicated->soundingRS_UL_ConfigDedicated->present == SoundingRS_UL_ConfigDedicated_PR_setup) {
|
||||
|
||||
eNB->soundingrs_ul_config_dedicated[UE_id].duration = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.duration;
|
||||
eNB->soundingrs_ul_config_dedicated[UE_id].cyclicShift = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.cyclicShift;
|
||||
eNB->soundingrs_ul_config_dedicated[UE_id].freqDomainPosition = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.freqDomainPosition;
|
||||
eNB->soundingrs_ul_config_dedicated[UE_id].srs_Bandwidth = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.srs_Bandwidth;
|
||||
eNB->soundingrs_ul_config_dedicated[UE_id].srs_ConfigIndex = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.srs_ConfigIndex;
|
||||
eNB->soundingrs_ul_config_dedicated[UE_id].srs_HoppingBandwidth = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.srs_HoppingBandwidth;
|
||||
eNB->soundingrs_ul_config_dedicated[UE_id].transmissionComb = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.transmissionComb;
|
||||
|
||||
|
||||
LOG_D(PHY,"soundingrs_ul_config_dedicated.srs_ConfigIndex %d\n",eNB->soundingrs_ul_config_dedicated[UE_id].srs_ConfigIndex);
|
||||
|
||||
}
|
||||
|
||||
LOG_D(PHY,"------------------------------------------------------------\n");
|
||||
|
||||
}
|
||||
|
||||
eNB->physicalConfigDedicated[UE_id] = NULL;
|
||||
}
|
||||
}
|
||||
@@ -664,6 +683,7 @@ void phy_config_dedicated_eNB(uint8_t Mod_id,
|
||||
eNB->transmission_mode[UE_id] = 6;
|
||||
break;
|
||||
case AntennaInfoDedicated__transmissionMode_tm7:
|
||||
lte_gold_ue_spec_port5(eNB->lte_gold_uespec_port5_table[0],eNB->frame_parms.Nid_cell,rnti);
|
||||
eNB->transmission_mode[UE_id] = 7;
|
||||
break;
|
||||
default:
|
||||
@@ -726,6 +746,14 @@ void phy_config_dedicated_scell_eNB(uint8_t Mod_id,
|
||||
}
|
||||
#endif
|
||||
|
||||
void phy_config_harq_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
|
||||
uint16_t max_harq_tx )
|
||||
{
|
||||
|
||||
PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||
phy_vars_ue->ulsch[eNB_id]->Mlimit = max_harq_tx;
|
||||
}
|
||||
|
||||
void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
|
||||
struct PhysicalConfigDedicated *physicalConfigDedicated )
|
||||
{
|
||||
@@ -742,7 +770,8 @@ void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
|
||||
phy_vars_ue->dlsch_received_last[eNB_id]=0;
|
||||
phy_vars_ue->dlsch_fer[eNB_id]=0;
|
||||
|
||||
|
||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex = -1;
|
||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex = -1;
|
||||
|
||||
if (physicalConfigDedicated) {
|
||||
LOG_D(PHY,"[UE %d] Received physicalConfigDedicated from eNB %d\n",Mod_id, eNB_id);
|
||||
@@ -806,7 +835,6 @@ void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
|
||||
if (physicalConfigDedicated->antennaInfo) {
|
||||
phy_vars_ue->transmission_mode[eNB_id] = 1+(physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode);
|
||||
LOG_D(PHY,"Transmission Mode %d\n",phy_vars_ue->transmission_mode[eNB_id]);
|
||||
LOG_D(PHY,"\n");
|
||||
switch(physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode) {
|
||||
case AntennaInfoDedicated__transmissionMode_tm1:
|
||||
phy_vars_ue->transmission_mode[eNB_id] = 1;
|
||||
@@ -827,6 +855,7 @@ void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
|
||||
phy_vars_ue->transmission_mode[eNB_id] = 6;
|
||||
break;
|
||||
case AntennaInfoDedicated__transmissionMode_tm7:
|
||||
lte_gold_ue_spec_port5(phy_vars_ue->lte_gold_uespec_port5_table, phy_vars_ue->frame_parms.Nid_cell, phy_vars_ue->pdcch_vars[eNB_id]->crnti);
|
||||
phy_vars_ue->transmission_mode[eNB_id] = 7;
|
||||
break;
|
||||
default:
|
||||
@@ -852,6 +881,53 @@ void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
|
||||
|
||||
}
|
||||
|
||||
if (physicalConfigDedicated->soundingRS_UL_ConfigDedicated) {
|
||||
|
||||
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srsConfigDedicatedSetup = 0;
|
||||
if (physicalConfigDedicated->soundingRS_UL_ConfigDedicated->present == SoundingRS_UL_ConfigDedicated_PR_setup) {
|
||||
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srsConfigDedicatedSetup = 1;
|
||||
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].duration = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.duration;
|
||||
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].cyclicShift = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.cyclicShift;
|
||||
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].freqDomainPosition = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.freqDomainPosition;
|
||||
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srs_Bandwidth = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.srs_Bandwidth;
|
||||
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srs_ConfigIndex = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.srs_ConfigIndex;
|
||||
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srs_HoppingBandwidth = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.srs_HoppingBandwidth;
|
||||
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].transmissionComb = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.transmissionComb;
|
||||
|
||||
|
||||
LOG_D(PHY,"soundingrs_ul_config_dedicated.srs_ConfigIndex %d\n",phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srs_ConfigIndex);
|
||||
}
|
||||
|
||||
LOG_D(PHY,"------------------------------------------------------------\n");
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (physicalConfigDedicated->cqi_ReportConfig) {
|
||||
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportModeAperiodic) {
|
||||
// configure PUSCH CQI reporting
|
||||
phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic = *physicalConfigDedicated->cqi_ReportConfig->cqi_ReportModeAperiodic;
|
||||
if ((phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic != rm12) &&
|
||||
(phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic != rm30) &&
|
||||
(phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic != rm31))
|
||||
LOG_E(PHY,"Unsupported Aperiodic CQI Feedback Mode : %d\n",phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic);
|
||||
}
|
||||
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic) {
|
||||
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->present == CQI_ReportPeriodic_PR_setup) {
|
||||
// configure PUCCH CQI reporting
|
||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PUCCH_ResourceIndex = physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_PUCCH_ResourceIndex;
|
||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex = physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_pmi_ConfigIndex;
|
||||
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.ri_ConfigIndex)
|
||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex = *physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.ri_ConfigIndex;
|
||||
}
|
||||
else if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->present == CQI_ReportPeriodic_PR_release) {
|
||||
// handle release
|
||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex = -1;
|
||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CBA
|
||||
|
||||
if (physicalConfigDedicated->pusch_CBAConfigDedicated_vlola) {
|
||||
@@ -868,6 +944,9 @@ void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
|
||||
return;
|
||||
}
|
||||
|
||||
// fill cqi parameters for periodic CQI reporting
|
||||
get_cqipmiri_params(phy_vars_ue,eNB_id);
|
||||
|
||||
}
|
||||
|
||||
void phy_config_cba_rnti (module_id_t Mod_id,int CC_id,eNB_flag_t eNB_flag, uint8_t index, rnti_t cba_rnti, uint8_t cba_group_id, uint8_t num_active_cba_groups)
|
||||
@@ -939,14 +1018,17 @@ void phy_init_lte_ue__PDSCH( LTE_UE_PDSCH* const pdsch, const LTE_DL_FRAME_PARMS
|
||||
pdsch->llr128_2ndstream = (int16_t**)malloc16_clear( sizeof(int16_t*) );
|
||||
// FIXME! no further allocation for (int16_t*)pdsch->llr128 !!! expect SIGSEGV
|
||||
|
||||
pdsch->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->rxdataF_comp0 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->rho = (int32_t**)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
pdsch->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->dl_ch_rho_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->dl_ch_rho2_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->dl_ch_mag0 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->dl_ch_magb0 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->rxdataF_uespec_pilots = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->rxdataF_comp0 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->rho = (int32_t**)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
pdsch->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->dl_bf_ch_estimates = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->dl_bf_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->dl_ch_rho_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->dl_ch_rho2_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->dl_ch_mag0 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->dl_ch_magb0 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
|
||||
// the allocated memory size is fixed:
|
||||
AssertFatal( fp->nb_antennas_rx <= 2, "nb_antennas_rx > 2" );
|
||||
@@ -957,13 +1039,16 @@ void phy_init_lte_ue__PDSCH( LTE_UE_PDSCH* const pdsch, const LTE_DL_FRAME_PARMS
|
||||
for (int j=0; j<4; j++) { //fp->nb_antennas_tx; j++)
|
||||
const int idx = (j<<1)+i;
|
||||
const size_t num = 7*2*fp->N_RB_DL*12;
|
||||
pdsch->rxdataF_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->rxdataF_comp0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->dl_ch_rho_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->dl_ch_rho2_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->dl_ch_mag0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->dl_ch_magb0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->rxdataF_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->rxdataF_uespec_pilots[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * fp->N_RB_DL*12);
|
||||
pdsch->rxdataF_comp0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->dl_bf_ch_estimates[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * fp->ofdm_symbol_size*7*2);
|
||||
pdsch->dl_bf_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->dl_ch_rho_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->dl_ch_rho2_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->dl_ch_mag0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->dl_ch_magb0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1178,6 +1263,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
|
||||
LTE_eNB_SRS* const srs_vars = eNB->srs_vars;
|
||||
LTE_eNB_PRACH* const prach_vars = &eNB->prach_vars;
|
||||
int i, j, eNB_id, UE_id;
|
||||
int re;
|
||||
|
||||
eNB->total_dlsch_bitrate = 0;
|
||||
eNB->total_transmitted_bits = 0;
|
||||
@@ -1204,9 +1290,9 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
|
||||
eNB->physicalConfigDedicated[UE_id] = NULL;
|
||||
}
|
||||
|
||||
eNB->first_run_I0_measurements =
|
||||
1; ///This flag used to be static. With multiple eNBs this does no longer work, hence we put it in the structure. However it has to be initialized with 1, which is performed here.
|
||||
eNB->first_run_I0_measurements = 1; ///This flag used to be static. With multiple eNBs this does no longer work, hence we put it in the structure. However it has to be initialized with 1, which is performed here.
|
||||
}
|
||||
|
||||
// for (eNB_id=0; eNB_id<3; eNB_id++) {
|
||||
{
|
||||
eNB_id=0;
|
||||
@@ -1214,39 +1300,72 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
|
||||
|
||||
// TX vars
|
||||
if (eNB->node_function != NGFI_RCC_IF4p5)
|
||||
common_vars->txdata[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_tx*sizeof(int32_t*) );
|
||||
common_vars->txdataF[eNB_id] = (int32_t **)malloc16( fp->nb_antennas_tx*sizeof(int32_t*) );
|
||||
|
||||
for (i=0; i<fp->nb_antennas_tx; i++) {
|
||||
if (eNB->node_function != NGFI_RCC_IF4p5)
|
||||
common_vars->txdata[eNB_id][i] = (int32_t*)malloc16_clear( fp->samples_per_tti*10*sizeof(int32_t) );
|
||||
common_vars->txdataF[eNB_id][i] = (int32_t*)malloc16_clear( fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t) );
|
||||
common_vars->txdata[eNB_id] = (int32_t**)malloc16(fp->nb_antennas_tx*sizeof(int32_t*));
|
||||
common_vars->txdataF[eNB_id] = (int32_t **)malloc16(NB_ANTENNA_PORTS_ENB*sizeof(int32_t*));
|
||||
common_vars->txdataF_BF[eNB_id] = (int32_t **)malloc16(fp->nb_antennas_tx*sizeof(int32_t*));
|
||||
|
||||
for (i=0; i<14; i++) {
|
||||
common_vars->txdataF[eNB_id][i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t) );
|
||||
#ifdef DEBUG_PHY
|
||||
printf("[openair][LTE_PHY][INIT] common_vars->txdata[%d][%d] = %p\n",eNB_id,i,common_vars->txdata[eNB_id][i]);
|
||||
printf("[openair][LTE_PHY][INIT] common_vars->txdataF[%d][%d] = %p (%d bytes)\n",
|
||||
eNB_id,i,common_vars->txdataF[eNB_id][i],
|
||||
fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t));
|
||||
msg("[openair][LTE_PHY][INIT] lte_common_vars->txdataF[%d][%d] = %p (%d bytes)\n",
|
||||
eNB_id,i,common_vars->txdataF[eNB_id][i],
|
||||
fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t));
|
||||
#endif
|
||||
}
|
||||
|
||||
for (i=0; i<fp->nb_antennas_tx; i++) {
|
||||
common_vars->txdataF_BF[eNB_id][i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t) );
|
||||
if (eNB->node_function != NGFI_RCC_IF4p5)
|
||||
common_vars->txdata[eNB_id][i] = (int32_t*)malloc16_clear(fp->samples_per_tti*10*sizeof(int32_t) );
|
||||
|
||||
#ifdef DEBUG_PHY
|
||||
msg("[openair][LTE_PHY][INIT] lte_common_vars->txdataF_BF[%d][%d] = %p (%d bytes)\n",
|
||||
eNB_id,i,common_vars->txdataF_BF[eNB_id][i],
|
||||
fp->ofdm_symbol_size*sizeof(int32_t));
|
||||
msg("[openair][LTE_PHY][INIT] lte_common_vars->txdata[%d][%d] = %p\n",eNB_id,i,common_vars->txdata[eNB_id][i]);
|
||||
#endif
|
||||
}
|
||||
|
||||
for (i=0; i<14; i++) { // 14 is the total number of antenna ports
|
||||
common_vars->beam_weights[eNB_id][i] = (int32_t **)malloc16_clear(fp->nb_antennas_tx*sizeof(int32_t*));
|
||||
for (j=0; j<fp->nb_antennas_tx; j++) {
|
||||
common_vars->beam_weights[eNB_id][i][j] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t));
|
||||
// antenna ports 0-3 are mapped on antennas 0-3
|
||||
// antenna port 4 is mapped on antenna 0
|
||||
// antenna ports 5-14 are mapped on all antennas
|
||||
if (((i<4) && (i==j)) || ((i==4) && (j==0))) {
|
||||
for (re=0; re<fp->ofdm_symbol_size; re++)
|
||||
common_vars->beam_weights[eNB_id][i][j][re] = 0x00007fff;
|
||||
}
|
||||
else if (i>4) {
|
||||
for (re=0; re<fp->ofdm_symbol_size; re++)
|
||||
common_vars->beam_weights[eNB_id][i][j][re] = 0x00007fff/fp->nb_antennas_tx;
|
||||
}
|
||||
#ifdef DEBUG_PHY
|
||||
msg("[openair][LTE_PHY][INIT] lte_common_vars->beam_weights[%d][%d][%d] = %p (%d bytes)\n",
|
||||
eNB_id,i,j,common_vars->beam_weights[eNB_id][i][j],
|
||||
fp->ofdm_symbol_size*sizeof(int32_t));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
// RX vars
|
||||
if (eNB->node_function != NGFI_RCC_IF4p5) {
|
||||
common_vars->rxdata[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
common_vars->rxdata_7_5kHz[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
common_vars->rxdata[eNB_id] = (int32_t**)malloc16(fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
common_vars->rxdata_7_5kHz[eNB_id] = (int32_t**)malloc16(fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
}
|
||||
common_vars->rxdataF[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
|
||||
common_vars->rxdataF[eNB_id] = (int32_t**)malloc16(fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
|
||||
for (i=0; i<fp->nb_antennas_rx; i++) {
|
||||
if (eNB->node_function != NGFI_RCC_IF4p5) {
|
||||
common_vars->rxdata[eNB_id][i] = (int32_t*)malloc16_clear( fp->samples_per_tti*10*sizeof(int32_t) );
|
||||
common_vars->rxdata_7_5kHz[eNB_id][i] = (int32_t*)malloc16_clear( fp->samples_per_tti*sizeof(int32_t) );
|
||||
}
|
||||
|
||||
common_vars->rxdataF[eNB_id][i] = (int32_t*)malloc16_clear(sizeof(int32_t)*(fp->ofdm_symbol_size*fp->symbols_per_tti) );
|
||||
#ifdef DEBUG_PHY
|
||||
printf("[openair][LTE_PHY][INIT] common_vars->rxdata[%d][%d] = %p\n",eNB_id,i,common_vars->rxdata[eNB_id][i]);
|
||||
printf("[openair][LTE_PHY][INIT] common_vars->rxdata_7_5kHz[%d][%d] = %p\n",eNB_id,i,common_vars->rxdata_7_5kHz[eNB_id][i]);
|
||||
printf("[openair][LTE_PHY][INIT] common_vars->rxdata[%d][%d] = %p\n",eNB_id,i,common_vars->rxdata[eNB_id][i]);
|
||||
printf("[openair][LTE_PHY][INIT] common_vars->rxdata_7_5kHz[%d][%d] = %p\n",eNB_id,i,common_vars->rxdata_7_5kHz[eNB_id][i]);
|
||||
#endif
|
||||
}
|
||||
common_vars->rxdataF[eNB_id][i] = (int32_t*)malloc16_clear(sizeof(int32_t)*(fp->ofdm_symbol_size*fp->symbols_per_tti) );
|
||||
}
|
||||
|
||||
if (eNB->node_function != NGFI_RRU_IF4p5) {
|
||||
@@ -1386,5 +1505,5 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
|
||||
} // node_function != NGFI_RRU_IF4p5
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -33,7 +33,8 @@
|
||||
extern PHY_VARS_eNB *eNB;
|
||||
extern PHY_VARS_UE *UE;
|
||||
|
||||
void lte_param_init(unsigned char N_tx,
|
||||
void lte_param_init(unsigned char N_tx_port_eNB,
|
||||
unsigned char N_tx_phy,
|
||||
unsigned char N_rx,
|
||||
unsigned char transmission_mode,
|
||||
uint8_t extended_prefix_flag,
|
||||
@@ -70,9 +71,9 @@ void lte_param_init(unsigned char N_tx,
|
||||
frame_parms->Ncp_UL = extended_prefix_flag;
|
||||
frame_parms->Nid_cell = Nid_cell;
|
||||
frame_parms->nushift = Nid_cell%6;
|
||||
frame_parms->nb_antennas_tx = N_tx;
|
||||
frame_parms->nb_antennas_tx = N_tx_phy;
|
||||
frame_parms->nb_antennas_rx = N_rx;
|
||||
frame_parms->nb_antennas_tx_eNB = N_tx;
|
||||
frame_parms->nb_antenna_ports_eNB = N_tx_port_eNB;
|
||||
frame_parms->phich_config_common.phich_resource = oneSixth;
|
||||
frame_parms->phich_config_common.phich_duration = normal;
|
||||
frame_parms->tdd_config = tdd_config;
|
||||
@@ -81,7 +82,7 @@ void lte_param_init(unsigned char N_tx,
|
||||
// frame_parms->Bsrs = 0;
|
||||
// frame_parms->kTC = 0;44
|
||||
// frame_parms->n_RRC = 0;
|
||||
frame_parms->mode1_flag = (transmission_mode == 1)? 1 : 0;
|
||||
frame_parms->mode1_flag = (transmission_mode == 1 || transmission_mode ==7)? 1 : 0;
|
||||
|
||||
init_frame_parms(frame_parms,osf);
|
||||
|
||||
@@ -93,6 +94,9 @@ void lte_param_init(unsigned char N_tx,
|
||||
UE->frame_parms = *frame_parms;
|
||||
eNB->frame_parms = *frame_parms;
|
||||
|
||||
eNB->transmission_mode[0] = transmission_mode;
|
||||
UE->transmission_mode[0] = transmission_mode;
|
||||
|
||||
phy_init_lte_top(frame_parms);
|
||||
dump_frame_parms(frame_parms);
|
||||
|
||||
@@ -110,7 +114,8 @@ void lte_param_init(unsigned char N_tx,
|
||||
generate_phich_reg_mapping(&UE->frame_parms);
|
||||
|
||||
// DL power control init
|
||||
if (transmission_mode == 1) {
|
||||
//if (transmission_mode == 1) {
|
||||
if (transmission_mode == 1 || transmission_mode ==7) {
|
||||
eNB->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
|
||||
((eNB->frame_parms).pdsch_config_common).p_b = 0;
|
||||
UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
|
||||
|
||||
@@ -184,7 +184,7 @@ void dump_frame_parms(LTE_DL_FRAME_PARMS *frame_parms)
|
||||
printf("frame_parms->tdd_config=%d\n",frame_parms->tdd_config);
|
||||
printf("frame_parms->tdd_config_S=%d\n",frame_parms->tdd_config_S);
|
||||
printf("frame_parms->mode1_flag=%d\n",frame_parms->mode1_flag);
|
||||
printf("frame_parms->nb_antennas_tx_eNB(nb_antenna_ports)=%d\n",frame_parms->nb_antennas_tx_eNB);
|
||||
printf("frame_parms->nb_antenna_ports_eNB=%d\n",frame_parms->nb_antenna_ports_eNB);
|
||||
printf("frame_parms->nb_antennas_tx=%d\n",frame_parms->nb_antennas_tx);
|
||||
printf("frame_parms->nb_antennas_rx=%d\n",frame_parms->nb_antennas_rx);
|
||||
printf("frame_parms->ofdm_symbol_size=%d\n",frame_parms->ofdm_symbol_size);
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
filt_len = 16;
|
||||
|
||||
F = -3/4:1/4:7/4;
|
||||
F_l = zeros(8,filt_len);
|
||||
F_r = zeros(8,filt_len);
|
||||
F_m = zeros(8,filt_len);
|
||||
|
||||
F2 =-3/5:1/5:8/5;
|
||||
|
||||
for i=0:3
|
||||
F_l(i+1,:) = floor(16384*[F(8+i:-1:4) zeros(1,7-i) zeros(1,4)]);
|
||||
F_r(i+1,:) = floor(16384*[zeros(1,4+i) F(4:end-i) zeros(1,4)]);
|
||||
F_m(i+1,:) = floor(16384*[F(4-i:8) F(7:-1:1+i) zeros(1,4)]);
|
||||
end
|
||||
|
||||
for i=0:1
|
||||
F_l(i+5,:) = floor(16384*[F(8:-1:4-i) zeros(1,7-i) zeros(1,4)]);
|
||||
F_r(i+5,:) = floor(16384*[zeros(1,5+i) F2(5+i) F2(7:end-i) zeros(1,4)]);
|
||||
F_m(i+5,:) = floor(16384*[F(4-i:8) F2(8-i) F2(6:-1:1+i) zeros(1,4)]);
|
||||
end
|
||||
|
||||
for i=2:3
|
||||
F_l(i+5,:) = floor(16384*[F2(end:-1:7) F2(8-i) zeros(1,5) zeros(1,4)]);
|
||||
F_r(i+5,:) = floor(16384*[zeros(1,4+i) F(4:end-i) zeros(1,4)]);
|
||||
F_m(i+5,:) = floor(16384*[F2(4-i:6) F2(4+i) F(8:-1:1+i) zeros(1,4)]);
|
||||
end
|
||||
|
||||
|
||||
fd = fopen("filt16_32.h","w");
|
||||
|
||||
for i=0:3
|
||||
fprintf(fd,"short filt%d_l%d[%d] = {\n",filt_len,i,filt_len);
|
||||
fprintf(fd,"%d,",F_l(i+1,1:end-1));
|
||||
fprintf(fd,"%d};\n\n",F_l(i+1,end));
|
||||
|
||||
fprintf(fd,"short filt%d_r%d[%d] = {\n",filt_len,i,filt_len);
|
||||
fprintf(fd,"%d,",F_r(i+1,1:end-1));
|
||||
fprintf(fd,"%d};\n\n",F_r(i+1,end));
|
||||
|
||||
fprintf(fd,"short filt%d_m%d[%d] = {\n",filt_len,i,filt_len);
|
||||
fprintf(fd,"%d,",F_m(i+1,1:end-1));
|
||||
fprintf(fd,"%d};\n\n",F_m(i+1,end));
|
||||
end
|
||||
|
||||
for i=0:3
|
||||
fprintf(fd,"short filt%d_l%d_dc[%d] = {\n",filt_len,i,filt_len);
|
||||
fprintf(fd,"%d,",F_l(i+5,1:end-1));
|
||||
fprintf(fd,"%d};\n\n",F_l(i+5,end));
|
||||
|
||||
fprintf(fd,"short filt%d_r%d_dc[%d] = {\n",filt_len,i,filt_len);
|
||||
fprintf(fd,"%d,",F_r(i+5,1:end-1));
|
||||
fprintf(fd,"%d};\n\n",F_r(i+5,end));
|
||||
|
||||
fprintf(fd,"short filt%d_m%d_dc[%d] = {\n",filt_len,i,filt_len);
|
||||
fprintf(fd,"%d,",F_m(i+5,1:end-1));
|
||||
fprintf(fd,"%d};\n\n",F_m(i+5,end));
|
||||
end
|
||||
|
||||
fclose(fd);
|
||||
@@ -116,6 +116,12 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
uint8_t l,
|
||||
uint8_t symbol);
|
||||
|
||||
int lte_dl_bf_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
module_id_t eNB_id,
|
||||
uint8_t eNB_offset,
|
||||
uint8_t Ns,
|
||||
uint8_t p,
|
||||
uint8_t symbol);
|
||||
|
||||
int lte_dl_msbfn_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
module_id_t eNB_id,
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
short filt16_l0[16] = {
|
||||
16384,12288,8192,4096,0,0,0,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
short filt16_r0[16] = {
|
||||
0,0,0,0,0,4096,8192,12288,16384,20480,24576,28672,0,0,0,0};
|
||||
|
||||
short filt16_m0[16] = {
|
||||
0,4096,8192,12288,16384,12288,8192,4096,0,-4096,-8192,-12288,0,0,0,0};
|
||||
|
||||
short filt16_l1[16] = {
|
||||
20480,16384,12288,8192,4096,0,0,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
short filt16_r1[16] = {
|
||||
0,0,0,0,0,0,4096,8192,12288,16384,20480,24576,0,0,0,0};
|
||||
|
||||
short filt16_m1[16] = {
|
||||
-4096,0,4096,8192,12288,16384,12288,8192,4096,0,-4096,-8192,0,0,0,0};
|
||||
|
||||
short filt16_l2[16] = {
|
||||
24576,20480,16384,12288,8192,4096,0,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
short filt16_r2[16] = {
|
||||
0,0,0,0,0,0,0,4096,8192,12288,16384,20480,0,0,0,0};
|
||||
|
||||
short filt16_m2[16] = {
|
||||
-8192,-4096,0,4096,8192,12288,16384,12288,8192,4096,0,-4096,0,0,0,0};
|
||||
|
||||
short filt16_l3[16] = {
|
||||
28672,24576,20480,16384,12288,8192,4096,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
short filt16_r3[16] = {
|
||||
0,0,0,0,0,0,0,0,4096,8192,12288,16384,0,0,0,0};
|
||||
|
||||
short filt16_m3[16] = {
|
||||
-12288,-8192,-4096,0,4096,8192,12288,16384,12288,8192,4096,0,0,0,0,0};
|
||||
|
||||
short filt16_l0_dc[16] = {
|
||||
16384,12288,8192,4096,0,0,0,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
short filt16_r0_dc[16] = {
|
||||
0,0,0,0,0,3276,9830,13107,16384,19660,22937,26214,0,0,0,0};
|
||||
|
||||
short filt16_m0_dc[16] = {
|
||||
0,4096,8192,12288,16384,13107,6553,3276,0,-3277,-6554,-9831,0,0,0,0};
|
||||
|
||||
short filt16_l1_dc[16] = {
|
||||
16384,12288,8192,4096,0,-4096,0,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
short filt16_r1_dc[16] = {
|
||||
0,0,0,0,0,0,6553,9830,13107,16384,19660,22937,0,0,0,0};
|
||||
|
||||
short filt16_m1_dc[16] = {
|
||||
-4096,0,4096,8192,12288,16384,9830,6553,3276,0,-3277,-6554,0,0,0,0};
|
||||
|
||||
short filt16_l2_dc[16] = {
|
||||
26214,22937,19660,16384,13107,9830,6553,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
short filt16_r2_dc[16] = {
|
||||
0,0,0,0,0,0,0,4096,8192,12288,16384,20480,0,0,0,0};
|
||||
|
||||
short filt16_m2_dc[16] = {
|
||||
-6554,-3277,0,3276,6553,6553,16384,12288,8192,4096,0,-4096,0,0,0,0};
|
||||
|
||||
short filt16_l3_dc[16] = {
|
||||
26214,22937,19660,16384,13107,9830,3276,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
short filt16_r3_dc[16] = {
|
||||
0,0,0,0,0,0,0,0,4096,8192,12288,16384,0,0,0,0};
|
||||
|
||||
short filt16_m3_dc[16] = {
|
||||
-9831,-6554,-3277,0,3276,6553,9830,16384,12288,8192,4096,0,0,0,0,0};
|
||||
|
||||
short filt16_1[16] = {
|
||||
16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384};
|
||||
|
||||
short filt16_2l0[16] = {
|
||||
16384,12288,8192,4096,-4096,0,0,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
short filt16_2r0[16] = {
|
||||
0,4096,8192,12288,16384,20480,0,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
short filt16_2l1[16] = {
|
||||
20480,16384,12288,8192,4096,0,0,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
short filt16_2r1[16] = {
|
||||
-4096,0,4096,8192,12288,16384,0,0,0,0,0,0,0,0,0,0};
|
||||
@@ -0,0 +1,750 @@
|
||||
/*******************************************************************************
|
||||
OpenAirInterface
|
||||
Copyright(c) 1999 - 2014 Eurecom
|
||||
|
||||
OpenAirInterface is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
OpenAirInterface is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenAirInterface.The full GNU General Public License is
|
||||
included in this distribution in the file called "COPYING". If not,
|
||||
see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Contact Information
|
||||
OpenAirInterface Admin: openair_admin@eurecom.fr
|
||||
OpenAirInterface Tech : openair_tech@eurecom.fr
|
||||
OpenAirInterface Dev : openair4g-devel@eurecom.fr
|
||||
|
||||
Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
|
||||
|
||||
*******************************************************************************/
|
||||
#ifdef USER_MODE
|
||||
#include <string.h>
|
||||
#endif
|
||||
#include "defs.h"
|
||||
#include "PHY/defs.h"
|
||||
#include "filt16_32.h"
|
||||
//#define DEBUG_BF_CH
|
||||
|
||||
int lte_dl_bf_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
uint8_t eNB_id,
|
||||
uint8_t eNB_offset,
|
||||
unsigned char Ns,
|
||||
unsigned char p,
|
||||
unsigned char symbol)
|
||||
{
|
||||
|
||||
unsigned short rb,nb_rb=0;
|
||||
unsigned char aarx,l,lprime,nsymb,skip_half=0,sss_symb,pss_symb=0,rb_alloc_ind,harq_pid,uespec_pilots=0;
|
||||
int beamforming_mode, ch_offset;
|
||||
uint8_t subframe;
|
||||
int8_t uespec_nushift, uespec_poffset=0, pil_offset=0;
|
||||
uint8_t pilot0,pilot1,pilot2,pilot3;
|
||||
|
||||
short ch[2], *pil, *rxF, *dl_bf_ch, *dl_bf_ch_prev;
|
||||
short *fl, *fm, *fr, *fl_dc, *fm_dc, *fr_dc, *f1, *f2l, *f2r;
|
||||
|
||||
unsigned int *rballoc;
|
||||
int **rxdataF;
|
||||
int32_t **dl_bf_ch_estimates;
|
||||
int uespec_pilot[300];
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms;
|
||||
LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch[eNB_id];
|
||||
LTE_DL_UE_HARQ_t *dlsch0_harq;
|
||||
|
||||
harq_pid = dlsch_ue[0]->current_harq_pid;
|
||||
dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid];
|
||||
|
||||
if (((frame_parms->Ncp == NORMAL) && (symbol>=7)) ||
|
||||
((frame_parms->Ncp == EXTENDED) && (symbol>=6)))
|
||||
rballoc = dlsch0_harq->rb_alloc_odd;
|
||||
else
|
||||
rballoc = dlsch0_harq->rb_alloc_even;
|
||||
|
||||
rxdataF = phy_vars_ue->common_vars.rxdataF;
|
||||
|
||||
dl_bf_ch_estimates = phy_vars_ue->pdsch_vars[eNB_id]->dl_bf_ch_estimates;
|
||||
beamforming_mode = phy_vars_ue->transmission_mode[eNB_id]>6 ? phy_vars_ue->transmission_mode[eNB_id] : 0;
|
||||
|
||||
if (phy_vars_ue->high_speed_flag == 0) // use second channel estimate position for temporary storage
|
||||
ch_offset = frame_parms->ofdm_symbol_size;
|
||||
else
|
||||
ch_offset = frame_parms->ofdm_symbol_size*symbol;
|
||||
|
||||
|
||||
uespec_nushift = frame_parms->Nid_cell%3;
|
||||
subframe = Ns>>1;
|
||||
|
||||
|
||||
//generate ue specific pilots
|
||||
lprime = symbol/3-1;
|
||||
lte_dl_ue_spec_rx(phy_vars_ue,uespec_pilot,Ns,5,lprime,0,dlsch0_harq->nb_rb);
|
||||
//write_output("uespec_pilot_rx.m","uespec_pilot",uespec_pilot,300,1,1);
|
||||
|
||||
if (frame_parms->Ncp==0){
|
||||
if (symbol==3 || symbol==6 || symbol==9 || symbol==12)
|
||||
uespec_pilots = 1;
|
||||
} else{
|
||||
if (symbol==4 || symbol==7 || symbol==10)
|
||||
uespec_pilots = 1;
|
||||
}
|
||||
|
||||
if ((frame_parms->Ncp==0 && (symbol==6 ||symbol ==12)) || (frame_parms->Ncp==1 && symbol==7))
|
||||
uespec_poffset = 2;
|
||||
|
||||
if (phy_vars_ue->frame_parms.Ncp == 0) { // normal prefix
|
||||
pilot0 = 3;
|
||||
pilot1 = 6;
|
||||
pilot2 = 9;
|
||||
pilot3 = 12;
|
||||
} else { // extended prefix
|
||||
pilot0 = 4;
|
||||
pilot1 = 7;
|
||||
pilot2 = 10;
|
||||
}
|
||||
|
||||
//define the filter
|
||||
pil_offset = (uespec_nushift+uespec_poffset)%3;
|
||||
// printf("symbol=%d,pil_offset=%d\n",symbol,pil_offset);
|
||||
switch (pil_offset) {
|
||||
case 0:
|
||||
fl = filt16_l0;
|
||||
fm = filt16_m0;
|
||||
fr = filt16_r0;
|
||||
fl_dc = filt16_l0;
|
||||
fm_dc = filt16_m0;
|
||||
fr_dc = filt16_r0;
|
||||
f1 = filt16_1;
|
||||
f2l = filt16_2l0;
|
||||
f2r = filt16_2r0;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
fl = filt16_l1;
|
||||
fm = filt16_m1;
|
||||
fr = filt16_r1;
|
||||
fl_dc = filt16_l1;
|
||||
fm_dc = filt16_m1;
|
||||
fr_dc = filt16_r1;
|
||||
f1 = filt16_1;
|
||||
f2l = filt16_2l1;
|
||||
f2r = filt16_2r1;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
fl = filt16_l2;
|
||||
fm = filt16_m2;
|
||||
fr = filt16_r2;
|
||||
fl_dc = filt16_l2;
|
||||
fm_dc = filt16_m2;
|
||||
fr_dc = filt16_r2;
|
||||
f1 = filt16_1;
|
||||
f2l = filt16_2l0;
|
||||
f2r = filt16_2r0;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
fl = filt16_l3;
|
||||
fm = filt16_m3;
|
||||
fr = filt16_r3;
|
||||
fl_dc = filt16_l3;
|
||||
fm_dc = filt16_m3;
|
||||
fr_dc = filt16_r3;
|
||||
f1 = filt16_1;
|
||||
f2l = filt16_2l1;
|
||||
f2r = filt16_2r1;
|
||||
break;
|
||||
}
|
||||
// beamforming mode extension
|
||||
/* }
|
||||
else if (beamforming_mode==0)
|
||||
msg("lte_dl_bf_channel_estimation:No beamforming is performed.\n");
|
||||
else
|
||||
msg("lte_dl_bf_channel_estimation:Beamforming mode not supported yet.\n");*/
|
||||
|
||||
|
||||
l=symbol;
|
||||
nsymb = (frame_parms->Ncp==NORMAL) ? 14:12;
|
||||
|
||||
if (frame_parms->frame_type == TDD) { //TDD
|
||||
sss_symb = nsymb-1;
|
||||
pss_symb = 2;
|
||||
} else {
|
||||
sss_symb = (nsymb>>1)-2;
|
||||
pss_symb = (nsymb>>1)-1;
|
||||
}
|
||||
|
||||
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
|
||||
rxF = (short *)&rxdataF[aarx][pil_offset + frame_parms->first_carrier_offset + symbol*frame_parms->ofdm_symbol_size];
|
||||
pil = (short *)uespec_pilot;
|
||||
dl_bf_ch = (short *)&dl_bf_ch_estimates[aarx][ch_offset];
|
||||
|
||||
memset(dl_bf_ch,0,4*(frame_parms->ofdm_symbol_size));
|
||||
//memset(dl_bf_ch,0,2*(frame_parms->ofdm_symbol_size));
|
||||
|
||||
if (phy_vars_ue->high_speed_flag==0) {
|
||||
// multiply previous channel estimate by ch_est_alpha
|
||||
if (frame_parms->Ncp==0){
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch-(frame_parms->ofdm_symbol_size<<1),
|
||||
phy_vars_ue->ch_est_alpha,dl_bf_ch-(frame_parms->ofdm_symbol_size<<1),
|
||||
1,frame_parms->ofdm_symbol_size);
|
||||
} else {
|
||||
msg("lte_dl_bf_channel_estimation: beamforming channel estimation not supported for TM7 Extended CP.\n"); // phy_vars_ue->ch_est_beta should be defined equaling 1/3
|
||||
}
|
||||
}
|
||||
//estimation and interpolation
|
||||
|
||||
if ((frame_parms->N_RB_DL&1) == 0) { // even number of RBs
|
||||
for (rb=0; rb<frame_parms->N_RB_DL; rb++) {
|
||||
|
||||
if (rb < 32)
|
||||
rb_alloc_ind = (rballoc[0]>>rb) & 1;
|
||||
else if (rb < 64)
|
||||
rb_alloc_ind = (rballoc[1]>>(rb-32)) & 1;
|
||||
else if (rb < 96)
|
||||
rb_alloc_ind = (rballoc[2]>>(rb-64)) & 1;
|
||||
else if (rb < 100)
|
||||
rb_alloc_ind = (rballoc[3]>>(rb-96)) & 1;
|
||||
else
|
||||
rb_alloc_ind = 0;
|
||||
|
||||
// For second half of RBs skip DC carrier
|
||||
if (rb==(frame_parms->N_RB_DL>>1)) {
|
||||
rxF = (short *)&rxdataF[aarx][(1 + (symbol*(frame_parms->ofdm_symbol_size)))];
|
||||
}
|
||||
|
||||
if (rb_alloc_ind==1) {
|
||||
if (uespec_pilots==1) {
|
||||
if (beamforming_mode==7) {
|
||||
if (frame_parms->Ncp==0) {
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15);
|
||||
multadd_real_vector_complex_scalar(fl,ch,dl_bf_ch,16);
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15);
|
||||
multadd_real_vector_complex_scalar(fm,ch,dl_bf_ch,16);
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[16] - (int)pil[1]*rxF[17])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[17] + (int)pil[1]*rxF[16])>>15);
|
||||
multadd_real_vector_complex_scalar(fr,ch,dl_bf_ch,16);
|
||||
} else {
|
||||
msg("lte_dl_bf_channel_estimation(lte_dl_bf_channel_estimation.c):TM7 beamgforming channel estimation not supported for extented CP\n");
|
||||
exit(-1);
|
||||
}
|
||||
} else {
|
||||
msg("lte_dl_bf_channel_estimation(lte_dl_bf_channel_estimation.c): transmission mode not supported.\n");
|
||||
}
|
||||
}
|
||||
nb_rb++;
|
||||
}
|
||||
|
||||
rxF+=24;
|
||||
dl_bf_ch+=24;
|
||||
}
|
||||
} else { // Odd number of RBs
|
||||
for (rb=0; rb<frame_parms->N_RB_DL>>1; rb++) {
|
||||
skip_half=0;
|
||||
|
||||
if (rb < 32)
|
||||
rb_alloc_ind = (rballoc[0]>>rb) & 1;
|
||||
else if (rb < 64)
|
||||
rb_alloc_ind = (rballoc[1]>>(rb-32)) & 1;
|
||||
else if (rb < 96)
|
||||
rb_alloc_ind = (rballoc[2]>>(rb-64)) & 1;
|
||||
else if (rb < 100)
|
||||
rb_alloc_ind = (rballoc[3]>>(rb-96)) & 1;
|
||||
else
|
||||
rb_alloc_ind = 0;
|
||||
|
||||
// PBCH
|
||||
if ((subframe==0) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
//PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3
|
||||
if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4)))
|
||||
skip_half=1;
|
||||
else if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4)))
|
||||
skip_half=2;
|
||||
|
||||
//SSS
|
||||
if (((subframe==0)||(subframe==5)) &&
|
||||
(rb>((frame_parms->N_RB_DL>>1)-3)) &&
|
||||
(rb<((frame_parms->N_RB_DL>>1)+3)) &&
|
||||
(l==sss_symb) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
//SSS
|
||||
if (((subframe==0)||(subframe==5)) &&
|
||||
(rb==((frame_parms->N_RB_DL>>1)-3)) &&
|
||||
(l==sss_symb))
|
||||
skip_half=1;
|
||||
else if (((subframe==0)||(subframe==5)) &&
|
||||
(rb==((frame_parms->N_RB_DL>>1)+3)) &&
|
||||
(l==sss_symb))
|
||||
skip_half=2;
|
||||
|
||||
//PSS in subframe 0/5 if FDD
|
||||
if (frame_parms->frame_type == FDD) { //FDD
|
||||
if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb))
|
||||
skip_half=1;
|
||||
else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb))
|
||||
skip_half=2;
|
||||
}
|
||||
|
||||
if ((frame_parms->frame_type == TDD) && ((subframe==1)||(subframe==6))) { //TDD Subframe 1 and 6
|
||||
if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
if ((rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb))
|
||||
skip_half=1;
|
||||
else if ((rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb))
|
||||
skip_half=2;
|
||||
}
|
||||
|
||||
//printf("symbol=%d,pil_offset=%d\ni,rb_alloc_ind=%d,uespec_pilots=%d,beamforming_mode=%d,Ncp=%d,skip_half=%d\n",symbol,pil_offset,rb_alloc_ind,uespec_pilots,beamforming_mode,frame_parms->Ncp,skip_half);
|
||||
if (rb_alloc_ind==1) {
|
||||
if (uespec_pilots==1) {
|
||||
if (beamforming_mode==7) {
|
||||
if (frame_parms->Ncp==0) {
|
||||
if (skip_half==1) {
|
||||
if (pil_offset<2) {
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15);
|
||||
multadd_real_vector_complex_scalar(f2l,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15);
|
||||
multadd_real_vector_complex_scalar(f2r,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
|
||||
} else {
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15);
|
||||
multadd_real_vector_complex_scalar(f1,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
}
|
||||
} else if (skip_half==2) {
|
||||
if (pil_offset<2) {
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[16] - (int)pil[1]*rxF[17])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[17] + (int)pil[1]*rxF[16])>>15);
|
||||
multadd_real_vector_complex_scalar(f1,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
|
||||
} else {
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15);
|
||||
multadd_real_vector_complex_scalar(f2l,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[16] - (int)pil[1]*rxF[17])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[17] + (int)pil[1]*rxF[16])>>15);
|
||||
multadd_real_vector_complex_scalar(f2r,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
|
||||
}
|
||||
} else {
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15);
|
||||
multadd_real_vector_complex_scalar(fl,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
printf("symbol=%d,rxF[0]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[0],rxF[1],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15);
|
||||
multadd_real_vector_complex_scalar(fm,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
printf("symbol=%d,rxF[4]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[8],rxF[9],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[16] - (int)pil[1]*rxF[17])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[17] + (int)pil[1]*rxF[16])>>15);
|
||||
multadd_real_vector_complex_scalar(fr,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
printf("symbol=%d,rxF[8]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[16],rxF[17],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;
|
||||
|
||||
}
|
||||
} else {
|
||||
msg("lte_dl_bf_channel_estimation(lte_dl_bf_channel_estimation.c):TM7 beamgforming channel estimation not supported for extented CP\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
} else {
|
||||
msg("lte_dl_bf_channel_estimation(lte_dl_bf_channel_estimation.c):transmission mode not supported.\n");
|
||||
}
|
||||
}
|
||||
nb_rb++;
|
||||
}
|
||||
|
||||
rxF+=24;
|
||||
dl_bf_ch+=24;
|
||||
} // first half loop
|
||||
|
||||
// Do middle RB (around DC)
|
||||
if (rb < 32)
|
||||
rb_alloc_ind = (rballoc[0]>>rb) & 1;
|
||||
else if (rb < 64)
|
||||
rb_alloc_ind = (rballoc[1]>>(rb-32)) & 1;
|
||||
else if (rb < 96)
|
||||
rb_alloc_ind = (rballoc[2]>>(rb-64)) & 1;
|
||||
else if (rb < 100)
|
||||
rb_alloc_ind = (rballoc[3]>>(rb-96)) & 1;
|
||||
else
|
||||
rb_alloc_ind = 0;
|
||||
|
||||
// PBCH
|
||||
if ((subframe==0) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
//SSS
|
||||
if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
if (frame_parms->frame_type == FDD) {
|
||||
//PSS
|
||||
if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if ((frame_parms->frame_type == TDD) && ((subframe==1)||(subframe==6))) {
|
||||
//PSS
|
||||
if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
}
|
||||
|
||||
//printf("DC rb %d (%p)\n",rb,rxF);
|
||||
if (rb_alloc_ind==1) {
|
||||
if (pil_offset<2) {
|
||||
ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15);
|
||||
multadd_real_vector_complex_scalar(fl_dc,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
//printf("symbol=%d,rxF[0]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[0],rxF[1],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;;
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15);
|
||||
multadd_real_vector_complex_scalar(fm_dc,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
//printf("symbol=%d,rxF[4]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[8],rxF[9],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;;
|
||||
|
||||
rxF = (short *)&rxdataF[aarx][symbol*(frame_parms->ofdm_symbol_size)];
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[6] - (int)pil[1]*rxF[7])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[7] + (int)pil[1]*rxF[6])>>15);
|
||||
multadd_real_vector_complex_scalar(fr_dc,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
//printf("symbol=%d,rxF[3]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[6],rxF[7],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;;
|
||||
} else {
|
||||
ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15);
|
||||
multadd_real_vector_complex_scalar(fl_dc,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
//printf("symbol=%d,rxF[0]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[0],rxF[1],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;;
|
||||
|
||||
rxF = (short *)&rxdataF[aarx][symbol*(frame_parms->ofdm_symbol_size)];
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[2] - (int)pil[1]*rxF[3])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[3] + (int)pil[1]*rxF[2])>>15);
|
||||
multadd_real_vector_complex_scalar(fm_dc,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
//printf("symbol=%d,rxF[1]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[2],rxF[3],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;;
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[10] - (int)pil[1]*rxF[11])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[11] + (int)pil[1]*rxF[10])>>15);
|
||||
multadd_real_vector_complex_scalar(fr_dc,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
//printf("symbol=%d,rxF[5]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[10],rxF[11],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;;
|
||||
}
|
||||
} // rballoc==1
|
||||
else {
|
||||
rxF = (short *)&rxdataF[aarx][pil_offset+((symbol*(frame_parms->ofdm_symbol_size)))];
|
||||
}
|
||||
|
||||
rxF+=14+2*pil_offset;
|
||||
dl_bf_ch+=24;
|
||||
rb++;
|
||||
|
||||
for (; rb<frame_parms->N_RB_DL; rb++) {
|
||||
skip_half=0;
|
||||
|
||||
if (rb < 32)
|
||||
rb_alloc_ind = (rballoc[0]>>rb) & 1;
|
||||
else if (rb < 64)
|
||||
rb_alloc_ind = (rballoc[1]>>(rb-32)) & 1;
|
||||
else if (rb < 96)
|
||||
rb_alloc_ind = (rballoc[2]>>(rb-64)) & 1;
|
||||
else if (rb < 100)
|
||||
rb_alloc_ind = (rballoc[3]>>(rb-96)) & 1;
|
||||
else
|
||||
rb_alloc_ind = 0;
|
||||
|
||||
// PBCH
|
||||
if ((subframe==0) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=nsymb>>1) && (l<((nsymb>>1) + 4))) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
//PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3
|
||||
if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4)))
|
||||
skip_half=1;
|
||||
else if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4)))
|
||||
skip_half=2;
|
||||
|
||||
//SSS
|
||||
if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
//SSS
|
||||
if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==sss_symb))
|
||||
skip_half=1;
|
||||
else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb))
|
||||
skip_half=2;
|
||||
|
||||
if (frame_parms->frame_type == FDD) {
|
||||
//PSS
|
||||
if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
//PSS
|
||||
if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb))
|
||||
skip_half=1;
|
||||
else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb))
|
||||
skip_half=2;
|
||||
}
|
||||
|
||||
if ((frame_parms->frame_type == TDD) && ((subframe==1)||(subframe==6))) { //TDD Subframe 1 and 6
|
||||
if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
if ((rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb))
|
||||
skip_half=1;
|
||||
else if ((rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb))
|
||||
skip_half=2;
|
||||
}
|
||||
|
||||
if (rb_alloc_ind==1) {
|
||||
if (uespec_pilots==1) {
|
||||
if (beamforming_mode==7) {
|
||||
if (frame_parms->Ncp==0) {
|
||||
if (skip_half==1) {
|
||||
if (pil_offset<2) {
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15);
|
||||
multadd_real_vector_complex_scalar(f2l,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15);
|
||||
multadd_real_vector_complex_scalar(f2r,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15);
|
||||
multadd_real_vector_complex_scalar(f1,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
}
|
||||
} else if (skip_half==2) {
|
||||
if (pil_offset<2) {
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[16] - (int)pil[1]*rxF[17])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[17] + (int)pil[1]*rxF[16])>>15);
|
||||
multadd_real_vector_complex_scalar(f1,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
|
||||
} else {
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15);
|
||||
multadd_real_vector_complex_scalar(f2l,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[16] - (int)pil[1]*rxF[17])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[17] + (int)pil[1]*rxF[16])>>15);
|
||||
multadd_real_vector_complex_scalar(f2r,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
|
||||
}
|
||||
} else {
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15);
|
||||
multadd_real_vector_complex_scalar(fl,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
printf("symbol=%d,rxF[0]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[0],rxF[1],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15);
|
||||
multadd_real_vector_complex_scalar(fm,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
printf("symbol=%d,rxF[4]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[8],rxF[9],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[16] - (int)pil[1]*rxF[17])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[17] + (int)pil[1]*rxF[16])>>15);
|
||||
multadd_real_vector_complex_scalar(fr,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
printf("symbol=%d,rxF[8]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[16],rxF[17],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;
|
||||
|
||||
}
|
||||
} else {
|
||||
msg("lte_dl_bf_channel_estimation(lte_dl_bf_channel_estimation.c):TM7 beamgforming channel estimation not supported for extented CP\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
} else {
|
||||
msg("lte_dl_bf_channel_estimation(lte_dl_bf_channel_estimation.c):transmission mode not supported.\n");
|
||||
}
|
||||
}
|
||||
nb_rb++;
|
||||
}
|
||||
|
||||
rxF+=24;
|
||||
dl_bf_ch+=24;
|
||||
} // second half of RBs
|
||||
} // odd number of RBs
|
||||
|
||||
// Temporal Interpolation
|
||||
if (phy_vars_ue->perfect_ce == 0) {
|
||||
|
||||
dl_bf_ch = (short *)&dl_bf_ch_estimates[aarx][ch_offset];
|
||||
#ifdef DEBUG_BF_CH
|
||||
printf("[dlsch_bf_ch_est.c]:symbol %d, dl_bf_ch (%d,%d)\n",symbol,dl_bf_ch[0],dl_bf_ch[1]);
|
||||
#endif
|
||||
|
||||
if (phy_vars_ue->high_speed_flag == 0) {
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch,
|
||||
32767-phy_vars_ue->ch_est_alpha,
|
||||
dl_bf_ch-(frame_parms->ofdm_symbol_size<<1),0,frame_parms->ofdm_symbol_size);
|
||||
//printf("dlsch_bf_ch_est.c:symbol %d,dl_bf_ch (%d,%d)\n",symbol,*(dl_bf_ch-512*2),*(dl_bf_ch-512*2+1));
|
||||
} else { // high_speed_flag == 1
|
||||
if (beamforming_mode==7) {
|
||||
if (frame_parms->Ncp==0) {
|
||||
if (symbol == pilot0) {
|
||||
// printf("Interpolating %d->0\n",4-phy_vars_ue->lte_frame_parms.Ncp);
|
||||
// dl_bf_ch_prev = (short *)&dl_bf_ch_estimates[aarx][(4-phy_vars_ue->lte_frame_parms.Ncp)*(frame_parms->ofdm_symbol_size)];
|
||||
dl_bf_ch_prev = (short *)&dl_bf_ch_estimates[aarx][pilot3*(frame_parms->ofdm_symbol_size)];
|
||||
#ifdef DEBUG_BF_CH
|
||||
printf("[dlsch_bf_ch_est.c] symbol=%d, dl_bf_ch_prev=(%d,%d), dl_bf_ch=(%d,%d)\n", symbol, dl_bf_ch_prev[0], dl_bf_ch_prev[1], dl_bf_ch[0], dl_bf_ch[1]);
|
||||
#endif
|
||||
// pilot spacing 5 symbols (1/5,2/5,3/5,4/5 combination)
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch_prev,26214,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),1,frame_parms->ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch,6554,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),0,frame_parms->ofdm_symbol_size);
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch_prev,19661,dl_bf_ch-(3*2*(frame_parms->ofdm_symbol_size)),1,frame_parms->ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch,13107,dl_bf_ch-(3*2*(frame_parms->ofdm_symbol_size)),0,frame_parms->ofdm_symbol_size);
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch_prev,13107,dl_bf_ch-(2*((frame_parms->ofdm_symbol_size)<<1)),1,frame_parms->ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch,19661,dl_bf_ch-(2*((frame_parms->ofdm_symbol_size)<<1)),0,frame_parms->ofdm_symbol_size);
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch_prev,6554,dl_bf_ch-(2*(frame_parms->ofdm_symbol_size)),1,frame_parms->ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch,26214,dl_bf_ch-(2*(frame_parms->ofdm_symbol_size)),0,frame_parms->ofdm_symbol_size);
|
||||
} else if (symbol == pilot1) {
|
||||
dl_bf_ch_prev = (short *)&dl_bf_ch_estimates[aarx][pilot0*(frame_parms->ofdm_symbol_size)];
|
||||
#ifdef DEBUG_BF_CH
|
||||
printf("[dlsch_bf_ch_est.c] symbol=%d, dl_bf_ch_prev=(%d,%d), dl_bf_ch=(%d,%d)\n", symbol, dl_bf_ch_prev[0], dl_bf_ch_prev[1], dl_bf_ch[0], dl_bf_ch[1]);
|
||||
#endif
|
||||
|
||||
// pilot spacing 3 symbols (1/3,2/3 combination)
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch_prev,21845,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),1,frame_parms->ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch,10923,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),0,frame_parms->ofdm_symbol_size);
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch_prev,10923,dl_bf_ch_prev+(2*((frame_parms->ofdm_symbol_size)<<1)),1,frame_parms->ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch,21845,dl_bf_ch_prev+(2*((frame_parms->ofdm_symbol_size)<<1)),0,frame_parms->ofdm_symbol_size);
|
||||
|
||||
} else if (symbol == pilot2) {
|
||||
dl_bf_ch_prev = (short *)&dl_bf_ch_estimates[aarx][pilot1*(frame_parms->ofdm_symbol_size)];
|
||||
#ifdef DEBUG_BF_CH
|
||||
printf("[dlsch_bf_ch_est.c] symbol=%d, dl_bf_ch_prev=(%d,%d), dl_bf_ch=(%d,%d)\n", symbol, dl_bf_ch_prev[0], dl_bf_ch_prev[1], dl_bf_ch[0], dl_bf_ch[1]);
|
||||
#endif
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch_prev,21845,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),1,frame_parms->ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch,10923,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),0,frame_parms->ofdm_symbol_size);
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch_prev,10923,dl_bf_ch_prev+(2*((frame_parms->ofdm_symbol_size)<<1)),1,frame_parms->ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch,21845,dl_bf_ch_prev+(2*((frame_parms->ofdm_symbol_size)<<1)),0,frame_parms->ofdm_symbol_size);
|
||||
} else { // symbol == pilot3
|
||||
// printf("Interpolating 0->%d\n",4-phy_vars_ue->lte_frame_parms.Ncp);
|
||||
dl_bf_ch_prev = (short *)&dl_bf_ch_estimates[aarx][pilot2*(frame_parms->ofdm_symbol_size)];
|
||||
|
||||
// pilot spacing 3 symbols (1/3,2/3 combination)
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch_prev,21845,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),1,frame_parms->ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch,10923,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),0,frame_parms->ofdm_symbol_size);
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch_prev,10923,dl_bf_ch_prev+(2*((frame_parms->ofdm_symbol_size)<<1)),1,frame_parms->ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch,21845,dl_bf_ch_prev+(2*((frame_parms->ofdm_symbol_size)<<1)),0,frame_parms->ofdm_symbol_size);
|
||||
}
|
||||
|
||||
} else {
|
||||
msg("lte_dl_bf_channel_estimation:temporal interpolation not supported for TM7 extented CP.\n");
|
||||
}
|
||||
} else {
|
||||
msg("lte_dl_bf_channel_estimation:temporal interpolation not supported for this beamforming mode.\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
} //aarx
|
||||
|
||||
#ifdef DEBUG_BF_CH
|
||||
printf("[dlsch_bf_ch_est.c]: dl_bf_estimates[0][600] %d, %d \n",*(short *)&dl_bf_ch_estimates[0][600],*(short*)&phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_bf_ch_estimates[0][600]);
|
||||
#endif
|
||||
|
||||
return(0);
|
||||
|
||||
}
|
||||
@@ -35,9 +35,6 @@ int lte_dl_channel_estimation(PHY_VARS_UE *ue,
|
||||
unsigned char l,
|
||||
unsigned char symbol)
|
||||
{
|
||||
|
||||
|
||||
|
||||
int pilot[2][200] __attribute__((aligned(16)));
|
||||
unsigned char nu,aarx;
|
||||
unsigned short k;
|
||||
@@ -735,7 +732,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *ue,
|
||||
|
||||
// do ifft of channel estimate
|
||||
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++)
|
||||
for (p=0; p<ue->frame_parms.nb_antennas_tx_eNB; p++) {
|
||||
for (p=0; p<ue->frame_parms.nb_antenna_ports_eNB; p++) {
|
||||
if (ue->common_vars.dl_ch_estimates[eNB_offset][(p<<1)+aarx])
|
||||
idft((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][(p<<1)+aarx][8],
|
||||
(int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][(p<<1)+aarx],1);
|
||||
|
||||
@@ -102,7 +102,7 @@ int lte_est_freq_offset(int **dl_ch_estimates,
|
||||
{
|
||||
|
||||
int ch_offset, omega, dl_ch_shift;
|
||||
struct complex16 *omega_cpx;
|
||||
struct complex16 omega_cpx;
|
||||
double phase_offset;
|
||||
int freq_offset_est;
|
||||
unsigned char aa;
|
||||
@@ -142,9 +142,8 @@ int lte_est_freq_offset(int **dl_ch_estimates,
|
||||
// printf("Computing freq_offset\n");
|
||||
omega = dot_product(dl_ch,dl_ch_prev,(frame_parms->N_RB_DL/2 - 1)*12,dl_ch_shift);
|
||||
//omega = dot_product(dl_ch,dl_ch_prev,frame_parms->ofdm_symbol_size,15);
|
||||
omega_cpx = (struct complex16*) ω
|
||||
|
||||
// printf("omega (%d,%d)\n",omega_cpx->r,omega_cpx->i);
|
||||
omega_cpx.r = ((struct complex16*) &omega)->r;
|
||||
omega_cpx.i = ((struct complex16*) &omega)->i;
|
||||
|
||||
dl_ch = (int16_t *)&dl_ch_estimates[aa][(((frame_parms->N_RB_DL/2) + 1)*12) + ch_offset];
|
||||
|
||||
@@ -155,10 +154,12 @@ int lte_est_freq_offset(int **dl_ch_estimates,
|
||||
|
||||
// calculate omega = angle(conj(dl_ch)*dl_ch_prev))
|
||||
omega = dot_product(dl_ch,dl_ch_prev,((frame_parms->N_RB_DL/2) - 1)*12,dl_ch_shift);
|
||||
omega_cpx->r += ((struct complex16*) &omega)->r;
|
||||
omega_cpx->i += ((struct complex16*) &omega)->i;
|
||||
|
||||
omega_cpx.r += ((struct complex16*) &omega)->r;
|
||||
omega_cpx.i += ((struct complex16*) &omega)->i;
|
||||
|
||||
// phase_offset += atan2((double)omega_cpx->i,(double)omega_cpx->r);
|
||||
phase_offset += atan2((double)omega_cpx->i,(double)omega_cpx->r);
|
||||
phase_offset += atan2((double)omega_cpx.i,(double)omega_cpx.r);
|
||||
// LOG_I(PHY,"omega (%d,%d) -> %f\n",omega_cpx->r,omega_cpx->i,phase_offset);
|
||||
}
|
||||
|
||||
|
||||
@@ -446,7 +446,7 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
|
||||
// signal measurements
|
||||
for (eNB_id=0; eNB_id<ue->n_connected_eNB; eNB_id++) {
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
for (aatx=0; aatx<frame_parms->nb_antennas_tx_eNB; aatx++) {
|
||||
for (aatx=0; aatx<frame_parms->nb_antenna_ports_eNB; aatx++) {
|
||||
ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] =
|
||||
(signal_energy_nodc(&ue->common_vars.dl_ch_estimates[eNB_id][(aatx<<1) + aarx][0],
|
||||
(N_RB_DL*12)));
|
||||
|
||||
@@ -78,7 +78,7 @@ int32_t lte_ul_channel_estimation(PHY_VARS_eNB *eNB,
|
||||
int16_t ul_ch_estimates_re,ul_ch_estimates_im;
|
||||
int32_t rx_power_correction;
|
||||
|
||||
//uint8_t nb_antennas_rx = frame_parms->nb_antennas_tx_eNB;
|
||||
//uint8_t nb_antennas_rx = frame_parms->nb_antenna_ports_eNB;
|
||||
uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
|
||||
uint8_t cyclic_shift;
|
||||
|
||||
@@ -679,7 +679,7 @@ int32_t lte_srs_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
|
||||
int T_SFC,aa;
|
||||
int N_symb,symbol;
|
||||
uint8_t nb_antennas_rx = frame_parms->nb_antennas_tx_eNB;
|
||||
uint8_t nb_antennas_rx = frame_parms->nb_antenna_ports_eNB;
|
||||
#ifdef DEBUG_SRS
|
||||
char fname[40], vname[40];
|
||||
#endif
|
||||
|
||||
@@ -45,12 +45,15 @@ unsigned int lte_gold_generic(unsigned int *x1, unsigned int *x2, unsigned char
|
||||
|
||||
void lte_gold(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_table[20][2][14],uint16_t Nid_cell);
|
||||
|
||||
void lte_gold_ue_spec(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_uespec_table[2][20][2][21],uint16_t Nid_cell, uint16_t *n_idDMRS);
|
||||
|
||||
void lte_gold_ue_spec_port5(uint32_t lte_gold_uespec_port5_table[20][38],uint16_t Nid_cell, uint16_t n_rnti);
|
||||
|
||||
/*!\brief This function generates the LTE Gold sequence (36-211, Sec 7.2), specifically for DL UE-specific reference signals for antenna ports 7..14.
|
||||
@param frame_parms LTE DL Frame parameters
|
||||
@param lte_gold_uespec_table pointer to table where sequences are stored
|
||||
@param Nid_cell Cell Id (to compute sequences for local and adjacent cells)
|
||||
@param n_idDMRS Scrambling identity for TM10*/
|
||||
void lte_gold_ue_spec(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_uespec_table[2][20][2][21],uint16_t Nid_cell, uint16_t *n_idDMRS);
|
||||
|
||||
void lte_gold_mbsfn(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_mbsfn_table[10][3][42],uint16_t Nid_MBSFN);
|
||||
|
||||
@@ -77,16 +80,18 @@ int lte_dl_cell_spec(PHY_VARS_eNB *phy_vars_eNB,
|
||||
@param output Output vector for OFDM symbol (Frequency Domain)
|
||||
@param amp Q15 amplitude
|
||||
@param Ns Slot number (0..19)
|
||||
@param lprime symbol (0,1)
|
||||
@param p antenna index
|
||||
@param SS_flag Flag to indicate special subframe
|
||||
*/
|
||||
int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB,
|
||||
/*int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB,
|
||||
uint8_t UE_id,
|
||||
int32_t *output,
|
||||
short amp,
|
||||
uint8_t Ns,
|
||||
uint8_t lprime,
|
||||
uint8_t p,
|
||||
int SS_flag );
|
||||
int SS_flag);*/
|
||||
|
||||
/*! \brief This function generates the MBSFN reference signal sequence (36-211, Sec 6.10.1.2)
|
||||
@param phy_vars_eNB Pointer to eNB variables
|
||||
@@ -116,6 +121,24 @@ int lte_dl_cell_spec_rx(PHY_VARS_UE *phy_vars_ue,
|
||||
unsigned char l,
|
||||
unsigned char p);
|
||||
|
||||
/*!\brief This function generates the ue-specific reference signal
|
||||
* sequence (36-211, Sec 6.10.3.1) for beamforming channel estimation upon reception
|
||||
@param phy_vars_ue Pointer to UE variables
|
||||
@param output Output vector for OFDM symbol (Frequency Domain)
|
||||
@param Ns Slot number (0..19)
|
||||
@param p antenna port intex
|
||||
@param lprime symbol (0,1)
|
||||
@param SS_flag Flag to indicate special subframe
|
||||
@param nRB_PDSCH number of allocated PDSCH RBs
|
||||
*/
|
||||
int lte_dl_ue_spec_rx(PHY_VARS_UE *phy_vars_ue,
|
||||
int32_t *output,
|
||||
unsigned char Ns,
|
||||
unsigned char p,
|
||||
int lprime,
|
||||
int SS_flag,
|
||||
uint16_t nRB_PDSCH);
|
||||
|
||||
int lte_dl_mbsfn_rx(PHY_VARS_UE *phy_vars_ue,
|
||||
int *output,
|
||||
int subframe,
|
||||
|
||||
@@ -19,13 +19,13 @@
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file PHY/LTE_REFSIG/lte_dl_uespec.c
|
||||
/*! \file PHY/LTE_REFSIG/lte_dl_ue_spec.c
|
||||
* \brief Top-level routines for generating UE-specific Reference signals from 36-211, V11.3.0 2013-06
|
||||
* \author R. Knopp
|
||||
* \date 2014
|
||||
* \author R. Knopp X. Jiang
|
||||
* \date 2015
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \email: knopp@eurecom.fr
|
||||
* \email: knopp@eurecom.fr xiwen.jiang@eurecom.fr
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
@@ -44,18 +44,21 @@
|
||||
|
||||
int Wbar_NCP[8][4] = {{1,1,1,1},{1,-1,1,-1},{1,1,1,1},{1,-1,1,-1},{1,1,-1,-1},{-1,-1,1,1},{1,-1,-1,1},{-1,1,1,-1}};
|
||||
|
||||
/*
|
||||
int lte_dl_ue_spec(PHY_VARS_eNB *eNB,
|
||||
uint8_t UE_id,
|
||||
int32_t *output,
|
||||
short amp,
|
||||
uint8_t Ns,
|
||||
uint8_t lprime,
|
||||
uint8_t p,
|
||||
int SS_flag )
|
||||
int SS_flag)
|
||||
{
|
||||
|
||||
int32_t qpsk[4],nqpsk[4],*qpsk_p,*output_p;
|
||||
int16_t a;
|
||||
int w,lprime,ind,l,ind_dword,ind_qpsk_symb,nPRB;
|
||||
int32_t qpsk[4],nqpsk[4];
|
||||
int16_t k=0,a;
|
||||
int mprime,ind,ind_dword,ind_qpsk_symb;
|
||||
unsigned nushift,kprime;
|
||||
// LTE_eNB_DLSCH_t *dlsch = eNB->dlsch_eNB[UE_id][0];
|
||||
|
||||
a = (amp*ONE_OVER_SQRT2_Q15)>>15;
|
||||
@@ -77,172 +80,66 @@ int lte_dl_ue_spec(PHY_VARS_eNB *eNB,
|
||||
((short *)&nqpsk[3])[0] = a;
|
||||
((short *)&nqpsk[3])[1] = a;
|
||||
|
||||
if (p>=7) {
|
||||
if (p==5) {
|
||||
if (SS_flag==0) {
|
||||
if (eNB->frame_parms.Ncp == NORMAL) {
|
||||
// this is 3GPP 36-211 6.10.3.2, NORMAL CP, p>=7
|
||||
// this is 3GPP 36-211 6.10.3.2, NORMAL CP, p=5
|
||||
|
||||
nushift = eNB->frame_parms.Nid_cell%3;
|
||||
|
||||
if(lprime==0){
|
||||
kprime=nushift;
|
||||
}else{
|
||||
kprime=(nushift+2*lprime)%4;
|
||||
}
|
||||
|
||||
k = kprime+eNB->frame_parms.first_carrier_offset;
|
||||
printf("lte_dl_ue_spec:k=%d\n",k);
|
||||
|
||||
for (mprime=0;mprime<3*nRB_PDSCH-1;mprime++) {
|
||||
ind = 3*lprime*nRB_PDSCH+mprime;
|
||||
ind_dword = ind>>4;
|
||||
ind_qpsk_symb = ind&0xf;
|
||||
|
||||
// position output pointer to 5th symbol in slot
|
||||
output_p = output+(60*eNB->frame_parms.N_RB_DL);
|
||||
output[k] = qpsk[(phy_vars_UE->lte_gold_uespec_port5_table[Ns][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
//output[k] = 0xffffffff;
|
||||
|
||||
// shift to 2nd RE in PRB for p=7,8,11,13
|
||||
if ((p==7) || (p==8) || (p==11) || (p==13)) output_p++;
|
||||
|
||||
|
||||
for (lprime=0; lprime<2; lprime++) {
|
||||
|
||||
ind = 3*lprime*eNB->frame_parms.N_RB_DL;
|
||||
l = lprime + ((Ns&1)<<1);
|
||||
|
||||
// loop over pairs of PRBs, this is the periodicity of the W_bar_NCP sequence
|
||||
// unroll the computations for the 6 pilots, select qpsk or nqpsk as function of W_bar_NCP
|
||||
for (nPRB=0; nPRB<eNB->frame_parms.N_RB_DL; nPRB+=2) {
|
||||
|
||||
// First pilot
|
||||
w = Wbar_NCP[p-7][l];
|
||||
qpsk_p = (w==1) ? qpsk : nqpsk;
|
||||
|
||||
|
||||
ind_dword = ind>>4;
|
||||
ind_qpsk_symb = ind&0xf;
|
||||
|
||||
*output_p = qpsk_p[(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
|
||||
|
||||
#ifdef DEBUG_DL_UESPEC
|
||||
LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n",
|
||||
Ns,l,m,mprime_dword,mprime_qpsk_symb);
|
||||
LOG_D(PHY,"index = %d\n",(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
#endif
|
||||
|
||||
output_p+=5;
|
||||
ind++;
|
||||
|
||||
w = Wbar_NCP[p-7][3-l];
|
||||
qpsk_p = (w==1) ? qpsk : nqpsk;
|
||||
|
||||
// Second pilot
|
||||
ind_dword = ind>>4;
|
||||
ind_qpsk_symb = ind&0xf;
|
||||
|
||||
*output_p = qpsk_p[(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
|
||||
#ifdef DEBUG_DL_UESPEC
|
||||
LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n",
|
||||
Ns,l,m,mprime_dword,mprime_qpsk_symb);
|
||||
LOG_D(PHY,"index = %d\n",(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
#endif
|
||||
|
||||
output_p+=5;
|
||||
ind++;
|
||||
|
||||
w = Wbar_NCP[p-7][l];
|
||||
qpsk_p = (w==1) ? qpsk : nqpsk;
|
||||
// Third pilot
|
||||
ind_dword = ind>>4;
|
||||
ind_qpsk_symb = ind&0xf;
|
||||
|
||||
*output_p = qpsk_p[(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
|
||||
#ifdef DEBUG_DL_UESPEC
|
||||
LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n",
|
||||
Ns,l,m,mprime_dword,mprime_qpsk_symb);
|
||||
LOG_D(PHY,"index = %d\n",(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
#endif
|
||||
|
||||
output_p+=2;
|
||||
ind++;
|
||||
|
||||
// Fourth pilot
|
||||
w = Wbar_NCP[p-7][3-l];
|
||||
qpsk_p = (w==1) ? qpsk : nqpsk;
|
||||
|
||||
|
||||
ind_dword = ind>>4;
|
||||
ind_qpsk_symb = ind&0xf;
|
||||
|
||||
*output_p = qpsk_p[(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
|
||||
|
||||
#ifdef DEBUG_DL_UESPEC
|
||||
LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n",
|
||||
Ns,l,m,mprime_dword,mprime_qpsk_symb);
|
||||
LOG_D(PHY,"index = %d\n",(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
#endif
|
||||
|
||||
output_p+=5;
|
||||
ind++;
|
||||
|
||||
w = Wbar_NCP[p-7][l];
|
||||
qpsk_p = (w==1) ? qpsk : nqpsk;
|
||||
|
||||
// Fifth pilot
|
||||
ind_dword = ind>>4;
|
||||
ind_qpsk_symb = ind&0xf;
|
||||
|
||||
*output_p = qpsk_p[(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
|
||||
#ifdef DEBUG_DL_UESPEC
|
||||
LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n",
|
||||
Ns,l,m,mprime_dword,mprime_qpsk_symb);
|
||||
LOG_D(PHY,"index = %d\n",(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
#endif
|
||||
|
||||
output_p+=5;
|
||||
ind++;
|
||||
|
||||
w = Wbar_NCP[p-7][3-l];
|
||||
qpsk_p = (w==1) ? qpsk : nqpsk;
|
||||
// Sixth pilot
|
||||
ind_dword = ind>>4;
|
||||
ind_qpsk_symb = ind&0xf;
|
||||
|
||||
*output_p = qpsk_p[(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
|
||||
#ifdef DEBUG_DL_UESPEC
|
||||
LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n",
|
||||
Ns,l,m,mprime_dword,mprime_qpsk_symb);
|
||||
LOG_D(PHY,"index = %d\n",(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
#endif
|
||||
|
||||
output_p+=2;
|
||||
ind++;
|
||||
}
|
||||
k += 4;
|
||||
if (k >= eNB->frame_parms.ofdm_symbol_size) {
|
||||
k++; // skip DC carrier
|
||||
k-=eNB->frame_parms.ofdm_symbol_size;
|
||||
}
|
||||
} else {
|
||||
LOG_E(PHY,"Special subframe not supported for UE specific pilots yet\n");
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (p==5) {
|
||||
LOG_E(PHY,"p=5 not supported for UE specific pilots yet\n");
|
||||
} else if (p>=7) {
|
||||
printf("lte_dl_ue_spec:antenna ports >=7 not supported yet!\n");
|
||||
} else {
|
||||
LOG_E(PHY,"Illegal p %d UE specific pilots\n",p);
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
/*
|
||||
int lte_dl_cell_spec_rx(PHY_VARS_UE *phy_vars_ue,
|
||||
uint8_t eNB_offset,
|
||||
int *output,
|
||||
unsigned char Ns,
|
||||
unsigned char l,
|
||||
unsigned char p) {
|
||||
*/
|
||||
|
||||
|
||||
unsigned char mprime,mprime_dword,mprime_qpsk_symb,m;
|
||||
unsigned short k=0;
|
||||
unsigned int qpsk[4];
|
||||
int lte_dl_ue_spec_rx(PHY_VARS_UE *ue,
|
||||
int32_t *output,
|
||||
unsigned char Ns,
|
||||
unsigned char p,
|
||||
int lprime,
|
||||
int SS_flag,
|
||||
uint16_t nRB_PDSCH)
|
||||
{
|
||||
int32_t qpsk[4],nqpsk[4],*qpsk_p,*output_p;
|
||||
int w,mprime,ind,l,ind_dword,ind_qpsk_symb,nPRB;
|
||||
short pamp;
|
||||
|
||||
// Compute the correct pilot amplitude, sqrt_rho_b = Q3.13
|
||||
pamp = ONE_OVER_SQRT2_Q15;
|
||||
|
||||
// This includes complex conjugate for channel estimation
|
||||
|
||||
((short *)&qpsk[0])[0] = pamp;
|
||||
((short *)&qpsk[0])[1] = -pamp;
|
||||
((short *)&qpsk[1])[0] = -pamp;
|
||||
@@ -252,32 +149,169 @@ int lte_dl_cell_spec_rx(PHY_VARS_UE *phy_vars_ue,
|
||||
((short *)&qpsk[3])[0] = -pamp;
|
||||
((short *)&qpsk[3])[1] = pamp;
|
||||
|
||||
mprime = 110 - phy_vars_ue->frame_parms.N_RB_DL;
|
||||
((short *)&nqpsk[0])[0] = -pamp;
|
||||
((short *)&nqpsk[0])[1] = pamp;
|
||||
((short *)&nqpsk[1])[0] = pamp;
|
||||
((short *)&nqpsk[1])[1] = pamp;
|
||||
((short *)&nqpsk[2])[0] = -pamp;
|
||||
((short *)&nqpsk[2])[1] = -pamp;
|
||||
((short *)&nqpsk[3])[0] = pamp;
|
||||
((short *)&nqpsk[3])[1] = -pamp;
|
||||
|
||||
for (m=0;m<phy_vars_ue->frame_parms.N_RB_DL<<1;m++) {
|
||||
if (p>=7) {
|
||||
if (SS_flag==0) {
|
||||
if (ue->frame_parms.Ncp == NORMAL) {
|
||||
// this is 3GPP 36-211 6.10.3.2, NORMAL CP, p>=7
|
||||
|
||||
mprime_dword = mprime>>4;
|
||||
mprime_qpsk_symb = mprime&0xf;
|
||||
output_p = output;
|
||||
|
||||
// this is r_mprime from 3GPP 36-211 6.10.1.2
|
||||
output[k] = qpsk[(phy_vars_ue->lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3];
|
||||
#ifdef DEBUG_DL_CELL_SPEC
|
||||
printf("Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n",
|
||||
Ns,l,m,mprime_dword,mprime_qpsk_symb);
|
||||
printf("index = %d (k %d)\n",(phy_vars_ue->lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k);
|
||||
ind = 3*lprime*ue->frame_parms.N_RB_DL;
|
||||
l = lprime + ((Ns&1)<<1);
|
||||
|
||||
// loop over pairs of PRBs, this is the periodicity of the W_bar_NCP sequence
|
||||
// unroll the computations for the 6 pilots, select qpsk or nqpsk as function of W_bar_NCP
|
||||
for (nPRB=0; nPRB<ue->frame_parms.N_RB_DL; nPRB+=2) {
|
||||
|
||||
// First pilot
|
||||
w = Wbar_NCP[p-7][l];
|
||||
qpsk_p = (w==1) ? qpsk : nqpsk;
|
||||
|
||||
|
||||
ind_dword = ind>>4;
|
||||
ind_qpsk_symb = ind&0xf;
|
||||
|
||||
*output_p = qpsk_p[(ue->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
|
||||
|
||||
#ifdef DEBUG_DL_UESPEC
|
||||
LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n",
|
||||
Ns,l,m,ind_dword,ind_qpsk_symb);
|
||||
LOG_D(PHY,"index = %d\n",(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
#endif
|
||||
|
||||
mprime++;
|
||||
#ifdef DEBUG_DL_CELL_SPEC
|
||||
if (m<4)
|
||||
printf("Ns %d l %d output[%d] = (%d,%d)\n",Ns,l,k,((short *)&output[k])[0],((short *)&output[k])[1]);
|
||||
output_p++;
|
||||
ind++;
|
||||
|
||||
w = Wbar_NCP[p-7][3-l];
|
||||
qpsk_p = (w==1) ? qpsk : nqpsk;
|
||||
|
||||
// Second pilot
|
||||
ind_dword = ind>>4;
|
||||
ind_qpsk_symb = ind&0xf;
|
||||
|
||||
*output_p = qpsk_p[(ue->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
|
||||
#ifdef DEBUG_DL_UESPEC
|
||||
LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n",
|
||||
Ns,l,m,ind_dword,ind_qpsk_symb);
|
||||
LOG_D(PHY,"index = %d\n",(ue->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
#endif
|
||||
k++;
|
||||
|
||||
output_p++;
|
||||
ind++;
|
||||
|
||||
w = Wbar_NCP[p-7][l];
|
||||
qpsk_p = (w==1) ? qpsk : nqpsk;
|
||||
// Third pilot
|
||||
ind_dword = ind>>4;
|
||||
ind_qpsk_symb = ind&0xf;
|
||||
|
||||
*output_p = qpsk_p[(ue->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
|
||||
#ifdef DEBUG_DL_UESPEC
|
||||
LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n",
|
||||
Ns,l,m,ind_dword,ind_qpsk_symb);
|
||||
LOG_D(PHY,"index = %d\n",(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
#endif
|
||||
|
||||
output_p++;
|
||||
ind++;
|
||||
|
||||
// Fourth pilot
|
||||
w = Wbar_NCP[p-7][3-l];
|
||||
qpsk_p = (w==1) ? qpsk : nqpsk;
|
||||
|
||||
|
||||
ind_dword = ind>>4;
|
||||
ind_qpsk_symb = ind&0xf;
|
||||
|
||||
*output_p = qpsk_p[(ue->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
|
||||
|
||||
#ifdef DEBUG_DL_UESPEC
|
||||
LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n",
|
||||
Ns,l,m,ind_dword,ind_qpsk_symb);
|
||||
LOG_D(PHY,"index = %d\n",(ue->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
#endif
|
||||
|
||||
output_p++;
|
||||
ind++;
|
||||
|
||||
w = Wbar_NCP[p-7][l];
|
||||
qpsk_p = (w==1) ? qpsk : nqpsk;
|
||||
|
||||
// Fifth pilot
|
||||
ind_dword = ind>>4;
|
||||
ind_qpsk_symb = ind&0xf;
|
||||
|
||||
*output_p = qpsk_p[(ue->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
|
||||
#ifdef DEBUG_DL_UESPEC
|
||||
LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n",
|
||||
Ns,l,m,ind_dword,ind_qpsk_symb);
|
||||
LOG_D(PHY,"index = %d\n",(ue->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
#endif
|
||||
|
||||
output_p++;
|
||||
ind++;
|
||||
|
||||
w = Wbar_NCP[p-7][3-l];
|
||||
qpsk_p = (w==1) ? qpsk : nqpsk;
|
||||
// Sixth pilot
|
||||
ind_dword = ind>>4;
|
||||
ind_qpsk_symb = ind&0xf;
|
||||
|
||||
*output_p = qpsk_p[(ue->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
|
||||
#ifdef DEBUG_DL_UESPEC
|
||||
LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n",
|
||||
Ns,l,m,ind_dword,ind_qpsk_symb);
|
||||
LOG_D(PHY,"index = %d\n",(ue->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3);
|
||||
#endif
|
||||
|
||||
output_p++;
|
||||
ind++;
|
||||
}
|
||||
} else {
|
||||
LOG_E(PHY,"Special subframe not supported for UE specific pilots yet\n");
|
||||
}
|
||||
}
|
||||
} else if (p==5) {
|
||||
if (SS_flag==0) {
|
||||
output_p = output;
|
||||
|
||||
if (ue->frame_parms.Ncp == NORMAL) {
|
||||
for (mprime=0;mprime<3*nRB_PDSCH;mprime++) {
|
||||
|
||||
ind = 3*lprime*nRB_PDSCH+mprime;
|
||||
ind_dword = ind>>4;
|
||||
ind_qpsk_symb = ind&0xf;
|
||||
|
||||
*output_p = qpsk[(ue->lte_gold_uespec_port5_table[Ns][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
//printf("lprime=%d,ind=%d,Ns=%d,output_p=(%d,%d)\n",lprime,ind,Ns,((short *)&output_p[0])[0],((short *)&output_p[0])[1]);
|
||||
output_p++;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
LOG_E(PHY,"Illegal p %d UE specific pilots\n",p);
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#ifdef LTE_DL_CELL_SPEC_MAIN
|
||||
|
||||
@@ -303,51 +337,51 @@ main()
|
||||
|
||||
lte_gold(Nid_cell,Ncp);
|
||||
|
||||
lte_dl_cell_spec(output00,
|
||||
ONE_OVER_SQRT2_Q15,
|
||||
50,
|
||||
Nid_cell,
|
||||
Ncp,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
lte_dl_ue_spec(output00,
|
||||
ONE_OVER_SQRT2_Q15,
|
||||
50,
|
||||
Nid_cell,
|
||||
Ncp,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
|
||||
lte_dl_cell_spec(output10,
|
||||
ONE_OVER_SQRT2_Q15,
|
||||
50,
|
||||
Nid_cell,
|
||||
Ncp,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0);
|
||||
lte_dl_ue_spec(output10,
|
||||
ONE_OVER_SQRT2_Q15,
|
||||
50,
|
||||
Nid_cell,
|
||||
Ncp,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0);
|
||||
|
||||
lte_dl_cell_spec(output01,
|
||||
ONE_OVER_SQRT2_Q15,
|
||||
50,
|
||||
Nid_cell,
|
||||
Ncp,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0);
|
||||
lte_dl_ue_spec(output01,
|
||||
ONE_OVER_SQRT2_Q15,
|
||||
50,
|
||||
Nid_cell,
|
||||
Ncp,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0);
|
||||
|
||||
lte_dl_cell_spec(output11,
|
||||
ONE_OVER_SQRT2_Q15,
|
||||
50,
|
||||
Nid_cell,
|
||||
Ncp,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
0);
|
||||
lte_dl_ue_spec(output11,
|
||||
ONE_OVER_SQRT2_Q15,
|
||||
50,
|
||||
Nid_cell,
|
||||
Ncp,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
0);
|
||||
|
||||
|
||||
write_output("dl_cell_spec00.m","dl_cs00",output00,1024,1,1);
|
||||
write_output("dl_cell_spec01.m","dl_cs01",output01,1024,1,1);
|
||||
write_output("dl_cell_spec10.m","dl_cs10",output10,1024,1,1);
|
||||
write_output("dl_cell_spec11.m","dl_cs11",output11,1024,1,1);
|
||||
write_output("dl_ue_spec00.m","dl_cs00",output00,1024,1,1);
|
||||
write_output("dl_ue_spec01.m","dl_cs01",output01,1024,1,1);
|
||||
write_output("dl_ue_spec10.m","dl_cs10",output10,1024,1,1);
|
||||
write_output("dl_ue_spec11.m","dl_cs11",output11,1024,1,1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -131,6 +131,44 @@ void lte_gold_ue_spec(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_uespec_t
|
||||
}
|
||||
}
|
||||
|
||||
void lte_gold_ue_spec_port5(uint32_t lte_gold_uespec_port5_table[20][38],uint16_t Nid_cell, uint16_t n_rnti)
|
||||
{
|
||||
|
||||
unsigned char ns;
|
||||
unsigned int n,x1,x2;
|
||||
|
||||
|
||||
for (ns=0; ns<20; ns++) {
|
||||
|
||||
x2 = ((((ns>>1)+1)*((Nid_cell<<1)+1))<<16) + n_rnti;
|
||||
//x2 = frame_parms->Ncp + (Nid_cell<<1) + (1+(Nid_cell<<1))*(1 + (3*l) + (7*(1+ns))); //cinit
|
||||
//n = 0
|
||||
//printf("cinit (ns %d, l %d) => %d\n",ns,l,x2);
|
||||
x1 = 1+ (1<<31);
|
||||
x2=x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31);
|
||||
|
||||
//skip first 50 double words (1600 bits)
|
||||
//printf("n=0 : x1 %x, x2 %x\n",x1,x2);
|
||||
for (n=1; n<50; n++) {
|
||||
x1 = (x1>>1) ^ (x1>>4);
|
||||
x1 = x1 ^ (x1<<31) ^ (x1<<28);
|
||||
x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4);
|
||||
x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28);
|
||||
//printf("x1 : %x, x2 : %x\n",x1,x2);
|
||||
}
|
||||
|
||||
for (n=0; n<38; n++) {
|
||||
x1 = (x1>>1) ^ (x1>>4);
|
||||
x1 = x1 ^ (x1<<31) ^ (x1<<28);
|
||||
x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4);
|
||||
x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28);
|
||||
lte_gold_uespec_port5_table[ns][n] = x1^x2;
|
||||
//printf("n=%d : c %x\n",n,x1^x2);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/*! \brief gold sequenquence generator
|
||||
\param x1
|
||||
\param x2 this should be set to c_init if reset=1
|
||||
|
||||
@@ -66,7 +66,7 @@ uint32_t check_phich_reg(LTE_DL_FRAME_PARMS *frame_parms,uint32_t kprime,uint8_t
|
||||
|
||||
// compute REG based on symbol
|
||||
if ((lprime == 0)||
|
||||
((lprime==1)&&(frame_parms->nb_antennas_tx_eNB == 4)))
|
||||
((lprime==1)&&(frame_parms->nb_antenna_ports_eNB == 4)))
|
||||
mprime = kprime/6;
|
||||
else
|
||||
mprime = kprime>>2;
|
||||
@@ -293,7 +293,7 @@ void pdcch_interleaving(LTE_DL_FRAME_PARMS *frame_parms,int32_t **z, int32_t **w
|
||||
for (row=0; row<RCC; row++) {
|
||||
//printf("col %d, index %d, row %d\n",col,index,row);
|
||||
if (index>=ND) {
|
||||
for (a=0; a<frame_parms->nb_antennas_tx_eNB; a++) {
|
||||
for (a=0; a<frame_parms->nb_antenna_ports_eNB; a++) {
|
||||
//printf("a %d k %d\n",a,k);
|
||||
|
||||
wptr = &wtemp[a][k<<2];
|
||||
@@ -317,7 +317,7 @@ void pdcch_interleaving(LTE_DL_FRAME_PARMS *frame_parms,int32_t **z, int32_t **w
|
||||
// permutation
|
||||
for (i=0; i<Mquad; i++) {
|
||||
|
||||
for (a=0; a<frame_parms->nb_antennas_tx_eNB; a++) {
|
||||
for (a=0; a<frame_parms->nb_antenna_ports_eNB; a++) {
|
||||
|
||||
//wptr = &wtemp[a][i<<2];
|
||||
//wptr2 = &wbar[a][((i+frame_parms->Nid_cell)%Mquad)<<2];
|
||||
@@ -409,7 +409,7 @@ void pdcch_demapping(uint16_t *llr,uint16_t *wbar,LTE_DL_FRAME_PARMS *frame_parm
|
||||
re_offset0++;
|
||||
}
|
||||
}
|
||||
} else if ((lprime==1)&&(frame_parms->nb_antennas_tx_eNB == 4)) {
|
||||
} else if ((lprime==1)&&(frame_parms->nb_antenna_ports_eNB == 4)) {
|
||||
// LATER!!!!
|
||||
} else { // no pilots in this symbol
|
||||
kprime_mod12 = kprime%12;
|
||||
@@ -647,7 +647,7 @@ void pdcch_channel_level(int32_t **dl_ch_estimates_ext,
|
||||
int16x8_t *dl_ch128;
|
||||
int32x4_t *avg128P;
|
||||
#endif
|
||||
for (aatx=0; aatx<frame_parms->nb_antennas_tx_eNB; aatx++)
|
||||
for (aatx=0; aatx<frame_parms->nb_antenna_ports_eNB; aatx++)
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
//clear average level
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
@@ -825,7 +825,7 @@ void pdcch_detection_mrc_i(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t i;
|
||||
|
||||
if (frame_parms->nb_antennas_rx>1) {
|
||||
for (aatx=0; aatx<frame_parms->nb_antennas_tx_eNB; aatx++) {
|
||||
for (aatx=0; aatx<frame_parms->nb_antenna_ports_eNB; aatx++) {
|
||||
//if (frame_parms->mode1_flag && (aatx>0)) break;
|
||||
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
@@ -1126,6 +1126,9 @@ void pdcch_extract_rbs_dual(int32_t **rxdataF,
|
||||
int nushiftmod3 = frame_parms->nushift%3;
|
||||
|
||||
symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
|
||||
#ifdef DEBUG_DCI_DECODING
|
||||
LOG_I(PHY, "extract_rbs_dual: symbol_mod %d\n",symbol_mod);
|
||||
#endif
|
||||
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
|
||||
@@ -1388,8 +1391,8 @@ void pdcch_channel_compensation(int32_t **rxdataF_ext,
|
||||
if (symbol==0)
|
||||
pilots=1;
|
||||
|
||||
for (aatx=0; aatx<frame_parms->nb_antennas_tx_eNB; aatx++) {
|
||||
//if (frame_parms->mode1_flag && aatx>0) break; //if mode1_flag is set then there is only one stream to extract, independent of nb_antennas_tx_eNB
|
||||
for (aatx=0; aatx<frame_parms->nb_antenna_ports_eNB; aatx++) {
|
||||
//if (frame_parms->mode1_flag && aatx>0) break; //if mode1_flag is set then there is only one stream to extract, independent of nb_antenna_ports_eNB
|
||||
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
|
||||
@@ -1595,7 +1598,7 @@ void pdcch_detection_mrc(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t i;
|
||||
|
||||
if (frame_parms->nb_antennas_rx>1) {
|
||||
for (aatx=0; aatx<frame_parms->nb_antennas_tx_eNB; aatx++) {
|
||||
for (aatx=0; aatx<frame_parms->nb_antenna_ports_eNB; aatx++) {
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
rxdataF_comp128_0 = (__m128i *)&rxdataF_comp[(aatx<<1)][symbol*frame_parms->N_RB_DL*12];
|
||||
rxdataF_comp128_1 = (__m128i *)&rxdataF_comp[(aatx<<1)+1][symbol*frame_parms->N_RB_DL*12];
|
||||
@@ -1716,7 +1719,7 @@ int32_t rx_pdcch(LTE_UE_COMMON *common_vars,
|
||||
high_speed_flag,
|
||||
frame_parms);
|
||||
#endif //MU_RECEIVER
|
||||
} else if (frame_parms->nb_antennas_tx_eNB>1) {
|
||||
} else if (frame_parms->nb_antenna_ports_eNB>1) {
|
||||
pdcch_extract_rbs_dual(common_vars->rxdataF,
|
||||
common_vars->dl_ch_estimates[eNB_id],
|
||||
pdcch_vars[eNB_id]->rxdataF_ext,
|
||||
@@ -1742,7 +1745,7 @@ int32_t rx_pdcch(LTE_UE_COMMON *common_vars,
|
||||
|
||||
avgs = 0;
|
||||
|
||||
for (aatx=0; aatx<frame_parms->nb_antennas_tx_eNB; aatx++)
|
||||
for (aatx=0; aatx<frame_parms->nb_antenna_ports_eNB; aatx++)
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++)
|
||||
avgs = cmax(avgs,avgP[(aarx<<1)+aatx]);
|
||||
|
||||
@@ -1983,10 +1986,10 @@ uint8_t get_num_pdcch_symbols(uint8_t num_dci,
|
||||
//if ((9*numCCE) <= (frame_parms->N_RB_DL*2))
|
||||
if (numCCE <= get_nCCE(1, frame_parms, get_mi(frame_parms, subframe)))
|
||||
return(cmax(1,nCCEmin));
|
||||
//else if ((9*numCCE) <= (frame_parms->N_RB_DL*((frame_parms->nb_antennas_tx_eNB==4) ? 4 : 5)))
|
||||
//else if ((9*numCCE) <= (frame_parms->N_RB_DL*((frame_parms->nb_antenna_ports_eNB==4) ? 4 : 5)))
|
||||
else if (numCCE <= get_nCCE(2, frame_parms, get_mi(frame_parms, subframe)))
|
||||
return(cmax(2,nCCEmin));
|
||||
//else if ((9*numCCE) <= (frame_parms->N_RB_DL*((frame_parms->nb_antennas_tx_eNB==4) ? 7 : 8)))
|
||||
//else if ((9*numCCE) <= (frame_parms->N_RB_DL*((frame_parms->nb_antenna_ports_eNB==4) ? 7 : 8)))
|
||||
else if (numCCE <= get_nCCE(3, frame_parms, get_mi(frame_parms, subframe)))
|
||||
return(cmax(3,nCCEmin));
|
||||
else if (frame_parms->N_RB_DL<=10) {
|
||||
@@ -1996,10 +1999,10 @@ uint8_t get_num_pdcch_symbols(uint8_t num_dci,
|
||||
get_nCCE(2, frame_parms, get_mi(frame_parms, subframe)),
|
||||
get_nCCE(3, frame_parms, get_mi(frame_parms, subframe)));
|
||||
|
||||
if ((9*numCCE) <= (frame_parms->N_RB_DL*((frame_parms->nb_antennas_tx_eNB==4) ? 10 : 11)))
|
||||
if ((9*numCCE) <= (frame_parms->N_RB_DL*((frame_parms->nb_antenna_ports_eNB==4) ? 10 : 11)))
|
||||
return(4);
|
||||
} else { // extended CP
|
||||
if ((9*numCCE) <= (frame_parms->N_RB_DL*((frame_parms->nb_antennas_tx_eNB==4) ? 9 : 10)))
|
||||
if ((9*numCCE) <= (frame_parms->N_RB_DL*((frame_parms->nb_antenna_ports_eNB==4) ? 9 : 10)))
|
||||
return(4);
|
||||
}
|
||||
}
|
||||
@@ -2244,7 +2247,7 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci,
|
||||
// Copy REG to TX buffer
|
||||
|
||||
if ((lprime == 0)||
|
||||
((lprime==1)&&(frame_parms->nb_antennas_tx_eNB == 4))) {
|
||||
((lprime==1)&&(frame_parms->nb_antenna_ports_eNB == 4))) {
|
||||
// first symbol, or second symbol+4 TX antennas skip pilots
|
||||
|
||||
kprime_mod12 = kprime%12;
|
||||
@@ -2256,7 +2259,7 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci,
|
||||
if ((i!=(nushiftmod3))&&(i!=(nushiftmod3+3))) {
|
||||
txdataF[0][tti_offset+i] = wbar[0][mprime];
|
||||
|
||||
if (frame_parms->nb_antennas_tx_eNB > 1)
|
||||
if (frame_parms->nb_antenna_ports_eNB > 1)
|
||||
txdataF[1][tti_offset+i] = wbar[1][mprime];
|
||||
|
||||
#ifdef DEBUG_DCI_ENCODING
|
||||
@@ -2276,7 +2279,7 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci,
|
||||
for (i=0; i<4; i++) {
|
||||
txdataF[0][tti_offset+i] = wbar[0][mprime];
|
||||
|
||||
if (frame_parms->nb_antennas_tx_eNB > 1)
|
||||
if (frame_parms->nb_antenna_ports_eNB > 1)
|
||||
txdataF[1][tti_offset+i] = wbar[1][mprime];
|
||||
|
||||
#ifdef DEBUG_DCI_ENCODING
|
||||
@@ -2287,7 +2290,7 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci,
|
||||
} else {
|
||||
txdataF[0][tti_offset+0] = wbar[0][mprime];
|
||||
|
||||
if (frame_parms->nb_antennas_tx_eNB > 1)
|
||||
if (frame_parms->nb_antenna_ports_eNB > 1)
|
||||
txdataF[1][tti_offset+0] = wbar[1][mprime];
|
||||
|
||||
#ifdef DEBUG_DCI_ENCODING
|
||||
@@ -2296,7 +2299,7 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci,
|
||||
mprime++;
|
||||
txdataF[0][tti_offset+1] = wbar[0][mprime];
|
||||
|
||||
if (frame_parms->nb_antennas_tx_eNB > 1)
|
||||
if (frame_parms->nb_antenna_ports_eNB > 1)
|
||||
txdataF[1][tti_offset+1] = wbar[1][mprime];
|
||||
|
||||
#ifdef DEBUG_DCI_ENCODING
|
||||
@@ -2305,7 +2308,7 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci,
|
||||
mprime++;
|
||||
txdataF[0][tti_offset-frame_parms->ofdm_symbol_size+3] = wbar[0][mprime];
|
||||
|
||||
if (frame_parms->nb_antennas_tx_eNB > 1)
|
||||
if (frame_parms->nb_antenna_ports_eNB > 1)
|
||||
txdataF[1][tti_offset-frame_parms->ofdm_symbol_size+3] = wbar[1][mprime];
|
||||
|
||||
#ifdef DEBUG_DCI_ENCODING
|
||||
@@ -2315,7 +2318,7 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci,
|
||||
mprime++;
|
||||
txdataF[0][tti_offset-frame_parms->ofdm_symbol_size+4] = wbar[0][mprime];
|
||||
|
||||
if (frame_parms->nb_antennas_tx_eNB > 1)
|
||||
if (frame_parms->nb_antenna_ports_eNB > 1)
|
||||
txdataF[1][tti_offset-frame_parms->ofdm_symbol_size+4] = wbar[1][mprime];
|
||||
|
||||
#ifdef DEBUG_DCI_ENCODING
|
||||
@@ -2679,11 +2682,15 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars,
|
||||
|
||||
nCCE = get_nCCE(pdcch_vars[eNB_id]->num_pdcch_symbols,frame_parms,mi);
|
||||
|
||||
if (nCCE > get_nCCE(3,frame_parms,1))
|
||||
if (nCCE > get_nCCE(3,frame_parms,1)) {
|
||||
LOG_D(PHY,"skip DCI decoding: nCCE=%d > get_nCCE(3,frame_parms,1)=%d\n", nCCE, get_nCCE(3,frame_parms,1));
|
||||
return;
|
||||
}
|
||||
|
||||
if (nCCE<L2)
|
||||
if (nCCE<L2) {
|
||||
LOG_D(PHY,"skip DCI decoding: nCCE=%d < L2=%d\n", nCCE, L2);
|
||||
return;
|
||||
}
|
||||
|
||||
if (do_common == 1) {
|
||||
nb_candidates = (L2==4) ? 4 : 2;
|
||||
@@ -2857,7 +2864,7 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars,
|
||||
}
|
||||
}
|
||||
|
||||
LOG_D(PHY,"DCI decoding CRNTI [format_c: %d, nCCE[subframe: %d]: %d ]\n",format_c, subframe, pdcch_vars[eNB_id]->nCCE[subframe]);
|
||||
LOG_D(PHY,"DCI decoding CRNTI [format: %d, nCCE[subframe: %d]: %d ], AggregationLevel %d \n",format_c, subframe, pdcch_vars[eNB_id]->nCCE[subframe],L2);
|
||||
// memcpy(&dci_alloc[*dci_cnt].dci_pdu[0],dci_decoded_output,sizeof_bytes);
|
||||
|
||||
|
||||
@@ -2929,12 +2936,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
||||
format1_size_bits = sizeof_DCI1_1_5MHz_TDD_t;
|
||||
format1_size_bytes = sizeof(DCI1_1_5MHz_TDD_t);
|
||||
|
||||
if (frame_parms->nb_antennas_tx_eNB == 2) {
|
||||
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
||||
format2_size_bits = sizeof_DCI2_1_5MHz_2A_TDD_t;
|
||||
format2_size_bytes = sizeof(DCI2_1_5MHz_2A_TDD_t);
|
||||
format2A_size_bits = sizeof_DCI2A_1_5MHz_2A_TDD_t;
|
||||
format2A_size_bytes = sizeof(DCI2A_1_5MHz_2A_TDD_t);
|
||||
} else if (frame_parms->nb_antennas_tx_eNB == 4) {
|
||||
} else if (frame_parms->nb_antenna_ports_eNB == 4) {
|
||||
format2_size_bits = sizeof_DCI2_1_5MHz_4A_TDD_t;
|
||||
format2_size_bytes = sizeof(DCI2_1_5MHz_4A_TDD_t);
|
||||
format2A_size_bits = sizeof_DCI2A_1_5MHz_4A_TDD_t;
|
||||
@@ -2950,12 +2957,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
||||
format1_size_bits = sizeof_DCI1_1_5MHz_FDD_t;
|
||||
format1_size_bytes = sizeof(DCI1_1_5MHz_FDD_t);
|
||||
|
||||
if (frame_parms->nb_antennas_tx_eNB == 2) {
|
||||
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
||||
format2_size_bits = sizeof_DCI2_1_5MHz_2A_FDD_t;
|
||||
format2_size_bytes = sizeof(DCI2_1_5MHz_2A_FDD_t);
|
||||
format2A_size_bits = sizeof_DCI2A_1_5MHz_2A_FDD_t;
|
||||
format2A_size_bytes = sizeof(DCI2A_1_5MHz_2A_FDD_t);
|
||||
} else if (frame_parms->nb_antennas_tx_eNB == 4) {
|
||||
} else if (frame_parms->nb_antenna_ports_eNB == 4) {
|
||||
format2_size_bits = sizeof_DCI2_1_5MHz_4A_FDD_t;
|
||||
format2_size_bytes = sizeof(DCI2_1_5MHz_4A_FDD_t);
|
||||
format2A_size_bits = sizeof_DCI2A_1_5MHz_4A_FDD_t;
|
||||
@@ -2977,12 +2984,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
||||
format1_size_bits = sizeof_DCI1_5MHz_TDD_t;
|
||||
format1_size_bytes = sizeof(DCI1_5MHz_TDD_t);
|
||||
|
||||
if (frame_parms->nb_antennas_tx_eNB == 2) {
|
||||
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
||||
format2_size_bits = sizeof_DCI2_5MHz_2A_TDD_t;
|
||||
format2_size_bytes = sizeof(DCI2_5MHz_2A_TDD_t);
|
||||
format2A_size_bits = sizeof_DCI2A_5MHz_2A_TDD_t;
|
||||
format2A_size_bytes = sizeof(DCI2A_5MHz_2A_TDD_t);
|
||||
} else if (frame_parms->nb_antennas_tx_eNB == 4) {
|
||||
} else if (frame_parms->nb_antenna_ports_eNB == 4) {
|
||||
format2_size_bits = sizeof_DCI2_5MHz_4A_TDD_t;
|
||||
format2_size_bytes = sizeof(DCI2_5MHz_4A_TDD_t);
|
||||
format2A_size_bits = sizeof_DCI2A_5MHz_4A_TDD_t;
|
||||
@@ -2998,12 +3005,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
||||
format1_size_bits = sizeof_DCI1_5MHz_FDD_t;
|
||||
format1_size_bytes = sizeof(DCI1_5MHz_FDD_t);
|
||||
|
||||
if (frame_parms->nb_antennas_tx_eNB == 2) {
|
||||
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
||||
format2_size_bits = sizeof_DCI2_5MHz_2A_FDD_t;
|
||||
format2_size_bytes = sizeof(DCI2_5MHz_2A_FDD_t);
|
||||
format2A_size_bits = sizeof_DCI2A_5MHz_2A_FDD_t;
|
||||
format2A_size_bytes = sizeof(DCI2A_5MHz_2A_FDD_t);
|
||||
} else if (frame_parms->nb_antennas_tx_eNB == 4) {
|
||||
} else if (frame_parms->nb_antenna_ports_eNB == 4) {
|
||||
format2_size_bits = sizeof_DCI2_5MHz_4A_FDD_t;
|
||||
format2_size_bytes = sizeof(DCI2_5MHz_4A_FDD_t);
|
||||
format2A_size_bits = sizeof_DCI2A_5MHz_4A_FDD_t;
|
||||
@@ -3024,12 +3031,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
||||
format1_size_bits = sizeof_DCI1_10MHz_TDD_t;
|
||||
format1_size_bytes = sizeof(DCI1_10MHz_TDD_t);
|
||||
|
||||
if (frame_parms->nb_antennas_tx_eNB == 2) {
|
||||
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
||||
format2_size_bits = sizeof_DCI2_10MHz_2A_TDD_t;
|
||||
format2_size_bytes = sizeof(DCI2_10MHz_2A_TDD_t);
|
||||
format2A_size_bits = sizeof_DCI2A_10MHz_2A_TDD_t;
|
||||
format2A_size_bytes = sizeof(DCI2A_10MHz_2A_TDD_t);
|
||||
} else if (frame_parms->nb_antennas_tx_eNB == 4) {
|
||||
} else if (frame_parms->nb_antenna_ports_eNB == 4) {
|
||||
format2_size_bits = sizeof_DCI2_10MHz_4A_TDD_t;
|
||||
format2_size_bytes = sizeof(DCI2_10MHz_4A_TDD_t);
|
||||
format2A_size_bits = sizeof_DCI2A_10MHz_4A_TDD_t;
|
||||
@@ -3045,12 +3052,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
||||
format1_size_bits = sizeof_DCI1_10MHz_FDD_t;
|
||||
format1_size_bytes = sizeof(DCI1_10MHz_FDD_t);
|
||||
|
||||
if (frame_parms->nb_antennas_tx_eNB == 2) {
|
||||
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
||||
format2_size_bits = sizeof_DCI2_10MHz_2A_FDD_t;
|
||||
format2_size_bytes = sizeof(DCI2_10MHz_2A_FDD_t);
|
||||
format2A_size_bits = sizeof_DCI2A_10MHz_2A_FDD_t;
|
||||
format2A_size_bytes = sizeof(DCI2A_10MHz_2A_FDD_t);
|
||||
} else if (frame_parms->nb_antennas_tx_eNB == 4) {
|
||||
} else if (frame_parms->nb_antenna_ports_eNB == 4) {
|
||||
format2_size_bits = sizeof_DCI2_10MHz_4A_FDD_t;
|
||||
format2_size_bytes = sizeof(DCI2_10MHz_4A_FDD_t);
|
||||
format2A_size_bits = sizeof_DCI2A_10MHz_4A_FDD_t;
|
||||
@@ -3071,12 +3078,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
||||
format1_size_bits = sizeof_DCI1_20MHz_TDD_t;
|
||||
format1_size_bytes = sizeof(DCI1_20MHz_TDD_t);
|
||||
|
||||
if (frame_parms->nb_antennas_tx_eNB == 2) {
|
||||
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
||||
format2_size_bits = sizeof_DCI2_20MHz_2A_TDD_t;
|
||||
format2_size_bytes = sizeof(DCI2_20MHz_2A_TDD_t);
|
||||
format2A_size_bits = sizeof_DCI2A_20MHz_2A_TDD_t;
|
||||
format2A_size_bytes = sizeof(DCI2A_20MHz_2A_TDD_t);
|
||||
} else if (frame_parms->nb_antennas_tx_eNB == 4) {
|
||||
} else if (frame_parms->nb_antenna_ports_eNB == 4) {
|
||||
format2_size_bits = sizeof_DCI2_20MHz_4A_TDD_t;
|
||||
format2_size_bytes = sizeof(DCI2_20MHz_4A_TDD_t);
|
||||
format2A_size_bits = sizeof_DCI2A_20MHz_4A_TDD_t;
|
||||
@@ -3092,12 +3099,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
||||
format1_size_bits = sizeof_DCI1_20MHz_FDD_t;
|
||||
format1_size_bytes = sizeof(DCI1_20MHz_FDD_t);
|
||||
|
||||
if (frame_parms->nb_antennas_tx_eNB == 2) {
|
||||
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
||||
format2_size_bits = sizeof_DCI2_20MHz_2A_FDD_t;
|
||||
format2_size_bytes = sizeof(DCI2_20MHz_2A_FDD_t);
|
||||
format2A_size_bits = sizeof_DCI2A_20MHz_2A_FDD_t;
|
||||
format2A_size_bytes = sizeof(DCI2A_20MHz_2A_FDD_t);
|
||||
} else if (frame_parms->nb_antennas_tx_eNB == 4) {
|
||||
} else if (frame_parms->nb_antenna_ports_eNB == 4) {
|
||||
format2_size_bits = sizeof_DCI2_20MHz_4A_FDD_t;
|
||||
format2_size_bytes = sizeof(DCI2_20MHz_4A_FDD_t);
|
||||
format2A_size_bits = sizeof_DCI2A_20MHz_4A_FDD_t;
|
||||
@@ -3248,7 +3255,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
||||
SI_RNTI,
|
||||
ra_rnti,
|
||||
P_RNTI,
|
||||
3,
|
||||
0,
|
||||
format1A,
|
||||
format1A,
|
||||
format1A,
|
||||
@@ -3277,7 +3284,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
||||
SI_RNTI,
|
||||
ra_rnti,
|
||||
P_RNTI,
|
||||
2,
|
||||
1,
|
||||
format1A,
|
||||
format1A,
|
||||
format1A,
|
||||
@@ -3310,7 +3317,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
||||
SI_RNTI,
|
||||
ra_rnti,
|
||||
P_RNTI,
|
||||
1,
|
||||
2,
|
||||
format1A,
|
||||
format1A,
|
||||
format1A,
|
||||
@@ -3339,7 +3346,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
||||
SI_RNTI,
|
||||
ra_rnti,
|
||||
P_RNTI,
|
||||
0,
|
||||
3,
|
||||
format1A,
|
||||
format1A,
|
||||
format1A,
|
||||
@@ -3361,7 +3368,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
||||
|
||||
|
||||
// These are for CRNTI based on transmission mode
|
||||
if (tmode < 3) {
|
||||
if ((tmode < 3) || (tmode == 7)) {
|
||||
// Now check UE_SPEC format 1 search spaces at aggregation 1
|
||||
old_dci_cnt=dci_cnt;
|
||||
dci_decoding_procedure0(pdcch_vars,0,subframe,
|
||||
@@ -3730,7 +3737,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
||||
&CCEmap1,
|
||||
&CCEmap2);
|
||||
//#endif
|
||||
} else if (tmode >=5) { // This is MU-MIMO
|
||||
} else if ((tmode==5) || (tmode==6)) { // This is MU-MIMO
|
||||
|
||||
// Now check UE_SPEC format 1E_2A_M10PRB search spaces aggregation 1
|
||||
#ifdef DEBUG_DCI_DECODING
|
||||
|
||||
@@ -36,7 +36,10 @@
|
||||
#include "PHY/vars.h"
|
||||
#endif
|
||||
#include "assertions.h"
|
||||
|
||||
|
||||
#include "LAYER2/MAC/extern.h"
|
||||
#include "LAYER2/MAC/defs.h"
|
||||
|
||||
//#define DEBUG_DCI
|
||||
|
||||
uint32_t localRIV2alloc_LUT6[32];
|
||||
@@ -862,7 +865,8 @@ int generate_eNB_dlsch_params_from_dci(int frame,
|
||||
uint16_t si_rnti,
|
||||
uint16_t ra_rnti,
|
||||
uint16_t p_rnti,
|
||||
uint16_t DL_pmi_single)
|
||||
uint16_t DL_pmi_single,
|
||||
uint8_t beamforming_mode)
|
||||
{
|
||||
|
||||
uint8_t harq_pid = UINT8_MAX;
|
||||
@@ -1230,7 +1234,13 @@ int generate_eNB_dlsch_params_from_dci(int frame,
|
||||
|
||||
dlsch0_harq->Nl = 1;
|
||||
// dlsch[0]->layer_index = 0;
|
||||
dlsch0_harq->mimo_mode = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI;
|
||||
if (beamforming_mode == 0)
|
||||
dlsch0_harq->mimo_mode = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI;
|
||||
else if (beamforming_mode == 7)
|
||||
dlsch0_harq->mimo_mode = TM7;
|
||||
else
|
||||
LOG_E(PHY,"Invalid beamforming mode %dL\n", beamforming_mode);
|
||||
|
||||
dlsch0_harq->dl_power_off = 1;
|
||||
/*
|
||||
if (dlsch[0]->harq_processes[harq_pid]->first_tx == 1) {
|
||||
@@ -1260,6 +1270,11 @@ int generate_eNB_dlsch_params_from_dci(int frame,
|
||||
dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][NPRB-1];
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_E(PHY,"DL Received HarqReTx round=%d mcs=%d rballoc=%d rv=%d \n",
|
||||
dlsch0_harq->round,mcs,rballoc,rv);
|
||||
}
|
||||
|
||||
|
||||
dlsch[0]->current_harq_pid = harq_pid;
|
||||
@@ -2674,7 +2689,7 @@ int generate_eNB_dlsch_params_from_dci(int frame,
|
||||
// compute DL power control parameters
|
||||
computeRhoA_eNB(pdsch_config_dedicated, dlsch[0],dlsch0_harq->dl_power_off);
|
||||
|
||||
computeRhoB_eNB(pdsch_config_dedicated,&(frame_parms->pdsch_config_common),frame_parms->nb_antennas_tx_eNB,dlsch[0],dlsch0_harq->dl_power_off);
|
||||
computeRhoB_eNB(pdsch_config_dedicated,&(frame_parms->pdsch_config_common),frame_parms->nb_antenna_ports_eNB,dlsch[0],dlsch0_harq->dl_power_off);
|
||||
|
||||
return(0);
|
||||
}
|
||||
@@ -3440,7 +3455,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci)
|
||||
|
||||
if ((frame_parms->frame_type == TDD) &&
|
||||
(frame_parms->tdd_config>0)) {
|
||||
if (frame_parms->nb_antennas_tx_eNB == 2) {
|
||||
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
||||
switch(frame_parms->N_RB_DL) {
|
||||
case 6:
|
||||
LOG_D(PHY,"DCI format2A 2 antennas (FDD 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n",
|
||||
@@ -3519,7 +3534,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci)
|
||||
DevParam (frame_parms->N_RB_DL, 0, 0);
|
||||
break;
|
||||
}
|
||||
} else if (frame_parms->nb_antennas_tx_eNB == 4) {
|
||||
} else if (frame_parms->nb_antenna_ports_eNB == 4) {
|
||||
switch(frame_parms->N_RB_DL) {
|
||||
case 6:
|
||||
LOG_D(PHY,"DCI format2A 4 antennas (TDD 1.5 MHz), rnti %x (%llx): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
|
||||
@@ -3604,7 +3619,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci)
|
||||
}
|
||||
}
|
||||
} else if (frame_parms->frame_type == FDD) {
|
||||
if (frame_parms->nb_antennas_tx_eNB == 2) {
|
||||
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
||||
switch(frame_parms->N_RB_DL) {
|
||||
case 6:
|
||||
LOG_D(PHY,"DCI format2A 2 antennas (FDD, 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n",
|
||||
@@ -3678,7 +3693,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci)
|
||||
DevParam (frame_parms->N_RB_DL, 0, 0);
|
||||
break;
|
||||
}
|
||||
} else if (frame_parms->nb_antennas_tx_eNB == 4) {
|
||||
} else if (frame_parms->nb_antenna_ports_eNB == 4) {
|
||||
switch(frame_parms->N_RB_DL) {
|
||||
|
||||
case 6:
|
||||
@@ -3802,7 +3817,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
|
||||
uint16_t si_rnti,
|
||||
uint16_t ra_rnti,
|
||||
uint16_t p_rnti)
|
||||
uint16_t p_rnti,
|
||||
uint8_t beamforming_mode)
|
||||
{
|
||||
|
||||
uint8_t harq_pid=0;
|
||||
@@ -3917,10 +3933,10 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
|
||||
} else {
|
||||
|
||||
if (harq_pid>1) {
|
||||
LOG_E(PHY,"Format 1A: harq_pid > 1\n");
|
||||
return(-1);
|
||||
}
|
||||
//if (harq_pid>1) {
|
||||
// LOG_E(PHY,"Format 1A: harq_pid > 1\n");
|
||||
// return(-1);
|
||||
//}
|
||||
|
||||
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
|
||||
NPRB = RIV2nb_rb_LUT25[rballoc];
|
||||
@@ -4119,6 +4135,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
dlsch0_harq->rvidx = rv;
|
||||
dlsch0_harq->Nl = 1;
|
||||
// dlsch[0]->layer_index = 0;
|
||||
|
||||
dlsch0_harq->mimo_mode = frame_parms->mode1_flag == 1 ?SISO : ALAMOUTI;
|
||||
dlsch0_harq->dl_power_off = 1; //no power offset
|
||||
|
||||
@@ -4143,6 +4160,20 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
|
||||
dlsch0_harq->DCINdi = ndi;
|
||||
|
||||
// this a retransmission
|
||||
if(dlsch0_harq->round)
|
||||
{
|
||||
// compare old TBS to new TBS
|
||||
if(dlsch0_harq->TBS != TBStable[get_I_TBS(mcs)][NPRB-1])
|
||||
{
|
||||
// this is an eNB issue
|
||||
// retransmisison but old and new TBS are different !!!
|
||||
// work around, consider it as a new transmission
|
||||
LOG_E(PHY,"Format1A Retransmission but TBS are different: consider it as new transmission !!! \n");
|
||||
dlsch0_harq->round = 0;
|
||||
}
|
||||
}
|
||||
|
||||
dlsch0_harq->mcs = mcs;
|
||||
if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)) {
|
||||
dlsch0_harq->TBS = TBStable[mcs][NPRB-1];
|
||||
@@ -4434,6 +4465,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
dlsch0_harq->status = ACTIVE;
|
||||
dlsch0_harq->DCINdi = ndi;
|
||||
|
||||
dlsch[0]->harq_ack[subframe].send_harq_status = 1;
|
||||
if (dlsch0_harq->first_tx==1) {
|
||||
LOG_D(PHY,"[PDSCH %x/%d] Format 1 DCI First TX: Clearing flag\n");
|
||||
dlsch0_harq->first_tx = 0;
|
||||
@@ -4452,6 +4484,20 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
|
||||
dlsch0_harq->mcs = mcs;
|
||||
|
||||
// this a retransmission
|
||||
if(dlsch0_harq->round)
|
||||
{
|
||||
// compare old TBS to new TBS
|
||||
if(dlsch0_harq->TBS != TBStable[get_I_TBS(mcs)][NPRB-1])
|
||||
{
|
||||
// this is an eNB issue
|
||||
// retransmisison but old and new TBS are different !!!
|
||||
// work around, consider it as a new transmission
|
||||
LOG_E(PHY,"Format1 Retransmission but TBS are different: consider it as new transmission !!! \n");
|
||||
dlsch0_harq->round = 0;
|
||||
}
|
||||
}
|
||||
|
||||
dlsch0_harq->TBS = TBStable[get_I_TBS(mcs)][NPRB-1];
|
||||
if (mcs <= 28)
|
||||
dlsch0_harq->Qm = get_Qm(mcs);
|
||||
@@ -4466,7 +4512,13 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
|
||||
dlsch[0]->rnti = rnti;
|
||||
|
||||
dlsch0_harq->mimo_mode = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI;
|
||||
if (beamforming_mode == 0)
|
||||
dlsch0_harq->mimo_mode = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI;
|
||||
else if (beamforming_mode == 7)
|
||||
dlsch0_harq->mimo_mode = TM7;
|
||||
else
|
||||
LOG_E(PHY,"Not supported beamforming mode %d\n",beamforming_mode);
|
||||
|
||||
|
||||
dlsch0 = dlsch[0];
|
||||
|
||||
@@ -4476,7 +4528,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
switch (frame_parms->N_RB_DL) {
|
||||
|
||||
case 6:
|
||||
if (frame_parms->nb_antennas_tx_eNB == 2) {
|
||||
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
||||
if (frame_type == TDD) {
|
||||
mcs1 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->mcs1;
|
||||
mcs2 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->mcs2;
|
||||
@@ -4496,7 +4548,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
tbswap = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->tb_swap;
|
||||
tpmi = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->tpmi;
|
||||
}
|
||||
} else if (frame_parms->nb_antennas_tx_eNB == 4) {
|
||||
} else if (frame_parms->nb_antenna_ports_eNB == 4) {
|
||||
if (frame_type == TDD) {
|
||||
mcs1 = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->mcs1;
|
||||
mcs2 = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->mcs2;
|
||||
@@ -4517,13 +4569,13 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
tpmi = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->tpmi;
|
||||
}
|
||||
} else {
|
||||
LOG_E(PHY,"UE: subframe %d Format2 DCI: unsupported number of TX antennas %d\n",subframe,frame_parms->nb_antennas_tx_eNB);
|
||||
LOG_E(PHY,"UE: subframe %d Format2 DCI: unsupported number of TX antennas %d\n",subframe,frame_parms->nb_antenna_ports_eNB);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 25:
|
||||
if (frame_parms->nb_antennas_tx_eNB == 2) {
|
||||
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
||||
if (frame_type == TDD) {
|
||||
mcs1 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs1;
|
||||
mcs2 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs2;
|
||||
@@ -4545,7 +4597,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
tbswap = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tb_swap;
|
||||
tpmi = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tpmi;
|
||||
}
|
||||
} else if (frame_parms->nb_antennas_tx_eNB == 4) {
|
||||
} else if (frame_parms->nb_antenna_ports_eNB == 4) {
|
||||
if (frame_type == TDD) {
|
||||
mcs1 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->mcs1;
|
||||
mcs2 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->mcs2;
|
||||
@@ -4568,13 +4620,13 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
tpmi = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->tpmi;
|
||||
}
|
||||
} else {
|
||||
LOG_E(PHY,"UE: Format2 DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx_eNB);
|
||||
LOG_E(PHY,"UE: Format2 DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antenna_ports_eNB);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 50:
|
||||
if (frame_parms->nb_antennas_tx_eNB == 2) {
|
||||
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
||||
if (frame_type == TDD) {
|
||||
mcs1 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->mcs1;
|
||||
mcs2 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->mcs2;
|
||||
@@ -4596,7 +4648,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
tbswap = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->tb_swap;
|
||||
tpmi = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->tpmi;
|
||||
}
|
||||
} else if (frame_parms->nb_antennas_tx_eNB == 4) {
|
||||
} else if (frame_parms->nb_antenna_ports_eNB == 4) {
|
||||
if (frame_type == TDD) {
|
||||
mcs1 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->mcs1;
|
||||
mcs2 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->mcs2;
|
||||
@@ -4619,13 +4671,13 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
tpmi = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->tpmi;
|
||||
}
|
||||
} else {
|
||||
LOG_E(PHY,"UE: Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx_eNB);
|
||||
LOG_E(PHY,"UE: Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antenna_ports_eNB);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 100:
|
||||
if (frame_parms->nb_antennas_tx_eNB == 2) {
|
||||
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
||||
if (frame_type == TDD) {
|
||||
mcs1 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->mcs1;
|
||||
mcs2 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->mcs2;
|
||||
@@ -4647,7 +4699,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
tbswap = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->tb_swap;
|
||||
tpmi = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->tpmi;
|
||||
}
|
||||
} else if (frame_parms->nb_antennas_tx_eNB == 4) {
|
||||
} else if (frame_parms->nb_antenna_ports_eNB == 4) {
|
||||
if (frame_type == TDD) {
|
||||
mcs1 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->mcs1;
|
||||
mcs2 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->mcs2;
|
||||
@@ -4670,7 +4722,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
tpmi = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->tpmi;
|
||||
}
|
||||
} else {
|
||||
LOG_E(PHY,"UE: Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx_eNB);
|
||||
LOG_E(PHY,"UE: Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antenna_ports_eNB);
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -4865,7 +4917,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
switch (frame_parms->N_RB_DL) {
|
||||
|
||||
case 6:
|
||||
if (frame_parms->nb_antennas_tx_eNB == 2) {
|
||||
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
||||
if (frame_type == TDD) {
|
||||
mcs1 = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->mcs1;
|
||||
mcs2 = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->mcs2;
|
||||
@@ -4887,7 +4939,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
harq_pid = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->harq_pid;
|
||||
tbswap = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->tb_swap;
|
||||
}
|
||||
} else if (frame_parms->nb_antennas_tx_eNB == 4) {
|
||||
} else if (frame_parms->nb_antenna_ports_eNB == 4) {
|
||||
if (frame_type == TDD) {
|
||||
mcs1 = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->mcs1;
|
||||
mcs2 = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->mcs2;
|
||||
@@ -4912,13 +4964,13 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
tpmi = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->tpmi;
|
||||
}
|
||||
} else {
|
||||
LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx_eNB);
|
||||
LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antenna_ports_eNB);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 25:
|
||||
if (frame_parms->nb_antennas_tx_eNB == 2) {
|
||||
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
||||
if (frame_type == TDD) {
|
||||
mcs1 = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->mcs1;
|
||||
mcs2 = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->mcs2;
|
||||
@@ -4942,7 +4994,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
harq_pid = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->harq_pid;
|
||||
tbswap = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->tb_swap;
|
||||
}
|
||||
} else if (frame_parms->nb_antennas_tx_eNB == 4) {
|
||||
} else if (frame_parms->nb_antenna_ports_eNB == 4) {
|
||||
if (frame_type == TDD) {
|
||||
mcs1 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->mcs1;
|
||||
mcs2 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->mcs2;
|
||||
@@ -4969,13 +5021,13 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
tpmi = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->tpmi;
|
||||
}
|
||||
} else {
|
||||
LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx_eNB);
|
||||
LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antenna_ports_eNB);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 50:
|
||||
if (frame_parms->nb_antennas_tx_eNB == 2) {
|
||||
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
||||
if (frame_type == TDD) {
|
||||
mcs1 = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->mcs1;
|
||||
mcs2 = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->mcs2;
|
||||
@@ -4999,7 +5051,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
harq_pid = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->harq_pid;
|
||||
tbswap = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->tb_swap;
|
||||
}
|
||||
} else if (frame_parms->nb_antennas_tx_eNB == 4) {
|
||||
} else if (frame_parms->nb_antenna_ports_eNB == 4) {
|
||||
if (frame_type == TDD) {
|
||||
mcs1 = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->mcs1;
|
||||
mcs2 = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->mcs2;
|
||||
@@ -5026,13 +5078,13 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
tpmi = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->tpmi;
|
||||
}
|
||||
} else {
|
||||
LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx_eNB);
|
||||
LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antenna_ports_eNB);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 100:
|
||||
if (frame_parms->nb_antennas_tx_eNB == 2) {
|
||||
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
||||
if (frame_type == TDD) {
|
||||
mcs1 = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->mcs1;
|
||||
mcs2 = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->mcs2;
|
||||
@@ -5056,7 +5108,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
harq_pid = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->harq_pid;
|
||||
tbswap = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->tb_swap;
|
||||
}
|
||||
} else if (frame_parms->nb_antennas_tx_eNB == 4) {
|
||||
} else if (frame_parms->nb_antenna_ports_eNB == 4) {
|
||||
if (frame_type == TDD) {
|
||||
mcs1 = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->mcs1;
|
||||
mcs2 = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->mcs2;
|
||||
@@ -5083,7 +5135,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
tpmi = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->tpmi;
|
||||
}
|
||||
} else {
|
||||
LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx_eNB);
|
||||
LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antenna_ports_eNB);
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -5226,7 +5278,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
}
|
||||
}
|
||||
|
||||
if (frame_parms->nb_antennas_tx_eNB == 2) {
|
||||
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
||||
dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
|
||||
dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch0_harq->nb_rb-1];
|
||||
|
||||
@@ -5241,7 +5293,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
dlsch0_harq->mimo_mode = ALAMOUTI;
|
||||
dlsch1_harq->mimo_mode = ALAMOUTI;
|
||||
}
|
||||
} else if (frame_parms->nb_antennas_tx_eNB == 4) { // 4 antenna case
|
||||
} else if (frame_parms->nb_antenna_ports_eNB == 4) { // 4 antenna case
|
||||
if ((dlsch0->active==1) && (dlsch1->active==1)) {
|
||||
switch (tpmi) {
|
||||
case 0: // one layer per transport block
|
||||
@@ -5325,7 +5377,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
}
|
||||
}
|
||||
} else {
|
||||
LOG_E(PHY,"Illegal number of antennas for eNB %d\n",frame_parms->nb_antennas_tx_eNB);
|
||||
LOG_E(PHY,"Illegal number of antennas for eNB %d\n",frame_parms->nb_antenna_ports_eNB);
|
||||
}
|
||||
|
||||
if (mcs1 <= 28)
|
||||
@@ -5519,7 +5571,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
|
||||
#ifdef DEBUG_DCI
|
||||
|
||||
if (dlsch[0]) {
|
||||
if (dlsch[0] && (dlsch[0]->rnti != 0xffff)) {
|
||||
printf("dci_format:%d Abssubframe: %d.%d \n",dci_format,frame,subframe);
|
||||
printf("PDSCH dlsch0 UE: rnti %x\n",dlsch[0]->rnti);
|
||||
printf("PDSCH dlsch0 UE: NBRB %d\n",dlsch0_harq->nb_rb);
|
||||
printf("PDSCH dlsch0 UE: rballoc %x\n",dlsch0_harq->rb_alloc_even[0]);
|
||||
@@ -5537,7 +5590,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
// compute DL power control parameters
|
||||
computeRhoA_UE(pdsch_config_dedicated, dlsch[0],dlsch0_harq->dl_power_off);
|
||||
|
||||
computeRhoB_UE(pdsch_config_dedicated,&(frame_parms->pdsch_config_common),frame_parms->nb_antennas_tx_eNB,dlsch[0],dlsch0_harq->dl_power_off);
|
||||
computeRhoB_UE(pdsch_config_dedicated,&(frame_parms->pdsch_config_common),frame_parms->nb_antenna_ports_eNB,dlsch[0],dlsch0_harq->dl_power_off);
|
||||
|
||||
return(0);
|
||||
}
|
||||
@@ -6194,13 +6247,22 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
|
||||
uint8_t harq_pid;
|
||||
uint8_t transmission_mode = ue->transmission_mode[eNB_id];
|
||||
ANFBmode_t AckNackFBMode = ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode;
|
||||
ANFBmode_t AckNackFBMode;
|
||||
LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id];
|
||||
// LTE_UE_DLSCH_t **dlsch = ue->dlsch[0];
|
||||
PHY_MEASUREMENTS *meas = &ue->measurements;
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
||||
// uint32_t current_dlsch_cqi = ue->current_dlsch_cqi[eNB_id];
|
||||
|
||||
if(frame_parms->frame_type == TDD)
|
||||
{
|
||||
AckNackFBMode = ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode;
|
||||
}
|
||||
else
|
||||
{
|
||||
AckNackFBMode = 1; // 1: multiplexing for FDD
|
||||
}
|
||||
|
||||
uint32_t cqi_req;
|
||||
uint32_t dai=0;
|
||||
uint32_t cshift;
|
||||
@@ -6351,8 +6413,10 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
|
||||
|
||||
if (rballoc > RIV_max) {
|
||||
LOG_E(PHY,"frame %d, subframe %d, rnti %x, format %d: FATAL ERROR: generate_ue_ulsch_params_from_dci, rb_alloc > RIV_max\n",
|
||||
proc->frame_rx, subframe, rnti, dci_format);
|
||||
LOG_E(PHY,"frame %d, subframe %d, rnti %x, format %d: FATAL ERROR: generate_ue_ulsch_params_from_dci, rb_alloc[%d] > RIV_max[%d]\n",
|
||||
proc->frame_rx, subframe, rnti, dci_format,rballoc,RIV_max);
|
||||
LOG_E(PHY,"Wrong DCI0 detection, do not transmit PUSCH for HARQID: %d\n",harq_pid);
|
||||
ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 0;
|
||||
return(-1);
|
||||
}
|
||||
|
||||
@@ -6361,7 +6425,11 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
if ((rnti >= cba_rnti) && (rnti < p_rnti))
|
||||
ulsch->harq_processes[harq_pid]->subframe_cba_scheduling_flag = 1; //+=1 this indicates the number of dci / cba group: not supported in the data struct
|
||||
else
|
||||
ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
|
||||
{
|
||||
ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
|
||||
//LOG_I(PHY,"[HARQ-UL harqId: %d] DCI0 ==> subframe_scheduling_flag = %d round: %d\n", harq_pid, ulsch->harq_processes[harq_pid]->subframe_scheduling_flag, ulsch->harq_processes[harq_pid]->round);
|
||||
|
||||
}
|
||||
|
||||
ulsch->harq_processes[harq_pid]->TPC = TPC;
|
||||
|
||||
@@ -6391,7 +6459,42 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
ulsch->harq_processes[harq_pid]->round = 0;
|
||||
} else {
|
||||
// ulsch->harq_processes[harq_pid]->Ndi = 0;
|
||||
// ulsch->harq_processes[harq_pid]->round++; // This is done in phich RX
|
||||
//ulsch->harq_processes[harq_pid]->round++; // This is done in phich RX
|
||||
|
||||
//#ifdef DEBUG_PHICH
|
||||
//LOG_I(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d Adaptative Retrans, NDI not toggled => Nack. maxHARQ_Tx %d \n",
|
||||
// ue->Mod_id,harq_pid,
|
||||
// proc->frame_rx,
|
||||
// subframe,
|
||||
// ulsch->Mlimit);
|
||||
//#endif
|
||||
/*
|
||||
if (ulsch->harq_processes[harq_pid]->round > 0) // NACK detected on phich
|
||||
{
|
||||
// ulsch->harq_processes[harq_pid]->round++; already done on phich_rx
|
||||
// ulsch->harq_processes[harq_pid] = ulsch->harq_processes[8];
|
||||
// LOG_I(PHY," Adaptative retransmission - copy temporary harq Process to current harq process. [harqId %d round %d] \n",harq_pid, ulsch->harq_processes[8]->round);
|
||||
|
||||
if (ulsch->harq_processes[harq_pid]->round >= ulsch->Mlimit) //UE_mac_inst[eNB_id].scheduling_info.maxHARQ_Tx)
|
||||
{
|
||||
ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 0;
|
||||
ulsch->harq_processes[harq_pid]->round = 0;
|
||||
ulsch->harq_processes[harq_pid]->status = IDLE;
|
||||
//LOG_I(PHY," PUSCH MAX Retransmission acheived ==> flush harq buff (%d) \n",harq_pid);
|
||||
//LOG_I(PHY," [HARQ-UL harqId: %d] Adaptative retransmission NACK MAX RETRANS(%d) ==> subframe_scheduling_flag = %d round: %d\n", harq_pid, UE_mac_inst[eNB_id].scheduling_info.maxHARQ_Tx, ulsch->harq_processes[harq_pid]->subframe_scheduling_flag, ulsch->harq_processes[harq_pid]->round);
|
||||
}
|
||||
else
|
||||
{
|
||||
// ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
|
||||
uint8_t rv_table[4] = {0, 2, 3, 1};
|
||||
ulsch->harq_processes[harq_pid]->rvidx = rv_table[ulsch->harq_processes[harq_pid]->round&3];
|
||||
ulsch->O_RI = 0;
|
||||
ulsch->O = 0;
|
||||
ulsch->uci_format = HLC_subband_cqi_nopmi;
|
||||
//LOG_I(PHY," [HARQ-UL harqId: %d] Adaptative retransmission NACK ==> subframe_scheduling_flag = %d round: %d\n", harq_pid, ulsch->harq_processes[harq_pid]->subframe_scheduling_flag,ulsch->harq_processes[harq_pid]->round);
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6441,7 +6544,16 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
|
||||
|
||||
if (cqi_req == 1) {
|
||||
ulsch->O_RI = 1; //we only support 2 antenna ports, so this is always 1 according to 3GPP 36.213 Table
|
||||
|
||||
if( (AntennaInfoDedicated__transmissionMode_tm3 == transmission_mode) || (AntennaInfoDedicated__transmissionMode_tm4 == transmission_mode) )
|
||||
{
|
||||
ulsch->O_RI = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
ulsch->O_RI = 0;
|
||||
}
|
||||
//ulsch->O_RI = 0; //we only support 2 antenna ports, so this is always 1 according to 3GPP 36.213 Table
|
||||
|
||||
switch(transmission_mode) {
|
||||
// The aperiodic CQI reporting mode is fixed for every transmission mode instead of being configured by higher layer signaling
|
||||
@@ -7001,15 +7113,19 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
|
||||
// ulsch->n_DMRS2 = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->cshift;
|
||||
|
||||
#ifdef DEBUG_DCI
|
||||
#ifdef DEBUG_DCI
|
||||
printf("Format 0 DCI : ulsch (ue): AbsSubframe %d.%d\n",proc->frame_rx,subframe);
|
||||
printf("Format 0 DCI : ulsch (ue): NBRB %d\n",ulsch->harq_processes[harq_pid]->nb_rb);
|
||||
printf("Format 0 DCI :ulsch (ue): first_rb %d\n",ulsch->harq_processes[harq_pid]->first_rb);
|
||||
printf("Format 0 DCI :ulsch (ue): rballoc %d\n",rballoc);
|
||||
printf("Format 0 DCI :ulsch (ue): harq_pid %d\n",harq_pid);
|
||||
printf("Format 0 DCI :ulsch (ue): first_tx %d\n",ulsch->harq_processes[harq_pid]->first_tx);
|
||||
printf("Format 0 DCI :ulsch (ue): DCINdi %d\n",ulsch->harq_processes[harq_pid]->DCINdi);
|
||||
printf("Format 0 DCI :ulsch (ue): round %d\n",ulsch->harq_processes[harq_pid]->round);
|
||||
printf("Format 0 DCI :ulsch (ue): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS);
|
||||
printf("Format 0 DCI :ulsch (ue): mcs %d\n",ulsch->harq_processes[harq_pid]->mcs);
|
||||
printf("Format 0 DCI :ulsch (ue): O %d\n",ulsch->O);
|
||||
|
||||
printf("Format 0 DCI :ulsch (ue): cqiReq %d\n",cqi_req);
|
||||
if (frame_parms->frame_type == TDD)
|
||||
printf("Format 0 DCI :ulsch (ue): O_ACK/DAI %d/%d\n",ulsch->harq_processes[harq_pid]->O_ACK,dai);
|
||||
else
|
||||
@@ -7017,6 +7133,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
|
||||
|
||||
printf("Format 0 DCI :ulsch (ue): Nsymb_pusch %d\n",ulsch->Nsymb_pusch);
|
||||
printf("Format 0 DCI :ulsch (ue): cshift %d\n",ulsch->harq_processes[harq_pid]->n_DMRS2);
|
||||
printf("Format 0 DCI :ulsch (ue): phich status %d\n",ulsch->harq_processes[harq_pid]->status);
|
||||
#else
|
||||
UNUSED_VARIABLE(dai);
|
||||
#endif
|
||||
@@ -7205,7 +7322,17 @@ int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB,
|
||||
|
||||
|
||||
if (cqi_req == 1) {
|
||||
ulsch->harq_processes[harq_pid]->O_RI = 1; //we only support 2 antenna ports, so this is always 1 according to 3GPP 36.213 Table
|
||||
/* 36.213 7.2.1 (release 10) says:
|
||||
* "RI is only reported for transmission modes 3 and 4,
|
||||
* as well as transmission modes 8 and 9 with PMI/RI reporting"
|
||||
* This is for aperiodic reporting.
|
||||
* TODO: deal with TM 8&9 correctly when they are implemented.
|
||||
* TODO: deal with periodic reporting if we implement it.
|
||||
*/
|
||||
if (transmission_mode == 3 || transmission_mode == 4)
|
||||
ulsch->harq_processes[harq_pid]->O_RI = 1; //we only support 2 antenna ports, so this is always 1 according to 3GPP 36.213 Table
|
||||
else
|
||||
ulsch->harq_processes[harq_pid]->O_RI = 0;
|
||||
|
||||
switch(transmission_mode) {
|
||||
// The aperiodic CQI reporting mode is fixed for every transmission mode instead of being configured by higher layer signaling
|
||||
@@ -7679,7 +7806,7 @@ double sinr_eff_cqi_calc(PHY_VARS_UE *ue, uint8_t eNB_id)
|
||||
switch(transmission_mode) {
|
||||
case 1:
|
||||
for (count=0; count<frame_parms->N_RB_DL*12; count++) {
|
||||
for(a_tx=0; a_tx<frame_parms->nb_antennas_tx_eNB; a_tx++) {
|
||||
for(a_tx=0; a_tx<frame_parms->nb_antenna_ports_eNB; a_tx++) {
|
||||
for (a_rx=0; a_rx<frame_parms->nb_antennas_rx; a_rx++) {
|
||||
s_dB[count] = 10*log10(pow(((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2],2) + pow(((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2],
|
||||
2)) - meas->n0_power_avg_dB;
|
||||
@@ -7693,7 +7820,7 @@ double sinr_eff_cqi_calc(PHY_VARS_UE *ue, uint8_t eNB_id)
|
||||
for (count=0; count<frame_parms->N_RB_DL*12; count++) {
|
||||
abs_channel=0;
|
||||
|
||||
for(a_tx=0; a_tx<frame_parms->nb_antennas_tx_eNB; a_tx++) {
|
||||
for(a_tx=0; a_tx<frame_parms->nb_antenna_ports_eNB; a_tx++) {
|
||||
for (a_rx=0; a_rx<frame_parms->nb_antennas_rx; a_rx++) {
|
||||
abs_channel += (pow(((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2],2) + pow(((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2],2));
|
||||
}
|
||||
@@ -7713,7 +7840,7 @@ double sinr_eff_cqi_calc(PHY_VARS_UE *ue, uint8_t eNB_id)
|
||||
qq = (q>>(((count/12)>>2)<<1))&3;
|
||||
|
||||
//printf("pmi_alloc %d: rb %d, pmi %d\n",q,count/12,qq);
|
||||
for(a_tx=0; a_tx<frame_parms->nb_antennas_tx_eNB; a_tx++) {
|
||||
for(a_tx=0; a_tx<frame_parms->nb_antenna_ports_eNB; a_tx++) {
|
||||
for (a_rx=0; a_rx<frame_parms->nb_antennas_rx; a_rx++) {
|
||||
switch(qq) {
|
||||
case 0:
|
||||
@@ -7795,7 +7922,7 @@ double sinr_eff_cqi_calc(PHY_VARS_UE *ue, uint8_t eNB_id)
|
||||
qq = (q>>(((count/12)>>2)<<1))&3;
|
||||
|
||||
//printf("pmi_alloc %d: rb %d, pmi %d\n",q,count/12,qq);
|
||||
for(a_tx=0; a_tx<frame_parms->nb_antennas_tx_eNB; a_tx++) {
|
||||
for(a_tx=0; a_tx<frame_parms->nb_antenna_ports_eNB; a_tx++) {
|
||||
for (a_rx=0; a_rx<frame_parms->nb_antennas_rx; a_rx++) {
|
||||
switch(qq) {
|
||||
case 0:
|
||||
|
||||
@@ -227,11 +227,20 @@ typedef struct {
|
||||
uint8_t control_only;
|
||||
/// Flag to indicate that this is a calibration ULSCH (i.e. no MAC SDU and filled with TDD calibration information)
|
||||
// int calibration_flag;
|
||||
/// Number of soft channel bits
|
||||
uint32_t G;
|
||||
|
||||
// decode phich
|
||||
uint8_t decode_phich;
|
||||
} LTE_UL_UE_HARQ_t;
|
||||
|
||||
typedef struct {
|
||||
/// TX buffers for UE-spec transmission (antenna ports 5 or 7..14, prior to precoding)
|
||||
uint32_t *txdataF[8];
|
||||
int32_t *txdataF[8];
|
||||
/// beamforming weights for UE-spec transmission (antenna ports 5 or 7..14), for each codeword, maximum 4 layers?
|
||||
int32_t **ue_spec_bf_weights[4];
|
||||
/// dl channel estimates (estimated from ul channel estimates)
|
||||
int32_t **calib_dl_ch_estimates;
|
||||
/// Allocated RNTI (0 means DLSCH_t is not currently used)
|
||||
uint16_t rnti;
|
||||
/// Active flag for baseband transmitter processing
|
||||
@@ -333,12 +342,16 @@ typedef struct {
|
||||
int16_t Po_PUSCH;
|
||||
/// PHR - current power headroom (based on last PUSCH transmission)
|
||||
int16_t PHR;
|
||||
/// Po_SRS - target output power for SRS
|
||||
int16_t Po_SRS;
|
||||
/// num active cba group
|
||||
uint8_t num_active_cba_groups;
|
||||
/// num dci found for cba
|
||||
uint8_t num_cba_dci[10];
|
||||
/// allocated CBA RNTI
|
||||
uint16_t cba_rnti[4];//NUM_MAX_CBA_GROUP];
|
||||
/// UL max-harq-retransmission
|
||||
uint8_t Mlimit;
|
||||
} LTE_UE_ULSCH_t;
|
||||
|
||||
typedef struct {
|
||||
@@ -360,12 +373,18 @@ typedef struct {
|
||||
uint8_t TPC;
|
||||
/// First Allocated RB
|
||||
uint16_t first_rb;
|
||||
/// First Allocated RB - previous scheduling
|
||||
/// This is needed for PHICH generation which
|
||||
/// is done after a new scheduling
|
||||
uint16_t previous_first_rb;
|
||||
/// Current Number of RBs
|
||||
uint16_t nb_rb;
|
||||
/// Transport block size
|
||||
uint32_t TBS;
|
||||
/// The payload + CRC size in bits
|
||||
uint32_t B;
|
||||
/// Number of soft channel bits
|
||||
uint32_t G;
|
||||
/// CQI CRC status
|
||||
uint8_t cqi_crc_status;
|
||||
/// Pointer to CQI data
|
||||
@@ -442,6 +461,10 @@ typedef struct {
|
||||
uint8_t Nsymb_initial;
|
||||
/// n_DMRS for cyclic shift of DMRS (36.213 Table 9.1.2-2)
|
||||
uint8_t n_DMRS;
|
||||
/// n_DMRS for cyclic shift of DMRS (36.213 Table 9.1.2-2) - previous scheduling
|
||||
/// This is needed for PHICH generation which
|
||||
/// is done after a new scheduling
|
||||
uint8_t previous_n_DMRS;
|
||||
/// n_DMRS 2 for cyclic shift of DMRS (36.211 Table 5.5.1.1.-1)
|
||||
uint8_t n_DMRS2;
|
||||
/// Flag to indicate that this ULSCH is for calibration information sent from UE (i.e. no MAC SDU to pass up)
|
||||
|
||||
@@ -111,12 +111,14 @@ void free_eNB_dlsch(LTE_eNB_DLSCH_t *dlsch)
|
||||
|
||||
}
|
||||
|
||||
LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_t Nsoft,unsigned char N_RB_DL, uint8_t abstraction_flag)
|
||||
LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_t Nsoft,unsigned char N_RB_DL, uint8_t abstraction_flag, LTE_DL_FRAME_PARMS* frame_parms)
|
||||
{
|
||||
|
||||
LTE_eNB_DLSCH_t *dlsch;
|
||||
unsigned char exit_flag = 0,i,j,r;
|
||||
unsigned char exit_flag = 0,i,j,r,aa,layer;
|
||||
int re;
|
||||
unsigned char bw_scaling =1;
|
||||
uint8_t nb_antennas_tx = frame_parms->nb_antennas_tx;
|
||||
|
||||
switch (N_RB_DL) {
|
||||
case 6:
|
||||
@@ -145,6 +147,23 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_
|
||||
dlsch->Mlimit = 4;
|
||||
dlsch->Nsoft = Nsoft;
|
||||
|
||||
for (layer=0; layer<4; layer++) {
|
||||
dlsch->ue_spec_bf_weights[layer] = (int32_t**)malloc16(frame_parms->nb_antennas_tx*sizeof(int32_t*));
|
||||
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||
dlsch->ue_spec_bf_weights[layer][aa] = (int32_t *)malloc16(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t));
|
||||
for (re=0;re<OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; re++) {
|
||||
dlsch->ue_spec_bf_weights[layer][aa][re] = 0x00007fff;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dlsch->calib_dl_ch_estimates = (int32_t**)malloc16(frame_parms->nb_antennas_tx*sizeof(int32_t*));
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||
dlsch->calib_dl_ch_estimates[aa] = (int32_t *)malloc16(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t));
|
||||
|
||||
}
|
||||
|
||||
for (i=0; i<10; i++)
|
||||
dlsch->harq_ids[i] = Mdlharq;
|
||||
|
||||
@@ -189,7 +208,7 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_
|
||||
exit_flag=3;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (exit_flag==0) {
|
||||
for (i=0; i<Mdlharq; i++) {
|
||||
dlsch->harq_processes[i]->round=0;
|
||||
@@ -379,7 +398,7 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
|
||||
|
||||
A = dlsch->harq_processes[harq_pid]->TBS; //6228
|
||||
mod_order = get_Qm(dlsch->harq_processes[harq_pid]->mcs);
|
||||
G = get_G(frame_parms,nb_rb,dlsch->harq_processes[harq_pid]->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe);
|
||||
G = get_G(frame_parms,nb_rb,dlsch->harq_processes[harq_pid]->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe,dlsch->harq_processes[harq_pid]->mimo_mode==TM7?7:0);
|
||||
|
||||
|
||||
if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet
|
||||
@@ -557,6 +576,7 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
|
||||
unsigned char mod_order;
|
||||
unsigned int Kr=0,Kr_bytes,r,r_offset=0;
|
||||
unsigned short m=dlsch->harq_processes[harq_pid]->mcs;
|
||||
uint8_t beamforming_mode=0;
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN);
|
||||
|
||||
@@ -564,7 +584,13 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
|
||||
// printf("Encoder: A: %d\n",A);
|
||||
mod_order = get_Qm(dlsch->harq_processes[harq_pid]->mcs);
|
||||
|
||||
G = get_G(frame_parms,nb_rb,dlsch->harq_processes[harq_pid]->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe);
|
||||
if(dlsch->harq_processes[harq_pid]->mimo_mode == TM7)
|
||||
beamforming_mode = 7;
|
||||
else if(dlsch->harq_processes[harq_pid]->mimo_mode == TM8)
|
||||
beamforming_mode = 8;
|
||||
else if(dlsch->harq_processes[harq_pid]->mimo_mode == TM9_10)
|
||||
beamforming_mode = 9;
|
||||
G = get_G(frame_parms,nb_rb,dlsch->harq_processes[harq_pid]->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe,beamforming_mode);
|
||||
|
||||
|
||||
// if (dlsch->harq_processes[harq_pid]->Ndi == 1) { // this is a new packet
|
||||
|
||||
@@ -249,7 +249,12 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
|
||||
tc = phy_threegpplte_turbo_decoder16;
|
||||
}
|
||||
else
|
||||
tc = phy_threegpplte_turbo_decoder8;
|
||||
{
|
||||
AssertFatal (harq_process->TBS >= 256 , "Mismatch flag nbRB=%d TBS=%d mcs=%d Qm=%d RIV=%d round=%d \n",
|
||||
harq_process->nb_rb, harq_process->TBS,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round);
|
||||
tc = phy_threegpplte_turbo_decoder8;
|
||||
}
|
||||
|
||||
|
||||
// nb_rb = dlsch->nb_rb;
|
||||
|
||||
@@ -448,6 +453,11 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
|
||||
#if 1
|
||||
if (err_flag == 0) {
|
||||
|
||||
if (llr8_flag) {
|
||||
AssertFatal (Kr >= 256, "turbo algo issue Kr=%d cb_cnt=%d C=%d nbRB=%d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d\n",
|
||||
Kr,r,harq_process->C,harq_process->nb_rb,A,harq_process->TBS,harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round);
|
||||
}
|
||||
|
||||
start_meas(dlsch_turbo_decoding_stats);
|
||||
ret = tc
|
||||
(&harq_process->d[r][96],
|
||||
@@ -609,7 +619,11 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
|
||||
harq_process->errors[harq_process->round]++;
|
||||
harq_process->round++;
|
||||
|
||||
// LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
|
||||
|
||||
if(is_crnti)
|
||||
{
|
||||
LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for subframe %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round,harq_process->TBS);
|
||||
}
|
||||
// printf("Rate: [UE %d] DLSCH: Setting NACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
|
||||
if (harq_process->round >= dlsch->Mdlharq) {
|
||||
harq_process->status = SCH_IDLE;
|
||||
@@ -622,7 +636,10 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
|
||||
dlsch->harq_ack[subframe].ack = 1;
|
||||
dlsch->harq_ack[subframe].harq_id = harq_pid;
|
||||
dlsch->harq_ack[subframe].send_harq_status = 1;
|
||||
LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
|
||||
if(is_crnti)
|
||||
{
|
||||
LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round,harq_process->TBS);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -21,7 +21,7 @@
|
||||
|
||||
/*! \file PHY/LTE_TRANSPORT/dlsch_llr_computation.c
|
||||
* \brief Top-level routines for LLR computation of the PDSCH physical channel from 36-211, V8.6 2009-03
|
||||
* \author R. Knopp, F. Kaltenberger,A. Bhamri, S. Aubert, S. Wagner
|
||||
* \author R. Knopp, F. Kaltenberger,A. Bhamri, S. Aubert, S. Wagner, X Jiang
|
||||
* \date 2011
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
@@ -632,7 +632,8 @@ int dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t first_symbol_flag,
|
||||
uint16_t nb_rb,
|
||||
uint16_t pbch_pss_sss_adjust,
|
||||
int16_t **llr32p)
|
||||
int16_t **llr32p,
|
||||
uint8_t beamforming_mode)
|
||||
{
|
||||
|
||||
uint32_t *rxF = (uint32_t*)&rxdataF_comp[0][((int32_t)symbol*frame_parms->N_RB_DL*12)];
|
||||
@@ -657,6 +658,10 @@ int dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
|
||||
else
|
||||
len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
|
||||
} else if((beamforming_mode==7) && (frame_parms->Ncp==0) && (symbol==3 || symbol==6 || symbol==9 || symbol==12)){
|
||||
len = (nb_rb*9) - (3*pbch_pss_sss_adjust/4);
|
||||
} else if((beamforming_mode==7) && (frame_parms->Ncp==1) && (symbol==4 || symbol==7 || symbol==10)){
|
||||
len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
|
||||
} else {
|
||||
len = (nb_rb*12) - pbch_pss_sss_adjust;
|
||||
}
|
||||
@@ -688,7 +693,8 @@ void dlsch_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t first_symbol_flag,
|
||||
uint16_t nb_rb,
|
||||
uint16_t pbch_pss_sss_adjust,
|
||||
int16_t **llr32p)
|
||||
int16_t **llr32p,
|
||||
uint8_t beamforming_mode)
|
||||
{
|
||||
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
@@ -731,11 +737,15 @@ void dlsch_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
#endif
|
||||
if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
|
||||
if (frame_parms->mode1_flag==0)
|
||||
len = nb_rb*8 - (2*pbch_pss_sss_adjust/3);
|
||||
len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
|
||||
else
|
||||
len = nb_rb*10 - (5*pbch_pss_sss_adjust/6);
|
||||
len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
|
||||
} else if((beamforming_mode==7) && (frame_parms->Ncp==0) && (symbol==3 || symbol==6 || symbol==9 || symbol==12)){
|
||||
len = (nb_rb*9) - (3*pbch_pss_sss_adjust/4);
|
||||
} else if((beamforming_mode==7) && (frame_parms->Ncp==1) && (symbol==4 || symbol==7 || symbol==10)){
|
||||
len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
|
||||
} else {
|
||||
len = nb_rb*12 - pbch_pss_sss_adjust;
|
||||
len = (nb_rb*12) - pbch_pss_sss_adjust;
|
||||
}
|
||||
|
||||
// update output pointer according to number of REs in this symbol (<<2 because 4 bits per RE)
|
||||
@@ -811,7 +821,8 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t first_symbol_flag,
|
||||
uint16_t nb_rb,
|
||||
uint16_t pbch_pss_sss_adjust,
|
||||
int16_t **llr_save)
|
||||
int16_t **llr_save,
|
||||
uint8_t beamforming_mode)
|
||||
{
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
__m128i *rxF = (__m128i*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
|
||||
@@ -841,11 +852,15 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
#endif
|
||||
if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
|
||||
if (frame_parms->mode1_flag==0)
|
||||
len = nb_rb*8 - (2*pbch_pss_sss_adjust/3);
|
||||
len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
|
||||
else
|
||||
len = nb_rb*10 - (5*pbch_pss_sss_adjust/6);
|
||||
len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
|
||||
} else if((beamforming_mode==7) && (frame_parms->Ncp==0) && (symbol==3 || symbol==6 || symbol==9 || symbol==12)){
|
||||
len = (nb_rb*9) - (3*pbch_pss_sss_adjust/4);
|
||||
} else if((beamforming_mode==7) && (frame_parms->Ncp==1) && (symbol==4 || symbol==7 || symbol==10)){
|
||||
len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
|
||||
} else {
|
||||
len = nb_rb*12 - pbch_pss_sss_adjust;
|
||||
len = (nb_rb*12) - pbch_pss_sss_adjust;
|
||||
}
|
||||
|
||||
llr2 = llr;
|
||||
|
||||
@@ -20,15 +20,15 @@
|
||||
*/
|
||||
|
||||
/*! \file PHY/LTE_TRANSPORT/dlsch_modulation.c
|
||||
* \brief Top-level routines for generating the PDSCH physical channel from 36-211, V8.6 2009-03
|
||||
* \author R. Knopp, F. Kaltenberger
|
||||
* \date 2011
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
* \brief Top-level routines for generating the PDSCH physical channel from 36-211, V8.6 2009-03
|
||||
* \author R. Knopp, F. Kaltenberger
|
||||
* \date 2011
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
#include "PHY/defs.h"
|
||||
#include "PHY/extern.h"
|
||||
#include "PHY/CODING/defs.h"
|
||||
@@ -62,10 +62,36 @@ uint8_t is_not_pilot(uint8_t pilots, uint8_t re, uint8_t nushift, uint8_t use2nd
|
||||
return(0);
|
||||
}
|
||||
|
||||
uint8_t is_not_UEspecRS(int first_layer,int re)
|
||||
/*uint8_t is_not_UEspecRS(int first_layer,int re)
|
||||
{
|
||||
|
||||
return(1);
|
||||
}*/
|
||||
uint8_t is_not_UEspecRS(int8_t lprime, uint8_t re, uint8_t nushift, uint8_t Ncp, uint8_t beamforming_mode)
|
||||
{
|
||||
uint8_t offset = (lprime==1||lprime==3)?2:0;
|
||||
if (lprime==-1)
|
||||
return(1);
|
||||
|
||||
switch (beamforming_mode) {
|
||||
case 7:
|
||||
if (Ncp == NORMAL){
|
||||
if ((re!=nushift+offset) && (re!=((nushift+4+offset)%12)) && (re!=((nushift+8+offset)%12)))
|
||||
return(1);
|
||||
/*else{
|
||||
printf("(is_no_UEspec_RS):lprime=%d, re=%d, nushift=%d, offset=%d\n",lprime, re,nushift,offset);
|
||||
}*/
|
||||
} else {
|
||||
if ((re!=nushift+offset) && (re!=((nushift+3+offset)%12)) && (re!=((nushift+6+offset)%12)) && (re!=((nushift+9+offset)%12)))
|
||||
return(1);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
msg("is_not_UEspecRS() [dlsch_modulation.c] : ERROR, unknown beamforming_mode %d\n",beamforming_mode);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
void generate_64qam_table(void)
|
||||
@@ -102,36 +128,36 @@ void layer1prec2A(int32_t *antenna0_sample, int32_t *antenna1_sample, uint8_t pr
|
||||
|
||||
switch (precoding_index) {
|
||||
|
||||
case 0: // 1 1
|
||||
*antenna1_sample=*antenna0_sample;
|
||||
break;
|
||||
case 0: // 1 1
|
||||
*antenna1_sample=*antenna0_sample;
|
||||
break;
|
||||
|
||||
case 1: // 1 -1
|
||||
((int16_t *)antenna1_sample)[0] = -((int16_t *)antenna0_sample)[0];
|
||||
((int16_t *)antenna1_sample)[1] = -((int16_t *)antenna0_sample)[1];
|
||||
break;
|
||||
case 1: // 1 -1
|
||||
((int16_t *)antenna1_sample)[0] = -((int16_t *)antenna0_sample)[0];
|
||||
((int16_t *)antenna1_sample)[1] = -((int16_t *)antenna0_sample)[1];
|
||||
break;
|
||||
|
||||
case 2: // 1 j
|
||||
((int16_t *)antenna1_sample)[0] = -((int16_t *)antenna0_sample)[1];
|
||||
((int16_t *)antenna1_sample)[1] = ((int16_t *)antenna0_sample)[0];
|
||||
break;
|
||||
case 2: // 1 j
|
||||
((int16_t *)antenna1_sample)[0] = -((int16_t *)antenna0_sample)[1];
|
||||
((int16_t *)antenna1_sample)[1] = ((int16_t *)antenna0_sample)[0];
|
||||
break;
|
||||
|
||||
case 3: // 1 -j
|
||||
((int16_t *)antenna1_sample)[0] = ((int16_t *)antenna0_sample)[1];
|
||||
((int16_t *)antenna1_sample)[1] = -((int16_t *)antenna0_sample)[0];
|
||||
break;
|
||||
case 3: // 1 -j
|
||||
((int16_t *)antenna1_sample)[0] = ((int16_t *)antenna0_sample)[1];
|
||||
((int16_t *)antenna1_sample)[1] = -((int16_t *)antenna0_sample)[0];
|
||||
break;
|
||||
}
|
||||
|
||||
// normalize
|
||||
/* ((int16_t *)antenna0_sample)[0] = (int16_t)((((int16_t *)antenna0_sample)[0]*ONE_OVER_SQRT2_Q15)>>15);
|
||||
((int16_t *)antenna0_sample)[1] = (int16_t)((((int16_t *)antenna0_sample)[1]*ONE_OVER_SQRT2_Q15)>>15); ((int16_t *)antenna1_sample)[0] = (int16_t)((((int16_t *)antenna1_sample)[0]*ONE_OVER_SQRT2_Q15)>>15);
|
||||
((int16_t *)antenna1_sample)[1] = (int16_t)((((int16_t *)antenna1_sample)[1]*ONE_OVER_SQRT2_Q15)>>15); */
|
||||
((int16_t *)antenna0_sample)[1] = (int16_t)((((int16_t *)antenna0_sample)[1]*ONE_OVER_SQRT2_Q15)>>15); ((int16_t *)antenna1_sample)[0] = (int16_t)((((int16_t *)antenna1_sample)[0]*ONE_OVER_SQRT2_Q15)>>15);
|
||||
((int16_t *)antenna1_sample)[1] = (int16_t)((((int16_t *)antenna1_sample)[1]*ONE_OVER_SQRT2_Q15)>>15); */
|
||||
}
|
||||
|
||||
uint32_t FOUR[2]={0,4};
|
||||
uint32_t TWO[2]={0,2};
|
||||
|
||||
int allocate_REs_in_RB_no_pilots_16QAM_siso(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int allocate_REs_in_RB_no_pilots_16QAM_siso(PHY_VARS_eNB* phy_vars_eNB,
|
||||
int **txdataF,
|
||||
uint32_t *jj,
|
||||
uint32_t *jj2,
|
||||
@@ -147,11 +173,14 @@ int allocate_REs_in_RB_no_pilots_16QAM_siso(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint32_t *re_allocated,
|
||||
uint8_t skip_dc,
|
||||
uint8_t skip_half,
|
||||
uint8_t lprime,
|
||||
uint8_t mprime,
|
||||
uint8_t Ns,
|
||||
int *P1_SHIFT,
|
||||
int *P2_SHIFT)
|
||||
{
|
||||
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->frame_parms;
|
||||
uint8_t *x0 = dlsch0_harq->e;
|
||||
uint32_t qam16_table_offset_re = 0;
|
||||
uint32_t qam16_table_offset_im = 0;
|
||||
@@ -205,7 +234,7 @@ int allocate_REs_in_RB_no_pilots_16QAM_siso(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
return(0);
|
||||
}
|
||||
|
||||
int allocate_REs_in_RB_pilots_16QAM_siso(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int allocate_REs_in_RB_pilots_16QAM_siso(PHY_VARS_eNB* phy_vars_eNB,
|
||||
int **txdataF,
|
||||
uint32_t *jj,
|
||||
uint32_t *jj2,
|
||||
@@ -221,10 +250,14 @@ int allocate_REs_in_RB_pilots_16QAM_siso(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint32_t *re_allocated,
|
||||
uint8_t skip_dc,
|
||||
uint8_t skip_half,
|
||||
uint8_t lprime,
|
||||
uint8_t mprime,
|
||||
uint8_t Ns,
|
||||
int *P1_SHIFT,
|
||||
int *P2_SHIFT)
|
||||
{
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->frame_parms;
|
||||
|
||||
uint8_t *x0 = dlsch0_harq->e;
|
||||
uint32_t qam16_table_offset_re = 0;
|
||||
@@ -287,7 +320,7 @@ int allocate_REs_in_RB_pilots_16QAM_siso(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
return(0);
|
||||
}
|
||||
|
||||
int allocate_REs_in_RB_no_pilots_64QAM_siso(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int allocate_REs_in_RB_no_pilots_64QAM_siso(PHY_VARS_eNB* phy_vars_eNB,
|
||||
int **txdataF,
|
||||
uint32_t *jj,
|
||||
uint32_t *jj2,
|
||||
@@ -303,10 +336,14 @@ int allocate_REs_in_RB_no_pilots_64QAM_siso(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint32_t *re_allocated,
|
||||
uint8_t skip_dc,
|
||||
uint8_t skip_half,
|
||||
uint8_t lprime,
|
||||
uint8_t mprime,
|
||||
uint8_t Ns,
|
||||
int *P1_SHIFT,
|
||||
int *P2_SHIFT)
|
||||
{
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->frame_parms;
|
||||
|
||||
uint8_t *x0 = dlsch0_harq->e;
|
||||
uint32_t qam64_table_offset_re = 0;
|
||||
@@ -423,7 +460,7 @@ int allocate_REs_in_RB_no_pilots_64QAM_siso(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
return(0);
|
||||
}
|
||||
|
||||
int allocate_REs_in_RB_pilots_64QAM_siso(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int allocate_REs_in_RB_pilots_64QAM_siso(PHY_VARS_eNB* phy_vars_eNB,
|
||||
int **txdataF,
|
||||
uint32_t *jj,
|
||||
uint32_t *jj2,
|
||||
@@ -439,10 +476,14 @@ int allocate_REs_in_RB_pilots_64QAM_siso(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint32_t *re_allocated,
|
||||
uint8_t skip_dc,
|
||||
uint8_t skip_half,
|
||||
uint8_t lprime,
|
||||
uint8_t mprime,
|
||||
uint8_t Ns,
|
||||
int *P1_SHIFT,
|
||||
int *P2_SHIFT)
|
||||
{
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->frame_parms;
|
||||
|
||||
uint8_t *x0 = dlsch0_harq->e;
|
||||
uint32_t qam64_table_offset_re = 0;
|
||||
@@ -511,7 +552,7 @@ int allocate_REs_in_RB_pilots_64QAM_siso(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
return(0);
|
||||
}
|
||||
|
||||
int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB,
|
||||
int32_t **txdataF,
|
||||
uint32_t *jj,
|
||||
uint32_t *jj2,
|
||||
@@ -527,11 +568,16 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint32_t *re_allocated,
|
||||
uint8_t skip_dc,
|
||||
uint8_t skip_half,
|
||||
uint8_t lprime,
|
||||
uint8_t mprime,
|
||||
uint8_t Ns,
|
||||
int *P1_SHIFT,
|
||||
int *P2_SHIFT)
|
||||
{
|
||||
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->frame_parms;
|
||||
|
||||
uint8_t *x0 = dlsch0_harq->e;
|
||||
MIMO_mode_t mimo_mode = dlsch0_harq->mimo_mode;
|
||||
|
||||
@@ -573,10 +619,21 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t tmp_sample1,tmp_sample2;
|
||||
int16_t tmp_amp=amp;
|
||||
int s=1;
|
||||
int mprime2 = mprime,ind,ind_dword,ind_qpsk_symb;
|
||||
|
||||
gain_lin_QPSK = (int16_t)((amp*ONE_OVER_SQRT2_Q15)>>15);
|
||||
// if (mimo_mode == LARGE_CDD) gain_lin_QPSK>>=1;
|
||||
|
||||
int32_t qpsk[4];
|
||||
((int16_t *)&qpsk[0])[0] = gain_lin_QPSK;
|
||||
((int16_t *)&qpsk[0])[1] = gain_lin_QPSK;
|
||||
((int16_t *)&qpsk[1])[0] = -gain_lin_QPSK;
|
||||
((int16_t *)&qpsk[1])[1] = gain_lin_QPSK;;
|
||||
((int16_t *)&qpsk[2])[0] = gain_lin_QPSK;;
|
||||
((int16_t *)&qpsk[2])[1] = -gain_lin_QPSK;;
|
||||
((int16_t *)&qpsk[3])[0] = -gain_lin_QPSK;;
|
||||
((int16_t *)&qpsk[3])[1] = -gain_lin_QPSK;
|
||||
|
||||
if (dlsch1_harq) {
|
||||
x1 = dlsch1_harq->e;
|
||||
// Fill these in later for TM8-10
|
||||
@@ -587,7 +644,8 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
}
|
||||
|
||||
#ifdef DEBUG_DLSCH_MODULATION
|
||||
printf("allocate_re (mod %d): symbol_offset %d re_offset %d (%d,%d), jj %d -> %d,%d\n",mod_order0,symbol_offset,re_offset,skip_dc,skip_half,*jj, x0[*jj], x0[1+*jj]);
|
||||
printf("allocate_re (mod %d): symbol_offset %d re_offset %d (%d,%d), jj %d -> %d,%d\n",mod_order0,symbol_offset,re_offset,skip_dc,skip_half,*jj, x0[*jj],
|
||||
x0[1+*jj]);
|
||||
#endif
|
||||
|
||||
first_re=0;
|
||||
@@ -620,15 +678,11 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
case 2: //QPSK
|
||||
|
||||
// printf("re %d %d(%d) : %d,%d => ",re,tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||
((int16_t*)&txdataF[aa][tti_offset])[0] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i
|
||||
}
|
||||
((int16_t*)&txdataF[0][tti_offset])[0] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i
|
||||
|
||||
*jj = *jj + 1;
|
||||
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||
((int16_t*)&txdataF[aa][tti_offset])[1] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1}
|
||||
}
|
||||
((int16_t*)&txdataF[0][tti_offset])[1] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1}
|
||||
|
||||
*jj = *jj + 1;
|
||||
|
||||
@@ -661,12 +715,10 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
|
||||
*jj=*jj+1;
|
||||
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||
((int16_t *)&txdataF[aa][tti_offset])[0]+=qam_table_s0[qam16_table_offset_re];
|
||||
((int16_t *)&txdataF[aa][tti_offset])[1]+=qam_table_s0[qam16_table_offset_im];
|
||||
// ((int16_t *)&txdataF[aa][tti_offset])[0]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15);
|
||||
// ((int16_t *)&txdataF[aa][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15);
|
||||
}
|
||||
((int16_t *)&txdataF[0][tti_offset])[0]+=qam_table_s0[qam16_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[1]+=qam_table_s0[qam16_table_offset_im];
|
||||
// ((int16_t *)&txdataF[aa][tti_offset])[0]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15);
|
||||
// ((int16_t *)&txdataF[aa][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15);
|
||||
|
||||
break;
|
||||
|
||||
@@ -706,10 +758,8 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
|
||||
*jj=*jj+1;
|
||||
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||
((int16_t *)&txdataF[aa][tti_offset])[0]+=qam_table_s0[qam64_table_offset_re];
|
||||
((int16_t *)&txdataF[aa][tti_offset])[1]+=qam_table_s0[qam64_table_offset_im];
|
||||
}
|
||||
((int16_t *)&txdataF[0][tti_offset])[0]+=qam_table_s0[qam64_table_offset_re];
|
||||
((int16_t *)&txdataF[0][tti_offset])[1]+=qam_table_s0[qam64_table_offset_im];
|
||||
|
||||
break;
|
||||
|
||||
@@ -912,7 +962,7 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
|
||||
*re_allocated = *re_allocated + 1;
|
||||
|
||||
if (frame_parms->nb_antennas_tx == 2) {
|
||||
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
||||
switch (mod_order0) {
|
||||
default:
|
||||
LOG_E(PHY,"Unknown mod_order0 %d\n",mod_order0);
|
||||
@@ -1128,7 +1178,7 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
((int16_t*)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_SQRT2_Q15)>>15);
|
||||
((int16_t*)&txdataF[0][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample1)[1]*ONE_OVER_SQRT2_Q15)>>15);
|
||||
|
||||
if (frame_parms->nb_antennas_tx == 2) {
|
||||
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
||||
layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index);
|
||||
((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_SQRT2_Q15)>>15);
|
||||
((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_SQRT2_Q15)>>15);
|
||||
@@ -1168,7 +1218,7 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
((int16_t *)&txdataF[0][tti_offset])[0] += ((int16_t*)&tmp_sample1)[0];
|
||||
((int16_t *)&txdataF[0][tti_offset])[1] += ((int16_t*)&tmp_sample1)[1];
|
||||
|
||||
if (frame_parms->nb_antennas_tx == 2) {
|
||||
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
||||
layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index);
|
||||
((int16_t*)&txdataF[1][tti_offset])[0] += ((int16_t*)&tmp_sample2)[0];
|
||||
((int16_t*)&txdataF[1][tti_offset])[1] += ((int16_t*)&tmp_sample2)[1];
|
||||
@@ -1218,7 +1268,7 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
((int16_t *)&txdataF[0][tti_offset])[0] += ((int16_t*)&tmp_sample1)[0];
|
||||
((int16_t *)&txdataF[0][tti_offset])[1] += ((int16_t*)&tmp_sample1)[1];
|
||||
|
||||
if (frame_parms->nb_antennas_tx == 2) {
|
||||
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
||||
layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index);
|
||||
((int16_t*)&txdataF[1][tti_offset])[0] += ((int16_t*)&tmp_sample2)[0];
|
||||
((int16_t*)&txdataF[1][tti_offset])[1] += ((int16_t*)&tmp_sample2)[1];
|
||||
@@ -1226,7 +1276,7 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mimo_mode == ALAMOUTI) {
|
||||
@@ -1238,10 +1288,114 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
*re_allocated = *re_allocated + 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (mimo_mode == TM7) {
|
||||
*re_allocated = *re_allocated + 1;
|
||||
|
||||
if (mimo_mode >= TM8) { //TM8,TM9,TM10
|
||||
if (is_not_UEspecRS(lprime,re,frame_parms->Nid_cell%3,frame_parms->Ncp,7)) {
|
||||
|
||||
if (is_not_UEspecRS(first_layer0,re)) {
|
||||
switch (mod_order0){
|
||||
case 2: //QPSK
|
||||
|
||||
((int16_t*)&txdataF[5][tti_offset])[0] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
|
||||
*jj = *jj + 1;
|
||||
((int16_t*)&txdataF[5][tti_offset])[1] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
|
||||
*jj = *jj + 1;
|
||||
|
||||
//printf("%d(%d) : %d,%d =>
|
||||
//",tti_offset,*jj,((int16_t*)&tmp_sample1)[0],((int16_t*)&tmp_sample1)[1]);
|
||||
break;
|
||||
|
||||
case 4: //16QAM
|
||||
|
||||
qam16_table_offset_re = 0;
|
||||
qam16_table_offset_im = 0;
|
||||
|
||||
if (x0[*jj] == 1)
|
||||
qam16_table_offset_re+=2;
|
||||
|
||||
*jj=*jj+1;
|
||||
|
||||
if (x0[*jj] == 1)
|
||||
qam16_table_offset_im+=2;
|
||||
|
||||
*jj=*jj+1;
|
||||
|
||||
|
||||
if (x0[*jj] == 1)
|
||||
qam16_table_offset_re+=1;
|
||||
|
||||
*jj=*jj+1;
|
||||
|
||||
if (x0[*jj] == 1)
|
||||
qam16_table_offset_im+=1;
|
||||
|
||||
*jj=*jj+1;
|
||||
|
||||
((int16_t*)&txdataF[5][tti_offset])[0] = (int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15);
|
||||
((int16_t*)&txdataF[5][tti_offset])[1] = (int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15);
|
||||
|
||||
break;
|
||||
|
||||
case 6: //64QAM
|
||||
|
||||
|
||||
qam64_table_offset_re = 0;
|
||||
qam64_table_offset_im = 0;
|
||||
|
||||
if (x0[*jj] == 1)
|
||||
qam64_table_offset_re+=4;
|
||||
|
||||
*jj=*jj+1;
|
||||
|
||||
if (x0[*jj] == 1)
|
||||
qam64_table_offset_im+=4;
|
||||
|
||||
*jj=*jj+1;
|
||||
|
||||
if (x0[*jj] == 1)
|
||||
qam64_table_offset_re+=2;
|
||||
|
||||
*jj=*jj+1;
|
||||
|
||||
if (x0[*jj] == 1)
|
||||
qam64_table_offset_im+=2;
|
||||
|
||||
*jj=*jj+1;
|
||||
|
||||
if (x0[*jj] == 1)
|
||||
qam64_table_offset_re+=1;
|
||||
|
||||
*jj=*jj+1;
|
||||
|
||||
if (x0[*jj] == 1)
|
||||
qam64_table_offset_im+=1;
|
||||
|
||||
*jj=*jj+1;
|
||||
|
||||
((int16_t*)&txdataF[5][tti_offset])[0] = (int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15);
|
||||
((int16_t*)&txdataF[5][tti_offset])[1] = (int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15);
|
||||
|
||||
break;
|
||||
|
||||
}
|
||||
} else {
|
||||
//precoding UE spec RS
|
||||
//printf("precoding UE spec RS\n");
|
||||
|
||||
ind = 3*lprime*dlsch0_harq->nb_rb+mprime2;
|
||||
ind_dword = ind>>4;
|
||||
ind_qpsk_symb = ind&0xf;
|
||||
|
||||
txdataF[5][tti_offset] = qpsk[(phy_vars_eNB->lte_gold_uespec_port5_table[0][Ns][ind_dword]>>(2*ind_qpsk_symb))&3];
|
||||
mprime2++;
|
||||
|
||||
}
|
||||
|
||||
} else if (mimo_mode >= TM8) { //TM8,TM9,TM10
|
||||
//uint8_t is_not_UEspecRS(int8_t lprime, uint8_t re, uint8_t nushift, uint8_t Ncp, uint8_t beamforming_mode)
|
||||
|
||||
if (is_not_UEspecRS(lprime,re,frame_parms->nushift,frame_parms->Ncp,8)) {
|
||||
switch (mod_order0) {
|
||||
case 2: //QPSK
|
||||
|
||||
@@ -1256,7 +1410,7 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
break;
|
||||
|
||||
case 4: //16QAM
|
||||
if (is_not_UEspecRS(0/*layer (FIXME uninitialized!)*/,re)) {
|
||||
if (is_not_UEspecRS(lprime,re,frame_parms->nushift,frame_parms->Ncp,8)) {
|
||||
qam16_table_offset_re = 0;
|
||||
qam16_table_offset_im = 0;
|
||||
|
||||
@@ -1345,21 +1499,22 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int allocate_REs_in_RB_MCH(int32_t **txdataF,
|
||||
uint32_t *jj,
|
||||
uint16_t re_offset,
|
||||
uint32_t symbol_offset,
|
||||
uint8_t *x0,
|
||||
uint8_t l,
|
||||
uint8_t mod_order,
|
||||
int16_t amp,
|
||||
int16_t *qam_table_s,
|
||||
uint32_t *re_allocated,
|
||||
uint8_t skip_dc,
|
||||
LTE_DL_FRAME_PARMS *frame_parms)
|
||||
uint16_t re_offset,
|
||||
uint32_t symbol_offset,
|
||||
uint8_t *x0,
|
||||
uint8_t l,
|
||||
uint8_t mod_order,
|
||||
int16_t amp,
|
||||
int16_t *qam_table_s,
|
||||
uint32_t *re_allocated,
|
||||
uint8_t skip_dc,
|
||||
LTE_DL_FRAME_PARMS *frame_parms)
|
||||
{
|
||||
|
||||
uint32_t tti_offset,aa;
|
||||
uint32_t tti_offset;
|
||||
uint8_t re;
|
||||
uint8_t qam64_table_offset_re = 0;
|
||||
uint8_t qam64_table_offset_im = 0;
|
||||
@@ -1397,99 +1552,91 @@ int allocate_REs_in_RB_MCH(int32_t **txdataF,
|
||||
|
||||
|
||||
switch (mod_order) {
|
||||
case 2: //QPSK
|
||||
case 2: //QPSK
|
||||
|
||||
// printf("%d : %d,%d => ",tti_offset,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++)
|
||||
((int16_t*)&txdataF[aa][tti_offset])[0] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i
|
||||
((int16_t*)&txdataF[4][tti_offset])[0] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i
|
||||
|
||||
*jj = *jj + 1;
|
||||
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++)
|
||||
((int16_t*)&txdataF[aa][tti_offset])[1] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1}
|
||||
((int16_t*)&txdataF[4][tti_offset])[1] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1}
|
||||
|
||||
*jj = *jj + 1;
|
||||
|
||||
// printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
|
||||
break;
|
||||
|
||||
case 4: //16QAM
|
||||
case 4: //16QAM
|
||||
|
||||
qam16_table_offset_re = 0;
|
||||
qam16_table_offset_im = 0;
|
||||
qam16_table_offset_re = 0;
|
||||
qam16_table_offset_im = 0;
|
||||
|
||||
if (x0[*jj] == 1)
|
||||
qam16_table_offset_re+=2;
|
||||
if (x0[*jj] == 1)
|
||||
qam16_table_offset_re+=2;
|
||||
|
||||
*jj=*jj+1;
|
||||
*jj=*jj+1;
|
||||
|
||||
if (x0[*jj] == 1)
|
||||
qam16_table_offset_im+=2;
|
||||
if (x0[*jj] == 1)
|
||||
qam16_table_offset_im+=2;
|
||||
|
||||
*jj=*jj+1;
|
||||
*jj=*jj+1;
|
||||
|
||||
|
||||
if (x0[*jj] == 1)
|
||||
qam16_table_offset_re+=1;
|
||||
if (x0[*jj] == 1)
|
||||
qam16_table_offset_re+=1;
|
||||
|
||||
*jj=*jj+1;
|
||||
*jj=*jj+1;
|
||||
|
||||
if (x0[*jj] == 1)
|
||||
qam16_table_offset_im+=1;
|
||||
if (x0[*jj] == 1)
|
||||
qam16_table_offset_im+=1;
|
||||
|
||||
*jj=*jj+1;
|
||||
*jj=*jj+1;
|
||||
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||
((int16_t *)&txdataF[aa][tti_offset])[0]+=qam_table_s[qam16_table_offset_re];
|
||||
((int16_t *)&txdataF[aa][tti_offset])[1]+=qam_table_s[qam16_table_offset_im];
|
||||
// ((int16_t *)&txdataF[aa][tti_offset])[0]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15);
|
||||
// ((int16_t *)&txdataF[aa][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15);
|
||||
}
|
||||
((int16_t *)&txdataF[4][tti_offset])[0]=qam_table_s[qam16_table_offset_re];//(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15);
|
||||
((int16_t *)&txdataF[4][tti_offset])[1]=qam_table_s[qam16_table_offset_im];//(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15);
|
||||
|
||||
break;
|
||||
break;
|
||||
|
||||
case 6: //64QAM
|
||||
case 6: //64QAM
|
||||
|
||||
|
||||
qam64_table_offset_re = 0;
|
||||
qam64_table_offset_im = 0;
|
||||
qam64_table_offset_re = 0;
|
||||
qam64_table_offset_im = 0;
|
||||
|
||||
if (x0[*jj] == 1)
|
||||
qam64_table_offset_re+=4;
|
||||
if (x0[*jj] == 1)
|
||||
qam64_table_offset_re+=4;
|
||||
|
||||
*jj=*jj+1;
|
||||
*jj=*jj+1;
|
||||
|
||||
if (x0[*jj] == 1)
|
||||
qam64_table_offset_im+=4;
|
||||
if (x0[*jj] == 1)
|
||||
qam64_table_offset_im+=4;
|
||||
|
||||
*jj=*jj+1;
|
||||
*jj=*jj+1;
|
||||
|
||||
if (x0[*jj] == 1)
|
||||
qam64_table_offset_re+=2;
|
||||
if (x0[*jj] == 1)
|
||||
qam64_table_offset_re+=2;
|
||||
|
||||
*jj=*jj+1;
|
||||
*jj=*jj+1;
|
||||
|
||||
if (x0[*jj] == 1)
|
||||
qam64_table_offset_im+=2;
|
||||
if (x0[*jj] == 1)
|
||||
qam64_table_offset_im+=2;
|
||||
|
||||
*jj=*jj+1;
|
||||
*jj=*jj+1;
|
||||
|
||||
if (x0[*jj] == 1)
|
||||
qam64_table_offset_re+=1;
|
||||
if (x0[*jj] == 1)
|
||||
qam64_table_offset_re+=1;
|
||||
|
||||
*jj=*jj+1;
|
||||
*jj=*jj+1;
|
||||
|
||||
if (x0[*jj] == 1)
|
||||
qam64_table_offset_im+=1;
|
||||
if (x0[*jj] == 1)
|
||||
qam64_table_offset_im+=1;
|
||||
|
||||
*jj=*jj+1;
|
||||
*jj=*jj+1;
|
||||
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||
((int16_t *)&txdataF[aa][tti_offset])[0]+=qam_table_s[qam64_table_offset_re];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15);
|
||||
((int16_t *)&txdataF[aa][tti_offset])[1]+=qam_table_s[qam64_table_offset_im];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15);
|
||||
}
|
||||
((int16_t *)&txdataF[4][tti_offset])[0]=qam_table_s[qam64_table_offset_re];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15);
|
||||
((int16_t *)&txdataF[4][tti_offset])[1]=qam_table_s[qam64_table_offset_im];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15);
|
||||
|
||||
break;
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1506,38 +1653,38 @@ uint8_t get_pmi(uint8_t N_RB_DL,LTE_DL_eNB_HARQ_t *dlsch_harq,uint16_t rb)
|
||||
|
||||
// printf("Getting pmi for RB %d => %d\n",rb,(pmi_alloc>>((rb>>2)<<1))&3);
|
||||
switch (N_RB_DL) {
|
||||
case 6: // 1 PRB per subband
|
||||
if (mode <= PUSCH_PRECODING1)
|
||||
return((pmi_alloc>>(rb<<1))&3);
|
||||
else
|
||||
return((pmi_alloc>>rb)&1);
|
||||
case 6: // 1 PRB per subband
|
||||
if (mode <= PUSCH_PRECODING1)
|
||||
return((pmi_alloc>>(rb<<1))&3);
|
||||
else
|
||||
return((pmi_alloc>>rb)&1);
|
||||
|
||||
break;
|
||||
break;
|
||||
|
||||
default:
|
||||
case 25: // 4 PRBs per subband
|
||||
if (mode <= PUSCH_PRECODING1)
|
||||
return((pmi_alloc>>((rb>>2)<<1))&3);
|
||||
else
|
||||
return((pmi_alloc>>(rb>>2))&1);
|
||||
default:
|
||||
case 25: // 4 PRBs per subband
|
||||
if (mode <= PUSCH_PRECODING1)
|
||||
return((pmi_alloc>>((rb>>2)<<1))&3);
|
||||
else
|
||||
return((pmi_alloc>>(rb>>2))&1);
|
||||
|
||||
break;
|
||||
break;
|
||||
|
||||
case 50: // 6 PRBs per subband
|
||||
if (mode <= PUSCH_PRECODING1)
|
||||
return((pmi_alloc>>((rb/6)<<1))&3);
|
||||
else
|
||||
return((pmi_alloc>>(rb/6))&1);
|
||||
case 50: // 6 PRBs per subband
|
||||
if (mode <= PUSCH_PRECODING1)
|
||||
return((pmi_alloc>>((rb/6)<<1))&3);
|
||||
else
|
||||
return((pmi_alloc>>(rb/6))&1);
|
||||
|
||||
break;
|
||||
break;
|
||||
|
||||
case 100: // 8 PRBs per subband
|
||||
if (mode <= PUSCH_PRECODING1)
|
||||
return((pmi_alloc>>((rb>>3)<<1))&3);
|
||||
else
|
||||
return((pmi_alloc>>(rb>>3))&1);
|
||||
case 100: // 8 PRBs per subband
|
||||
if (mode <= PUSCH_PRECODING1)
|
||||
return((pmi_alloc>>((rb>>3)<<1))&3);
|
||||
else
|
||||
return((pmi_alloc>>(rb>>3))&1);
|
||||
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1679,14 +1826,15 @@ inline int check_skip_dc(int rb,LTE_DL_FRAME_PARMS *frame_parms) {
|
||||
}
|
||||
|
||||
|
||||
int dlsch_modulation(int32_t **txdataF,
|
||||
int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
|
||||
int32_t **txdataF,
|
||||
int16_t amp,
|
||||
uint32_t subframe_offset,
|
||||
LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t num_pdcch_symbols,
|
||||
LTE_eNB_DLSCH_t *dlsch0,
|
||||
LTE_eNB_DLSCH_t *dlsch1)
|
||||
{
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->frame_parms;
|
||||
|
||||
uint8_t nsymb;
|
||||
uint8_t harq_pid = dlsch0->current_harq_pid;
|
||||
@@ -1704,7 +1852,7 @@ int dlsch_modulation(int32_t **txdataF,
|
||||
int16_t qam16_table_a0[4],qam64_table_a0[8],qam16_table_b0[4],qam64_table_b0[8];
|
||||
int16_t qam16_table_a1[4],qam64_table_a1[8],qam16_table_b1[4],qam64_table_b1[8];
|
||||
int16_t *qam_table_s0=NULL,*qam_table_s1=NULL;
|
||||
int (*allocate_REs)(LTE_DL_FRAME_PARMS *,
|
||||
int (*allocate_REs)(PHY_VARS_eNB*,
|
||||
int **,
|
||||
uint32_t*,
|
||||
uint32_t*,
|
||||
@@ -1720,10 +1868,17 @@ int dlsch_modulation(int32_t **txdataF,
|
||||
uint32_t *,
|
||||
uint8_t,
|
||||
uint8_t,
|
||||
uint8_t,
|
||||
uint8_t,
|
||||
uint8_t,
|
||||
int *,
|
||||
int *);
|
||||
int P1_SHIFT[13],P2_SHIFT[13];
|
||||
int offset,nushiftmod3;
|
||||
MIMO_mode_t mimo_mode = dlsch0_harq->mimo_mode;
|
||||
uint8_t mprime=0,Ns;
|
||||
int8_t lprime=-1;
|
||||
int aa=0;
|
||||
|
||||
#ifdef DEBUG_DLSCH_MODULATION
|
||||
uint8_t Nl0 = dlsch0_harq->Nl;
|
||||
@@ -1746,7 +1901,7 @@ int dlsch_modulation(int32_t **txdataF,
|
||||
amp_rho_b = (int16_t)(((int32_t)amp*dlsch0->sqrt_rho_b)>>13);
|
||||
|
||||
if (mod_order0 == 4)
|
||||
for (i=0; i<4; i++) {
|
||||
for (i=0;i<4; i++) {
|
||||
qam16_table_a0[i] = (int16_t)(((int32_t)qam16_table[i]*amp_rho_a)>>15);
|
||||
qam16_table_b0[i] = (int16_t)(((int32_t)qam16_table[i]*amp_rho_b)>>15);
|
||||
}
|
||||
@@ -1804,6 +1959,39 @@ int dlsch_modulation(int32_t **txdataF,
|
||||
pilots=0;
|
||||
}
|
||||
|
||||
if(mimo_mode==TM7){ //36.211 V8.6.0 2009-03
|
||||
mprime = 0;
|
||||
if (frame_parms->Ncp==0) { // normal prefix
|
||||
if (l==12)
|
||||
lprime=3; // pilots in nushift+3, nushift+9
|
||||
else if (l==9)
|
||||
lprime=2; // pilots in nushift, nushift+6
|
||||
else if (l==6)
|
||||
lprime=1; // pilots in nushift+3, nushift+9
|
||||
else if (l==3)
|
||||
lprime=0; // pilots in nushift, nushift+6
|
||||
else
|
||||
lprime=-1;
|
||||
} else {
|
||||
if (l==10)
|
||||
lprime=2;
|
||||
else if (l==7)
|
||||
lprime=1;
|
||||
else if (l==4)
|
||||
lprime=0;
|
||||
else
|
||||
lprime=-1;
|
||||
}
|
||||
|
||||
// mapping ue specific beamforming weights from UE specified DLSCH structure to common space
|
||||
for (aa=0;aa<frame_parms->nb_antennas_tx;aa++){
|
||||
memcpy(phy_vars_eNB->common_vars.beam_weights[0][5][aa],dlsch0->ue_spec_bf_weights[0][aa],frame_parms->ofdm_symbol_size*sizeof(int32_t));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Ns = 2*subframe_offset+(l>=(nsymb>>1));
|
||||
|
||||
offset = (pilots==2)?3:0;
|
||||
nushiftmod3 = frame_parms->nushift%3;
|
||||
|
||||
@@ -1934,25 +2122,32 @@ int dlsch_modulation(int32_t **txdataF,
|
||||
|
||||
|
||||
if (rb_alloc_ind > 0) {
|
||||
// printf("Allocated rb %d/symbol %d, skip_half %d, subframe_offset %d, symbol_offset %d, re_offset %d, jj %d\n",rb,l,skip_half,subframe_offset,symbol_offset,re_offset,jj);
|
||||
allocate_REs(frame_parms,
|
||||
txdataF,
|
||||
&jj,
|
||||
&jj2,
|
||||
re_offset,
|
||||
symbol_offset,
|
||||
dlsch0->harq_processes[harq_pid],
|
||||
(dlsch1==NULL) ? NULL : dlsch1->harq_processes[harq_pid],
|
||||
pilots,
|
||||
((pilots) ? amp_rho_b : amp_rho_a),
|
||||
get_pmi(frame_parms->N_RB_DL,dlsch0->harq_processes[harq_pid],rb),
|
||||
qam_table_s0,
|
||||
qam_table_s1,
|
||||
&re_allocated,
|
||||
skip_dc,
|
||||
skip_half,
|
||||
P1_SHIFT,
|
||||
P2_SHIFT);
|
||||
// printf("Allocated rb %d/symbol %d, skip_half %d, subframe_offset %d, symbol_offset %d, re_offset %d, jj %d\n",rb,l,skip_half,subframe_offset,symbol_offset,re_offset,jj);
|
||||
allocate_REs(phy_vars_eNB,
|
||||
txdataF,
|
||||
&jj,
|
||||
&jj2,
|
||||
re_offset,
|
||||
symbol_offset,
|
||||
dlsch0->harq_processes[harq_pid],
|
||||
(dlsch1==NULL) ? NULL : dlsch1->harq_processes[harq_pid],
|
||||
pilots,
|
||||
((pilots) ? amp_rho_b : amp_rho_a),
|
||||
get_pmi(frame_parms->N_RB_DL,dlsch0->harq_processes[harq_pid],rb),
|
||||
qam_table_s0,
|
||||
qam_table_s1,
|
||||
&re_allocated,
|
||||
skip_dc,
|
||||
skip_half,
|
||||
lprime,
|
||||
mprime,
|
||||
Ns,
|
||||
P1_SHIFT,
|
||||
P2_SHIFT);
|
||||
|
||||
if ((mimo_mode == TM7) && (lprime>=0))
|
||||
mprime +=3+frame_parms->Ncp;
|
||||
|
||||
}
|
||||
else {
|
||||
// printf("Unallocated rb %d/symbol %d, re_offset %d, jj %d\n",rb,l,re_offset,jj);
|
||||
@@ -1974,7 +2169,7 @@ int dlsch_modulation(int32_t **txdataF,
|
||||
|
||||
|
||||
#ifdef DEBUG_DLSCH_MODULATION
|
||||
printf("generate_dlsch : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch0_harq->nb_rb,dlsch0_harq->rb_alloc,mod_order0,Nl0,2,0,subframe_offset));
|
||||
printf("generate_dlsch : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch0_harq->nb_rb,dlsch0_harq->rb_alloc,mod_order0,Nl0,2,0,subframe_offset,1/*transmission mode*/));
|
||||
#endif
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_MODULATION, VCD_FUNCTION_OUT);
|
||||
@@ -2073,7 +2268,7 @@ int mch_modulation(int32_t **txdataF,
|
||||
|
||||
|
||||
#ifdef DEBUG_DLSCH_MODULATION
|
||||
printf("generate_dlsch(MCH) : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->rb_alloc,mod_order,1,2,0,subframe_offset));
|
||||
printf("generate_dlsch(MCH) : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->rb_alloc,mod_order,1,2,0,subframe_offset,1/*transmission mode*/));
|
||||
#endif
|
||||
|
||||
return (re_allocated);
|
||||
|
||||
@@ -42,6 +42,8 @@ void generate_grouphop(LTE_DL_FRAME_PARMS *frame_parms)
|
||||
// This is from Section 5.5.1.3
|
||||
uint32_t fss_pusch = frame_parms->Nid_cell + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH;
|
||||
|
||||
uint32_t fss_pucch = frame_parms->Nid_cell;
|
||||
|
||||
x2 = frame_parms->Nid_cell/30;
|
||||
#ifdef DEBUG_GROUPHOP
|
||||
printf("[PHY] GroupHop:");
|
||||
@@ -49,7 +51,10 @@ void generate_grouphop(LTE_DL_FRAME_PARMS *frame_parms)
|
||||
|
||||
for (ns=0; ns<20; ns++) {
|
||||
if (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled == 0)
|
||||
{
|
||||
frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[ns] = fss_pusch%30;
|
||||
frame_parms->pucch_config_common.grouphop[ns] = fss_pucch%30;
|
||||
}
|
||||
else {
|
||||
if ((ns&3) == 0) {
|
||||
s = lte_gold_generic(&x1,&x2,reset);
|
||||
@@ -57,6 +62,7 @@ void generate_grouphop(LTE_DL_FRAME_PARMS *frame_parms)
|
||||
}
|
||||
|
||||
frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[ns] = (((uint8_t*)&s)[ns&3]+fss_pusch)%30;
|
||||
frame_parms->pucch_config_common.grouphop[ns] = (((uint8_t*)&s)[ns&3]+fss_pucch)%30;
|
||||
}
|
||||
|
||||
#ifdef DEBUG_GROUPHOP
|
||||
|
||||
@@ -152,7 +152,7 @@ int pbch_detection(PHY_VARS_UE *ue, runmode_t mode)
|
||||
|
||||
if (pbch_decoded) {
|
||||
|
||||
frame_parms->nb_antennas_tx_eNB = pbch_tx_ant;
|
||||
frame_parms->nb_antenna_ports_eNB = pbch_tx_ant;
|
||||
|
||||
// set initial transmission mode to 1 or 2 depending on number of detected TX antennas
|
||||
frame_parms->mode1_flag = (pbch_tx_ant==1);
|
||||
@@ -462,6 +462,13 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode)
|
||||
}
|
||||
}
|
||||
|
||||
/* Consider this is a false detection if the offset is > 1000 Hz */
|
||||
if( (abs(ue->common_vars.freq_offset) > 150) && (ret == 0) )
|
||||
{
|
||||
ret=-1;
|
||||
LOG_E(HW,"Ignore MIB with high freq offset [%d Hz] estimation \n",ue->common_vars.freq_offset);
|
||||
}
|
||||
|
||||
if (ret==0) { // PBCH found so indicate sync to higher layers and configure frame parameters
|
||||
|
||||
//#ifdef DEBUG_INITIAL_SYNCH
|
||||
@@ -469,6 +476,15 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode)
|
||||
//#endif
|
||||
|
||||
if (ue->UE_scan_carrier == 0) {
|
||||
|
||||
#if UE_AUTOTEST_TRACE
|
||||
LOG_I(PHY,"[UE %d] AUTOTEST Cell Sync : frame = %d, rx_offset %d, freq_offset %d \n",
|
||||
ue->Mod_id,
|
||||
ue->proc.proc_rxtx[0].frame_rx,
|
||||
ue->rx_offset,
|
||||
ue->common_vars.freq_offset );
|
||||
#endif
|
||||
|
||||
if (ue->mac_enabled==1) {
|
||||
LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",ue->Mod_id);
|
||||
//mac_resynch();
|
||||
@@ -506,7 +522,7 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode)
|
||||
ue->frame_parms.N_RB_DL,
|
||||
ue->frame_parms.phich_config_common.phich_duration,
|
||||
phich_string[ue->frame_parms.phich_config_common.phich_resource],
|
||||
ue->frame_parms.nb_antennas_tx_eNB);
|
||||
ue->frame_parms.nb_antenna_ports_eNB);
|
||||
|
||||
#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||
LOG_I(PHY,"[UE %d] Frame %d Measured Carrier Frequency %.0f Hz (offset %d Hz)\n",
|
||||
|
||||
@@ -325,11 +325,8 @@ int adjust_G(LTE_DL_FRAME_PARMS *frame_parms,uint32_t *rb_alloc,uint8_t mod_orde
|
||||
return(0);
|
||||
}
|
||||
|
||||
int get_G(LTE_DL_FRAME_PARMS *frame_parms,uint16_t nb_rb,uint32_t *rb_alloc,uint8_t mod_order,uint8_t Nl,uint8_t num_pdcch_symbols,int frame,uint8_t subframe)
|
||||
int get_G(LTE_DL_FRAME_PARMS *frame_parms,uint16_t nb_rb,uint32_t *rb_alloc,uint8_t mod_order,uint8_t Nl,uint8_t num_pdcch_symbols,int frame,uint8_t subframe,uint8_t beamforming_mode)
|
||||
{
|
||||
|
||||
|
||||
|
||||
int G_adj;
|
||||
|
||||
if (is_pmch_subframe(frame,subframe,frame_parms) == 0) {
|
||||
@@ -340,9 +337,11 @@ int get_G(LTE_DL_FRAME_PARMS *frame_parms,uint16_t nb_rb,uint32_t *rb_alloc,uint
|
||||
// PDDDPDD PDDDPDD - 13 PDSCH symbols, 10 full, 3 w/ pilots = 10*12 + 3*8
|
||||
// PCDDPDD PDDDPDD - 12 PDSCH symbols, 9 full, 3 w/ pilots = 9*12 + 3*8
|
||||
// PCCDPDD PDDDPDD - 11 PDSCH symbols, 8 full, 3 w/pilots = 8*12 + 3*8
|
||||
if (frame_parms->mode1_flag==0) // SISO
|
||||
if (beamforming_mode==0 && frame_parms->mode1_flag==0)
|
||||
return((((int)nb_rb * mod_order * ((11-num_pdcch_symbols)*12 + 3*8)) - G_adj)*Nl);
|
||||
else
|
||||
else if(beamforming_mode==7)
|
||||
return(((int)nb_rb * mod_order * ((7-num_pdcch_symbols)*12 + 3*10 + 4*9)) - G_adj);
|
||||
else //SISO
|
||||
return(((int)nb_rb * mod_order * ((11-num_pdcch_symbols)*12 + 3*10)) - G_adj);
|
||||
} else {
|
||||
// PDDPDD PDDPDD - 11 PDSCH symbols, 8 full, 3 w/ pilots = 8*12 + 3*8
|
||||
@@ -350,7 +349,9 @@ int get_G(LTE_DL_FRAME_PARMS *frame_parms,uint16_t nb_rb,uint32_t *rb_alloc,uint
|
||||
// PCCPDD PDDPDD - 9 PDSCH symbols, 6 full, 3 w/pilots = 6*12 + 3*8
|
||||
if (frame_parms->mode1_flag==0)
|
||||
return((((int)nb_rb * mod_order * ((9-num_pdcch_symbols)*12 + 3*8)) - G_adj)*Nl);
|
||||
else
|
||||
else if(beamforming_mode==7)
|
||||
return(((int)nb_rb * mod_order * ((5-num_pdcch_symbols)*12 + 3*8 + 4*9)) - G_adj);
|
||||
else //SISO
|
||||
return(((int)nb_rb * mod_order * ((9-num_pdcch_symbols)*12 + 3*10)) - G_adj);
|
||||
}
|
||||
} else { // This is an MBSFN subframe
|
||||
|
||||
@@ -66,7 +66,7 @@ int allocate_pbch_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
MIMO_mode_t mimo_mode = (frame_parms->mode1_flag==1)?SISO:ALAMOUTI;
|
||||
|
||||
|
||||
uint32_t tti_offset,aa;
|
||||
uint32_t tti_offset;
|
||||
uint8_t re;
|
||||
int16_t gain_lin_QPSK;
|
||||
int16_t re_off=re_offset;
|
||||
@@ -91,15 +91,11 @@ int allocate_pbch_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
*re_allocated = *re_allocated + 1;
|
||||
|
||||
// printf("%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||
((int16_t*)&txdataF[aa][tti_offset])[0] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i
|
||||
}
|
||||
((int16_t*)&txdataF[0][tti_offset])[0] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i
|
||||
|
||||
*jj = *jj + 1;
|
||||
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||
((int16_t*)&txdataF[aa][tti_offset])[1] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1}
|
||||
}
|
||||
((int16_t*)&txdataF[0][tti_offset])[1] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1}
|
||||
|
||||
*jj = *jj + 1;
|
||||
} else if (mimo_mode == ALAMOUTI) {
|
||||
@@ -192,7 +188,7 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch,
|
||||
|
||||
/*
|
||||
// scramble crc with PBCH CRC mask (Table 5.3.1.1-1 of 3GPP 36.212-860)
|
||||
switch (frame_parms->nb_antennas_tx_eNB) {
|
||||
switch (frame_parms->nb_antenna_ports_eNB) {
|
||||
case 1:
|
||||
crc = crc ^ (uint16_t) 0;
|
||||
break;
|
||||
@@ -224,7 +220,7 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch,
|
||||
if (frame_parms->mode1_flag == 1)
|
||||
amask = 0x0000;
|
||||
else {
|
||||
switch (frame_parms->nb_antennas_tx_eNB) {
|
||||
switch (frame_parms->nb_antenna_ports_eNB) {
|
||||
case 1:
|
||||
amask = 0x0000;
|
||||
break;
|
||||
@@ -484,7 +480,7 @@ uint16_t pbch_extract(int **rxdataF,
|
||||
}
|
||||
}
|
||||
|
||||
for (aatx=0; aatx<4; aatx++) { //frame_parms->nb_antennas_tx_eNB;aatx++) {
|
||||
for (aatx=0; aatx<4; aatx++) { //frame_parms->nb_antenna_ports_eNB;aatx++) {
|
||||
if (high_speed_flag == 1)
|
||||
dl_ch0 = &dl_ch_estimates[(aatx<<1)+aarx][LTE_CE_OFFSET+ch_offset+(symbol*(frame_parms->ofdm_symbol_size))];
|
||||
else
|
||||
@@ -546,7 +542,7 @@ int pbch_channel_level(int **dl_ch_estimates_ext,
|
||||
uint32_t nsymb = (frame_parms->Ncp==0) ? 7:6;
|
||||
uint32_t symbol_mod = symbol % nsymb;
|
||||
|
||||
for (aatx=0; aatx<4; aatx++) //frame_parms->nb_antennas_tx_eNB;aatx++)
|
||||
for (aatx=0; aatx<4; aatx++) //frame_parms->nb_antenna_ports_eNB;aatx++)
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
//clear average level
|
||||
|
||||
@@ -616,7 +612,7 @@ void pbch_channel_compensation(int **rxdataF_ext,
|
||||
#endif
|
||||
symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
|
||||
|
||||
for (aatx=0; aatx<4; aatx++) //frame_parms->nb_antennas_tx_eNB;aatx++)
|
||||
for (aatx=0; aatx<4; aatx++) //frame_parms->nb_antenna_ports_eNB;aatx++)
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
@@ -723,7 +719,7 @@ void pbch_detection_mrc(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
|
||||
|
||||
if (frame_parms->nb_antennas_rx>1) {
|
||||
for (aatx=0; aatx<4; aatx++) { //frame_parms->nb_antennas_tx_eNB;aatx++) {
|
||||
for (aatx=0; aatx<4; aatx++) { //frame_parms->nb_antenna_ports_eNB;aatx++) {
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
rxdataF_comp128_0 = (__m128i *)&rxdataF_comp[(aatx<<1)][symbol_mod*6*12];
|
||||
rxdataF_comp128_1 = (__m128i *)&rxdataF_comp[(aatx<<1)+1][symbol_mod*6*12];
|
||||
@@ -1070,7 +1066,7 @@ uint16_t rx_pbch_emul(PHY_VARS_UE *phy_vars_ue,
|
||||
if (pbch_phase == (frame_rx % 4)) {
|
||||
if (uniformrandom() >= bler) {
|
||||
memcpy(phy_vars_ue->pbch_vars[eNB_id]->decoded_output,PHY_vars_eNB_g[eNB_id][CC_id]->pbch_pdu,PBCH_PDU_SIZE);
|
||||
return(PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.nb_antennas_tx_eNB);
|
||||
return(PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.nb_antenna_ports_eNB);
|
||||
} else
|
||||
return(-1);
|
||||
} else
|
||||
|
||||
@@ -208,7 +208,7 @@ void generate_pcfich(uint8_t num_pdcch_symbols,
|
||||
if ((i!=nushiftmod3)&&(i!=(nushiftmod3+3))) {
|
||||
txdataF[0][symbol_offset+reg_offset+i] = pcfich_d[0][m];
|
||||
|
||||
if (frame_parms->nb_antennas_tx_eNB>1)
|
||||
if (frame_parms->nb_antenna_ports_eNB>1)
|
||||
txdataF[1][symbol_offset+reg_offset+i] = pcfich_d[1][m];
|
||||
|
||||
m++;
|
||||
|
||||
@@ -34,6 +34,10 @@
|
||||
#include "PHY/extern.h"
|
||||
#include "SCHED/defs.h"
|
||||
#include "defs.h"
|
||||
|
||||
#include "LAYER2/MAC/extern.h"
|
||||
#include "LAYER2/MAC/defs.h"
|
||||
|
||||
#ifndef USER_MODE
|
||||
#include "ARCH/CBMIMO1/DEVICE_DRIVER/extern.h"
|
||||
#endif
|
||||
@@ -1046,7 +1050,6 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
|
||||
// This routine demodulates the PHICH and updates PUSCH/ULSCH parameters
|
||||
|
||||
|
||||
void rx_phich(PHY_VARS_UE *ue,
|
||||
UE_rxtx_proc_t *proc,
|
||||
uint8_t subframe,
|
||||
@@ -1081,8 +1084,10 @@ void rx_phich(PHY_VARS_UE *ue,
|
||||
if (!ulsch)
|
||||
return;
|
||||
|
||||
LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH RX Status: %d \n",ue->Mod_id,harq_pid,proc->frame_rx,subframe, ulsch->harq_processes[harq_pid]->status);
|
||||
|
||||
if (ulsch->harq_processes[harq_pid]->status == ACTIVE) {
|
||||
LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH RX ACTIVE\n",ue->Mod_id,harq_pid,proc->frame_rx,subframe);
|
||||
LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH RX ACTIVE\n",ue->Mod_id,harq_pid,proc->frame_rx,subframe);
|
||||
Ngroup_PHICH = (frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)/48;
|
||||
|
||||
if (((frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)%48) > 0)
|
||||
@@ -1375,15 +1380,39 @@ void rx_phich(PHY_VARS_UE *ue,
|
||||
subframe,
|
||||
HI16,
|
||||
nseq_PHICH,
|
||||
ngroup_PHICH);
|
||||
ngroup_PHICH,
|
||||
ulsch->Mlimit);
|
||||
//#endif
|
||||
ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
|
||||
|
||||
// ulsch->harq_processes[harq_pid]->Ndi = 0;
|
||||
ulsch->harq_processes[harq_pid]->round++;
|
||||
ulsch->harq_processes[harq_pid]->rvidx = rv_table[ulsch->harq_processes[harq_pid]->round&3];
|
||||
ulsch->O_RI = 0;
|
||||
ulsch->O = 0;
|
||||
ulsch->uci_format = HLC_subband_cqi_nopmi;
|
||||
|
||||
if ( ulsch->harq_processes[harq_pid]->round >= (ulsch->Mlimit - 1) )
|
||||
{
|
||||
// this is last push re transmission
|
||||
ulsch->harq_processes[harq_pid]->rvidx = rv_table[ulsch->harq_processes[harq_pid]->round&3];
|
||||
ulsch->O_RI = 0;
|
||||
ulsch->O = 0;
|
||||
ulsch->uci_format = HLC_subband_cqi_nopmi;
|
||||
|
||||
// disable phich decoding since it is the last retransmission
|
||||
ulsch->harq_processes[harq_pid]->status = IDLE;
|
||||
|
||||
//ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 0;
|
||||
//ulsch->harq_processes[harq_pid]->round = 0;
|
||||
|
||||
//LOG_I(PHY,"PUSCH MAX Retransmission acheived ==> flush harq buff (%d) \n",harq_pid);
|
||||
//LOG_I(PHY,"[HARQ-UL harqId: %d] PHICH NACK MAX RETRANS(%d) ==> subframe_scheduling_flag = %d round: %d\n", harq_pid, ulsch->Mlimit, ulsch->harq_processes[harq_pid]->subframe_scheduling_flag, ulsch->harq_processes[harq_pid]->round);
|
||||
}
|
||||
else
|
||||
{
|
||||
// ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
|
||||
ulsch->harq_processes[harq_pid]->rvidx = rv_table[ulsch->harq_processes[harq_pid]->round&3];
|
||||
ulsch->O_RI = 0;
|
||||
ulsch->O = 0;
|
||||
ulsch->uci_format = HLC_subband_cqi_nopmi;
|
||||
//LOG_I(PHY,"[HARQ-UL harqId: %d] PHICH NACK ==> subframe_scheduling_flag = %d round: %d\n", harq_pid, ulsch->harq_processes[harq_pid]->subframe_scheduling_flag,ulsch->harq_processes[harq_pid]->round);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1405,11 +1434,22 @@ void rx_phich(PHY_VARS_UE *ue,
|
||||
//#endif
|
||||
}
|
||||
|
||||
// LOG_I(PHY,"[HARQ-UL harqId: %d] subframe_scheduling_flag = %d \n",harq_pid, ulsch->harq_processes[harq_pid]->subframe_scheduling_flag);
|
||||
|
||||
// Incase of adaptive retransmission, PHICH is always decoded as ACK (at least with OAI-eNB)
|
||||
// Workaround:
|
||||
// rely only on DCI0 decoding and check if NDI has toggled
|
||||
// save current harq_processes content in temporary struct
|
||||
// harqId-8 corresponds to the temporary struct. In total we have 8 harq process(0 ..7) + 1 temporary harq process()
|
||||
//ulsch->harq_processes[8] = ulsch->harq_processes[harq_pid];
|
||||
|
||||
ulsch->harq_processes[harq_pid]->subframe_scheduling_flag =0;
|
||||
ulsch->harq_processes[harq_pid]->status = IDLE;
|
||||
ulsch->harq_processes[harq_pid]->round = 0;
|
||||
// inform MAC?
|
||||
ue->ulsch_Msg3_active[eNB_id] = 0;
|
||||
|
||||
//LOG_I(PHY,"[HARQ-UL harqId: %d] PHICH ACK ==> subframe_scheduling_flag = %d round: %d\n", harq_pid, ulsch->harq_processes[harq_pid]->subframe_scheduling_flag, ulsch->harq_processes[harq_pid]->round);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1453,8 +1493,12 @@ void generate_phich_top(PHY_VARS_eNB *eNB,
|
||||
LOG_D(PHY,"[eNB][PUSCH %d/%x] Frame %d subframe %d (pusch_subframe %d,pusch_frame %d) phich active %d\n",
|
||||
harq_pid,ulsch[UE_id]->rnti,proc->frame_tx,subframe,pusch_subframe,pusch_frame,ulsch[UE_id]->harq_processes[harq_pid]->phich_active);
|
||||
|
||||
ngroup_PHICH = (ulsch[UE_id]->harq_processes[harq_pid]->first_rb +
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->n_DMRS)%Ngroup_PHICH;
|
||||
/* the HARQ process may have been reused by a new scheduling, so we use
|
||||
* previous values of first_rb and n_DMRS to compute ngroup_PHICH and nseq_PHICH
|
||||
*/
|
||||
|
||||
ngroup_PHICH = (ulsch[UE_id]->harq_processes[harq_pid]->previous_first_rb +
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->previous_n_DMRS)%Ngroup_PHICH;
|
||||
|
||||
if ((frame_parms->tdd_config == 0) && (frame_parms->frame_type == TDD) ) {
|
||||
|
||||
@@ -1462,20 +1506,28 @@ void generate_phich_top(PHY_VARS_eNB *eNB,
|
||||
ngroup_PHICH += Ngroup_PHICH;
|
||||
}
|
||||
|
||||
nseq_PHICH = ((ulsch[UE_id]->harq_processes[harq_pid]->first_rb/Ngroup_PHICH) +
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->n_DMRS)%(2*NSF_PHICH);
|
||||
nseq_PHICH = ((ulsch[UE_id]->harq_processes[harq_pid]->previous_first_rb/Ngroup_PHICH) +
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->previous_n_DMRS)%(2*NSF_PHICH);
|
||||
LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Generating PHICH, ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d dci_alloc %d)\n",
|
||||
eNB->Mod_id,harq_pid,proc->frame_tx,
|
||||
subframe,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH,
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK,
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->first_rb,
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->previous_first_rb,
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->dci_alloc);
|
||||
|
||||
T(T_ENB_PHY_PHICH, T_INT(eNB->Mod_id), T_INT(proc->frame_tx), T_INT(subframe),
|
||||
T_INT(UE_id), T_INT(ulsch[UE_id]->rnti), T_INT(harq_pid),
|
||||
T_INT(Ngroup_PHICH), T_INT(NSF_PHICH),
|
||||
T_INT(ngroup_PHICH), T_INT(nseq_PHICH),
|
||||
T_INT(ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK),
|
||||
T_INT(ulsch[UE_id]->harq_processes[harq_pid]->previous_first_rb),
|
||||
T_INT(ulsch[UE_id]->harq_processes[harq_pid]->previous_n_DMRS));
|
||||
|
||||
if (ulsch[UE_id]->Msg3_active == 1) {
|
||||
LOG_D(PHY,"[eNB %d][PUSCH %d][RAPROC] Frame %d, subframe %d: Generating Msg3 PHICH for UE %d, ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d\n",
|
||||
eNB->Mod_id,harq_pid,proc->frame_tx,subframe,
|
||||
UE_id,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH,ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK,
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->first_rb);
|
||||
ulsch[UE_id]->harq_processes[harq_pid]->previous_first_rb);
|
||||
}
|
||||
|
||||
if (eNB->abstraction_flag == 0) {
|
||||
|
||||
@@ -62,7 +62,7 @@ void generate_pilots(PHY_VARS_eNB *eNB,
|
||||
// printf("tti %d : offset %d (slot %d)\n",tti,tti_offset,slot_offset);
|
||||
//Generate Pilots
|
||||
|
||||
//antenna 0 symbol 0 slot 0
|
||||
//antenna port 0 symbol 0 slot 0
|
||||
lte_dl_cell_spec(eNB,&txdataF[0][tti_offset],
|
||||
amp,
|
||||
slot_offset,
|
||||
@@ -71,7 +71,7 @@ void generate_pilots(PHY_VARS_eNB *eNB,
|
||||
|
||||
|
||||
// printf("tti %d : second_pilot offset %d \n",tti,tti_offset+(second_pilot*samples_per_symbol));
|
||||
//antenna 0 symbol 3/4 slot 0
|
||||
//antenna port 0 symbol 3/4 slot 0
|
||||
lte_dl_cell_spec(eNB,&txdataF[0][tti_offset+(second_pilot*samples_per_symbol)],
|
||||
amp,
|
||||
slot_offset,
|
||||
@@ -79,7 +79,7 @@ void generate_pilots(PHY_VARS_eNB *eNB,
|
||||
0);
|
||||
|
||||
// printf("tti %d : third_pilot offset %d \n",tti,tti_offset+((Nsymb>>1)*samples_per_symbol));
|
||||
//antenna 0 symbol 0 slot 1
|
||||
//antenna port 0 symbol 0 slot 1
|
||||
lte_dl_cell_spec(eNB,&txdataF[0][tti_offset+((Nsymb>>1)*samples_per_symbol)],
|
||||
amp,
|
||||
1+slot_offset,
|
||||
@@ -87,7 +87,7 @@ void generate_pilots(PHY_VARS_eNB *eNB,
|
||||
0);
|
||||
|
||||
// printf("tti %d : third_pilot offset %d \n",tti,tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol));
|
||||
//antenna 0 symbol 3/4 slot 1
|
||||
//antenna port 0 symbol 3/4 slot 1
|
||||
lte_dl_cell_spec(eNB,&txdataF[0][tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol)],
|
||||
amp,
|
||||
1+slot_offset,
|
||||
@@ -95,66 +95,35 @@ void generate_pilots(PHY_VARS_eNB *eNB,
|
||||
0);
|
||||
|
||||
|
||||
if (frame_parms->nb_antennas_tx > 1) {
|
||||
if (frame_parms->mode1_flag) {
|
||||
// antenna 1 symbol 0 slot 0
|
||||
lte_dl_cell_spec(eNB,&txdataF[1][tti_offset],
|
||||
amp,
|
||||
slot_offset,
|
||||
0,
|
||||
0);
|
||||
if (frame_parms->nb_antenna_ports_eNB > 1) {
|
||||
|
||||
// antenna 1 symbol 3 slot 0
|
||||
lte_dl_cell_spec(eNB,&txdataF[1][tti_offset+(second_pilot*samples_per_symbol)],
|
||||
amp,
|
||||
slot_offset,
|
||||
1,
|
||||
0);
|
||||
|
||||
//antenna 1 symbol 0 slot 1
|
||||
lte_dl_cell_spec(eNB,&txdataF[1][tti_offset+(Nsymb>>1)*samples_per_symbol],
|
||||
amp,
|
||||
1+slot_offset,
|
||||
0,
|
||||
0);
|
||||
|
||||
// antenna 1 symbol 3 slot 1
|
||||
lte_dl_cell_spec(eNB,&txdataF[1][tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol)],
|
||||
amp,
|
||||
1+slot_offset,
|
||||
1,
|
||||
0);
|
||||
|
||||
} else {
|
||||
|
||||
// antenna 1 symbol 0 slot 0
|
||||
// antenna port 1 symbol 0 slot 0
|
||||
lte_dl_cell_spec(eNB,&txdataF[1][tti_offset],
|
||||
amp,
|
||||
slot_offset,
|
||||
0,
|
||||
1);
|
||||
|
||||
// antenna 1 symbol 3 slot 0
|
||||
// antenna port 1 symbol 3 slot 0
|
||||
lte_dl_cell_spec(eNB,&txdataF[1][tti_offset+(second_pilot*samples_per_symbol)],
|
||||
amp,
|
||||
slot_offset,
|
||||
1,
|
||||
1);
|
||||
|
||||
//antenna 1 symbol 0 slot 1
|
||||
//antenna port 1 symbol 0 slot 1
|
||||
lte_dl_cell_spec(eNB,&txdataF[1][tti_offset+(Nsymb>>1)*samples_per_symbol],
|
||||
amp,
|
||||
1+slot_offset,
|
||||
0,
|
||||
1);
|
||||
|
||||
// antenna 1 symbol 3 slot 1
|
||||
// antenna port 1 symbol 3 slot 1
|
||||
lte_dl_cell_spec(eNB,&txdataF[1][tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol)],
|
||||
amp,
|
||||
1+slot_offset,
|
||||
1,
|
||||
1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -185,7 +154,7 @@ int generate_pilots_slot(PHY_VARS_eNB *eNB,
|
||||
// printf("tti %d : offset %d (slot %d)\n",tti,tti_offset,slot_offset);
|
||||
//Generate Pilots
|
||||
|
||||
//antenna 0 symbol 0 slot 0
|
||||
//antenna port 0 symbol 0 slot 0
|
||||
lte_dl_cell_spec(eNB,
|
||||
&txdataF[0][slot_offset],
|
||||
amp,
|
||||
@@ -204,44 +173,24 @@ int generate_pilots_slot(PHY_VARS_eNB *eNB,
|
||||
0);
|
||||
}
|
||||
|
||||
if (frame_parms->nb_antennas_tx > 1) {
|
||||
if (frame_parms->mode1_flag) {
|
||||
// antenna 1 symbol 0 slot 0
|
||||
if (frame_parms->nb_antenna_ports_eNB > 1) {
|
||||
|
||||
// antenna port 1 symbol 0 slot 0
|
||||
lte_dl_cell_spec(eNB,
|
||||
&txdataF[1][slot_offset],
|
||||
amp,
|
||||
slot,
|
||||
0,
|
||||
1);
|
||||
|
||||
if (first_pilot_only == 0) {
|
||||
// antenna port 1 symbol 3 slot 0
|
||||
lte_dl_cell_spec(eNB,
|
||||
&txdataF[1][slot_offset],
|
||||
&txdataF[1][slot_offset+(second_pilot*samples_per_symbol)],
|
||||
amp,
|
||||
slot,
|
||||
0,
|
||||
0);
|
||||
|
||||
if (first_pilot_only==0) {
|
||||
// antenna 1 symbol 3 slot 0
|
||||
lte_dl_cell_spec(eNB,
|
||||
&txdataF[1][slot_offset+(second_pilot*samples_per_symbol)],
|
||||
amp,
|
||||
slot,
|
||||
1,
|
||||
0);
|
||||
}
|
||||
} else {
|
||||
|
||||
// antenna 1 symbol 0 slot 0
|
||||
lte_dl_cell_spec(eNB,
|
||||
&txdataF[1][slot_offset],
|
||||
amp,
|
||||
slot,
|
||||
0,
|
||||
1,
|
||||
1);
|
||||
|
||||
if (first_pilot_only == 0) {
|
||||
// antenna 1 symbol 3 slot 0
|
||||
lte_dl_cell_spec(eNB,
|
||||
&txdataF[1][slot_offset+(second_pilot*samples_per_symbol)],
|
||||
amp,
|
||||
slot,
|
||||
1,
|
||||
1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,217 @@
|
||||
/*******************************************************************************
|
||||
OpenAirInterface
|
||||
Copyright(c) 1999 - 2014 Eurecom
|
||||
|
||||
OpenAirInterface is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
OpenAirInterface is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenAirInterface.The full GNU General Public License is
|
||||
included in this distribution in the file called "COPYING". If not,
|
||||
see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Contact Information
|
||||
OpenAirInterface Admin: openair_admin@eurecom.fr
|
||||
OpenAirInterface Tech : openair_tech@eurecom.fr
|
||||
OpenAirInterface Dev : openair4g-devel@eurecom.fr
|
||||
|
||||
Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
/*! \file PHY/LTE_TRANSPORT/uespec_pilots.c
|
||||
* \brief Top-level routines for generating DL ue-specific reference signals V12.5 2015-03
|
||||
* \author X.JIANG
|
||||
* \date 2011
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \email: xiwen.jiangeurecom.fr
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
//#include "defs.h"
|
||||
#include "PHY/defs.h"
|
||||
|
||||
void generate_ue_spec_pilots(PHY_VARS_eNB *phy_vars_eNB,
|
||||
uint8_t UE_id,
|
||||
int32_t **txdataF,
|
||||
int16_t amp,
|
||||
uint16_t Ntti,
|
||||
uint8_t beamforming_mode)
|
||||
{
|
||||
|
||||
/*LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms;
|
||||
|
||||
uint32_t tti,tti_offset,slot_offset,Nsymb,samples_per_symbol;
|
||||
uint8_t second_pilot,aa;
|
||||
|
||||
// printf("Doing TX pilots Nsymb %d, second_pilot %d\n",Nsymb,second_pilot);
|
||||
|
||||
switch(beamforming_mode){
|
||||
case 7:
|
||||
for (tti=0; tti<Ntti; tti++) {
|
||||
|
||||
tti_offset = tti*frame_parms->ofdm_symbol_size*Nsymb;
|
||||
samples_per_symbol = frame_parms->ofdm_symbol_size;
|
||||
slot_offset = (tti*2)%20;
|
||||
|
||||
// printf("tti %d : offset %d (slot %d)\n",tti,tti_offset,slot_offset);
|
||||
//Generate UE specific Pilots
|
||||
printf("generate_dl_ue_spec:tti_offset=%d\n",tti_offset);
|
||||
|
||||
if(frame_parms->Ncp==0) {
|
||||
for(aa=0;aa<frame_parms->nb_antennas_tx;aa++){
|
||||
//antenna port 5 symbol 0 slot 0
|
||||
lte_dl_ue_spec(phy_vars_eNB,
|
||||
UE_id,
|
||||
&txdataF[aa][tti_offset+3*samples_per_symbol],
|
||||
amp,
|
||||
slot_offset,
|
||||
1,
|
||||
5,
|
||||
0);
|
||||
|
||||
//antenna port 5 symbol 1 slot 0
|
||||
lte_dl_ue_spec(phy_vars_eNB,
|
||||
UE_id,
|
||||
&txdataF[aa][tti_offset+6*samples_per_symbol],
|
||||
amp,
|
||||
slot_offset,
|
||||
1,
|
||||
5,
|
||||
0);
|
||||
|
||||
//antenna port 5 symbol 0 slot 1
|
||||
lte_dl_ue_spec(phy_vars_eNB,
|
||||
UE_id,
|
||||
&txdataF[aa][tti_offset+9*samples_per_symbol],
|
||||
amp,
|
||||
slot_offset+1,
|
||||
0,
|
||||
5,
|
||||
0);
|
||||
|
||||
//antenna port 5 symbol 1 slot 1
|
||||
lte_dl_ue_spec(phy_vars_eNB,
|
||||
UE_id,
|
||||
&txdataF[aa][tti_offset+12*samples_per_symbol],
|
||||
amp,
|
||||
slot_offset+1,
|
||||
1,
|
||||
5,
|
||||
0);
|
||||
}
|
||||
} else{
|
||||
msg("generate_ue_soec_pilots:Extented Cyclic Prefix for TM7 is not supported yet.\n");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case 8:
|
||||
case 9:
|
||||
case 10:
|
||||
default:
|
||||
msg("[generate_ue_spec_pilots(in uespec_pilots.c)]ERROR:beamforming mode %d is not supported\n",beamforming_mode);
|
||||
|
||||
}*/
|
||||
}
|
||||
|
||||
/*int generate_ue_spec_pilots_slot(PHY_VARS_eNB *phy_vars_eNB,
|
||||
int32_t **txdataF,
|
||||
int16_t amp,
|
||||
uint16_t slot,
|
||||
int first_pilot_only)
|
||||
{
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms;
|
||||
uint32_t slot_offset,Nsymb,samples_per_symbol;
|
||||
uint8_t second_pilot;
|
||||
|
||||
if (slot<0 || slot>= 20) {
|
||||
msg("generate_pilots_slot: slot not in range (%d)\n",slot);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
Nsymb = (frame_parms->Ncp==0)?7:6;
|
||||
second_pilot = (frame_parms->Ncp==0)?4:3;
|
||||
|
||||
|
||||
slot_offset = slot*frame_parms->ofdm_symbol_size*Nsymb;
|
||||
samples_per_symbol = frame_parms->ofdm_symbol_size;
|
||||
|
||||
// printf("tti %d : offset %d (slot %d)\n",tti,tti_offset,slot_offset);
|
||||
//Generate Pilots
|
||||
|
||||
//antenna 0 symbol 0 slot 0
|
||||
lte_dl_cell_spec(phy_vars_eNB,
|
||||
&txdataF[0][slot_offset],
|
||||
amp,
|
||||
slot,
|
||||
0,
|
||||
0);
|
||||
|
||||
|
||||
if (first_pilot_only==0) {
|
||||
//antenna 0 symbol 3 slot 0
|
||||
lte_dl_cell_spec(phy_vars_eNB,
|
||||
&txdataF[0][slot_offset+(second_pilot*samples_per_symbol)],
|
||||
amp,
|
||||
slot,
|
||||
1,
|
||||
0);
|
||||
}
|
||||
|
||||
if (frame_parms->nb_antennas_tx > 1) {
|
||||
if (frame_parms->mode1_flag) {
|
||||
// antenna 1 symbol 0 slot 0
|
||||
lte_dl_cell_spec(phy_vars_eNB,
|
||||
&txdataF[1][slot_offset],
|
||||
amp,
|
||||
slot,
|
||||
0,
|
||||
0);
|
||||
|
||||
if (first_pilot_only==0) {
|
||||
// antenna 1 symbol 3 slot 0
|
||||
lte_dl_cell_spec(phy_vars_eNB,
|
||||
&txdataF[1][slot_offset+(second_pilot*samples_per_symbol)],
|
||||
amp,
|
||||
slot,
|
||||
1,
|
||||
0);
|
||||
}
|
||||
} else {
|
||||
|
||||
// antenna 1 symbol 0 slot 0
|
||||
lte_dl_cell_spec(phy_vars_eNB,
|
||||
&txdataF[1][slot_offset],
|
||||
amp,
|
||||
slot,
|
||||
0,
|
||||
1);
|
||||
|
||||
if (first_pilot_only == 0) {
|
||||
// antenna 1 symbol 3 slot 0
|
||||
lte_dl_cell_spec(phy_vars_eNB,
|
||||
&txdataF[1][slot_offset+(second_pilot*samples_per_symbol)],
|
||||
amp,
|
||||
slot,
|
||||
1,
|
||||
1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return(0);
|
||||
}*/
|
||||
|
||||
@@ -305,7 +305,7 @@ void generate_mch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,uint8_t *a)
|
||||
eNB->frame_parms.N_RB_DL,
|
||||
eNB->dlsch_MCH->harq_processes[0]->rb_alloc,
|
||||
get_Qm(eNB->dlsch_MCH->harq_processes[0]->mcs),1,
|
||||
2,proc->frame_tx,subframe);
|
||||
2,proc->frame_tx,subframe,0);
|
||||
|
||||
generate_mbsfn_pilot(eNB,proc,
|
||||
eNB->common_vars.txdataF[0],
|
||||
|
||||
@@ -629,6 +629,13 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1
|
||||
|
||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
||||
prach_start = (ue->rx_offset+subframe*ue->frame_parms.samples_per_tti-ue->hw_timing_advance-ue->N_TA_offset);
|
||||
#ifdef PRACH_DEBUG
|
||||
LOG_I(PHY,"[UE %d] prach_start %d, rx_offset %d, hw_timing_advance %d, N_TA_offset %d\n", ue->Mod_id,
|
||||
prach_start,
|
||||
ue->rx_offset,
|
||||
ue->hw_timing_advance,
|
||||
ue->N_TA_offset);
|
||||
#endif
|
||||
|
||||
if (prach_start<0)
|
||||
prach_start+=(ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
|
||||
|
||||
@@ -48,7 +48,7 @@ void free_eNB_dlsch(LTE_eNB_DLSCH_t *dlsch);
|
||||
|
||||
void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch);
|
||||
|
||||
/** \fn new_eNB_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t abstraction_flag)
|
||||
/** \fn new_eNB_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t abstraction_flag, LTE_DL_FRAME_PARMS* frame_parms)
|
||||
\brief This function allocates structures for a particular DLSCH at eNB
|
||||
@returns Pointer to DLSCH to be removed
|
||||
@param Kmimo Kmimo factor from 36-212/36-213
|
||||
@@ -56,8 +56,9 @@ void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch);
|
||||
@param Nsoft Soft-LLR buffer size from UE-Category
|
||||
@params N_RB_DL total number of resource blocks (determine the operating BW)
|
||||
@param abstraction_flag Flag to indicate abstracted interface
|
||||
@param frame_parms Pointer to frame descriptor structure
|
||||
*/
|
||||
LTE_eNB_DLSCH_t *new_eNB_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t N_RB_DL, uint8_t abstraction_flag);
|
||||
LTE_eNB_DLSCH_t *new_eNB_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t N_RB_DL, uint8_t abstraction_flag, LTE_DL_FRAME_PARMS* frame_parms);
|
||||
|
||||
/** \fn free_ue_dlsch(LTE_UE_DLSCH_t *dlsch)
|
||||
\brief This function frees memory allocated for a particular DLSCH at UE
|
||||
@@ -191,11 +192,50 @@ void dlsch_encoding_emul(PHY_VARS_eNB *phy_vars_eNB,
|
||||
\param re_allocated pointer to allocation counter
|
||||
\param skip_dc offset for positive RBs
|
||||
\param skip_half indicate that first or second half of RB must be skipped for PBCH/PSS/SSS
|
||||
\param ue_spec_rs UE specific RS indicator
|
||||
\param nb_antennas_tx_phy Physical antenna elements which can be different with antenna port number, especially in beamforming case
|
||||
\param use2ndpilots Set to use the pilots from antenna port 1 for PDSCH
|
||||
\param frame_parms Frame parameter descriptor
|
||||
*/
|
||||
|
||||
int32_t allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
// Functions below implement 36-211
|
||||
|
||||
/** \fn allocate_REs_in_RB(int32_t **txdataF,
|
||||
uint32_t *jj,
|
||||
uint32_t *jj2,
|
||||
uint16_t re_offset,
|
||||
uint32_t symbol_offset,
|
||||
LTE_DL_eNB_HARQ_t *dlsch0_harq,
|
||||
LTE_DL_eNB_HARQ_t *dlsch1_harq,
|
||||
uint8_t pilots,
|
||||
int16_t amp,
|
||||
int16_t *qam_table_s,
|
||||
uint32_t *re_allocated,
|
||||
uint8_t skip_dc,
|
||||
uint8_t skip_half,
|
||||
uint8_t use2ndpilots,
|
||||
LTE_DL_FRAME_PARMS *frame_parms);
|
||||
|
||||
\brief Fills RB with data
|
||||
\param txdataF pointer to output data (frequency domain signal)
|
||||
\param jj index to output (from CW 1)
|
||||
\param jj index to output (from CW 2)
|
||||
\param re_offset index of the first RE of the RB
|
||||
\param symbol_offset index to the OFDM symbol
|
||||
\param dlsch0_harq Pointer to Transport block 0 HARQ structure
|
||||
\param dlsch0_harq Pointer to Transport block 1 HARQ structure
|
||||
\param pilots =1 if symbol_offset is an OFDM symbol that contains pilots, 0 otherwise
|
||||
\param amp Amplitude for symbols
|
||||
\param qam_table_s0 pointer to scaled QAM table for Transport Block 0 (by rho_a or rho_b)
|
||||
\param qam_table_s1 pointer to scaled QAM table for Transport Block 1 (by rho_a or rho_b)
|
||||
\param re_allocated pointer to allocation counter
|
||||
\param skip_dc offset for positive RBs
|
||||
\param skip_half indicate that first or second half of RB must be skipped for PBCH/PSS/SSS
|
||||
\param use2ndpilots Set to use the pilots from antenna port 1 for PDSCH
|
||||
\param frame_parms Frame parameter descriptor
|
||||
*/
|
||||
|
||||
int32_t allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB,
|
||||
int32_t **txdataF,
|
||||
uint32_t *jj,
|
||||
uint32_t *jj2,
|
||||
@@ -211,6 +251,9 @@ int32_t allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint32_t *re_allocated,
|
||||
uint8_t skip_dc,
|
||||
uint8_t skip_half,
|
||||
uint8_t lprime,
|
||||
uint8_t mprime,
|
||||
uint8_t Ns,
|
||||
int *P1_SHIFT,
|
||||
int *P2_SHIFT);
|
||||
|
||||
@@ -230,12 +273,11 @@ int32_t allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
@param num_pdcch_symbols Number of PDCCH symbols in this subframe
|
||||
@param dlsch0 Pointer to Transport Block 0 DLSCH descriptor for this allocation
|
||||
@param dlsch1 Pointer to Transport Block 0 DLSCH descriptor for this allocation
|
||||
|
||||
*/
|
||||
int32_t dlsch_modulation(int32_t **txdataF,
|
||||
int32_t dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
|
||||
int32_t **txdataF,
|
||||
int16_t amp,
|
||||
uint32_t sub_frame_offset,
|
||||
LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t num_pdcch_symbols,
|
||||
LTE_eNB_DLSCH_t *dlsch0,
|
||||
LTE_eNB_DLSCH_t *dlsch1);
|
||||
@@ -329,6 +371,13 @@ int32_t generate_mbsfn_pilot(PHY_VARS_eNB *phy_vars_eNB,
|
||||
int32_t **txdataF,
|
||||
int16_t amp);
|
||||
|
||||
void generate_ue_spec_pilots(PHY_VARS_eNB *phy_vars_eNB,
|
||||
uint8_t UE_id,
|
||||
int32_t **txdataF,
|
||||
int16_t amp,
|
||||
uint16_t Ntti,
|
||||
uint8_t beamforming_mode);
|
||||
|
||||
int32_t generate_pss(int32_t **txdataF,
|
||||
int16_t amp,
|
||||
LTE_DL_FRAME_PARMS *frame_parms,
|
||||
@@ -714,6 +763,7 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
@param nb_rb number of RBs for this allocation
|
||||
@param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS
|
||||
@param llr128p pointer to pointer to symbol in dlsch_llr
|
||||
@param beamforming_mode beamforming mode
|
||||
*/
|
||||
int32_t dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t **rxdataF_comp,
|
||||
@@ -722,7 +772,8 @@ int32_t dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t first_symbol_flag,
|
||||
uint16_t nb_rb,
|
||||
uint16_t pbch_pss_sss_adj,
|
||||
int16_t **llr128p);
|
||||
int16_t **llr128p,
|
||||
uint8_t beamforming_mode);
|
||||
|
||||
/**
|
||||
\brief This function generates log-likelihood ratios (decoder input) for single-stream 16QAM received waveforms
|
||||
@@ -735,6 +786,7 @@ int32_t dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
@param nb_rb number of RBs for this allocation
|
||||
@param pbch_pss_sss_adjust Adjustment factor in RE for PBCH/PSS/SSS allocations
|
||||
@param llr128p pointer to pointer to symbol in dlsch_llr
|
||||
@param beamforming_mode beamforming mode
|
||||
*/
|
||||
|
||||
void dlsch_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
@@ -745,7 +797,8 @@ void dlsch_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t first_symbol_flag,
|
||||
uint16_t nb_rb,
|
||||
uint16_t pbch_pss_sss_adjust,
|
||||
int16_t **llr128p);
|
||||
int16_t **llr128p,
|
||||
uint8_t beamforming_mode);
|
||||
|
||||
/**
|
||||
\brief This function generates log-likelihood ratios (decoder input) for single-stream 16QAM received waveforms
|
||||
@@ -758,6 +811,7 @@ void dlsch_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
@param first_symbol_flag
|
||||
@param nb_rb number of RBs for this allocation
|
||||
@param pbch_pss_sss_adjust PBCH/PSS/SSS RE adjustment (in REs)
|
||||
@param beamforming_mode beamforming mode
|
||||
*/
|
||||
void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t **rxdataF_comp,
|
||||
@@ -768,7 +822,8 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t first_symbol_flag,
|
||||
uint16_t nb_rb,
|
||||
uint16_t pbch_pss_sss_adjust,
|
||||
short **llr_save);
|
||||
int16_t **llr_save,
|
||||
uint8_t beamforming_mode);
|
||||
|
||||
/** \fn dlsch_siso(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t **rxdataF_comp,
|
||||
@@ -939,6 +994,37 @@ uint16_t dlsch_extract_rbs_dual(int32_t **rxdataF,
|
||||
uint32_t high_speed_flag,
|
||||
LTE_DL_FRAME_PARMS *frame_parms);
|
||||
|
||||
/** \fn dlsch_extract_rbs_TM7(int32_t **rxdataF,
|
||||
int32_t **dl_bf_ch_estimates,
|
||||
int32_t **rxdataF_ext,
|
||||
int32_t **dl_bf_ch_estimates_ext,
|
||||
uint32_t *rb_alloc,
|
||||
uint8_t symbol,
|
||||
uint8_t subframe,
|
||||
uint32_t high_speed_flag,
|
||||
LTE_DL_FRAME_PARMS *frame_parms)
|
||||
\brief This function extracts the received resource blocks, both channel estimates and data symbols,
|
||||
for the current allocation and for single antenna eNB transmission.
|
||||
@param rxdataF Raw FFT output of received signal
|
||||
@param dl_bf_ch_estimates Beamforming channel estimates of current slot
|
||||
@param rxdataF_ext FFT output for RBs in this allocation
|
||||
@param dl_bf_ch_estimates_ext Beamforming channel estimates for RBs in this allocation
|
||||
@param rb_alloc RB allocation vector
|
||||
@param symbol Symbol to extract
|
||||
@param subframe Subframe number
|
||||
@param high_speed_flag
|
||||
@param frame_parms Pointer to frame descriptor
|
||||
*/
|
||||
uint16_t dlsch_extract_rbs_TM7(int32_t **rxdataF,
|
||||
int32_t **dl_bf_ch_estimates,
|
||||
int32_t **rxdataF_ext,
|
||||
int32_t **dl_bf_ch_estimates_ext,
|
||||
uint32_t *rb_alloc,
|
||||
uint8_t symbol,
|
||||
uint8_t subframe,
|
||||
uint32_t high_speed_flag,
|
||||
LTE_DL_FRAME_PARMS *frame_parms);
|
||||
|
||||
/** \brief This function performs channel compensation (matched filtering) on the received RBs for this allocation. In addition, it computes the squared-magnitude of the channel with weightings for 16QAM/64QAM detection as well as dual-stream detection (cross-correlation)
|
||||
@param rxdataF_ext Frequency-domain received signal in RBs to be demodulated
|
||||
@param dl_ch_estimates_ext Frequency-domain channel estimates in RBs to be demodulated
|
||||
@@ -1029,6 +1115,12 @@ void dlsch_channel_level_TM56(int32_t **dl_ch_estimates_ext,
|
||||
uint8_t symbol_mod,
|
||||
uint16_t nb_rb);
|
||||
|
||||
void dlsch_channel_level_TM7(int32_t **dl_bf_ch_estimates_ext,
|
||||
LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t *avg,
|
||||
uint8_t pilots_flag,
|
||||
uint16_t nb_rb);
|
||||
|
||||
void dlsch_scale_channel(int32_t **dl_ch_estimates_ext,
|
||||
LTE_DL_FRAME_PARMS *frame_parms,
|
||||
LTE_UE_DLSCH_t **dlsch_ue,
|
||||
@@ -1293,7 +1385,7 @@ uint8_t get_transmission_mode(module_id_t Mod_id, uint8_t CC_id, rnti_t rnti);
|
||||
*/
|
||||
uint32_t conv_nprb(uint8_t ra_header,uint32_t rb_alloc,int N_RB_DL);
|
||||
|
||||
int get_G(LTE_DL_FRAME_PARMS *frame_parms,uint16_t nb_rb,uint32_t *rb_alloc,uint8_t mod_order,uint8_t Nl,uint8_t num_pdcch_symbols,int frame,uint8_t subframe);
|
||||
int get_G(LTE_DL_FRAME_PARMS *frame_parms,uint16_t nb_rb,uint32_t *rb_alloc,uint8_t mod_order,uint8_t Nl,uint8_t num_pdcch_symbols,int frame,uint8_t subframe, uint8_t beamforming_mode);
|
||||
|
||||
int adjust_G(LTE_DL_FRAME_PARMS *frame_parms,uint32_t *rb_alloc,uint8_t mod_order,uint8_t subframe);
|
||||
int adjust_G2(LTE_DL_FRAME_PARMS *frame_parms,uint32_t *rb_alloc,uint8_t mod_order,uint8_t subframe,uint8_t symbol);
|
||||
@@ -1406,7 +1498,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
|
||||
PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
|
||||
uint16_t si_rnti,
|
||||
uint16_t ra_rnti,
|
||||
uint16_t p_rnti);
|
||||
uint16_t p_rnti,
|
||||
uint8_t beamforming_mode);
|
||||
|
||||
int32_t generate_eNB_dlsch_params_from_dci(int frame,
|
||||
uint8_t subframe,
|
||||
@@ -1419,7 +1512,8 @@ int32_t generate_eNB_dlsch_params_from_dci(int frame,
|
||||
uint16_t si_rnti,
|
||||
uint16_t ra_rnti,
|
||||
uint16_t p_rnti,
|
||||
uint16_t DL_pmi_single);
|
||||
uint16_t DL_pmi_single,
|
||||
uint8_t beamforming_mode);
|
||||
|
||||
int32_t generate_eNB_ulsch_params_from_rar(uint8_t *rar_pdu,
|
||||
frame_t frame,
|
||||
@@ -1445,6 +1539,9 @@ int32_t generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue,
|
||||
uint8_t eNB_id);
|
||||
double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue,
|
||||
uint8_t eNB_id);
|
||||
|
||||
uint8_t sinr2cqi(double sinr,uint8_t trans_mode);
|
||||
|
||||
int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *PHY_vars_eNB,
|
||||
eNB_rxtx_proc_t *proc,
|
||||
void *dci_pdu,
|
||||
@@ -1633,7 +1730,7 @@ uint8_t phich_subframe2_pusch_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t s
|
||||
@param subframe Subframe of received/transmitted PHICH
|
||||
@returns frame of PUSCH transmission
|
||||
*/
|
||||
uint8_t phich_frame2_pusch_frame(LTE_DL_FRAME_PARMS *frame_parms,frame_t frame,uint8_t subframe);;
|
||||
uint8_t phich_frame2_pusch_frame(LTE_DL_FRAME_PARMS *frame_parms,frame_t frame,uint8_t subframe);
|
||||
|
||||
void print_CQI(void *o,UCI_format_t uci_format,uint8_t eNB_id,int N_RB_DL);
|
||||
|
||||
@@ -1712,6 +1809,20 @@ void generate_pucch1x(int32_t **txdataF,
|
||||
int16_t amp,
|
||||
uint8_t subframe);
|
||||
|
||||
void generate_pucch2x(int32_t **txdataF,
|
||||
LTE_DL_FRAME_PARMS *fp,
|
||||
uint8_t ncs_cell[20][7],
|
||||
PUCCH_FMT_t fmt,
|
||||
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
||||
uint16_t n2_pucch,
|
||||
uint16_t *payload,
|
||||
int A,
|
||||
int B2,
|
||||
int16_t amp,
|
||||
uint8_t subframe,
|
||||
uint16_t rnti);
|
||||
|
||||
|
||||
void generate_pucch_emul(PHY_VARS_UE *phy_vars_ue,
|
||||
UE_rxtx_proc_t *proc,
|
||||
PUCCH_FMT_t format,
|
||||
@@ -1821,6 +1932,8 @@ int is_pmch_subframe(frame_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_parm
|
||||
|
||||
uint8_t is_not_pilot(uint8_t pilots, uint8_t re, uint8_t nushift, uint8_t use2ndpilots);
|
||||
|
||||
uint8_t is_not_UEspecRS(int8_t lprime, uint8_t re, uint8_t nushift, uint8_t Ncp, uint8_t beamforming_mode);
|
||||
|
||||
uint32_t dlsch_decoding_abstraction(double *dlsch_MIPB,
|
||||
LTE_DL_FRAME_PARMS *lte_frame_parms,
|
||||
LTE_UE_DLSCH_t *dlsch,
|
||||
|
||||
@@ -72,12 +72,12 @@ int generate_pss(int32_t **txdataF,
|
||||
return(-1);
|
||||
}
|
||||
|
||||
a = (frame_parms->nb_antennas_tx == 1) ? amp: (amp*ONE_OVER_SQRT2_Q15)>>15;
|
||||
a = (frame_parms->nb_antenna_ports_eNB == 1) ? amp: (amp*ONE_OVER_SQRT2_Q15)>>15;
|
||||
//printf("[PSS] amp=%d, a=%d\n",amp,a);
|
||||
|
||||
Nsymb = (frame_parms->Ncp==NORMAL)?14:12;
|
||||
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||
for (aa=0; aa<frame_parms->nb_antenna_ports_eNB; aa++) {
|
||||
// aa = 0;
|
||||
|
||||
// The PSS occupies the inner 6 RBs, which start at
|
||||
|
||||
@@ -442,7 +442,7 @@ inline void pucch2x_scrambling(LTE_DL_FRAME_PARMS *fp,int subframe,uint16_t rnti
|
||||
int i;
|
||||
uint8_t c;
|
||||
|
||||
x2 = (rnti<<14) + ((1+subframe)<<16)*(1+(fp->Nid_cell<<1)); //this is c_init in 36.211 Sec 6.3.1
|
||||
x2 = (rnti) + ((uint32_t)(1+subframe)<<16)*(1+(fp->Nid_cell<<1)); //this is c_init in 36.211 Sec 6.3.1
|
||||
s = lte_gold_generic(&x1, &x2, 1);
|
||||
for (i=0;i<19;i++) {
|
||||
c = (uint8_t)((s>>i)&1);
|
||||
@@ -456,22 +456,24 @@ inline void pucch2x_modulation(uint8_t *btilde,int16_t *d,int16_t amp) {
|
||||
int i;
|
||||
|
||||
for (i=0;i<20;i++)
|
||||
d[i] = btilde[i] == 1 ? amp : -amp;
|
||||
d[i] = btilde[i] == 1 ? -amp : amp;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
uint32_t pucch_code[13] = {0xFFFFF,0x5A933,0x10E5A,0x6339C,0x73CE0,
|
||||
0xFFC00,0xD8E64,0x4F6B0,0x218EC,0x1B746,
|
||||
0x0FFFF,0x33FFF,0x3FFFC};
|
||||
|
||||
|
||||
void generate_pucch2x(int32_t **txdataF,
|
||||
LTE_DL_FRAME_PARMS *fp,
|
||||
uint8_t ncs_cell[20][7],
|
||||
PUCCH_FMT_t fmt,
|
||||
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
||||
uint16_t n2_pucch,
|
||||
uint8_t shortened_format,
|
||||
uint32_t *payload,
|
||||
uint16_t *payload,
|
||||
int A,
|
||||
int B2,
|
||||
int16_t amp,
|
||||
@@ -486,13 +488,14 @@ void generate_pucch2x(int32_t **txdataF,
|
||||
uint8_t NRB2 = fp->pucch_config_common.nRB_CQI;
|
||||
uint8_t Ncs1 = fp->pucch_config_common.nCS_AN;
|
||||
|
||||
uint32_t u0 = (fp->Nid_cell + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[subframe<<1]) % 30;
|
||||
uint32_t u1 = (fp->Nid_cell + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[1+(subframe<<1)]) % 30;
|
||||
uint32_t v0=fp->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[subframe<<1];
|
||||
uint32_t v1=fp->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)];
|
||||
uint32_t u0 = fp->pucch_config_common.grouphop[subframe<<1];
|
||||
uint32_t u1 = fp->pucch_config_common.grouphop[1+(subframe<<1)];
|
||||
uint32_t v0 = fp->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[subframe<<1];
|
||||
uint32_t v1 = fp->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)];
|
||||
|
||||
uint32_t z[12*14],*zptr;
|
||||
uint32_t u,v,n;
|
||||
uint8_t ns,N_UL_symb,nsymb;
|
||||
uint8_t ns,N_UL_symb,nsymb_slot0,nsymb_pertti;
|
||||
uint32_t nprime,l,n_cs;
|
||||
int alpha_ind,data_ind;
|
||||
int16_t ref_re,ref_im;
|
||||
@@ -509,7 +512,6 @@ void generate_pucch2x(int32_t **txdataF,
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// pucch2x_encoding
|
||||
for (i=0;i<A;i++)
|
||||
if ((*payload & (1<<i)) > 0)
|
||||
@@ -545,66 +547,72 @@ void generate_pucch2x(int32_t **txdataF,
|
||||
}
|
||||
}
|
||||
|
||||
zptr = z;
|
||||
|
||||
#ifdef DEBUG_PUCCH_TX
|
||||
printf("[PHY] PUCCH2x: n2_pucch %d\n",n2_pucch);
|
||||
#endif
|
||||
|
||||
N_UL_symb = (fp->Ncp==0) ? 7 : 6;
|
||||
|
||||
data_ind = 0;
|
||||
zptr = z;
|
||||
for (ns=(subframe<<1),u=u0,v=v0; ns<(2+(subframe<<1)); ns++,u=u1,v=v1) {
|
||||
|
||||
if ((ns&1) == 0)
|
||||
nprime = (n2_pucch < 12*NRB2) ?
|
||||
n2_pucch % 12 :
|
||||
(n2_pucch+Ncs1 + 1)%12;
|
||||
else
|
||||
nprime = (n2_pucch < 12*NRB2) ?
|
||||
((12*(nprime+1)) % 13)-1 :
|
||||
(10-n2_pucch)%12;
|
||||
|
||||
nprime = (n2_pucch < 12*NRB2) ?
|
||||
n2_pucch % 12 :
|
||||
(n2_pucch+Ncs1 + 1)%12;
|
||||
else {
|
||||
nprime = (n2_pucch < 12*NRB2) ?
|
||||
((12*(nprime+1)) % 13)-1 :
|
||||
(10-n2_pucch)%12;
|
||||
}
|
||||
//loop over symbols in slot
|
||||
for (l=0; l<N_UL_symb; l++) {
|
||||
// Compute n_cs (36.211 p. 18)
|
||||
n_cs = (ncs_cell[ns][l]+nprime)%12;
|
||||
|
||||
alpha_ind = n_cs;
|
||||
data_ind = 0;
|
||||
|
||||
alpha_ind = 0;
|
||||
for (n=0; n<12; n++) {
|
||||
// this is r_uv^alpha(n)
|
||||
ref_re = (int16_t)(((int32_t)alpha_re[alpha_ind] * ul_ref_sigs[u][v][0][n<<1] - (int32_t)alpha_im[alpha_ind] * ul_ref_sigs[u][v][0][1+(n<<1)])>>15);
|
||||
ref_im = (int16_t)(((int32_t)alpha_re[alpha_ind] * ul_ref_sigs[u][v][0][1+(n<<1)] + (int32_t)alpha_im[alpha_ind] * ul_ref_sigs[u][v][0][n<<1])>>15);
|
||||
|
||||
// this is r_uv^alpha(n)
|
||||
ref_re = (int16_t)(((int32_t)alpha_re[alpha_ind] * ul_ref_sigs[u][v][0][n<<1] - (int32_t)alpha_im[alpha_ind] * ul_ref_sigs[u][v][0][1+(n<<1)])>>15);
|
||||
ref_im = (int16_t)(((int32_t)alpha_re[alpha_ind] * ul_ref_sigs[u][v][0][1+(n<<1)] + (int32_t)alpha_im[alpha_ind] * ul_ref_sigs[u][v][0][n<<1])>>15);
|
||||
|
||||
if ((l<2)||(l>=(N_UL_symb-2))) { //these are PUCCH data symbols
|
||||
((int16_t *)&zptr[n])[0] = ((int32_t)d[data_ind]*ref_re - (int32_t)d[data_ind+1]*ref_im)>>15;
|
||||
((int16_t *)&zptr[n])[1] = ((int32_t)d[data_ind]*ref_im + (int32_t)d[data_ind+1]*ref_re)>>15;
|
||||
}
|
||||
else {
|
||||
((int16_t *)&zptr[n])[0] = ref_re;
|
||||
((int16_t *)&zptr[n])[1] = ref_im;
|
||||
}
|
||||
|
||||
if ((l!=1)&&(l!=5)) { //these are PUCCH data symbols
|
||||
((int16_t *)&zptr[n])[0] = ((int32_t)d[data_ind]*ref_re - (int32_t)d[data_ind+1]*ref_im)>>15;
|
||||
((int16_t *)&zptr[n])[1] = ((int32_t)d[data_ind]*ref_im + (int32_t)d[data_ind+1]*ref_re)>>15;
|
||||
//LOG_I(PHY,"slot %d ofdm# %d ==> d[%d,%d] \n",ns,l,data_ind,n);
|
||||
}
|
||||
else {
|
||||
((int16_t *)&zptr[n])[0] = ((int32_t)amp*ref_re>>15);
|
||||
((int16_t *)&zptr[n])[1] = ((int32_t)amp*ref_im>>15);
|
||||
//LOG_I(PHY,"slot %d ofdm# %d ==> dmrs[%d] \n",ns,l,n);
|
||||
}
|
||||
alpha_ind = (alpha_ind + n_cs)%12;
|
||||
} // n
|
||||
if ((l<2)||(l>=(N_UL_symb-2))) //these are PUCCH data symbols so increment data index
|
||||
data_ind+=2;
|
||||
zptr+=12;
|
||||
|
||||
if ((l!=1)&&(l!=5)) //these are PUCCH data symbols so increment data index
|
||||
data_ind+=2;
|
||||
} // l
|
||||
} //ns
|
||||
|
||||
m = n2_pucch/12;
|
||||
|
||||
#ifdef DEBUG_PUCCH_TX
|
||||
printf("[PHY] PUCCH: m %d\n",m);
|
||||
LOG_D(PHY,"[PHY] PUCCH: n2_pucch %d m %d\n",n2_pucch,m);
|
||||
#endif
|
||||
nsymb = N_UL_symb<<1;
|
||||
|
||||
nsymb_slot0 = ((fp->Ncp==0) ? 7 : 6);
|
||||
nsymb_pertti = nsymb_slot0 << 1;
|
||||
|
||||
//nsymb = nsymb_slot0<<1;
|
||||
|
||||
//for (j=0,l=0;l<(nsymb-1);l++) {
|
||||
for (j=0,l=0; l<(nsymb); l++) {
|
||||
if ((l<(nsymb>>1)) && ((m&1) == 0))
|
||||
for (j=0,l=0; l<(nsymb_pertti); l++) {
|
||||
|
||||
if ((l<nsymb_slot0) && ((m&1) == 0))
|
||||
re_offset = (m*6) + fp->first_carrier_offset;
|
||||
else if ((l<(nsymb>>1)) && ((m&1) == 1))
|
||||
else if ((l<nsymb_slot0) && ((m&1) == 1))
|
||||
re_offset = fp->first_carrier_offset + (fp->N_RB_DL - (m>>1) - 1)*12;
|
||||
else if ((m&1) == 0)
|
||||
re_offset = fp->first_carrier_offset + (fp->N_RB_DL - (m>>1) - 1)*12;
|
||||
@@ -614,23 +622,33 @@ void generate_pucch2x(int32_t **txdataF,
|
||||
if (re_offset > fp->ofdm_symbol_size)
|
||||
re_offset -= (fp->ofdm_symbol_size);
|
||||
|
||||
symbol_offset = (unsigned int)fp->ofdm_symbol_size*(l+(subframe*nsymb));
|
||||
|
||||
|
||||
symbol_offset = (unsigned int)fp->ofdm_symbol_size*(l+(subframe*nsymb_pertti));
|
||||
txptr = &txdataF[0][symbol_offset];
|
||||
|
||||
//LOG_I(PHY,"ofdmSymb %d/%d, firstCarrierOffset %d, symbolOffset[sfn %d] %d, reOffset %d, &txptr: %x \n", l, nsymb, fp->first_carrier_offset, subframe, symbol_offset, re_offset, &txptr[0]);
|
||||
|
||||
for (i=0; i<12; i++,j++) {
|
||||
txptr[re_offset++] = z[j];
|
||||
txptr[re_offset] = z[j];
|
||||
|
||||
re_offset++;
|
||||
|
||||
if (re_offset==fp->ofdm_symbol_size)
|
||||
re_offset = 0;
|
||||
re_offset -= (fp->ofdm_symbol_size);
|
||||
|
||||
#ifdef DEBUG_PUCCH_TX
|
||||
printf("[PHY] PUCCH subframe %d (%d,%d,%d,%d) => %d,%d\n",subframe,l,i,re_offset-1,m,((int16_t *)&z[j])[0],((int16_t *)&z[j])[1]);
|
||||
LOG_D(PHY,"[PHY] PUCCH subframe %d (%d,%d,%d,%d) => %d,%d\n",subframe,l,i,re_offset-1,m,((int16_t *)&z[j])[0],((int16_t *)&z[j])[1]);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//#define Amax 13
|
||||
//void init_pucch2x_rx() {};
|
||||
|
||||
|
||||
uint32_t rx_pucch(PHY_VARS_eNB *eNB,
|
||||
PUCCH_FMT_t fmt,
|
||||
uint8_t UE_id,
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
#include "SCHED/extern.h"
|
||||
#include "LAYER2/MAC/defs.h"
|
||||
#include "SCHED/defs.h"
|
||||
#include "UTIL/LOG/vcd_signal_dumper.h"
|
||||
|
||||
#include "assertions.h"
|
||||
|
||||
@@ -171,6 +172,8 @@ int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *ue,
|
||||
unsigned char eNB_id )
|
||||
{
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_RAR,VCD_FUNCTION_IN);
|
||||
|
||||
// RA_HEADER_RAPID *rarh = (RA_HEADER_RAPID *)rar_pdu;
|
||||
uint8_t transmission_mode = ue->transmission_mode[eNB_id];
|
||||
unsigned char *rar_pdu = ue->dlsch_ra[eNB_id]->harq_processes[0]->b;
|
||||
@@ -315,6 +318,9 @@ int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *ue,
|
||||
msg("ulsch ra (UE): TPC %d\n",ulsch->harq_processes[harq_pid]->TPC);
|
||||
msg("ulsch ra (UE): O %d\n",ulsch->O);
|
||||
msg("ulsch ra (UE): ORI %d\n",ulsch->O_RI);
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_RAR,VCD_FUNCTION_OUT);
|
||||
|
||||
//#endif
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -129,18 +129,27 @@ int32_t generate_srs_tx(PHY_VARS_UE *ue,
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
|
||||
SOUNDINGRS_UL_CONFIG_DEDICATED *soundingrs_ul_config_dedicated=&ue->soundingrs_ul_config_dedicated[eNB_id];
|
||||
int32_t *txdataF = ue->common_vars.txdataF[0];
|
||||
int32_t **txdataF = ue->common_vars.txdataF;
|
||||
uint16_t msrsb=0,Nb=0,nb,b,msrs0=0,k,Msc_RS,Msc_RS_idx,carrier_pos,symbol_offset;
|
||||
uint16_t *Msc_idx_ptr;
|
||||
int32_t k0;
|
||||
uint32_t T_SFC;
|
||||
uint32_t subframe_offset;
|
||||
//uint32_t subframe_offset;
|
||||
uint8_t Bsrs = soundingrs_ul_config_dedicated->srs_Bandwidth;
|
||||
uint8_t Csrs = frame_parms->soundingrs_ul_config_common.srs_BandwidthConfig;
|
||||
uint8_t Ssrs = frame_parms->soundingrs_ul_config_common.srs_SubframeConfig;
|
||||
uint8_t n_RRC = soundingrs_ul_config_dedicated->freqDomainPosition;
|
||||
uint8_t kTC = soundingrs_ul_config_dedicated->transmissionComb;
|
||||
|
||||
// u is the PUCCH sequence-group number defined in Section 5.5.1.3
|
||||
// ν is the base sequence number defined in Section 5.5.1.4
|
||||
uint32_t u=frame_parms->pucch_config_common.grouphop[1+(subframe<<1)];;
|
||||
uint32_t v=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)];
|
||||
|
||||
LOG_D(PHY,"SRS root sequence: u %d, v %d\n",u,v);
|
||||
LOG_D(PHY,"CommonSrsConfig: Csrs %d, Ssrs %d, AnSrsSimultan %d \n",Csrs,Ssrs,frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission);
|
||||
LOG_D(PHY,"DedicatedSrsConfig: Bsrs %d, bhop %d, nRRC %d, Isrs %d, kTC %d, n_SRS %d\n",Bsrs,soundingrs_ul_config_dedicated->srs_HoppingBandwidth,n_RRC
|
||||
,soundingrs_ul_config_dedicated->srs_ConfigIndex,kTC
|
||||
,soundingrs_ul_config_dedicated->cyclicShift);
|
||||
|
||||
if (frame_parms->N_RB_UL < 41) {
|
||||
msrs0 = msrsb_6_40[Csrs][0];
|
||||
@@ -161,7 +170,7 @@ int32_t generate_srs_tx(PHY_VARS_UE *ue,
|
||||
}
|
||||
|
||||
Msc_RS = msrsb * 6;
|
||||
k0 = (((frame_parms->N_RB_UL>>1)-(msrs0>>1))*12) + kTC;
|
||||
k0 = ( ( (int16_t)(frame_parms->N_RB_UL>>1) - (int16_t)(msrs0>>1) ) * 12 ) + kTC;
|
||||
nb = (4*n_RRC/msrsb)%Nb;
|
||||
|
||||
for (b=0; b<=Bsrs; b++) {
|
||||
@@ -200,53 +209,32 @@ int32_t generate_srs_tx(PHY_VARS_UE *ue,
|
||||
msg("generate_srs_tx: Msc_RS = %d, Msc_RS_idx = %d\n",Msc_RS, Msc_RS_idx);
|
||||
#endif
|
||||
|
||||
T_SFC = (Ssrs<=7 ? 5 : 10);
|
||||
carrier_pos = (frame_parms->first_carrier_offset + k0);
|
||||
if (carrier_pos>frame_parms->ofdm_symbol_size) {
|
||||
carrier_pos -= frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
uint16_t nsymb = (frame_parms->Ncp==0) ? 14:12;
|
||||
symbol_offset = (int)frame_parms->ofdm_symbol_size*((subframe*nsymb)+(nsymb-1));
|
||||
|
||||
if ((1<<(subframe%T_SFC))&transmission_offset_tdd[Ssrs]) {
|
||||
|
||||
#ifndef IFFT_FPGA_UE
|
||||
carrier_pos = (frame_parms->first_carrier_offset + k0) % frame_parms->ofdm_symbol_size;
|
||||
//msg("carrier_pos = %d\n",carrier_pos);
|
||||
//subframe_offset = subframe*frame_parms->symbols_per_tti*frame_parms->ofdm_symbol_size;
|
||||
//symbol_offset = subframe_offset+(frame_parms->symbols_per_tti-1)*frame_parms->ofdm_symbol_size;
|
||||
|
||||
subframe_offset = subframe*frame_parms->symbols_per_tti*frame_parms->ofdm_symbol_size;
|
||||
symbol_offset = subframe_offset+(frame_parms->symbols_per_tti-1)*frame_parms->ofdm_symbol_size;
|
||||
int32_t *txptr;
|
||||
txptr = &txdataF[0][symbol_offset];
|
||||
|
||||
for (k=0; k<Msc_RS; k++) {
|
||||
((short*) txdataF)[2*(symbol_offset + carrier_pos)] = (short) (((int32_t) amp * (int32_t) ul_ref_sigs[0][0][Msc_RS_idx][k<<1])>>15);
|
||||
((short*) txdataF)[2*(symbol_offset + carrier_pos)+1] = (short) (((int32_t) amp * (int32_t) ul_ref_sigs[0][0][Msc_RS_idx][(k<<1)+1])>>15);
|
||||
carrier_pos+=2;
|
||||
int32_t real = ((int32_t) amp * (int32_t) ul_ref_sigs[u][v][Msc_RS_idx][k<<1]) >> 15;
|
||||
int32_t imag = ((int32_t) amp * (int32_t) ul_ref_sigs[u][v][Msc_RS_idx][(k<<1)+1]) >> 15;
|
||||
txptr[carrier_pos] = (real&0xFFFF) + ((imag<<16)&0xFFFF0000);
|
||||
|
||||
|
||||
carrier_pos = carrier_pos+2;
|
||||
|
||||
if (carrier_pos >= frame_parms->ofdm_symbol_size)
|
||||
carrier_pos=1;
|
||||
carrier_pos=carrier_pos-frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
|
||||
#else
|
||||
carrier_pos = (frame_parms->N_RB_UL*12/2 + k0) % (frame_parms->N_RB_UL*12);
|
||||
//msg("carrier_pos = %d\n",carrier_pos);
|
||||
|
||||
subframe_offset = subframe*frame_parms->symbols_per_tti*frame_parms->N_RB_UL*12;
|
||||
symbol_offset = subframe_offset+(frame_parms->symbols_per_tti-1)*frame_parms->N_RB_UL*12;
|
||||
|
||||
for (k=0; k<Msc_RS; k++) {
|
||||
if ((ul_ref_sigs[0][0][Msc_RS_idx][k<<1] >= 0) && (ul_ref_sigs[0][0][Msc_RS_idx][(k<<1)+1] >= 0))
|
||||
txdataF[symbol_offset+carrier_pos] = (int32_t) 4;
|
||||
else if ((ul_ref_sigs[0][0][Msc_RS_idx][k<<1] >= 0) && (ul_ref_sigs[0][0][Msc_RS_idx][(k<<1)+1] < 0))
|
||||
txdataF[symbol_offset+carrier_pos] = (int32_t) 2;
|
||||
else if ((ul_ref_sigs[0][0][Msc_RS_idx][k<<1] < 0) && (ul_ref_sigs[0][0][Msc_RS_idx][(k<<1)+1] >= 0))
|
||||
txdataF[symbol_offset+carrier_pos] = (int32_t) 3;
|
||||
else if ((ul_ref_sigs[0][0][Msc_RS_idx][k<<1] < 0) && (ul_ref_sigs[0][0][Msc_RS_idx][(k<<1)+1] < 0))
|
||||
txdataF[symbol_offset+carrier_pos] = (int32_t) 1;
|
||||
|
||||
carrier_pos+=2;
|
||||
|
||||
if (carrier_pos >= frame_parms->N_RB_UL*12)
|
||||
carrier_pos=0;
|
||||
}
|
||||
|
||||
#endif
|
||||
// write_output("srs_txF.m","srstxF",&txdataF[symbol_offset],512,1,1);
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
@@ -59,10 +59,10 @@ int generate_sss(int32_t **txdataF,
|
||||
|
||||
Nsymb = (frame_parms->Ncp==NORMAL)?14:12;
|
||||
k = frame_parms->ofdm_symbol_size-3*12+5;
|
||||
a = (frame_parms->nb_antennas_tx == 1) ? amp : (amp*ONE_OVER_SQRT2_Q15)>>15;
|
||||
a = (frame_parms->nb_antenna_ports_eNB == 1) ? amp : (amp*ONE_OVER_SQRT2_Q15)>>15;
|
||||
|
||||
for (i=0; i<62; i++) {
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||
for (aa=0; aa<frame_parms->nb_antenna_ports_eNB; aa++) {
|
||||
|
||||
((int16_t*)txdataF[aa])[2*(slot_offset*Nsymb/2*frame_parms->ofdm_symbol_size +
|
||||
symbol*frame_parms->ofdm_symbol_size + k)] =
|
||||
|
||||
@@ -836,3 +836,5 @@ void print_CQI(void *o,UCI_format_t uci_format,unsigned char eNB_id,int N_RB_DL)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -140,6 +140,8 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag)
|
||||
if (ulsch) {
|
||||
memset(ulsch,0,sizeof(LTE_UE_ULSCH_t));
|
||||
|
||||
ulsch->Mlimit = 4;
|
||||
|
||||
for (i=0; i<8; i++) {
|
||||
|
||||
ulsch->harq_processes[i] = (LTE_UL_UE_HARQ_t *)malloc16(sizeof(LTE_UL_UE_HARQ_t));
|
||||
@@ -498,6 +500,21 @@ uint32_t ulsch_encoding(uint8_t *a,
|
||||
|
||||
|
||||
G = G - Q_RI - Q_CQI;
|
||||
ulsch->harq_processes[harq_pid]->G = G;
|
||||
|
||||
/*
|
||||
LOG_I(PHY,"ULSCH Encoding G %d, Q_RI %d (O_RI%d, Msc_initial %d, Nsymb_initial%d, beta_offset_ri_times8 %d), Q_CQI %d, Q_ACK %d \n",G,Q_RI,ulsch->O_RI,ulsch->harq_processes[harq_pid]->Msc_initial,ulsch->harq_processes[harq_pid]->Nsymb_initial,ulsch->beta_offset_ri_times8,Q_CQI,Q_ACK);
|
||||
|
||||
LOG_I(PHY,"ULSCH Encoding (Nid_cell %d, rnti %x): harq_pid %d round %d, RV %d, mcs %d, O_RI %d, O_ACK %d, G %d\n",
|
||||
frame_parms->Nid_cell,ulsch->rnti,
|
||||
harq_pid,
|
||||
ulsch->harq_processes[harq_pid]->round,
|
||||
ulsch->harq_processes[harq_pid]->rvidx,
|
||||
ulsch->harq_processes[harq_pid]->mcs,
|
||||
ulsch->O_RI,
|
||||
ulsch->harq_processes[harq_pid]->O_ACK,
|
||||
G);
|
||||
*/
|
||||
|
||||
if ((int)G < 0) {
|
||||
LOG_E(PHY,"FATAL: ulsch_coding.c G < 0 (%d) : Q_RI %d, Q_CQI %d, O %d, betaCQI_times8 %d)\n",G,Q_RI,Q_CQI,ulsch->O,ulsch->beta_offset_cqi_times8);
|
||||
|
||||
@@ -228,7 +228,7 @@ int ulsch_decoding_data_2thread0(td_params* tdp) {
|
||||
LTE_eNB_ULSCH_t *ulsch = eNB->ulsch[UE_id];
|
||||
LTE_UL_eNB_HARQ_t *ulsch_harq = ulsch->harq_processes[harq_pid];
|
||||
int Q_m = get_Qm_ul(ulsch_harq->mcs);
|
||||
int G = ulsch_harq->nb_rb * (12 * Q_m) * ulsch_harq->Nsymb_pusch;
|
||||
int G = ulsch_harq->G;
|
||||
uint32_t E;
|
||||
uint32_t Gp,GpmodC,Nl=1;
|
||||
uint32_t C = ulsch_harq->C;
|
||||
@@ -449,8 +449,8 @@ int ulsch_decoding_data_2thread(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr
|
||||
int16_t dummy_w[MAX_NUM_ULSCH_SEGMENTS][3*(6144+64)];
|
||||
LTE_eNB_ULSCH_t *ulsch = eNB->ulsch[UE_id];
|
||||
LTE_UL_eNB_HARQ_t *ulsch_harq = ulsch->harq_processes[harq_pid];
|
||||
int Q_m = get_Qm_ul(ulsch_harq->mcs);
|
||||
int G = ulsch_harq->nb_rb * (12 * Q_m) * ulsch_harq->Nsymb_pusch;
|
||||
//int Q_m = get_Qm_ul(ulsch_harq->mcs);
|
||||
int G = ulsch_harq->G;
|
||||
unsigned int E;
|
||||
int Cby2;
|
||||
|
||||
@@ -657,8 +657,8 @@ int ulsch_decoding_data(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr8_flag)
|
||||
int16_t dummy_w[MAX_NUM_ULSCH_SEGMENTS][3*(6144+64)];
|
||||
LTE_eNB_ULSCH_t *ulsch = eNB->ulsch[UE_id];
|
||||
LTE_UL_eNB_HARQ_t *ulsch_harq = ulsch->harq_processes[harq_pid];
|
||||
int Q_m = get_Qm_ul(ulsch_harq->mcs);
|
||||
int G = ulsch_harq->nb_rb * (12 * Q_m) * ulsch_harq->Nsymb_pusch;
|
||||
//int Q_m = get_Qm_ul(ulsch_harq->mcs);
|
||||
int G = ulsch_harq->G;
|
||||
unsigned int E;
|
||||
|
||||
uint8_t (*tc)(int16_t *y,
|
||||
@@ -872,7 +872,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
|
||||
int16_t ys,c;
|
||||
uint32_t wACK_idx;
|
||||
uint8_t dummy_w_cc[3*(MAX_CQI_BITS+8+32)];
|
||||
int16_t y[6*14*1200];
|
||||
int16_t y[6*14*1200] __attribute__((aligned(32)));
|
||||
uint8_t ytag[14*1200];
|
||||
// uint8_t ytag2[6*14*1200],*ytag2_ptr;
|
||||
int16_t cseq[6*14*1200];
|
||||
@@ -1036,6 +1036,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
|
||||
#endif
|
||||
|
||||
G = G - Q_RI - Q_CQI;
|
||||
ulsch_harq->G = G;
|
||||
|
||||
if ((int)G < 0) {
|
||||
LOG_E(PHY,"FATAL: ulsch_decoding.c G < 0 (%d) : Q_RI %d, Q_CQI %d\n",G,Q_RI,Q_CQI);
|
||||
@@ -1441,7 +1442,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
|
||||
}
|
||||
|
||||
#if defined(__x86_64__)||defined(__i386__)
|
||||
#ifndef __AVX2
|
||||
#ifndef __AVX2__
|
||||
for (iprime=0; iprime<G;iprime+=8,j2+=8)
|
||||
*((__m128i *)&ulsch_harq->e[iprime]) = *((__m128i *)&y[j2]);
|
||||
#else
|
||||
@@ -1532,6 +1533,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
|
||||
// CQI
|
||||
|
||||
// printf("before cqi c[%d] = %p\n",0,ulsch_harq->c[0]);
|
||||
ulsch_harq->cqi_crc_status = 0;
|
||||
if (Q_CQI>0) {
|
||||
memset((void *)&dummy_w_cc[0],0,3*(ulsch_harq->Or1+8+32));
|
||||
|
||||
@@ -1554,9 +1556,6 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
|
||||
|
||||
if (extract_cqi_crc(o_flip,ulsch_harq->Or1) == (crc8(o_flip,ulsch_harq->Or1)>>24))
|
||||
ulsch_harq->cqi_crc_status = 1;
|
||||
else
|
||||
ulsch_harq->cqi_crc_status = 0;
|
||||
|
||||
|
||||
if (ulsch->harq_processes[harq_pid]->Or1<=32) {
|
||||
ulsch_harq->o[3] = o_flip[0] ;
|
||||
|
||||
@@ -426,13 +426,14 @@ void ulsch_modulation(int32_t **txdataF,
|
||||
|
||||
G = (int)ulsch->harq_processes[harq_pid]->nb_rb * (12 * Q_m) * (ulsch->Nsymb_pusch);
|
||||
|
||||
|
||||
// Mapping
|
||||
nsymb = (frame_parms->Ncp==0) ? 14:12;
|
||||
Msc_PUSCH = ulsch->harq_processes[harq_pid]->nb_rb*12;
|
||||
|
||||
#ifdef DEBUG_ULSCH_MODULATION
|
||||
printf("ulsch_modulation.c: Doing modulation (rnti %x,x2 %x) for G=%d bits, harq_pid %d , nb_rb %d, Q_m %d, Nsymb_pusch %d (nsymb %d), subframe %d\n",
|
||||
ulsch->rnti,x2,G,harq_pid,ulsch->harq_processes[harq_pid]->nb_rb,Q_m, ulsch->Nsymb_pusch,nsymb,subframe);
|
||||
LOG_D(PHY,"ulsch_modulation.c: Doing modulation (rnti %x,x2 %x) for G=%d bits, harq_pid %d , nb_rb %d, Q_m %d, Nsymb_pusch %d (nsymb %d), subframe %d\n",
|
||||
ulsch->rnti,x2,G,harq_pid,ulsch->harq_processes[harq_pid]->nb_rb,Q_m, ulsch->Nsymb_pusch,nsymb,subframe);
|
||||
#endif
|
||||
|
||||
// scrambling (Note the placeholding bits are handled in ulsch_coding.c directly!)
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
/*******************************************************************************
|
||||
OpenAirInterface
|
||||
Copyright(c) 1999 - 2014 Eurecom
|
||||
|
||||
OpenAirInterface is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
OpenAirInterface is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenAirInterface.The full GNU General Public License is
|
||||
included in this distribution in the file called "COPYING". If not,
|
||||
see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Contact Information
|
||||
OpenAirInterface Admin: openair_admin@eurecom.fr
|
||||
OpenAirInterface Tech : openair_tech@eurecom.fr
|
||||
OpenAirInterface Dev : openair4g-devel@eurecom.fr
|
||||
|
||||
Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
/*! \file PHY/MODULATION/beamforming.c
|
||||
* \brief
|
||||
* \author X. JIANG, F. Kaltenberger, R. KNOPP
|
||||
* \date 2016
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \email: xiwen.jiang@eurecom.fr,florian.kaltenberger@eurecom.fr,raymond.knopp@eurecom.fr
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
#include "PHY/defs.h"
|
||||
#include "PHY/extern.h"
|
||||
#include "PHY/CODING/defs.h"
|
||||
#include "PHY/CODING/extern.h"
|
||||
#include "PHY/CODING/lte_interleaver_inline.h"
|
||||
#include "PHY/LTE_TRANSPORT/defs.h"
|
||||
#include "defs.h"
|
||||
#include "UTIL/LOG/vcd_signal_dumper.h"
|
||||
|
||||
int beam_precoding(int32_t **txdataF,
|
||||
int32_t **txdataF_BF,
|
||||
LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t ***beam_weights,
|
||||
int slot,
|
||||
int symbol,
|
||||
int aa)
|
||||
{
|
||||
uint8_t p;
|
||||
uint16_t re=0;
|
||||
int slot_offset_F;
|
||||
|
||||
slot_offset_F = slot*(frame_parms->ofdm_symbol_size)*((frame_parms->Ncp==1) ? 6 : 7);
|
||||
|
||||
// clear txdata_BF[aa][re] for each call of ue_spec_beamforming
|
||||
memset(txdataF_BF[aa],0,sizeof(int32_t)*(frame_parms->ofdm_symbol_size));
|
||||
|
||||
for (p=0; p<14; p++) {
|
||||
//if (p==0 || p==1 || p==5 || p>7)
|
||||
// mult_cpx_conj_vector((int16_t*)txdataF[p], (int16_t*)beam_weights[p][aa], (int16_t*)txdataF_BF[aa], frame_parms->ofdm_symbol_size, 15);
|
||||
for (re=0;re<frame_parms->ofdm_symbol_size;re++) {
|
||||
if ((p==0 || p==1 || p==5 || p>=7) && txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re]!=0) {
|
||||
((int16_t*)&txdataF_BF[aa][re])[0] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0]*((int16_t*)&beam_weights[p][aa][re])[0])>>15);
|
||||
((int16_t*)&txdataF_BF[aa][re])[0] -= (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1]*((int16_t*)&beam_weights[p][aa][re])[1])>>15);
|
||||
((int16_t*)&txdataF_BF[aa][re])[1] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0]*((int16_t*)&beam_weights[p][aa][re])[1])>>15);
|
||||
((int16_t*)&txdataF_BF[aa][re])[1] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1]*((int16_t*)&beam_weights[p][aa][re])[0])>>15);
|
||||
|
||||
/*
|
||||
printf("beamforming.c:txdataF[%d][%d]=%d+j%d, beam_weights[%d][%d][%d]=%d+j%d,txdata_BF[%d][%d]=%d+j%d\n",
|
||||
p,slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re,
|
||||
((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0],
|
||||
((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1],
|
||||
p,aa,re,
|
||||
((int16_t*)&beam_weights[p][aa][re])[0],((int16_t*)&beam_weights[p][aa][re])[1],
|
||||
aa,re,
|
||||
((int16_t*)&txdataF_BF[aa][re])[0],
|
||||
((int16_t*)&txdataF_BF[aa][re])[1]);
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include "PHY/impl_defs_lte.h"
|
||||
|
||||
int f_read(char *calibF_fname, int nb_ant, int nb_freq, int32_t **tdd_calib_coeffs){
|
||||
|
||||
FILE *calibF_fd;
|
||||
int i,j,l,calibF_e;
|
||||
|
||||
calibF_fd = fopen(calibF_fname,"r");
|
||||
|
||||
if (calibF_fd) {
|
||||
printf("Loading Calibration matrix from %s\n", calibF_fname);
|
||||
|
||||
for(i=0;i<nb_ant;i++){
|
||||
for(j=0;j<nb_freq*2;j++){
|
||||
fscanf(calibF_fd, "%d", &calibF_e);
|
||||
tdd_calib_coeffs[i][j] = (int16_t)calibF_e;
|
||||
}
|
||||
}
|
||||
printf("%d\n",(int)tdd_calib_coeffs[0][0]);
|
||||
printf("%d\n",(int)tdd_calib_coeffs[1][599]);
|
||||
} else
|
||||
printf("%s not found, running with defaults\n",calibF_fname);
|
||||
}
|
||||
|
||||
|
||||
int estimate_DLCSI_from_ULCSI(int32_t **calib_dl_ch_estimates, int32_t **ul_ch_estimates, int32_t **tdd_calib_coeffs, int nb_ant, int nb_freq) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
int compute_BF_weights(int32_t **beam_weights, int32_t **calib_dl_ch_estimates, PRECODE_TYPE_t precode_type, int nb_ant, int nb_freq) {
|
||||
switch (precode_type) {
|
||||
//case MRT
|
||||
case 0 :
|
||||
//case ZF
|
||||
break;
|
||||
case 1 :
|
||||
//case MMSE
|
||||
break;
|
||||
case 2 :
|
||||
break;
|
||||
default :
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// temporal test function
|
||||
/*
|
||||
void main(){
|
||||
// initialization
|
||||
// compare
|
||||
printf("Hello world!\n");
|
||||
}
|
||||
*/
|
||||
@@ -82,6 +82,8 @@ void normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,LTE_DL_FRA
|
||||
|
||||
void do_OFDM_mod(int32_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms);
|
||||
|
||||
void do_OFDM_mod_symbol(LTE_eNB_COMMON *eNB_common_vars, int eNB_id, uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms);
|
||||
|
||||
void remove_7_5_kHz(PHY_VARS_eNB *phy_vars_eNB,uint8_t subframe);
|
||||
|
||||
void apply_7_5_kHz(PHY_VARS_UE *phy_vars_ue,int32_t*txdata,uint8_t subframe);
|
||||
@@ -92,6 +94,32 @@ void remove_625_Hz(PHY_VARS_eNB *phy_vars_eNB,int16_t *prach);
|
||||
|
||||
void apply_625_Hz(PHY_VARS_UE *phy_vars_ue,int16_t *prach);
|
||||
|
||||
/** \brief This function performs beamforming precoding for common
|
||||
* data
|
||||
@param txdataF Table of pointers for frequency-domain TX signals
|
||||
@param txdataF_BF Table of pointers for frequency-domain TX signals
|
||||
@param frame_parms Frame descriptor structure
|
||||
after beamforming
|
||||
@param beam_weights Beamforming weights applied on each
|
||||
antenna element and each carrier
|
||||
@param slot Slot number
|
||||
@param symbol Symbol index on which to act
|
||||
@param aa physical antenna index*/
|
||||
int beam_precoding(int32_t **txdataF,
|
||||
int32_t **txdataF_BF,
|
||||
LTE_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t ***beam_weights,
|
||||
int slot,
|
||||
int symbol,
|
||||
int aa);
|
||||
|
||||
int f_read(char *calibF_fname, int nb_ant, int nb_freq, int32_t **tdd_calib_coeffs);
|
||||
|
||||
int estimate_DLCSI_from_ULCSI(int32_t **calib_dl_ch_estimates, int32_t **ul_ch_estimates, int32_t **tdd_calib_coeffs, int nb_ant, int nb_freq);
|
||||
|
||||
int compute_BF_weights(int32_t **beam_weights, int32_t **calib_dl_ch_estimates, PRECODE_TYPE_t precode_type, int nb_ant, int nb_freq);
|
||||
|
||||
|
||||
#endif
|
||||
/** @}*/
|
||||
#endif
|
||||
|
||||
@@ -31,6 +31,7 @@ This section deals with basic functions for OFDM Modulation.
|
||||
|
||||
#include "PHY/defs.h"
|
||||
#include "UTIL/LOG/log.h"
|
||||
#include "UTIL/LOG/vcd_signal_dumper.h"
|
||||
|
||||
//static short temp2[2048*4] __attribute__((aligned(16)));
|
||||
|
||||
@@ -283,4 +284,58 @@ void do_OFDM_mod(int32_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t ne
|
||||
|
||||
}
|
||||
|
||||
/** @} */
|
||||
// OFDM modulation for each symbol
|
||||
void do_OFDM_mod_symbol(LTE_eNB_COMMON *eNB_common_vars, int eNB_id, uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms)
|
||||
{
|
||||
|
||||
int aa, l, slot_offset;
|
||||
int32_t **txdataF = eNB_common_vars->txdataF[eNB_id];
|
||||
int32_t **txdataF_BF = eNB_common_vars->txdataF_BF[eNB_id];
|
||||
int32_t **txdata = eNB_common_vars->txdata[eNB_id];
|
||||
|
||||
slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1);
|
||||
|
||||
//printf("Thread %d starting ... aa %d (%llu)\n",omp_get_thread_num(),aa,rdtsc());
|
||||
for (l=0; l<frame_parms->symbols_per_tti>>1; l++) {
|
||||
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||
|
||||
//printf("do_OFDM_mod_l, slot=%d, l=%d, NUMBER_OF_OFDM_CARRIERS=%d,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES=%d\n",next_slot, l,NUMBER_OF_OFDM_CARRIERS,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_BEAM_PRECODING,1);
|
||||
beam_precoding(txdataF,txdataF_BF,frame_parms,eNB_common_vars->beam_weights[eNB_id],next_slot,l,aa);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_BEAM_PRECODING,0);
|
||||
|
||||
//PMCH case not implemented...
|
||||
|
||||
if (frame_parms->Ncp == 1)
|
||||
PHY_ofdm_mod(txdataF_BF[aa], // input
|
||||
&txdata[aa][slot_offset+l*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES], // output
|
||||
frame_parms->ofdm_symbol_size,
|
||||
1, // number of symbols
|
||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||
CYCLIC_PREFIX);
|
||||
else {
|
||||
if (l==0) {
|
||||
PHY_ofdm_mod(txdataF_BF[aa], // input
|
||||
&txdata[aa][slot_offset], // output
|
||||
frame_parms->ofdm_symbol_size,
|
||||
1, // number of symbols
|
||||
frame_parms->nb_prefix_samples0, // number of prefix samples
|
||||
CYCLIC_PREFIX);
|
||||
|
||||
} else {
|
||||
PHY_ofdm_mod(txdataF_BF[aa], // input
|
||||
&txdata[aa][slot_offset+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES0+(l-1)*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES], // output
|
||||
frame_parms->ofdm_symbol_size,
|
||||
1, // number of symbols
|
||||
frame_parms->nb_prefix_samples, // number of prefix samples
|
||||
CYCLIC_PREFIX);
|
||||
|
||||
/* printf("txdata[%d][%d]=%d\n",aa,slot_offset+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES0+(l-1)*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES,txdata[aa][slot_offset+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES0+(l-1)*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES]);
|
||||
* */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -47,6 +47,11 @@ int slot_fep(PHY_VARS_UE *ue,
|
||||
unsigned int frame_length_samples = frame_parms->samples_per_tti * 10;
|
||||
unsigned int rx_offset;
|
||||
|
||||
/*LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id];
|
||||
unsigned char harq_pid = dlsch_ue[0]->current_harq_pid;
|
||||
LTE_DL_UE_HARQ_t *dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid];
|
||||
int uespec_pilot[9][1200];*/
|
||||
|
||||
void (*dft)(int16_t *,int16_t *, int);
|
||||
int tmp_dft_in[2048] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs
|
||||
|
||||
@@ -175,7 +180,7 @@ int slot_fep(PHY_VARS_UE *ue,
|
||||
|
||||
if (ue->perfect_ce == 0) {
|
||||
if ((l==0) || (l==(4-frame_parms->Ncp))) {
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx_eNB; aa++) {
|
||||
for (aa=0; aa<frame_parms->nb_antenna_ports_eNB; aa++) {
|
||||
|
||||
#ifdef DEBUG_FEP
|
||||
printf("Channel estimation eNB %d, aatx %d, slot %d, symbol %d\n",eNB_id,aa,Ns,l);
|
||||
@@ -215,6 +220,7 @@ int slot_fep(PHY_VARS_UE *ue,
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#ifdef DEBUG_FEP
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
PHY_OBJS = $(TOP_DIR)/PHY/LTE_TRANSPORT/pss.o
|
||||
PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/sss.o
|
||||
PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/pilots.o
|
||||
PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/pilots_ue_spec.o
|
||||
PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/pilots_mbsfn.o
|
||||
PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/dlsch_coding.o
|
||||
PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/dlsch_modulation.o
|
||||
@@ -40,6 +41,7 @@ PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/lte_sync_time.o
|
||||
PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/lte_sync_timefreq.o
|
||||
PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/lte_adjust_sync.o
|
||||
PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.o
|
||||
PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.o
|
||||
PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.o
|
||||
PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.o
|
||||
PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/lte_est_freq_offset.o
|
||||
@@ -47,7 +49,7 @@ PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/lte_ue_measurements.o
|
||||
PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/lte_eNB_measurements.o
|
||||
PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/adjust_gain.o
|
||||
PHY_OBJS += $(TOP_DIR)/PHY/LTE_REFSIG/lte_dl_cell_spec.o
|
||||
PHY_OBJS += $(TOP_DIR)/PHY/LTE_REFSIG/lte_dl_uespec.o
|
||||
PHY_OBJS += $(TOP_DIR)/PHY/LTE_REFSIG/lte_dl_ue_spec.o
|
||||
PHY_OBJS += $(TOP_DIR)/PHY/LTE_REFSIG/lte_gold.o
|
||||
PHY_OBJS += $(TOP_DIR)/PHY/LTE_REFSIG/lte_gold_mbsfn.o
|
||||
PHY_OBJS += $(TOP_DIR)/PHY/LTE_REFSIG/lte_dl_mbsfn.o
|
||||
|
||||
@@ -484,7 +484,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms;
|
||||
int nsymb_ce = frame_parms->ofdm_symbol_size;//*frame_parms->symbols_per_tti;
|
||||
uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
|
||||
uint8_t nb_antennas_tx = frame_parms->nb_antennas_tx_eNB;
|
||||
uint8_t nb_antennas_tx = frame_parms->nb_antenna_ports_eNB;
|
||||
int16_t **rxsig_t;
|
||||
int16_t **chest_t;
|
||||
int16_t **chest_f;
|
||||
@@ -507,6 +507,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
|
||||
int coded_bits_per_codeword = 0;
|
||||
int mcs = 0;
|
||||
unsigned char harq_pid = 0;
|
||||
int beamforming_mode = phy_vars_ue->transmission_mode[eNB_id]>6 ? phy_vars_ue->transmission_mode[eNB_id] : 0;
|
||||
|
||||
|
||||
if (phy_vars_ue->dlsch[eNB_id][0]!=NULL) {
|
||||
@@ -537,7 +538,8 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
|
||||
phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Nl,
|
||||
num_pdcch_symbols,
|
||||
frame,
|
||||
subframe);
|
||||
subframe,
|
||||
beamforming_mode);
|
||||
} else {
|
||||
coded_bits_per_codeword = 0; //frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
#include<stdio.h>
|
||||
#include<stdint.h>
|
||||
|
||||
int f_read(char *calibF_fname, int nb_antM, int nb_freq, int16_t (*calibF_mtx)[nb_freq*2]){
|
||||
|
||||
FILE *calibF_fd;
|
||||
int i,j,l,calibF_e;
|
||||
|
||||
calibF_fd = fopen(calibF_fname,"r");
|
||||
|
||||
if (calibF_fd) {
|
||||
printf("Loading Calibration matrix from %s\n", calibF_fname);
|
||||
|
||||
for(i=0;i<nb_antM;i++){
|
||||
for(j=0;j<nb_freq*2;j++){
|
||||
fscanf(calibF_fd, "%d", &calibF_e);
|
||||
calibF_mtx[i][j] = (int16_t)calibF_e;
|
||||
}
|
||||
}
|
||||
printf("%d\n",(int)calibF_mtx[0][0]);
|
||||
printf("%d\n",(int)calibF_mtx[1][599]);
|
||||
} else
|
||||
printf("%s not found, running with defaults\n",calibF_fname);
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user