diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index bfd86cd183..582bfdd742 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -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")
@@ -170,7 +171,7 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath -Wl,${CMAKE_CU
# these changes are related to hardcoded path to include .h files
add_definitions(-DCMAKER)
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3")
-set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3 -O2")
+set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3 -O2")
set(GIT_BRANCH "UNKNOWN")
@@ -195,7 +196,7 @@ if(GIT_FOUND)
OUTPUT_VARIABLE GIT_COMMIT_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE
)
-
+
# Get the latest commit date of the working branch
execute_process(
COMMAND git log -1 --format=%cd
@@ -223,9 +224,9 @@ add_boolean_option(DISABLE_XER_PRINT False "print XER Format")
add_boolean_option(XER_PRINT False "print XER Format")
add_boolean_option(RRC_MSG_PRINT False "print RRC messages")
add_boolean_option(PDCP_MSG_PRINT False "print PDCP messages to /tmp/pdcp.log")
-add_boolean_option(DEBUG_PDCP_PAYLOAD False "print PDCP PDU to stdout") # if true, make sure that global and PDCP log levels are trace
-add_boolean_option(DEBUG_MAC_INTERFACE False "print MAC-RLC PDU exchange to stdout") # if true, make sure that global and PDCP log levels are trace
-add_boolean_option(TRACE_RLC_PAYLOAD False "print RLC PDU to stdout") # if true, make sure that global and PDCP log levels are trace
+add_boolean_option(DEBUG_PDCP_PAYLOAD False "print PDCP PDU to stdout") # if true, make sure that global and PDCP log levels are trace
+add_boolean_option(DEBUG_MAC_INTERFACE False "print MAC-RLC PDU exchange to stdout") # if true, make sure that global and PDCP log levels are trace
+add_boolean_option(TRACE_RLC_PAYLOAD False "print RLC PDU to stdout") # if true, make sure that global and PDCP log levels are trace
add_boolean_option(TEST_OMG False "???")
add_boolean_option(DEBUG_OMG False "???")
add_boolean_option(XFORMS False "This adds the possibility to see the signal oscilloscope")
@@ -486,7 +487,7 @@ add_list2_option(TRANSP_PRO "None" "Transport protocol type" "None" "ETHERNET")
include_directories("${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/")
include_directories ("${OPENAIR_TARGETS}/ARCH/EXMIMO/DEFS/")
#set (option_HWEXMIMOLIB_lib "-l ")
-set(HWLIB_EXMIMO_SOURCE
+set(HWLIB_EXMIMO_SOURCE
${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c
# ${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c
)
@@ -494,27 +495,27 @@ add_library(oai_exmimodevif MODULE ${HWLIB_EXMIMO_SOURCE} )
include_directories("${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/")
set (option_HWUSRPLIB_lib "-l uhd")
-set(HWLIB_USRP_SOURCE
+set(HWLIB_USRP_SOURCE
${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
)
add_library(oai_usrpdevif MODULE ${HWLIB_USRP_SOURCE} )
include_directories("${OPENAIR_TARGETS}/ARCH/BLADERF/USERSPACE/LIB/")
set (option_HWBLADERFLIB_lib "-l bladerf")
-set(HWLIB_BLADERF_SOURCE
+set(HWLIB_BLADERF_SOURCE
${OPENAIR_TARGETS}/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c
)
add_library(oai_bladerfdevif MODULE ${HWLIB_BLADERF_SOURCE} )
include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/")
-set(HWLIB_LMSSDR_SOURCE
+set(HWLIB_LMSSDR_SOURCE
${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp
)
add_library(oai_lmssdrdevif MODULE ${HWLIB_LMSSDR_SOURCE} )
include_directories("${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/")
-set(TPLIB_ETHERNET_SOURCE
+set(TPLIB_ETHERNET_SOURCE
${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c
${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c
@@ -569,12 +570,12 @@ elseif (${RF_BOARD} STREQUAL "CPRIGW")
)
include_directories("${OPENAIR_TARGETS}/ARCH/CPRIGW/USERSPACE/LIB/")
set(option_HW_lib "-rdynamic dl")
-
+
endif (${RF_BOARD} STREQUAL "EXMIMO")
if (${TRANSP_PRO} STREQUAL "ETHERNET")
-
+
include_directories ("${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB")
set(TRANSPORT_SOURCE ${TRANSPORT_SOURCE}
${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
@@ -583,7 +584,7 @@ if (${TRANSP_PRO} STREQUAL "ETHERNET")
)
set(option_TP_lib "-rdynamic -ldl")
-
+
endif (${TRANSP_PRO} STREQUAL "ETHERNET")
##########################################################
@@ -837,13 +838,13 @@ include_directories("${OPENAIR_DIR}")
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
@@ -874,10 +875,10 @@ if (FLEXRAN_AGENT_SB_IF)
${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}
@@ -908,12 +909,12 @@ if (FLEXRAN_AGENT_SB_IF)
)
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)
@@ -929,9 +930,9 @@ add_library(HASHTABLE
include_directories(${OPENAIR_DIR}/common/utils/hashtable)
if (MESSAGE_CHART_GENERATOR)
- add_library(MSC
+ add_library(MSC
${OPENAIR_DIR}/common/utils/msc/msc.c
- )
+ )
set(MSC_LIB MSC)
endif()
include_directories(${OPENAIR_DIR}/common/utils/msc)
@@ -1008,7 +1009,7 @@ add_library(SECU_CN ${SECU_CN_SRC})
# Scheduler
################################"
-set(SCHED_SRC
+set(SCHED_SRC
${OPENAIR1_DIR}/SCHED/phy_procedures_lte_eNb.c
${OPENAIR1_DIR}/SCHED/phy_procedures_lte_ue.c
${OPENAIR1_DIR}/SCHED/phy_procedures_lte_common.c
@@ -1100,6 +1101,7 @@ set(PHY_SRC
${OPENAIR1_DIR}/PHY/INIT/lte_parms.c
${OPENAIR1_DIR}/PHY/INIT/lte_param_init.c
${OPENAIR1_DIR}/PHY/TOOLS/file_output.c
+ ${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c
${OPENAIR1_DIR}/PHY/TOOLS/lte_dfts.c
${OPENAIR1_DIR}/PHY/TOOLS/log2_approx.c
${OPENAIR1_DIR}/PHY/TOOLS/cmult_sv.c
@@ -1301,7 +1303,7 @@ set(libnas_api_OBJS
${NAS_SRC}COMMON/API/NETWORK/nas_message.c
${NAS_SRC}COMMON/API/NETWORK/network_api.c
)
-
+
set(libnas_emm_msg_OBJS
${NAS_SRC}COMMON/EMM/MSG/AttachAccept.c
${NAS_SRC}COMMON/EMM/MSG/AttachComplete.c
@@ -1334,7 +1336,7 @@ set(libnas_emm_msg_OBJS
${NAS_SRC}COMMON/EMM/MSG/TrackingAreaUpdateRequest.c
${NAS_SRC}COMMON/EMM/MSG/UplinkNasTransport.c
)
-
+
set(libnas_esm_msg_OBJS
${NAS_SRC}COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c
${NAS_SRC}COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c
@@ -1454,7 +1456,7 @@ set (libnas_utils_OBJS
${NAS_SRC}COMMON/UTIL/OctetString.c
)
-if(NAS_UE)
+if(NAS_UE)
set(libnas_ue_api_OBJS
${NAS_SRC}UE/API/USER/at_command.c
${NAS_SRC}UE/API/USER/at_error.c
@@ -1759,7 +1761,7 @@ add_executable(lte-softmodem
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
${GTPU_need_ITTI}
${HW_SOURCE}
- ${TRANSPORT_SOURCE}
+ ${TRANSPORT_SOURCE}
${RTAI_SOURCE}
${XFORMS_SOURCE}
${XFORMS_SOURCE_SOFTMODEM}
@@ -1794,7 +1796,7 @@ add_executable(lte-softmodem-nos1
${OPENAIR2_DIR}/RRC/NAS/rb_config.c
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
${HW_SOURCE}
- ${TRANSPORT_SOURCE}
+ ${TRANSPORT_SOURCE}
${RTAI_SOURCE}
${XFORMS_SOURCE}
${XFORMS_SOURCE_SOFTMODEM}
@@ -1818,15 +1820,15 @@ add_executable(rrh_gw
${OPENAIR_TARGETS}/RT/USER/eNB_transport_IQ.c
${OPENAIR_TARGETS}/RT/USER/UE_transport_IQ.c
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
- ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
+ ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
${HW_SOURCE}
- ${TRANSPORT_SOURCE}
+ ${TRANSPORT_SOURCE}
${T_SOURCE}
)
target_include_directories(rrh_gw PRIVATE ${OPENAIR_DIR}/common/utils/itti)
target_link_libraries(rrh_gw
-Wl,--start-group
- UTIL LFDS
+ UTIL LFDS
-Wl,--end-group )
target_link_libraries (rrh_gw rt pthread m )
target_link_libraries (rrh_gw ${option_HW_lib} ${option_TP_lib})
@@ -1890,7 +1892,7 @@ add_executable(oaisim
${GTPU_need_ITTI}
${OPENAIR_TARGETS}/COMMON/create_tasks.c
${HW_SOURCE}
- ${TRANSPORT_SOURCE}
+ ${TRANSPORT_SOURCE}
${XFORMS_SOURCE}
${T_SOURCE}
)
@@ -1934,7 +1936,7 @@ add_executable(oaisim_nos1
${OPENAIR2_DIR}/RRC/NAS/rb_config.c
${OPENAIR_TARGETS}/COMMON/create_tasks.c
${HW_SOURCE}
- ${TRANSPORT_SOURCE}
+ ${TRANSPORT_SOURCE}
${XFORMS_SOURCE}
${T_SOURCE}
)
@@ -1958,7 +1960,20 @@ target_link_libraries (oaisim_nos1 ${T_LIB})
# Unitary tests for each piece of L1: example, mbmssim is MBMS L1 simulator
#####################################
+#special case for dlim TM4, which uses its own version of phy_scope code
+add_executable(dlsim_tm4
+ ${OPENAIR_BIN_DIR}/messages_xml.h
+ ${OPENAIR1_DIR}/SIMULATION/LTE_PHY/dlsim_tm4.c
+ ${OPENAIR1_DIR}/PHY/TOOLS/lte_phy_scope_tm4.c
+ ${T_SOURCE}
+ )
+target_link_libraries (dlsim_tm4
+ -Wl,--start-group SIMU UTIL SCHED_LIB PHY LFDS ${ITTI_LIB} -Wl,--end-group
+ pthread m rt ${CONFIG_LIBRARIES} ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${T_LIB}
+ )
+
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
@@ -1983,7 +1998,7 @@ add_executable(test_epc_generate_scenario
${OPENAIR_BIN_DIR}/messages_xml.h
)
target_link_libraries (test_epc_generate_scenario
- -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
+ -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
)
add_executable(test_epc_play_scenario
@@ -2004,7 +2019,7 @@ add_executable(test_epc_play_scenario
)
target_include_directories(test_epc_play_scenario PUBLIC /usr/local/share/asn1c)
target_link_libraries (test_epc_play_scenario
- -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
+ -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
)
@@ -2024,7 +2039,7 @@ foreach(myExe s1ap
${OPENAIR3_DIR}/TEST/test_${myExe}.c
)
target_link_libraries (test_${myExe}
- -Wl,--start-group SECU_CN UTIL LFDS -Wl,--end-group m rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
+ -Wl,--start-group SECU_CN UTIL LFDS -Wl,--end-group m rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
)
endforeach(myExe)
@@ -2040,6 +2055,7 @@ if (${T_TRACER})
add_dependencies(oaisim generate_T)
add_dependencies(oaisim_nos1 generate_T)
add_dependencies(dlsim generate_T)
+ add_dependencies(dlsim_tm4 generate_T)
add_dependencies(dlsim_tm7 generate_T)
add_dependencies(ulsim generate_T)
add_dependencies(pbchsim generate_T)
@@ -2187,16 +2203,16 @@ make_driver(ue_ip ${OPENAIR2_DIR}/NETWORK_DRIVER/UE_IP ${ue_ip_src})
# OCTAVE tools
###############
set(OCT_INCL -I${OPENAIR_TARGETS}/ARCH/EXMIMO/DEFS -I${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB -I${OPENAIR_TARGETS}/ARCH/COMMON)
-set(OCT_LIBS -L${CMAKE_CURRENT_BINARY_DIR} -lm -lOPENAIR0_LIB)
+set(OCT_LIBS -L${CMAKE_CURRENT_BINARY_DIR} -lm -lOPENAIR0_LIB)
set(OCT_FLAGS -DEXMIMO)
set(OCT_DIR ${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/OCTAVE)
set(OCT_FILES
oarf_config_exmimo.oct
- oarf_config_exmimo.oct
- oarf_get_frame.oct
- oarf_stop.oct
- oarf_send_frame.oct
- oarf_get_num_detected_cards.oct
+ oarf_config_exmimo.oct
+ oarf_get_frame.oct
+ oarf_stop.oct
+ oarf_send_frame.oct
+ oarf_get_num_detected_cards.oct
oarf_stop_without_reset.oct
)
@@ -2206,7 +2222,7 @@ foreach(file IN ITEMS ${OCT_FILES})
OUTPUT ${file}
DEPENDS ${OCT_DIR}/${src} OPENAIR0_LIB
COMMAND mkoctfile
- ARGS ${OCT_FLAGS} ${OCT_INCL} ${OCT_LIBS}
+ ARGS ${OCT_FLAGS} ${OCT_INCL} ${OCT_LIBS}
ARGS -o ${file} ${OCT_DIR}/${src}
COMMENT "Generating ${file}"
VERBATIM
diff --git a/cmake_targets/autotests/README.txt b/cmake_targets/autotests/README.txt
index 5841ed6dc2..8156e31bee 100644
--- a/cmake_targets/autotests/README.txt
+++ b/cmake_targets/autotests/README.txt
@@ -101,6 +101,19 @@ Obj.# Case# Test# Description
01 51 04 pdcchsim (TBD)
01 51 05 pbchsim (TBD)
01 51 06 mbmssim (TBD)
+01 51 10 dlsim_tm4 test cases (Test 1: 10 MHz, R2.FDD (MCS 5), EVA5, -1dB),
+ (Test 5: 1.4 MHz, R4.FDD (MCS 4), EVA5, 0dB (70%)),
+ (Test 6: 10 MHz, R3.FDD (MCS 15), EVA5, 6.7dB (70%)),
+ (Test 6b: 5 MHz, R3-1.FDD (MCS 15), EVA5, 6.7dB (70%)),
+ (Test 7: 5 MHz, R3-1.FDD (MCS 15), EVA5, 6.7dB (30%)),
+ (Test 7b: 5 MHz, R3-1.FDD (MCS 15), ETU70, 1.4 dB (30%)),
+ (Test 10: 5 MHz, R6.FDD (MCS 25), EVA5, 17.4 dB (70%)),
+ (Test 10b: 5 MHz, R6-1.FDD (MCS 24,18 PRB), EVA5, 17.5dB (70%)),
+ (Test 11: 10 MHz, R7.FDD (MCS 25), EVA5, 17.7dB (70%))
+ (TM2 Test 1 10 MHz, R.11 FDD (MCS 14), EVA5, 6.8 dB (70%)),
+ (TM2 Test 1b 20 MHz, R.11-2 FDD (MCS 13), EVA5, 5.9 dB (70%)),
+
+
01 55 lte-softmodem tests with USRP B210 RF as eNB and ALU EPC w/ Bandrich COTS UE for 1TX/1RX (TM1), 2TX/2RX (TM2)
diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml
index e51b57e6ec..f37c265462 100644
--- a/cmake_targets/autotests/test_case_list.xml
+++ b/cmake_targets/autotests/test_case_list.xml
@@ -994,6 +994,43 @@
3
+
+ execution
+ dlsim_tm4 test cases (Test 1: 10 MHz, R2.FDD (MCS 5), EVA5, -1dB),
+ (Test 5: 1.4 MHz, R4.FDD (MCS 4), EVA5, 0dB (70%)),
+ (Test 6, 10 MHz, R3.FDD (MCS 15), EVA5, 6.7dB (70%)),
+ (Test 6b, 5 MHz, R3-1.FDD (MCS 15), EVA5, 6.7dB (70%)),
+ (Test 7, 5 MHz, R3-1.FDD (MCS 15), EVA5, 6.7dB (30%)),
+ (Test 7b, 5 MHz, R3-1.FDD (MCS 15), ETU70, 1.4 dB (30%)),
+ (Test 10, 5 MHz, R6.FDD (MCS 25), EVA5, 17.4 dB (70%)),
+ (Test 10b, 5 MHz, R6-1.FDD (MCS 24,18 PRB), EVA5, 17.5dB (70%)),
+ (Test 11, 10 MHz, R7.FDD (MCS 25), EVA5, 17.7dB (70%))
+ (TM2 Test 1 10 MHz, R.11 FDD (MCS 14), EVA5, 6.8 dB (70%)),
+ (TM2 Test 1b 20 MHz, R.11-2 FDD (MCS 13), EVA5, 5.9 dB (70%)),
+
+
+ $OPENAIR_DIR/cmake_targets/build_oai
+ --phy_simulators -c
+ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash
+
+ $OPENAIR_DIR/cmake_targets/lte-simulators/build/dlsim_tm4
+ -m5 -gF -s-1 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O70
+ -m4 -gF -s0 -w1.0 -f.2 -n500 -B6 -c4 -z2 -O70
+ -m15 -gF -s6.7 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O70
+ -m14 -gF -s6.7 -w1.0 -f.2 -n500 -B25 -c3 -z2 -O70
+ -m15 -gG -s6.7 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O30
+ -m14 -gG -s1.4 -w1.0 -f.2 -n500 -B25 -c3 -z2 -O30
+ -m25 -gF -s17.4 -w1.0 -f.2 -n500 -B25 -c3 -z2 -O70
+ -m25 -gF -s17.5 -w1.0 -f.2 -n500 -B25 -c3 -z2 -r1022 -O70
+ -m26 -gF -s17.7 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O70
+ -m14 -gF -s6.8 -w1.0 -f.2 -n500 -B50 -c2 -x2 -y2 -z2 -O70
+ -m13 -gF -s5.9 -w1.0 -f.2 -n500 -B25 -c3 -x2 -y2 -z2 -O70
+ dlsim_tm4.test1 dlsim_tm4.test5 dlsim_tm4.test6 dlsim_tm4.test6b dlsim_tm4.test7 dlsim_tm4.test7b dlsim_tm4.test10 dlsim_tm4.test10b dlsim_tm4.test11 dlsim_tm4.TM2_test1 dlsim_tm4.TM2_test1b
+ "passed"
+ segmentation fault|assertion|exiting|fatal
+ 3
+
+
lte-softmodem
diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index 2272a338be..9565e365e3 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -543,7 +543,7 @@ function main() {
if [ "$SIMUS_PHY" = "1" ] ; then
# lte unitary simulators compilation
echo_info "Compiling unitary tests simulators"
- simlist="dlsim ulsim pucchsim prachsim pdcchsim pbchsim mbmssim"
+ simlist="dlsim_tm4 dlsim ulsim pucchsim prachsim pdcchsim pbchsim mbmssim"
for f in $simlist ; do
compilations \
lte-simulators $f \
diff --git a/cmake_targets/lte-simulators/CMakeLists.txt b/cmake_targets/lte-simulators/CMakeLists.txt
index 0b706c8748..5ed4d93d80 100644
--- a/cmake_targets/lte-simulators/CMakeLists.txt
+++ b/cmake_targets/lte-simulators/CMakeLists.txt
@@ -8,7 +8,7 @@ set(DEBUG_PHY False)
set(MU_RECIEVER False)
set(RANDOM_BF False)
set(PBS_SIM False)
-set(PERFECT_CE False)
+set(PERFECT_CE True)
set(NAS_UE False)
set(MESSAGE_CHART_GENERATOR False)
diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c
old mode 100644
new mode 100755
index f6f8d8f858..dd939a9869
--- a/openair1/PHY/INIT/lte_init.c
+++ b/openair1/PHY/INIT/lte_init.c
@@ -665,34 +665,34 @@ void phy_config_dedicated_eNB(uint8_t Mod_id,
if (physicalConfigDedicated->antennaInfo) {
switch(physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode) {
case AntennaInfoDedicated__transmissionMode_tm1:
- eNB->transmission_mode[UE_id] = 1;
- break;
+ eNB->transmission_mode[UE_id] = 1;
+ break;
case AntennaInfoDedicated__transmissionMode_tm2:
- eNB->transmission_mode[UE_id] = 2;
- break;
+ eNB->transmission_mode[UE_id] = 2;
+ break;
case AntennaInfoDedicated__transmissionMode_tm3:
- eNB->transmission_mode[UE_id] = 3;
- break;
+ eNB->transmission_mode[UE_id] = 3;
+ break;
case AntennaInfoDedicated__transmissionMode_tm4:
- eNB->transmission_mode[UE_id] = 4;
- break;
+ eNB->transmission_mode[UE_id] = 4;
+ break;
case AntennaInfoDedicated__transmissionMode_tm5:
- eNB->transmission_mode[UE_id] = 5;
- break;
+ eNB->transmission_mode[UE_id] = 5;
+ break;
case AntennaInfoDedicated__transmissionMode_tm6:
- eNB->transmission_mode[UE_id] = 6;
- break;
+ 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->do_precoding = 1;
- eNB->transmission_mode[UE_id] = 7;
- break;
+ eNB->do_precoding = 1;
+ eNB->transmission_mode[UE_id] = 7;
+ break;
default:
- LOG_E(PHY,"Unknown transmission mode!\n");
- break;
+ LOG_E(PHY,"Unknown transmission mode!\n");
+ break;
}
LOG_I(PHY,"Transmission Mode (phy_config_dedicated_eNB) %d\n",eNB->transmission_mode[UE_id]);
-
+
} else {
LOG_D(PHY,"[eNB %d] : Received NULL radioResourceConfigDedicated->antennaInfo from eNB %d\n",Mod_id,UE_id);
}
@@ -838,31 +838,31 @@ void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
LOG_D(PHY,"Transmission Mode %d\n",phy_vars_ue->transmission_mode[eNB_id]);
switch(physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode) {
case AntennaInfoDedicated__transmissionMode_tm1:
- phy_vars_ue->transmission_mode[eNB_id] = 1;
- break;
+ phy_vars_ue->transmission_mode[eNB_id] = 1;
+ break;
case AntennaInfoDedicated__transmissionMode_tm2:
- phy_vars_ue->transmission_mode[eNB_id] = 2;
- break;
+ phy_vars_ue->transmission_mode[eNB_id] = 2;
+ break;
case AntennaInfoDedicated__transmissionMode_tm3:
- phy_vars_ue->transmission_mode[eNB_id] = 3;
- break;
+ phy_vars_ue->transmission_mode[eNB_id] = 3;
+ break;
case AntennaInfoDedicated__transmissionMode_tm4:
- phy_vars_ue->transmission_mode[eNB_id] = 4;
- break;
+ phy_vars_ue->transmission_mode[eNB_id] = 4;
+ break;
case AntennaInfoDedicated__transmissionMode_tm5:
- phy_vars_ue->transmission_mode[eNB_id] = 5;
- break;
+ phy_vars_ue->transmission_mode[eNB_id] = 5;
+ break;
case AntennaInfoDedicated__transmissionMode_tm6:
- phy_vars_ue->transmission_mode[eNB_id] = 6;
- break;
+ 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;
+ phy_vars_ue->transmission_mode[eNB_id] = 7;
+ break;
default:
- LOG_E(PHY,"Unknown transmission mode!\n");
- break;
- }
+ LOG_E(PHY,"Unknown transmission mode!\n");
+ break;
+ }
} else {
LOG_D(PHY,"[UE %d] Received NULL physicalConfigDedicated->antennaInfo from eNB %d\n",Mod_id, eNB_id);
}
@@ -906,29 +906,29 @@ void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
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);
+ // 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;
- }
+ 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) {
@@ -1016,8 +1016,9 @@ void phy_init_lte_ue__PDSCH( LTE_UE_PDSCH* const pdsch, const LTE_DL_FRAME_PARMS
pdsch->pmi_ext = (uint8_t*)malloc16_clear( fp->N_RB_DL );
pdsch->llr[0] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
pdsch->llr128 = (int16_t**)malloc16_clear( sizeof(int16_t*) );
- pdsch->llr128_2ndstream = (int16_t**)malloc16_clear( sizeof(int16_t*) );
// FIXME! no further allocation for (int16_t*)pdsch->llr128 !!! expect SIGSEGV
+ // FK, 11-3-2015: this is only as a temporary pointer, no memory is stored there
+
pdsch->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
pdsch->rxdataF_uespec_pilots = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
@@ -1026,11 +1027,12 @@ void phy_init_lte_ue__PDSCH( LTE_UE_PDSCH* const pdsch, const LTE_DL_FRAME_PARMS
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_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" );
@@ -1046,15 +1048,14 @@ void phy_init_lte_ue__PDSCH( LTE_UE_PDSCH* const pdsch, const LTE_DL_FRAME_PARMS
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_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 );
}
}
}
-
int phy_init_lte_ue(PHY_VARS_UE *ue,
int nb_connected_eNB,
uint8_t abstraction_flag)
@@ -1072,7 +1073,7 @@ int phy_init_lte_ue(PHY_VARS_UE *ue,
LTE_UE_PDCCH** const pdcch_vars = ue->pdcch_vars;
LTE_UE_PRACH** const prach_vars = ue->prach_vars;
- int i,j,k;
+ int i,j,k,l;
int eNB_id;
printf("Initializing UE vars (abstraction %"PRIu8") for eNB TXant %"PRIu8", UE RXant %"PRIu8"\n",abstraction_flag,fp->nb_antennas_tx,fp->nb_antennas_rx);
@@ -1160,44 +1161,72 @@ int phy_init_lte_ue(PHY_VARS_UE *ue,
phy_init_lte_ue__PDSCH( pdsch_vars_th1[eNB_id], fp );
// thread 0
- pdsch_vars_th0[eNB_id]->llr_shifts = (uint8_t*)malloc16_clear(7*2*fp->N_RB_DL*12);
- pdsch_vars_th0[eNB_id]->llr_shifts_p = pdsch_vars_th0[eNB_id]->llr_shifts;
- pdsch_vars_th0[eNB_id]->dl_ch_mag1 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
- pdsch_vars_th0[eNB_id]->dl_ch_magb1 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
- pdsch_vars_th0[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
+ pdsch_vars_th0[eNB_id]->llr_shifts = (uint8_t*)malloc16_clear(7*2*fp->N_RB_DL*12);
+ pdsch_vars_th0[eNB_id]->llr_shifts_p = pdsch_vars_th0[eNB_id]->llr_shifts;
+ pdsch_vars_th0[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
+ pdsch_vars_th0[eNB_id]->llr128_2ndstream = (int16_t**)malloc16_clear( sizeof(int16_t*) );
+ pdsch_vars_th0[eNB_id]->rho = (int32_t**)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t*) );
- for (k=0; k<8; k++)
- pdsch_vars_th0[eNB_id]->rxdataF_comp1[k] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ // thread 0
+ pdsch_vars_th1[eNB_id]->llr_shifts = (uint8_t*)malloc16_clear(7*2*fp->N_RB_DL*12);
+ pdsch_vars_th1[eNB_id]->llr_shifts_p = pdsch_vars_th0[eNB_id]->llr_shifts;
+ pdsch_vars_th1[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
+ pdsch_vars_th1[eNB_id]->llr128_2ndstream = (int16_t**)malloc16_clear( sizeof(int16_t*) );
+ pdsch_vars_th1[eNB_id]->rho = (int32_t**)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t*) );
- // thread 1
- pdsch_vars_th1[eNB_id]->llr_shifts = (uint8_t*)malloc16_clear(7*2*fp->N_RB_DL*12);
- pdsch_vars_th1[eNB_id]->llr_shifts_p = pdsch_vars_th1[eNB_id]->llr_shifts;
- pdsch_vars_th1[eNB_id]->dl_ch_mag1 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
- pdsch_vars_th1[eNB_id]->dl_ch_magb1 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
- pdsch_vars_th1[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
- for (k=0; k<8; k++)
- pdsch_vars_th1[eNB_id]->rxdataF_comp1[k] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+
+
+ for (int i=0; inb_antennas_rx; i++){
+ pdsch_vars_th0[eNB_id]->rho[i] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
+ pdsch_vars_th1[eNB_id]->rho[i] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
+ }
+
+ pdsch_vars_th0[eNB_id]->dl_ch_rho2_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ pdsch_vars_th1[eNB_id]->dl_ch_rho2_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
for (i=0; inb_antennas_rx; i++)
for (j=0; j<4; j++) {
- int idx = (j<<1)+i;
- pdsch_vars_th0[eNB_id]->dl_ch_mag1[idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
- pdsch_vars_th0[eNB_id]->dl_ch_magb1[idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
-
- pdsch_vars_th1[eNB_id]->dl_ch_mag1[idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
- pdsch_vars_th1[eNB_id]->dl_ch_magb1[idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
-
- for (k=0; k<8; k++)
- {
- pdsch_vars_th0[eNB_id]->rxdataF_comp1[idx][k] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->N_RB_DL*12*14) );
- pdsch_vars_th1[eNB_id]->rxdataF_comp1[idx][k] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->N_RB_DL*12*14) );
- }
+ const int idx = (j<<1)+i;
+ const size_t num = 7*2*fp->N_RB_DL*12+4;
+ pdsch_vars_th0[eNB_id]->dl_ch_rho2_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
+ pdsch_vars_th1[eNB_id]->dl_ch_rho2_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
}
+
+ const size_t num = 7*2*fp->N_RB_DL*12+4;
+ for (k=0;k<8;k++) { //harq_pid
+ for (l=0;l<8;l++) { //round
+ pdsch_vars_th0[eNB_id]->rxdataF_comp1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ pdsch_vars_th0[eNB_id]->dl_ch_rho_ext[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ pdsch_vars_th0[eNB_id]->dl_ch_mag1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ pdsch_vars_th0[eNB_id]->dl_ch_magb1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+
+ pdsch_vars_th1[eNB_id]->rxdataF_comp1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ pdsch_vars_th1[eNB_id]->dl_ch_rho_ext[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ pdsch_vars_th1[eNB_id]->dl_ch_mag1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+ pdsch_vars_th1[eNB_id]->dl_ch_magb1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
+
+
+ for (int i=0; inb_antennas_rx; i++)
+ for (int j=0; j<4; j++) { //frame_parms->nb_antennas_tx; j++)
+ const int idx = (j<<1)+i;
+ pdsch_vars_th0[eNB_id]->dl_ch_rho_ext[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
+ pdsch_vars_th0[eNB_id]->rxdataF_comp1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
+ pdsch_vars_th0[eNB_id]->dl_ch_mag1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
+ pdsch_vars_th0[eNB_id]->dl_ch_magb1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
+
+ pdsch_vars_th1[eNB_id]->dl_ch_rho_ext[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
+ pdsch_vars_th1[eNB_id]->rxdataF_comp1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
+ pdsch_vars_th1[eNB_id]->dl_ch_mag1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
+ pdsch_vars_th1[eNB_id]->dl_ch_magb1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
+ }
+ }
+ }
phy_init_lte_ue__PDSCH( pdsch_vars_SI[eNB_id], fp );
phy_init_lte_ue__PDSCH( pdsch_vars_ra[eNB_id], fp );
phy_init_lte_ue__PDSCH( pdsch_vars_mch[eNB_id], fp );
+
// 100 PRBs * 12 REs/PRB * 4 PDCCH SYMBOLS * 2 LLRs/RE
pdcch_vars[eNB_id]->llr = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
pdcch_vars[eNB_id]->llr16 = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
@@ -1267,7 +1296,11 @@ int phy_init_lte_ue(PHY_VARS_UE *ue,
ue->sinr_CQI_dB = (double*) malloc16_clear( fp->N_RB_DL*12*sizeof(double) );
ue->init_averaging = 1;
- ue->pdsch_config_dedicated->p_a = dB0; // default value until overwritten by RRCConnectionReconfiguration
+ // default value until overwritten by RRCConnectionReconfiguration
+ if (fp->nb_antenna_ports_eNB==2)
+ ue->pdsch_config_dedicated->p_a = dBm3;
+ else
+ ue->pdsch_config_dedicated->p_a = dB0;
// set channel estimation to do linear interpolation in time
ue->high_speed_flag = 1;
@@ -1290,9 +1323,11 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
LTE_eNB_PUSCH** const pusch_vars = eNB->pusch_vars;
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 i, j, eNB_id, UE_id;
int re;
+
eNB->total_dlsch_bitrate = 0;
eNB->total_transmitted_bits = 0;
eNB->total_system_throughput = 0;
@@ -1307,17 +1342,17 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
lte_gold(fp,eNB->lte_gold_table,fp->Nid_cell);
generate_pcfich_reg_mapping(fp);
generate_phich_reg_mapping(fp);
-
+
for (UE_id=0; UE_idfirst_run_timing_advance[UE_id] =
- 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.
+ 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.
// clear whole structure
bzero( &eNB->UE_stats[UE_id], sizeof(LTE_eNB_UE_stats) );
-
+
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.
}
@@ -1325,131 +1360,142 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
{
eNB_id=0;
if (abstraction_flag==0) {
-
+
// 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->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*));
if (eNB->node_function != NGFI_RRU_IF5) {
- for (i=0; inb_antenna_ports_eNB || i==5) {
- common_vars->txdataF[eNB_id][i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t) );
+ for (i=0; inb_antenna_ports_eNB || i==5) {
+ 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->txdataF[%d][%d] = %p (%lu bytes)\n",
- eNB_id,i,common_vars->txdataF[eNB_id][i],
- fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t));
+ printf("[openair][LTE_PHY][INIT] common_vars->txdataF[%d][%d] = %p (%lu 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; inb_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->txdataF_BF[eNB_id][i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t) );
+ if (eNB->node_function != NGFI_RCC_IF4p5)
- // Allocate 10 subframes of I/Q TX signal data (time) if not
- common_vars->txdata[eNB_id][i] = (int32_t*)malloc16_clear( fp->samples_per_tti*10*sizeof(int32_t) );
+ // Allocate 10 subframes of I/Q TX signal data (time) if not
+ common_vars->txdata[eNB_id][i] = (int32_t*)malloc16_clear( fp->samples_per_tti*10*sizeof(int32_t) );
#ifdef DEBUG_PHY
- printf("[openair][LTE_PHY][INIT] common_vars->txdata[%d][%d] = %p (%lu bytes)\n",eNB_id,i,common_vars->txdata[eNB_id][i],
- fp->samples_per_tti*10*sizeof(int32_t));
+ printf("[openair][LTE_PHY][INIT] common_vars->txdata[%d][%d] = %p (%lu bytes)\n",eNB_id,i,common_vars->txdata[eNB_id][i],
+ fp->samples_per_tti*10*sizeof(int32_t));
#endif
}
-
+
for (i=0; inb_antenna_ports_eNB || i==5) {
- common_vars->beam_weights[eNB_id][i] = (int32_t **)malloc16_clear(fp->nb_antennas_tx*sizeof(int32_t*));
- for (j=0; jnb_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; reofdm_symbol_size; re++)
- common_vars->beam_weights[eNB_id][i][j][re] = 0x00007fff;
- }
- else if (i>4) {
- for (re=0; reofdm_symbol_size; re++)
- common_vars->beam_weights[eNB_id][i][j][re] = 0x00007fff/fp->nb_antennas_tx;
- }
+ if (inb_antenna_ports_eNB || i==5) {
+ common_vars->beam_weights[eNB_id][i] = (int32_t **)malloc16_clear(fp->nb_antennas_tx*sizeof(int32_t*));
+ for (j=0; jnb_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; reofdm_symbol_size; re++)
+ common_vars->beam_weights[eNB_id][i][j][re] = 0x00007fff;
+ }
+ else if (i>4) {
+ for (re=0; reofdm_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));
+ 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*) );
- for (i=0; inb_antennas_rx; i++) {
- if (eNB->node_function != NGFI_RCC_IF4p5) {
- // allocate 2 subframes of I/Q signal data (time) if not an RCC (no time-domain signals)
- common_vars->rxdata[eNB_id][i] = (int32_t*)malloc16_clear( fp->samples_per_tti*10*sizeof(int32_t) );
- if (eNB->node_function != NGFI_RRU_IF5)
- // allocate 2 subframes of I/Q signal data (time, 7.5 kHz offset)
- common_vars->rxdata_7_5kHz[eNB_id][i] = (int32_t*)malloc16_clear( 2*fp->samples_per_tti*2*sizeof(int32_t) );
- }
- if (eNB->node_function != NGFI_RRU_IF5)
- // allocate 2 subframes of I/Q signal data (frequency)
- common_vars->rxdataF[eNB_id][i] = (int32_t*)malloc16_clear(sizeof(int32_t)*(2*fp->ofdm_symbol_size*fp->symbols_per_tti) );
+ for (i=0; inb_antennas_rx; i++) {
+ if (eNB->node_function != NGFI_RCC_IF4p5) {
+ // allocate 2 subframes of I/Q signal data (time) if not an RCC (no time-domain signals)
+ common_vars->rxdata[eNB_id][i] = (int32_t*)malloc16_clear( fp->samples_per_tti*10*sizeof(int32_t) );
+
+ if (eNB->node_function != NGFI_RRU_IF5)
+ // allocate 2 subframes of I/Q signal data (time, 7.5 kHz offset)
+ common_vars->rxdata_7_5kHz[eNB_id][i] = (int32_t*)malloc16_clear( 2*fp->samples_per_tti*2*sizeof(int32_t) );
+ }
+
+ if (eNB->node_function != NGFI_RRU_IF5)
+ // allocate 2 subframes of I/Q signal data (frequency)
+ common_vars->rxdataF[eNB_id][i] = (int32_t*)malloc16_clear(sizeof(int32_t)*(2*fp->ofdm_symbol_size*fp->symbols_per_tti) );
+
#ifdef DEBUG_PHY
- printf("[openair][LTE_PHY][INIT] common_vars->rxdata[%d][%d] = %p (%lu bytes)\n",eNB_id,i,common_vars->rxdata[eNB_id][i],fp->samples_per_tti*10*sizeof(int32_t));
- if (eNB->node_function != NGFI_RRU_IF5)
- printf("[openair][LTE_PHY][INIT] common_vars->rxdata_7_5kHz[%d][%d] = %p (%lu bytes)\n",eNB_id,i,common_vars->rxdata_7_5kHz[eNB_id][i],fp->samples_per_tti*2*sizeof(int32_t));
+ printf("[openair][LTE_PHY][INIT] common_vars->rxdata[%d][%d] = %p (%lu bytes)\n",eNB_id,i,common_vars->rxdata[eNB_id][i],fp->samples_per_tti*10*sizeof(int32_t));
+ if (eNB->node_function != NGFI_RRU_IF5)
+ printf("[openair][LTE_PHY][INIT] common_vars->rxdata_7_5kHz[%d][%d] = %p (%lu bytes)\n",eNB_id,i,common_vars->rxdata_7_5kHz[eNB_id][i],fp->samples_per_tti*2*sizeof(int32_t));
#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)&&(eNB->node_function != NGFI_RRU_IF5)) {
- // Channel estimates for SRS
- for (UE_id=0; UE_idnb_antennas_rx*sizeof(int32_t*) );
- srs_vars[UE_id].srs_ch_estimates_time[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
-
- for (i=0; inb_antennas_rx; i++) {
- srs_vars[UE_id].srs_ch_estimates[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size );
- srs_vars[UE_id].srs_ch_estimates_time[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 );
- }
- } //UE_id
-
- common_vars->sync_corr[eNB_id] = (uint32_t*)malloc16_clear( LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(uint32_t)*fp->samples_per_tti );
+
+ // Channel estimates for SRS
+ for (UE_id=0; UE_idnb_antennas_rx*sizeof(int32_t*) );
+ srs_vars[UE_id].srs_ch_estimates_time[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
+
+ for (i=0; inb_antennas_rx; i++) {
+ srs_vars[UE_id].srs_ch_estimates[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size );
+ srs_vars[UE_id].srs_ch_estimates_time[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 );
+ }
+ } //UE_id
+
+ common_vars->sync_corr[eNB_id] = (uint32_t*)malloc16_clear( LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(uint32_t)*fp->samples_per_tti );
}
} // abstraction_flag = 0
else { //UPLINK abstraction = 1
eNB->sinr_dB = (double*) malloc16_clear( fp->N_RB_DL*12*sizeof(double) );
}
} //eNB_id
-
-
-
+
+
+
if (abstraction_flag==0) {
if ((eNB->node_function != NGFI_RRU_IF4p5)&&(eNB->node_function != NGFI_RRU_IF5)) {
generate_ul_ref_sigs_rx();
-
+
// SRS
for (UE_id=0; UE_idofdm_symbol_size*sizeof(int32_t));
+ srs_vars[UE_id].srs = (int32_t*)malloc16_clear(2*fp->ofdm_symbol_size*sizeof(int32_t));
}
}
}
-
-
-
+
+
+
// ULSCH VARS, skip if NFGI_RRU_IF4
-
+
+
if ((eNB->node_function!=NGFI_RRU_IF4p5)&&(eNB->node_function != NGFI_RRU_IF5))
+
prach_vars->prachF = (int16_t*)malloc16_clear( 1024*2*sizeof(int16_t) );
-
+
/* number of elements of an array X is computed as sizeof(X) / sizeof(X[0]) */
AssertFatal(fp->nb_antennas_rx <= sizeof(prach_vars->rxsigF) / sizeof(prach_vars->rxsigF[0]),
"nb_antennas_rx too large");
@@ -1459,10 +1505,11 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
printf("[openair][LTE_PHY][INIT] prach_vars->rxsigF[%d] = %p\n",i,prach_vars->rxsigF[i]);
#endif
}
-
+
if ((eNB->node_function != NGFI_RRU_IF4p5)&&(eNB->node_function != NGFI_RRU_IF5)) {
+
AssertFatal(fp->nb_antennas_rx <= sizeof(prach_vars->prach_ifft) / sizeof(prach_vars->prach_ifft[0]),
- "nb_antennas_rx too large");
+ "nb_antennas_rx too large");
for (i=0; inb_antennas_rx; i++) {
prach_vars->prach_ifft[i] = (int16_t*)malloc16_clear(1024*2*sizeof(int16_t));
#ifdef DEBUG_PHY
@@ -1471,77 +1518,81 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
}
for (UE_id=0; UE_idrxdataF_ext[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
- pusch_vars[UE_id]->rxdataF_ext2[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
- pusch_vars[UE_id]->drs_ch_estimates[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
- pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
- pusch_vars[UE_id]->rxdataF_comp[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
- pusch_vars[UE_id]->ul_ch_mag[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
- pusch_vars[UE_id]->ul_ch_magb[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
-
- for (i=0; inb_antennas_rx; i++) {
- // RK 2 times because of output format of FFT!
- // FIXME We should get rid of this
- pusch_vars[UE_id]->rxdataF_ext[eNB_id][i] = (int32_t*)malloc16_clear( 2*sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti );
- pusch_vars[UE_id]->rxdataF_ext2[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti );
- pusch_vars[UE_id]->drs_ch_estimates[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti );
- pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id][i] = (int32_t*)malloc16_clear( 2*2*sizeof(int32_t)*fp->ofdm_symbol_size );
- pusch_vars[UE_id]->rxdataF_comp[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti );
- pusch_vars[UE_id]->ul_ch_mag[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 );
- pusch_vars[UE_id]->ul_ch_magb[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 );
- }
- } //eNB_id
-
- pusch_vars[UE_id]->llr = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
+ for (eNB_id=0; eNB_id<3; eNB_id++) {
+
+ pusch_vars[UE_id]->rxdataF_ext[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
+ pusch_vars[UE_id]->rxdataF_ext2[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
+ pusch_vars[UE_id]->drs_ch_estimates[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
+ pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
+ pusch_vars[UE_id]->rxdataF_comp[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
+ pusch_vars[UE_id]->ul_ch_mag[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
+ pusch_vars[UE_id]->ul_ch_magb[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
+
+ for (i=0; inb_antennas_rx; i++) {
+ // RK 2 times because of output format of FFT!
+ // FIXME We should get rid of this
+ pusch_vars[UE_id]->rxdataF_ext[eNB_id][i] = (int32_t*)malloc16_clear( 2*sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti );
+ pusch_vars[UE_id]->rxdataF_ext2[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti );
+ pusch_vars[UE_id]->drs_ch_estimates[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti );
+ pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id][i] = (int32_t*)malloc16_clear( 2*2*sizeof(int32_t)*fp->ofdm_symbol_size );
+ pusch_vars[UE_id]->rxdataF_comp[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti );
+ pusch_vars[UE_id]->ul_ch_mag[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 );
+ pusch_vars[UE_id]->ul_ch_magb[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 );
+ }
+ } //eNB_id
+
+ pusch_vars[UE_id]->llr = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
} // abstraction_flag
} //UE_id
-
+
if (abstraction_flag==0) {
if (is_secondary_eNB) {
- for (eNB_id=0; eNB_id<3; eNB_id++) {
- eNB->dl_precoder_SeNB[eNB_id] = (int **)malloc16(4*sizeof(int*));
-
- if (eNB->dl_precoder_SeNB[eNB_id]) {
+ for (eNB_id=0; eNB_id<3; eNB_id++) {
+ eNB->dl_precoder_SeNB[eNB_id] = (int **)malloc16(4*sizeof(int*));
+
+ if (eNB->dl_precoder_SeNB[eNB_id]) {
#ifdef DEBUG_PHY
- printf("[openair][SECSYS_PHY][INIT] eNB->dl_precoder_SeNB[%d] allocated at %p\n",eNB_id,
- eNB->dl_precoder_SeNB[eNB_id]);
+ printf("[openair][SECSYS_PHY][INIT] eNB->dl_precoder_SeNB[%d] allocated at %p\n",eNB_id,
+ eNB->dl_precoder_SeNB[eNB_id]);
#endif
- } else {
- printf("[openair][SECSYS_PHY][INIT] eNB->dl_precoder_SeNB[%d] not allocated\n",eNB_id);
- return(-1);
- }
-
- for (j=0; jnb_antennas_tx; j++) {
- eNB->dl_precoder_SeNB[eNB_id][j] = (int *)malloc16(2*sizeof(int)*(fp->ofdm_symbol_size)); // repeated format (hence the '2*')
-
- if (eNB->dl_precoder_SeNB[eNB_id][j]) {
+ } else {
+ printf("[openair][SECSYS_PHY][INIT] eNB->dl_precoder_SeNB[%d] not allocated\n",eNB_id);
+ return(-1);
+ }
+
+ for (j=0; jnb_antennas_tx; j++) {
+ eNB->dl_precoder_SeNB[eNB_id][j] = (int *)malloc16(2*sizeof(int)*(fp->ofdm_symbol_size)); // repeated format (hence the '2*')
+
+ if (eNB->dl_precoder_SeNB[eNB_id][j]) {
#ifdef DEBUG_PHY
- printf("[openair][LTE_PHY][INIT] eNB->dl_precoder_SeNB[%d][%d] allocated at %p\n",eNB_id,j,
- eNB->dl_precoder_SeNB[eNB_id][j]);
+ printf("[openair][LTE_PHY][INIT] eNB->dl_precoder_SeNB[%d][%d] allocated at %p\n",eNB_id,j,
+ eNB->dl_precoder_SeNB[eNB_id][j]);
#endif
- memset(eNB->dl_precoder_SeNB[eNB_id][j],0,2*sizeof(int)*(fp->ofdm_symbol_size));
- } else {
- printf("[openair][LTE_PHY][INIT] eNB->dl_precoder_SeNB[%d][%d] not allocated\n",eNB_id,j);
- return(-1);
- }
- } //for(j=...nb_antennas_tx
-
- } //for(eNB_id...
+ memset(eNB->dl_precoder_SeNB[eNB_id][j],0,2*sizeof(int)*(fp->ofdm_symbol_size));
+ } else {
+ printf("[openair][LTE_PHY][INIT] eNB->dl_precoder_SeNB[%d][%d] not allocated\n",eNB_id,j);
+ return(-1);
+ }
+ } //for(j=...nb_antennas_tx
+
+ } //for(eNB_id...
}
}
-
+
for (UE_id=0; UE_idUE_stats_ptr[UE_id] = &eNB->UE_stats[UE_id];
-
- eNB->pdsch_config_dedicated->p_a = dB0; //defaul value until overwritten by RRCConnectionReconfiguration
+
+ //defaul value until overwritten by RRCConnectionReconfiguration
+ if (fp->nb_antenna_ports_eNB==2)
+ eNB->pdsch_config_dedicated->p_a = dBm3;
+ else
+ eNB->pdsch_config_dedicated->p_a = dB0;
init_prach_tables(839);
} // node_function != NGFI_RRU_IF4p5
diff --git a/openair1/PHY/INIT/lte_param_init.c b/openair1/PHY/INIT/lte_param_init.c
index 4625eba430..f3833b7709 100644
--- a/openair1/PHY/INIT/lte_param_init.c
+++ b/openair1/PHY/INIT/lte_param_init.c
@@ -121,9 +121,9 @@ void lte_param_init(unsigned char N_tx_port_eNB,
UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
((UE->frame_parms).pdsch_config_common).p_b = 0;
} else { // rho_a = rhob
- eNB->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
+ eNB->pdsch_config_dedicated->p_a = dBm3; // 4 = 0dB
((eNB->frame_parms).pdsch_config_common).p_b = 1;
- UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
+ UE->pdsch_config_dedicated->p_a = dBm3; // 4 = 0dB
((UE->frame_parms).pdsch_config_common).p_b = 1;
}
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c
index db8fe548a2..d075d0ca50 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c
@@ -197,9 +197,9 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
if (ue->frame_parms.Ncp==NORMAL) {
for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) {
+
rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(5*ue->frame_parms.ofdm_symbol_size)];
rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(6*ue->frame_parms.ofdm_symbol_size)];
-
//-ve spectrum from SSS
// printf("slot %d: SSS DTX: %d,%d, non-DTX %d,%d\n",slot,rxF_pss[-72],rxF_pss[-71],rxF_pss[-36],rxF_pss[-35]);
@@ -298,8 +298,9 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(6*ue->frame_parms.ofdm_symbol_size)];
// note this is a dummy pointer, the pss is not really there!
// in FDD the pss is in the symbol after the sss, but not in TDD
+
rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(7*ue->frame_parms.ofdm_symbol_size)];
-
+
//-ve spectrum from SSS
// ue->measurements.n0_power[aarx] = (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71]));
ue->measurements.n0_power[aarx] = (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69]));
@@ -312,14 +313,14 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+68]*rxF_sss[2+68])+((int32_t)rxF_sss[2+67]*rxF_sss[2+67]));
ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+66]*rxF_sss[2+66])+((int32_t)rxF_sss[2+65]*rxF_sss[2+65]));
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+64]*rxF_sss[2+64])+((int32_t)rxF_sss[2+63]*rxF_sss[2+63]));
-
+
ue->measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(ue->measurements.n0_power[aarx]/(6));
- ue->measurements.n0_power_tot += ue->measurements.n0_power[aarx];
- }
+ ue->measurements.n0_power_tot += ue->measurements.n0_power[aarx];
+ }
ue->measurements.n0_power_tot_dB = (unsigned short) dB_fixed(ue->measurements.n0_power_tot/(6*aarx));
ue->measurements.n0_power_tot_dBm = ue->measurements.n0_power_tot_dB - ue->rx_total_gain_dB - dB_fixed(ue->frame_parms.ofdm_symbol_size);
-
-
+
+
}
#endif
}
@@ -363,7 +364,7 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
// if ((ue->frame_rx&0x3ff) == 0)
// printf("rb %d, off %d : %d\n",rb,off,((rxF[off]*rxF[off])+(rxF[off+1]*rxF[off+1])));
-
+
off+=12;
if (off>=(ue->frame_parms.ofdm_symbol_size<<1))
@@ -474,6 +475,14 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
int nb_subbands,subband_size,last_subband_size;
int N_RB_DL = frame_parms->N_RB_DL;
+ ue->measurements.nb_antennas_rx = frame_parms->nb_antennas_rx;
+
+ if (ue->transmission_mode[eNB_id]!=4)
+ ue->measurements.rank[eNB_id] = 0;
+ else
+ ue->measurements.rank[eNB_id] = 1;
+ // printf ("tx mode %d\n", ue->transmission_mode[eNB_id]);
+ // printf ("rank %d\n", ue->PHY_measurements.rank[eNB_id]);
switch (N_RB_DL) {
case 6:
@@ -625,6 +634,7 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
}
for (aarx=0; aarxnb_antennas_rx; aarx++) {
+ //printf("aarx=%d", aarx);
// skip the first 4 RE due to interpolation filter length of 5 (not possible to skip 5 due to 128i alignment, must be multiple of 128bit)
#if defined(__x86_64__) || defined(__i386__)
@@ -644,9 +654,11 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
// pmi
#if defined(__x86_64__) || defined(__i386__)
- pmi128_re = _mm_setzero_si128();
- pmi128_im = _mm_setzero_si128();
+
+ pmi128_re = _mm_xor_si128(pmi128_re,pmi128_re);
+ pmi128_im = _mm_xor_si128(pmi128_im,pmi128_im);
#elif defined(__arm__)
+
pmi128_re = vdupq_n_s32(0);
pmi128_im = vdupq_n_s32(0);
#endif
@@ -659,18 +671,52 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
for (i=0; imeasurements.rank[eNB_id] = 0;
+ //ue->measurements.rank[eNB_id] = 0;
for (i=0; imeasurements.selected_rx_antennas[eNB_id][i] = 0;
diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
old mode 100644
new mode 100755
index 72f276408f..c4dfecf848
--- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
@@ -37,6 +37,9 @@
#endif
#include "assertions.h"
+
+//#define DEBUG_HARQ
+
#include "LAYER2/MAC/extern.h"
#include "LAYER2/MAC/defs.h"
@@ -399,7 +402,7 @@ uint16_t computeRIV(uint16_t N_RB_DL,uint16_t RBstart,uint16_t Lcrbs)
}
// Convert a DCI Format 1C RIV to a Format 1A RIV
-// This extracts the start and length in PRBs from the 1C rballoc and
+// This extracts the start and length in PRBs from the 1C rballoc and
// recomputes the RIV as if it were the 1A rballoc
uint32_t conv_1C_RIV(int32_t rballoc,uint32_t N_RB_DL) {
@@ -443,7 +446,7 @@ uint32_t conv_1C_RIV(int32_t rballoc,uint32_t N_RB_DL) {
}
// printf("RBpstart %d\n",RBpstart);
return(computeRIV(N_RB_DL,N_RB_step*RBpstart,N_RB_step*(LpCRBsm1+1)));
-
+
}
uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) {
@@ -451,11 +454,11 @@ uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) {
int offset;
switch (N_RB_DL) {
-
+
case 6:
// N_RB_DL = tildeN_RB_DL = 6
// Ngap = 4 , P=1, Nrow = 2, Nnull = 2
-
+
switch (vrb) {
case 0: // even: 0->0, 1->2, odd: 0->3, 1->5
case 1:
@@ -466,19 +469,19 @@ uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) {
return ((3*odd_slot) + 2*(vrb&3) + 5)%6;
break;
case 4: // even: 4->1, odd: 4->4
- return ((3*odd_slot) + 1)%6;
+ return ((3*odd_slot) + 1)%6;
case 5: // even: 5->4, odd: 5->1
return ((3*odd_slot) + 4)%6;
break;
}
break;
-
+
case 15:
if (vrb<12) {
if ((vrb&3) < 2) // even: 0->0, 1->4, 4->1, 5->5, 8->2, 9->6 odd: 0->7, 1->11
- return(((7*odd_slot) + 4*(vrb&3) + (vrb>>2))%14) + 14*(vrb/14);
+ return(((7*odd_slot) + 4*(vrb&3) + (vrb>>2))%14) + 14*(vrb/14);
else if (vrb < 12) // even: 2->7, 3->11, 6->8, 7->12, 10->9, 11->13
- return (((7*odd_slot) + 4*(vrb&3) + (vrb>>2) +13 )%14) + 14*(vrb/14);
+ return (((7*odd_slot) + 4*(vrb&3) + (vrb>>2) +13 )%14) + 14*(vrb/14);
}
if (vrb==12)
return (3+(7*odd_slot)) % 14;
@@ -486,71 +489,71 @@ uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) {
return (10+(7*odd_slot)) % 14;
return 14;
break;
-
+
case 25:
return (((12*odd_slot) + 6*(vrb&3) + (vrb>>2))%24) + 24*(vrb/24);
break;
-
+
case 50: // P=3
if (Ngap==0) {
// Nrow=12,Nnull=2,NVRBDL=46,Ngap1= 27
if (vrb>=23)
- offset=4;
+ offset=4;
else
- offset=0;
+ offset=0;
if (vrb<44) {
- if ((vrb&3)>=2)
- return offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2) + 45)%46;
- else
- return offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2))%46;
+ if ((vrb&3)>=2)
+ return offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2) + 45)%46;
+ else
+ return offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2))%46;
}
if (vrb==44) // even: 44->11, odd: 45->34
- return offset+((23*odd_slot) + 22-12+1);
+ return offset+((23*odd_slot) + 22-12+1);
if (vrb==45) // even: 45->10, odd: 45->33
- return offset+((23*odd_slot) + 22+12);
+ return offset+((23*odd_slot) + 22+12);
if (vrb==46)
- return offset+46+((23*odd_slot) + 23-12+1) % 46;
+ return offset+46+((23*odd_slot) + 23-12+1) % 46;
if (vrb==47)
- return offset+46+((23*odd_slot) + 23+12) % 46;
+ return offset+46+((23*odd_slot) + 23+12) % 46;
if (vrb==48)
- return offset+46+((23*odd_slot) + 23-12+1) % 46;
+ return offset+46+((23*odd_slot) + 23-12+1) % 46;
if (vrb==49)
- return offset+46+((23*odd_slot) + 23+12) % 46;
+ return offset+46+((23*odd_slot) + 23+12) % 46;
}
else {
// Nrow=6,Nnull=6,NVRBDL=18,Ngap1= 27
if (vrb>=9)
- offset=18;
+ offset=18;
else
- offset=0;
-
+ offset=0;
+
if (vrb<12) {
- if ((vrb&3)>=2)
- return offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2) + 17)%18;
- else
- return offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2))%18;
+ if ((vrb&3)>=2)
+ return offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2) + 17)%18;
+ else
+ return offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2))%18;
}
else {
- return offset+((9*odd_slot) + 12*(vrb&1)+(vrb>>1) )%18 + 18*(vrb/18);
+ return offset+((9*odd_slot) + 12*(vrb&1)+(vrb>>1) )%18 + 18*(vrb/18);
}
}
break;
case 75:
// Ngap1 = 32, NVRBRL=64, P=4, Nrow= 16, Nnull=0
if (Ngap ==0) {
- return ((32*odd_slot) + 16*(vrb&3) + (vrb>>2))%64 + (vrb/64);
+ return ((32*odd_slot) + 16*(vrb&3) + (vrb>>2))%64 + (vrb/64);
} else {
// Ngap2 = 16, NVRBDL=32, Nrow=8, Nnull=0
- return ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32);
+ return ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32);
}
break;
case 100:
// Ngap1 = 48, NVRBDL=96, Nrow=24, Nnull=0
if (Ngap ==0) {
- return ((48*odd_slot) + 24*(vrb&3) + (vrb>>2))%96 + (vrb/96);
+ return ((48*odd_slot) + 24*(vrb&3) + (vrb>>2))%96 + (vrb/96);
} else {
// Ngap2 = 16, NVRBDL=32, Nrow=8, Nnull=0
- return ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32);
+ return ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32);
}
break;
default:
@@ -558,7 +561,7 @@ uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) {
return 0;
}
return 0;
-
+
}
@@ -737,7 +740,7 @@ void generate_RIV_tables()
nVRB_even_dist = get_prb(100,0,nVRB,0);
// if ((RBstart==0) && (Lcrbs<=8))
-// printf("nVRB %d => nVRB_even_dist %d\n",nVRB,nVRB_even_dist);
+// printf("nVRB %d => nVRB_even_dist %d\n",nVRB,nVRB_even_dist);
if (nVRB_even_dist<32)
@@ -745,16 +748,16 @@ void generate_RIV_tables()
else if (nVRB_even_dist<64)
allocdist1_0_even |= (1<<(nVRB_even_dist-32));
else if (nVRB_even_dist<96)
- allocdist2_0_even |= (1<<(nVRB_even_dist-64));
+ allocdist2_0_even |= (1<<(nVRB_even_dist-64));
else
- allocdist3_0_even |= (1<<(nVRB_even_dist-96));
+ allocdist3_0_even |= (1<<(nVRB_even_dist-96));
/* if ((RBstart==0) && (Lcrbs<=8))
- printf("rballoc =>(%08x.%08x.%08x.%08x)\n",
- allocdist0_0_even,
- allocdist1_0_even,
- allocdist2_0_even,
- allocdist3_0_even
- );
+ printf("rballoc =>(%08x.%08x.%08x.%08x)\n",
+ allocdist0_0_even,
+ allocdist1_0_even,
+ allocdist2_0_even,
+ allocdist3_0_even
+ );
*/
// Distributed Gap1, odd slot
nVRB_odd_dist = get_prb(100,1,nVRB,0);
@@ -763,9 +766,9 @@ void generate_RIV_tables()
else if (nVRB_odd_dist<64)
allocdist1_0_odd |= (1<<(nVRB_odd_dist-32));
else if (nVRB_odd_dist<96)
- allocdist2_0_odd |= (1<<(nVRB_odd_dist-64));
+ allocdist2_0_odd |= (1<<(nVRB_odd_dist-64));
else
- allocdist3_0_odd |= (1<<(nVRB_odd_dist-96));
+ allocdist3_0_odd |= (1<<(nVRB_odd_dist-96));
// Distributed Gap2, even slot
@@ -775,9 +778,9 @@ void generate_RIV_tables()
else if (nVRB_even_dist<64)
allocdist1_1_even |= (1<<(nVRB_even_dist-32));
else if (nVRB_even_dist<96)
- allocdist2_1_even |= (1<<(nVRB_even_dist-64));
+ allocdist2_1_even |= (1<<(nVRB_even_dist-64));
else
- allocdist3_1_even |= (1<<(nVRB_even_dist-96));
+ allocdist3_1_even |= (1<<(nVRB_even_dist-96));
// Distributed Gap2, odd slot
@@ -787,9 +790,9 @@ void generate_RIV_tables()
else if (nVRB_odd_dist<64)
allocdist1_1_odd |= (1<<(nVRB_odd_dist-32));
else if (nVRB_odd_dist<96)
- allocdist2_1_odd |= (1<<(nVRB_odd_dist-64));
+ allocdist2_1_odd |= (1<<(nVRB_odd_dist-64));
else
- allocdist3_1_odd |= (1<<(nVRB_odd_dist-96));
+ allocdist3_1_odd |= (1<<(nVRB_odd_dist-96));
RIV=computeRIV(100,RBstart,Lcrbs);
@@ -855,7 +858,7 @@ uint8_t get_transmission_mode(module_id_t Mod_id, uint8_t CC_id, rnti_t rnti)
}
int generate_eNB_dlsch_params_from_dci(int frame,
- uint8_t subframe,
+ uint8_t subframe,
void *dci_pdu,
uint16_t rnti,
DCI_format_t dci_format,
@@ -866,14 +869,14 @@ int generate_eNB_dlsch_params_from_dci(int frame,
uint16_t ra_rnti,
uint16_t p_rnti,
uint16_t DL_pmi_single,
- uint8_t beamforming_mode)
+ uint8_t beamforming_mode)
{
uint8_t harq_pid = UINT8_MAX;
uint32_t rballoc = UINT32_MAX;
uint32_t RIV_max = 0;
uint8_t NPRB,tbswap,tpmi=0;
- LTE_eNB_DLSCH_t *dlsch0=NULL,*dlsch1;
+ LTE_eNB_DLSCH_t *dlsch0=NULL,*dlsch1=NULL;
uint8_t frame_type=frame_parms->frame_type;
uint8_t vrb_type=0;
uint8_t mcs=0,mcs1=0,mcs2=0;
@@ -881,6 +884,7 @@ int generate_eNB_dlsch_params_from_dci(int frame,
uint8_t rv=0,rv1=0,rv2=0;
uint8_t rah=0;
uint8_t TPC=0;
+ uint8_t TB0_active=0,TB1_active=0;
LTE_DL_eNB_HARQ_t *dlsch0_harq=NULL,*dlsch1_harq=NULL;
// printf("Generate eNB DCI, format %d, rnti %x (pdu %p)\n",dci_format,rnti,dci_pdu);
@@ -921,13 +925,14 @@ int generate_eNB_dlsch_params_from_dci(int frame,
}
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
+ dlsch0_harq->codeword=0;
if (vrb_type==LOCALIZED) {
- dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT6[rballoc];
+ dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT6[rballoc];
}
else {
- LOG_E(PHY,"Distributed RB allocation not done yet\n");
- mac_xface->macphy_exit("exiting");
+ LOG_E(PHY,"Distributed RB allocation not done yet\n");
+ mac_xface->macphy_exit("exiting");
}
dlsch0_harq->vrb_type = vrb_type;
dlsch0_harq->nb_rb = RIV2nb_rb_LUT6[rballoc];//NPRB;
@@ -959,13 +964,13 @@ int generate_eNB_dlsch_params_from_dci(int frame,
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
-
+
if (vrb_type==LOCALIZED) {
- dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT25[rballoc];
+ dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT25[rballoc];
}
else {
- LOG_E(PHY,"Distributed RB allocation not done yet\n");
- mac_xface->macphy_exit("exiting");
+ LOG_E(PHY,"Distributed RB allocation not done yet\n");
+ mac_xface->macphy_exit("exiting");
}
dlsch0_harq->vrb_type = vrb_type;
dlsch0_harq->nb_rb = RIV2nb_rb_LUT25[rballoc];//NPRB;
@@ -994,12 +999,12 @@ int generate_eNB_dlsch_params_from_dci(int frame,
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
if (vrb_type==LOCALIZED) {
- dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT50_0[rballoc];
- dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT50_1[rballoc];
+ dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT50_0[rballoc];
+ dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT50_1[rballoc];
}
else {
- LOG_E(PHY,"Distributed RB allocation not done yet\n");
- mac_xface->macphy_exit("exiting");
+ LOG_E(PHY,"Distributed RB allocation not done yet\n");
+ mac_xface->macphy_exit("exiting");
}
@@ -1031,14 +1036,14 @@ int generate_eNB_dlsch_params_from_dci(int frame,
dlsch0_harq->vrb_type = vrb_type;
if (vrb_type==LOCALIZED) {
- dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT100_0[rballoc];
- dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT100_1[rballoc];
- dlsch0_harq->rb_alloc[2] = localRIV2alloc_LUT100_2[rballoc];
- dlsch0_harq->rb_alloc[3] = localRIV2alloc_LUT100_3[rballoc];
+ dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT100_0[rballoc];
+ dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT100_1[rballoc];
+ dlsch0_harq->rb_alloc[2] = localRIV2alloc_LUT100_2[rballoc];
+ dlsch0_harq->rb_alloc[3] = localRIV2alloc_LUT100_3[rballoc];
}
else {
- LOG_E(PHY,"Distributed RB allocation not done yet\n");
- mac_xface->macphy_exit("exiting");
+ LOG_E(PHY,"Distributed RB allocation not done yet\n");
+ mac_xface->macphy_exit("exiting");
}
@@ -1211,6 +1216,7 @@ int generate_eNB_dlsch_params_from_dci(int frame,
}
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
+ dlsch0_harq->codeword=0;
// printf("DCI: Setting subframe_tx for subframe %d\n",subframe);
dlsch[0]->subframe_tx[subframe] = 1;
@@ -1240,7 +1246,7 @@ int generate_eNB_dlsch_params_from_dci(int frame,
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) {
@@ -1283,12 +1289,12 @@ int generate_eNB_dlsch_params_from_dci(int frame,
break;
- case format2:
+ case format2: // DL Scheduling assignment for MIMO including closed loop spatial multiplexing
switch (frame_parms->N_RB_DL) {
case 6:
- if (frame_parms->nb_antennas_tx == 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;
@@ -1308,7 +1314,7 @@ int generate_eNB_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 == 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;
@@ -1329,13 +1335,13 @@ int generate_eNB_dlsch_params_from_dci(int frame,
tpmi = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->tpmi;
}
} else {
- LOG_E(PHY,"eNB: subframe %d UE %x, Format2 DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx);
+ LOG_E(PHY,"eNB: subframe %d UE %x, Format2 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 == 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;
@@ -1357,7 +1363,7 @@ int generate_eNB_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 == 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;
@@ -1380,13 +1386,13 @@ int generate_eNB_dlsch_params_from_dci(int frame,
tpmi = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->tpmi;
}
} else {
- LOG_E(PHY,"eNB: subframe %d UE %x, Format2 DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx);
+ LOG_E(PHY,"eNB: subframe %d UE %x, Format2 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 == 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;
@@ -1408,7 +1414,7 @@ int generate_eNB_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 == 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;
@@ -1431,13 +1437,13 @@ int generate_eNB_dlsch_params_from_dci(int frame,
tpmi = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->tpmi;
}
} else {
- LOG_E(PHY,"eNB: subframe %d UE %x, Format2 DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx);
+ LOG_E(PHY,"eNB: subframe %d UE %x, Format2 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 == 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;
@@ -1459,7 +1465,7 @@ int generate_eNB_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 == 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;
@@ -1482,7 +1488,7 @@ int generate_eNB_dlsch_params_from_dci(int frame,
tpmi = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->tpmi;
}
} else {
- LOG_E(PHY,"eNB: subframe %d UE %x, Format2 DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx);
+ LOG_E(PHY,"eNB: subframe %d UE %x, Format2 DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antenna_ports_eNB);
}
break;
@@ -1497,149 +1503,240 @@ int generate_eNB_dlsch_params_from_dci(int frame,
// Flip the TB to codeword mapping as described in 5.3.3.1.5 of 36-212 V11.3.0
// note that we must set tbswap=0 in eNB scheduler if one TB is deactivated
- if (tbswap == 0) {
- dlsch0 = dlsch[0];
- dlsch1 = dlsch[1];
- } else {
- dlsch0 = dlsch[1];
- dlsch1 = dlsch[0];
+ TB0_active = 1;
+ TB1_active = 1;
+
+ if ((rv1 == 1) && (mcs1 == 0)) {
+ TB0_active=0;
+ }
+ if ((rv2 == 1) && (mcs2 == 0)) {
+ TB1_active=0;
+ }
+#ifdef DEBUG_HARQ
+ printf("RV0 = %d, RV1 = %d. MCS0 = %d, MCS1=%d\n", rv1, rv2, mcs1, mcs2);
+#endif
+ if (TB0_active && TB1_active && tbswap==0) {
+ dlsch0=dlsch[0];
+ dlsch1=dlsch[1];
+ dlsch0->active = 1;
+ dlsch1->active = 1;
+ dlsch0_harq = dlsch0->harq_processes[harq_pid];
+ dlsch1_harq = dlsch1->harq_processes[harq_pid];
+ dlsch0_harq->mcs = mcs1;
+ dlsch1_harq->mcs = mcs2;
+ dlsch0_harq->rvidx = rv1;
+ dlsch1_harq->rvidx = rv2;
+ dlsch0_harq->status = ACTIVE;
+ dlsch1_harq->status = ACTIVE;
+ dlsch0_harq->codeword=0;
+ dlsch1_harq->codeword=1;
+#ifdef DEBUG_HARQ
+ printf("\n ENB: BOTH ACTIVE\n");
+#endif
+ }
+ else if (TB0_active && TB1_active && tbswap==1) {
+ dlsch0=dlsch[0];
+ dlsch1=dlsch[1];
+ dlsch0->active = 1;
+ dlsch1->active = 1;
+ dlsch0_harq = dlsch0->harq_processes[harq_pid];
+ dlsch1_harq = dlsch1->harq_processes[harq_pid];
+ dlsch0_harq->mcs = mcs1;
+ dlsch1_harq->mcs = mcs2;
+ dlsch0_harq->rvidx = rv1;
+ dlsch1_harq->rvidx = rv2;
+ dlsch0_harq->status = ACTIVE;
+ dlsch1_harq->status = ACTIVE;
+ dlsch0_harq->codeword=1;
+ dlsch1_harq->codeword=0;
+ }
+ else if (TB0_active && (TB1_active==0)) {
+ dlsch0=dlsch[0];
+ dlsch0->active = 1;
+ dlsch0_harq = dlsch0->harq_processes[harq_pid];
+ dlsch0_harq->mcs = mcs1;
+ dlsch0_harq->rvidx = rv1;
+ dlsch0_harq->status = ACTIVE;
+ dlsch0_harq->codeword = 0;
+ dlsch1=NULL;
+ dlsch1_harq = NULL;
+#ifdef DEBUG_HARQ
+ printf("\n ENB: TB1 is deactivated, retransmit TB0 transmit in TM6\n");
+#endif
+ }
+ else if ((TB0_active==0) && TB1_active) {
+ dlsch1=dlsch[1];
+ dlsch1->active = 1;
+ dlsch1_harq = dlsch1->harq_processes[harq_pid];
+ dlsch1_harq->mcs = mcs2;
+ dlsch1_harq->rvidx = rv2;
+ dlsch1_harq->status = ACTIVE;
+ dlsch1_harq->codeword = 0;
+ dlsch0=NULL;
+ dlsch0_harq = NULL;
+#ifdef DEBUG_HARQ
+ printf("\n ENB: TB0 is deactivated, retransmit TB1 transmit in TM6\n");
+#endif
}
- dlsch0_harq = dlsch0->harq_processes[harq_pid];
- dlsch1_harq = dlsch1->harq_processes[harq_pid];
+ if (dlsch0 != NULL){
+ dlsch0->subframe_tx[subframe] = 1;
- dlsch0->subframe_tx[subframe] = 1;
+ dlsch0->current_harq_pid = harq_pid;
+ dlsch0->harq_ids[subframe] = harq_pid;
+ }
- dlsch0->current_harq_pid = harq_pid;
- dlsch1->current_harq_pid = harq_pid;
- dlsch0->harq_ids[subframe] = harq_pid;
- dlsch1->harq_ids[subframe] = harq_pid;
- // printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe);
+ if (dlsch1_harq != NULL){
+ dlsch1->current_harq_pid = harq_pid;
+ dlsch1->harq_ids[subframe] = harq_pid;
+ }
- conv_rballoc(rah,
- rballoc,
- frame_parms->N_RB_DL,
- dlsch0_harq->rb_alloc);
+ if (dlsch0 != NULL ){
+ conv_rballoc(rah,
+ rballoc,
+ frame_parms->N_RB_DL,
+ dlsch0_harq->rb_alloc);
- dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0];
- dlsch0_harq->nb_rb = conv_nprb(rah,
- rballoc,
- frame_parms->N_RB_DL);
- dlsch1_harq->nb_rb = dlsch0_harq->nb_rb;
+ dlsch0_harq->nb_rb = conv_nprb(rah, rballoc, frame_parms->N_RB_DL);
- if (dlsch0_harq->nb_rb == 0)
- return(-1);
+ if (dlsch1 != NULL){
+ dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0];
+ dlsch1_harq->nb_rb = dlsch0_harq->nb_rb;
+ }
+ } else if ((dlsch0 == NULL ) && (dlsch1 != NULL )){
+ conv_rballoc(rah,
+ rballoc,
+ frame_parms->N_RB_DL,
+ dlsch1_harq->rb_alloc);
+
+ dlsch1_harq->nb_rb = conv_nprb(rah, rballoc, frame_parms->N_RB_DL);
+ }
+
+
+ /*if (dlsch0_harq->nb_rb == 0)
+ return(-1);*/
- dlsch0_harq->mcs = mcs1;
- dlsch1_harq->mcs = mcs2;
- dlsch0_harq->rvidx = rv1;
- dlsch1_harq->rvidx = rv2;
// assume both TBs are active
- dlsch0_harq->Nl = 1;
- dlsch1_harq->Nl = 1;
- dlsch0->active = 1;
- dlsch1->active = 1;
+ if (dlsch0_harq != NULL)
+ dlsch0_harq->Nl = 1;
+ if (dlsch1_harq != NULL)
+ dlsch1_harq->Nl = 1;
// check if either TB is disabled (see 36-213 V11.3 Section )
- if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) {
- dlsch0->active = 0;
- }
- if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) {
- dlsch1->active = 0;
- }
-
- if (frame_parms->nb_antennas_tx == 2) {
- if (dlsch1->active == 1) { // both TBs are active
- 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];
+ if (frame_parms->nb_antenna_ports_eNB == 2) {
+ if ((dlsch0 != NULL) && (dlsch1 != NULL)) { //two CW active
+ dlsch0_harq->dl_power_off = 1;
+ dlsch1_harq->dl_power_off = 1;
+ 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)][dlsch1_harq->nb_rb-1];
switch (tpmi) {
case 0:
- dlsch0_harq->mimo_mode = UNIFORM_PRECODING11;
- dlsch1_harq->mimo_mode = UNIFORM_PRECODING1m1;
- dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,0);
- dlsch1_harq->pmi_alloc = pmi_extend(frame_parms,1);
+ dlsch0_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODING1;
+ dlsch1_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODING1;
+ dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,0,1);
+ dlsch1_harq->pmi_alloc = pmi_extend(frame_parms,0,1);
break;
-
case 1:
- dlsch0_harq->mimo_mode = UNIFORM_PRECODING1j;
- dlsch1_harq->mimo_mode = UNIFORM_PRECODING1mj;
- dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,2);
- dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,3);
- break;
+ dlsch0_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODINGj;
+ dlsch1_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODINGj;
+ dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,1,1);
+ dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,1,1);
+ break;
case 2: // PUSCH precoding
dlsch0_harq->mimo_mode = DUALSTREAM_PUSCH_PRECODING;
- dlsch0_harq->pmi_alloc = DL_pmi_single;
+ dlsch0_harq->pmi_alloc = DL_pmi_single;
dlsch1_harq->mimo_mode = DUALSTREAM_PUSCH_PRECODING;
- dlsch1_harq->pmi_alloc = DL_pmi_single;
+ dlsch1_harq->pmi_alloc = DL_pmi_single;
break;
-
default:
break;
}
-
- 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)][dlsch1_harq->nb_rb-1];
- } else { // only one is active
+ } else if ((dlsch0 != NULL) && (dlsch1 == NULL)) { // only CW 0 active
+ dlsch0_harq->dl_power_off = 1;
+ dlsch0_harq->TBS= TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
switch (tpmi) {
case 0 :
dlsch0_harq->mimo_mode = ALAMOUTI;
break;
-
case 1:
dlsch0_harq->mimo_mode = UNIFORM_PRECODING11;
- dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,0);
+ dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,0,0);
break;
-
case 2:
dlsch0_harq->mimo_mode = UNIFORM_PRECODING1m1;
- dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,1);
+ dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,1,0);
break;
-
case 3:
dlsch0_harq->mimo_mode = UNIFORM_PRECODING1j;
- dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,2);
+ dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,2,0);
break;
-
case 4:
dlsch0_harq->mimo_mode = UNIFORM_PRECODING1mj;
- dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,3);
+ dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,3,0);
break;
-
case 5:
dlsch0_harq->mimo_mode = PUSCH_PRECODING0;
- dlsch0_harq->pmi_alloc = DL_pmi_single;
+ dlsch0_harq->pmi_alloc = DL_pmi_single;
break;
-
case 6:
dlsch0_harq->mimo_mode = PUSCH_PRECODING1;
- dlsch0_harq->pmi_alloc = DL_pmi_single;
+ dlsch0_harq->pmi_alloc = DL_pmi_single;
break;
}
+ } else if ((dlsch0 == NULL) && (dlsch1 != NULL)) {
+ dlsch1_harq->dl_power_off = 1;
+ dlsch1_harq->TBS= TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1];
+ switch (tpmi) {
+ case 0 :
+ dlsch1_harq->mimo_mode = ALAMOUTI;
+ break;
+ case 1:
+ dlsch1_harq->mimo_mode = UNIFORM_PRECODING11;
+ dlsch1_harq->pmi_alloc = pmi_extend(frame_parms,0,0);
+ break;
+ case 2:
+ dlsch1_harq->mimo_mode = UNIFORM_PRECODING1m1;
+ dlsch1_harq->pmi_alloc = pmi_extend(frame_parms,1,0);
+ break;
+ case 3:
+ dlsch1_harq->mimo_mode = UNIFORM_PRECODING1j;
+ dlsch1_harq->pmi_alloc = pmi_extend(frame_parms,2,0);
+ break;
+ case 4:
+ dlsch1_harq->mimo_mode = UNIFORM_PRECODING1mj;
+ dlsch1_harq->pmi_alloc = pmi_extend(frame_parms,3,0);
+ break;
+ case 5:
+ dlsch1_harq->mimo_mode = PUSCH_PRECODING0;
+ dlsch1_harq->pmi_alloc = DL_pmi_single;
+ break;
+ case 6:
+ dlsch1_harq->mimo_mode = PUSCH_PRECODING1;
+ dlsch1_harq->pmi_alloc = DL_pmi_single;
+ break;
+ }
+ }
- dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
- }
- } else if (frame_parms->nb_antennas_tx == 4) {
+ } else if (frame_parms->nb_antenna_ports_eNB == 4) {
// fill in later
}
// reset HARQ process if this is the first transmission
- if (dlsch0_harq->round == 0)
+ /* if (dlsch0_harq->round == 0)
dlsch0_harq->status = ACTIVE;
if (dlsch1_harq->round == 0)
- dlsch1_harq->status = ACTIVE;
-
- dlsch0->rnti = rnti;
- dlsch1->rnti = rnti;
-
- dlsch0_harq->dl_power_off = 0;
- dlsch1_harq->dl_power_off = 0;
+ dlsch1_harq->status = ACTIVE;*/
+ if (dlsch0_harq != NULL)
+ dlsch0->rnti = rnti;
+ if (dlsch1 != NULL)
+ dlsch1->rnti = rnti;
break;
@@ -1648,7 +1745,7 @@ int generate_eNB_dlsch_params_from_dci(int frame,
switch (frame_parms->N_RB_DL) {
case 6:
- if (frame_parms->nb_antennas_tx == 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;
@@ -1666,7 +1763,7 @@ int generate_eNB_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 == 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;
@@ -1687,13 +1784,13 @@ int generate_eNB_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);
+ 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 == 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;
@@ -1713,7 +1810,7 @@ int generate_eNB_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 == 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;
@@ -1736,13 +1833,13 @@ int generate_eNB_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);
+ 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 == 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;
@@ -1762,7 +1859,7 @@ int generate_eNB_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 == 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;
@@ -1785,13 +1882,13 @@ int generate_eNB_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);
+ 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 == 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;
@@ -1811,7 +1908,7 @@ int generate_eNB_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 == 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;
@@ -1834,7 +1931,7 @@ int generate_eNB_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);
+ 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;
@@ -1849,6 +1946,7 @@ int generate_eNB_dlsch_params_from_dci(int frame,
// Flip the TB to codeword mapping as described in 5.3.3.1.5 of 36-212 V11.3.0
// note that we must set tbswap=0 in eNB scheduler if one TB is deactivated
+ // This must be set as in TM4, does not work properly now.
if (tbswap == 0) {
dlsch0 = dlsch[0];
dlsch1 = dlsch[1];
@@ -1904,15 +2002,16 @@ int generate_eNB_dlsch_params_from_dci(int frame,
dlsch1->active = 0;
}
- dlsch0_harq->dl_power_off = 0;
- dlsch1_harq->dl_power_off = 0;
+ // dlsch0_harq->dl_power_off = 0;
+ // dlsch1_harq->dl_power_off = 0;
- if (frame_parms->nb_antennas_tx == 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];
if ((dlsch0->active==1) && (dlsch1->active==1)) {
+
dlsch0_harq->mimo_mode = LARGE_CDD;
dlsch1_harq->mimo_mode = LARGE_CDD;
dlsch0_harq->dl_power_off = 1;
@@ -1921,7 +2020,7 @@ int generate_eNB_dlsch_params_from_dci(int frame,
dlsch0_harq->mimo_mode = ALAMOUTI;
dlsch1_harq->mimo_mode = ALAMOUTI;
}
- } else if (frame_parms->nb_antennas_tx == 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
@@ -2004,7 +2103,7 @@ int generate_eNB_dlsch_params_from_dci(int frame,
}
}
} else {
- LOG_E(PHY,"Illegal number of antennas for eNB %d\n",frame_parms->nb_antennas_tx);
+ LOG_E(PHY,"Illegal number of antennas for eNB %d\n",frame_parms->nb_antenna_ports_eNB);
}
// reset HARQ process if this is the first transmission
@@ -2133,16 +2232,21 @@ int generate_eNB_dlsch_params_from_dci(int frame,
dlsch0_harq = dlsch0->harq_processes[harq_pid];
dlsch1_harq = dlsch1->harq_processes[harq_pid];
+ // Needs to be checked
+ dlsch0_harq->codeword=0;
+ dlsch1_harq->codeword=1;
+
conv_rballoc(rah,
rballoc,
frame_parms->N_RB_DL,
dlsch0_harq->rb_alloc);
- dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0];
- dlsch0_harq->nb_rb = conv_nprb(rah,
- rballoc,
- frame_parms->N_RB_DL);
- dlsch1_harq->nb_rb = dlsch0_harq->nb_rb;
+ dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0];
+
+ dlsch0_harq->nb_rb = conv_nprb(rah,
+ rballoc,
+ frame_parms->N_RB_DL);
+ dlsch1_harq->nb_rb = dlsch0_harq->nb_rb;
dlsch0_harq->mcs = mcs1;
dlsch1_harq->mcs = mcs2;
@@ -2293,6 +2397,10 @@ int generate_eNB_dlsch_params_from_dci(int frame,
dlsch0_harq = dlsch0->harq_processes[harq_pid];
dlsch1_harq = dlsch1->harq_processes[harq_pid];
+ // Needs to be checked
+ dlsch0_harq->codeword=0;
+ dlsch1_harq->codeword=1;
+
conv_rballoc(rah,
rballoc,
frame_parms->N_RB_DL,
@@ -2336,14 +2444,14 @@ int generate_eNB_dlsch_params_from_dci(int frame,
}
// check TPMI information to compute TBS
- if (frame_parms->nb_antennas_tx == 2) {
+ if (frame_parms->nb_antenna_ports_eNB == 2) {
if (dlsch1->active == 1) { // both TBs are active
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];
} else {
dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
}
- } else if (frame_parms->nb_antennas_tx == 4) {
+ } else if (frame_parms->nb_antenna_ports_eNB == 4) {
}
@@ -2465,6 +2573,10 @@ int generate_eNB_dlsch_params_from_dci(int frame,
dlsch0_harq = dlsch0->harq_processes[harq_pid];
dlsch1_harq = dlsch1->harq_processes[harq_pid];
+ // Needs to be checked
+ dlsch0_harq->codeword=0;
+ dlsch1_harq->codeword=1;
+
conv_rballoc(rah,
rballoc,
frame_parms->N_RB_DL,
@@ -2546,6 +2658,8 @@ int generate_eNB_dlsch_params_from_dci(int frame,
//dlsch1->harq_ids[subframe] = harq_pid;
// printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe);
dlsch0_harq = dlsch0->harq_processes[harq_pid];
+ // Needs to be checked
+ dlsch0_harq->codeword=0;
conv_rballoc(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah,
((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc,frame_parms->N_RB_DL,
@@ -2586,27 +2700,30 @@ int generate_eNB_dlsch_params_from_dci(int frame,
case 1:
dlsch0_harq->mimo_mode = UNIFORM_PRECODING11;
- dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,0);
+ dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,0, 0);
+
break;
case 2:
dlsch0_harq->mimo_mode = UNIFORM_PRECODING1m1;
- dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,1);
+ dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,1, 0);
+
break;
case 3:
dlsch0_harq->mimo_mode = UNIFORM_PRECODING1j;
- dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,2);
+ dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,2, 0);
+
break;
case 4:
dlsch0_harq->mimo_mode = UNIFORM_PRECODING1mj;
- dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,3);
+ dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,3, 0);
break;
case 5:
dlsch0_harq->mimo_mode = PUSCH_PRECODING0;
- dlsch0_harq->pmi_alloc = DL_pmi_single;
+ dlsch0_harq->pmi_alloc = DL_pmi_single;
break;
case 6:
@@ -2652,7 +2769,7 @@ int generate_eNB_dlsch_params_from_dci(int frame,
break;
}
-
+
if (dlsch0_harq) {
dlsch0_harq->frame = frame;
dlsch0_harq->subframe = subframe;
@@ -2678,12 +2795,33 @@ int generate_eNB_dlsch_params_from_dci(int frame,
printf("dlsch0 eNB: mimo_mode %d\n",dlsch0_harq->mimo_mode);
}
+ if (dlsch1) {
+ printf("dlsch1 eNB: dlsch1 %p\n",dlsch1);
+ printf("dlsch1 eNB: rnti %x\n",dlsch1->rnti);
+ printf("dlsch1 eNB: NBRB %d\n",dlsch1_harq->nb_rb);
+ printf("dlsch1 eNB: rballoc %x\n",dlsch1_harq->rb_alloc[0]);
+ printf("dlsch1 eNB: harq_pid %d\n",harq_pid);
+ printf("dlsch1 eNB: round %d\n",dlsch1_harq->round);
+ printf("dlsch1 eNB: rvidx %d\n",dlsch1_harq->rvidx);
+ printf("dlsch1 eNB: TBS %d (NPRB %d)\n",dlsch1_harq->TBS,NPRB);
+ printf("dlsch1 eNB: mcs %d\n",dlsch1_harq->mcs);
+ printf("dlsch1 eNB: tpmi %d\n",tpmi);
+ printf("dlsch1 eNB: mimo_mode %d\n",dlsch1_harq->mimo_mode);
+ }
+
#endif
// compute DL power control parameters
- computeRhoA_eNB(pdsch_config_dedicated, dlsch[0],dlsch0_harq->dl_power_off);
+ if (dlsch0 != NULL){
+ computeRhoA_eNB(pdsch_config_dedicated, dlsch[0],dlsch0_harq->dl_power_off, frame_parms->nb_antenna_ports_eNB);
computeRhoB_eNB(pdsch_config_dedicated,&(frame_parms->pdsch_config_common),frame_parms->nb_antenna_ports_eNB,dlsch[0],dlsch0_harq->dl_power_off);
+}
+ if (dlsch1 != NULL){
+ computeRhoA_eNB(pdsch_config_dedicated, dlsch[1],dlsch1_harq->dl_power_off, frame_parms->nb_antenna_ports_eNB);
+ computeRhoB_eNB(pdsch_config_dedicated,&(frame_parms->pdsch_config_common),frame_parms->nb_antenna_ports_eNB,dlsch[1],dlsch1_harq->dl_power_off);
+ }
+
return(0);
}
@@ -3074,45 +3212,45 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci)
case 6:
LOG_D(PHY,"DCI format1C (1.5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",
- ((DCI1C_1_5MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT6[conv_1C_RIV(((DCI1C_1_5MHz_t *)&dci->dci_pdu[0])->rballoc,6)]);
+ ((DCI1C_1_5MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT6[conv_1C_RIV(((DCI1C_1_5MHz_t *)&dci->dci_pdu[0])->rballoc,6)]);
LOG_D(PHY,"MCS %d\n",((DCI1C_1_5MHz_t *)&dci->dci_pdu[0])->mcs);
break;
-
+
case 25:
LOG_D(PHY,"DCI format1C (5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1C_5MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[conv_1C_RIV(((DCI1C_5MHz_t *)&dci->dci_pdu[0])->rballoc,25)]);
LOG_D(PHY,"MCS %d\n",((DCI1C_5MHz_t *)&dci->dci_pdu[0])->mcs);
break;
-
+
case 50:
LOG_D(PHY,"DCI format1C (10MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
LOG_D(PHY,"Ngap %d\n",((DCI1C_10MHz_t *)&dci->dci_pdu[0])->Ngap);
LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1C_10MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[conv_1C_RIV(((DCI1C_10MHz_t *)&dci->dci_pdu[0])->rballoc,50)]);
LOG_D(PHY,"MCS %d\n",((DCI1C_10MHz_t *)&dci->dci_pdu[0])->mcs);
break;
-
+
case 100:
LOG_D(PHY,"DCI format1C (20MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
LOG_D(PHY,"Ngap %d\n",((DCI1C_20MHz_t *)&dci->dci_pdu[0])->Ngap);
LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1C_20MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[conv_1C_RIV(((DCI1C_20MHz_t *)&dci->dci_pdu[0])->rballoc,100)]);
LOG_D(PHY,"MCS %d\n",((DCI1C_20MHz_t *)&dci->dci_pdu[0])->mcs);
break;
-
-
+
+
default:
LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
DevParam (frame_parms->N_RB_DL, 0, 0);
break;
}
-
+
break;
-
+
case format2:
if ((frame_parms->frame_type == TDD) &&
(frame_parms->tdd_config>0)) {
- if (frame_parms->nb_antennas_tx == 2) {
+ if (frame_parms->nb_antenna_ports_eNB == 2) {
switch(frame_parms->N_RB_DL) {
case 6:
LOG_D(PHY,"DCI format2 2 antennas (TDD 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
@@ -3195,7 +3333,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 == 4) {
+ } else if (frame_parms->nb_antenna_ports_eNB == 4) {
switch(frame_parms->N_RB_DL) {
case 6:
LOG_D(PHY,"DCI format2 2 antennas (TDD 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
@@ -3280,7 +3418,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 == 2) {
+ if (frame_parms->nb_antenna_ports_eNB == 2) {
switch(frame_parms->N_RB_DL) {
case 6:
LOG_D(PHY,"DCI format2 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, tpmi %d, TPC %d\n",
@@ -3300,7 +3438,9 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci)
break;
case 25:
- LOG_D(PHY,"DCI format2 2 antennas (FDD, 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n",
+
+ LOG_D(PHY,"DCI format2 2 antennas (FDD, 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, swap %d, TPMI %d, TPC %d\n",
+
dci->rnti,
((uint32_t*)&dci->dci_pdu)[0],
((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah,
@@ -3358,7 +3498,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 == 4) {
+ } else if (frame_parms->nb_antenna_ports_eNB == 4) {
switch(frame_parms->N_RB_DL) {
case 6:
@@ -3802,7 +3942,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci)
int generate_ue_dlsch_params_from_dci(int frame,
- uint8_t subframe,
+ uint8_t subframe,
void *dci_pdu,
uint16_t rnti,
DCI_format_t dci_format,
@@ -3822,6 +3962,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
uint8_t vrb_type=0;
uint8_t mcs=0,mcs1=0,mcs2=0;
uint8_t rv=0,rv1=0,rv2=0;
+ uint8_t TB0_active=0,TB1_active=0;
uint8_t ndi=0,ndi1=0,ndi2=0;
uint8_t rah=0;
uint8_t TPC=0;
@@ -3829,7 +3970,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
uint8_t Ngap;
uint8_t dai=0;
LTE_UE_DLSCH_t *dlsch0=NULL,*dlsch1=NULL;
- LTE_DL_UE_HARQ_t *dlsch0_harq,*dlsch1_harq;
+ LTE_DL_UE_HARQ_t *dlsch0_harq=NULL,*dlsch1_harq=NULL;
if (!dlsch[0]) return -1;
@@ -3862,6 +4003,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
break;
case format1A:
+ if (!dlsch[0]) return -1;
switch (frame_parms->N_RB_DL) {
case 6:
@@ -3899,17 +4041,20 @@ int generate_ue_dlsch_params_from_dci(int frame,
}
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
+
+
NPRB = RIV2nb_rb_LUT6[rballoc];
dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3];
+
}
if (vrb_type == LOCALIZED) {
- dlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT6[rballoc];
- dlsch0_harq->rb_alloc_odd[0] = localRIV2alloc_LUT6[rballoc];
+ dlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT6[rballoc];
+ dlsch0_harq->rb_alloc_odd[0] = localRIV2alloc_LUT6[rballoc];
}
else {
- dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_even_LUT6[rballoc];
- dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_odd_LUT6[rballoc];
+ dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_even_LUT6[rballoc];
+ dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_odd_LUT6[rballoc];
}
dlsch0_harq->vrb_type = vrb_type;
@@ -3960,12 +4105,12 @@ int generate_ue_dlsch_params_from_dci(int frame,
}
if (vrb_type == LOCALIZED) {
- dlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT25[rballoc];
- dlsch0_harq->rb_alloc_odd[0] = localRIV2alloc_LUT25[rballoc];
+ dlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT25[rballoc];
+ dlsch0_harq->rb_alloc_odd[0] = localRIV2alloc_LUT25[rballoc];
}
else {
- dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_even_LUT25[rballoc];
- dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_odd_LUT25[rballoc];
+ dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_even_LUT25[rballoc];
+ dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_odd_LUT25[rballoc];
}
dlsch0_harq->vrb_type = vrb_type;
dlsch0_harq->nb_rb = RIV2nb_rb_LUT25[rballoc];
@@ -4013,26 +4158,26 @@ int generate_ue_dlsch_params_from_dci(int frame,
}
if (vrb_type == LOCALIZED) {
- dlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT50_0[rballoc];
- dlsch0_harq->rb_alloc_even[1] = localRIV2alloc_LUT50_1[rballoc];
- dlsch0_harq->rb_alloc_odd[0] = localRIV2alloc_LUT50_0[rballoc];
- dlsch0_harq->rb_alloc_odd[1] = localRIV2alloc_LUT50_1[rballoc];
- // printf("rballoc: %08x.%08x\n",dlsch0_harq->rb_alloc_even[0],dlsch0_harq->rb_alloc_even[1]);
+ dlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT50_0[rballoc];
+ dlsch0_harq->rb_alloc_even[1] = localRIV2alloc_LUT50_1[rballoc];
+ dlsch0_harq->rb_alloc_odd[0] = localRIV2alloc_LUT50_0[rballoc];
+ dlsch0_harq->rb_alloc_odd[1] = localRIV2alloc_LUT50_1[rballoc];
+ // printf("rballoc: %08x.%08x\n",dlsch0_harq->rb_alloc_even[0],dlsch0_harq->rb_alloc_even[1]);
} else { // DISTRIBUTED
- if ((rballoc&(1<<10)) == 0) {
- rballoc = rballoc&(~(1<<10));
- dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT50_0[rballoc];
- dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT50_1[rballoc];
- dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap0_odd_LUT50_0[rballoc];
- dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap0_odd_LUT50_1[rballoc];
- }
- else {
- rballoc = rballoc&(~(1<<10));
- dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT50_0[rballoc];
- dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT50_1[rballoc];
- dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap0_odd_LUT50_0[rballoc];
- dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap0_odd_LUT50_1[rballoc];
- }
+ if ((rballoc&(1<<10)) == 0) {
+ rballoc = rballoc&(~(1<<10));
+ dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT50_0[rballoc];
+ dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT50_1[rballoc];
+ dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap0_odd_LUT50_0[rballoc];
+ dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap0_odd_LUT50_1[rballoc];
+ }
+ else {
+ rballoc = rballoc&(~(1<<10));
+ dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT50_0[rballoc];
+ dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT50_1[rballoc];
+ dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap0_odd_LUT50_0[rballoc];
+ dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap0_odd_LUT50_1[rballoc];
+ }
}
dlsch0_harq->vrb_type = vrb_type;
@@ -4080,37 +4225,37 @@ int generate_ue_dlsch_params_from_dci(int frame,
}
if (vrb_type == LOCALIZED) {
- dlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT50_0[rballoc];
- dlsch0_harq->rb_alloc_even[1] = localRIV2alloc_LUT50_1[rballoc];
- dlsch0_harq->rb_alloc_even[2] = localRIV2alloc_LUT100_2[rballoc];
- dlsch0_harq->rb_alloc_even[3] = localRIV2alloc_LUT100_3[rballoc];
- dlsch0_harq->rb_alloc_odd[0] = localRIV2alloc_LUT50_0[rballoc];
- dlsch0_harq->rb_alloc_odd[1] = localRIV2alloc_LUT50_1[rballoc];
- dlsch0_harq->rb_alloc_odd[2] = localRIV2alloc_LUT100_2[rballoc];
- dlsch0_harq->rb_alloc_odd[3] = localRIV2alloc_LUT100_3[rballoc];
+ dlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT50_0[rballoc];
+ dlsch0_harq->rb_alloc_even[1] = localRIV2alloc_LUT50_1[rballoc];
+ dlsch0_harq->rb_alloc_even[2] = localRIV2alloc_LUT100_2[rballoc];
+ dlsch0_harq->rb_alloc_even[3] = localRIV2alloc_LUT100_3[rballoc];
+ dlsch0_harq->rb_alloc_odd[0] = localRIV2alloc_LUT50_0[rballoc];
+ dlsch0_harq->rb_alloc_odd[1] = localRIV2alloc_LUT50_1[rballoc];
+ dlsch0_harq->rb_alloc_odd[2] = localRIV2alloc_LUT100_2[rballoc];
+ dlsch0_harq->rb_alloc_odd[3] = localRIV2alloc_LUT100_3[rballoc];
} else {
- if ((rballoc&(1<<10)) == 0) { //Gap 1
- rballoc = rballoc&(~(1<<12));
- dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT50_0[rballoc];
- dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT50_1[rballoc];
- dlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap0_even_LUT100_2[rballoc];
- dlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap0_even_LUT100_3[rballoc];
- dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap0_odd_LUT50_0[rballoc];
- dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap0_odd_LUT50_1[rballoc];
- dlsch0_harq->rb_alloc_odd[2] = distRIV2alloc_gap0_odd_LUT100_2[rballoc];
- dlsch0_harq->rb_alloc_odd[3] = distRIV2alloc_gap0_odd_LUT100_3[rballoc];
- }
- else { //Gap 2
- rballoc = rballoc&(~(1<<12));
- dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap1_even_LUT50_0[rballoc];
- dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap1_even_LUT50_1[rballoc];
- dlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap1_even_LUT100_2[rballoc];
- dlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap1_even_LUT100_3[rballoc];
- dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap1_odd_LUT50_0[rballoc];
- dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap1_odd_LUT50_1[rballoc];
- dlsch0_harq->rb_alloc_odd[2] = distRIV2alloc_gap1_odd_LUT100_2[rballoc];
- dlsch0_harq->rb_alloc_odd[3] = distRIV2alloc_gap1_odd_LUT100_3[rballoc];
- }
+ if ((rballoc&(1<<10)) == 0) { //Gap 1
+ rballoc = rballoc&(~(1<<12));
+ dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT50_0[rballoc];
+ dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT50_1[rballoc];
+ dlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap0_even_LUT100_2[rballoc];
+ dlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap0_even_LUT100_3[rballoc];
+ dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap0_odd_LUT50_0[rballoc];
+ dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap0_odd_LUT50_1[rballoc];
+ dlsch0_harq->rb_alloc_odd[2] = distRIV2alloc_gap0_odd_LUT100_2[rballoc];
+ dlsch0_harq->rb_alloc_odd[3] = distRIV2alloc_gap0_odd_LUT100_3[rballoc];
+ }
+ else { //Gap 2
+ rballoc = rballoc&(~(1<<12));
+ dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap1_even_LUT50_0[rballoc];
+ dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap1_even_LUT50_1[rballoc];
+ dlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap1_even_LUT100_2[rballoc];
+ dlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap1_even_LUT100_3[rballoc];
+ dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap1_odd_LUT50_0[rballoc];
+ dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap1_odd_LUT50_1[rballoc];
+ dlsch0_harq->rb_alloc_odd[2] = distRIV2alloc_gap1_odd_LUT100_2[rballoc];
+ dlsch0_harq->rb_alloc_odd[3] = distRIV2alloc_gap1_odd_LUT100_3[rballoc];
+ }
}
dlsch0_harq->vrb_type = vrb_type;
@@ -4150,7 +4295,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
// if ((dlsch0_harq->round == 4) || ( {
dlsch0_harq->round = 0;
dlsch0_harq->first_tx = 1;
- // }
+ // }
// if (dlsch0_harq->round == 0)
// ndi = 1-dlsch0_harq->DCINdi;
@@ -4165,9 +4310,23 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch0_harq->mimo_mode = frame_parms->mode1_flag == 1 ?SISO : ALAMOUTI;
dlsch0_harq->dl_power_off = 1; //no power offset
- dlsch[0]->active = 1; // fix no DLSCH decoding for downlink retransmission
- if ((ndi!=dlsch0_harq->DCINdi) || // DCI has been toggled or this is the first transmission
+ dlsch0_harq->codeword=0;
+
+ LOG_D(PHY,"UE (%x/%d): Subframe %d Format1A DCI: ndi %d, old_ndi %d (first tx %d) harq_status %d, round %d\n",
+ dlsch[0]->rnti,
+ harq_pid,
+ subframe,
+ ndi,
+ dlsch0_harq->DCINdi,
+ dlsch0_harq->first_tx,
+ dlsch0_harq->status,
+ dlsch0_harq->round);
+
+ dlsch[0]->active = 1;
+
+ if ((ndi!=dlsch0_harq->DCINdi)|| // DCI has been toggled or this is the first transmission
+
(dlsch0_harq->first_tx==1)) {
dlsch0_harq->round = 0;
@@ -4213,15 +4372,15 @@ int generate_ue_dlsch_params_from_dci(int frame,
// this a retransmission
if(dlsch0_harq->round)
{
- // compare old TBS to new TBS
- if((mcs<29) && (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;
- }
+ // compare old TBS to new TBS
+ if((mcs<29) && (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;
+ }
}
if(mcs<29)
@@ -4240,14 +4399,19 @@ int generate_ue_dlsch_params_from_dci(int frame,
}
dlsch[0]->rnti = rnti;
dlsch0 = dlsch[0];
+
+ if (dlsch0_harq->round == 0)
+ dlsch0_harq->status = ACTIVE;
+
//printf("Format 1A: harq_pid %d, nb_rb %d, round %d\n",harq_pid,dlsch0_harq->nb_rb,dlsch0_harq->round);
break;
case format1C:
+ if (!dlsch[0]) return -1;
harq_pid = 0;
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
-
+
switch (frame_parms->N_RB_DL) {
case 6:
mcs = ((DCI1C_1_5MHz_t *)dci_pdu)->mcs;
@@ -4267,8 +4431,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_odd_LUT25[rballoc];
RIV_max = RIV_max25;
- // printf("Format1C : %x : mcs %d, rballoc %d=>%d=>%x\n",((uint32_t*)dci_pdu)[0],
- // mcs,((DCI1C_5MHz_t *)dci_pdu)->rballoc,rballoc,dlsch0_harq->rb_alloc_even[0]);
+ // printf("Format1C : %x : mcs %d, rballoc %d=>%d=>%x\n",((uint32_t*)dci_pdu)[0],
+ // mcs,((DCI1C_5MHz_t *)dci_pdu)->rballoc,rballoc,dlsch0_harq->rb_alloc_even[0]);
break;
case 50:
@@ -4277,16 +4441,16 @@ int generate_ue_dlsch_params_from_dci(int frame,
Ngap = ((DCI1C_10MHz_t *)dci_pdu)->Ngap;
dlsch0_harq->nb_rb = RIV2nb_rb_LUT50[rballoc];
if (Ngap == 0) {
- dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT50_0[rballoc];
- dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap0_odd_LUT50_0[rballoc];
- dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT50_1[rballoc];
- dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap0_odd_LUT50_1[rballoc];
+ dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT50_0[rballoc];
+ dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap0_odd_LUT50_0[rballoc];
+ dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT50_1[rballoc];
+ dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap0_odd_LUT50_1[rballoc];
}
else {
- dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap1_even_LUT50_0[rballoc];
- dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap1_odd_LUT50_0[rballoc];
- dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap1_even_LUT50_1[rballoc];
- dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap1_odd_LUT50_1[rballoc];
+ dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap1_even_LUT50_0[rballoc];
+ dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap1_odd_LUT50_0[rballoc];
+ dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap1_even_LUT50_1[rballoc];
+ dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap1_odd_LUT50_1[rballoc];
}
RIV_max = RIV_max50;
@@ -4298,38 +4462,38 @@ int generate_ue_dlsch_params_from_dci(int frame,
Ngap = ((DCI1C_20MHz_t *)dci_pdu)->Ngap;
dlsch0_harq->nb_rb = RIV2nb_rb_LUT100[rballoc];
if (Ngap==0) {
- dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT100_0[rballoc];
- dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap0_odd_LUT100_0[rballoc];
- dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT100_1[rballoc];
- dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap0_odd_LUT100_1[rballoc];
- dlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap0_even_LUT100_2[rballoc];
- dlsch0_harq->rb_alloc_odd[2] = distRIV2alloc_gap0_odd_LUT100_2[rballoc];
- dlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap0_even_LUT100_3[rballoc];
- dlsch0_harq->rb_alloc_odd[3] = distRIV2alloc_gap0_odd_LUT100_3[rballoc];
+ dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT100_0[rballoc];
+ dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap0_odd_LUT100_0[rballoc];
+ dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT100_1[rballoc];
+ dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap0_odd_LUT100_1[rballoc];
+ dlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap0_even_LUT100_2[rballoc];
+ dlsch0_harq->rb_alloc_odd[2] = distRIV2alloc_gap0_odd_LUT100_2[rballoc];
+ dlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap0_even_LUT100_3[rballoc];
+ dlsch0_harq->rb_alloc_odd[3] = distRIV2alloc_gap0_odd_LUT100_3[rballoc];
}
else {
- dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap1_even_LUT100_0[rballoc];
- dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap1_odd_LUT100_0[rballoc];
- dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap1_even_LUT100_1[rballoc];
- dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap1_odd_LUT100_1[rballoc];
- dlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap1_even_LUT100_2[rballoc];
- dlsch0_harq->rb_alloc_odd[2] = distRIV2alloc_gap1_odd_LUT100_2[rballoc];
- dlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap1_even_LUT100_3[rballoc];
- dlsch0_harq->rb_alloc_odd[3] = distRIV2alloc_gap1_odd_LUT100_3[rballoc];
+ dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap1_even_LUT100_0[rballoc];
+ dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap1_odd_LUT100_0[rballoc];
+ dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap1_even_LUT100_1[rballoc];
+ dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap1_odd_LUT100_1[rballoc];
+ dlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap1_even_LUT100_2[rballoc];
+ dlsch0_harq->rb_alloc_odd[2] = distRIV2alloc_gap1_odd_LUT100_2[rballoc];
+ dlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap1_even_LUT100_3[rballoc];
+ dlsch0_harq->rb_alloc_odd[3] = distRIV2alloc_gap1_odd_LUT100_3[rballoc];
}
RIV_max = RIV_max100;
/*
- printf("Format1C : %x : mcs %d, rballoc %d=>%d=>(%08x.%08x.%08x.%08x), Ngap %d\n",((uint32_t*)dci_pdu)[0],
- mcs,((DCI1C_20MHz_t *)dci_pdu)->rballoc,rballoc,
- dlsch0_harq->rb_alloc_even[0],
- dlsch0_harq->rb_alloc_even[1],
- dlsch0_harq->rb_alloc_even[2],
- dlsch0_harq->rb_alloc_even[3],
- Ngap
- );
+ printf("Format1C : %x : mcs %d, rballoc %d=>%d=>(%08x.%08x.%08x.%08x), Ngap %d\n",((uint32_t*)dci_pdu)[0],
+ mcs,((DCI1C_20MHz_t *)dci_pdu)->rballoc,rballoc,
+ dlsch0_harq->rb_alloc_even[0],
+ dlsch0_harq->rb_alloc_even[1],
+ dlsch0_harq->rb_alloc_even[2],
+ dlsch0_harq->rb_alloc_even[3],
+ Ngap
+ );
*/
- break;
-
+ break;
+
default:
LOG_E(PHY,"Format 1C: Unknown N_RB_DL %d\n",frame_parms->N_RB_DL);
return(-1);
@@ -4346,10 +4510,10 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch[0]->current_harq_pid = harq_pid;
if (rnti==si_rnti) { // rule from Section 5.3.1 of 36.321
- if (((frame&1) == 0) && (subframe == 5))
- dlsch0_harq->rvidx = (((3*((frame>>1)&3))+1)>>1)&3; // SIB1
- else
- dlsch0_harq->rvidx = (((3*(subframe&3))+1)>>1)&3; // other SIBs
+ if (((frame&1) == 0) && (subframe == 5))
+ dlsch0_harq->rvidx = (((3*((frame>>1)&3))+1)>>1)&3; // SIB1
+ else
+ dlsch0_harq->rvidx = (((3*(subframe&3))+1)>>1)&3; // other SIBs
}
else if ((rnti==p_rnti) || (rnti==ra_rnti)) { // Section 7.1.7.3
dlsch0_harq->rvidx = 0;
@@ -4360,12 +4524,14 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch0_harq->mimo_mode = frame_parms->mode1_flag == 1 ?SISO : ALAMOUTI;
dlsch0_harq->dl_power_off = 1; //no power offset
+ dlsch0_harq->codeword=0;
+
LOG_D(PHY,"UE (%x/%d): Subframe %d Format1C DCI: harq_status %d, round %d\n",
- dlsch[0]->rnti,
- harq_pid,
- subframe,
- dlsch0_harq->status,
- dlsch0_harq->round);
+ dlsch[0]->rnti,
+ harq_pid,
+ subframe,
+ dlsch0_harq->status,
+ dlsch0_harq->round);
dlsch0_harq->mcs = mcs;
@@ -4377,6 +4543,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
break;
case format1:
+ if (!dlsch[0]) return -1;
switch (frame_parms->N_RB_DL) {
case 6:
@@ -4456,7 +4623,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
rah = ((DCI1_20MHz_FDD_t *)dci_pdu)->rah;
rballoc = ((DCI1_20MHz_FDD_t *)dci_pdu)->rballoc;
rv = ((DCI1_20MHz_FDD_t *)dci_pdu)->rv;
- TPC = ((DCI1_20MHz_FDD_t *)dci_pdu)->TPC;
+ TPC = ((DCI1_20MHz_FDD_t *)dci_pdu)->TPC;
ndi = ((DCI1_20MHz_FDD_t *)dci_pdu)->ndi;
harq_pid = ((DCI1_20MHz_FDD_t *)dci_pdu)->harq_pid;
}
@@ -4464,13 +4631,13 @@ int generate_ue_dlsch_params_from_dci(int frame,
break;
}
- dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
-
if (harq_pid>=8) {
LOG_E(PHY,"Format 1: harq_pid=%d >= 8\n", harq_pid);
return(-1);
}
+ dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
+
if((mcs>28) && (dlsch0_harq->round == 0) )
{
// DCI false detection
@@ -4483,7 +4650,6 @@ int generate_ue_dlsch_params_from_dci(int frame,
return(-1);
}
-
dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3];
dlsch[0]->current_harq_pid = harq_pid;
@@ -4519,14 +4685,16 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch0_harq->dl_power_off = 1; //no power offset
+ dlsch0_harq->codeword=0;
+
LOG_D(PHY,"UE (%x/%d): Subframe %d Format1 DCI: ndi %d, old_ndi %d (first tx %d) harq_status %d\n",dlsch[0]->rnti,harq_pid,subframe,ndi,dlsch0_harq->DCINdi,
+
dlsch0_harq->first_tx,dlsch0_harq->status);
if ((ndi!=dlsch0_harq->DCINdi)||
(dlsch0_harq->first_tx==1)) {
// printf("Rate: setting round to zero (ndi %d, DCINdi %d,first_tx %d)\n",ndi,dlsch0_harq->DCINdi,dlsch0_harq->first_tx);
dlsch0_harq->round=0;
- dlsch0_harq->status = ACTIVE;
dlsch0_harq->DCINdi = ndi;
dlsch[0]->harq_ack[subframe].send_harq_status = 1;
@@ -4536,34 +4704,39 @@ 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;
- }
+ // 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);
- else if (mcs<=31)
- dlsch0_harq->Qm = (mcs-28)<<1;
- else
- LOG_E(PHY,"invalid mcs %d\n",mcs);
// printf("test: MCS %d, NPRB %d, TBS %d\n",mcs,NPRB,dlsch0_harq->TBS);
- dlsch[0]->current_harq_pid = harq_pid;
dlsch[0]->active = 1;
+ if (dlsch0_harq->round == 0) {
+ dlsch0_harq->status = ACTIVE;
+ // printf("Setting DLSCH process %d to ACTIVE\n",harq_pid);
+ // MCS and TBS don't change across HARQ rounds
+ dlsch0_harq->mcs = mcs;
+ dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][NPRB-1];
+
+ if (mcs <= 28)
+ dlsch0_harq->Qm = get_Qm(mcs);
+ else if (mcs<=31)
+ dlsch0_harq->Qm = (mcs-28)<<1;
+ else
+ LOG_E(PHY,"invalid mcs %d\n",mcs);
+ }
+
dlsch[0]->rnti = rnti;
if (beamforming_mode == 0)
@@ -4572,7 +4745,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch0_harq->mimo_mode = TM7;
else
LOG_E(PHY,"Not supported beamforming mode %d\n",beamforming_mode);
-
+
dlsch0 = dlsch[0];
@@ -4583,200 +4756,246 @@ int generate_ue_dlsch_params_from_dci(int frame,
case 6:
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;
- rballoc = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->rballoc;
- rv1 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->tpmi;
- } else {
- mcs1 = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->rballoc;
- rv1 = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->harq_pid;
- 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_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;
- rballoc = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->rballoc;
- rv1 = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->tpmi;
- } else {
- mcs1 = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->rballoc;
- rv1 = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->tb_swap;
- 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_antenna_ports_eNB);
+ if (frame_type == TDD) {
+ mcs1 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->mcs1;
+ mcs2 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->mcs2;
+ rballoc = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->rballoc;
+ rv1 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->rv1;
+ rv2 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->rv2;
+ ndi1 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->ndi1;
+ ndi2 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->ndi2;
+ harq_pid = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->harq_pid;
+ tbswap = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->tb_swap;
+ tpmi = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->tpmi;
+ }
+ else {
+ mcs1 = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->mcs1;
+ mcs2 = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->mcs2;
+ rballoc = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->rballoc;
+ rv1 = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->rv1;
+ rv2 = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->rv2;
+ ndi1 = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->ndi1;
+ ndi2 = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->ndi2;
+ harq_pid = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->harq_pid;
+ 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_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;
+ rballoc = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->rballoc;
+ rv1 = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->rv1;
+ rv2 = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->rv2;
+ ndi1 = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->ndi1;
+ ndi2 = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->ndi2;
+ harq_pid = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->harq_pid;
+ tbswap = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->tb_swap;
+ tpmi = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->tpmi;
+ }
+ else {
+ mcs1 = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->mcs1;
+ mcs2 = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->mcs2;
+ rballoc = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->rballoc;
+ rv1 = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->rv1;
+ rv2 = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->rv2;
+ ndi1 = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->ndi1;
+ ndi2 = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->ndi2;
+ harq_pid = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->harq_pid;
+ tbswap = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->tb_swap;
+ 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_antenna_ports_eNB);
+
}
break;
case 25:
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;
- rballoc = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tpmi;
- } else {
- mcs1 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tpmi;
- }
- } 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;
- rballoc = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->tpmi;
- } else {
- mcs1 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->tb_swap;
- 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_antenna_ports_eNB);
+ if (frame_type == TDD) {
+ mcs1 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs1;
+ mcs2 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs2;
+ rballoc = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rballoc;
+ rah = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rah;
+ rv1 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rv1;
+ rv2 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rv2;
+ ndi1 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->ndi1;
+ ndi2 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->ndi2;
+ harq_pid = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->harq_pid;
+ tbswap = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tb_swap;
+ tpmi = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tpmi;
+ }
+ else {
+ mcs1 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->mcs1;
+ mcs2 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->mcs2;
+ rballoc = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rballoc;
+ rah = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rah;
+ rv1 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rv1;
+ rv2 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rv2;
+ ndi1 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->ndi1;
+ ndi2 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->ndi2;
+ harq_pid = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->harq_pid;
+ tbswap = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tb_swap;
+ tpmi = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tpmi;
+ }
+ }
+ 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;
+ rballoc = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rballoc;
+ rah = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rah;
+ rv1 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rv1;
+ rv2 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rv2;
+ ndi1 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->ndi1;
+ ndi2 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->ndi2;
+ harq_pid = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->harq_pid;
+ tbswap = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->tb_swap;
+ tpmi = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->tpmi;
+ }
+ else {
+ mcs1 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->mcs1;
+ mcs2 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->mcs2;
+ rballoc = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rballoc;
+ rah = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rah;
+ rv1 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rv1;
+ rv2 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rv2;
+ ndi1 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->ndi1;
+ ndi2 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->ndi2;
+ harq_pid = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->harq_pid;
+ tbswap = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->tb_swap;
+ tpmi = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->tpmi;
+ }
}
break;
case 50:
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;
- rballoc = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->tpmi;
- } else {
- mcs1 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->tpmi;
- }
- } 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;
- rballoc = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->tpmi;
- } else {
- mcs1 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->tb_swap;
- 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_antenna_ports_eNB);
+ if (frame_type == TDD) {
+ mcs1 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->mcs1;
+ mcs2 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->mcs2;
+ rballoc = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rballoc;
+ rah = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rah;
+ rv1 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rv1;
+ rv2 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rv2;
+ ndi1 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->ndi1;
+ ndi2 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->ndi2;
+ harq_pid = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->harq_pid;
+ tbswap = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->tb_swap;
+ tpmi = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->tpmi;
+ }
+ else {
+ mcs1 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->mcs1;
+ mcs2 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->mcs2;
+ rballoc = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rballoc;
+ rah = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rah;
+ rv1 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rv1;
+ rv2 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rv2;
+ ndi1 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->ndi1;
+ ndi2 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->ndi2;
+ harq_pid = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->harq_pid;
+ tbswap = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->tb_swap;
+ tpmi = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->tpmi;
+ }
+ }
+ 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;
+ rballoc = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rballoc;
+ rah = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rah;
+ rv1 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rv1;
+ rv2 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rv2;
+ ndi1 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->ndi1;
+ ndi2 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->ndi2;
+ harq_pid = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->harq_pid;
+ tbswap = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->tb_swap;
+ tpmi = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->tpmi;
+ }
+ else {
+ mcs1 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->mcs1;
+ mcs2 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->mcs2;
+ rballoc = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rballoc;
+ rah = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rah;
+ rv1 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rv1;
+ rv2 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rv2;
+ ndi1 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->ndi1;
+ ndi2 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->ndi2;
+ harq_pid = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->harq_pid;
+ tbswap = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->tb_swap;
+ tpmi = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->tpmi;
+ }
+ }
+ else {
+ LOG_E(PHY,"UE: Format2 DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antenna_ports_eNB);
}
break;
case 100:
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;
- rballoc = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->tpmi;
- } else {
- mcs1 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->tpmi;
- }
- } 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;
- rballoc = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->tb_swap;
- tpmi = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->tpmi;
- } else {
- mcs1 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->mcs1;
- mcs2 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->mcs2;
- rballoc = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rballoc;
- rah = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rah;
- rv1 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rv1;
- rv2 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rv2;
- harq_pid = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->harq_pid;
- tbswap = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->tb_swap;
- 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_antenna_ports_eNB);
+ if (frame_type == TDD) {
+ mcs1 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->mcs1;
+ mcs2 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->mcs2;
+ rballoc = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rballoc;
+ rah = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rah;
+ rv1 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rv1;
+ rv2 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rv2;
+ ndi1 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->ndi1;
+ ndi2 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->ndi2;
+ harq_pid = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->harq_pid;
+ tbswap = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->tb_swap;
+ tpmi = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->tpmi;
+ }
+ else {
+ mcs1 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->mcs1;
+ mcs2 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->mcs2;
+ rballoc = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rballoc;
+ rah = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rah;
+ rv1 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rv1;
+ rv2 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rv2;
+ ndi1 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->ndi1;
+ ndi2 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->ndi2;
+ harq_pid = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->harq_pid;
+ tbswap = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->tb_swap;
+ tpmi = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->tpmi;
+ }
+ }
+ 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;
+ rballoc = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rballoc;
+ rah = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rah;
+ rv1 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rv1;
+ rv2 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rv2;
+ ndi1 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->ndi1;
+ ndi2 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->ndi2;
+ harq_pid = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->harq_pid;
+ tbswap = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->tb_swap;
+ tpmi = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->tpmi;
+ }
+ else {
+ mcs1 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->mcs1;
+ mcs2 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->mcs2;
+ rballoc = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rballoc;
+ rah = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rah;
+ rv1 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rv1;
+ rv2 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rv2;
+ ndi1 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->ndi1;
+ ndi2 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->ndi2;
+ harq_pid = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->harq_pid;
+ tbswap = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->tb_swap;
+ tpmi = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->tpmi;
+ }
+ }
+ else {
+ LOG_E(PHY,"UE: Format2 DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antenna_ports_eNB);
}
break;
@@ -4787,183 +5006,375 @@ int generate_ue_dlsch_params_from_dci(int frame,
return(-1);
}
-
- dlsch[0]->current_harq_pid = harq_pid;
- dlsch[0]->harq_ack[subframe].harq_id = harq_pid;
-
- tbswap = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tb_swap;
-
- if (tbswap == 0) {
- dlsch0 = dlsch[0];
- dlsch1 = dlsch[1];
- } else {
- dlsch0 = dlsch[1];
- dlsch1 = dlsch[0];
- }
-
- dlsch0_harq = dlsch0->harq_processes[harq_pid];
- dlsch1_harq = dlsch1->harq_processes[harq_pid];
- conv_rballoc(rah,
- rballoc,
- frame_parms->N_RB_DL,
- dlsch0_harq->rb_alloc_even);
-
- dlsch0_harq->rb_alloc_odd[0]= dlsch0_harq->rb_alloc_even[0];
- dlsch0_harq->rb_alloc_odd[1]= dlsch0_harq->rb_alloc_even[1];
- dlsch0_harq->rb_alloc_odd[2]= dlsch0_harq->rb_alloc_even[2];
- dlsch0_harq->rb_alloc_odd[3]= dlsch0_harq->rb_alloc_even[3];
-
- dlsch1_harq->rb_alloc_even[0] = dlsch0_harq->rb_alloc_even[0];
- dlsch1_harq->rb_alloc_even[1] = dlsch0_harq->rb_alloc_even[1];
- dlsch1_harq->rb_alloc_even[2] = dlsch0_harq->rb_alloc_even[2];
- dlsch1_harq->rb_alloc_even[3] = dlsch0_harq->rb_alloc_even[3];
- dlsch1_harq->rb_alloc_odd[0] = dlsch0_harq->rb_alloc_odd[0];
- dlsch1_harq->rb_alloc_odd[1] = dlsch0_harq->rb_alloc_odd[1];
- dlsch1_harq->rb_alloc_odd[2] = dlsch0_harq->rb_alloc_odd[2];
- dlsch1_harq->rb_alloc_odd[3] = dlsch0_harq->rb_alloc_odd[3];
-
- dlsch0_harq->nb_rb = conv_nprb(rah,
- rballoc,
- frame_parms->N_RB_DL);
- dlsch1_harq->nb_rb = dlsch0_harq->nb_rb;
-
- dlsch0_harq->mcs = mcs1;
-
- dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3];
- /*
- if (dlsch0_harq->mcs>20) {
- printf("dci_tools.c: mcs > 20 disabled for now (asked %d)\n",dlsch0_harq->mcs);
- return(-1);
- }
- */
-
- dlsch1_harq->mcs = mcs2;
- dlsch0_harq->rvidx = rv1;
- dlsch1_harq->rvidx = rv2;
-
// check if either TB is disabled (see 36-213 V8.6 p. 26)
+ TB0_active = 1;
+ TB1_active = 1;
- if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) {
- dlsch0_harq->status = DISABLED;
+ if ((rv1 == 1) && (mcs1 == 0)) {
+ TB0_active=0;
}
-
- if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) {
- dlsch1_harq->status = DISABLED;
+ if ((rv2 == 1) && (mcs2 == 0)) {
+ TB1_active=0;
}
+#ifdef DEBUG_HARQ
+ printf("[DCI UE]: TB0 status %d , TB1 status %d\n", TB0_active, TB1_active);
+#endif
- dlsch0_harq->Nl = 1;
+ //printf("RV TB0 = %d\n", rv1);
- // dlsch0->layer_index = tbswap;
- // dlsch1->layer_index = 1-tbswap;
- switch (tpmi) {
- case 0 :
- dlsch0_harq->mimo_mode = ALAMOUTI;
- break;
-
- case 1:
- dlsch0_harq->mimo_mode = UNIFORM_PRECODING11;
- dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,0);
- break;
-
- case 2:
- dlsch0_harq->mimo_mode = UNIFORM_PRECODING1m1;
- dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,1);
- break;
-
- case 3:
- dlsch0_harq->mimo_mode = UNIFORM_PRECODING1j;
- dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,2);
- break;
-
- case 4:
- dlsch0_harq->mimo_mode = UNIFORM_PRECODING1mj;
- dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,3);
- break;
-
- case 5:
- dlsch0_harq->mimo_mode = PUSCH_PRECODING0;
- // pmi stored from ulsch allocation routine
- dlsch0_harq->pmi_alloc = dlsch0->pmi_alloc;
- //LOG_I(PHY,"XXX using PMI %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc));
- break;
-
- case 6:
- dlsch0_harq->mimo_mode = PUSCH_PRECODING1;
- LOG_E(PHY,"Unsupported TPMI\n");
- return(-1);
- break;
+ if (TB0_active && TB1_active && tbswap==0) { //dlsch0, dlsch0_harq are at the TB level
+ dlsch0=dlsch[0];
+ dlsch1=dlsch[1];
+ dlsch0->active = 1;
+ dlsch1->active = 1;
+ dlsch0_harq = dlsch0->harq_processes[harq_pid];
+ dlsch1_harq = dlsch1->harq_processes[harq_pid];
+ dlsch0_harq->mcs = mcs1;
+ dlsch1_harq->mcs = mcs2;
+ dlsch0_harq->rvidx = rv1;
+ dlsch1_harq->rvidx = rv2;
+ dlsch0_harq->status = ACTIVE;
+ dlsch1_harq->status = ACTIVE;
+ dlsch0_harq->codeword=0;
+ dlsch1_harq->codeword=1;
+#ifdef DEBUG_HARQ
+ printf("[DCI UE]: BOTH ACTIVE\n");
+#endif
+ }
+ else if (TB0_active && TB1_active && tbswap==1) {
+ dlsch0=dlsch[0];
+ dlsch1=dlsch[1];
+ dlsch0->active = 1;
+ dlsch1->active = 1;
+ dlsch0_harq = dlsch0->harq_processes[harq_pid];
+ dlsch1_harq = dlsch1->harq_processes[harq_pid];
+ dlsch0_harq->mcs = mcs1;
+ dlsch1_harq->mcs = mcs2;
+ dlsch0_harq->rvidx = rv1;
+ dlsch1_harq->rvidx = rv2;
+ dlsch0_harq->status = ACTIVE;
+ dlsch1_harq->status = ACTIVE;
+ dlsch0_harq->codeword=1;
+ dlsch1_harq->codeword=0;
+ }
+ else if (TB0_active && (TB1_active==0)) {
+ dlsch0=dlsch[0];
+ dlsch0->active = 1;
+ dlsch0_harq = dlsch0->harq_processes[harq_pid];
+ dlsch0_harq->mcs = mcs1;
+ dlsch0_harq->rvidx = rv1;
+ dlsch0_harq->status = ACTIVE;
+ dlsch0_harq->codeword = 0;
+ dlsch1=NULL;
+ dlsch1_harq = NULL;
+#ifdef DEBUG_HARQ
+ printf("[DCI UE]: TB1 is deactivated, retransmit TB0 transmit in TM6\n");
+#endif
+ }
+ else if ((TB0_active==0) && TB1_active) {
+ dlsch1=dlsch[1];
+ dlsch1->active = 1;
+ dlsch1_harq = dlsch1->harq_processes[harq_pid];
+ dlsch1_harq->mcs = mcs2;
+ dlsch1_harq->rvidx = rv2;
+ dlsch1_harq->status = ACTIVE;
+ dlsch1_harq->codeword = 0;
+ dlsch0=NULL;
+ dlsch0_harq = NULL;
+#ifdef DEBUG_HARQ
+ printf("[DCI UE]: TB0 is deactivated, retransmit TB1 transmit in TM6\n");
+#endif
}
- if (frame_parms->mode1_flag == 1)
+ if (dlsch0 != NULL){
+ dlsch0->current_harq_pid = harq_pid;
+ dlsch0->harq_ack[subframe].harq_id = harq_pid;
+ }
+
+ if (dlsch1 != NULL){
+ dlsch1->current_harq_pid = harq_pid;
+ dlsch1->harq_ack[subframe].harq_id = harq_pid;
+ }
+
+ if (dlsch0_harq != NULL){
+ conv_rballoc(rah,
+ rballoc,
+ frame_parms->N_RB_DL,
+ dlsch0_harq->rb_alloc_even);
+
+ dlsch0_harq->rb_alloc_odd[0]= dlsch0_harq->rb_alloc_even[0];
+ dlsch0_harq->rb_alloc_odd[1]= dlsch0_harq->rb_alloc_even[1];
+ dlsch0_harq->rb_alloc_odd[2]= dlsch0_harq->rb_alloc_even[2];
+ dlsch0_harq->rb_alloc_odd[3]= dlsch0_harq->rb_alloc_even[3];
+
+ if (dlsch1_harq != NULL){
+ dlsch1_harq->rb_alloc_even[0]= dlsch0_harq->rb_alloc_even[0];
+ dlsch1_harq->rb_alloc_even[1]= dlsch0_harq->rb_alloc_even[1];
+ dlsch1_harq->rb_alloc_even[2]= dlsch0_harq->rb_alloc_even[2];
+ dlsch1_harq->rb_alloc_even[3]= dlsch0_harq->rb_alloc_even[3];
+ dlsch1_harq->rb_alloc_odd[0] = dlsch0_harq->rb_alloc_odd[0];
+ dlsch1_harq->rb_alloc_odd[1] = dlsch0_harq->rb_alloc_odd[1];
+ dlsch1_harq->rb_alloc_odd[2] = dlsch0_harq->rb_alloc_odd[2];
+ dlsch1_harq->rb_alloc_odd[3] = dlsch0_harq->rb_alloc_odd[3];
+
+ dlsch1_harq->nb_rb = dlsch0_harq->nb_rb;
+ }
+
+ dlsch0_harq->nb_rb = conv_nprb(rah,
+ rballoc,
+ frame_parms->N_RB_DL);
+
+ } else if ((dlsch0_harq == NULL) && (dlsch1_harq != NULL)){
+
+ conv_rballoc(rah,
+ rballoc,
+ frame_parms->N_RB_DL,
+ dlsch1_harq->rb_alloc_even);
+
+ dlsch1_harq->rb_alloc_odd[0]= dlsch1_harq->rb_alloc_even[0];
+ dlsch1_harq->rb_alloc_odd[1]= dlsch1_harq->rb_alloc_even[1];
+ dlsch1_harq->rb_alloc_odd[2]= dlsch1_harq->rb_alloc_even[2];
+ dlsch1_harq->rb_alloc_odd[3]= dlsch1_harq->rb_alloc_even[3];
+ dlsch1_harq->nb_rb = conv_nprb(rah,
+ rballoc,
+ frame_parms->N_RB_DL);
+ }
+
+
+ if (dlsch0_harq != NULL) {
+ dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3];
+ }
+
+ if (dlsch1_harq != NULL) {
+ dlsch1_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3];
+ }
+
+ // assume one layer per codeword (2 antenna port case)
+ if (dlsch0_harq != NULL)
+ dlsch0_harq->Nl = 1;
+
+ if (dlsch1_harq != NULL)
+ dlsch1_harq->Nl = 1;
+#ifdef DEBUG_HARQ
+ printf ("[DCI UE] tpmi = %d\n", tpmi);
+#endif
+
+
+ if ((dlsch0 != NULL) && (dlsch1 != NULL)){ //two CW active
+ dlsch0_harq->dl_power_off = 1;
+ dlsch1_harq->dl_power_off = 1;
+ switch (tpmi) {
+ case 0:
+ dlsch0_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODING1;
+ dlsch1_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODING1;
+ dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,0, 1);
+ dlsch1_harq->pmi_alloc = pmi_extend(frame_parms,0, 1);
+ break;
+ case 1:
+ dlsch0_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODINGj;
+ dlsch1_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODINGj;
+ dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,1, 1);
+ dlsch1_harq->pmi_alloc = pmi_extend(frame_parms,1, 1);
+ break;
+ case 2: // PUSCH precoding
+ dlsch0_harq->mimo_mode = DUALSTREAM_PUSCH_PRECODING;
+ dlsch1_harq->mimo_mode = DUALSTREAM_PUSCH_PRECODING;
+ if (tbswap==0){
+ dlsch0_harq->pmi_alloc = dlsch0->pmi_alloc;
+ dlsch1_harq->pmi_alloc = dlsch0->pmi_alloc^0x1555;
+ } else {
+ dlsch1_harq->pmi_alloc = dlsch0->pmi_alloc;
+ dlsch0_harq->pmi_alloc = dlsch0->pmi_alloc^0x1555;
+ }
+ break;
+ default:
+ break;
+ }
+ } else if ((dlsch0 != NULL) && (dlsch1 == NULL)) { // only CW 0 active
+ dlsch0_harq->dl_power_off = 1;
+ switch (tpmi) {
+ case 0 :
+ dlsch0_harq->mimo_mode = ALAMOUTI;
+ break;
+ case 1:
+ dlsch0_harq->mimo_mode = UNIFORM_PRECODING11;
+ dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,0, 0);
+ break;
+ case 2:
+ dlsch0_harq->mimo_mode = UNIFORM_PRECODING1m1;
+ dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,1, 0);
+ break;
+ case 3:
+ dlsch0_harq->mimo_mode = UNIFORM_PRECODING1j;
+ dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,2, 0);
+ break;
+ case 4:
+ dlsch0_harq->mimo_mode = UNIFORM_PRECODING1mj;
+ dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,3, 0);
+ break;
+ case 5:
+ dlsch0_harq->mimo_mode = PUSCH_PRECODING0;
+ // pmi stored from ulsch allocation routine
+ // we need to extract the first column of precoding matrix (which was computed assuming rank==2)
+ dlsch0_harq->pmi_alloc = dlsch0->pmi_alloc;;//pmi_convert(frame_parms,dlsch0->pmi_alloc,0);
+ //LOG_I(PHY,"XXX using PMI %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc));
+#ifdef DEBUG_HARQ
+ printf ("[DCI UE] I am calling from the UE side pmi_alloc_new = %d\n", dlsch0->pmi_alloc);
+#endif
+ break;
+ case 6:
+ dlsch0_harq->mimo_mode = PUSCH_PRECODING1;
+ // we need to extract the second column of precoding matrix (which was computed assuming rank==2)
+ dlsch0_harq->pmi_alloc = dlsch0->pmi_alloc;;//pmi_convert(frame_parms,dlsch0->pmi_alloc,1);
+#ifdef DEBUG_HARQ
+ printf ("[DCI UE] I am calling from the UE side pmi_alloc_new = %d\n", dlsch0->pmi_alloc);
+#endif
+ break;
+#ifdef DEBUG_HARQ
+ printf("[DCI UE] harq0 MIMO mode = %d\n", dlsch0_harq->mimo_mode);
+#endif
+ }
+ } else {
+ dlsch1_harq->dl_power_off = 1;
+ switch (tpmi) {
+ case 0 :
+ dlsch1_harq->mimo_mode = ALAMOUTI;
+ break;
+ case 1:
+ dlsch1_harq->mimo_mode = UNIFORM_PRECODING11;
+ dlsch1_harq->pmi_alloc = pmi_extend(frame_parms,0, 0);
+ break;
+ case 2:
+ dlsch1_harq->mimo_mode = UNIFORM_PRECODING1m1;
+ dlsch1_harq->pmi_alloc = pmi_extend(frame_parms,1, 0);
+ break;
+ case 3:
+ dlsch1_harq->mimo_mode = UNIFORM_PRECODING1j;
+ dlsch1_harq->pmi_alloc = pmi_extend(frame_parms,2, 0);
+ break;
+ case 4:
+ dlsch1_harq->mimo_mode = UNIFORM_PRECODING1mj;
+ dlsch1_harq->pmi_alloc = pmi_extend(frame_parms,3, 0);
+ break;
+ case 5:
+ dlsch1_harq->mimo_mode = PUSCH_PRECODING0;
+ // pmi stored from ulsch allocation routine
+ dlsch1_harq->pmi_alloc = dlsch1->pmi_alloc;
+#ifdef DEBUG_HARQ
+ printf ("[DCI UE] I am calling from the UE side pmi_alloc_new = %d\n", dlsch1->pmi_alloc);
+#endif
+
+ //LOG_I(PHY,"XXX using PMI %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc));
+ break;
+ case 6:
+ dlsch1_harq->mimo_mode = PUSCH_PRECODING1;
+ dlsch1_harq->pmi_alloc = dlsch1->pmi_alloc;
+#ifdef DEBUG_HARQ
+ printf ("[DCI UE] I am calling from the UE side pmi_alloc_new = %d\n", dlsch1->pmi_alloc);
+#endif
+ return(-1);
+ break;
+ }
+#ifdef DEBUG_HARQ
+ printf("[DCI UE] harq1 MIMO mode = %d\n", dlsch1_harq->mimo_mode);
+#endif
+ }
+ //printf(" UE DCI harq0 MIMO mode = %d\n", dlsch0_harq->mimo_mode);
+ if ((frame_parms->mode1_flag == 1) && (dlsch0_harq != NULL))
dlsch0_harq->mimo_mode = SISO;
- if (ndi1!=dlsch0_harq->DCINdi) {
- dlsch0_harq->round = 0;
- dlsch0_harq->status = ACTIVE;
- dlsch0_harq->DCINdi = ndi1;
- } else if (dlsch0_harq->status == SCH_IDLE) { // we got an Ndi = 0 for a previously decoded process,
+
+ if (dlsch0 != NULL) {
+ if ((ndi1!=dlsch0_harq->DCINdi) || (dlsch0_harq->first_tx==1)) {
+ dlsch0_harq->round = 0;
+ dlsch0_harq->status = ACTIVE;
+ dlsch0_harq->DCINdi = ndi1;
+
+ if ( dlsch0_harq->first_tx==1) {
+ LOG_D(PHY,"Format 2 DCI First TX0: Clearing flag\n");
+ dlsch0_harq->first_tx = 0;
+ }
+ } else if (dlsch0_harq->status == SCH_IDLE) { // we got an Ndi = 0 for a previously decoded process,
+
// this happens if either another harq process in the same
// is NAK or an ACK was not received
- dlsch0->harq_ack[subframe].ack = 1;
- dlsch0->harq_ack[subframe].harq_id = harq_pid;
- dlsch0->harq_ack[subframe].send_harq_status = 1;
- dlsch0->active = 0;
- return(0);
+ dlsch0->harq_ack[subframe].ack = 1;
+ dlsch0->harq_ack[subframe].harq_id = harq_pid;
+ dlsch0->harq_ack[subframe].send_harq_status = 1;
+ dlsch0->active = 0;
+ }
}
- dlsch0_harq->mcs = mcs1;
+ if ((dlsch1 != NULL) && (dlsch1->active == 1 )) {
+ if ((ndi2!=dlsch1_harq->DCINdi) || (dlsch1_harq->first_tx==1)) {
+ dlsch1_harq->round = 0;
+ dlsch1_harq->status = ACTIVE;
+ dlsch1_harq->DCINdi = ndi2;
+ if (dlsch1_harq->first_tx==1) {
+ LOG_D(PHY,"Format 2 DCI First TX1: Clearing flag\n");
+ dlsch1_harq->first_tx = 0;
+ }
+ }
+ else if ((dlsch1 != NULL) && (dlsch1_harq->status == SCH_IDLE)) { // we got an Ndi = 0 for a previously decoded process,
+ // this happens if either another harq process in the same
+ // is NAK or an ACK was not received
- if (dlsch0_harq->nb_rb>1) {
- dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
- if (mcs1 <= 28)
- dlsch0_harq->Qm = get_Qm(mcs1);
- else if (mcs1<=31)
- dlsch0_harq->Qm = (mcs1-28)<<1;
- else
- LOG_E(PHY,"invalid mcs1 %d\n",mcs1);
-
- } else
- dlsch0_harq->TBS =0;
-
-
- /*
- if (dlsch0_harq->mcs > 18)
- printf("mcs %d, TBS %d\n",dlsch0_harq->mcs,dlsch0_harq->TBS);
- */
-
- if (dlsch1_harq->DCINdi != ndi2) {
- dlsch1_harq->round=0;
- dlsch1_harq->status = ACTIVE;
+ dlsch1->harq_ack[subframe].ack = 1;
+ dlsch1->harq_ack[subframe].harq_id = harq_pid;
+ dlsch1->harq_ack[subframe].send_harq_status = 1;
+ dlsch1->active = 0;
+ }
}
- dlsch1_harq->DCINdi = ndi2;
- dlsch1_harq->mcs = mcs2;
+ if (dlsch0 != NULL){
+ if (dlsch0_harq->nb_rb>1) {
+ dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
+ if (mcs1 <= 28)
+ dlsch0_harq->Qm = get_Qm(mcs1);
+ else if (mcs1<=31)
+ dlsch0_harq->Qm = (mcs1-28)<<1;
+ else
+ LOG_E(PHY,"invalid mcs1 %d\n",mcs1);
+ } else
+ dlsch0_harq->TBS =0;
- if (dlsch1_harq->nb_rb>1) {
- dlsch1_harq->TBS = TBStable[dlsch1_harq->mcs][dlsch1_harq->nb_rb-1];
- if (mcs2 <= 28)
- dlsch1_harq->Qm = get_Qm(mcs2);
- else if (mcs1<=31)
- dlsch1_harq->Qm = (mcs2-28)<<1;
- else
- LOG_E(PHY,"invalid mcs2 %d\n",mcs2);
- } else
- dlsch1_harq->TBS = 0;
+ dlsch0->rnti = rnti;
+ }
+ if (dlsch1 != NULL) {
+ if (dlsch1_harq->DCINdi != ndi2) {
+ dlsch1_harq->round=0;
+ dlsch1_harq->status = ACTIVE;
+ }
- dlsch0->rnti = rnti;
- dlsch1->rnti = rnti;
+ dlsch1_harq->DCINdi = ndi2;
- dlsch0_harq->dl_power_off = 0; //no power offset
- dlsch1_harq->dl_power_off = 0; //no power offset
+ if (dlsch1_harq->nb_rb>1) {
+ dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1];
+ if (mcs2 <= 28)
+ dlsch1_harq->Qm = get_Qm(mcs2);
+ else if (mcs1<=31)
+ dlsch1_harq->Qm = (mcs2-28)<<1;
+ else
+ LOG_E(PHY,"invalid mcs2 %d\n",mcs2);
+ } else
+ dlsch1_harq->TBS = 0;
- dlsch0->active = 1;
- dlsch1->active = 1;
+ dlsch1->rnti = rnti;
+ }
+#ifdef DEBUG_HARQ
+ if (dlsch0 != NULL && dlsch1 != NULL)
+ printf("[DCI UE] dlsch0_harq status = %d, dlsch1_harq status = %d\n", dlsch0_harq->status, dlsch1_harq->status);
+ else if (dlsch0 == NULL && dlsch1 != NULL)
+ printf("[DCI UE] dlsch0_harq NULL dlsch1_harq status = %d\n", dlsch1_harq->status);
+ else if (dlsch0 != NULL && dlsch1 == NULL)
+ printf("[DCI UE] dlsch1_harq NULL dlsch0_harq status = %d\n", dlsch0_harq->status);
+#endif
- break;
+ break;
case format2A:
@@ -5204,6 +5615,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
// Flip the TB to codeword mapping as described in 5.3.3.1.5 of 36-212 V11.3.0
// note that we must set tbswap=0 in eNB scheduler if one TB is deactivated
+ //Needs to be done in the same manner as TM$.
if (tbswap == 0) {
dlsch0 = dlsch[0];
dlsch1 = dlsch[1];
@@ -5214,24 +5626,27 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
dlsch1_harq = dlsch[1]->harq_processes[harq_pid];
+ // Needs to be checked
+ dlsch0_harq->codeword=0;
+ dlsch1_harq->codeword=1;
dlsch0->current_harq_pid = harq_pid;
dlsch1->current_harq_pid = harq_pid;
dlsch0->harq_ack[subframe].harq_id = harq_pid;
dlsch1->harq_ack[subframe].harq_id = harq_pid;
conv_rballoc(rah,rballoc,frame_parms->N_RB_DL,dlsch0_harq->rb_alloc_even);
- dlsch0_harq->rb_alloc_odd[0] = dlsch0_harq->rb_alloc_even[0];
- dlsch0_harq->rb_alloc_odd[1] = dlsch0_harq->rb_alloc_even[1];
- dlsch0_harq->rb_alloc_odd[2] = dlsch0_harq->rb_alloc_even[2];
- dlsch0_harq->rb_alloc_odd[3] = dlsch0_harq->rb_alloc_even[3];
- dlsch1_harq->rb_alloc_even[0] = dlsch0_harq->rb_alloc_even[0];
- dlsch1_harq->rb_alloc_even[1] = dlsch0_harq->rb_alloc_even[1];
- dlsch1_harq->rb_alloc_even[2] = dlsch0_harq->rb_alloc_even[2];
- dlsch1_harq->rb_alloc_even[3] = dlsch0_harq->rb_alloc_even[3];
- dlsch1_harq->rb_alloc_odd[0] = dlsch0_harq->rb_alloc_odd[0];
- dlsch1_harq->rb_alloc_odd[1] = dlsch0_harq->rb_alloc_odd[1];
- dlsch1_harq->rb_alloc_odd[2] = dlsch0_harq->rb_alloc_odd[2];
- dlsch1_harq->rb_alloc_odd[3] = dlsch0_harq->rb_alloc_odd[3];
+ dlsch0_harq->rb_alloc_odd[0]= dlsch0_harq->rb_alloc_even[0];
+ dlsch0_harq->rb_alloc_odd[1]= dlsch0_harq->rb_alloc_even[1];
+ dlsch0_harq->rb_alloc_odd[2]= dlsch0_harq->rb_alloc_even[2];
+ dlsch0_harq->rb_alloc_odd[3]= dlsch0_harq->rb_alloc_even[3];
+ dlsch1_harq->rb_alloc_even[0]= dlsch0_harq->rb_alloc_even[0];
+ dlsch1_harq->rb_alloc_even[1]= dlsch0_harq->rb_alloc_even[1];
+ dlsch1_harq->rb_alloc_even[2]= dlsch0_harq->rb_alloc_even[2];
+ dlsch1_harq->rb_alloc_even[3]= dlsch0_harq->rb_alloc_even[3];
+ dlsch1_harq->rb_alloc_odd[0]= dlsch0_harq->rb_alloc_odd[0];
+ dlsch1_harq->rb_alloc_odd[1]= dlsch0_harq->rb_alloc_odd[1];
+ dlsch1_harq->rb_alloc_odd[2]= dlsch0_harq->rb_alloc_odd[2];
+ dlsch1_harq->rb_alloc_odd[3]= dlsch0_harq->rb_alloc_odd[3];
dlsch0_harq->nb_rb = conv_nprb(rah,
rballoc,
@@ -5302,6 +5717,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch0->harq_ack[subframe].send_harq_status = 1;
dlsch0->active = 0;
// printf("Got NDI=0 for correctly decoded SDU (harq_pid %d) subframe %d\n",harq_pid,subframe);
+
}
}
@@ -5334,12 +5750,10 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch0_harq->nb_rb-1];
-
+
if ((dlsch0->active==1) && (dlsch1->active==1)) {
dlsch0_harq->mimo_mode = LARGE_CDD;
dlsch1_harq->mimo_mode = LARGE_CDD;
- dlsch0_harq->dl_power_off = 0; //apply power offset
- dlsch1_harq->dl_power_off = 0; //apply power offset
} else {
dlsch0_harq->mimo_mode = ALAMOUTI;
dlsch1_harq->mimo_mode = ALAMOUTI;
@@ -5350,8 +5764,6 @@ int generate_ue_dlsch_params_from_dci(int frame,
case 0: // one layer per transport block
dlsch0_harq->mimo_mode = LARGE_CDD;
dlsch1_harq->mimo_mode = LARGE_CDD;
- dlsch0_harq->dl_power_off = 0; //apply power offset
- dlsch1_harq->dl_power_off = 0; //apply power offset
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)][dlsch1_harq->nb_rb-1];
@@ -5360,8 +5772,6 @@ int generate_ue_dlsch_params_from_dci(int frame,
case 1: // one-layers on TB 0, two on TB 1
dlsch0_harq->mimo_mode = LARGE_CDD;
dlsch1_harq->mimo_mode = LARGE_CDD;
- dlsch0_harq->dl_power_off = 0; //apply power offset
- dlsch1_harq->dl_power_off = 0; //apply power offset
dlsch1_harq->Nl = 2;
dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1];
break;
@@ -5370,8 +5780,6 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch0_harq->mimo_mode = LARGE_CDD;
dlsch1_harq->mimo_mode = LARGE_CDD;
dlsch0_harq->Nl = 2;
- dlsch0_harq->dl_power_off = 0; //apply power offset
- dlsch1_harq->dl_power_off = 0; //apply power offset
if (frame_parms->N_RB_DL <= 56) {
dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][(dlsch0_harq->nb_rb<<1)-1];
@@ -5416,8 +5824,6 @@ int generate_ue_dlsch_params_from_dci(int frame,
case 1: // two-layers on TB 0
dlsch1_harq->mimo_mode = LARGE_CDD;
dlsch1_harq->Nl = 2;
- dlsch0_harq->dl_power_off = 1; //apply power offset
- dlsch1_harq->dl_power_off = 0; //apply power offset
dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1];
break;
@@ -5437,14 +5843,14 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch0_harq->Qm = (mcs1-28)<<1;
else
LOG_E(PHY,"invalid mcs1 %d\n",mcs1);
-
+
if (mcs2 <= 28)
dlsch1_harq->Qm = get_Qm(mcs2);
else if (mcs2<=31)
dlsch1_harq->Qm = (mcs2-28)<<1;
else
LOG_E(PHY,"invalid mcs2 %d\n",mcs2);
-
+
// printf("Format 2A: NPRB=%d (rballoc %x,mcs1 %d, mcs2 %d, frame_type %d N_RB_DL %d,active %d/%d)\n",NPRB,rballoc,mcs1,mcs2,frame_parms->frame_type,frame_parms->N_RB_DL,dlsch0->active,dlsch1->active);
//printf("UE (%x/%d): Subframe %d Format2A DCI: ndi1 %d, old_ndi1 %d, ndi2 %d, old_ndi2 %d (first tx1 %d, first tx2 %d) harq_status1 %d, harq_status2 %d\n",dlsch0->rnti,harq_pid,subframe,ndi,dlsch0_harq->DCINdi,
// dlsch0_harq->first_tx,dlsch1_harq->first_tx,dlsch0_harq->status,dlsch1_harq->status);
@@ -5454,6 +5860,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
break;
case format1E_2A_M10PRB:
+ if (!dlsch[0]) return -1;
harq_pid = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->harq_pid;
@@ -5479,10 +5886,12 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch0 = dlsch[0];
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
+ // Needs to be checked
+ dlsch0_harq->codeword=0;
conv_rballoc(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah,
((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc,frame_parms->N_RB_DL,
dlsch0_harq->rb_alloc_even);
-
+
dlsch0_harq->rb_alloc_odd[0] = dlsch0_harq->rb_alloc_even[0];
dlsch0_harq->rb_alloc_odd[1] = dlsch0_harq->rb_alloc_even[1];
dlsch0_harq->rb_alloc_odd[2] = dlsch0_harq->rb_alloc_even[2];
@@ -5540,28 +5949,29 @@ int generate_ue_dlsch_params_from_dci(int frame,
case 1:
dlsch0_harq->mimo_mode = UNIFORM_PRECODING11;
- dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,0);
+ dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,0,0);
break;
case 2:
dlsch0_harq->mimo_mode = UNIFORM_PRECODING1m1;
- dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,1);
+ dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,1, 0);
break;
case 3:
dlsch0_harq->mimo_mode = UNIFORM_PRECODING1j;
- dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,2);
+ dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,2, 0);
+
break;
case 4:
dlsch0_harq->mimo_mode = UNIFORM_PRECODING1mj;
- dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,3);
+ dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,3, 0);
break;
case 5:
dlsch0_harq->mimo_mode = PUSCH_PRECODING0;
// pmi stored from ulsch allocation routine
- dlsch0_harq->pmi_alloc = dlsch0->pmi_alloc;
+ dlsch0_harq->pmi_alloc = dlsch0->pmi_alloc;
//LOG_I(PHY,"XXX using PMI %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc));
break;
@@ -5638,6 +6048,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
}
#endif
+
#if T_TRACER
if( (dlsch[0]->rnti != si_rnti) && (dlsch[0]->rnti != ra_rnti) && (dlsch[0]->rnti != p_rnti))
{
@@ -5649,10 +6060,18 @@ int generate_ue_dlsch_params_from_dci(int frame,
}
#endif
- // 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_antenna_ports_eNB,dlsch[0],dlsch0_harq->dl_power_off);
+ // compute DL power control parameters
+ if (dlsch0_harq != NULL){
+ computeRhoA_UE(pdsch_config_dedicated, dlsch[0],dlsch0_harq->dl_power_off, frame_parms->nb_antenna_ports_eNB);
+ computeRhoB_UE(pdsch_config_dedicated,&(frame_parms->pdsch_config_common),frame_parms->nb_antenna_ports_eNB,dlsch[0],dlsch0_harq->dl_power_off);
+ }
+
+ if (dlsch1_harq != NULL) {
+ computeRhoA_UE(pdsch_config_dedicated, dlsch[1],dlsch1_harq->dl_power_off, frame_parms->nb_antenna_ports_eNB);
+ computeRhoB_UE(pdsch_config_dedicated,&(frame_parms->pdsch_config_common),frame_parms->nb_antenna_ports_eNB,dlsch[1],dlsch1_harq->dl_power_off);
+ }
+
return(0);
}
@@ -5818,14 +6237,79 @@ uint32_t pdcch_alloc2ul_frame(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame, ui
}
-uint16_t quantize_subband_pmi(PHY_MEASUREMENTS *meas,uint8_t eNB_id,int nb_subbands)
+int32_t pmi_convert_rank1_from_rank2(uint16_t pmi_alloc, int tpmi, int nb_rb)
+{
+ int nb_subbands = 0;
+ int32_t pmi_alloc_new = 0, pmi_new = 0, pmi_old = 0;
+ int i;
+
+ switch (nb_rb) {
+ case 6:
+ nb_subbands = 6;
+ break;
+ default:
+ case 25:
+ nb_subbands = 7;
+ break;
+ case 50:
+ nb_subbands = 9;
+ break;
+ case 100:
+ nb_subbands = 13;
+ break;
+ }
+
+ for (i = 0; i < nb_subbands; i++) {
+ pmi_old = (pmi_alloc >> i)&1;
+
+ if (pmi_old == 0)
+ if (tpmi == 5)
+ pmi_new = 0;
+ else
+ pmi_new = 1;
+ else
+ if (tpmi == 5)
+ pmi_new = 2;
+ else
+ pmi_new = 3;
+
+ pmi_alloc_new|=pmi_new<<(2*i);
+
+ }
+#ifdef DEBUG_HARQ
+printf(" [DCI UE] pmi_alloc_old %d, pmi_alloc_new %d pmi_old %d , pmi_new %d\n", pmi_alloc, pmi_alloc_new,pmi_old, pmi_new );
+#endif
+return(pmi_alloc_new);
+
+}
+
+uint16_t quantize_subband_pmi(PHY_MEASUREMENTS *meas,uint8_t eNB_id,int nb_rb)
{
int i, aarx;
uint16_t pmiq=0;
- uint16_t pmivect = 0;
+ uint32_t pmivect = 0;
uint8_t rank = meas->rank[eNB_id];
int pmi_re,pmi_im;
+ int nb_subbands=0;
+
+
+ switch (nb_rb) {
+ case 6:
+ nb_subbands = 6;
+ break;
+ default:
+ case 25:
+ nb_subbands = 7;
+ break;
+ case 50:
+ nb_subbands = 9;
+ break;
+ case 100:
+ nb_subbands = 13;
+ break;
+ }
+
for (i=0; i1 not supported!\n");
+ }
+
+ else if (rank==1) {
+ for (aarx=0; aarxnb_antennas_rx; aarx++) {
+ pmi_re += meas->subband_pmi_re[eNB_id][i][aarx];
+ //printf("meas->subband_pmi_re[eNB_id][i][%d]=%d\n", aarx, meas->subband_pmi_re[eNB_id][i][aarx]);
+ pmi_im += meas->subband_pmi_im[eNB_id][i][aarx];
+ //printf("meas->subband_pmi_im[eNB_id][i][%d]=%d\n",aarx, meas->subband_pmi_im[eNB_id][i][aarx]);
+ }
+ if (pmi_re >= pmi_im) // this is not orthogonal
+ // this is orthogonal
+ //if (((pmi_re >= pmi_im) && (pmi_re >= -pmi_im)) || ((pmi_re <= pmi_im) && (pmi_re >= -pmi_im)))
+ pmiq = PMI_2A_R1_11;
+ else
+ pmiq = PMI_2A_R1_1j;
+
+ // printf("subband %d, pmi_re %d, pmi_im %d, pmiq %d \n",i,pmi_re,pmi_im,pmiq);
+ // printf("subband %d, pmi%d \n",i,pmiq);
+ //According to Section 7.2.4 of 36.213
+
+ pmivect |= ((pmiq-1)<<(i)); //shift 1 since only one bit
+ }
+ else {
+ LOG_E(PHY,"PMI feedback for rank>1 not supported!\n");
pmivect = 0;
}
- }
+ }
+#ifdef DEBUG_HARQ
+ printf( "quantize_subband_pmi pmivect %d \n", pmivect);
+#endif
return(pmivect);
}
@@ -6296,14 +6804,32 @@ void reset_cba_uci(void *o)
((HLC_subband_cqi_mcs_CBA_5MHz *)o)->crnti = 0x0;
}
-uint32_t pmi_extend(LTE_DL_FRAME_PARMS *frame_parms,uint8_t wideband_pmi)
+
+uint32_t pmi_extend(LTE_DL_FRAME_PARMS *frame_parms,uint8_t wideband_pmi, uint8_t rank)
{
- uint8_t i,wideband_pmi2=wideband_pmi&3;
+ uint8_t i,wideband_pmi2;
uint32_t pmi_ex = 0;
- for (i=0; i<14; i+=2)
- pmi_ex|=(wideband_pmi2<N_RB_DL!=25) {
+ LOG_E(PHY,"pmi_extend not yet implemented for anything else than 25PRB\n");
+ return(-1);
+ }
+
+ if (rank==0) {
+ wideband_pmi2=wideband_pmi&3;
+ for (i=0; i<14; i+=2)
+ pmi_ex|=(wideband_pmi2<n_DMRS2 = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->cshift;
#ifdef DEBUG_DCI
+
printf("Format 0 DCI : ulsch (ue): AbsSubframe %d.%d\n",proc->frame_rx%1024,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);
@@ -7238,8 +7765,8 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
}
int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB,
- eNB_rxtx_proc_t *proc,
- void *dci_pdu,
+ eNB_rxtx_proc_t *proc,
+ void *dci_pdu,
uint16_t rnti,
DCI_format_t dci_format,
uint8_t UE_id,
@@ -7277,11 +7804,9 @@ int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB,
harq_pid = subframe2harq_pid(frame_parms,
pdcch_alloc2ul_frame(frame_parms,
- proc->frame_tx,
- subframe),
+ proc->frame_tx,
+ subframe),
pdcch_alloc2ul_subframe(frame_parms,subframe));
-
-
switch (frame_parms->N_RB_DL) {
case 6:
if (frame_parms->frame_type == TDD) {
diff --git a/openair1/PHY/LTE_TRANSPORT/defs.h b/openair1/PHY/LTE_TRANSPORT/defs.h
old mode 100644
new mode 100755
index 8e17697ff4..3b13c01c52
--- a/openair1/PHY/LTE_TRANSPORT/defs.h
+++ b/openair1/PHY/LTE_TRANSPORT/defs.h
@@ -79,11 +79,17 @@
#if !defined(C_RNTI)
#define C_RNTI (rnti_t)0x1234
#endif
-
-#define PMI_2A_11 0
+// These are the codebook indexes according to Table 6.3.4.2.3-1 of 36.211
+//1 layer
+#define PMI_2A_11 0
#define PMI_2A_1m1 1
-#define PMI_2A_1j 2
+#define PMI_2A_1j 2
#define PMI_2A_1mj 3
+//2 layers
+#define PMI_2A_R1_10 0
+#define PMI_2A_R1_11 1
+#define PMI_2A_R1_1j 2
+
typedef enum {
SCH_IDLE,
@@ -158,6 +164,8 @@ typedef struct {
uint8_t Nlayers;
/// First layer for this PSCH transmission
uint8_t first_layer;
+ /// codeword this transport block is mapped to
+ uint8_t codeword;
} LTE_DL_eNB_HARQ_t;
typedef struct {
@@ -584,6 +592,8 @@ typedef struct {
uint32_t trials[8];
/// error statistics per round
uint32_t errors[8];
+ /// codeword this transport block is mapped to
+ uint8_t codeword;
} LTE_DL_UE_HARQ_t;
typedef struct {
@@ -754,6 +764,13 @@ typedef enum {
PMCH
} PDSCH_t;
+typedef enum {
+ rx_standard=0,
+ rx_IC_single_stream,
+ rx_IC_dual_stream,
+ rx_SIC_dual_stream
+} RX_type_t;
+
typedef enum {
pucch_format1=0,
pucch_format1a,
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
index 8ec2a40d8d..b9f421204e 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
@@ -85,11 +85,11 @@ void free_eNB_dlsch(LTE_eNB_DLSCH_t *dlsch)
#endif
for (r=0; rharq_processes[i]->c[r]);
#endif
-
+
if (dlsch->harq_processes[i]->c[r]) {
free16(dlsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+768);
dlsch->harq_processes[i]->c[r] = NULL;
@@ -98,17 +98,17 @@ void free_eNB_dlsch(LTE_eNB_DLSCH_t *dlsch)
free16(dlsch->harq_processes[i]->d[r],(96+12+3+(3*6144)));
dlsch->harq_processes[i]->d[r] = NULL;
}
-
+
}
free16(dlsch->harq_processes[i],sizeof(LTE_DL_eNB_HARQ_t));
dlsch->harq_processes[i] = NULL;
}
}
-
+
free16(dlsch,sizeof(LTE_eNB_DLSCH_t));
dlsch = NULL;
}
-
+
}
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)
@@ -148,7 +148,7 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_
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; aanb_antennas_tx; aa++) {
dlsch->ue_spec_bf_weights[layer][aa] = (int32_t *)malloc16(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t));
for (re=0;recalib_dl_ch_estimates = (int32_t**)malloc16(frame_parms->nb_antennas_tx*sizeof(int32_t*));
for (aa=0; aanb_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++)
@@ -207,7 +207,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; iharq_processes[i]->round=0;
@@ -218,7 +218,7 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_
if (dlsch->harq_processes[i]->d[r])
dlsch->harq_processes[i]->d[r][j] = LTE_NULL;
}
-
+
}
return(dlsch);
@@ -257,7 +257,7 @@ void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch)
for (r=0; rharq_processes[i]->d[r])
dlsch->harq_processes[i]->d[r][j] = LTE_NULL;
-
+
}
}
}
@@ -352,7 +352,7 @@ void *te_thread(void *param) {
while (!oai_exit) {
- if (wait_on_condition(&proc->mutex_te,&proc->cond_te,&proc->instance_cnt_te,"te thread")<0) break;
+ if (wait_on_condition(&proc->mutex_te,&proc->cond_te,&proc->instance_cnt_te,"te thread")<0) break;
dlsch_encoding_2threads0((te_params*)param);
@@ -432,14 +432,14 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
return(-1);
}
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT);
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT);
++proc->instance_cnt_te;
proc->tep.eNB = eNB;
proc->tep.dlsch = dlsch;
proc->tep.G = G;
- // wakeup worker to do second half segments
+ // wakeup worker to do second half segments
if (pthread_cond_signal(&proc->cond_te) != 0) {
printf("[eNB] ERROR pthread_cond_signal for te thread exit\n");
exit_fun( "ERROR pthread_cond_signal" );
@@ -497,8 +497,8 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
proc->tep.eNB = eNB;
proc->tep.dlsch = dlsch;
proc->tep.G = G;
-
- // wakeup worker to do second half segments
+
+ // wakeup worker to do second half segments
if (pthread_cond_signal(&proc->cond_te) != 0) {
printf("[eNB] ERROR pthread_cond_signal for te thread exit\n");
exit_fun( "ERROR pthread_cond_signal" );
@@ -545,9 +545,9 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
// wait for worker to finish
- wait_on_busy_condition(&proc->mutex_te,&proc->cond_te,&proc->instance_cnt_te,"te thread");
+ wait_on_busy_condition(&proc->mutex_te,&proc->cond_te,&proc->instance_cnt_te,"te thread");
+
-
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT);
return(0);
@@ -729,6 +729,186 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
return(0);
}
+
+int dlsch_encoding_SIC(PHY_VARS_UE *ue,
+ unsigned char *a,
+ uint8_t num_pdcch_symbols,
+ LTE_eNB_DLSCH_t *dlsch,
+ int frame,
+ uint8_t subframe,
+ time_stats_t *rm_stats,
+ time_stats_t *te_stats,
+ time_stats_t *i_stats)
+{
+
+ unsigned int G;
+ unsigned int crc=1;
+ unsigned short iind;
+
+ LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
+ unsigned char harq_pid = dlsch->current_harq_pid;
+ unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb;
+ unsigned int A;
+ 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);
+
+ A = dlsch->harq_processes[harq_pid]->TBS; //6228
+ // printf("Encoder: A: %d\n",A);
+ mod_order = get_Qm(dlsch->harq_processes[harq_pid]->mcs);
+
+ 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
+ if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet
+
+ /*
+ int i;
+ printf("dlsch (tx): \n");
+ for (i=0;i<(A>>3);i++)
+ printf("%02x.",a[i]);
+ printf("\n");
+ */
+ // Add 24-bit crc (polynomial A) to payload
+ crc = crc24a(a,
+ A)>>8;
+ a[A>>3] = ((uint8_t*)&crc)[2];
+ a[1+(A>>3)] = ((uint8_t*)&crc)[1];
+ a[2+(A>>3)] = ((uint8_t*)&crc)[0];
+ // printf("CRC %x (A %d)\n",crc,A);
+
+ dlsch->harq_processes[harq_pid]->B = A+24;
+ // dlsch->harq_processes[harq_pid]->b = a;
+ memcpy(dlsch->harq_processes[harq_pid]->b,a,(A/8)+4);
+
+ if (lte_segmentation(dlsch->harq_processes[harq_pid]->b,
+ dlsch->harq_processes[harq_pid]->c,
+ dlsch->harq_processes[harq_pid]->B,
+ &dlsch->harq_processes[harq_pid]->C,
+ &dlsch->harq_processes[harq_pid]->Cplus,
+ &dlsch->harq_processes[harq_pid]->Cminus,
+ &dlsch->harq_processes[harq_pid]->Kplus,
+ &dlsch->harq_processes[harq_pid]->Kminus,
+ &dlsch->harq_processes[harq_pid]->F)<0)
+ return(-1);
+
+ for (r=0; rharq_processes[harq_pid]->C; r++) {
+
+ if (rharq_processes[harq_pid]->Cminus)
+ Kr = dlsch->harq_processes[harq_pid]->Kminus;
+ else
+ Kr = dlsch->harq_processes[harq_pid]->Kplus;
+
+ Kr_bytes = Kr>>3;
+
+ // get interleaver index for Turbo code (lookup in Table 5.1.3-3 36-212, V8.6 2009-03, p. 13-14)
+ if (Kr_bytes<=64)
+ iind = (Kr_bytes-5);
+ else if (Kr_bytes <=128)
+ iind = 59 + ((Kr_bytes-64)>>1);
+ else if (Kr_bytes <= 256)
+ iind = 91 + ((Kr_bytes-128)>>2);
+ else if (Kr_bytes <= 768)
+ iind = 123 + ((Kr_bytes-256)>>3);
+ else {
+ printf("dlsch_coding: Illegal codeword size %d!!!\n",Kr_bytes);
+ return(-1);
+ }
+
+
+#ifdef DEBUG_DLSCH_CODING
+ printf("Generating Code Segment %d (%d bits)\n",r,Kr);
+ // generate codewords
+
+ printf("bits_per_codeword (Kr)= %d, A %d\n",Kr,A);
+ printf("N_RB = %d\n",nb_rb);
+ printf("Ncp %d\n",frame_parms->Ncp);
+ printf("mod_order %d\n",mod_order);
+#endif
+
+
+#ifdef DEBUG_DLSCH_CODING
+ printf("Encoding ... iind %d f1 %d, f2 %d\n",iind,f1f2mat_old[iind*2],f1f2mat_old[(iind*2)+1]);
+#endif
+ start_meas(te_stats);
+ threegpplte_turbo_encoder(dlsch->harq_processes[harq_pid]->c[r],
+ Kr>>3,
+ &dlsch->harq_processes[harq_pid]->d[r][96],
+ (r==0) ? dlsch->harq_processes[harq_pid]->F : 0,
+ f1f2mat_old[iind*2], // f1 (see 36121-820, page 14)
+ f1f2mat_old[(iind*2)+1] // f2 (see 36121-820, page 14)
+ );
+ stop_meas(te_stats);
+#ifdef DEBUG_DLSCH_CODING
+
+ if (r==0)
+ write_output("enc_output0.m","enc0",&dlsch->harq_processes[harq_pid]->d[r][96],(3*8*Kr_bytes)+12,1,4);
+
+#endif
+ start_meas(i_stats);
+ dlsch->harq_processes[harq_pid]->RTC[r] =
+ sub_block_interleaving_turbo(4+(Kr_bytes*8),
+ &dlsch->harq_processes[harq_pid]->d[r][96],
+ dlsch->harq_processes[harq_pid]->w[r]);
+ stop_meas(i_stats);
+ }
+
+ }
+
+ // Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the
+ // outputs for each code segment, see Section 5.1.5 p.20
+
+ for (r=0; rharq_processes[harq_pid]->C; r++) {
+#ifdef DEBUG_DLSCH_CODING
+ printf("Rate Matching, Code segment %d (coded bits (G) %d,unpunctured/repeated bits per code segment %d,mod_order %d, nb_rb %d)...\n",
+ r,
+ G,
+ Kr*3,
+ mod_order,nb_rb);
+#endif
+
+ start_meas(rm_stats);
+ r_offset += lte_rate_matching_turbo(dlsch->harq_processes[harq_pid]->RTC[r],
+ G, //G
+ dlsch->harq_processes[harq_pid]->w[r],
+ dlsch->harq_processes[harq_pid]->e+r_offset,
+ dlsch->harq_processes[harq_pid]->C, // C
+ dlsch->Nsoft, // Nsoft,
+ dlsch->Mdlharq,
+ dlsch->Kmimo,
+ dlsch->harq_processes[harq_pid]->rvidx,
+ get_Qm(dlsch->harq_processes[harq_pid]->mcs),
+ dlsch->harq_processes[harq_pid]->Nl,
+ r,
+ nb_rb,
+ m); // r
+ stop_meas(rm_stats);
+#ifdef DEBUG_DLSCH_CODING
+
+ if (r==dlsch->harq_processes[harq_pid]->C-1)
+ write_output("enc_output.m","enc",dlsch->harq_processes[harq_pid]->e,r_offset,1,4);
+
+#endif
+ }
+
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT);
+
+ return(0);
+}
+
+
+
+
#ifdef PHY_ABSTRACTION
void dlsch_encoding_emul(PHY_VARS_eNB *phy_vars_eNB,
uint8_t *DLSCH_pdu,
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
index 9629502cec..04794e3ffc 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
@@ -37,7 +37,7 @@
#include "SCHED/extern.h"
#include "SIMULATION/TOOLS/defs.h"
//#define DEBUG_DLSCH_DECODING
-
+
void free_ue_dlsch(LTE_UE_DLSCH_t *dlsch)
{
@@ -343,7 +343,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
for (r=0; rC; r++) {
-
+
// Get Turbo interleaver parameters
if (rCminus)
Kr = harq_process->Kminus;
@@ -387,7 +387,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
harq_process->round);
#endif
-
+//printf("dlsch->harq_processes[harq_pid]->rvidx = %d\n", dlsch->harq_processes[harq_pid]->rvidx);
if (lte_rate_matching_turbo_rx(harq_process->RTC[r],
G,
harq_process->w[r],
@@ -486,7 +486,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
stop_meas(dlsch_turbo_decoding_stats);
}
#else
- if ((harq_process->C == 1) ||
+ if ((harq_process->C == 1) ||
((r==harq_process->C-1) && (skipped_last==0))) { // last segment with odd number of segments
start_meas(dlsch_turbo_decoding_stats);
@@ -518,7 +518,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
}
else {
skipped_last=0;
-
+
if (Kr_last == Kr) { // decode 2 code segments with AVX2 version
#ifdef DEBUG_DLSCH_DECODING
printf("single decoding segment %d (%p)\n",r-1,&harq_process->d[r-1][96]);
@@ -565,7 +565,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
exit(-1);*/
stop_meas(dlsch_turbo_decoding_stats);
- }
+ }
else { // Kr_last != Kr
start_meas(dlsch_turbo_decoding_stats);
ret = tc
@@ -585,7 +585,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
&phy_vars_ue->dlsch_tc_intl1_stats,
&phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1);
stop_meas(dlsch_turbo_decoding_stats);
-
+
start_meas(dlsch_turbo_decoding_stats);
ret = tc
(&harq_process->d[r][96],
@@ -604,7 +604,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
&phy_vars_ue->dlsch_tc_intl1_stats,
&phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1);
stop_meas(dlsch_turbo_decoding_stats);
-
+
}
}
}
@@ -747,7 +747,7 @@ int dlsch_abstraction_EESM(double* sinr_dB, uint8_t TM, uint32_t rb_alloc[4], ui
bler = interp(sinr_eff,&sinr_bler_map[mcs][0][0],&sinr_bler_map[mcs][1][0],table_length[mcs]);
-#ifdef USER_MODE // need to be adapted for the emulation in the kernel space
+#ifdef USER_MODE // need to be adapted for the emulation in the kernel space
if (uniformrandom() < bler) {
LOG_I(OCM,"abstraction_decoding failed (mcs=%d, sinr_eff=%f, bler=%f, TM %d)\n",mcs,sinr_eff,bler, TM);
@@ -830,7 +830,7 @@ int dlsch_abstraction_MIESM(double* sinr_dB,uint8_t TM, uint32_t rb_alloc[4], ui
bler = interp(sinr_eff,&sinr_bler_map[mcs][0][0],&sinr_bler_map[mcs][1][0],table_length[mcs]);
-#ifdef USER_MODE // need to be adapted for the emulation in the kernel space
+#ifdef USER_MODE // need to be adapted for the emulation in the kernel space
if (uniformrandom() < bler) {
LOG_N(OCM,"abstraction_decoding failed (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler);
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
index bb93287507..3026054994 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
@@ -29,8 +29,7 @@
* \note
* \warning
*/
-
-#include "PHY/defs.h"
+//#include "PHY/defs.h"
#include "PHY/extern.h"
#include "defs.h"
#include "extern.h"
@@ -43,13 +42,29 @@
#define NOCYGWIN_STATIC
#endif
+//#define DEBUG_HARQ
+
+//#undef LOG_D
+//#define LOG_D LOG_I
+
//#define DEBUG_PHY 1
//#define DEBUG_DLSCH_DEMOD 1
-int avg[4];
+int avg[4];
+int avg_0[2];
+int avg_1[2];
// [MCS][i_mod (0,1,2) = (2,4,6)]
unsigned char offset_mumimo_llr_drange_fix=0;
+uint8_t interf_unaw_shift0=0;
+uint8_t interf_unaw_shift1=0;
+uint8_t interf_unaw_shift=0;
+//inferference-free case
+unsigned char interf_unaw_shift_tm4_mcs[29]={5, 3, 4, 3, 3, 2, 1, 1, 2, 0, 1, 1, 1, 1, 0, 0,
+ 1, 1, 1, 1, 0, 2, 1, 0, 1, 0, 1, 0, 0} ;
+unsigned char interf_unaw_shift_tm1_mcs[29]={5, 5, 4, 3, 3, 3, 2, 2, 4, 4, 2, 3, 3, 3, 1, 1,
+ 0, 1, 1, 2, 5, 4, 4, 6, 5, 1, 0, 5, 6} ; // mcs 21, 26, 28 seem to be errorneous
+
/*
//original values from sebastion + same hand tuning
unsigned char offset_mumimo_llr_drange[29][3]={{8,8,8},{7,7,7},{7,7,7},{7,7,7},{6,6,6},{6,6,6},{6,6,6},{5,5,5},{4,4,4},{1,2,4}, // QPSK
@@ -78,7 +93,7 @@ int rx_pdsch(PHY_VARS_UE *ue,
uint8_t subframe,
unsigned char symbol,
unsigned char first_symbol_flag,
- unsigned char dual_stream_flag,
+ RX_type_t rx_type,
unsigned char i_mod,
unsigned char harq_pid)
{
@@ -86,37 +101,72 @@ int rx_pdsch(PHY_VARS_UE *ue,
LTE_UE_COMMON *common_vars = &ue->common_vars;
LTE_UE_PDSCH **pdsch_vars;
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
- PHY_MEASUREMENTS *phy_measurements = &ue->measurements;
+ PHY_MEASUREMENTS *measurements = &ue->measurements;
LTE_UE_DLSCH_t **dlsch;
+
unsigned char aatx,aarx;
- unsigned short nb_rb=0;
+
+ unsigned short nb_rb = 0, round;
int avgs, rb;
LTE_DL_UE_HARQ_t *dlsch0_harq,*dlsch1_harq = 0;
-
+
uint8_t beamforming_mode;
uint32_t *rballoc;
+ int32_t **rxdataF_comp_ptr;
+ int32_t **dl_ch_mag_ptr;
+ int32_t codeword_TB0;
+ int32_t codeword_TB1;
+
+
+
switch (type) {
case SI_PDSCH:
pdsch_vars = &ue->pdsch_vars_SI[eNB_id];
- dlsch = &ue->dlsch_SI[eNB_id];
- dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
+ dlsch = &ue->dlsch_SI[eNB_id];
+ dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
beamforming_mode = 0;
break;
case RA_PDSCH:
pdsch_vars = &ue->pdsch_vars_ra[eNB_id];
- dlsch = &ue->dlsch_ra[eNB_id];
- dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
+ dlsch = &ue->dlsch_ra[eNB_id];
+ dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
beamforming_mode = 0;
break;
case PDSCH:
pdsch_vars = &ue->pdsch_vars[subframe&0x1][eNB_id];
- dlsch = ue->dlsch[eNB_id];
- dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
- dlsch1_harq = dlsch[1]->harq_processes[harq_pid];
+ dlsch = ue->dlsch[eNB_id];
+ if ((dlsch[0]->harq_processes[harq_pid]->status == ACTIVE) &&
+ (dlsch[1]->harq_processes[harq_pid]->status == ACTIVE)){
+ codeword_TB0 = dlsch[0]->harq_processes[harq_pid]->codeword;
+ codeword_TB1 = dlsch[1]->harq_processes[harq_pid]->codeword;
+ dlsch0_harq = dlsch[codeword_TB0]->harq_processes[harq_pid];
+ dlsch1_harq = dlsch[codeword_TB1]->harq_processes[harq_pid];
+#ifdef DEBUG_HARQ
+ printf("I am assuming both CW active\n");
+#endif
+ }
+ else if ((dlsch[0]->harq_processes[harq_pid]->status == ACTIVE) &&
+ (dlsch[1]->harq_processes[harq_pid]->status != ACTIVE) ) {
+ codeword_TB0 = dlsch[0]->harq_processes[harq_pid]->codeword;
+ dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
+ dlsch1_harq = NULL;
+ codeword_TB1 = -1;
+ }
+ else if ((dlsch[0]->harq_processes[harq_pid]->status != ACTIVE) &&
+ (dlsch[1]->harq_processes[harq_pid]->status == ACTIVE) ){
+ codeword_TB1 = dlsch[1]->harq_processes[harq_pid]->codeword;
+ dlsch0_harq = dlsch[1]->harq_processes[harq_pid];
+ dlsch1_harq = NULL;
+ codeword_TB0 = -1;
+ }
+ else {
+ LOG_E(PHY,"[UE][FATAL] Frame %d subframe %d: no active DLSCH\n",ue->proc.proc_rxtx[0].frame_rx,subframe);
+ return(-1);
+ }
beamforming_mode = ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id];
break;
@@ -125,7 +175,13 @@ int rx_pdsch(PHY_VARS_UE *ue,
return(-1);
break;
}
+#ifdef DEBUG_HARQ
+ printf("[DEMOD] MIMO mode = %d\n", dlsch0_harq->mimo_mode);
+ printf("[DEMOD] cw for TB0 = %d, cw for TB1 = %d\n", codeword_TB0, codeword_TB1);
+#endif
+ DevAssert(dlsch0_harq);
+ round = dlsch0_harq->round;
if (eNB_id > 2) {
LOG_W(PHY,"dlsch_demodulation.c: Illegal eNB_id %d\n",eNB_id);
@@ -138,7 +194,7 @@ int rx_pdsch(PHY_VARS_UE *ue,
}
if (!dlsch[0]) {
- LOG_W(PHY,"dlsch_demodulation.c: Null dlsch pointer\n");
+ LOG_W(PHY,"dlsch_demodulation.c: Null dlsch_ue pointer\n");
return(-1);
}
@@ -152,17 +208,33 @@ int rx_pdsch(PHY_VARS_UE *ue,
return(-1);
}
-
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;
+
+ if (dlsch0_harq->mimo_mode>DUALSTREAM_PUSCH_PRECODING) {
+ LOG_E(PHY,"This transmission mode is not yet supported!\n");
+ return(-1);
+ }
+
+
+
+ if ((dlsch0_harq->mimo_mode==LARGE_CDD) || ((dlsch0_harq->mimo_mode>=DUALSTREAM_UNIFORM_PRECODING1) && (dlsch0_harq->mimo_mode<=DUALSTREAM_PUSCH_PRECODING))) {
+ DevAssert(dlsch1_harq);
+ if (eNB_id!=eNB_id_i) {
+ LOG_E(PHY,"TM3/TM4 requires to set eNB_id==eNB_id_i!\n");
+ return(-1);
+ }
+ }
+
if (frame_parms->nb_antenna_ports_eNB>1 && beamforming_mode==0) {
#ifdef DEBUG_DLSCH_MOD
LOG_I(PHY,"dlsch: using pmi %x (%p), rb_alloc %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),dlsch[0],dlsch0_harq->rb_alloc_even[0]);
#endif
+
nb_rb = dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF,
common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id],
pdsch_vars[eNB_id]->rxdataF_ext,
@@ -173,11 +245,18 @@ int rx_pdsch(PHY_VARS_UE *ue,
symbol,
subframe,
ue->high_speed_flag,
- frame_parms);
+ frame_parms,
+ dlsch0_harq->mimo_mode);
+//#ifdef DEBUG_DLSCH_MOD
+ /* printf("dlsch: using pmi %lx, rb_alloc %x, pmi_ext ",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),*rballoc);
+ for (rb=0;rbpmi_ext[rb]);
+ printf("\n");*/
+//#endif
- if (dual_stream_flag==1) {
- if (eNB_id_in_connected_eNB)
- nb_rb = dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF,
+ if (rx_type >= rx_IC_single_stream) {
+ if (eNB_id_in_connected_eNB) // we are in TM5
+ nb_rb = dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF,
common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id_i],
pdsch_vars[eNB_id_i]->rxdataF_ext,
pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
@@ -187,7 +266,8 @@ int rx_pdsch(PHY_VARS_UE *ue,
symbol,
subframe,
ue->high_speed_flag,
- frame_parms);
+ frame_parms,
+ dlsch0_harq->mimo_mode);
else
nb_rb = dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF,
common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id],
@@ -199,7 +279,8 @@ int rx_pdsch(PHY_VARS_UE *ue,
symbol,
subframe,
ue->high_speed_flag,
- frame_parms);
+ frame_parms,
+ dlsch0_harq->mimo_mode);
}
} else if (beamforming_mode==0) { //else if nb_antennas_ports_eNB==1 && beamforming_mode == 0
nb_rb = dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF,
@@ -214,8 +295,8 @@ int rx_pdsch(PHY_VARS_UE *ue,
ue->high_speed_flag,
frame_parms);
- if (dual_stream_flag==1) {
- if (eNB_id_in_connected_eNB)
+ if (rx_type==rx_IC_single_stream) {
+ if (eNB_id_in_connected_eNB)
nb_rb = dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF,
common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id_i],
pdsch_vars[eNB_id_i]->rxdataF_ext,
@@ -227,7 +308,7 @@ int rx_pdsch(PHY_VARS_UE *ue,
subframe,
ue->high_speed_flag,
frame_parms);
-
+ else
nb_rb = dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF,
common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id],
pdsch_vars[eNB_id_i]->rxdataF_ext,
@@ -237,7 +318,7 @@ int rx_pdsch(PHY_VARS_UE *ue,
rballoc,
symbol,
subframe,
- ue->high_speed_flag,
+ ue->high_speed_flag,
frame_parms);
}
} else if (beamforming_mode==7) { //else if beamforming_mode == 7
@@ -245,14 +326,14 @@ int rx_pdsch(PHY_VARS_UE *ue,
pdsch_vars[eNB_id]->dl_bf_ch_estimates,
pdsch_vars[eNB_id]->rxdataF_ext,
pdsch_vars[eNB_id]->dl_bf_ch_estimates_ext,
- rballoc,
+ rballoc,
symbol,
subframe,
ue->high_speed_flag,
frame_parms);
-
+
} else if(beamforming_mode>7) {
- LOG_W(PHY,"dlsch_demodulation:beamforming mode not supported yet.\n");
+ LOG_W(PHY,"dlsch_demodulation: beamforming mode not supported yet.\n");
}
// printf("nb_rb = %d, eNB_id %d\n",nb_rb,eNB_id);
@@ -261,42 +342,116 @@ int rx_pdsch(PHY_VARS_UE *ue,
return(-1);
}
- /*
- // DL power control: Scaling of Channel estimates for PDSCH
- dlsch_scale_channel(pdsch_vars[eNB_id]->dl_ch_estimates_ext,
- frame_parms,
- dlsch,
- symbol,
- nb_rb);
- */
- if (first_symbol_flag==1) {
- if (beamforming_mode==0)
- dlsch_channel_level(pdsch_vars[eNB_id]->dl_ch_estimates_ext,
- frame_parms,
- avg,
- symbol,
- nb_rb);
- else if (beamforming_mode==7)
- dlsch_channel_level_TM7(pdsch_vars[eNB_id]->dl_bf_ch_estimates_ext,
- frame_parms,
- avg,
- symbol,
- nb_rb);
-
+
#ifdef DEBUG_PHY
- LOG_D(PHY,"[DLSCH] avg[0] %d\n",avg[0]);
+ LOG_D(PHY,"[DLSCH] log2_maxh = %d (%d,%d)\n",pdsch_vars[eNB_id]->log2_maxh,avg[0],avgs);
+ LOG_D(PHY,"[DLSCH] mimo_mode = %d\n", dlsch0_harq->mimo_mode);
#endif
- // the channel gain should be the effective gain of precoding + channel
- // however lets be more conservative and set maxh = nb_tx*nb_rx*max(h_i)
- // in case of precoding we add an additional factor of two for the precoding gain
- avgs = 0;
+ aatx = frame_parms->nb_antenna_ports_eNB;
+ aarx = frame_parms->nb_antennas_rx;
- for (aatx=0; aatxnb_antenna_ports_eNB; aatx++)
- for (aarx=0; aarxnb_antennas_rx; aarx++)
- avgs = cmax(avgs,avg[(aatx<<1)+aarx]);
+ dlsch_scale_channel(pdsch_vars[eNB_id]->dl_ch_estimates_ext,
+ frame_parms,
+ dlsch,
+ symbol,
+ nb_rb);
- // avgs = cmax(avgs,avg[(aarx<<1)+aatx]);
+ if ((dlsch0_harq->mimo_moden_connected_eNB) && (dlsch0_harq->dl_power_off==0)) // TM5 two-user
+ dlsch_scale_channel(pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
+ frame_parms,
+ dlsch,
+ symbol,
+ nb_rb);
+
+ if (first_symbol_flag==1) {
+ if (beamforming_mode==0){
+ if (dlsch0_harq->mimo_modedl_ch_estimates_ext,
+ frame_parms,
+ avg,
+ symbol,
+ nb_rb);
+ avgs = 0;
+ for (aatx=0;aatxnb_antenna_ports_eNB;aatx++)
+ for (aarx=0;aarxnb_antennas_rx;aarx++)
+ avgs = cmax(avgs,avg[(aatx<<1)+aarx]);
+
+ pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2)+1;
+ }
+ else if ((dlsch0_harq->mimo_mode == LARGE_CDD) ||
+ ((dlsch0_harq->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) &&
+ (dlsch0_harq->mimo_mode <=DUALSTREAM_PUSCH_PRECODING)))
+ {
+ dlsch_channel_level_TM34(pdsch_vars[eNB_id]->dl_ch_estimates_ext,
+ frame_parms,
+ pdsch_vars[eNB_id]->pmi_ext,
+ avg_0,
+ avg_1,
+ symbol,
+ nb_rb,
+ dlsch0_harq->mimo_mode);
+
+ if (rx_type>rx_standard) {
+ avg_0[0] = (log2_approx(avg_0[0])/2) -13 + interf_unaw_shift;
+ avg_1[0] = (log2_approx(avg_1[0])/2) -13 + interf_unaw_shift;
+ pdsch_vars[eNB_id]->log2_maxh0 = cmax(avg_0[0],0);
+ pdsch_vars[eNB_id]->log2_maxh1 = cmax(avg_1[0],0);
+ //printf("TM4 I-A log2_maxh0 = %d\n", lte_ue_pdsch_vars[eNB_id]->log2_maxh0);
+ //printf("TM4 I-A log2_maxh1 = %d\n", lte_ue_pdsch_vars[eNB_id]->log2_maxh1);
+ }
+ else {
+ avg_0[0] = (log2_approx(avg_0[0])/2) - 13 + interf_unaw_shift;
+ avg_1[0] = (log2_approx(avg_1[0])/2) - 13 + interf_unaw_shift;
+ pdsch_vars[eNB_id]->log2_maxh0 = cmax(avg_0[0],0);
+ pdsch_vars[eNB_id]->log2_maxh1 = cmax(avg_1[0],0);
+ //printf("TM4 I-UA log2_maxh0 = %d\n", lte_ue_pdsch_vars[eNB_id]->log2_maxh0);
+ //printf("TM4 I-UA log2_maxh1 = %d\n", lte_ue_pdsch_vars[eNB_id]->log2_maxh1);
+ }
+ }
+ else if (dlsch0_harq->mimo_moden_connected_eNB) && (dlsch0_harq->dl_power_off==0)) {
+ dlsch_channel_level_TM56(pdsch_vars[eNB_id]->dl_ch_estimates_ext,
+ frame_parms,
+ pdsch_vars[eNB_id]->pmi_ext,
+ avg,
+ symbol,
+ nb_rb);
+ avg[0] = log2_approx(avg[0]) - 13 + offset_mumimo_llr_drange[dlsch0_harq->mcs][(i_mod>>1)-1];
+ pdsch_vars[eNB_id]->log2_maxh = cmax(avg[0],0);
+
+ }
+ else if (dlsch0_harq->dl_power_off==1) { //TM6
+
+ dlsch_channel_level(pdsch_vars[eNB_id]->dl_ch_estimates_ext,
+ frame_parms,
+ avg,
+ symbol,
+ nb_rb);
+
+ avgs = 0;
+ for (aatx=0;aatxnb_antenna_ports_eNB;aatx++)
+ for (aarx=0;aarxnb_antennas_rx;aarx++)
+ avgs = cmax(avgs,avg[(aatx<<1)+aarx]);
+
+ pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2) + 1;
+ pdsch_vars[eNB_id]->log2_maxh++;
+
+ }
+ }
+
+ }
+ else if (beamforming_mode==7)
+ dlsch_channel_level_TM7(pdsch_vars[eNB_id]->dl_bf_ch_estimates_ext,
+ frame_parms,
+ avg,
+ symbol,
+ nb_rb);
+#ifdef DEBUG_PHY
+ LOG_D(PHY,"[DLSCH] log2_maxh = %d (%d,%d)\n",pdsch_vars[eNB_id]->log2_maxh,avg[0],avgs);
+ LOG_D(PHY,"[DLSCH] mimo_mode = %d\n", dlsch0_harq->mimo_mode);
+#endif
+ }
#if T_TRACER
if (type == PDSCH)
@@ -306,40 +461,8 @@ int rx_pdsch(PHY_VARS_UE *ue,
}
#endif
- pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2)+1;
- // + log2_approx(frame_parms->nb_antenna_ports_eNB-1) //-1 because log2_approx counts the number of bits
- // + log2_approx(frame_parms->nb_antennas_rx-1);
-
- if ((dlsch0_harq->mimo_mode>=UNIFORM_PRECODING11) &&
- (dlsch0_harq->mimo_mode< DUALSTREAM_UNIFORM_PRECODING1) &&
- (dlsch0_harq->dl_power_off==1)) // we are in TM 6
- pdsch_vars[eNB_id]->log2_maxh++;
-
- // this version here applies the factor .5 also to the extra terms. however, it does not work so well as the one above
- /* K = Nb_rx in TM1
- Nb_tx*Nb_rx in TM2,4,5
- Nb_tx^2*Nb_rx in TM6 */
- /*
- K = frame_parms->nb_antennas_rx*frame_parms->nb_antenna_ports_eNB; //that also covers TM1 since Nb_tx=1
- if ((dlsch0_harq->mimo_mode>=UNIFORM_PRECODING11) &&
- (dlsch0_harq->mimo_mode< DUALSTREAM_UNIFORM_PRECODING1) &&
- (dlsch0_harq->dl_power_off==1)) // we are in TM 6
- K *= frame_parms->nb_antenna_ports_eNB;
-
- pdsch_vars[eNB_id]->log2_maxh = (log2_approx(K*avgs)/2);
- */
-
-#ifdef DEBUG_PHY
- LOG_D(PHY,"[DLSCH] log2_maxh = %d (%d,%d)\n",pdsch_vars[eNB_id]->log2_maxh,avg[0],avgs);
- LOG_D(PHY,"[DLSCH] mimo_mode = %d\n", dlsch0_harq->mimo_mode);
-#endif
- }
-
- aatx = frame_parms->nb_antenna_ports_eNB;
- aarx = frame_parms->nb_antennas_rx;
-
- if (dlsch0_harq->mimo_modemimo_moderxdataF_ext,
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
pdsch_vars[eNB_id]->dl_ch_mag0,
@@ -352,18 +475,13 @@ int rx_pdsch(PHY_VARS_UE *ue,
dlsch0_harq->Qm,
nb_rb,
pdsch_vars[eNB_id]->log2_maxh,
- phy_measurements); // log2_maxh+I0_shift
-#ifdef DEBUG_PHY
-
- if (symbol==5)
- write_output("rxF_comp_d.m","rxF_c_d",&pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
-
-#endif
-
- if ((dual_stream_flag==1) &&
+ measurements); // log2_maxh+I0_shift
+ /*if (symbol == 5) {
+ write_output("rxF_comp_d.m","rxF_c_d",&pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
+ } */
+ if ((rx_type==rx_IC_single_stream) &&
(eNB_id_in_connected_eNB)) {
- // get MF output for interfering stream
- dlsch_channel_compensation(pdsch_vars[eNB_id_i]->rxdataF_ext,
+ dlsch_channel_compensation(pdsch_vars[eNB_id_i]->rxdataF_ext,
pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
pdsch_vars[eNB_id_i]->dl_ch_mag0,
pdsch_vars[eNB_id_i]->dl_ch_magb0,
@@ -375,104 +493,79 @@ int rx_pdsch(PHY_VARS_UE *ue,
i_mod,
nb_rb,
pdsch_vars[eNB_id]->log2_maxh,
- phy_measurements); // log2_maxh+I0_shift
+ measurements); // log2_maxh+I0_shift
#ifdef DEBUG_PHY
-
if (symbol == 5) {
write_output("rxF_comp_d.m","rxF_c_d",&pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
write_output("rxF_comp_i.m","rxF_c_i",&pdsch_vars[eNB_id_i]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
}
-
#endif
- // compute correlation between signal and interference channels
dlsch_dual_stream_correlation(frame_parms,
symbol,
nb_rb,
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
- pdsch_vars[eNB_id]->dl_ch_rho_ext,
+ pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
pdsch_vars[eNB_id]->log2_maxh);
}
- } else if (dlsch0_harq->mimo_mode == LARGE_CDD) { // TM3
- // LOG_I(PHY,"Running PDSCH RX for TM3\n");
- if (frame_parms->nb_antenna_ports_eNB == 2) {
- if (first_symbol_flag==1) {
- // effective channel of desired user is always stronger than interfering eff. channel
- dlsch_channel_level_TM3(pdsch_vars[eNB_id]->dl_ch_estimates_ext,
- frame_parms,
- avg, symbol, nb_rb);
-
- // LOG_D(PHY,"llr_offset = %d\n",offset_mumimo_llr_drange[dlsch0_harq->mcs][(dlsch1_harq->mcs>>1)-1]);
- avg[0] = log2_approx(avg[0]) - 13 + offset_mumimo_llr_drange[dlsch0_harq->mcs][(dlsch1_harq->Qm>>1)-1];
-
- pdsch_vars[eNB_id]->log2_maxh = cmax(avg[0],0);
- // printf("log2_maxh =%d\n",pdsch_vars[eNB_id]->log2_maxh);
- }
-
- dlsch_channel_compensation_TM3(frame_parms,
+ } else if ((dlsch0_harq->mimo_mode == LARGE_CDD) || ((dlsch0_harq->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) &&
+ (dlsch0_harq->mimo_mode <=DUALSTREAM_PUSCH_PRECODING))){
+ dlsch_channel_compensation_TM34(frame_parms,
pdsch_vars[eNB_id],
- phy_measurements,
+ measurements,
eNB_id,
symbol,
dlsch0_harq->Qm,
dlsch1_harq->Qm,
+ harq_pid,
dlsch0_harq->round,
+ dlsch0_harq->mimo_mode,
nb_rb,
- pdsch_vars[eNB_id]->log2_maxh);
+ pdsch_vars[eNB_id]->log2_maxh0,
+ pdsch_vars[eNB_id]->log2_maxh1);
+ /* if (symbol == 5) {
+ write_output("rxF_comp_d00.m","rxF_c_d00",&pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);// should be QAM
+ write_output("rxF_comp_d01.m","rxF_c_d01",&pdsch_vars[eNB_id]->rxdataF_comp0[1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0
+ write_output("rxF_comp_d10.m","rxF_c_d10",&pdsch_vars[eNB_id]->rxdataF_comp1[harq_pid][round][0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0
+ write_output("rxF_comp_d11.m","rxF_c_d11",&pdsch_vars[eNB_id]->rxdataF_comp1[harq_pid][round][1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be QAM
+ } */
// compute correlation between signal and interference channels (rho12 and rho21)
- dlsch_dual_stream_correlation(frame_parms,
+ dlsch_dual_stream_correlation(frame_parms, // this is doing h11'*h12 and h21'*h22
symbol,
nb_rb,
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
&(pdsch_vars[eNB_id]->dl_ch_estimates_ext[2]),
- pdsch_vars[eNB_id]->dl_ch_rho_ext,
- pdsch_vars[eNB_id]->log2_maxh);
- dlsch_dual_stream_correlation(frame_parms,
- symbol,
- nb_rb,
- &(pdsch_vars[eNB_id]->dl_ch_estimates_ext[2]),
- pdsch_vars[eNB_id]->dl_ch_estimates_ext,
pdsch_vars[eNB_id]->dl_ch_rho2_ext,
- pdsch_vars[eNB_id]->log2_maxh);
+ pdsch_vars[eNB_id]->log2_maxh0);
+ //printf("rho stream1 =%d\n", &pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round] );
+ //to be optimized (just take complex conjugate)
+ dlsch_dual_stream_correlation(frame_parms, // this is doing h12'*h11 and h22'*h21
+ symbol,
+ nb_rb,
+ &(pdsch_vars[eNB_id]->dl_ch_estimates_ext[2]),
+ pdsch_vars[eNB_id]->dl_ch_estimates_ext,
+ pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
+ pdsch_vars[eNB_id]->log2_maxh1);
+ // printf("rho stream2 =%d\n",&pdsch_vars[eNB_id]->dl_ch_rho2_ext );
//printf("TM3 log2_maxh : %d\n",pdsch_vars[eNB_id]->log2_maxh);
+ /* if (symbol == 5) {
+ write_output("rho0_0.m","rho0_0",&pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round][0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);// should be QAM
+ write_output("rho2_0.m","rho2_0",&pdsch_vars[eNB_id]->dl_ch_rho2_ext[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0
+ write_output("rho0_1.m.m","rho0_1",&pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round][1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0
+ write_output("rho2_1.m","rho2_1",&pdsch_vars[eNB_id]->dl_ch_rho2_ext[1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be QAM
+ } */
- } else {
- LOG_E(PHY, "only 2 tx antennas supported for TM3\n");
- }
- } else if (dlsch0_harq->mimo_moden_connected_eNB)) { // TM5 two-user
-
- // Scale the channel estimates for interfering stream
-
- dlsch_scale_channel(pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
- frame_parms,
- dlsch,
- symbol,
- nb_rb);
-
- /* compute new log2_maxh for effective channel */
- if (first_symbol_flag==1) {
- // effective channel of desired user is always stronger than interfering eff. channel
- dlsch_channel_level_TM56(pdsch_vars[eNB_id]->dl_ch_estimates_ext, frame_parms, pdsch_vars[eNB_id]->pmi_ext, avg, symbol, nb_rb);
-
- // LOG_D(PHY,"llr_offset = %d\n",offset_mumimo_llr_drange[dlsch0_harq->mcs][(i_mod>>1)-1]);
- avg[0] = log2_approx(avg[0]) - 13 + offset_mumimo_llr_drange[dlsch0_harq->mcs][(i_mod>>1)-1];
-
- pdsch_vars[eNB_id]->log2_maxh = cmax(avg[0],0);
- //printf("log1_maxh =%d\n",pdsch_vars[eNB_id]->log2_maxh);
- }
-
- dlsch_channel_compensation_TM56(pdsch_vars[eNB_id]->rxdataF_ext,
+ } else if (dlsch0_harq->mimo_moden_connected_eNB) && (dlsch0_harq->dl_power_off==0)) {
+ dlsch_channel_compensation_TM56(pdsch_vars[eNB_id]->rxdataF_ext,
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
pdsch_vars[eNB_id]->dl_ch_mag0,
pdsch_vars[eNB_id]->dl_ch_magb0,
pdsch_vars[eNB_id]->rxdataF_comp0,
pdsch_vars[eNB_id]->pmi_ext,
frame_parms,
- phy_measurements,
+ measurements,
eNB_id,
symbol,
dlsch0_harq->Qm,
@@ -480,33 +573,24 @@ int rx_pdsch(PHY_VARS_UE *ue,
pdsch_vars[eNB_id]->log2_maxh,
dlsch0_harq->dl_power_off);
- // if interference source is MU interference, assume opposite precoder was used at eNB
-
- // calculate opposite PMI
- for (rb=0; rbpmi_ext[rb]) {
- case 0:
- pdsch_vars[eNB_id_i]->pmi_ext[rb]=1;
- break;
-
- case 1:
- pdsch_vars[eNB_id_i]->pmi_ext[rb]=0;
- break;
-
- case 2:
- pdsch_vars[eNB_id_i]->pmi_ext[rb]=3;
- break;
-
- case 3:
- pdsch_vars[eNB_id_i]->pmi_ext[rb]=2;
- break;
- }
-
- // if (rb==0)
+ for (rb=0; rbpmi_ext[rb]) {
+ case 0:
+ pdsch_vars[eNB_id_i]->pmi_ext[rb]=1;
+ break;
+ case 1:
+ pdsch_vars[eNB_id_i]->pmi_ext[rb]=0;
+ break;
+ case 2:
+ pdsch_vars[eNB_id_i]->pmi_ext[rb]=3;
+ break;
+ case 3:
+ pdsch_vars[eNB_id_i]->pmi_ext[rb]=2;
+ break;
+ }
+ // if (rb==0)
// printf("pmi %d, pmi_i %d\n",pdsch_vars[eNB_id]->pmi_ext[rb],pdsch_vars[eNB_id_i]->pmi_ext[rb]);
-
}
-
dlsch_channel_compensation_TM56(pdsch_vars[eNB_id_i]->rxdataF_ext,
pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
pdsch_vars[eNB_id_i]->dl_ch_mag0,
@@ -514,32 +598,27 @@ int rx_pdsch(PHY_VARS_UE *ue,
pdsch_vars[eNB_id_i]->rxdataF_comp0,
pdsch_vars[eNB_id_i]->pmi_ext,
frame_parms,
- phy_measurements,
+ measurements,
eNB_id_i,
symbol,
i_mod,
nb_rb,
pdsch_vars[eNB_id]->log2_maxh,
dlsch0_harq->dl_power_off);
-
#ifdef DEBUG_PHY
-
if (symbol==5) {
write_output("rxF_comp_d.m","rxF_c_d",&pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
- write_output("rxF_comp_i.m","rxF_c_i",&pdsch_vars[eNB_id_i]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
+ write_output("rxF_comp_i.m","rxF_c_i",&pdsch_vars[eNB_id_i]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
}
-
#endif
-
dlsch_dual_stream_correlation(frame_parms,
symbol,
nb_rb,
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
- pdsch_vars[eNB_id]->dl_ch_rho_ext,
+ pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
pdsch_vars[eNB_id]->log2_maxh);
-
- } else {
+ } else if (dlsch0_harq->dl_power_off==1) {
dlsch_channel_compensation_TM56(pdsch_vars[eNB_id]->rxdataF_ext,
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
pdsch_vars[eNB_id]->dl_ch_mag0,
@@ -547,66 +626,70 @@ int rx_pdsch(PHY_VARS_UE *ue,
pdsch_vars[eNB_id]->rxdataF_comp0,
pdsch_vars[eNB_id]->pmi_ext,
frame_parms,
- phy_measurements,
+ measurements,
eNB_id,
symbol,
dlsch0_harq->Qm,
nb_rb,
pdsch_vars[eNB_id]->log2_maxh,
1);
- }
- } else if (dlsch0_harq->mimo_mode==TM7) { //TM7
- dlsch_channel_compensation(pdsch_vars[eNB_id]->rxdataF_ext,
- pdsch_vars[eNB_id]->dl_bf_ch_estimates_ext,
- pdsch_vars[eNB_id]->dl_ch_mag0,
- pdsch_vars[eNB_id]->dl_ch_magb0,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- (aatx>1) ? pdsch_vars[eNB_id]->rho : NULL,
- frame_parms,
- symbol,
- first_symbol_flag,
- get_Qm(dlsch0_harq->mcs),
- nb_rb,
- //9,
- pdsch_vars[eNB_id]->log2_maxh,
- phy_measurements); // log2_maxh+I0_shift
+ }
+
+
+ } else if (dlsch0_harq->mimo_mode==TM7) { //TM7
+
+ dlsch_channel_compensation(pdsch_vars[eNB_id]->rxdataF_ext,
+ pdsch_vars[eNB_id]->dl_bf_ch_estimates_ext,
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ pdsch_vars[eNB_id]->dl_ch_magb0,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ (aatx>1) ? pdsch_vars[eNB_id]->rho : NULL,
+ frame_parms,
+ symbol,
+ first_symbol_flag,
+ get_Qm(dlsch0_harq->mcs),
+ nb_rb,
+ //9,
+ pdsch_vars[eNB_id]->log2_maxh,
+ measurements); // log2_maxh+I0_shift
}
- // printf("MRC\n");
- if (frame_parms->nb_antennas_rx > 1) {
- if (dlsch0_harq->mimo_mode == LARGE_CDD) {
+// MRC
+
+
+ if (frame_parms->nb_antennas_rx > 1) {
+ if ((dlsch0_harq->mimo_mode == LARGE_CDD) ||
+ ((dlsch0_harq->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) &&
+ (dlsch0_harq->mimo_mode <=DUALSTREAM_PUSCH_PRECODING))){ // TM3 or TM4
if (frame_parms->nb_antenna_ports_eNB == 2) {
- dlsch_detection_mrc(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id]->rxdataF_comp1[dlsch0_harq->round],
- pdsch_vars[eNB_id]->dl_ch_rho_ext,
- pdsch_vars[eNB_id]->rho,
- pdsch_vars[eNB_id]->dl_ch_mag0,
- pdsch_vars[eNB_id]->dl_ch_magb0,
- pdsch_vars[eNB_id]->dl_ch_mag1,
- pdsch_vars[eNB_id]->dl_ch_magb1,
- symbol,
- nb_rb,
- dual_stream_flag);
+ dlsch_detection_mrc_TM34(frame_parms,
+ pdsch_vars[eNB_id],
+ harq_pid,
+ dlsch0_harq->round,
+ symbol,
+ nb_rb,
+ 1);
+ /* if (symbol == 5) {
+ write_output("rho0_mrc.m","rho0_0",&pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round][0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);// should be QAM
+ write_output("rho2_mrc.m","rho2_0",&pdsch_vars[eNB_id]->dl_ch_rho2_ext[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0
+ } */
}
} else {
-
dlsch_detection_mrc(frame_parms,
pdsch_vars[eNB_id]->rxdataF_comp0,
pdsch_vars[eNB_id_i]->rxdataF_comp0,
pdsch_vars[eNB_id]->rho,
- pdsch_vars[eNB_id]->dl_ch_rho_ext,
+ pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
pdsch_vars[eNB_id]->dl_ch_mag0,
pdsch_vars[eNB_id]->dl_ch_magb0,
pdsch_vars[eNB_id_i]->dl_ch_mag0,
pdsch_vars[eNB_id_i]->dl_ch_magb0,
symbol,
nb_rb,
- dual_stream_flag);
+ rx_type==rx_IC_single_stream);
}
}
-
// printf("Combining");
if ((dlsch0_harq->mimo_mode == SISO) ||
((dlsch0_harq->mimo_mode >= UNIFORM_PRECODING11) &&
@@ -620,122 +703,109 @@ int rx_pdsch(PHY_VARS_UE *ue,
nb_rb);
*/
} else if (dlsch0_harq->mimo_mode == ALAMOUTI) {
-
dlsch_alamouti(frame_parms,
pdsch_vars[eNB_id]->rxdataF_comp0,
pdsch_vars[eNB_id]->dl_ch_mag0,
pdsch_vars[eNB_id]->dl_ch_magb0,
symbol,
nb_rb);
-
- }
-
- else if (dlsch0_harq->mimo_mode == LARGE_CDD) {
-
- } else {
- LOG_W(PHY,"dlsch_rx: Unknown MIMO mode\n");
- return (-1);
}
// printf("LLR");
+ if ((dlsch0_harq->mimo_mode == LARGE_CDD) ||
+ ((dlsch0_harq->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) &&
+ (dlsch0_harq->mimo_mode <=DUALSTREAM_PUSCH_PRECODING))) {
+ rxdataF_comp_ptr = pdsch_vars[eNB_id]->rxdataF_comp1[harq_pid][round];
+ dl_ch_mag_ptr = pdsch_vars[eNB_id]->dl_ch_mag1[harq_pid][round];
+ }
+ else {
+ rxdataF_comp_ptr = pdsch_vars[eNB_id_i]->rxdataF_comp0;
+ dl_ch_mag_ptr = pdsch_vars[eNB_id_i]->dl_ch_mag0;
+ //i_mod should have been passed as a parameter
+ }
switch (dlsch0_harq->Qm) {
case 2 :
- if (dlsch0_harq->mimo_mode != LARGE_CDD) {
- if (dual_stream_flag == 0)
+ if ((rx_type==rx_standard) || (codeword_TB0 == -1) || (codeword_TB1 == -1)) {
dlsch_qpsk_llr(frame_parms,
pdsch_vars[eNB_id]->rxdataF_comp0,
pdsch_vars[eNB_id]->llr[0],
- symbol,first_symbol_flag,nb_rb,
+ symbol,
+ first_symbol_flag,
+ nb_rb,
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
pdsch_vars[eNB_id]->llr128,
beamforming_mode);
- else if (i_mod == 2) {
- dlsch_qpsk_qpsk_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id_i]->rxdataF_comp0,
- pdsch_vars[eNB_id]->dl_ch_rho_ext,
- pdsch_vars[eNB_id]->llr[0],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
- pdsch_vars[eNB_id]->llr128);
- } else if (i_mod == 4) {
- dlsch_qpsk_16qam_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id_i]->rxdataF_comp0,
- pdsch_vars[eNB_id_i]->dl_ch_mag0,
- pdsch_vars[eNB_id]->dl_ch_rho_ext,
- pdsch_vars[eNB_id]->llr[0],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
- pdsch_vars[eNB_id]->llr128);
- } else {
- dlsch_qpsk_64qam_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id_i]->rxdataF_comp0,
- pdsch_vars[eNB_id_i]->dl_ch_mag0,
- pdsch_vars[eNB_id]->dl_ch_rho_ext,
- pdsch_vars[eNB_id]->llr[0],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
- pdsch_vars[eNB_id]->llr128);
-
- }
- } else { // TM3
- DevAssert(dlsch1_harq);
-
- if (dlsch1_harq->Qm == 2) {
- /* dlsch_qpsk_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id]->llr[0],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol),
- pdsch_vars[eNB_id]->llr128);
- */
- dlsch_qpsk_qpsk_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id]->rxdataF_comp1[dlsch0_harq->round],
- pdsch_vars[eNB_id]->dl_ch_rho_ext,
- pdsch_vars[eNB_id]->llr[0],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
- pdsch_vars[eNB_id]->llr128);
- dlsch_qpsk_qpsk_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp1[dlsch0_harq->round],
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id]->dl_ch_rho2_ext,
- pdsch_vars[eNB_id]->llr[1],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,subframe,symbol),
- pdsch_vars[eNB_id]->llr128_2ndstream);
- } else if (dlsch1_harq->Qm == 4) {
- dlsch_qpsk_16qam_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id]->rxdataF_comp1[dlsch0_harq->round],
- pdsch_vars[eNB_id]->dl_ch_mag1,
- pdsch_vars[eNB_id]->dl_ch_rho_ext,
- pdsch_vars[eNB_id]->llr[0],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
- pdsch_vars[eNB_id]->llr128);
- } else {
- dlsch_qpsk_64qam_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id]->rxdataF_comp1[dlsch0_harq->round],
- pdsch_vars[eNB_id]->dl_ch_mag1,
- pdsch_vars[eNB_id]->dl_ch_rho_ext,
- pdsch_vars[eNB_id]->llr[0],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
- pdsch_vars[eNB_id]->llr128);
-
- }
}
-
+ else if (rx_type >= rx_IC_single_stream) {
+ if (dlsch1_harq->Qm == 2) {
+ dlsch_qpsk_qpsk_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ rxdataF_comp_ptr,
+ pdsch_vars[eNB_id]->dl_ch_rho2_ext,
+ pdsch_vars[eNB_id]->llr[0],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
+ pdsch_vars[eNB_id]->llr128);
+ if (rx_type==rx_IC_dual_stream) {
+ dlsch_qpsk_qpsk_llr(frame_parms,
+ rxdataF_comp_ptr,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
+ pdsch_vars[eNB_id]->llr[1],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,subframe,symbol),
+ pdsch_vars[eNB_id]->llr128_2ndstream);
+ }
+ }
+ else if (dlsch1_harq->Qm == 4) {
+ dlsch_qpsk_16qam_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ rxdataF_comp_ptr,//i
+ dl_ch_mag_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_rho2_ext,
+ pdsch_vars[eNB_id]->llr[0],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
+ pdsch_vars[eNB_id]->llr128);
+ if (rx_type==rx_IC_dual_stream) {
+ dlsch_16qam_qpsk_llr(frame_parms,
+ rxdataF_comp_ptr,
+ pdsch_vars[eNB_id]->rxdataF_comp0,//i
+ dl_ch_mag_ptr,
+ pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
+ pdsch_vars[eNB_id]->llr[1],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,subframe,symbol),
+ pdsch_vars[eNB_id]->llr128_2ndstream);
+ }
+ }
+ else {
+ dlsch_qpsk_64qam_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ rxdataF_comp_ptr,//i
+ dl_ch_mag_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_rho2_ext,
+ pdsch_vars[eNB_id]->llr[0],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
+ pdsch_vars[eNB_id]->llr128);
+ if (rx_type==rx_IC_dual_stream) {
+ dlsch_64qam_qpsk_llr(frame_parms,
+ rxdataF_comp_ptr,
+ pdsch_vars[eNB_id]->rxdataF_comp0,//i
+ dl_ch_mag_ptr,
+ pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
+ pdsch_vars[eNB_id]->llr[1],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,subframe,symbol),
+ pdsch_vars[eNB_id]->llr128_2ndstream);
+ }
+ }
+ }
break;
-
case 4 :
- if (dual_stream_flag == 0) {
+ if ((rx_type==rx_standard ) || (codeword_TB0 == -1) || (codeword_TB1 == -1)) {
dlsch_16qam_llr(frame_parms,
pdsch_vars[eNB_id]->rxdataF_comp0,
pdsch_vars[eNB_id]->llr[0],
@@ -744,44 +814,82 @@ int rx_pdsch(PHY_VARS_UE *ue,
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol),
pdsch_vars[eNB_id]->llr128,
beamforming_mode);
- } else if (i_mod == 2) {
- dlsch_16qam_qpsk_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id_i]->rxdataF_comp0,
- pdsch_vars[eNB_id]->dl_ch_mag0,
- pdsch_vars[eNB_id]->dl_ch_rho_ext,
- pdsch_vars[eNB_id]->llr[0],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
- pdsch_vars[eNB_id]->llr128);
- } else if (i_mod == 4) {
- dlsch_16qam_16qam_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id_i]->rxdataF_comp0,
- pdsch_vars[eNB_id]->dl_ch_mag0,
- pdsch_vars[eNB_id_i]->dl_ch_mag0,
- pdsch_vars[eNB_id]->dl_ch_rho_ext,
- pdsch_vars[eNB_id]->llr[0],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
- pdsch_vars[eNB_id]->llr128);
- } else {
- dlsch_16qam_64qam_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id_i]->rxdataF_comp0,
- pdsch_vars[eNB_id]->dl_ch_mag0,
- pdsch_vars[eNB_id_i]->dl_ch_mag0,
- pdsch_vars[eNB_id]->dl_ch_rho_ext,
- pdsch_vars[eNB_id]->llr[0],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
- pdsch_vars[eNB_id]->llr128);
}
-
+ else if (rx_type >= rx_IC_single_stream) {
+ if (dlsch1_harq->Qm == 2) {
+ dlsch_16qam_qpsk_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ rxdataF_comp_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ pdsch_vars[eNB_id]->dl_ch_rho2_ext,
+ pdsch_vars[eNB_id]->llr[0],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol),
+ pdsch_vars[eNB_id]->llr128);
+ if (rx_type==rx_IC_dual_stream) {
+ dlsch_qpsk_16qam_llr(frame_parms,
+ rxdataF_comp_ptr,
+ pdsch_vars[eNB_id]->rxdataF_comp0,//i
+ pdsch_vars[eNB_id]->dl_ch_mag0,//i
+ pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
+ pdsch_vars[eNB_id]->llr[1],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,subframe,symbol),
+ pdsch_vars[eNB_id]->llr128_2ndstream);
+ }
+ }
+ else if (dlsch1_harq->Qm == 4) {
+ dlsch_16qam_16qam_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ rxdataF_comp_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ dl_ch_mag_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_rho2_ext,
+ pdsch_vars[eNB_id]->llr[0],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol),
+ pdsch_vars[eNB_id]->llr128);
+ if (rx_type==rx_IC_dual_stream) {
+ dlsch_16qam_16qam_llr(frame_parms,
+ rxdataF_comp_ptr,
+ pdsch_vars[eNB_id]->rxdataF_comp0,//i
+ dl_ch_mag_ptr,
+ pdsch_vars[eNB_id]->dl_ch_mag0,//i
+ pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
+ pdsch_vars[eNB_id]->llr[1],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,subframe,symbol),
+ pdsch_vars[eNB_id]->llr128_2ndstream);
+ }
+ }
+ else {
+ dlsch_16qam_64qam_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ rxdataF_comp_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ dl_ch_mag_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_rho2_ext,
+ pdsch_vars[eNB_id]->llr[0],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol),
+ pdsch_vars[eNB_id]->llr128);
+ if (rx_type==rx_IC_dual_stream) {
+ dlsch_64qam_16qam_llr(frame_parms,
+ rxdataF_comp_ptr,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ dl_ch_mag_ptr,
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
+ pdsch_vars[eNB_id]->llr[1],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,subframe,symbol),
+ pdsch_vars[eNB_id]->llr128_2ndstream);
+ }
+ }
+ }
break;
-
case 6 :
- if (dual_stream_flag == 0) {
+ if ((rx_type==rx_standard) || (codeword_TB0 == -1) || (codeword_TB1 == -1)) {
dlsch_64qam_llr(frame_parms,
pdsch_vars[eNB_id]->rxdataF_comp0,
pdsch_vars[eNB_id]->llr[0],
@@ -791,48 +899,130 @@ int rx_pdsch(PHY_VARS_UE *ue,
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol),
pdsch_vars[eNB_id]->llr128,
beamforming_mode);
- } else if (i_mod == 2) {
- dlsch_64qam_qpsk_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id_i]->rxdataF_comp0,
- pdsch_vars[eNB_id]->dl_ch_mag0,
- pdsch_vars[eNB_id]->dl_ch_rho_ext,
- pdsch_vars[eNB_id]->llr[0],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
- pdsch_vars[eNB_id]->llr128);
- } else if (i_mod == 4) {
- dlsch_64qam_16qam_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id_i]->rxdataF_comp0,
- pdsch_vars[eNB_id]->dl_ch_mag0,
- pdsch_vars[eNB_id_i]->dl_ch_mag0,
- pdsch_vars[eNB_id]->dl_ch_rho_ext,
- pdsch_vars[eNB_id]->llr[0],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
- pdsch_vars[eNB_id]->llr128);
-
- } else {
- dlsch_64qam_64qam_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id_i]->rxdataF_comp0,
- pdsch_vars[eNB_id]->dl_ch_mag0,
- pdsch_vars[eNB_id_i]->dl_ch_mag0,
- pdsch_vars[eNB_id]->dl_ch_rho_ext,
- pdsch_vars[eNB_id]->llr[0],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
- pdsch_vars[eNB_id]->llr128);
}
-
+ else if (rx_type >= rx_IC_single_stream) {
+ if (dlsch1_harq->Qm == 2) {
+ dlsch_64qam_qpsk_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ rxdataF_comp_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ pdsch_vars[eNB_id]->dl_ch_rho2_ext,
+ pdsch_vars[eNB_id]->llr[0],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol),
+ pdsch_vars[eNB_id]->llr128);
+ if (rx_type==rx_IC_dual_stream) {
+ dlsch_qpsk_64qam_llr(frame_parms,
+ rxdataF_comp_ptr,
+ pdsch_vars[eNB_id]->rxdataF_comp0,//i
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
+ pdsch_vars[eNB_id]->llr[1],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,subframe,symbol),
+ pdsch_vars[eNB_id]->llr128_2ndstream);
+ }
+ }
+ else if (dlsch1_harq->Qm == 4) {
+ dlsch_64qam_16qam_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ rxdataF_comp_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ dl_ch_mag_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_rho2_ext,
+ pdsch_vars[eNB_id]->llr[0],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol),
+ pdsch_vars[eNB_id]->llr128);
+ if (rx_type==rx_IC_dual_stream) {
+ dlsch_16qam_64qam_llr(frame_parms,
+ rxdataF_comp_ptr,
+ pdsch_vars[eNB_id]->rxdataF_comp0,//i
+ dl_ch_mag_ptr,
+ pdsch_vars[eNB_id]->dl_ch_mag0,//i
+ pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
+ pdsch_vars[eNB_id]->llr[1],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,subframe,symbol),
+ pdsch_vars[eNB_id]->llr128_2ndstream);
+ }
+ }
+ else {
+ dlsch_64qam_64qam_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ rxdataF_comp_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ dl_ch_mag_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_rho2_ext,
+ pdsch_vars[eNB_id]->llr[0],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol),
+ pdsch_vars[eNB_id]->llr128);
+ if (rx_type==rx_IC_dual_stream) {
+ dlsch_64qam_64qam_llr(frame_parms,
+ rxdataF_comp_ptr,
+ pdsch_vars[eNB_id]->rxdataF_comp0,//i
+ dl_ch_mag_ptr,
+ pdsch_vars[eNB_id]->dl_ch_mag0,//i
+ pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
+ pdsch_vars[eNB_id]->llr[1],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,subframe,symbol),
+ pdsch_vars[eNB_id]->llr128_2ndstream);
+ }
+ }
+ }
break;
-
default:
LOG_W(PHY,"rx_dlsch.c : Unknown mod_order!!!!\n");
return(-1);
break;
}
+ if (dlsch1_harq) {
+ switch (get_Qm(dlsch1_harq->mcs)) {
+ case 2 :
+ if (rx_type==rx_standard) {
+ dlsch_qpsk_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ pdsch_vars[eNB_id]->llr[0],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
+ pdsch_vars[eNB_id]->llr128,
+ beamforming_mode);
+ }
+ break;
+ case 4:
+ if (rx_type==rx_standard) {
+ dlsch_16qam_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ pdsch_vars[eNB_id]->llr[0],
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol),
+ pdsch_vars[eNB_id]->llr128,
+ beamforming_mode);
+ }
+ break;
+ case 6 :
+ if (rx_type==rx_standard) {
+ dlsch_64qam_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ pdsch_vars[eNB_id]->llr[0],
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ pdsch_vars[eNB_id]->dl_ch_magb0,
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol),
+ pdsch_vars[eNB_id]->llr128,
+ beamforming_mode);
+ }
+ break;
+ default:
+ LOG_W(PHY,"rx_dlsch.c : Unknown mod_order!!!!\n");
+ return(-1);
+ break;
+ }
+ }
+
#if T_TRACER
T(T_UE_PHY_PDSCH_IQ, T_INT(eNB_id), T_INT(ue->Mod_id), T_INT(frame%1024),
@@ -843,6 +1033,7 @@ int rx_pdsch(PHY_VARS_UE *ue,
#endif
return(0);
+
}
//==============================================================================================
@@ -861,7 +1052,7 @@ void dlsch_channel_compensation(int **rxdataF_ext,
unsigned char mod_order,
unsigned short nb_rb,
unsigned char output_shift,
- PHY_MEASUREMENTS *phy_measurements)
+ PHY_MEASUREMENTS *measurements)
{
#if defined(__i386) || defined(__x86_64)
@@ -919,9 +1110,9 @@ void dlsch_channel_compensation(int **rxdataF_ext,
dl_ch_mag128b[0] = dl_ch_mag128[0];
dl_ch_mag128[0] = _mm_mulhi_epi16(dl_ch_mag128[0],QAM_amp128);
dl_ch_mag128[0] = _mm_slli_epi16(dl_ch_mag128[0],1);
- //print_ints("Re(ch):",(int16_t*)&mmtmpD0);
- //print_shorts("QAM_amp:",(int16_t*)&QAM_amp128);
- //print_shorts("mag:",(int16_t*)&dl_ch_mag128[0]);
+ //print_ints("Re(ch):",(int16_t*)&mmtmpD0);
+ //print_shorts("QAM_amp:",(int16_t*)&QAM_amp128);
+ //print_shorts("mag:",(int16_t*)&dl_ch_mag128[0]);
dl_ch_mag128[1] = _mm_unpackhi_epi16(mmtmpD0,mmtmpD0);
dl_ch_mag128b[1] = dl_ch_mag128[1];
dl_ch_mag128[1] = _mm_mulhi_epi16(dl_ch_mag128[1],QAM_amp128);
@@ -1107,7 +1298,7 @@ void dlsch_channel_compensation(int **rxdataF_ext,
}
if (first_symbol_flag==1) {
- phy_measurements->rx_correlation[0][aarx] = signal_energy(&rho[aarx][symbol*frame_parms->N_RB_DL*12],rb*12);
+ measurements->rx_correlation[0][aarx] = signal_energy(&rho[aarx][symbol*frame_parms->N_RB_DL*12],rb*12);
}
}
}
@@ -1157,168 +1348,166 @@ void dlsch_channel_compensation(int **rxdataF_ext,
dl_ch_mag128b = (int16x8_t*)&dl_ch_magb[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12];
rxdataF128 = (int16x4_t*)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12];
rxdataF_comp128 = (int16x4x2_t*)&rxdataF_comp[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12];
-
+
for (rb=0; rb2) {
- // get channel amplitude if not QPSK
- mmtmpD0 = vmull_s16(dl_ch128[0], dl_ch128[0]);
- // mmtmpD0 = [ch0*ch0,ch1*ch1,ch2*ch2,ch3*ch3];
- mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
- // mmtmpD0 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3]>>output_shift128 on 32-bits
- mmtmpD1 = vmull_s16(dl_ch128[1], dl_ch128[1]);
- mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
- mmtmpD2 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
- // mmtmpD2 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3,ch4*ch4 + ch5*ch5,ch4*ch4 + ch5*ch5,ch6*ch6 + ch7*ch7,ch6*ch6 + ch7*ch7]>>output_shift128 on 16-bits
- mmtmpD0 = vmull_s16(dl_ch128[2], dl_ch128[2]);
- mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
- mmtmpD1 = vmull_s16(dl_ch128[3], dl_ch128[3]);
- mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
- mmtmpD3 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
- if (pilots==0) {
- mmtmpD0 = vmull_s16(dl_ch128[4], dl_ch128[4]);
- mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
- mmtmpD1 = vmull_s16(dl_ch128[5], dl_ch128[5]);
- mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
- mmtmpD4 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
- }
+ if (mod_order>2) {
+ // get channel amplitude if not QPSK
+ mmtmpD0 = vmull_s16(dl_ch128[0], dl_ch128[0]);
+ // mmtmpD0 = [ch0*ch0,ch1*ch1,ch2*ch2,ch3*ch3];
+ mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
+ // mmtmpD0 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3]>>output_shift128 on 32-bits
+ mmtmpD1 = vmull_s16(dl_ch128[1], dl_ch128[1]);
+ mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
+ mmtmpD2 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
+ // mmtmpD2 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3,ch4*ch4 + ch5*ch5,ch4*ch4 + ch5*ch5,ch6*ch6 + ch7*ch7,ch6*ch6 + ch7*ch7]>>output_shift128 on 16-bits
+ mmtmpD0 = vmull_s16(dl_ch128[2], dl_ch128[2]);
+ mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
+ mmtmpD1 = vmull_s16(dl_ch128[3], dl_ch128[3]);
+ mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
+ mmtmpD3 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
+ if (pilots==0) {
+ mmtmpD0 = vmull_s16(dl_ch128[4], dl_ch128[4]);
+ mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
+ mmtmpD1 = vmull_s16(dl_ch128[5], dl_ch128[5]);
+ mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
+ mmtmpD4 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
+ }
- dl_ch_mag128b[0] = vqdmulhq_s16(mmtmpD2,QAM_amp128b);
- dl_ch_mag128b[1] = vqdmulhq_s16(mmtmpD3,QAM_amp128b);
- dl_ch_mag128[0] = vqdmulhq_s16(mmtmpD2,QAM_amp128);
- dl_ch_mag128[1] = vqdmulhq_s16(mmtmpD3,QAM_amp128);
+ dl_ch_mag128b[0] = vqdmulhq_s16(mmtmpD2,QAM_amp128b);
+ dl_ch_mag128b[1] = vqdmulhq_s16(mmtmpD3,QAM_amp128b);
+ dl_ch_mag128[0] = vqdmulhq_s16(mmtmpD2,QAM_amp128);
+ dl_ch_mag128[1] = vqdmulhq_s16(mmtmpD3,QAM_amp128);
- if (pilots==0) {
- dl_ch_mag128b[2] = vqdmulhq_s16(mmtmpD4,QAM_amp128b);
- dl_ch_mag128[2] = vqdmulhq_s16(mmtmpD4,QAM_amp128);
- }
- }
-
- mmtmpD0 = vmull_s16(dl_ch128[0], rxdataF128[0]);
- //mmtmpD0 = [Re(ch[0])Re(rx[0]) Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1]) Im(ch[1])Im(ch[1])]
- mmtmpD1 = vmull_s16(dl_ch128[1], rxdataF128[1]);
- //mmtmpD1 = [Re(ch[2])Re(rx[2]) Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3]) Im(ch[3])Im(ch[3])]
- mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)),
- vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
- //mmtmpD0 = [Re(ch[0])Re(rx[0])+Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1])+Im(ch[1])Im(ch[1]) Re(ch[2])Re(rx[2])+Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3])+Im(ch[3])Im(ch[3])]
+ if (pilots==0) {
+ dl_ch_mag128b[2] = vqdmulhq_s16(mmtmpD4,QAM_amp128b);
+ dl_ch_mag128[2] = vqdmulhq_s16(mmtmpD4,QAM_amp128);
+ }
+ }
- mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[0],*(int16x4_t*)conj)), rxdataF128[0]);
- //mmtmpD0 = [-Im(ch[0])Re(rx[0]) Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1]) Re(ch[1])Im(rx[1])]
- mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[1],*(int16x4_t*)conj)), rxdataF128[1]);
- //mmtmpD0 = [-Im(ch[2])Re(rx[2]) Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3]) Re(ch[3])Im(rx[3])]
- mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)),
- vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
- //mmtmpD1 = [-Im(ch[0])Re(rx[0])+Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1])+Re(ch[1])Im(rx[1]) -Im(ch[2])Re(rx[2])+Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3])+Re(ch[3])Im(rx[3])]
+ mmtmpD0 = vmull_s16(dl_ch128[0], rxdataF128[0]);
+ //mmtmpD0 = [Re(ch[0])Re(rx[0]) Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1]) Im(ch[1])Im(ch[1])]
+ mmtmpD1 = vmull_s16(dl_ch128[1], rxdataF128[1]);
+ //mmtmpD1 = [Re(ch[2])Re(rx[2]) Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3]) Im(ch[3])Im(ch[3])]
+ mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)),
+ vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
+ //mmtmpD0 = [Re(ch[0])Re(rx[0])+Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1])+Im(ch[1])Im(ch[1]) Re(ch[2])Re(rx[2])+Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3])+Im(ch[3])Im(ch[3])]
- mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128);
- mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128);
- rxdataF_comp128[0] = vzip_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
- mmtmpD0 = vmull_s16(dl_ch128[2], rxdataF128[2]);
- mmtmpD1 = vmull_s16(dl_ch128[3], rxdataF128[3]);
- mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)),
- vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
- mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[2],*(int16x4_t*)conj)), rxdataF128[2]);
- mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[3],*(int16x4_t*)conj)), rxdataF128[3]);
- mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)),
- vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
- mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128);
- mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128);
- rxdataF_comp128[1] = vzip_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
+ mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[0],*(int16x4_t*)conj)), rxdataF128[0]);
+ //mmtmpD0 = [-Im(ch[0])Re(rx[0]) Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1]) Re(ch[1])Im(rx[1])]
+ mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[1],*(int16x4_t*)conj)), rxdataF128[1]);
+ //mmtmpD0 = [-Im(ch[2])Re(rx[2]) Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3]) Re(ch[3])Im(rx[3])]
+ mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)),
+ vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
+ //mmtmpD1 = [-Im(ch[0])Re(rx[0])+Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1])+Re(ch[1])Im(rx[1]) -Im(ch[2])Re(rx[2])+Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3])+Re(ch[3])Im(rx[3])]
- if (pilots==0) {
- mmtmpD0 = vmull_s16(dl_ch128[4], rxdataF128[4]);
- mmtmpD1 = vmull_s16(dl_ch128[5], rxdataF128[5]);
- mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)),
- vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
+ mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128);
+ mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128);
+ rxdataF_comp128[0] = vzip_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
+ mmtmpD0 = vmull_s16(dl_ch128[2], rxdataF128[2]);
+ mmtmpD1 = vmull_s16(dl_ch128[3], rxdataF128[3]);
+ mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)),
+ vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
+ mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[2],*(int16x4_t*)conj)), rxdataF128[2]);
+ mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[3],*(int16x4_t*)conj)), rxdataF128[3]);
+ mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)),
+ vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
+ mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128);
+ mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128);
+ rxdataF_comp128[1] = vzip_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
- mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[4],*(int16x4_t*)conj)), rxdataF128[4]);
- mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[5],*(int16x4_t*)conj)), rxdataF128[5]);
- mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)),
- vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
+ if (pilots==0) {
+ mmtmpD0 = vmull_s16(dl_ch128[4], rxdataF128[4]);
+ mmtmpD1 = vmull_s16(dl_ch128[5], rxdataF128[5]);
+ mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)),
+ vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
-
- mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128);
- mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128);
- rxdataF_comp128[2] = vzip_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
-
-
- dl_ch128+=6;
- dl_ch_mag128+=3;
- dl_ch_mag128b+=3;
- rxdataF128+=6;
- rxdataF_comp128+=3;
-
- } else { // we have a smaller PDSCH in symbols with pilots so skip last group of 4 REs and increment less
- dl_ch128+=4;
- dl_ch_mag128+=2;
- dl_ch_mag128b+=2;
- rxdataF128+=4;
- rxdataF_comp128+=2;
- }
+ mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[4],*(int16x4_t*)conj)), rxdataF128[4]);
+ mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[5],*(int16x4_t*)conj)), rxdataF128[5]);
+ mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)),
+ vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
+
+
+ mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128);
+ mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128);
+ rxdataF_comp128[2] = vzip_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
+
+
+ dl_ch128+=6;
+ dl_ch_mag128+=3;
+ dl_ch_mag128b+=3;
+ rxdataF128+=6;
+ rxdataF_comp128+=3;
+
+ } else { // we have a smaller PDSCH in symbols with pilots so skip last group of 4 REs and increment less
+ dl_ch128+=4;
+ dl_ch_mag128+=2;
+ dl_ch_mag128b+=2;
+ rxdataF128+=4;
+ rxdataF_comp128+=2;
+ }
}
}
}
-
+
if (rho) {
for (aarx=0; aarxnb_antennas_rx; aarx++) {
rho128 = (int16x4x2_t*)&rho[aarx][symbol*frame_parms->N_RB_DL*12];
dl_ch128 = (int16x4_t*)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12];
dl_ch128_2 = (int16x4_t*)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12];
for (rb=0; rbrx_correlation[0][aarx] = signal_energy(&rho[aarx][symbol*frame_parms->N_RB_DL*12],rb*12);
+ measurements->rx_correlation[0][aarx] = signal_energy(&rho[aarx][symbol*frame_parms->N_RB_DL*12],rb*12);
}
}
}
#endif
}
-
-
#if defined(__x86_64__) || defined(__i386__)
void prec2A_TM56_128(unsigned char pmi,__m128i *ch0,__m128i *ch1)
@@ -1364,56 +1553,54 @@ void prec2A_TM56_128(unsigned char pmi,__m128i *ch0,__m128i *ch1)
_mm_empty();
_m_empty();
}
-
#elif defined(__arm__)
-void prec2A_TM56_128(unsigned char pmi,int16x8_t* ch0,int16x8_t* ch1) {
+void prec2A_TM56_128(unsigned char pmi,__m128i *ch0,__m128i *ch1) {
- int16x8_t amp;
- int16_t conj[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
-
- amp = vmovq_n_s16(ONE_OVER_SQRT2_Q15);
+ __m128i amp;
+ amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15);
switch (pmi) {
+
case 0 : // +1 +1
// print_shorts("phase 0 :ch0",ch0);
// print_shorts("phase 0 :ch1",ch1);
- ch0[0] = vqaddq_s16(ch0[0],ch1[0]);
+ ch0[0] = _mm_adds_epi16(ch0[0],ch1[0]);
break;
-
case 1 : // +1 -1
// print_shorts("phase 1 :ch0",ch0);
// print_shorts("phase 1 :ch1",ch1);
- ch0[0] = vqsubq_s16(ch0[0],ch1[0]);
+ ch0[0] = _mm_subs_epi16(ch0[0],ch1[0]);
// print_shorts("phase 1 :ch0-ch1",ch0);
break;
-
case 2 : // +1 +j
- ch1[0] = vrev32q_s16(vmulq_s16(ch1[0],*(int16x8_t*)conj));
- ch0[0] = vqsubq_s16(ch0[0],ch1[0]);
+ ch1[0] = _mm_sign_epi16(ch1[0],*(__m128i*)&conjugate[0]);
+ ch1[0] = _mm_shufflelo_epi16(ch1[0],_MM_SHUFFLE(2,3,0,1));
+ ch1[0] = _mm_shufflehi_epi16(ch1[0],_MM_SHUFFLE(2,3,0,1));
+ ch0[0] = _mm_subs_epi16(ch0[0],ch1[0]);
+
break; // +1 -j
-
case 3 :
- ch1[0] = vrev32q_s16(vmulq_s16(ch1[0],*(int16x8_t*)conj));
- ch0[0] = vqaddq_s16(ch0[0],ch1[0]);
+ ch1[0] = _mm_sign_epi16(ch1[0],*(__m128i*)&conjugate[0]);
+ ch1[0] = _mm_shufflelo_epi16(ch1[0],_MM_SHUFFLE(2,3,0,1));
+ ch1[0] = _mm_shufflehi_epi16(ch1[0],_MM_SHUFFLE(2,3,0,1));
+ ch0[0] = _mm_adds_epi16(ch0[0],ch1[0]);
break;
}
-
- ch0[0] = vqdmulhq_s16(ch0[0],amp);
+
+ ch0[0] = _mm_mulhi_epi16(ch0[0],amp);
+ ch0[0] = _mm_slli_epi16(ch0[0],1);
+
+ _mm_empty();
+ _m_empty();
}
-
#endif
-
// precoding is stream 0 .5(1,1) .5(1,-1) .5(1,1) .5(1,-1)
// stream 1 .5(1,-1) .5(1,1) .5(1,-1) .5(1,1)
// store "precoded" channel for stream 0 in ch0, stream 1 in ch1
short TM3_prec[8]__attribute__((aligned(16))) = {1,1,-1,-1,1,1,-1,-1} ;
-#if defined(__x86_64__) || defined(__i386__)
-
-static inline void prec2A_TM3_128(__m128i *ch0,__m128i *ch1) __attribute__((always_inline));
-static inline void prec2A_TM3_128(__m128i *ch0,__m128i *ch1)
-{
+void prec2A_TM3_128(__m128i *ch0,__m128i *ch1) {
// __m128i amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15);
@@ -1441,79 +1628,57 @@ static inline void prec2A_TM3_128(__m128i *ch0,__m128i *ch1)
// print_shorts("prec2A_TM3 ch0 (after):",ch0);
// print_shorts("prec2A_TM3 ch1 (after):",ch1);
+ _mm_empty();
+ _m_empty();
}
-#elif defined(__arm__)
-
-void prec2A_TM3_128(int16x8_t* ch0, int16x8_t* ch1)
-{
-
- int16x8_t tmp0,tmp1;
-
- tmp0 = ch0[0];
- tmp1 = vmulq_s16(ch1[0],((int16x8_t*)&TM3_prec)[0]);
- ch0[0] = vhaddq_s16(ch0[0],tmp1);
- ch1[0] = vhsubq_s16(tmp0,tmp1);
-}
-
-#endif
-
// pmi = 0 => stream 0 (1,1), stream 1 (1,-1)
// pmi = 1 => stream 0 (1,j), stream 2 (1,-j)
-#if defined(__x86_64__) || defined(__i386__)
+void prec2A_TM4_128(int pmi,__m128i *ch0,__m128i *ch1) {
-void prec2A_TM4_128(int pmi,__m128i *ch0,__m128i *ch1)
-{
-
- __m128i amp;
- amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15);
+ // printf ("demod pmi=%d\n", pmi);
+ // __m128i amp;
+ // amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15);
__m128i tmp0,tmp1;
- if (pmi == 0) {
- ch0[0] = _mm_adds_epi16(ch0[0],ch1[0]);
- ch1[0] = _mm_subs_epi16(ch0[0],ch1[0]);
- } else {
+ // print_shorts("prec2A_TM4 ch0 (before):",ch0);
+ // print_shorts("prec2A_TM4 ch1 (before):",ch1);
+
+ if (pmi == 0) { //[1 1;1 -1]
+ tmp0 = ch0[0];
+ tmp1 = ch1[0];
+ ch0[0] = _mm_adds_epi16(tmp0,tmp1);
+ ch1[0] = _mm_subs_epi16(tmp0,tmp1);
+ }
+ else { //ch0+j*ch1 ch0-j*ch1
tmp0 = ch0[0];
tmp1 = _mm_sign_epi16(ch1[0],*(__m128i*)&conjugate[0]);
tmp1 = _mm_shufflelo_epi16(tmp1,_MM_SHUFFLE(2,3,0,1));
tmp1 = _mm_shufflehi_epi16(tmp1,_MM_SHUFFLE(2,3,0,1));
- ch0[0] = _mm_adds_epi16(tmp0,tmp1);
- ch1[0] = _mm_subs_epi16(tmp0,tmp1);
+ ch0[0] = _mm_subs_epi16(tmp0,tmp1);
+ ch1[0] = _mm_add_epi16(tmp0,tmp1);
}
- ch0[0] = _mm_mulhi_epi16(ch0[0],amp);
- ch0[0] = _mm_slli_epi16(ch0[0],1);
- ch1[0] = _mm_mulhi_epi16(ch1[0],amp);
- ch1[0] = _mm_slli_epi16(ch1[0],1);
+ //print_shorts("prec2A_TM4 ch0 (middle):",ch0);
+ //print_shorts("prec2A_TM4 ch1 (middle):",ch1);
+ //ch0[0] = _mm_mulhi_epi16(ch0[0],amp);
+ //ch0[0] = _mm_slli_epi16(ch0[0],1);
+ //ch1[0] = _mm_mulhi_epi16(ch1[0],amp);
+ //ch1[0] = _mm_slli_epi16(ch1[0],1);
+
+
+ ch0[0] = _mm_srai_epi16(ch0[0],1); //divide by 2
+ ch1[0] = _mm_srai_epi16(ch1[0],1); //divide by 2
+ //print_shorts("prec2A_TM4 ch0 (end):",ch0);
+ //print_shorts("prec2A_TM4 ch1 (end):",ch1);
+ _mm_empty();
+ _m_empty();
+ // print_shorts("prec2A_TM4 ch0 (end):",ch0);
+ //print_shorts("prec2A_TM4 ch1 (end):",ch1);
}
-#elif defined(__arm__)
-
-void prec2A_TM4_128(int pmi,int16x8_t *ch0,int16x8_t *ch1)
-{
- int16x8_t amp;
- int16x8_t tmp0,tmp1;
- int16_t conj[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
-
- amp = vmovq_n_s16(ONE_OVER_SQRT2_Q15);
-
- if (pmi == 0) {
- ch0[0] = vqaddq_s16(ch0[0],ch1[0]);
- ch1[0] = vqsubq_s16(ch0[0],ch1[0]);
- } else {
- tmp0 = ch0[0];
- tmp1 = vrev32q_s16(vmulq_s16(ch1[0],*(int16x8_t*)conj));
- ch0[0] = vqaddq_s16(tmp0,tmp1);
- ch1[0] = vqsubq_s16(tmp0,tmp1);
- }
-
- ch0[0] = vqdmulhq_s16(ch0[0],amp);
- ch1[0] = vqdmulhq_s16(ch1[0],amp);
-}
-#endif
-
void dlsch_channel_compensation_TM56(int **rxdataF_ext,
int **dl_ch_estimates_ext,
int **dl_ch_mag,
@@ -1521,7 +1686,7 @@ void dlsch_channel_compensation_TM56(int **rxdataF_ext,
int **rxdataF_comp,
unsigned char *pmi_ext,
LTE_DL_FRAME_PARMS *frame_parms,
- PHY_MEASUREMENTS *phy_measurements,
+ PHY_MEASUREMENTS *measurements,
int eNB_id,
unsigned char symbol,
unsigned char mod_order,
@@ -1575,6 +1740,7 @@ void dlsch_channel_compensation_TM56(int **rxdataF_ext,
prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128[1],&dl_ch1_128[1]);
if (pilots==0) {
+
prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128[2],&dl_ch1_128[2]);
}
@@ -1594,6 +1760,9 @@ void dlsch_channel_compensation_TM56(int **rxdataF_ext,
dl_ch_mag128[0] = _mm_mulhi_epi16(dl_ch_mag128[0],QAM_amp128);
dl_ch_mag128[0] = _mm_slli_epi16(dl_ch_mag128[0],1);
+
+ //print_shorts("dl_ch_mag128[0]=",&dl_ch_mag128[0]);
+
//print_shorts("dl_ch_mag128[0]=",&dl_ch_mag128[0]);
dl_ch_mag128[1] = _mm_unpackhi_epi16(mmtmpD0,mmtmpD0);
@@ -1625,32 +1794,34 @@ void dlsch_channel_compensation_TM56(int **rxdataF_ext,
if (pilots==0) {
dl_ch_mag128b[2] = _mm_mulhi_epi16(dl_ch_mag128b[2],QAM_amp128b);
dl_ch_mag128b[2] = _mm_slli_epi16(dl_ch_mag128b[2],1);
+
}
}
// MF multiply by conjugated channel
mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],rxdataF128[0]);
- // print_ints("re",&mmtmpD0);
+ // print_ints("re",&mmtmpD0);
// mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[0],_MM_SHUFFLE(2,3,0,1));
mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]);
- // print_ints("im",&mmtmpD1);
+
+ // print_ints("im",&mmtmpD1);
mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[0]);
// mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
- // print_ints("re(shift)",&mmtmpD0);
+ // print_ints("re(shift)",&mmtmpD0);
mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
- // print_ints("im(shift)",&mmtmpD1);
+ // print_ints("im(shift)",&mmtmpD1);
mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
// print_ints("c0",&mmtmpD2);
- // print_ints("c1",&mmtmpD3);
+ // print_ints("c1",&mmtmpD3);
rxdataF_comp128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
- // print_shorts("rx:",rxdataF128);
- // print_shorts("ch:",dl_ch128);
- // print_shorts("pack:",rxdataF_comp128);
+ // print_shorts("rx:",rxdataF128);
+ // print_shorts("ch:",dl_ch128);
+ // print_shorts("pack:",rxdataF_comp128);
// multiply by conjugated channel
mmtmpD0 = _mm_madd_epi16(dl_ch0_128[1],rxdataF128[1]);
@@ -1708,57 +1879,54 @@ void dlsch_channel_compensation_TM56(int **rxdataF_ext,
Nre = (pilots==0) ? 12 : 8;
precoded_signal_strength += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre],
- (nb_rb*Nre))) - (phy_measurements->n0_power[aarx]));
+ (nb_rb*Nre))) - (measurements->n0_power[aarx]));
} // rx_antennas
- phy_measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength,phy_measurements->n0_power_tot);
+ measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength,measurements->n0_power_tot);
//printf("eNB_id %d, symbol %d: precoded CQI %d dB\n",eNB_id,symbol,
- // phy_measurements->precoded_cqi_dB[eNB_id][0]);
-
- _mm_empty();
- _m_empty();
+ // measurements->precoded_cqi_dB[eNB_id][0]);
#elif defined(__arm__)
uint32_t rb,Nre;
uint32_t aarx,symbol_mod,pilots=0;
-
+
int16x4_t *dl_ch0_128,*dl_ch1_128,*rxdataF128;
int16x8_t *dl_ch0_128b,*dl_ch1_128b;
int32x4_t mmtmpD0,mmtmpD1,mmtmpD0b,mmtmpD1b;
int16x8_t *dl_ch_mag128,*dl_ch_mag128b,mmtmpD2,mmtmpD3,mmtmpD4,*rxdataF_comp128;
int16x8_t QAM_amp128,QAM_amp128b;
-
+
int16_t conj[4]__attribute__((aligned(16))) = {1,-1,1,-1};
int32x4_t output_shift128 = vmovq_n_s32(-(int32_t)output_shift);
int32_t precoded_signal_strength=0;
-
- symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
+
+ symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) {
if (frame_parms->mode1_flag==1) // 10 out of 12 so don't reduce size
{ nb_rb=1+(5*nb_rb/6); }
-
+
else
{ pilots=1; }
}
-
-
+
+
if (mod_order == 4) {
QAM_amp128 = vmovq_n_s16(QAM16_n1); // 2/sqrt(10)
QAM_amp128b = vmovq_n_s16(0);
-
+
} else if (mod_order == 6) {
QAM_amp128 = vmovq_n_s16(QAM64_n1); //
QAM_amp128b = vmovq_n_s16(QAM64_n2);
}
-
+
// printf("comp: rxdataF_comp %p, symbol %d\n",rxdataF_comp[0],symbol);
-
+
for (aarx=0; aarxnb_antennas_rx; aarx++) {
-
-
-
+
+
+
dl_ch0_128 = (int16x4_t*)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12];
dl_ch1_128 = (int16x4_t*)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12];
dl_ch0_128b = (int16x8_t*)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12];
@@ -1767,144 +1935,153 @@ void dlsch_channel_compensation_TM56(int **rxdataF_ext,
dl_ch_mag128b = (int16x8_t*)&dl_ch_magb[aarx][symbol*frame_parms->N_RB_DL*12];
rxdataF128 = (int16x4_t*)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12];
rxdataF_comp128 = (int16x8_t*)&rxdataF_comp[aarx][symbol*frame_parms->N_RB_DL*12];
-
+
for (rb=0; rb%d\n",rb,pmi_ext[rb]);
#endif
prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128b[0],&dl_ch1_128b[0]);
prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128b[1],&dl_ch1_128b[1]);
-
+
if (pilots==0) {
- prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128b[2],&dl_ch1_128b[2]);
+ prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128b[2],&dl_ch1_128b[2]);
}
-
+
if (mod_order>2) {
- // get channel amplitude if not QPSK
- mmtmpD0 = vmull_s16(dl_ch0_128[0], dl_ch0_128[0]);
- // mmtmpD0 = [ch0*ch0,ch1*ch1,ch2*ch2,ch3*ch3];
- mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
- // mmtmpD0 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3]>>output_shift128 on 32-bits
- mmtmpD1 = vmull_s16(dl_ch0_128[1], dl_ch0_128[1]);
- mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
- mmtmpD2 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
- // mmtmpD2 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3,ch4*ch4 + ch5*ch5,ch4*ch4 + ch5*ch5,ch6*ch6 + ch7*ch7,ch6*ch6 + ch7*ch7]>>output_shift128 on 16-bits
- mmtmpD0 = vmull_s16(dl_ch0_128[2], dl_ch0_128[2]);
- mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
- mmtmpD1 = vmull_s16(dl_ch0_128[3], dl_ch0_128[3]);
- mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
- mmtmpD3 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
- if (pilots==0) {
- mmtmpD0 = vmull_s16(dl_ch0_128[4], dl_ch0_128[4]);
- mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
- mmtmpD1 = vmull_s16(dl_ch0_128[5], dl_ch0_128[5]);
- mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
- mmtmpD4 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
-
-
- }
-
- dl_ch_mag128b[0] = vqdmulhq_s16(mmtmpD2,QAM_amp128b);
- dl_ch_mag128b[1] = vqdmulhq_s16(mmtmpD3,QAM_amp128b);
- dl_ch_mag128[0] = vqdmulhq_s16(mmtmpD2,QAM_amp128);
- dl_ch_mag128[1] = vqdmulhq_s16(mmtmpD3,QAM_amp128);
-
-
- if (pilots==0) {
- dl_ch_mag128b[2] = vqdmulhq_s16(mmtmpD4,QAM_amp128b);
- dl_ch_mag128[2] = vqdmulhq_s16(mmtmpD4,QAM_amp128);
- }
+ // get channel amplitude if not QPSK
+ mmtmpD0 = vmull_s16(dl_ch0_128[0], dl_ch0_128[0]);
+ // mmtmpD0 = [ch0*ch0,ch1*ch1,ch2*ch2,ch3*ch3];
+ mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
+ // mmtmpD0 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3]>>output_shift128 on 32-bits
+ mmtmpD1 = vmull_s16(dl_ch0_128[1], dl_ch0_128[1]);
+ mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
+ mmtmpD2 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
+ // mmtmpD2 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3,ch4*ch4 + ch5*ch5,ch4*ch4 + ch5*ch5,ch6*ch6 + ch7*ch7,ch6*ch6 + ch7*ch7]>>output_shift128 on 16-bits
+ mmtmpD0 = vmull_s16(dl_ch0_128[2], dl_ch0_128[2]);
+ mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
+ mmtmpD1 = vmull_s16(dl_ch0_128[3], dl_ch0_128[3]);
+ mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
+ mmtmpD3 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
+ if (pilots==0) {
+ mmtmpD0 = vmull_s16(dl_ch0_128[4], dl_ch0_128[4]);
+ mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
+ mmtmpD1 = vmull_s16(dl_ch0_128[5], dl_ch0_128[5]);
+ mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
+ mmtmpD4 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
+
+
+ }
+
+ dl_ch_mag128b[0] = vqdmulhq_s16(mmtmpD2,QAM_amp128b);
+ dl_ch_mag128b[1] = vqdmulhq_s16(mmtmpD3,QAM_amp128b);
+ dl_ch_mag128[0] = vqdmulhq_s16(mmtmpD2,QAM_amp128);
+ dl_ch_mag128[1] = vqdmulhq_s16(mmtmpD3,QAM_amp128);
+
+
+ if (pilots==0) {
+ dl_ch_mag128b[2] = vqdmulhq_s16(mmtmpD4,QAM_amp128b);
+ dl_ch_mag128[2] = vqdmulhq_s16(mmtmpD4,QAM_amp128);
+ }
}
mmtmpD0 = vmull_s16(dl_ch0_128[0], rxdataF128[0]);
- //mmtmpD0 = [Re(ch[0])Re(rx[0]) Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1]) Im(ch[1])Im(ch[1])]
+ //mmtmpD0 = [Re(ch[0])Re(rx[0]) Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1]) Im(ch[1])Im(ch[1])]
mmtmpD1 = vmull_s16(dl_ch0_128[1], rxdataF128[1]);
- //mmtmpD1 = [Re(ch[2])Re(rx[2]) Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3]) Im(ch[3])Im(ch[3])]
+ //mmtmpD1 = [Re(ch[2])Re(rx[2]) Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3]) Im(ch[3])Im(ch[3])]
mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)),
- vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
- //mmtmpD0 = [Re(ch[0])Re(rx[0])+Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1])+Im(ch[1])Im(ch[1]) Re(ch[2])Re(rx[2])+Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3])+Im(ch[3])Im(ch[3])]
-
+ vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
+ //mmtmpD0 = [Re(ch[0])Re(rx[0])+Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1])+Im(ch[1])Im(ch[1]) Re(ch[2])Re(rx[2])+Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3])+Im(ch[3])Im(ch[3])]
+
mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[0],*(int16x4_t*)conj)), rxdataF128[0]);
//mmtmpD0 = [-Im(ch[0])Re(rx[0]) Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1]) Re(ch[1])Im(rx[1])]
mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[1],*(int16x4_t*)conj)), rxdataF128[1]);
//mmtmpD0 = [-Im(ch[2])Re(rx[2]) Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3]) Re(ch[3])Im(rx[3])]
mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)),
- vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
+ vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
//mmtmpD1 = [-Im(ch[0])Re(rx[0])+Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1])+Re(ch[1])Im(rx[1]) -Im(ch[2])Re(rx[2])+Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3])+Re(ch[3])Im(rx[3])]
-
+
mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128);
mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128);
rxdataF_comp128[0] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
-
+
mmtmpD0 = vmull_s16(dl_ch0_128[2], rxdataF128[2]);
mmtmpD1 = vmull_s16(dl_ch0_128[3], rxdataF128[3]);
mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)),
- vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
-
+ vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
+
mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[2],*(int16x4_t*)conj)), rxdataF128[2]);
mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[3],*(int16x4_t*)conj)), rxdataF128[3]);
mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)),
- vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
-
+ vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
+
mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128);
mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128);
rxdataF_comp128[1] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
-
+
if (pilots==0) {
- mmtmpD0 = vmull_s16(dl_ch0_128[4], rxdataF128[4]);
- mmtmpD1 = vmull_s16(dl_ch0_128[5], rxdataF128[5]);
- mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)),
- vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
-
- mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[4],*(int16x4_t*)conj)), rxdataF128[4]);
- mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[5],*(int16x4_t*)conj)), rxdataF128[5]);
- mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)),
- vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
-
-
- mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128);
- mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128);
- rxdataF_comp128[2] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
-
-
- dl_ch0_128+=6;
- dl_ch1_128+=6;
- dl_ch_mag128+=3;
- dl_ch_mag128b+=3;
- rxdataF128+=6;
- rxdataF_comp128+=3;
-
+ mmtmpD0 = vmull_s16(dl_ch0_128[4], rxdataF128[4]);
+ mmtmpD1 = vmull_s16(dl_ch0_128[5], rxdataF128[5]);
+ mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)),
+ vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
+
+ mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[4],*(int16x4_t*)conj)), rxdataF128[4]);
+ mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[5],*(int16x4_t*)conj)), rxdataF128[5]);
+ mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)),
+ vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
+
+
+ mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128);
+ mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128);
+ rxdataF_comp128[2] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
+
+
+ dl_ch0_128+=6;
+ dl_ch1_128+=6;
+ dl_ch_mag128+=3;
+ dl_ch_mag128b+=3;
+ rxdataF128+=6;
+ rxdataF_comp128+=3;
+
} else { // we have a smaller PDSCH in symbols with pilots so skip last group of 4 REs and increment less
- dl_ch0_128+=4;
- dl_ch1_128+=4;
- dl_ch_mag128+=2;
- dl_ch_mag128b+=2;
- rxdataF128+=4;
- rxdataF_comp128+=2;
+ dl_ch0_128+=4;
+ dl_ch1_128+=4;
+ dl_ch_mag128+=2;
+ dl_ch_mag128b+=2;
+ rxdataF128+=4;
+ rxdataF_comp128+=2;
}
}
-
+
Nre = (pilots==0) ? 12 : 8;
-
+
+
precoded_signal_strength += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre],
- (nb_rb*Nre))) - (phy_measurements->n0_power[aarx]));
+
+ (nb_rb*Nre))) - (measurements->n0_power[aarx]));
// rx_antennas
}
- phy_measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength,phy_measurements->n0_power_tot);
-
+ measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength,measurements->n0_power_tot);
+
+ //printf("eNB_id %d, symbol %d: precoded CQI %d dB\n",eNB_id,symbol,
+ // measurements->precoded_cqi_dB[eNB_id][0]);
+
#endif
+ _mm_empty();
+ _m_empty();
}
-void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
+void dlsch_channel_compensation_TM34(LTE_DL_FRAME_PARMS *frame_parms,
LTE_UE_PDSCH *pdsch_vars,
PHY_MEASUREMENTS *measurements,
int eNB_id,
unsigned char symbol,
unsigned char mod_order0,
unsigned char mod_order1,
+ int harq_pid,
int round,
+ MIMO_mode_t mimo_mode,
unsigned short nb_rb,
- unsigned char output_shift)
-{
+ unsigned char output_shift0,
+ unsigned char output_shift1) {
#if defined(__x86_64__) || defined(__i386__)
@@ -1912,25 +2089,28 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
__m128i *dl_ch0_128,*dl_ch1_128,*dl_ch_mag0_128,*dl_ch_mag1_128,*dl_ch_mag0_128b,*dl_ch_mag1_128b,*rxdataF128,*rxdataF_comp0_128,*rxdataF_comp1_128;
unsigned char aarx=0,symbol_mod,pilots=0;
int precoded_signal_strength0=0,precoded_signal_strength1=0;
+ int rx_power_correction;
+ int output_shift;
int **rxdataF_ext = pdsch_vars->rxdataF_ext;
int **dl_ch_estimates_ext = pdsch_vars->dl_ch_estimates_ext;
int **dl_ch_mag0 = pdsch_vars->dl_ch_mag0;
- int **dl_ch_mag1 = pdsch_vars->dl_ch_mag1;
+ int **dl_ch_mag1 = pdsch_vars->dl_ch_mag1[harq_pid][round];
int **dl_ch_magb0 = pdsch_vars->dl_ch_magb0;
- int **dl_ch_magb1 = pdsch_vars->dl_ch_magb1;
+ int **dl_ch_magb1 = pdsch_vars->dl_ch_magb1[harq_pid][round];
int **rxdataF_comp0 = pdsch_vars->rxdataF_comp0;
- int **rxdataF_comp1 = pdsch_vars->rxdataF_comp1[round]; //?
+ int **rxdataF_comp1 = pdsch_vars->rxdataF_comp1[harq_pid][round];
+ unsigned char *pmi_ext = pdsch_vars->pmi_ext;
__m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp0_128,QAM_amp0_128b,QAM_amp1_128,QAM_amp1_128b;
-
symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp)))
pilots=1;
+ rx_power_correction = 1;
- //printf("comp prec: symbol %d, pilots %d\n",symbol, pilots);
+ // printf("comp prec: symbol %d, pilots %d\n",symbol, pilots);
if (mod_order0 == 4) {
QAM_amp0_128 = _mm_set1_epi16(QAM16_n1);
@@ -1948,39 +2128,83 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
QAM_amp1_128b = _mm_set1_epi16(QAM64_n2);
}
- for (aarx=0; aarxnb_antennas_rx; aarx++) {
+ for (aarx=0;aarxnb_antennas_rx;aarx++) {
- dl_ch0_128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; // hr,0
- dl_ch1_128 = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; // hr,1
+ /* if (aarx==0) {
+ output_shift=output_shift0;
+ }
+ else {
+ output_shift=output_shift1;
+ } */
+
+ // printf("antenna %d\n", aarx);
+ // printf("symbol %d, rx antenna %d\n", symbol, aarx);
+
+ dl_ch0_128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; // this is h11
+ dl_ch1_128 = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; // this is h12
- dl_ch_mag0_128 = (__m128i *)&dl_ch_mag0[aarx][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag0_128b = (__m128i *)&dl_ch_magb0[aarx][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag1_128 = (__m128i *)&dl_ch_mag1[aarx][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag1_128b = (__m128i *)&dl_ch_magb1[aarx][symbol*frame_parms->N_RB_DL*12];
- rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12]; // yr
- rxdataF_comp0_128 = (__m128i *)&rxdataF_comp0[aarx][symbol*frame_parms->N_RB_DL*12]; // yr,0 = yr * conj(hr,0)
- rxdataF_comp1_128 = (__m128i *)&rxdataF_comp1[aarx][symbol*frame_parms->N_RB_DL*12]; // yr,1 = yr * conj(hr,1)
-
+ dl_ch_mag0_128 = (__m128i *)&dl_ch_mag0[aarx][symbol*frame_parms->N_RB_DL*12]; //responsible for x1
+ dl_ch_mag0_128b = (__m128i *)&dl_ch_magb0[aarx][symbol*frame_parms->N_RB_DL*12];//responsible for x1
+ dl_ch_mag1_128 = (__m128i *)&dl_ch_mag1[aarx][symbol*frame_parms->N_RB_DL*12]; //responsible for x2. always coming from tx2
+ dl_ch_mag1_128b = (__m128i *)&dl_ch_magb1[aarx][symbol*frame_parms->N_RB_DL*12]; //responsible for x2. always coming from tx2
+ rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12]; //received signal on antenna of interest h11*x1+h12*x2
+ rxdataF_comp0_128 = (__m128i *)&rxdataF_comp0[aarx][symbol*frame_parms->N_RB_DL*12]; //result of multipl with MF x1 on antenna of interest
+ rxdataF_comp1_128 = (__m128i *)&rxdataF_comp1[aarx][symbol*frame_parms->N_RB_DL*12]; //result of multipl with MF x2 on antenna of interest
for (rb=0; rb2) {
// get channel amplitude if not QPSK
mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],dl_ch0_128[0]);
- mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
+ mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift0);
mmtmpD1 = _mm_madd_epi16(dl_ch0_128[1],dl_ch0_128[1]);
- mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
+ mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift0);
mmtmpD0 = _mm_packs_epi32(mmtmpD0,mmtmpD1);
@@ -1991,6 +2215,7 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
// print_shorts("dl_ch_mag0_128[0]=",&dl_ch_mag0_128[0]);
+
dl_ch_mag0_128[1] = _mm_unpackhi_epi16(mmtmpD0,mmtmpD0);
dl_ch_mag0_128b[1] = dl_ch_mag0_128[1];
dl_ch_mag0_128[1] = _mm_mulhi_epi16(dl_ch_mag0_128[1],QAM_amp0_128);
@@ -1998,7 +2223,7 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
if (pilots==0) {
mmtmpD0 = _mm_madd_epi16(dl_ch0_128[2],dl_ch0_128[2]);
- mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
+ mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift0);
mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0);
@@ -2012,7 +2237,7 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
dl_ch_mag0_128b[0] = _mm_mulhi_epi16(dl_ch_mag0_128b[0],QAM_amp0_128b);
dl_ch_mag0_128b[0] = _mm_slli_epi16(dl_ch_mag0_128b[0],1);
- //print_shorts("dl_ch_mag128b[0]=",&dl_ch_mag128b[0]);
+ // print_shorts("dl_ch_mag0_128b[0]=",&dl_ch_mag0_128b[0]);
dl_ch_mag0_128b[1] = _mm_mulhi_epi16(dl_ch_mag0_128b[1],QAM_amp0_128b);
dl_ch_mag0_128b[1] = _mm_slli_epi16(dl_ch_mag0_128b[1],1);
@@ -2027,10 +2252,10 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
// get channel amplitude if not QPSK
mmtmpD0 = _mm_madd_epi16(dl_ch1_128[0],dl_ch1_128[0]);
- mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
+ mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift1);
mmtmpD1 = _mm_madd_epi16(dl_ch1_128[1],dl_ch1_128[1]);
- mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
+ mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift1);
mmtmpD0 = _mm_packs_epi32(mmtmpD0,mmtmpD1);
@@ -2039,7 +2264,7 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
dl_ch_mag1_128[0] = _mm_mulhi_epi16(dl_ch_mag1_128[0],QAM_amp1_128);
dl_ch_mag1_128[0] = _mm_slli_epi16(dl_ch_mag1_128[0],1);
- //print_shorts("dl_ch_mag128[0]=",&dl_ch_mag128[0]);
+ // print_shorts("dl_ch_mag1_128[0]=",&dl_ch_mag1_128[0]);
dl_ch_mag1_128[1] = _mm_unpackhi_epi16(mmtmpD0,mmtmpD0);
dl_ch_mag1_128b[1] = dl_ch_mag1_128[1];
@@ -2048,7 +2273,7 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
if (pilots==0) {
mmtmpD0 = _mm_madd_epi16(dl_ch1_128[2],dl_ch1_128[2]);
- mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
+ mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift1);
mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0);
@@ -2062,7 +2287,7 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
dl_ch_mag1_128b[0] = _mm_mulhi_epi16(dl_ch_mag1_128b[0],QAM_amp1_128b);
dl_ch_mag1_128b[0] = _mm_slli_epi16(dl_ch_mag1_128b[0],1);
- //print_shorts("dl_ch_mag128b[0]=",&dl_ch_mag128b[0]);
+ // print_shorts("dl_ch_mag1_128b[0]=",&dl_ch_mag1_128b[0]);
dl_ch_mag1_128b[1] = _mm_mulhi_epi16(dl_ch_mag1_128b[1],QAM_amp1_128b);
dl_ch_mag1_128b[1] = _mm_slli_epi16(dl_ch_mag1_128b[1],1);
@@ -2076,28 +2301,29 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
// layer 0
// MF multiply by conjugated channel
mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],rxdataF128[0]);
- //print_ints("re",&mmtmpD0);
+ // print_ints("re",&mmtmpD0);
// mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[0],_MM_SHUFFLE(2,3,0,1));
mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]);
mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[0]);
- // print_ints("im",&mmtmpD1);
+ // print_ints("im",&mmtmpD1);
// mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
- mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
- // printf("Shift: %d\n",output_shift);
- // print_ints("re(shift)",&mmtmpD0);
- mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
- // print_ints("im(shift)",&mmtmpD1);
+ mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift0);
+ // printf("Shift: %d\n",output_shift);
+ // print_ints("re(shift)",&mmtmpD0);
+ mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift0);
+ // print_ints("im(shift)",&mmtmpD1);
mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
- // print_ints("c0",&mmtmpD2);
- // print_ints("c1",&mmtmpD3);
+ // print_ints("c0",&mmtmpD2);
+ // print_ints("c1",&mmtmpD3);
rxdataF_comp0_128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
- // print_shorts("rx:",rxdataF128);
- // print_shorts("ch:",dl_ch0_128);
- // print_shorts("pack:",rxdataF_comp0_128);
+
+ // print_shorts("rx:",rxdataF128);
+ // print_shorts("ch:",dl_ch0_128);
+ // print_shorts("pack:",rxdataF_comp0_128);
// multiply by conjugated channel
mmtmpD0 = _mm_madd_epi16(dl_ch0_128[1],rxdataF128[1]);
@@ -2107,15 +2333,15 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate);
mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[1]);
// mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
- mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
- mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
+ mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift0);
+ mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift0);
mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
rxdataF_comp0_128[1] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
- // print_shorts("rx:",rxdataF128+1);
- // print_shorts("ch:",dl_ch0_128+1);
- // print_shorts("pack:",rxdataF_comp128+1);
+ // print_shorts("rx:",rxdataF128+1);
+ // print_shorts("ch:",dl_ch0_128+1);
+ // print_shorts("pack:",rxdataF_comp0_128+1);
if (pilots==0) {
// multiply by conjugated channel
@@ -2126,17 +2352,15 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate);
mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[2]);
// mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
- mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
- mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
+ mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift0);
+ mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift0);
mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
rxdataF_comp0_128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
- // print_shorts("rx:",rxdataF128+2);
- // print_shorts("ch:",dl_ch0_128+2);
- // print_shorts("pack:",rxdataF_comp128+2);
-
- } else {
+ // print_shorts("rx:",rxdataF128+2);
+ // print_shorts("ch:",dl_ch0_128+2);
+ // print_shorts("pack:",rxdataF_comp0_128+2);
}
@@ -2144,29 +2368,29 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
// layer 1
// MF multiply by conjugated channel
mmtmpD0 = _mm_madd_epi16(dl_ch1_128[0],rxdataF128[0]);
- // print_ints("re",&mmtmpD0);
+ // print_ints("re",&mmtmpD0);
- // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
+ // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
mmtmpD1 = _mm_shufflelo_epi16(dl_ch1_128[0],_MM_SHUFFLE(2,3,0,1));
mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]);
- // print_ints("im",&mmtmpD1);
+ // print_ints("im",&mmtmpD1);
mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[0]);
// mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
- mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
- // print_ints("re(shift)",&mmtmpD0);
- mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
- // print_ints("im(shift)",&mmtmpD1);
+ mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift1);
+ // print_ints("re(shift)",&mmtmpD0);
+ mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift1);
+ // print_ints("im(shift)",&mmtmpD1);
mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
- // print_ints("c0",&mmtmpD2);
- // print_ints("c1",&mmtmpD3);
+ // print_ints("c0",&mmtmpD2);
+ // print_ints("c1",&mmtmpD3);
rxdataF_comp1_128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
- // print_shorts("rx:",rxdataF128);
- // print_shorts("ch:",dl_ch128);
- // print_shorts("pack:",rxdataF_comp128);
+ // print_shorts("rx:",rxdataF128);
+ // print_shorts("ch:",dl_ch1_128);
+ // print_shorts("pack:",rxdataF_comp1_128);
- // multiply by conjugated channel
+ // multiply by conjugated channel
mmtmpD0 = _mm_madd_epi16(dl_ch1_128[1],rxdataF128[1]);
// mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
mmtmpD1 = _mm_shufflelo_epi16(dl_ch1_128[1],_MM_SHUFFLE(2,3,0,1));
@@ -2174,15 +2398,15 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate);
mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[1]);
// mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
- mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
- mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
+ mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift1);
+ mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift1);
mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
rxdataF_comp1_128[1] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
- // print_shorts("rx:",rxdataF128+1);
- // print_shorts("ch:",dl_ch128+1);
- // print_shorts("pack:",rxdataF_comp128+1);
+ // print_shorts("rx:",rxdataF128+1);
+ // print_shorts("ch:",dl_ch1_128+1);
+ // print_shorts("pack:",rxdataF_comp1_128+1);
if (pilots==0) {
// multiply by conjugated channel
@@ -2193,15 +2417,15 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate);
mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[2]);
// mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
- mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
- mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
+ mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift1);
+ mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift1);
mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
rxdataF_comp1_128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
- // print_shorts("rx:",rxdataF128+2);
- // print_shorts("ch:",dl_ch128+2);
- // print_shorts("pack:",rxdataF_comp128+2);
+ // print_shorts("rx:",rxdataF128+2);
+ // print_shorts("ch:",dl_ch1_128+2);
+ // print_shorts("pack:",rxdataF_comp1_128+2);
dl_ch0_128+=3;
dl_ch1_128+=3;
@@ -2212,7 +2436,8 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
rxdataF128+=3;
rxdataF_comp0_128+=3;
rxdataF_comp1_128+=3;
- } else {
+ }
+ else {
dl_ch0_128+=2;
dl_ch1_128+=2;
dl_ch_mag0_128+=2;
@@ -2225,85 +2450,85 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
}
} // rb loop
- }
-
- Nre = (pilots==0) ? 12 : 8;
+ Nre = (pilots==0) ? 12 : 8;
- precoded_signal_strength0 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre],
- (nb_rb*Nre))) - (measurements->n0_power[aarx]));
+ precoded_signal_strength0 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre],
+ (nb_rb*Nre))*rx_power_correction) - (measurements->n0_power[aarx]));
- precoded_signal_strength1 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx+2][symbol*frame_parms->N_RB_DL*Nre],
- (nb_rb*Nre))) - (measurements->n0_power[aarx]));
+ precoded_signal_strength1 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx+2][symbol*frame_parms->N_RB_DL*Nre],
+ (nb_rb*Nre))*rx_power_correction) - (measurements->n0_power[aarx]));
+ } // rx_antennas
measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength0,measurements->n0_power_tot);
measurements->precoded_cqi_dB[eNB_id][1] = dB_fixed2(precoded_signal_strength1,measurements->n0_power_tot);
- //printf("eNB_id %d, symbol %d: precoded CQI %d dB\n",eNB_id,symbol,
- // measurements->precoded_cqi_dB[eNB_id][0]);
+ // printf("eNB_id %d, symbol %d: precoded CQI %d dB\n",eNB_id,symbol,
+ // measurements->precoded_cqi_dB[eNB_id][0]);
_mm_empty();
_m_empty();
-#elif defined(__arm__)
+ #elif defined(__arm__)
unsigned short rb,Nre;
unsigned char aarx,symbol_mod,pilots=0;
- int precoded_signal_strength0=0,precoded_signal_strength1=0;
+ int precoded_signal_strength0=0,precoded_signal_strength1=0, rx_power_correction;
int16x4_t *dl_ch0_128,*rxdataF128;
int16x4_t *dl_ch1_128;
int16x8_t *dl_ch0_128b,*dl_ch1_128b;
-
+
int32x4_t mmtmpD0,mmtmpD1,mmtmpD0b,mmtmpD1b;
int16x8_t *dl_ch_mag0_128,*dl_ch_mag0_128b,*dl_ch_mag1_128,*dl_ch_mag1_128b,mmtmpD2,mmtmpD3,mmtmpD4,*rxdataF_comp0_128,*rxdataF_comp1_128;
int16x8_t QAM_amp0_128,QAM_amp0_128b,QAM_amp1_128,QAM_amp1_128b;
int32x4_t output_shift128 = vmovq_n_s32(-(int32_t)output_shift);
-
+
int **rxdataF_ext = pdsch_vars->rxdataF_ext;
int **dl_ch_estimates_ext = pdsch_vars->dl_ch_estimates_ext;
int **dl_ch_mag0 = pdsch_vars->dl_ch_mag0;
- int **dl_ch_mag1 = pdsch_vars->dl_ch_mag1;
+ int **dl_ch_mag1 = pdsch_vars->dl_ch_mag1[harq_pid][round];
int **dl_ch_magb0 = pdsch_vars->dl_ch_magb0;
- int **dl_ch_magb1 = pdsch_vars->dl_ch_magb1;
+ int **dl_ch_magb1 = pdsch_vars->dl_ch_magb1[harq_pid][round];
int **rxdataF_comp0 = pdsch_vars->rxdataF_comp0;
- int **rxdataF_comp1 = pdsch_vars->rxdataF_comp1[round]; //?
-
+ int **rxdataF_comp1 = pdsch_vars->rxdataF_comp1[harq_pid][round];
+
int16_t conj[4]__attribute__((aligned(16))) = {1,-1,1,-1};
-
+
symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
-
+
if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) {
if (frame_parms->mode1_flag==1) // 10 out of 12 so don't reduce size
{ nb_rb=1+(5*nb_rb/6); }
-
+
else
{ pilots=1; }
}
-
-
+
+ rx_power_correction=1;
+
if (mod_order0 == 4) {
QAM_amp0_128 = vmovq_n_s16(QAM16_n1); // 2/sqrt(10)
QAM_amp0_128b = vmovq_n_s16(0);
-
+
} else if (mod_order0 == 6) {
QAM_amp0_128 = vmovq_n_s16(QAM64_n1); //
QAM_amp0_128b = vmovq_n_s16(QAM64_n2);
}
-
+
if (mod_order1 == 4) {
QAM_amp1_128 = vmovq_n_s16(QAM16_n1); // 2/sqrt(10)
QAM_amp1_128b = vmovq_n_s16(0);
-
+
} else if (mod_order1 == 6) {
QAM_amp1_128 = vmovq_n_s16(QAM64_n1); //
QAM_amp1_128b = vmovq_n_s16(QAM64_n2);
}
-
+
// printf("comp: rxdataF_comp %p, symbol %d\n",rxdataF_comp[0],symbol);
-
+
for (aarx=0; aarxnb_antennas_rx; aarx++) {
-
-
-
+
+
+
dl_ch0_128 = (int16x4_t*)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12];
dl_ch1_128 = (int16x4_t*)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12];
dl_ch0_128b = (int16x8_t*)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12];
@@ -2315,195 +2540,215 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
rxdataF128 = (int16x4_t*)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12];
rxdataF_comp0_128 = (int16x8_t*)&rxdataF_comp0[aarx][symbol*frame_parms->N_RB_DL*12];
rxdataF_comp1_128 = (int16x8_t*)&rxdataF_comp1[aarx][symbol*frame_parms->N_RB_DL*12];
-
- for (rb=0; rb%d\n",rb,pmi_ext[rb]);
-#endif
- prec2A_TM3_128(&dl_ch0_128b[0],&dl_ch1_128b[0]);
- prec2A_TM3_128(&dl_ch0_128b[1],&dl_ch1_128b[1]);
-
- if (pilots==0) {
- prec2A_TM3_128(&dl_ch0_128b[2],&dl_ch1_128b[2]);
+ for (rb=0; rb2) {
- // get channel amplitude if not QPSK
- mmtmpD0 = vmull_s16(dl_ch0_128[0], dl_ch0_128[0]);
- // mmtmpD0 = [ch0*ch0,ch1*ch1,ch2*ch2,ch3*ch3];
- mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
- // mmtmpD0 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3]>>output_shift128 on 32-bits
- mmtmpD1 = vmull_s16(dl_ch0_128[1], dl_ch0_128[1]);
- mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
- mmtmpD2 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
- // mmtmpD2 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3,ch4*ch4 + ch5*ch5,ch4*ch4 + ch5*ch5,ch6*ch6 + ch7*ch7,ch6*ch6 + ch7*ch7]>>output_shift128 on 16-bits
- mmtmpD0 = vmull_s16(dl_ch0_128[2], dl_ch0_128[2]);
- mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
- mmtmpD1 = vmull_s16(dl_ch0_128[3], dl_ch0_128[3]);
- mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
- mmtmpD3 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
-
- if (pilots==0) {
- mmtmpD0 = vmull_s16(dl_ch0_128[4], dl_ch0_128[4]);
- mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
- mmtmpD1 = vmull_s16(dl_ch0_128[5], dl_ch0_128[5]);
- mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
- mmtmpD4 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
-
-
- }
-
- dl_ch_mag0_128b[0] = vqdmulhq_s16(mmtmpD2,QAM_amp0_128b);
- dl_ch_mag0_128b[1] = vqdmulhq_s16(mmtmpD3,QAM_amp0_128b);
- dl_ch_mag0_128[0] = vqdmulhq_s16(mmtmpD2,QAM_amp0_128);
- dl_ch_mag0_128[1] = vqdmulhq_s16(mmtmpD3,QAM_amp0_128);
-
-
- if (pilots==0) {
- dl_ch_mag0_128b[2] = vqdmulhq_s16(mmtmpD4,QAM_amp0_128b);
- dl_ch_mag0_128[2] = vqdmulhq_s16(mmtmpD4,QAM_amp0_128);
- }
+ // get channel amplitude if not QPSK
+ mmtmpD0 = vmull_s16(dl_ch0_128[0], dl_ch0_128[0]);
+ // mmtmpD0 = [ch0*ch0,ch1*ch1,ch2*ch2,ch3*ch3];
+ mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
+ // mmtmpD0 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3]>>output_shift128 on 32-bits
+ mmtmpD1 = vmull_s16(dl_ch0_128[1], dl_ch0_128[1]);
+ mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
+ mmtmpD2 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
+ // mmtmpD2 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3,ch4*ch4 + ch5*ch5,ch4*ch4 + ch5*ch5,ch6*ch6 + ch7*ch7,ch6*ch6 + ch7*ch7]>>output_shift128 on 16-bits
+ mmtmpD0 = vmull_s16(dl_ch0_128[2], dl_ch0_128[2]);
+ mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
+ mmtmpD1 = vmull_s16(dl_ch0_128[3], dl_ch0_128[3]);
+ mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
+ mmtmpD3 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
+
+ if (pilots==0) {
+ mmtmpD0 = vmull_s16(dl_ch0_128[4], dl_ch0_128[4]);
+ mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
+ mmtmpD1 = vmull_s16(dl_ch0_128[5], dl_ch0_128[5]);
+ mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
+ mmtmpD4 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
+
+
+ }
+
+ dl_ch_mag0_128b[0] = vqdmulhq_s16(mmtmpD2,QAM_amp0_128b);
+ dl_ch_mag0_128b[1] = vqdmulhq_s16(mmtmpD3,QAM_amp0_128b);
+ dl_ch_mag0_128[0] = vqdmulhq_s16(mmtmpD2,QAM_amp0_128);
+ dl_ch_mag0_128[1] = vqdmulhq_s16(mmtmpD3,QAM_amp0_128);
+
+
+ if (pilots==0) {
+ dl_ch_mag0_128b[2] = vqdmulhq_s16(mmtmpD4,QAM_amp0_128b);
+ dl_ch_mag0_128[2] = vqdmulhq_s16(mmtmpD4,QAM_amp0_128);
+ }
}
if (mod_order1>2) {
- // get channel amplitude if not QPSK
- mmtmpD0 = vmull_s16(dl_ch1_128[0], dl_ch1_128[0]);
- // mmtmpD0 = [ch0*ch0,ch1*ch1,ch2*ch2,ch3*ch3];
- mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
- // mmtmpD0 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3]>>output_shift128 on 32-bits
- mmtmpD1 = vmull_s16(dl_ch1_128[1], dl_ch1_128[1]);
- mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
- mmtmpD2 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
- // mmtmpD2 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3,ch4*ch4 + ch5*ch5,ch4*ch4 + ch5*ch5,ch6*ch6 + ch7*ch7,ch6*ch6 + ch7*ch7]>>output_shift128 on 16-bits
- mmtmpD0 = vmull_s16(dl_ch1_128[2], dl_ch1_128[2]);
- mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
- mmtmpD1 = vmull_s16(dl_ch1_128[3], dl_ch1_128[3]);
- mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
- mmtmpD3 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
-
- if (pilots==0) {
- mmtmpD0 = vmull_s16(dl_ch1_128[4], dl_ch1_128[4]);
- mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
- mmtmpD1 = vmull_s16(dl_ch1_128[5], dl_ch1_128[5]);
- mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
- mmtmpD4 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
-
-
- }
-
- dl_ch_mag1_128b[0] = vqdmulhq_s16(mmtmpD2,QAM_amp1_128b);
- dl_ch_mag1_128b[1] = vqdmulhq_s16(mmtmpD3,QAM_amp1_128b);
- dl_ch_mag1_128[0] = vqdmulhq_s16(mmtmpD2,QAM_amp1_128);
- dl_ch_mag1_128[1] = vqdmulhq_s16(mmtmpD3,QAM_amp1_128);
-
-
- if (pilots==0) {
- dl_ch_mag1_128b[2] = vqdmulhq_s16(mmtmpD4,QAM_amp1_128b);
- dl_ch_mag1_128[2] = vqdmulhq_s16(mmtmpD4,QAM_amp1_128);
- }
+ // get channel amplitude if not QPSK
+ mmtmpD0 = vmull_s16(dl_ch1_128[0], dl_ch1_128[0]);
+ // mmtmpD0 = [ch0*ch0,ch1*ch1,ch2*ch2,ch3*ch3];
+ mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
+ // mmtmpD0 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3]>>output_shift128 on 32-bits
+ mmtmpD1 = vmull_s16(dl_ch1_128[1], dl_ch1_128[1]);
+ mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
+ mmtmpD2 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
+ // mmtmpD2 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3,ch4*ch4 + ch5*ch5,ch4*ch4 + ch5*ch5,ch6*ch6 + ch7*ch7,ch6*ch6 + ch7*ch7]>>output_shift128 on 16-bits
+ mmtmpD0 = vmull_s16(dl_ch1_128[2], dl_ch1_128[2]);
+ mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
+ mmtmpD1 = vmull_s16(dl_ch1_128[3], dl_ch1_128[3]);
+ mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
+ mmtmpD3 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
+
+ if (pilots==0) {
+ mmtmpD0 = vmull_s16(dl_ch1_128[4], dl_ch1_128[4]);
+ mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128);
+ mmtmpD1 = vmull_s16(dl_ch1_128[5], dl_ch1_128[5]);
+ mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128);
+ mmtmpD4 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
+
+
+ }
+
+ dl_ch_mag1_128b[0] = vqdmulhq_s16(mmtmpD2,QAM_amp1_128b);
+ dl_ch_mag1_128b[1] = vqdmulhq_s16(mmtmpD3,QAM_amp1_128b);
+ dl_ch_mag1_128[0] = vqdmulhq_s16(mmtmpD2,QAM_amp1_128);
+ dl_ch_mag1_128[1] = vqdmulhq_s16(mmtmpD3,QAM_amp1_128);
+
+
+ if (pilots==0) {
+ dl_ch_mag1_128b[2] = vqdmulhq_s16(mmtmpD4,QAM_amp1_128b);
+ dl_ch_mag1_128[2] = vqdmulhq_s16(mmtmpD4,QAM_amp1_128);
+ }
}
-
+
mmtmpD0 = vmull_s16(dl_ch0_128[0], rxdataF128[0]);
- //mmtmpD0 = [Re(ch[0])Re(rx[0]) Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1]) Im(ch[1])Im(ch[1])]
+ //mmtmpD0 = [Re(ch[0])Re(rx[0]) Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1]) Im(ch[1])Im(ch[1])]
mmtmpD1 = vmull_s16(dl_ch0_128[1], rxdataF128[1]);
- //mmtmpD1 = [Re(ch[2])Re(rx[2]) Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3]) Im(ch[3])Im(ch[3])]
+ //mmtmpD1 = [Re(ch[2])Re(rx[2]) Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3]) Im(ch[3])Im(ch[3])]
mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)),
- vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
- //mmtmpD0 = [Re(ch[0])Re(rx[0])+Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1])+Im(ch[1])Im(ch[1]) Re(ch[2])Re(rx[2])+Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3])+Im(ch[3])Im(ch[3])]
-
+ vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
+ //mmtmpD0 = [Re(ch[0])Re(rx[0])+Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1])+Im(ch[1])Im(ch[1]) Re(ch[2])Re(rx[2])+Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3])+Im(ch[3])Im(ch[3])]
+
mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[0],*(int16x4_t*)conj)), rxdataF128[0]);
//mmtmpD0 = [-Im(ch[0])Re(rx[0]) Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1]) Re(ch[1])Im(rx[1])]
mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[1],*(int16x4_t*)conj)), rxdataF128[1]);
//mmtmpD0 = [-Im(ch[2])Re(rx[2]) Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3]) Re(ch[3])Im(rx[3])]
mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)),
- vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
+ vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
//mmtmpD1 = [-Im(ch[0])Re(rx[0])+Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1])+Re(ch[1])Im(rx[1]) -Im(ch[2])Re(rx[2])+Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3])+Re(ch[3])Im(rx[3])]
-
+
mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128);
mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128);
rxdataF_comp0_128[0] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
-
+
mmtmpD0 = vmull_s16(dl_ch0_128[2], rxdataF128[2]);
mmtmpD1 = vmull_s16(dl_ch0_128[3], rxdataF128[3]);
mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)),
- vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
-
+ vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
+
mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[2],*(int16x4_t*)conj)), rxdataF128[2]);
mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[3],*(int16x4_t*)conj)), rxdataF128[3]);
mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)),
- vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
-
+ vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
+
mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128);
mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128);
rxdataF_comp0_128[1] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
-
+
// second stream
mmtmpD0 = vmull_s16(dl_ch1_128[0], rxdataF128[0]);
mmtmpD1 = vmull_s16(dl_ch1_128[1], rxdataF128[1]);
mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)),
- vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
+ vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[0],*(int16x4_t*)conj)), rxdataF128[0]);
-
+
mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[1],*(int16x4_t*)conj)), rxdataF128[1]);
//mmtmpD0 = [-Im(ch[2])Re(rx[2]) Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3]) Re(ch[3])Im(rx[3])]
mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)),
- vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
+ vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
//mmtmpD1 = [-Im(ch[0])Re(rx[0])+Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1])+Re(ch[1])Im(rx[1]) -Im(ch[2])Re(rx[2])+Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3])+Re(ch[3])Im(rx[3])]
-
+
mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128);
mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128);
rxdataF_comp1_128[0] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
-
+
mmtmpD0 = vmull_s16(dl_ch1_128[2], rxdataF128[2]);
mmtmpD1 = vmull_s16(dl_ch1_128[3], rxdataF128[3]);
mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)),
- vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
-
+ vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
+
mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[2],*(int16x4_t*)conj)), rxdataF128[2]);
mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[3],*(int16x4_t*)conj)), rxdataF128[3]);
mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)),
- vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
-
+ vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
+
mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128);
mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128);
rxdataF_comp1_128[1] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
-
+
if (pilots==0) {
- mmtmpD0 = vmull_s16(dl_ch0_128[4], rxdataF128[4]);
- mmtmpD1 = vmull_s16(dl_ch0_128[5], rxdataF128[5]);
- mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)),
- vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
-
- mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[4],*(int16x4_t*)conj)), rxdataF128[4]);
- mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[5],*(int16x4_t*)conj)), rxdataF128[5]);
- mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)),
- vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
-
-
- mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128);
- mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128);
- rxdataF_comp0_128[2] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
- mmtmpD0 = vmull_s16(dl_ch1_128[4], rxdataF128[4]);
- mmtmpD1 = vmull_s16(dl_ch1_128[5], rxdataF128[5]);
- mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)),
- vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
-
- mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch1_128[4],*(int16x4_t*)conj)), rxdataF128[4]);
- mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch1_128[5],*(int16x4_t*)conj)), rxdataF128[5]);
- mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)),
- vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
-
-
- mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128);
- mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128);
- rxdataF_comp1_128[2] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
+ mmtmpD0 = vmull_s16(dl_ch0_128[4], rxdataF128[4]);
+ mmtmpD1 = vmull_s16(dl_ch0_128[5], rxdataF128[5]);
+ mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)),
+ vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
+
+ mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[4],*(int16x4_t*)conj)), rxdataF128[4]);
+ mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[5],*(int16x4_t*)conj)), rxdataF128[5]);
+ mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)),
+ vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
+
+
+ mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128);
+ mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128);
+ rxdataF_comp0_128[2] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
+ mmtmpD0 = vmull_s16(dl_ch1_128[4], rxdataF128[4]);
+ mmtmpD1 = vmull_s16(dl_ch1_128[5], rxdataF128[5]);
+ mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)),
+ vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1)));
+
+ mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch1_128[4],*(int16x4_t*)conj)), rxdataF128[4]);
+ mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch1_128[5],*(int16x4_t*)conj)), rxdataF128[5]);
+ mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)),
+ vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b)));
+
+
+ mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128);
+ mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128);
+ rxdataF_comp1_128[2] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1));
}
}
-
-
-
+
+
+
Nre = (pilots==0) ? 12 : 8;
// rx_antennas
@@ -2513,11 +2758,9 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
Nre = (pilots==0) ? 12 : 8;
precoded_signal_strength0 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre],
- (nb_rb*Nre))) - (measurements->n0_power[aarx]));
-
+ (nb_rb*Nre))*rx_power_correction) - (measurements->n0_power[aarx]));
precoded_signal_strength1 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx+2][symbol*frame_parms->N_RB_DL*Nre],
- (nb_rb*Nre))) - (measurements->n0_power[aarx]));
-
+ (nb_rb*Nre))*rx_power_correction) - (measurements->n0_power[aarx]));
measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength0,measurements->n0_power_tot);
measurements->precoded_cqi_dB[eNB_id][1] = dB_fixed2(precoded_signal_strength1,measurements->n0_power_tot);
@@ -2525,6 +2768,7 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
#endif
}
+
void dlsch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms,
unsigned char symbol,
unsigned short nb_rb,
@@ -2552,6 +2796,9 @@ void dlsch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms,
for (aarx=0; aarxnb_antennas_rx; aarx++) {
+
+
+ //printf ("antenna %d", aarx);
dl_ch128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12];
if (dl_ch_estimates_ext_i == NULL) // TM3/4
@@ -2582,7 +2829,7 @@ void dlsch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms,
// print_ints("c0",&mmtmpD2);
// print_ints("c1",&mmtmpD3);
dl_ch_rho128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
-
+ // print_shorts("rho 0:",dl_ch_rho128);
// multiply by conjugated channel
mmtmpD0 = _mm_madd_epi16(dl_ch128[1],dl_ch128i[1]);
// mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
@@ -2597,7 +2844,9 @@ void dlsch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms,
mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
dl_ch_rho128[1] =_mm_packs_epi32(mmtmpD2,mmtmpD3);
+
if (pilots==0) {
+
// multiply by conjugated channel
mmtmpD0 = _mm_madd_epi16(dl_ch128[2],dl_ch128i[2]);
// mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
@@ -2612,15 +2861,17 @@ void dlsch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms,
mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
dl_ch_rho128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
- dl_ch128+=3;
+ dl_ch128+=3;
dl_ch128i+=3;
dl_ch_rho128+=3;
} else {
+
dl_ch128+=2;
dl_ch128i+=2;
dl_ch_rho128+=2;
}
}
+
}
_mm_empty();
@@ -2631,6 +2882,128 @@ void dlsch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms,
#endif
}
+
+/*void dlsch_dual_stream_correlationTM34(LTE_DL_FRAME_PARMS *frame_parms,
+ unsigned char symbol,
+ unsigned short nb_rb,
+ int **dl_ch_estimates_ext,
+ int **dl_ch_estimates_ext_i,
+ int **dl_ch_rho_ext,
+ unsigned char output_shift0,
+ unsigned char output_shift1)
+{
+
+#if defined(__x86_64__)||defined(__i386__)
+
+ unsigned short rb;
+ __m128i *dl_ch128,*dl_ch128i,*dl_ch_rho128,mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3;
+ unsigned char aarx,symbol_mod,pilots=0;
+ int output_shift;
+
+ // printf("dlsch_dual_stream_correlation: symbol %d\n",symbol);
+
+ symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
+
+ if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) {
+ pilots=1;
+ }
+
+ // printf("Dual stream correlation (%p)\n",dl_ch_estimates_ext_i);
+
+ for (aarx=0; aarxnb_antennas_rx; aarx++) {
+
+ if (aarx==0) {
+ output_shift=output_shift0;
+ }
+ else {
+ output_shift=output_shift1;
+ }
+
+ //printf ("antenna %d", aarx);
+ dl_ch128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12];
+
+ if (dl_ch_estimates_ext_i == NULL) // TM3/4
+ dl_ch128i = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12];
+ else
+ dl_ch128i = (__m128i *)&dl_ch_estimates_ext_i[aarx][symbol*frame_parms->N_RB_DL*12];
+
+ dl_ch_rho128 = (__m128i *)&dl_ch_rho_ext[aarx][symbol*frame_parms->N_RB_DL*12];
+
+
+ for (rb=0; rbN_RB_DL*12];
// MRC on each re of rb, both on MF output and magnitude (for 16QAM/64QAM llr computation)
- for (i=0; iN_RB_DL*12];
rho128_1 = (__m128i *) &rho[1][symbol*frame_parms->N_RB_DL*12];
-
- for (i=0; irxdataF_comp0;
+ int **rxdataF_comp1 = pdsch_vars->rxdataF_comp1[harq_pid][round];
+ int **dl_ch_rho_ext = pdsch_vars->dl_ch_rho_ext[harq_pid][round]; //for second stream
+ int **dl_ch_rho2_ext = pdsch_vars->dl_ch_rho2_ext;
+ int **dl_ch_mag0 = pdsch_vars->dl_ch_mag0;
+ int **dl_ch_mag1 = pdsch_vars->dl_ch_mag1[harq_pid][round];
+ int **dl_ch_magb0 = pdsch_vars->dl_ch_magb0;
+ int **dl_ch_magb1 = pdsch_vars->dl_ch_magb1[harq_pid][round];
+
+ if (frame_parms->nb_antennas_rx>1) {
+
+ rxdataF_comp128_0 = (__m128i *)&rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12];
+ rxdataF_comp128_1 = (__m128i *)&rxdataF_comp0[1][symbol*frame_parms->N_RB_DL*12];
+ dl_ch_mag128_0 = (__m128i *)&dl_ch_mag0[0][symbol*frame_parms->N_RB_DL*12];
+ dl_ch_mag128_1 = (__m128i *)&dl_ch_mag0[1][symbol*frame_parms->N_RB_DL*12];
+ dl_ch_mag128_0b = (__m128i *)&dl_ch_magb0[0][symbol*frame_parms->N_RB_DL*12];
+ dl_ch_mag128_1b = (__m128i *)&dl_ch_magb0[1][symbol*frame_parms->N_RB_DL*12];
+
+ // MRC on each re of rb, both on MF output and magnitude (for 16QAM/64QAM llr computation)
+ for (i=0;iN_RB_DL*12];
+ rho128_1 = (__m128i *) &dl_ch_rho2_ext[1][symbol*frame_parms->N_RB_DL*12];
+ for (i=0;iN_RB_DL*12];
+ rho128_i1 = (__m128i *) &dl_ch_rho_ext[1][symbol*frame_parms->N_RB_DL*12];
+ rxdataF_comp128_i0 = (__m128i *)&rxdataF_comp1[0][symbol*frame_parms->N_RB_DL*12];
+ rxdataF_comp128_i1 = (__m128i *)&rxdataF_comp1[1][symbol*frame_parms->N_RB_DL*12];
+ dl_ch_mag128_i0 = (__m128i *)&dl_ch_mag1[0][symbol*frame_parms->N_RB_DL*12];
+ dl_ch_mag128_i1 = (__m128i *)&dl_ch_mag1[1][symbol*frame_parms->N_RB_DL*12];
+ dl_ch_mag128_i0b = (__m128i *)&dl_ch_magb1[0][symbol*frame_parms->N_RB_DL*12];
+ dl_ch_mag128_i1b = (__m128i *)&dl_ch_magb1[1][symbol*frame_parms->N_RB_DL*12];
+ for (i=0;isqrt_rho_b) : (dlsch[0]->sqrt_rho_a));
- // LOG_D(PHY,"Scaling PDSCH Chest in OFDM symbol %d by %d\n",symbol_mod,ch_amp);
+ch_amp = ((pilots) ? (dlsch_ue[0]->sqrt_rho_b) : (dlsch_ue[0]->sqrt_rho_a));
+
+ LOG_D(PHY,"Scaling PDSCH Chest in OFDM symbol %d by %d\n",symbol_mod,ch_amp);
+ // printf("Scaling PDSCH Chest in OFDM symbol %d by %d\n",symbol_mod,ch_amp);
ch_amp128 = _mm_set1_epi16(ch_amp); // Q3.13
@@ -2801,7 +3262,8 @@ void dlsch_scale_channel(int **dl_ch_estimates_ext,
dl_ch128=(__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12];
- for (rb=0; rb=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
@@ -2848,19 +3312,18 @@ void dlsch_channel_level(int **dl_ch_estimates_ext,
dl_ch128=(__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12];
- for (rb=0; rbNcp-1)))&&(frame_parms->mode1_flag==0)) {
dl_ch128+=2;
- } else {
+ }
+ else {
avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128[2],dl_ch128[2]));
dl_ch128+=3;
}
-
/*
if (rb==0) {
print_shorts("dl_ch128",&dl_ch128[0]);
@@ -2882,7 +3345,7 @@ void dlsch_channel_level(int **dl_ch_estimates_ext,
((int*)&avg128D)[2] +
((int*)&avg128D)[3])/(nb_rb*nre);
- // printf("Channel level : %d\n",avg[(aatx<<1)+aarx]);
+ // printf("Channel level : %d\n",avg[(aatx<<1)+aarx]);
}
_mm_empty();
@@ -2950,14 +3413,157 @@ void dlsch_channel_level(int **dl_ch_estimates_ext,
}
//compute average channel_level of effective (precoded) channel
-void dlsch_channel_level_TM3(int **dl_ch_estimates_ext,
- LTE_DL_FRAME_PARMS *frame_parms,
- int *avg,
- uint8_t symbol,
- unsigned short nb_rb)
-{
+
+//compute average channel_level of effective (precoded) channel
+void dlsch_channel_level_TM34(int **dl_ch_estimates_ext,
+ LTE_DL_FRAME_PARMS *frame_parms,
+ unsigned char *pmi_ext,
+ int *avg_0,
+ int *avg_1,
+ uint8_t symbol,
+ unsigned short nb_rb,
+ MIMO_mode_t mimo_mode){
+
#if defined(__x86_64__)||defined(__i386__)
+
+ short rb;
+ unsigned char aarx,nre=12,symbol_mod;
+ __m128i *dl_ch0_128,*dl_ch1_128, dl_ch0_128_tmp, dl_ch1_128_tmp, avg_0_128D, avg_1_128D;
+
+ symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
+
+ //clear average level
+ // avg_0_128D = _mm_setzero_si128();
+ // avg_1_128D = _mm_setzero_si128();
+ avg_0[0] = 0;
+ avg_0[1] = 0;
+ avg_1[0] = 0;
+ avg_1[1] = 0;
+ // 5 is always a symbol with no pilots for both normal and extended prefix
+
+ if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==0))
+ nre=8;
+ else if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==1))
+ nre=10;
+ else
+ nre=12;
+
+ for (aarx=0; aarxnb_antennas_rx; aarx++) {
+ dl_ch0_128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12];
+ dl_ch1_128 = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12];
+
+ avg_0_128D = _mm_setzero_si128();
+ avg_1_128D = _mm_setzero_si128();
+ for (rb=0; rbNcp-1)))&&(frame_parms->mode1_flag==0)) {
+ dl_ch0_128+=2;
+ dl_ch1_128+=2;
+ }
+ else {
+ dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[2]);
+ dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[2]);
+
+ if (mimo_mode==LARGE_CDD)
+ prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp);
+ else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODING1)
+ prec2A_TM4_128(0,&dl_ch0_128_tmp,&dl_ch1_128_tmp);
+ else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODINGj)
+ prec2A_TM4_128(1,&dl_ch0_128_tmp,&dl_ch1_128_tmp);
+ else if (mimo_mode==DUALSTREAM_PUSCH_PRECODING)
+ prec2A_TM4_128(pmi_ext[rb],&dl_ch0_128_tmp,&dl_ch1_128_tmp);
+ // mmtmpD2 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp);
+
+ avg_1_128D = _mm_add_epi32(avg_1_128D,_mm_madd_epi16(dl_ch1_128_tmp,dl_ch1_128_tmp));
+ avg_0_128D = _mm_add_epi32(avg_0_128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp));
+
+ dl_ch0_128+=3;
+ dl_ch1_128+=3;
+ }
+ }
+
+
+
+ avg_0[aarx] = (((int*)&avg_0_128D)[0])/(nb_rb*nre) +
+ (((int*)&avg_0_128D)[1])/(nb_rb*nre) +
+ (((int*)&avg_0_128D)[2])/(nb_rb*nre) +
+ (((int*)&avg_0_128D)[3])/(nb_rb*nre);
+ // printf("From Chan_level aver stream 0 %d =%d\n", aarx, avg_0[aarx]);
+
+ avg_1[aarx] = (((int*)&avg_1_128D)[0])/(nb_rb*nre) +
+ (((int*)&avg_1_128D)[1])/(nb_rb*nre) +
+ (((int*)&avg_1_128D)[2])/(nb_rb*nre) +
+ (((int*)&avg_1_128D)[3])/(nb_rb*nre);
+ // printf("From Chan_level aver stream 1 %d =%d\n", aarx, avg_1[aarx]);
+ }
+//avg_0[0] = max(avg_0[0],avg_0[1]);
+//avg_1[0] = max(avg_1[0],avg_1[1]);
+//avg_0[0]= max(avg_0[0], avg_1[0]);
+
+ avg_0[0] = avg_0[0] + avg_0[1];
+ // printf("From Chan_level aver stream 0 final =%d\n", avg_0[0]);
+ avg_1[0] = avg_1[0] + avg_1[1];
+ // printf("From Chan_level aver stream 1 final =%d\n", avg_1[0]);
+ avg_0[0] = min (avg_0[0], avg_1[0]);
+ avg_1[0] = avg_0[0];
+
+ _mm_empty();
+ _m_empty();
+
+#elif defined(__arm__)
+
+#endif
+}
+
+
+
+/*void dlsch_channel_level_TM34(int **dl_ch_estimates_ext,
+ LTE_DL_FRAME_PARMS *frame_parms,
+ int *avg,
+ uint8_t symbol,
+ unsigned short nb_rb,
+ MIMO_mode_t mimo_mode){
+
+#if defined(__x86_64__)||defined(__i386__)
+
+
short rb;
unsigned char aarx,nre=12,symbol_mod;
__m128i *dl_ch0_128,*dl_ch1_128, dl_ch0_128_tmp, dl_ch1_128_tmp,avg128D;
@@ -2986,26 +3592,45 @@ void dlsch_channel_level_TM3(int **dl_ch_estimates_ext,
dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[0]);
dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[0]);
- prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp);
+ if (mimo_mode==LARGE_CDD)
+ prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp);
+ else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODING1)
+ prec2A_TM4_128(0,&dl_ch0_128_tmp,&dl_ch1_128_tmp);
+ else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODINGj)
+ prec2A_TM4_128(1,&dl_ch0_128_tmp,&dl_ch1_128_tmp);
+
// mmtmpD0 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp);
avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp));
dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[1]);
dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[1]);
- prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp);
+ if (mimo_mode==LARGE_CDD)
+ prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp);
+ else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODING1)
+ prec2A_TM4_128(0,&dl_ch0_128_tmp,&dl_ch1_128_tmp);
+ else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODINGj)
+ prec2A_TM4_128(1,&dl_ch0_128_tmp,&dl_ch1_128_tmp);
+
// mmtmpD1 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp);
avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp));
if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==0)) {
dl_ch0_128+=2;
dl_ch1_128+=2;
- } else {
+ }
+ else {
dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[2]);
dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[2]);
- prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp);
- // mmtmpD2 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp);
+ if (mimo_mode==LARGE_CDD)
+ prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp);
+ else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODING1)
+ prec2A_TM4_128(0,&dl_ch0_128_tmp,&dl_ch1_128_tmp);
+ else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODINGj)
+ prec2A_TM4_128(1,&dl_ch0_128_tmp,&dl_ch1_128_tmp);
+
+ // mmtmpD2 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp);
avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp));
dl_ch0_128+=3;
@@ -3028,7 +3653,7 @@ void dlsch_channel_level_TM3(int **dl_ch_estimates_ext,
#elif defined(__arm__)
#endif
-}
+}*/
//compute average channel_level of effective (precoded) channel
void dlsch_channel_level_TM56(int **dl_ch_estimates_ext,
@@ -3083,12 +3708,13 @@ void dlsch_channel_level_TM56(int **dl_ch_estimates_ext,
if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==0)) {
dl_ch0_128+=2;
dl_ch1_128+=2;
- } else {
+ }
+ else {
dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[2]);
dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[2]);
prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128_tmp,&dl_ch1_128_tmp);
- // mmtmpD2 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp);
+ // mmtmpD2 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp);
avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp));
dl_ch0_128+=3;
@@ -3184,7 +3810,7 @@ void dlsch_channel_level_TM7(int **dl_bf_ch_estimates_ext,
#endif
}
-#define ONE_OVER_2_Q15 16384
+//#define ONE_OVER_2_Q15 16384
void dlsch_alamouti(LTE_DL_FRAME_PARMS *frame_parms,
int **rxdataF_comp,
int **dl_ch_mag,
@@ -3196,14 +3822,15 @@ void dlsch_alamouti(LTE_DL_FRAME_PARMS *frame_parms,
#if defined(__x86_64__)||defined(__i386__)
short *rxF0,*rxF1;
- __m128i *ch_mag0,*ch_mag1,*ch_mag0b,*ch_mag1b, amp, *rxF0_128;
+ __m128i *ch_mag0,*ch_mag1,*ch_mag0b,*ch_mag1b, *rxF0_128;
unsigned char rb,re;
int jj = (symbol*frame_parms->N_RB_DL*12);
uint8_t symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
uint8_t pilots = ((symbol_mod==0)||(symbol_mod==(4-frame_parms->Ncp))) ? 1 : 0;
rxF0_128 = (__m128i*) &rxdataF_comp[0][jj];
- amp = _mm_set1_epi16(ONE_OVER_2_Q15);
+ //amp = _mm_set1_epi16(ONE_OVER_2_Q15);
+
// printf("Doing alamouti!\n");
rxF0 = (short*)&rxdataF_comp[0][jj]; //tx antenna 0 h0*y
@@ -3212,7 +3839,7 @@ void dlsch_alamouti(LTE_DL_FRAME_PARMS *frame_parms,
ch_mag1 = (__m128i *)&dl_ch_mag[2][jj];
ch_mag0b = (__m128i *)&dl_ch_magb[0][jj];
ch_mag1b = (__m128i *)&dl_ch_magb[2][jj];
-
+
for (rb=0; rbfirst_carrier_offset + (symbol*(frame_parms->ofdm_symbol_size)))];
if ((frame_parms->N_RB_DL&1) == 0) // even number of RBs
- for (rb=0; rbN_RB_DL; rb++) {
+
+ for (rb=0;rbN_RB_DL;rb++) {
if (rb < 32)
rb_alloc_ind = (rb_alloc[0]>>rb) & 1;
@@ -3357,7 +3988,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
else
rb_alloc_ind = 0;
- if (rb_alloc_ind == 1)
+ if (rb_alloc_ind == 1)
nb_rb++;
// For second half of RBs skip DC carrier
@@ -3396,17 +4027,17 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int));
/*
- printf("rb %d\n",rb);
- for (i=0;i<12;i++)
- printf("(%d %d)",((short *)dl_ch0)[i<<1],((short*)dl_ch0)[1+(i<<1)]);
- printf("\n");
+ printf("rb %d\n",rb);
+ for (i=0;i<12;i++)
+ printf("(%d %d)",((short *)dl_ch0)[i<<1],((short*)dl_ch0)[1+(i<<1)]);
+ printf("\n");
*/
if (pilots==0) {
for (i=0; i<12; i++) {
rxF_ext[i]=rxF[i];
/*
- printf("%d : (%d,%d)\n",(rxF+i-&rxdataF[aarx][( (symbol*(frame_parms->ofdm_symbol_size)))]),
- ((short*)&rxF[i])[0],((short*)&rxF[i])[1]);*/
+ printf("%d : (%d,%d)\n",(rxF+i-&rxdataF[aarx][( (symbol*(frame_parms->ofdm_symbol_size)))]),
+ ((short*)&rxF[i])[0],((short*)&rxF[i])[1]);*/
}
dl_ch0_ext+=12;
@@ -3438,7 +4069,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
else { // Odd number of RBs
for (rb=0; rbN_RB_DL>>1; rb++) {
#ifdef DEBUG_DLSCH_DEMOD
- printf("dlch_ext %d\n",dl_ch0_ext-&dl_ch_estimates_ext[aarx][0]);
+ printf("dlch_ext %d\n",dl_ch0_ext-&dl_ch_estimates_ext[aarx][0]);
#endif
skip_half=0;
@@ -3453,8 +4084,9 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
else
rb_alloc_ind = 0;
- if (rb_alloc_ind == 1)
- nb_rb++;
+ if (rb_alloc_ind == 1)
+ nb_rb++;
+
// 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))) {
@@ -3475,7 +4107,6 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
(l==sss_symb) ) {
rb_alloc_ind = 0;
}
-
//SSS
if (((subframe==0)||(subframe==5)) &&
(rb==((frame_parms->N_RB_DL>>1)-3)) &&
@@ -3488,10 +4119,11 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
//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) ) {
+
+ 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;
}
@@ -3502,11 +4134,10 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
}
if ((frame_parms->frame_type == TDD) &&
- (subframe==6)) { //TDD Subframe 6
+ (subframe==6)){ //TDD Subframe 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))
@@ -3515,20 +4146,21 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
if (rb_alloc_ind==1) {
+
#ifdef DEBUG_DLSCH_DEMOD
- printf("rb %d/symbol %d (skip_half %d)\n",rb,l,skip_half);
+ printf("rb %d/symbol %d (skip_half %d)\n",rb,l,skip_half);
#endif
if (pilots==0) {
- // printf("Extracting w/o pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half);
+ // printf("Extracting w/o pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half);
if (skip_half==1) {
memcpy(dl_ch0_ext,dl_ch0,6*sizeof(int));
for (i=0; i<6; i++) {
- rxF_ext[i]=rxF[i];
+ rxF_ext[i]=rxF[i];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
- }
+ }
dl_ch0_ext+=6;
rxF_ext+=6;
} else if (skip_half==2) {
@@ -3537,9 +4169,9 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
for (i=0; i<6; i++) {
rxF_ext[i]=rxF[(i+6)];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
- }
+ }
dl_ch0_ext+=6;
rxF_ext+=6;
} else {
@@ -3550,12 +4182,12 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
#ifdef DEBUG_DLSCH_DEMOD
printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
- }
+ }
dl_ch0_ext+=12;
rxF_ext+=12;
}
} else {
- // printf("Extracting with pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half);
+ // printf("Extracting with pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half);
j=0;
if (skip_half==1) {
@@ -3568,14 +4200,14 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
dl_ch0_ext[j++]=dl_ch0[i];
}
}
- rxF_ext+=5;
+ rxF_ext+=5;
dl_ch0_ext+=5;
} else if (skip_half==2) {
for (i=0; i<6; i++) {
if (i!=((frame_parms->nushift+poffset)%6)) {
rxF_ext[j]=rxF[(i+6)];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
#endif
dl_ch0_ext[j++]=dl_ch0[i+6];
}
@@ -3589,7 +4221,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
(i!=((frame_parms->nushift+poffset+6)%12))) {
rxF_ext[j]=rxF[i];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
#endif
dl_ch0_ext[j++]=dl_ch0[i];
@@ -3601,7 +4233,6 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
}
}
}
-
dl_ch0+=12;
rxF+=12;
} // first half loop
@@ -3621,12 +4252,13 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
if (rb_alloc_ind == 1)
- nb_rb++;
+ nb_rb++;
// PBCH
- if ((subframe==0) &&
- (l>=(nsymb>>1)) &&
- (l<((nsymb>>1) + 4))) {
+
+ if ((subframe==0) &&
+ (l>=(nsymb>>1)) &&
+ (l<((nsymb>>1) + 4))) {
rb_alloc_ind = 0;
}
@@ -3645,16 +4277,16 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
//PSS
if ((frame_parms->frame_type == TDD) &&
(subframe==6) &&
- (l==pss_symb) ) {
- rb_alloc_ind = 0;
+ (l==pss_symb) ) {
+ rb_alloc_ind = 0;
}
-
+
// printf("dlch_ext %d\n",dl_ch0_ext-&dl_ch_estimates_ext[aarx][0]);
// printf("DC rb %d (%p)\n",rb,rxF);
if (rb_alloc_ind==1) {
#ifdef DEBUG_DLSCH_DEMOD
- printf("rb %d/symbol %d (skip_half %d)\n",rb,l,skip_half);
+ printf("rb %d/symbol %d (skip_half %d)\n",rb,l,skip_half);
#endif
if (pilots==0) {
for (i=0; i<6; i++) {
@@ -3692,14 +4324,13 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
rxF_ext[j++]=rxF[(1+i-6)];
#ifdef DEBUG_DLSCH_DEMOD
printf("**extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j-1],*(1+(short*)&rxF_ext[j-1]));
-#endif
+#endif
}
}
dl_ch0_ext+=10;
rxF_ext+=10;
} // symbol_mod==0
-
} // rballoc==1
else {
rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))];
@@ -3709,9 +4340,9 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
rxF+=7;
rb++;
- for (; rbN_RB_DL; rb++) {
- // printf("dlch_ext %d\n",dl_ch0_ext-&dl_ch_estimates_ext[aarx][0]);
- // printf("rb %d (%p)\n",rb,rxF);
+ for (;rbN_RB_DL;rb++) {
+ // printf("dlch_ext %d\n",dl_ch0_ext-&dl_ch_estimates_ext[aarx][0]);
+ // printf("rb %d (%p)\n",rb,rxF);
skip_half=0;
if (rb < 32)
@@ -3725,14 +4356,13 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
else
rb_alloc_ind = 0;
- if (rb_alloc_ind == 1)
- nb_rb++;
+ if (rb_alloc_ind == 1)
+ nb_rb++;
// 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;
@@ -3743,13 +4373,11 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
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) ) {
@@ -3757,6 +4385,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
}
//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))
@@ -3764,6 +4393,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
}
if ((frame_parms->frame_type == TDD) &&
+
(subframe==6)) { //TDD Subframe 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;
@@ -3776,26 +4406,26 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
}
if (rb_alloc_ind==1) {
-#ifdef DEBUG_DLSCH_DEMOD
- printf("rb %d/symbol %d (skip_half %d)\n",rb,l,skip_half);
+#ifdef DEBUG_DLSCH_DEMOD
+ printf("rb %d/symbol %d (skip_half %d)\n",rb,l,skip_half);
#endif
/*
- printf("rb %d\n",rb);
+ printf("rb %d\n",rb);
for (i=0;i<12;i++)
printf("(%d %d)",((short *)dl_ch0)[i<<1],((short*)dl_ch0)[1+(i<<1)]);
printf("\n");
*/
if (pilots==0) {
- // printf("Extracting w/o pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half);
+ // printf("Extracting w/o pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half);
if (skip_half==1) {
memcpy(dl_ch0_ext,dl_ch0,6*sizeof(int));
for (i=0; i<6; i++) {
rxF_ext[i]=rxF[i];
-#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+#ifdef DEBUG_DLSCH_DEMOD
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
- }
+ }
dl_ch0_ext+=6;
rxF_ext+=6;
@@ -3805,9 +4435,9 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
for (i=0; i<6; i++) {
rxF_ext[i]=rxF[(i+6)];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
- }
+ }
dl_ch0_ext+=6;
rxF_ext+=6;
@@ -3817,14 +4447,14 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
for (i=0; i<12; i++) {
rxF_ext[i]=rxF[i];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
- }
+ }
dl_ch0_ext+=12;
rxF_ext+=12;
}
} else {
- // printf("Extracting with pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half);
+ // printf("Extracting with pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half);
j=0;
if (skip_half==1) {
@@ -3832,7 +4462,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
if (i!=((frame_parms->nushift+poffset)%6)) {
rxF_ext[j]=rxF[i];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
#endif
dl_ch0_ext[j++]=dl_ch0[i];
}
@@ -3845,7 +4475,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
if (i!=((frame_parms->nushift+poffset)%6)) {
rxF_ext[j]=rxF[(i+6)];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
#endif
dl_ch0_ext[j++]=dl_ch0[i+6];
}
@@ -3859,12 +4489,11 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
(i!=((frame_parms->nushift+poffset+6)%12))) {
rxF_ext[j]=rxF[i];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
#endif
dl_ch0_ext[j++]=dl_ch0[i];
}
}
-
dl_ch0_ext+=10;
rxF_ext+=10;
}
@@ -3876,7 +4505,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
}
}
}
-
+
return(nb_rb/frame_parms->nb_antennas_rx);
}
@@ -3891,9 +4520,8 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
unsigned char symbol,
unsigned char subframe,
uint32_t high_speed_flag,
- LTE_DL_FRAME_PARMS *frame_parms)
-{
-
+ LTE_DL_FRAME_PARMS *frame_parms,
+ MIMO_mode_t mimo_mode) {
int prb,nb_rb=0;
int prb_off,prb_off2;
@@ -3931,7 +4559,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
}
pmi_loc = pmi_ext;
-
+
// pointers to extracted RX signals and channel estimates
rxF_ext = &rxdataF_ext[aarx][symbol*(frame_parms->N_RB_DL*12)];
dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*(frame_parms->N_RB_DL*12)];
@@ -3939,95 +4567,102 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
for (prb=0; prbN_RB_DL; prb++) {
skip_half=0;
-
+
if (prb < 32)
- rb_alloc_ind = (rb_alloc[0]>>prb) & 1;
+ rb_alloc_ind = (rb_alloc[0]>>prb) & 1;
else if (prb < 64)
- rb_alloc_ind = (rb_alloc[1]>>(prb-32)) & 1;
+ rb_alloc_ind = (rb_alloc[1]>>(prb-32)) & 1;
else if (prb < 96)
- rb_alloc_ind = (rb_alloc[2]>>(prb-64)) & 1;
+ rb_alloc_ind = (rb_alloc[2]>>(prb-64)) & 1;
else if (prb < 100)
- rb_alloc_ind = (rb_alloc[3]>>(prb-96)) & 1;
+ rb_alloc_ind = (rb_alloc[3]>>(prb-96)) & 1;
else
- rb_alloc_ind = 0;
+ rb_alloc_ind = 0;
if (rb_alloc_ind == 1)
nb_rb++;
-
+
if ((frame_parms->N_RB_DL&1) == 0) { // even number of RBs
- // PBCH
- if ((subframe==0) &&
- (prb>=((frame_parms->N_RB_DL>>1)-3)) &&
- (prb<((frame_parms->N_RB_DL>>1)+3)) &&
- (l>=(nsymb>>1)) &&
- (l<((nsymb>>1) + 4))) {
- rb_alloc_ind = 0;
- // printf("symbol %d / rb %d: skipping PBCH REs\n",symbol,prb);
- }
-
- //SSS
-
- if (((subframe==0)||(subframe==5)) &&
- (prb>=((frame_parms->N_RB_DL>>1)-3)) &&
- (prb<((frame_parms->N_RB_DL>>1)+3)) &&
- (l==sss_symb) ) {
- rb_alloc_ind = 0;
- // printf("symbol %d / rb %d: skipping SSS REs\n",symbol,prb);
- }
-
-
-
- //PSS in subframe 0/5 if FDD
- if (frame_parms->frame_type == FDD) { //FDD
- if (((subframe==0)||(subframe==5)) &&
- (prb>=((frame_parms->N_RB_DL>>1)-3)) &&
- (prb<((frame_parms->N_RB_DL>>1)+3)) &&
- (l==pss_symb) ) {
- rb_alloc_ind = 0;
- // printf("symbol %d / rb %d: skipping PSS REs\n",symbol,prb);
- }
- }
-
- if ((frame_parms->frame_type == TDD) &&
- (subframe==6)) { //TDD Subframe 6
- if ((prb>=((frame_parms->N_RB_DL>>1)-3)) &&
- (prb<((frame_parms->N_RB_DL>>1)+3)) &&
- (l==pss_symb) ) {
- rb_alloc_ind = 0;
- }
- }
-
- if (rb_alloc_ind==1) { // PRB is allocated
+ // PBCH
+ if ((subframe==0) &&
+ (prb>=((frame_parms->N_RB_DL>>1)-3)) &&
+ (prb<((frame_parms->N_RB_DL>>1)+3)) &&
+ (l>=(nsymb>>1)) &&
+ (l<((nsymb>>1) + 4))) {
+ rb_alloc_ind = 0;
+ // printf("symbol %d / rb %d: skipping PBCH REs\n",symbol,prb);
+ }
+
+ //SSS
+
+ if (((subframe==0)||(subframe==5)) &&
+ (prb>=((frame_parms->N_RB_DL>>1)-3)) &&
+ (prb<((frame_parms->N_RB_DL>>1)+3)) &&
+ (l==sss_symb) ) {
+ rb_alloc_ind = 0;
+ // printf("symbol %d / rb %d: skipping SSS REs\n",symbol,prb);
+ }
-
- prb_off = 12*prb;
- prb_off2 = 1+(12*(prb-(frame_parms->N_RB_DL>>1)));
- dl_ch0p = dl_ch0+(12*prb);
- dl_ch1p = dl_ch1+(12*prb);
- if (prb<(frame_parms->N_RB_DL>>1)){
- rxF = &rxdataF[aarx][prb_off+
- frame_parms->first_carrier_offset +
- (symbol*(frame_parms->ofdm_symbol_size))];
- }
- else {
- rxF = &rxdataF[aarx][prb_off2+
- (symbol*(frame_parms->ofdm_symbol_size))];
- }
+
+ //PSS in subframe 0/5 if FDD
+ if (frame_parms->frame_type == FDD) { //FDD
+ if (((subframe==0)||(subframe==5)) &&
+ (prb>=((frame_parms->N_RB_DL>>1)-3)) &&
+ (prb<((frame_parms->N_RB_DL>>1)+3)) &&
+ (l==pss_symb) ) {
+ rb_alloc_ind = 0;
+ // printf("symbol %d / rb %d: skipping PSS REs\n",symbol,prb);
+ }
+ }
+
+ if ((frame_parms->frame_type == TDD) &&
+ (subframe==6)) { //TDD Subframe 6
+ if ((prb>=((frame_parms->N_RB_DL>>1)-3)) &&
+ (prb<((frame_parms->N_RB_DL>>1)+3)) &&
+ (l==pss_symb) ) {
+ rb_alloc_ind = 0;
+ }
+ }
+
+ if (rb_alloc_ind==1) { // PRB is allocated
+
+
+
+ prb_off = 12*prb;
+ prb_off2 = 1+(12*(prb-(frame_parms->N_RB_DL>>1)));
+ dl_ch0p = dl_ch0+(12*prb);
+ dl_ch1p = dl_ch1+(12*prb);
+ if (prb<(frame_parms->N_RB_DL>>1)){
+ rxF = &rxdataF[aarx][prb_off+
+ frame_parms->first_carrier_offset +
+ (symbol*(frame_parms->ofdm_symbol_size))];
+ }
+ else {
+ rxF = &rxdataF[aarx][prb_off2+
+ (symbol*(frame_parms->ofdm_symbol_size))];
+ }
+
+ /*
+ if (mimo_mode <= PUSCH_PRECODING1)
*pmi_loc = (pmi>>((prb>>2)<<1))&3;
+ else
+ *pmi_loc=(pmi>>prb)&1;*/
+
+ *pmi_loc = get_pmi(frame_parms->N_RB_DL,mimo_mode,pmi,prb);
pmi_loc++;
-
-
+
+
if (pilots == 0) {
-
+
memcpy(dl_ch0_ext,dl_ch0p,12*sizeof(int));
memcpy(dl_ch1_ext,dl_ch1p,12*sizeof(int));
memcpy(rxF_ext,rxF,12*sizeof(int));
- dl_ch0_ext +=12;
- dl_ch1_ext +=12;
- rxF_ext +=12;
+ dl_ch0_ext +=12;
+ dl_ch1_ext +=12;
+ rxF_ext +=12;
} else { // pilots==1
j=0;
for (i=0; i<12; i++) {
@@ -4041,280 +4676,283 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
dl_ch1_ext[j++]=dl_ch1p[i];
}
}
- dl_ch0_ext+=8;
- dl_ch1_ext+=8;
- rxF_ext+=8;
+ dl_ch0_ext+=8;
+ dl_ch1_ext+=8;
+ rxF_ext+=8;
} // pilots==1
- }
+ }
} else { // Odd number of RBs
// PBCH
- if ((subframe==0) &&
- (prb>((frame_parms->N_RB_DL>>1)-3)) &&
- (prb<((frame_parms->N_RB_DL>>1)+3)) &&
- (l>=(nsymb>>1)) &&
- (l<((nsymb>>1) + 4))) {
- rb_alloc_ind = 0;
- // printf("symbol %d / rb %d: skipping PBCH REs\n",symbol,prb);
- }
-
- //SSS
-
- if (((subframe==0)||(subframe==5)) &&
- (prb>((frame_parms->N_RB_DL>>1)-3)) &&
- (prb<((frame_parms->N_RB_DL>>1)+3)) &&
- (l==sss_symb) ) {
- rb_alloc_ind = 0;
- // printf("symbol %d / rb %d: skipping SSS REs\n",symbol,prb);
- }
-
-
-
- //PSS in subframe 0/5 if FDD
- if (frame_parms->frame_type == FDD) { //FDD
- if (((subframe==0)||(subframe==5)) &&
- (prb>((frame_parms->N_RB_DL>>1)-3)) &&
- (prb<((frame_parms->N_RB_DL>>1)+3)) &&
- (l==pss_symb) ) {
- rb_alloc_ind = 0;
- // printf("symbol %d / rb %d: skipping PSS REs\n",symbol,prb);
- }
- }
-
- if ((frame_parms->frame_type == TDD) &&
- ((subframe==1) || (subframe==6))) { //TDD Subframe 1-6
- if ((prb>((frame_parms->N_RB_DL>>1)-3)) &&
- (prb<((frame_parms->N_RB_DL>>1)+3)) &&
- (l==pss_symb) ) {
- rb_alloc_ind = 0;
- }
- }
+ if ((subframe==0) &&
+ (prb>((frame_parms->N_RB_DL>>1)-3)) &&
+ (prb<((frame_parms->N_RB_DL>>1)+3)) &&
+ (l>=(nsymb>>1)) &&
+ (l<((nsymb>>1) + 4))) {
+ rb_alloc_ind = 0;
+ // printf("symbol %d / rb %d: skipping PBCH REs\n",symbol,prb);
+ }
- if (rb_alloc_ind == 1) {
- skip_half=0;
-
- //Check if we have to drop half a PRB due to PSS/SSS/PBCH
- // skip_half == 0 means full PRB
- // skip_half == 1 means first half is used (leftmost half-PRB from PSS/SSS/PBCH)
- // skip_half == 2 means second half is used (rightmost half-PRB from PSS/SSS/PBCH)
- //PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3
- if ((subframe==0) &&
- (prb==((frame_parms->N_RB_DL>>1)-3)) &&
- (l>=(nsymb>>1)) &&
- (l<((nsymb>>1) + 4)))
- skip_half=1;
- else if ((subframe==0) &&
- (prb==((frame_parms->N_RB_DL>>1)+3)) &&
- (l>=(nsymb>>1)) &&
- (l<((nsymb>>1) + 4)))
- skip_half=2;
-
- //SSS
- if (((subframe==0)||(subframe==5)) &&
- (prb==((frame_parms->N_RB_DL>>1)-3)) &&
- (l==sss_symb))
- skip_half=1;
- else if (((subframe==0)||(subframe==5)) &&
- (prb==((frame_parms->N_RB_DL>>1)+3)) &&
- (l==sss_symb))
- skip_half=2;
-
- //PSS Subframe 0,5
- if (((frame_parms->frame_type == FDD) &&
- (((subframe==0)||(subframe==5)))) || //FDD Subframes 0,5
- ((frame_parms->frame_type == TDD) &&
- (((subframe==1) || (subframe==6))))) { //TDD Subframes 1,6
-
- if ((prb==((frame_parms->N_RB_DL>>1)-3)) &&
- (l==pss_symb))
- skip_half=1;
- else if ((prb==((frame_parms->N_RB_DL>>1)+3)) &&
- (l==pss_symb))
- skip_half=2;
- }
-
-
- prb_off = 12*prb;
- prb_off2 = 7+(12*(prb-(frame_parms->N_RB_DL>>1)-1));
- dl_ch0p = dl_ch0+(12*prb);
- dl_ch1p = dl_ch1+(12*prb);
-
- if (prb<=(frame_parms->N_RB_DL>>1)){
- rxF = &rxdataF[aarx][prb_off+
- frame_parms->first_carrier_offset +
- (symbol*(frame_parms->ofdm_symbol_size))];
- }
- else {
- rxF = &rxdataF[aarx][prb_off2+
- (symbol*(frame_parms->ofdm_symbol_size))];
- }
+ //SSS
+
+ if (((subframe==0)||(subframe==5)) &&
+ (prb>((frame_parms->N_RB_DL>>1)-3)) &&
+ (prb<((frame_parms->N_RB_DL>>1)+3)) &&
+ (l==sss_symb) ) {
+ rb_alloc_ind = 0;
+ // printf("symbol %d / rb %d: skipping SSS REs\n",symbol,prb);
+ }
+
+
+
+ //PSS in subframe 0/5 if FDD
+ if (frame_parms->frame_type == FDD) { //FDD
+ if (((subframe==0)||(subframe==5)) &&
+ (prb>((frame_parms->N_RB_DL>>1)-3)) &&
+ (prb<((frame_parms->N_RB_DL>>1)+3)) &&
+ (l==pss_symb) ) {
+ rb_alloc_ind = 0;
+ // printf("symbol %d / rb %d: skipping PSS REs\n",symbol,prb);
+ }
+ }
+
+ if ((frame_parms->frame_type == TDD) &&
+ ((subframe==1) || (subframe==6))) { //TDD Subframe 1-6
+ if ((prb>((frame_parms->N_RB_DL>>1)-3)) &&
+ (prb<((frame_parms->N_RB_DL>>1)+3)) &&
+ (l==pss_symb) ) {
+ rb_alloc_ind = 0;
+ }
+ }
+
+ if (rb_alloc_ind == 1) {
+ skip_half=0;
+
+ //Check if we have to drop half a PRB due to PSS/SSS/PBCH
+ // skip_half == 0 means full PRB
+ // skip_half == 1 means first half is used (leftmost half-PRB from PSS/SSS/PBCH)
+ // skip_half == 2 means second half is used (rightmost half-PRB from PSS/SSS/PBCH)
+ //PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3
+ if ((subframe==0) &&
+ (prb==((frame_parms->N_RB_DL>>1)-3)) &&
+ (l>=(nsymb>>1)) &&
+ (l<((nsymb>>1) + 4)))
+ skip_half=1;
+ else if ((subframe==0) &&
+ (prb==((frame_parms->N_RB_DL>>1)+3)) &&
+ (l>=(nsymb>>1)) &&
+ (l<((nsymb>>1) + 4)))
+ skip_half=2;
+
+ //SSS
+ if (((subframe==0)||(subframe==5)) &&
+ (prb==((frame_parms->N_RB_DL>>1)-3)) &&
+ (l==sss_symb))
+ skip_half=1;
+ else if (((subframe==0)||(subframe==5)) &&
+ (prb==((frame_parms->N_RB_DL>>1)+3)) &&
+ (l==sss_symb))
+ skip_half=2;
+
+ //PSS Subframe 0,5
+ if (((frame_parms->frame_type == FDD) &&
+ (((subframe==0)||(subframe==5)))) || //FDD Subframes 0,5
+ ((frame_parms->frame_type == TDD) &&
+ (((subframe==1) || (subframe==6))))) { //TDD Subframes 1,6
+
+ if ((prb==((frame_parms->N_RB_DL>>1)-3)) &&
+ (l==pss_symb))
+ skip_half=1;
+ else if ((prb==((frame_parms->N_RB_DL>>1)+3)) &&
+ (l==pss_symb))
+ skip_half=2;
+ }
+
+
+ prb_off = 12*prb;
+ prb_off2 = 7+(12*(prb-(frame_parms->N_RB_DL>>1)-1));
+ dl_ch0p = dl_ch0+(12*prb);
+ dl_ch1p = dl_ch1+(12*prb);
+
+ if (prb<=(frame_parms->N_RB_DL>>1)){
+ rxF = &rxdataF[aarx][prb_off+
+ frame_parms->first_carrier_offset +
+ (symbol*(frame_parms->ofdm_symbol_size))];
+ }
+ else {
+ rxF = &rxdataF[aarx][prb_off2+
+ (symbol*(frame_parms->ofdm_symbol_size))];
+ }
#ifdef DEBUG_DLSCH_DEMOD
- printf("symbol %d / rb %d: alloc %d skip_half %d (rxF %p, rxF_ext %p) prb_off (%d,%d)\n",symbol,prb,rb_alloc_ind,skip_half,rxF,rxF_ext,prb_off,prb_off2);
+ printf("symbol %d / rb %d: alloc %d skip_half %d (rxF %p, rxF_ext %p) prb_off (%d,%d)\n",symbol,prb,rb_alloc_ind,skip_half,rxF,rxF_ext,prb_off,prb_off2);
#endif
- *pmi_loc = (pmi>>((prb>>2)<<1))&3;
- // printf("symbol_mod %d (pilots %d) rb %d, sb %d, pmi %d (pmi_loc %p,rxF %p, ch00 %p, ch01 %p, rxF_ext %p dl_ch0_ext %p dl_ch1_ext %p)\n",symbol_mod,pilots,rb,rb>>2,*pmi_loc,pmi_loc,rxF,dl_ch0, dl_ch1, rxF_ext,dl_ch0_ext,dl_ch1_ext);
-
+ /* if (mimo_mode <= PUSCH_PRECODING1)
+ *pmi_loc = (pmi>>((prb>>2)<<1))&3;
+ else
+ *pmi_loc=(pmi>>prb)&1;
+ // printf("symbol_mod %d (pilots %d) rb %d, sb %d, pmi %d (pmi_loc %p,rxF %p, ch00 %p, ch01 %p, rxF_ext %p dl_ch0_ext %p dl_ch1_ext %p)\n",symbol_mod,pilots,prb,prb>>2,*pmi_loc,pmi_loc,rxF,dl_ch0, dl_ch1, rxF_ext,dl_ch0_ext,dl_ch1_ext);
+*/
+ *pmi_loc = get_pmi(frame_parms->N_RB_DL,mimo_mode,pmi,prb);
pmi_loc++;
- if (prb != (frame_parms->N_RB_DL>>1)) { // This PRB is not around DC
- if (pilots==0) {
- if (skip_half==1) {
- memcpy(dl_ch0_ext,dl_ch0p,6*sizeof(int32_t));
- memcpy(dl_ch1_ext,dl_ch1p,6*sizeof(int32_t));
- memcpy(rxF_ext,rxF,6*sizeof(int32_t));
+ if (prb != (frame_parms->N_RB_DL>>1)) { // This PRB is not around DC
+ if (pilots==0) {
+ if (skip_half==1) {
+ memcpy(dl_ch0_ext,dl_ch0p,6*sizeof(int32_t));
+ memcpy(dl_ch1_ext,dl_ch1p,6*sizeof(int32_t));
+ memcpy(rxF_ext,rxF,6*sizeof(int32_t));
#ifdef DEBUG_DLSCH_DEMOD
- for (i=0;i<6;i++)
- printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ for (i=0;i<6;i++)
+ printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
- dl_ch0_ext+=6;
- dl_ch1_ext+=6;
- rxF_ext+=6;
- } else if (skip_half==2) {
- memcpy(dl_ch0_ext,dl_ch0p+6,6*sizeof(int32_t));
- memcpy(dl_ch1_ext,dl_ch1p+6,6*sizeof(int32_t));
- memcpy(rxF_ext,rxF+6,6*sizeof(int32_t));
+ dl_ch0_ext+=6;
+ dl_ch1_ext+=6;
+ rxF_ext+=6;
+ } else if (skip_half==2) {
+ memcpy(dl_ch0_ext,dl_ch0p+6,6*sizeof(int32_t));
+ memcpy(dl_ch1_ext,dl_ch1p+6,6*sizeof(int32_t));
+ memcpy(rxF_ext,rxF+6,6*sizeof(int32_t));
#ifdef DEBUG_DLSCH_DEMOD
- for (i=0;i<6;i++)
- printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ for (i=0;i<6;i++)
+ printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
- dl_ch0_ext+=6;
- dl_ch1_ext+=6;
- rxF_ext+=6;
- } else { // skip_half==0
- memcpy(dl_ch0_ext,dl_ch0p,12*sizeof(int32_t));
- memcpy(dl_ch1_ext,dl_ch1p,12*sizeof(int32_t));
- memcpy(rxF_ext,rxF,12*sizeof(int32_t));
+ dl_ch0_ext+=6;
+ dl_ch1_ext+=6;
+ rxF_ext+=6;
+ } else { // skip_half==0
+ memcpy(dl_ch0_ext,dl_ch0p,12*sizeof(int32_t));
+ memcpy(dl_ch1_ext,dl_ch1p,12*sizeof(int32_t));
+ memcpy(rxF_ext,rxF,12*sizeof(int32_t));
#ifdef DEBUG_DLSCH_DEMOD
- for (i=0;i<12;i++)
- printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ for (i=0;i<12;i++)
+ printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
- dl_ch0_ext+=12;
- dl_ch1_ext+=12;
- rxF_ext+=12;
- }
- } else { // pilots=1
- j=0;
-
- if (skip_half==1) {
- for (i=0; i<6; i++) {
- if ((i!=frame_parms->nushift) &&
- (i!=((frame_parms->nushift+3)%6))) {
- rxF_ext[j]=rxF[i];
-#ifdef DEBUG_DLSCH_DEMOD
- printf("(pilots,skip1)extract rb %d, re %d (%d)=> (%d,%d)\n",prb,i,j,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
-#endif
- dl_ch0_ext[j]=dl_ch0p[i];
- dl_ch1_ext[j++]=dl_ch1p[i];
- }
- }
- dl_ch0_ext+=4;
- dl_ch1_ext+=4;
- rxF_ext+=4;
- } else if (skip_half==2) {
- for (i=0; i<6; i++) {
- if ((i!=frame_parms->nushift) &&
- (i!=((frame_parms->nushift+3)%6))) {
- rxF_ext[j]=rxF[(i+6)];
-#ifdef DEBUG_DLSCH_DEMOD
- printf("(pilots,skip2)extract rb %d, re %d (%d) => (%d,%d)\n",prb,i,j,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
-#endif
- dl_ch0_ext[j]=dl_ch0p[i+6];
- dl_ch1_ext[j++]=dl_ch1p[i+6];
- }
- }
- dl_ch0_ext+=4;
- dl_ch1_ext+=4;
- rxF_ext+=4;
+ dl_ch0_ext+=12;
+ dl_ch1_ext+=12;
+ rxF_ext+=12;
+ }
+ } else { // pilots=1
+ j=0;
- } else { //skip_half==0
- for (i=0; i<12; i++) {
- if ((i!=frame_parms->nushift) &&
- (i!=frame_parms->nushift+3) &&
- (i!=frame_parms->nushift+6) &&
- (i!=((frame_parms->nushift+9)%12))) {
- rxF_ext[j]=rxF[i];
+ if (skip_half==1) {
+ for (i=0; i<6; i++) {
+ if ((i!=frame_parms->nushift) &&
+ (i!=((frame_parms->nushift+3)%6))) {
+ rxF_ext[j]=rxF[i];
#ifdef DEBUG_DLSCH_DEMOD
- printf("(pilots)extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
+ printf("(pilots,skip1)extract rb %d, re %d (%d)=> (%d,%d)\n",prb,i,j,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
#endif
- dl_ch0_ext[j] =dl_ch0p[i];
- dl_ch1_ext[j++]=dl_ch1p[i];
- }
- }
- dl_ch0_ext+=8;
- dl_ch1_ext+=8;
- rxF_ext+=8;
- } //skip_half==0
- } //pilots==1
- } else { // Do middle RB (around DC)
-
- if (pilots==0) {
- memcpy(dl_ch0_ext,dl_ch0p,6*sizeof(int32_t));
- memcpy(dl_ch1_ext,dl_ch1p,6*sizeof(int32_t));
- memcpy(rxF_ext,rxF,6*sizeof(int32_t));
+ dl_ch0_ext[j]=dl_ch0p[i];
+ dl_ch1_ext[j++]=dl_ch1p[i];
+ }
+ }
+ dl_ch0_ext+=4;
+ dl_ch1_ext+=4;
+ rxF_ext+=4;
+ } else if (skip_half==2) {
+ for (i=0; i<6; i++) {
+ if ((i!=frame_parms->nushift) &&
+ (i!=((frame_parms->nushift+3)%6))) {
+ rxF_ext[j]=rxF[(i+6)];
#ifdef DEBUG_DLSCH_DEMOD
- for (i=0; i<6; i++) {
- printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
- }
+ printf("(pilots,skip2)extract rb %d, re %d (%d) => (%d,%d)\n",prb,i,j,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
#endif
- rxF_ext+=6;
- dl_ch0_ext+=6;
- dl_ch1_ext+=6;
- dl_ch0p+=6;
- dl_ch1p+=6;
-
- rxF = &rxdataF[aarx][1+((symbol*(frame_parms->ofdm_symbol_size)))];
+ dl_ch0_ext[j]=dl_ch0p[i+6];
+ dl_ch1_ext[j++]=dl_ch1p[i+6];
+ }
+ }
+ dl_ch0_ext+=4;
+ dl_ch1_ext+=4;
+ rxF_ext+=4;
- memcpy(dl_ch0_ext,dl_ch0p,6*sizeof(int32_t));
- memcpy(dl_ch1_ext,dl_ch1p,6*sizeof(int32_t));
- memcpy(rxF_ext,rxF,6*sizeof(int32_t));
+ } else { //skip_half==0
+ for (i=0; i<12; i++) {
+ if ((i!=frame_parms->nushift) &&
+ (i!=frame_parms->nushift+3) &&
+ (i!=frame_parms->nushift+6) &&
+ (i!=((frame_parms->nushift+9)%12))) {
+ rxF_ext[j]=rxF[i];
#ifdef DEBUG_DLSCH_DEMOD
- for (i=0; i<6; i++) {
- printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
- }
+ printf("(pilots)extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
#endif
- rxF_ext+=6;
- dl_ch0_ext+=6;
- dl_ch1_ext+=6;
- } else { // pilots==1
- j=0;
-
- for (i=0; i<6; i++) {
- if ((i!=frame_parms->nushift) &&
- (i!=((frame_parms->nushift+3)%6))) {
- dl_ch0_ext[j]=dl_ch0p[i];
- dl_ch1_ext[j]=dl_ch1p[i];
- rxF_ext[j++]=rxF[i];
+ dl_ch0_ext[j] =dl_ch0p[i];
+ dl_ch1_ext[j++]=dl_ch1p[i];
+ }
+ }
+ dl_ch0_ext+=8;
+ dl_ch1_ext+=8;
+ rxF_ext+=8;
+ } //skip_half==0
+ } //pilots==1
+ } else { // Do middle RB (around DC)
+
+ if (pilots==0) {
+ memcpy(dl_ch0_ext,dl_ch0p,6*sizeof(int32_t));
+ memcpy(dl_ch1_ext,dl_ch1p,6*sizeof(int32_t));
+ memcpy(rxF_ext,rxF,6*sizeof(int32_t));
#ifdef DEBUG_DLSCH_DEMOD
- printf("(pilots)extract rb %d, re %d (%d) => (%d,%d)\n",prb,i,j,*(short *)&rxF[i],*(1+(short*)&rxF[i]));
+ for (i=0; i<6; i++) {
+ printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ }
#endif
- }
- }
- rxF = &rxdataF[aarx][1+symbol*(frame_parms->ofdm_symbol_size)];
-
- for (; i<12; i++) {
- if ((i!=((frame_parms->nushift+6)%12)) &&
- (i!=((frame_parms->nushift+9)%12))) {
- dl_ch0_ext[j]=dl_ch0p[i];
- dl_ch1_ext[j]=dl_ch1p[i];
- rxF_ext[j++]=rxF[i-6];
+ rxF_ext+=6;
+ dl_ch0_ext+=6;
+ dl_ch1_ext+=6;
+ dl_ch0p+=6;
+ dl_ch1p+=6;
+
+ rxF = &rxdataF[aarx][1+((symbol*(frame_parms->ofdm_symbol_size)))];
+
+ memcpy(dl_ch0_ext,dl_ch0p,6*sizeof(int32_t));
+ memcpy(dl_ch1_ext,dl_ch1p,6*sizeof(int32_t));
+ memcpy(rxF_ext,rxF,6*sizeof(int32_t));
#ifdef DEBUG_DLSCH_DEMOD
- printf("(pilots)extract rb %d, re %d (%d) => (%d,%d)\n",prb,i,j,*(short *)&rxF[1+i-6],*(1+(short*)&rxF[1+i-6]));
+ for (i=0; i<6; i++) {
+ printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ }
#endif
- }
- }
-
- dl_ch0_ext+=8;
- dl_ch1_ext+=8;
- rxF_ext+=8;
- } //pilots==1
- } // if Middle PRB
- } // if odd PRB
+ rxF_ext+=6;
+ dl_ch0_ext+=6;
+ dl_ch1_ext+=6;
+ } else { // pilots==1
+ j=0;
+
+ for (i=0; i<6; i++) {
+ if ((i!=frame_parms->nushift) &&
+ (i!=((frame_parms->nushift+3)%6))) {
+ dl_ch0_ext[j]=dl_ch0p[i];
+ dl_ch1_ext[j]=dl_ch1p[i];
+ rxF_ext[j++]=rxF[i];
+#ifdef DEBUG_DLSCH_DEMOD
+ printf("(pilots)extract rb %d, re %d (%d) => (%d,%d)\n",prb,i,j,*(short *)&rxF[i],*(1+(short*)&rxF[i]));
+#endif
+ }
+ }
+ rxF = &rxdataF[aarx][1+symbol*(frame_parms->ofdm_symbol_size)];
+
+ for (; i<12; i++) {
+ if ((i!=((frame_parms->nushift+6)%12)) &&
+ (i!=((frame_parms->nushift+9)%12))) {
+ dl_ch0_ext[j]=dl_ch0p[i];
+ dl_ch1_ext[j]=dl_ch1p[i];
+ rxF_ext[j++]=rxF[i-6];
+#ifdef DEBUG_DLSCH_DEMOD
+ printf("(pilots)extract rb %d, re %d (%d) => (%d,%d)\n",prb,i,j,*(short *)&rxF[1+i-6],*(1+(short*)&rxF[1+i-6]));
+#endif
+ }
+ }
+
+ dl_ch0_ext+=8;
+ dl_ch1_ext+=8;
+ rxF_ext+=8;
+ } //pilots==1
+ } // if Middle PRB
+ } // if odd PRB
} // if rballoc==1
- } // for prb
+ } // for prb
} // for aarx
-
return(nb_rb/frame_parms->nb_antennas_rx);
}
@@ -4390,7 +5028,7 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
else
rb_alloc_ind = 0;
- if (rb_alloc_ind == 1)
+ if (rb_alloc_ind == 1)
nb_rb++;
// For second half of RBs skip DC carrier
@@ -4398,7 +5036,7 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
rxF = &rxdataF[aarx][(1 + (symbol*(frame_parms->ofdm_symbol_size)))];
//dl_ch0++;
}
-
+
// 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;
@@ -4459,23 +5097,23 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
j=0;
- for (i=0; i<12; i++){
+ for (i=0; i<12; i++){
if (frame_parms->Ncp==0){
- if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){
- rxF_ext[j] = rxF[i];
- dl_ch0_ext[j++]=dl_ch0[i];
+ if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){
+ rxF_ext[j] = rxF[i];
+ dl_ch0_ext[j++]=dl_ch0[i];
}
} else{
- if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){
- rxF_ext[j] = rxF[i];
+ if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){
+ rxF_ext[j] = rxF[i];
dl_ch0_ext[j++]=dl_ch0[i];
- }
+ }
}
-
- }
-
+
+ }
+
dl_ch0_ext+=9-frame_parms->Ncp;
- rxF_ext+=9-frame_parms->Ncp;
+ rxF_ext+=9-frame_parms->Ncp;
} else {
msg("dlsch_extract_rbs_TM7(dl_demodulation.c):pilot or ue spec pilot detection error\n");
@@ -4574,7 +5212,7 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
for (i=0; i<6; i++) {
rxF_ext[i]=rxF[i];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
@@ -4586,7 +5224,7 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
for (i=0; i<6; i++) {
rxF_ext[i]=rxF[(i+6)];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
@@ -4614,7 +5252,7 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
rxF_ext[j]=rxF[i];
dl_ch0_ext[j++]=dl_ch0[i];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
}
@@ -4627,7 +5265,7 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
rxF_ext[j]=rxF[(i+6)];
dl_ch0_ext[j++]=dl_ch0[i+6];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
}
@@ -4661,7 +5299,7 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
rxF_ext[j]=rxF[i];
dl_ch0_ext[j++]=dl_ch0[i];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
}
@@ -4670,11 +5308,11 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
} else{
for (i=0; i<6; i++) {
- if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){
+ if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){
rxF_ext[j]=rxF[i];
dl_ch0_ext[j++]=dl_ch0[i];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
}
@@ -4689,7 +5327,7 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
rxF_ext[j]=rxF[(i+6)];
dl_ch0_ext[j++]=dl_ch0[i+6];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
}
@@ -4698,11 +5336,11 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
} else {
for (i=0; i<6; i++) {
- if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){
+ if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){
rxF_ext[j]=rxF[(i+6)];
dl_ch0_ext[j++]=dl_ch0[i+6];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
}
@@ -4712,35 +5350,35 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
} else {
- for (i=0; i<12; i++){
+ for (i=0; i<12; i++){
if (frame_parms->Ncp==0){
if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){
- rxF_ext[j] = rxF[i];
- dl_ch0_ext[j++] = dl_ch0[i];
+ rxF_ext[j] = rxF[i];
+ dl_ch0_ext[j++] = dl_ch0[i];
#ifdef DEBUG_DLSCH_DEMOD
printf("extract rb %d, re %d, j %d => (%d,%d)\n",symbol,rb,i,j-1,*(short *)&dl_ch0[j],*(1+(short*)&dl_ch0[i]));
#endif
}
} else{
- if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){
- rxF_ext[j] = rxF[i];
- dl_ch0_ext[j++]=dl_ch0[i];
+ if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){
+ rxF_ext[j] = rxF[i];
+ dl_ch0_ext[j++]=dl_ch0[i];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
- }
+ }
}
-
- }
-
+
+ }
+
dl_ch0_ext+=9-frame_parms->Ncp;
- rxF_ext+=9-frame_parms->Ncp;
- }
-
+ rxF_ext+=9-frame_parms->Ncp;
+ }
+
} else {
msg("dlsch_extract_rbs_TM7(dl_demodulation.c):pilot or ue spec pilot detection error\n");
exit(-1);
-
+
}
}
@@ -4797,7 +5435,7 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
dl_ch0_ext[i]=dl_ch0[i];
rxF_ext[i]=rxF[i];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
@@ -4807,7 +5445,7 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
dl_ch0_ext[i]=dl_ch0[i];
rxF_ext[i]=rxF[(1+i-6)];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
@@ -4821,7 +5459,7 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
dl_ch0_ext[j]=dl_ch0[i];
rxF_ext[j++]=rxF[i];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
}
@@ -4833,7 +5471,7 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
dl_ch0_ext[j]=dl_ch0[i];
rxF_ext[j++]=rxF[(1+i-6)];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
}
@@ -4843,52 +5481,52 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
} else if(pilots==0 && uespec_pilots==1) {
j=0;
- for (i=0; i<6; i++) {
+ for (i=0; i<6; i++) {
if (frame_parms->Ncp==0){
- if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){
- dl_ch0_ext[j]=dl_ch0[i];
- rxF_ext[j++] = rxF[i];
+ if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){
+ dl_ch0_ext[j]=dl_ch0[i];
+ rxF_ext[j++] = rxF[i];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
} else {
if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){
- dl_ch0_ext[j]=dl_ch0[i];
- rxF_ext[j++] = rxF[i];
+ dl_ch0_ext[j]=dl_ch0[i];
+ rxF_ext[j++] = rxF[i];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
}
- }
-
+ }
+
rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))];
for (; i<12; i++) {
if (frame_parms->Ncp==0){
- if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){
+ if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){
dl_ch0_ext[j]=dl_ch0[i];
rxF_ext[j++]=rxF[(1+i-6)];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
} else {
if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){
- dl_ch0_ext[j]=dl_ch0[i];
- rxF_ext[j++] = rxF[(1+i-6)];
+ dl_ch0_ext[j]=dl_ch0[i];
+ rxF_ext[j++] = rxF[(1+i-6)];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
}
}
-
+
dl_ch0_ext+=9-frame_parms->Ncp;
- rxF_ext+=9-frame_parms->Ncp;
-
- }// symbol_mod==0
+ rxF_ext+=9-frame_parms->Ncp;
+
+ }// symbol_mod==0
} // rballoc==1
else {
@@ -4981,7 +5619,7 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
for (i=0; i<6; i++) {
rxF_ext[i]=rxF[i];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
@@ -4994,7 +5632,7 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
for (i=0; i<6; i++) {
rxF_ext[i]=rxF[i+6];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
@@ -5008,7 +5646,7 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
for (i=0; i<12; i++) {
rxF_ext[i]=rxF[i];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
@@ -5025,7 +5663,7 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
rxF_ext[j]=rxF[i];
dl_ch0_ext[j++]=dl_ch0[i];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
}
@@ -5038,7 +5676,7 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
rxF_ext[j]=rxF[(i+6)];
dl_ch0_ext[j++]=dl_ch0[i+6];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
}
@@ -5070,7 +5708,7 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
rxF_ext[j]=rxF[i];
dl_ch0_ext[j++]=dl_ch0[i];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
}
@@ -5079,11 +5717,11 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
} else{
for (i=0; i<6; i++) {
- if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){
+ if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){
rxF_ext[j]=rxF[i];
dl_ch0_ext[j++]=dl_ch0[i];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
}
@@ -5098,7 +5736,7 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
rxF_ext[j]=rxF[i+6];
dl_ch0_ext[j++]=dl_ch0[i+6];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
}
@@ -5107,11 +5745,11 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
} else {
for (i=0; i<6; i++) {
- if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){
+ if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){
rxF_ext[j]=rxF[(i+6)];
dl_ch0_ext[j++]=dl_ch0[i+6];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
}
@@ -5120,31 +5758,31 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
}
} else {
- for (i=0; i<12; i++){
+ for (i=0; i<12; i++){
if (frame_parms->Ncp==0){
if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){
- rxF_ext[j] = rxF[i];
- dl_ch0_ext[j++]=dl_ch0[i];
+ rxF_ext[j] = rxF[i];
+ dl_ch0_ext[j++]=dl_ch0[i];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
} else{
- if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){
- rxF_ext[j] = rxF[i];
- dl_ch0_ext[j++]=dl_ch0[i];
+ if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){
+ rxF_ext[j] = rxF[i];
+ dl_ch0_ext[j++]=dl_ch0[i];
#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+ printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
#endif
}
}
- }
-
+ }
+
dl_ch0_ext+=9-frame_parms->Ncp;
- rxF_ext+=9-frame_parms->Ncp;
+ rxF_ext+=9-frame_parms->Ncp;
}
-
+
}// pilots=0
}
@@ -5159,16 +5797,14 @@ unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
return(nb_rb/frame_parms->nb_antennas_rx);
}
-
-
//==============================================================================================
#ifdef USER_MODE
+
void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe,uint16_t coded_bits_per_codeword,int round)
{
-
unsigned int nsymb = (ue->frame_parms.Ncp == 0) ? 14 : 12;
char fname[32],vname[32];
int N_RB_DL=ue->frame_parms.N_RB_DL;
@@ -5227,6 +5863,12 @@ void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe,uint16_t coded_
*/
sprintf(fname,"dlsch%d_r%d_rho.m",eNB_id,round);
sprintf(vname,"dl_rho_r%d_%d",eNB_id,round);
+
+ write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_rho_ext[round][0],12*N_RB_DL*nsymb,1,1);
+
+ sprintf(fname,"dlsch%d_r%d_rho2.m",eNB_id,round);
+ sprintf(vname,"dl_rho2_r%d_%d",eNB_id,round);
+
write_output(fname,vname,ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_rho_ext[0],12*N_RB_DL*nsymb,1,1);
sprintf(fname,"dlsch%d_rxF_r%d_comp0.m",eNB_id,round);
@@ -5262,7 +5904,7 @@ void print_bytes(char *s,__m128i *x)
printf("%s : %d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",s,
tempb[0],tempb[1],tempb[2],tempb[3],tempb[4],tempb[5],tempb[6],tempb[7],
tempb[8],tempb[9],tempb[10],tempb[11],tempb[12],tempb[13],tempb[14],tempb[15]
- );
+ );
}
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c
index 8165bc1f23..2906c47e45 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c
@@ -31,6 +31,7 @@
*/
#include "PHY/defs.h"
+#include "PHY/TOOLS/defs.h"
#include "PHY/extern.h"
#include "defs.h"
#include "extern.h"
@@ -667,11 +668,11 @@ int dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
}
- // printf("dlsch_qpsk_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
-
+ //printf("dlsch_qpsk_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
+ //printf("ll32p=%p , dlsch_llr=%p, symbol=%d, flag=%d \n", llr32, dlsch_llr, symbol, first_symbol_flag);
for (i=0; iN_RB_DL*12];
+ int16_t rho_rho_amp_x0[2*frame_parms->N_RB_DL*12];
+ int16_t clean_x1[2*frame_parms->N_RB_DL*12];
+ uint16_t amp_tmp;
+ uint16_t *llr16=(uint16_t*)dlsch_llr;
+ int i, len, nsymb;
+ uint8_t symbol, symbol_mod;
+ //uint8_t pilots;
+ int len_acc=0;
+ uint16_t *sic_data;
+ uint16_t pbch_pss_sss_adjust;
+
+ nsymb = (frame_parms->Ncp==0) ? 14:12;
+
+ for (symbol=num_pdcch_symbols; symbolN_RB_DL*12)]);
+ int16_t *rho_1=(int16_t*)(&rho_i[0][((int16_t)symbol*frame_parms->N_RB_DL*12)]);
+ sic_data = (uint16_t*)&sic_buffer[0][((int16_t)len_acc)];
+
+ symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
+
+
+
+
+ if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) //pilots=1
+ amp_tmp=dlsch0->sqrt_rho_b;
+ else //pilots=0
+ amp_tmp=dlsch0->sqrt_rho_a;
+
+ if (mod_order_0==6)
+ amp_tmp=amp_tmp<<1; // to compensate for >> 1 shift in modulation
+
+
+ pbch_pss_sss_adjust=adjust_G2(frame_parms,&rb_alloc,2,subframe,symbol);
+
+ // printf("amp_tmp=%d\n", amp_tmp);
+
+ 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);
+ else
+ len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
+ } else {
+ len = (nb_rb*12) - pbch_pss_sss_adjust;
+ }
+
+ // printf("dlsch_qpsk_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
+
+ len_acc+=len; //accumulated length; this is done because in sic_buffer we have only data symbols
+
+ multadd_complex_vector_real_scalar((int16_t *)sic_data,
+ amp_tmp,
+ (int16_t *)rho_amp_x0, //this is in Q13
+ 1,
+ len);
+
+
+ // printf ("Got x0*rho_a\n");
+
+ mult_cpx_vector((int16_t *)rho_1, //Q15
+ (int16_t *)rho_amp_x0, //Q13
+ (int16_t*)rho_rho_amp_x0,
+ len,
+ 13);
+ /* write_output("rho_for_multipl.m","rho_for_multipl", rho_1,len,1,
+ symbol==num_pdcch_symbols ? 15 :
+ symbol==nsymb-1 ? 14 : 13);
+
+ write_output("rho_rho_in_llr.m","rho2", rho_rho_amp_x0,len,1,
+ symbol==num_pdcch_symbols ? 15 :
+ symbol==nsymb-1 ? 14 : 13);
+ // printf ("Computed rho*rho_a*x0\n");*/
+
+
+ //rho_rho_amp_x0_512 = (int16_t)((512*(int16_t *)rho_rho_amp_x0)>>15);
+
+
+ sub_cpx_vector16((int16_t *)rxF,
+ (int16_t *)rho_rho_amp_x0,
+ //(int16_t *)clean_x1,
+ (int16_t *)rxF,
+ len*2);
+
+ // write_output("rxFdata_comp1_after.m","rxF_a", rxF,len,1,1);
+ // write_output("clean_x1.m","x1", clean_x1,len,1,1);
+ // printf ("Interference removed \n");
+ /* write_output("clean_x1.m","x1", clean_x1,len,1,
+ symbol==num_pdcch_symbols ? 15 :
+ symbol==nsymb-1 ? 14 : 13);
+
+ write_output("rxF_comp1.m","rxF_1_comp", rxF,len,1,
+ symbol==num_pdcch_symbols ? 15 :
+ symbol==nsymb-1 ? 14 : 13);*/
+
+ // printf("dlsch_qpsk_llr_SIC: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
+
+
+ //this is for QPSK only!!!
+ for (i=0; i>=2; // length in quad words (4 REs)
+ // printf("len>>=2=%d\n", len);
len+=(len_mod4==0 ? 0 : 1);
-
+ // printf("len+=%d\n", len);
for (i=0; iN_RB_DL*12];
+ int16_t rho_rho_amp_x0[2*frame_parms->N_RB_DL*12];
+ int16_t clean_x1[2*frame_parms->N_RB_DL*12];
+ uint16_t amp_tmp;
+ uint32_t *llr32=(uint32_t*)dlsch_llr;
+ int i, len, nsymb;
+ uint8_t symbol, symbol_mod;
+ //uint8_t pilots;
+ int len_acc=0;
+ uint16_t *sic_data;
+ uint16_t pbch_pss_sss_adjust;
+ unsigned char len_mod4=0;
+ __m128i llr128[2];
+ __m128i *ch_mag;
+ nsymb = (frame_parms->Ncp==0) ? 14:12;
+
+ for (symbol=num_pdcch_symbols; symbolN_RB_DL*12)]);
+ int16_t *rho_1=(int16_t*)(&rho_i[0][((int16_t)symbol*frame_parms->N_RB_DL*12)]);
+ ch_mag = (__m128i*)(&dl_ch_mag[0][((int16_t)symbol*frame_parms->N_RB_DL*12)]);
+ sic_data = (uint16_t*)(&sic_buffer[0][((int16_t)len_acc)]);
+
+ symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
+
+ pbch_pss_sss_adjust=adjust_G2(frame_parms,&rb_alloc,4,subframe,symbol);
+
+
+ if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
+
+ amp_tmp=dlsch0->sqrt_rho_b;
+ if (frame_parms->mode1_flag==0)
+ len = nb_rb*8 - (2*pbch_pss_sss_adjust/3);
+ else
+ len = nb_rb*10 - (5*pbch_pss_sss_adjust/6);
+ } else {
+
+ amp_tmp=dlsch0->sqrt_rho_a;
+ len = nb_rb*12 - pbch_pss_sss_adjust;
+ }
+
+ if (mod_order_0==6)
+ amp_tmp=amp_tmp<<1; // to compensate for >> 1 shift in modulation
+
+ len_acc+=len;
+
+ multadd_complex_vector_real_scalar((int16_t *)sic_data,
+ amp_tmp,
+ (int16_t *)rho_amp_x0, //this is in Q13
+ 1,
+ len);
+
+ mult_cpx_vector((int16_t *)rho_1, //Q15
+ (int16_t *)rho_amp_x0, //Q13
+ (int16_t*)rho_rho_amp_x0,
+ len,
+ 13);
+
+ sub_cpx_vector16((int16_t *)rxF,
+ (int16_t *)rho_rho_amp_x0,
+ //(int16_t *)clean_x1,
+ (int16_t *)rxF,
+ len*2);
+
+ len_mod4 = len&3;
+ len>>=2; // length in quad words (4 REs)
+ len+=(len_mod4==0 ? 0 : 1);
+
+ for (i=0; iN_RB_DL*12];
+ int16_t rho_rho_amp_x0[2*frame_parms->N_RB_DL*12];
+ int16_t clean_x1[2*frame_parms->N_RB_DL*12];
+ uint16_t amp_tmp;
+ uint16_t *llr32=(uint16_t*)dlsch_llr;
+ int i, len, nsymb, len2;
+ uint8_t symbol, symbol_mod;
+ int len_acc=0;
+ uint16_t *sic_data;
+ uint16_t pbch_pss_sss_adjust;
+ unsigned char len_mod4=0;
+ uint16_t *llr2;
+ __m128i *ch_mag,*ch_magb;
+ nsymb = (frame_parms->Ncp==0) ? 14:12;
+
+ for (symbol=num_pdcch_symbols; symbolN_RB_DL*12)]);
+ int16_t *rho_1=(int16_t*)(&rho_i[0][((int16_t)symbol*frame_parms->N_RB_DL*12)]);
+ ch_mag = (__m128i*)(&dl_ch_mag[0][((int16_t)symbol*frame_parms->N_RB_DL*12)]);
+ ch_magb = (__m128i*)(&dl_ch_magb[0][((int16_t)symbol*frame_parms->N_RB_DL*12)]);
+ sic_data = (uint16_t*)(&sic_buffer[0][((int16_t)len_acc)]);
+
+ symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
+
+ pbch_pss_sss_adjust=adjust_G2(frame_parms,&rb_alloc,6,subframe,symbol);
+
+ if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
+
+ amp_tmp = dlsch0->sqrt_rho_b;
+ if (frame_parms->mode1_flag==0)
+ len = nb_rb*8 - (2*pbch_pss_sss_adjust/3);
+ else
+ len = nb_rb*10 - (5*pbch_pss_sss_adjust/6);
+ } else {
+
+ amp_tmp = dlsch0->sqrt_rho_a;
+ len = nb_rb*12 - pbch_pss_sss_adjust;
+ }
+
+ if (mod_order_0==6)
+ amp_tmp=amp_tmp<<1; // to compensate for >> 1 shift in modulation
+
+ len_acc+=len;
+
+ multadd_complex_vector_real_scalar((int16_t *)sic_data,
+ amp_tmp,
+ (int16_t *)rho_amp_x0, //this is in Q13
+ 1,
+ len);
+
+ mult_cpx_vector((int16_t *)rho_1, //Q15
+ (int16_t *)rho_amp_x0, //Q13
+ (int16_t*)rho_rho_amp_x0,
+ len,
+ 13);
+
+ sub_cpx_vector16((int16_t *)rxF,
+ (int16_t *)rho_rho_amp_x0,
+ //(int16_t *)clean_x1,
+ (int16_t *)rxF,
+ len*2);
+
+ llr2 = llr32;
+ llr32 += (len*6);
+
+ len_mod4 =len&3;
+ len2=len>>2; // length in quad words (4 REs)
+ len2+=(len_mod4?0:1);
+
+
+
+ for (i=0; i= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
+
if (first_symbol_flag == 1) {
llr16 = (int16_t*)dlsch_llr;
} else {
@@ -1597,7 +1994,7 @@ void qpsk_qam64(short *stream0_in,
short *stream0_out,
short *rho01,
int length
- )
+ )
{
/*
@@ -1849,7 +2246,7 @@ void qam16_qpsk(short *stream0_in,
short *stream0_out,
short *rho01,
int length
- )
+ )
{
/*
@@ -1883,7 +2280,7 @@ void qam16_qpsk(short *stream0_in,
__m128i y0i_over_sqrt10;
__m128i y0r_three_over_sqrt10;
__m128i y0i_three_over_sqrt10;
-
+
__m128i ch_mag_des;
__m128i ch_mag_over_10;
__m128i ch_mag_over_2;
@@ -2319,7 +2716,6 @@ int dlsch_16qam_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
llr16 = (int16_t*)(*llr16p);
}
-
if (!llr16) {
msg("dlsch_16qam_qpsk_llr: llr is null, symbol %d\n",symbol);
return(-1);
@@ -2360,7 +2756,7 @@ void qam16_qam16(short *stream0_in,
short *stream0_out,
short *rho01,
int length
- )
+ )
{
/*
@@ -2919,7 +3315,7 @@ void qam16_qam64(int16_t *stream0_in,
int16_t *stream0_out,
int16_t *rho01,
int32_t length
- )
+ )
{
/*
@@ -2945,7 +3341,7 @@ void qam16_qam64(int16_t *stream0_in,
__m128i *ch_mag_128i = (__m128i *)ch_mag;
__m128i *ch_mag_128i_i = (__m128i *)ch_mag_i;
-
+
__m128i ONE_OVER_SQRT_2 = _mm_set1_epi16(23170); // round(1/sqrt(2)*2^15)
__m128i ONE_OVER_SQRT_10 = _mm_set1_epi16(20724); // round(1/sqrt(10)*2^16)
__m128i THREE_OVER_SQRT_10 = _mm_set1_epi16(31086); // round(3/sqrt(10)*2^15)
@@ -3595,7 +3991,7 @@ void qam64_qpsk(int16_t *stream0_in,
int16_t *stream0_out,
int16_t *rho01,
int32_t length
- )
+ )
{
/*
@@ -3657,7 +4053,7 @@ void qam64_qpsk(int16_t *stream0_in,
#elif defined(__arm__)
#endif
-
+
int i,j;
for (i=0; i>2; i+=2) {
@@ -5118,7 +5514,7 @@ void qam64_qam16(short *stream0_in,
short *stream0_out,
short *rho01,
int length
- )
+ )
{
/*
@@ -5181,7 +5577,7 @@ void qam64_qam16(short *stream0_in,
__m128i y0i_three_over_sqrt_21;
__m128i y0i_five_over_sqrt_21;
__m128i y0i_seven_over_sqrt_21;
-
+
#elif defined(__arm__)
#endif
@@ -6663,7 +7059,7 @@ void qam64_qam64(short *stream0_in,
short *stream0_out,
short *rho01,
int length
- )
+ )
{
/*
@@ -6730,7 +7126,7 @@ void qam64_qam64(short *stream0_in,
__m128i y0i_seven_over_sqrt_21;
__m128i ch_mag_int_with_sigma2;
__m128i two_ch_mag_int_with_sigma2;
- __m128i three_ch_mag_int_with_sigma2;
+ __m128i three_ch_mag_int_with_sigma2;
#elif defined(__arm__)
#endif
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c
index 1875ada878..3c81085b0e 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c
@@ -75,12 +75,12 @@ uint8_t is_not_UEspecRS(int8_t lprime, uint8_t re, uint8_t nushift, uint8_t Ncp,
switch (beamforming_mode) {
case 7:
if (Ncp == NORMAL){
- if ((re!=nushift+offset) && (re!=((nushift+4+offset)%12)) && (re!=((nushift+8+offset)%12)))
+ 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 {
+ } else {
if ((re!=nushift+offset) && (re!=((nushift+3+offset)%12)) && (re!=((nushift+6+offset)%12)) && (re!=((nushift+9+offset)%12)))
return(1);
}
@@ -158,26 +158,26 @@ uint32_t FOUR[2]={0,4};
uint32_t TWO[2]={0,2};
int allocate_REs_in_RB_no_pilots_16QAM_siso(PHY_VARS_eNB* phy_vars_eNB,
- int **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,
- uint8_t precoder_index,
- int16_t *qam_table_s0,
- int16_t *qam_table_s1,
- 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)
+ int **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,
+ uint8_t precoder_index,
+ int16_t *qam_table_s0,
+ int16_t *qam_table_s1,
+ 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;
@@ -190,10 +190,10 @@ int allocate_REs_in_RB_no_pilots_16QAM_siso(PHY_VARS_eNB* phy_vars_eNB,
uint8_t *x0p;
if (skip_dc == 0) {
- for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0;
- re<12;
- re++,x0p+=4,tti_offset++) {
-
+ for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0;
+ re<12;
+ re++,x0p+=4,tti_offset++) {
+
qam16_table_offset_re=TWO[x0p[0]];
qam16_table_offset_im=TWO[x0p[1]];
qam16_table_offset_re+=x0p[2];
@@ -203,11 +203,11 @@ int allocate_REs_in_RB_no_pilots_16QAM_siso(PHY_VARS_eNB* phy_vars_eNB,
}
}
else {
- // 1st half of PRB
- for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0;
- re<6;
- re++,x0p+=4,tti_offset++) {
-
+ // 1st half of PRB
+ for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0;
+ re<6;
+ re++,x0p+=4,tti_offset++) {
+
qam16_table_offset_re=TWO[x0p[0]];
qam16_table_offset_im=TWO[x0p[1]];
qam16_table_offset_re+=x0p[2];
@@ -215,11 +215,11 @@ int allocate_REs_in_RB_no_pilots_16QAM_siso(PHY_VARS_eNB* phy_vars_eNB,
((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];
}
- // 2nd half of PRB
- for (tti_offset=symbol_offset+re_offset-frame_parms->ofdm_symbol_size+7;
- re<12;
- re++,x0p+=4,tti_offset++) {
-
+ // 2nd half of PRB
+ for (tti_offset=symbol_offset+re_offset-frame_parms->ofdm_symbol_size+7;
+ re<12;
+ re++,x0p+=4,tti_offset++) {
+
qam16_table_offset_re=TWO[x0p[0]];
qam16_table_offset_im=TWO[x0p[1]];
qam16_table_offset_re+=x0p[2];
@@ -230,33 +230,34 @@ int allocate_REs_in_RB_no_pilots_16QAM_siso(PHY_VARS_eNB* phy_vars_eNB,
}
*re_allocated = *re_allocated + 12;
*jj=*jj + 48;
-
+
return(0);
}
int allocate_REs_in_RB_pilots_16QAM_siso(PHY_VARS_eNB* phy_vars_eNB,
- int **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,
- uint8_t precoder_index,
- int16_t *qam_table_s0,
- int16_t *qam_table_s1,
- 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)
+ int **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,
+ uint8_t precoder_index,
+ int16_t *qam_table_s0,
+ int16_t *qam_table_s1,
+ 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;
@@ -270,10 +271,10 @@ int allocate_REs_in_RB_pilots_16QAM_siso(PHY_VARS_eNB* phy_vars_eNB,
if (skip_dc == 0) {
// printf("pilots: P1_SHIFT[0] %d\n",P1_SHIFT[0]);
- for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0];
- re<12;
- x0p+=4) {
-
+ for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0];
+ re<12;
+ x0p+=4) {
+
qam16_table_offset_re=TWO[x0p[0]];
qam16_table_offset_im=TWO[x0p[1]];
qam16_table_offset_re+=x0p[2];
@@ -286,10 +287,10 @@ int allocate_REs_in_RB_pilots_16QAM_siso(PHY_VARS_eNB* phy_vars_eNB,
}
}
else {
- for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0];
- re<6;
- x0p+=4) {
-
+ for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0];
+ re<6;
+ x0p+=4) {
+
qam16_table_offset_re=TWO[x0p[0]];
qam16_table_offset_im=TWO[x0p[1]];
qam16_table_offset_re+=x0p[2];
@@ -300,10 +301,10 @@ int allocate_REs_in_RB_pilots_16QAM_siso(PHY_VARS_eNB* phy_vars_eNB,
re+=P1_SHIFT[re+1];
}
- for (tti_offset=symbol_offset+re_offset-frame_parms->ofdm_symbol_size+6+P1_SHIFT[6];
- re<12;
- x0p+=4) {
-
+ for (tti_offset=symbol_offset+re_offset-frame_parms->ofdm_symbol_size+6+P1_SHIFT[6];
+ re<12;
+ x0p+=4) {
+
qam16_table_offset_re=TWO[x0p[0]];
qam16_table_offset_im=TWO[x0p[1]];
qam16_table_offset_re+=x0p[2];
@@ -321,26 +322,26 @@ int allocate_REs_in_RB_pilots_16QAM_siso(PHY_VARS_eNB* phy_vars_eNB,
}
int allocate_REs_in_RB_no_pilots_64QAM_siso(PHY_VARS_eNB* phy_vars_eNB,
- int **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,
- uint8_t precoder_index,
- int16_t *qam_table_s0,
- int16_t *qam_table_s1,
- 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)
+ int **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,
+ uint8_t precoder_index,
+ int16_t *qam_table_s0,
+ int16_t *qam_table_s1,
+ 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;
@@ -357,10 +358,10 @@ int allocate_REs_in_RB_no_pilots_64QAM_siso(PHY_VARS_eNB* phy_vars_eNB,
x0p=&x0[*jj],tti_offset=symbol_offset+re_offset;
- /* for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0;
- re<12;
- re+=4,x0p+=24,tti_offset+=4) {*/
-
+ /* for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0;
+ re<12;
+ re+=4,x0p+=24,tti_offset+=4) {*/
+
qam64_table_offset_re=(x0p[0]<<2)|(x0p[2]<<1)|x0p[4];
qam64_table_offset_im=(x0p[1]<<2)|(x0p[3]<<1)|x0p[5];
((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam64_table_offset_re];
@@ -425,10 +426,10 @@ int allocate_REs_in_RB_no_pilots_64QAM_siso(PHY_VARS_eNB* phy_vars_eNB,
// }
}
else {
- for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0;
- re<6;
- re++,x0p+=6,tti_offset++) {
-
+ for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0;
+ re<6;
+ re++,x0p+=6,tti_offset++) {
+
qam64_table_offset_re=FOUR[x0p[0]];
qam64_table_offset_im=FOUR[x0p[1]];
qam64_table_offset_re+=TWO[x0p[2]];
@@ -439,10 +440,10 @@ int allocate_REs_in_RB_no_pilots_64QAM_siso(PHY_VARS_eNB* phy_vars_eNB,
((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam64_table_offset_im];
}
- for (tti_offset=symbol_offset+re_offset-frame_parms->ofdm_symbol_size+7;
- re<12;
- re++,x0p+=6,tti_offset++) {
-
+ for (tti_offset=symbol_offset+re_offset-frame_parms->ofdm_symbol_size+7;
+ re<12;
+ re++,x0p+=6,tti_offset++) {
+
qam64_table_offset_re=FOUR[x0p[0]];
qam64_table_offset_im=FOUR[x0p[1]];
qam64_table_offset_re+=TWO[x0p[2]];
@@ -456,33 +457,34 @@ int allocate_REs_in_RB_no_pilots_64QAM_siso(PHY_VARS_eNB* phy_vars_eNB,
*re_allocated = *re_allocated + 12;
*jj=*jj + 72;
-
+
return(0);
}
int allocate_REs_in_RB_pilots_64QAM_siso(PHY_VARS_eNB* phy_vars_eNB,
- int **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,
- uint8_t precoder_index,
- int16_t *qam_table_s0,
- int16_t *qam_table_s1,
- 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)
+ int **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,
+ uint8_t precoder_index,
+ int16_t *qam_table_s0,
+ int16_t *qam_table_s1,
+ 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;
@@ -496,10 +498,10 @@ int allocate_REs_in_RB_pilots_64QAM_siso(PHY_VARS_eNB* phy_vars_eNB,
if (skip_dc == 0) {
// printf("pilots: P1_SHIFT[0] %d\n",P1_SHIFT[0]);
- for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0];
- re<12;
- x0p+=6) {
-
+ for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0];
+ re<12;
+ x0p+=6) {
+
qam64_table_offset_re=FOUR[x0p[0]];
qam64_table_offset_im=FOUR[x0p[1]];
qam64_table_offset_re+=TWO[x0p[2]];
@@ -514,10 +516,10 @@ int allocate_REs_in_RB_pilots_64QAM_siso(PHY_VARS_eNB* phy_vars_eNB,
}
}
else {
- for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0];
- re<6;
- x0p+=6) {
-
+ for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0];
+ re<6;
+ x0p+=6) {
+
qam64_table_offset_re=FOUR[x0p[0]];
qam64_table_offset_im=FOUR[x0p[1]];
qam64_table_offset_re+=TWO[x0p[2]];
@@ -530,10 +532,10 @@ int allocate_REs_in_RB_pilots_64QAM_siso(PHY_VARS_eNB* phy_vars_eNB,
re+=P1_SHIFT[re+1];
}
- for (tti_offset=symbol_offset+re_offset-frame_parms->ofdm_symbol_size+6+P1_SHIFT[6];
- re<12;
- x0p+=6) {
-
+ for (tti_offset=symbol_offset+re_offset-frame_parms->ofdm_symbol_size+6+P1_SHIFT[6];
+ re<12;
+ x0p+=6) {
+
qam64_table_offset_re=FOUR[x0p[0]];
qam64_table_offset_im=FOUR[x0p[1]];
qam64_table_offset_re+=TWO[x0p[2]];
@@ -568,31 +570,30 @@ int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB,
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)
+ uint8_t lprime,
+ uint8_t mprime,
+ uint8_t Ns,
+ int *P1_SHIFT,
+ int *P2_SHIFT)
{
+ uint8_t *x0 = NULL;
+ MIMO_mode_t mimo_mode;
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;
-
- int first_layer0 = dlsch0_harq->first_layer;
- int Nlayers0 = dlsch0_harq->Nlayers;
- uint8_t mod_order0 = get_Qm(dlsch0_harq->mcs);
+ int first_layer0; //= dlsch0_harq->first_layer;
+ int Nlayers0; // = dlsch0_harq->Nlayers;
+ uint8_t mod_order0; // = get_Qm(dlsch0_harq->mcs);
+ uint8_t mod_order1; //=2;
+ uint8_t precoder_index0,precoder_index1;
uint8_t *x1=NULL;
- uint8_t mod_order1=2;
// Fill these in later for TM8-10
// int Nlayers1;
// int first_layer1;
-
int use2ndpilots = (frame_parms->mode1_flag==1)?1:0;
uint32_t tti_offset; //,aa;
@@ -622,7 +623,6 @@ int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB,
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;
@@ -634,19 +634,46 @@ int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB,
((int16_t *)&qpsk[3])[0] = -gain_lin_QPSK;;
((int16_t *)&qpsk[3])[1] = -gain_lin_QPSK;
- if (dlsch1_harq) {
+ if ((dlsch0_harq != NULL) && (dlsch1_harq != NULL)) { //this is for TM3, TM4
+
+ x0 = dlsch0_harq->e;
+ mimo_mode = dlsch0_harq->mimo_mode;
+ first_layer0 = dlsch0_harq->first_layer;
+ Nlayers0 = dlsch0_harq->Nlayers;
+ mod_order0 = get_Qm(dlsch0_harq->mcs);
x1 = dlsch1_harq->e;
// Fill these in later for TM8-10
// Nlayers1 = dlsch1_harq->Nlayers;
// first_layer1 = dlsch1_harq->first_layer;
mod_order1 = get_Qm(dlsch1_harq->mcs);
+ } else if ((dlsch0_harq != NULL) && (dlsch1_harq == NULL)){ //This is for SIS0 TM1, TM6, etc
+
+ x0 = dlsch0_harq->e;
+ mimo_mode = dlsch0_harq->mimo_mode;
+ first_layer0 = dlsch0_harq->first_layer;
+ Nlayers0 = dlsch0_harq->Nlayers;
+ mod_order0 = get_Qm(dlsch0_harq->mcs);
+
+ } else if ((dlsch0_harq == NULL) && (dlsch1_harq != NULL)){ // This is for TM4 retransmission
+
+ x0 = dlsch1_harq->e;
+ mimo_mode = dlsch1_harq->mimo_mode;
+ first_layer0 = dlsch1_harq->first_layer;
+ Nlayers0 = dlsch1_harq->Nlayers;
+ mod_order0 = get_Qm(dlsch1_harq->mcs);
+
}
-#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]);
-#endif
+ if (dlsch0_harq != NULL){
+ #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]);
+ #endif
+ } else{
+ #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]);
+ #endif
+ }
first_re=0;
last_re=12;
@@ -658,17 +685,17 @@ x0[1+*jj]);
for (re=first_re; reofdm_symbol_size+1;
tti_offset = symbol_offset + re_off + re;
- // check that RE is not from Cell-specific RS
+ //check that RE is not from Cell-specific RS
if (is_not_pilot(pilots,re,frame_parms->nushift,use2ndpilots)==1) {
- // printf("re %d (jj %d)\n",re,*jj);
+ //printf("re %d (jj %d)\n",re,*jj);
if (mimo_mode == SISO) { //SISO mapping
@@ -677,16 +704,16 @@ x0[1+*jj]);
switch (mod_order0) {
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]);
- ((int16_t*)&txdataF[0][tti_offset])[0] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i
+
+ //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]);
+ ((int16_t*)&txdataF[0][tti_offset])[0] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i
*jj = *jj + 1;
- ((int16_t*)&txdataF[0][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;
- // printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
break;
case 4: //16QAM
@@ -715,10 +742,8 @@ x0[1+*jj]);
*jj=*jj+1;
- ((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);
+ ((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];
break;
@@ -758,8 +783,8 @@ x0[1+*jj]);
*jj=*jj+1;
- ((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];
+ ((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;
@@ -769,6 +794,9 @@ x0[1+*jj]);
else if (mimo_mode == ALAMOUTI) {
*re_allocated = *re_allocated + 1;
+ amp = (int16_t)(((int32_t)tmp_amp*ONE_OVER_SQRT2_Q15)>>15);
+
+
switch (mod_order0) {
case 2: //QPSK
@@ -786,46 +814,41 @@ x0[1+*jj]);
((int16_t*)&tmp_sample2)[1] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
*jj=*jj+1;
+ //gain_lin_QPSK (=amp/sqrt(2)) is already contains the power offset from rho_a/rho_b, so here we do not need divide by sqrt(2) anymore
// normalization for 2 tx antennas
- ((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);
- ((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);
+ ((int16_t*)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]));
+ ((int16_t*)&txdataF[0][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample1)[1]));
+ ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]));
+ ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]));
- break;
+ break;
case 4: //16QAM
// Antenna 0 position n
-
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[0][tti_offset])[0]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15);
//((int16_t *)&txdataF[0][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]*ONE_OVER_SQRT2_Q15)>>15;
- ((int16_t *)&txdataF[0][tti_offset])[1]+=(qam_table_s0[qam16_table_offset_im]*ONE_OVER_SQRT2_Q15)>>15;
+ //gain_lin_QPSK (=amp/sqrt(2)) is already contains the power offset from rho_a/rho_b, so here we do not need divide by sqrt(2) anymore
+ ((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]);
// Antenna 1 position n Real part -> -x1*
@@ -834,30 +857,27 @@ x0[1+*jj]);
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[1][tti_offset])[0]+=-(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15);
//((int16_t *)&txdataF[1][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15);
- ((int16_t *)&txdataF[1][tti_offset])[0]+=-(qam_table_s0[qam16_table_offset_re]*ONE_OVER_SQRT2_Q15)>>15;
- ((int16_t *)&txdataF[1][tti_offset])[1]+=(qam_table_s0[qam16_table_offset_im]*ONE_OVER_SQRT2_Q15)>>15;
+ //qam_table_s0 already contains the power offset from rho_a/rho_b, so here we do not need divide by sqrt(2) anymore
+ ((int16_t *)&txdataF[1][tti_offset])[0]+=-(qam_table_s0[qam16_table_offset_re]);
+ ((int16_t *)&txdataF[1][tti_offset])[1]+=(qam_table_s0[qam16_table_offset_im]);
+ //((int16_t *)&txdataF[1][tti_offset])[0]+=-qam_table_s0[qam16_table_offset_re];
+ //((int16_t *)&txdataF[1][tti_offset])[1]+=qam_table_s0[qam16_table_offset_im];
break;
@@ -869,141 +889,112 @@ x0[1+*jj]);
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[0][tti_offset])[0]+=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15);
//((int16_t *)&txdataF[0][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15);
- ((int16_t *)&txdataF[0][tti_offset])[0]+=(qam_table_s0[qam64_table_offset_re]*ONE_OVER_SQRT2_Q15)>>15;
- ((int16_t *)&txdataF[0][tti_offset])[1]+=(qam_table_s0[qam64_table_offset_im]*ONE_OVER_SQRT2_Q15)>>15;
+ //qam_table_s0 already contains the power offset from rho_a/rho_b, so here we do not need divide by sqrt(2) anymore
+ ((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]);
// Antenna 1 => -x1*
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[1][tti_offset])[0]+=-(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15);
//((int16_t *)&txdataF[1][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15);
- ((int16_t *)&txdataF[1][tti_offset])[0]+=-(qam_table_s0[qam64_table_offset_re]*ONE_OVER_SQRT2_Q15)>>15;
- ((int16_t *)&txdataF[1][tti_offset])[1]+=(qam_table_s0[qam64_table_offset_im]*ONE_OVER_SQRT2_Q15)>>15;
+ //qam_table_s0 already contains the power offset from rho_a/rho_b, so here we do not need divide by sqrt(2) anymore
+ ((int16_t *)&txdataF[1][tti_offset])[0]+=-(qam_table_s0[qam64_table_offset_re]);
+ ((int16_t *)&txdataF[1][tti_offset])[1]+=(qam_table_s0[qam64_table_offset_im]);
break;
}
-
- // fill in the rest of the ALAMOUTI precoding
+ // fill in the rest of the ALAMOUTI precoding
if (is_not_pilot(pilots,re + 1,frame_parms->nushift,use2ndpilots)==1) {
((int16_t *)&txdataF[0][tti_offset+1])[0] += -((int16_t *)&txdataF[1][tti_offset])[0]; //x1
((int16_t *)&txdataF[0][tti_offset+1])[1] += ((int16_t *)&txdataF[1][tti_offset])[1];
((int16_t *)&txdataF[1][tti_offset+1])[0] += ((int16_t *)&txdataF[0][tti_offset])[0]; //x0*
((int16_t *)&txdataF[1][tti_offset+1])[1] += -((int16_t *)&txdataF[0][tti_offset])[1];
- } else {
+ }
+ else {
((int16_t *)&txdataF[0][tti_offset+2])[0] += -((int16_t *)&txdataF[1][tti_offset])[0]; //x1
((int16_t *)&txdataF[0][tti_offset+2])[1] += ((int16_t *)&txdataF[1][tti_offset])[1];
((int16_t *)&txdataF[1][tti_offset+2])[0] += ((int16_t *)&txdataF[0][tti_offset])[0]; //x0*
((int16_t *)&txdataF[1][tti_offset+2])[1] += -((int16_t *)&txdataF[0][tti_offset])[1];
}
- } else if (mimo_mode == LARGE_CDD) {
+ }
+ else if (mimo_mode == LARGE_CDD) {
*re_allocated = *re_allocated + 1;
if (frame_parms->nb_antenna_ports_eNB == 2) {
switch (mod_order0) {
+
default:
LOG_E(PHY,"Unknown mod_order0 %d\n",mod_order0);
xx0_re=xx0_im=0;
break;
case 2: //QPSK
- // printf("%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
+ //printf("%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
xx0_re = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
*jj = *jj + 1;
xx0_im = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
*jj = *jj + 1;
-
-
-
- // printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
+ //printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
break;
case 4: //16QAM
qam16_table_offset_re0 = 0;
qam16_table_offset_im0 = 0;
-
if (x0[*jj] == 1)
qam16_table_offset_re0+=2;
-
*jj=*jj+1;
-
if (x0[*jj] == 1)
qam16_table_offset_im0+=2;
-
*jj=*jj+1;
if (x0[*jj] == 1)
qam16_table_offset_re0+=1;
-
*jj=*jj+1;
-
if (x0[*jj] == 1)
qam16_table_offset_im0+=1;
-
*jj=*jj+1;
xx0_re = qam_table_s0[qam16_table_offset_re0];
@@ -1019,80 +1010,61 @@ x0[1+*jj]);
if (x0[*jj] == 1)
qam64_table_offset_re0+=4;
-
*jj=*jj+1;
-
if (x0[*jj] == 1)
qam64_table_offset_im0+=4;
-
*jj=*jj+1;
-
if (x0[*jj] == 1)
qam64_table_offset_re0+=2;
-
*jj=*jj+1;
-
if (x0[*jj] == 1)
qam64_table_offset_im0+=2;
-
*jj=*jj+1;
-
if (x0[*jj] == 1)
qam64_table_offset_re0+=1;
-
*jj=*jj+1;
-
if (x0[*jj] == 1)
qam64_table_offset_im0+=1;
-
*jj=*jj+1;
xx0_re = qam_table_s0[qam64_table_offset_re0];
xx0_im = qam_table_s0[qam64_table_offset_im0];
-
break;
}
switch (mod_order1) {
+
default:
LOG_E(PHY,"Unknown mod_order1 %d\n",mod_order1);
xx1_re=xx1_im=0;
break;
case 2: //QPSK
- // printf("%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
+ //printf("%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
xx1_re = (x1[*jj2]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
*jj2 = *jj2 + 1;
xx1_im = (x1[*jj2]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
*jj2 = *jj2 + 1;
- // printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
+ //printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
break;
case 4: //16QAM
qam16_table_offset_re1 = 0;
qam16_table_offset_im1 = 0;
-
if (x1[*jj2] == 1)
qam16_table_offset_re1+=2;
-
*jj2 = *jj2 + 1;
-
if (x1[*jj2] == 1)
qam16_table_offset_im1+=2;
-
*jj2 = *jj2 + 1;
-
if (x1[*jj2] == 1)
qam16_table_offset_re1+=1;
-
*jj2 = *jj2 + 1;
-
if (x1[*jj2] == 1)
qam16_table_offset_im1+=1;
-
*jj2 = *jj2 + 1;
xx1_re = qam_table_s1[qam16_table_offset_re1];
@@ -1107,38 +1079,26 @@ x0[1+*jj]);
if (x1[*jj2] == 1)
qam64_table_offset_re1+=4;
-
*jj2 = *jj2 + 1;
-
if (x1[*jj2] == 1)
qam64_table_offset_im1+=4;
-
*jj2 = *jj2 + 1;
-
if (x1[*jj2] == 1)
qam64_table_offset_re1+=2;
-
*jj2 = *jj2 + 1;
-
if (x1[*jj2] == 1)
qam64_table_offset_im1+=2;
-
*jj2 = *jj2 + 1;
-
if (x1[*jj2] == 1)
qam64_table_offset_re1+=1;
-
*jj2 = *jj2 + 1;
-
if (x1[*jj2] == 1)
qam64_table_offset_im1+=1;
-
*jj2 = *jj2 + 1;
xx1_re = qam_table_s1[qam64_table_offset_re1];
xx1_im = qam_table_s1[qam64_table_offset_im1];
-
break;
}
@@ -1161,20 +1121,21 @@ x0[1+*jj]);
// s alternates +1/-1 for each RE
s = -s;
}
- } else if ((mimo_mode >= UNIFORM_PRECODING11)&&(mimo_mode <= PUSCH_PRECODING1)) {
- // this is for transmission modes 4-6 (1 layer)
+ }
+ else if ((mimo_mode >= UNIFORM_PRECODING11)&&(mimo_mode <= PUSCH_PRECODING1)) {
+ // this is for transmission modes 5-6 (1 layer)
*re_allocated = *re_allocated + 1;
amp = (int16_t)(((int32_t)tmp_amp*ONE_OVER_SQRT2_Q15)>>15);
switch (mod_order0) {
- case 2: //QPSK
+ case 2:
((int16_t*)&tmp_sample1)[0] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
*jj = *jj + 1;
((int16_t*)&tmp_sample1)[1] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
*jj = *jj + 1;
- // normalization for 2 tx antennas
+ //normalization for 2 tx antennas
((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);
@@ -1186,87 +1147,178 @@ x0[1+*jj]);
break;
- case 4: //16QAM
+ case 4:
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*)&tmp_sample1)[0] = (int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15);
- ((int16_t*)&tmp_sample1)[1] = (int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15);
- ((int16_t *)&txdataF[0][tti_offset])[0] += ((int16_t*)&tmp_sample1)[0];
- ((int16_t *)&txdataF[0][tti_offset])[1] += ((int16_t*)&tmp_sample1)[1];
+ ((int16_t*)&tmp_sample1)[0] = (int16_t)((qam_table_s0[qam16_table_offset_re]));
+ ((int16_t*)&tmp_sample1)[1] = (int16_t)((qam_table_s0[qam16_table_offset_im]));
- if (frame_parms->nb_antenna_ports_eNB == 2) {
+ ((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) {
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];
+ ((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);
}
break;
- case 6: //64QAM
+ case 6:
+ 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*)&tmp_sample1)[0] = (int16_t)((qam_table_s0[qam64_table_offset_re]));
+ ((int16_t*)&tmp_sample1)[1] = (int16_t)((qam_table_s0[qam64_table_offset_im]));
+
+ ((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_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);
+ }
+
+ break;
+ }
+ }
+ else if ((mimo_mode >= DUALSTREAM_UNIFORM_PRECODING1)&&(mimo_mode <= DUALSTREAM_PUSCH_PRECODING)) {
+ // this is for transmission mode 4 (1 layer)
+ *re_allocated = *re_allocated + 1;
+
+ if (precoder_index==0) {
+ precoder_index0 = 0; //[1 1]
+ precoder_index1 = 1; //[1 -1]
+ }
+ else if (precoder_index==1) {
+ precoder_index0 = 2; //[1 j]
+ precoder_index1 = 3; //[1 -j]
+ }
+ else {
+ printf("problem with precoder in TM4\n");
+ return(-1);
+ }
+
+ switch (mod_order0) {
+ case 2:
+
+ ((int16_t*)&tmp_sample1)[0] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
+ *jj = *jj + 1;
+ ((int16_t*)&tmp_sample1)[1] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
+ *jj = *jj + 1;
+
+ //normalization for 2 tx antennas
+ ((int16_t*)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_2_Q15)>>15);
+ ((int16_t*)&txdataF[0][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample1)[1]*ONE_OVER_2_Q15)>>15);
+
+ //printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
+
+ if (frame_parms->nb_antenna_ports_eNB == 2) {
+ layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index0);
+ ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_2_Q15)>>15);
+ ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_2_Q15)>>15);
+ }
+
+ break;
+
+ case 4:
+
+ 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*)&tmp_sample1)[0] = (int16_t)((qam_table_s0[qam16_table_offset_re]));
+ ((int16_t*)&tmp_sample1)[1] = (int16_t)((qam_table_s0[qam16_table_offset_im]));
+ ((int16_t *)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_2_Q15)>>15);
+ ((int16_t *)&txdataF[0][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample1)[1]*ONE_OVER_2_Q15)>>15);
+
+ if (frame_parms->nb_antenna_ports_eNB == 2) {
+ layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index0);
+ ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_2_Q15)>>15);
+ ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_2_Q15)>>15);
+ }
+
+ break;
+
+ case 6:
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*)&tmp_sample1)[0] = (int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15);
- ((int16_t*)&tmp_sample1)[1] = (int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15);
-
- ((int16_t *)&txdataF[0][tti_offset])[0] += ((int16_t*)&tmp_sample1)[0];
- ((int16_t *)&txdataF[0][tti_offset])[1] += ((int16_t*)&tmp_sample1)[1];
+ ((int16_t*)&tmp_sample1)[0] = (int16_t)((qam_table_s0[qam64_table_offset_re]));
+ ((int16_t*)&tmp_sample1)[1] = (int16_t)((qam_table_s0[qam64_table_offset_im]));
+ ((int16_t *)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_2_Q15)>>15);
+ ((int16_t *)&txdataF[0][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample1)[1]*ONE_OVER_2_Q15)>>15);
if (frame_parms->nb_antenna_ports_eNB == 2) {
layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index);
@@ -1275,10 +1327,104 @@ x0[1+*jj]);
}
break;
+ }
- }
+ if (dlsch1_harq) {
+ switch (mod_order1) {
+
+ case 2:
+
+ ((int16_t*)&tmp_sample1)[0] = (x1[*jj2]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
+ *jj2 = *jj2 + 1;
+ ((int16_t*)&tmp_sample1)[1] = (x1[*jj2]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
+ *jj2 = *jj2 + 1;
+
+ //normalization for 2 tx antennas
+ ((int16_t*)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_2_Q15)>>15);
+ ((int16_t*)&txdataF[0][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample1)[1]*ONE_OVER_2_Q15)>>15);
+
+ if (frame_parms->nb_antenna_ports_eNB== 2) {
+ layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index1);
+ ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_2_Q15)>>15);
+ ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_2_Q15)>>15);
+ }
+
+ break;
+
+ case 4:
+
+ qam16_table_offset_re = 0;
+ qam16_table_offset_im = 0;
+
+ if (x1[*jj2] == 1)
+ qam16_table_offset_re+=2;
+ *jj2=*jj2+1;
+ if (x1[*jj2] == 1)
+ qam16_table_offset_im+=2;
+ *jj2=*jj2+1;
+
+
+ if (x1[*jj2] == 1)
+ qam16_table_offset_re+=1;
+ *jj2=*jj2+1;
+ if (x1[*jj2] == 1)
+ qam16_table_offset_im+=1;
+ *jj2=*jj2+1;
+
+ ((int16_t*)&tmp_sample1)[0] = (int16_t)((qam_table_s1[qam16_table_offset_re]));
+ ((int16_t*)&tmp_sample1)[1] = (int16_t)((qam_table_s1[qam16_table_offset_im]));
+ ((int16_t *)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_2_Q15)>>15);
+ ((int16_t *)&txdataF[0][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample1)[1]*ONE_OVER_2_Q15)>>15);
+
+ if (frame_parms->nb_antenna_ports_eNB == 2) {
+ layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index1);
+ ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_2_Q15)>>15);
+ ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_2_Q15)>>15);
+ }
+
+ break;
+
+ case 6:
+
+ qam64_table_offset_re = 0;
+ qam64_table_offset_im = 0;
+ if (x1[*jj2] == 1)
+ qam64_table_offset_re+=4;
+ *jj2=*jj2+1;
+ if (x1[*jj2] == 1)
+ qam64_table_offset_im+=4;
+ *jj2=*jj2+1;
+ if (x1[*jj2] == 1)
+ qam64_table_offset_re+=2;
+ *jj2=*jj2+1;
+ if (x1[*jj2] == 1)
+ qam64_table_offset_im+=2;
+ *jj2=*jj2+1;
+ if (x1[*jj2] == 1)
+ qam64_table_offset_re+=1;
+ *jj2=*jj2+1;
+ if (x1[*jj2] == 1)
+ qam64_table_offset_im+=1;
+ *jj2=*jj2+1;
+
+ ((int16_t*)&tmp_sample1)[0] = (int16_t)((qam_table_s1[qam64_table_offset_re]));
+ ((int16_t*)&tmp_sample1)[1] = (int16_t)((qam_table_s1[qam64_table_offset_im]));
+ ((int16_t *)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_2_Q15)>>15);
+ ((int16_t *)&txdataF[0][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample1)[1]*ONE_OVER_2_Q15)>>15);
+
+ if (frame_parms->nb_antenna_ports_eNB == 2) {
+ layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index1);
+ ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_2_Q15)>>15);
+ ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_2_Q15)>>15);
+ }
+
+ break;
+
+ }
+ }
}
+
if (mimo_mode == ALAMOUTI) {
re++; // adjacent carriers are taken care of by precoding
*re_allocated = *re_allocated + 1;
@@ -1288,7 +1434,7 @@ x0[1+*jj]);
*re_allocated = *re_allocated + 1;
}
}
-
+
if (mimo_mode == TM7) {
*re_allocated = *re_allocated + 1;
@@ -1393,7 +1539,7 @@ x0[1+*jj]);
}
} 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)
+ //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) {
@@ -1444,7 +1590,6 @@ x0[1+*jj]);
case 6: //64QAM
-
qam64_table_offset_re = 0;
qam64_table_offset_im = 0;
@@ -1492,10 +1637,7 @@ x0[1+*jj]);
return(-1);
}
}
-
-
}
-
return(0);
}
@@ -1547,11 +1689,12 @@ int allocate_REs_in_RB_MCH(int32_t **txdataF,
tti_offset = symbol_offset + re_off + re;
- // printf("re %d (jj %d)\n",re,*jj);
+ //printf("re %d (jj %d)\n",re,*jj);
*re_allocated = *re_allocated + 1;
switch (mod_order) {
+
case 2: //QPSK
// printf("%d : %d,%d => ",tti_offset,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
@@ -1563,9 +1706,10 @@ int allocate_REs_in_RB_MCH(int32_t **txdataF,
*jj = *jj + 1;
- // printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
+ //printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
break;
+
case 4: //16QAM
qam16_table_offset_re = 0;
@@ -1592,6 +1736,7 @@ int allocate_REs_in_RB_MCH(int32_t **txdataF,
*jj=*jj+1;
+
((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);
@@ -1599,7 +1744,6 @@ int allocate_REs_in_RB_MCH(int32_t **txdataF,
case 6: //64QAM
-
qam64_table_offset_re = 0;
qam64_table_offset_im = 0;
@@ -1644,14 +1788,13 @@ int allocate_REs_in_RB_MCH(int32_t **txdataF,
return(0);
}
-uint8_t get_pmi(uint8_t N_RB_DL,LTE_DL_eNB_HARQ_t *dlsch_harq,uint16_t rb)
+uint8_t get_pmi(uint8_t N_RB_DL, MIMO_mode_t mode, uint32_t pmi_alloc,uint16_t rb)
{
-
-
+ /*
MIMO_mode_t mode = dlsch_harq->mimo_mode;
uint32_t pmi_alloc = dlsch_harq->pmi_alloc;
+ */
- // 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)
@@ -1696,70 +1839,70 @@ inline int check_skip(int rb,int subframe_offset,LTE_DL_FRAME_PARMS *frame_parms
if ((frame_parms->N_RB_DL&1) == 1) { // ODD N_RB_DL
// PBCH
if ((subframe_offset==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>((frame_parms->N_RB_DL>>1)-3)) &&
+ (rb<((frame_parms->N_RB_DL>>1)+3)) &&
+ (l>=(nsymb>>1)) &&
+ (l<((nsymb>>1) + 4))) {
return(1);
}
if (frame_parms->frame_type == TDD) { // TDD
//SSS TDD
if (((subframe_offset==0)||(subframe_offset==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==(nsymb-1)) ) {
- return(1);
- }
+ return(1);
+ }
//PSS TDD
if (((subframe_offset==1) || (subframe_offset==6)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==2) ) {
- return(1);
+ return(1);
}
} else {
//PSS FDD
if (((subframe_offset==0)||(subframe_offset==5)) &&
- (rb>((frame_parms->N_RB_DL>>1)-3)) &&
- (rb<((frame_parms->N_RB_DL>>1)+3)) &&
- (l==((nsymb>>1)-1)) ) {
- return(1);
+ (rb>((frame_parms->N_RB_DL>>1)-3)) &&
+ (rb<((frame_parms->N_RB_DL>>1)+3)) &&
+ (l==((nsymb>>1)-1)) ) {
+ return(1);
}
//SSS FDD
if (((subframe_offset==0)||(subframe_offset==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==((nsymb>>1)-2)) ) {
- return(1);
+ return(1);
}
}
}
else { // even N_RB_DL
//PBCH
if ((subframe_offset==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>=((frame_parms->N_RB_DL>>1)-3)) &&
+ (rb<((frame_parms->N_RB_DL>>1)+3)) &&
+ (l>=nsymb>>1) && (l<((nsymb>>1) + 4)))
return(1);
if (frame_parms->frame_type == TDD) { // TDD
//SSS
if (((subframe_offset==0)||
- (subframe_offset==5)) &&
- (rb>=((frame_parms->N_RB_DL>>1)-3)) &&
- (rb<((frame_parms->N_RB_DL>>1)+3)) &&
- (l==nsymb-1) ) {
- return(1);
+ (subframe_offset==5)) &&
+ (rb>=((frame_parms->N_RB_DL>>1)-3)) &&
+ (rb<((frame_parms->N_RB_DL>>1)+3)) &&
+ (l==nsymb-1) ) {
+ return(1);
}
-
+
//PSS
if (((subframe_offset==1)||
- (subframe_offset==6)) &&
- (rb>=((frame_parms->N_RB_DL>>1)-3)) &&
- (rb<((frame_parms->N_RB_DL>>1)+3)) &&
- (l==2) ) {
- return(1);
+ (subframe_offset==6)) &&
+ (rb>=((frame_parms->N_RB_DL>>1)-3)) &&
+ (rb<((frame_parms->N_RB_DL>>1)+3)) &&
+ (l==2) ) {
+ return(1);
}
} else { // FDD
//SSS
if (((subframe_offset==0)||(subframe_offset==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==((nsymb>>1)-2)) ) {
- return(1);
+ return(1);
}
-
+
//PSS
if (((subframe_offset==0)||(subframe_offset==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==((nsymb>>1)-1)) ) {
- return(1);
+ return(1);
}
}
}
@@ -1776,9 +1919,9 @@ inline int check_skiphalf(int rb,int subframe_offset,LTE_DL_FRAME_PARMS *frame_p
// PBCH
if ((subframe_offset==0) &&
- (rb==((frame_parms->N_RB_DL>>1)-3)) &&
- (l>=(nsymb>>1)) &&
- (l<((nsymb>>1) + 4)))
+ (rb==((frame_parms->N_RB_DL>>1)-3)) &&
+ (l>=(nsymb>>1)) &&
+ (l<((nsymb>>1) + 4)))
return(1);
else if ((subframe_offset==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4)))
return(2);
@@ -1786,26 +1929,26 @@ inline int check_skiphalf(int rb,int subframe_offset,LTE_DL_FRAME_PARMS *frame_p
if (frame_parms->frame_type == TDD) { // TDD
//SSS TDD
if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==(nsymb-1)))
- return(1);
+ return(1);
else if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==(nsymb-1)))
- return(2);
+ return(2);
//PSS TDD
if (((subframe_offset==1)||(subframe_offset==6)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==2))
- return(1);
+ return(1);
else if (((subframe_offset==1)||(subframe_offset==6)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==2))
- return(2);
+ return(2);
}
else { // FDD
//PSS FDD
if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==((nsymb>>1)-1)))
- return(1);
+ return(1);
else if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==(((nsymb>>1)-1))))
- return(2);
+ return(2);
//SSS FDD
if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && ((l==((nsymb>>1)-2))))
- return(1);
+ return(1);
else if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && ((l==(nsymb>>1)-2)))
- return(2);
+ return(2);
}
}
else { // EVEN N_RB_DL
@@ -1837,68 +1980,126 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->frame_parms;
uint8_t nsymb;
- uint8_t harq_pid = dlsch0->current_harq_pid;
- LTE_DL_eNB_HARQ_t *dlsch0_harq = dlsch0->harq_processes[harq_pid];
+ uint8_t harq_pid; //= dlsch0->current_harq_pid;
+ LTE_DL_eNB_HARQ_t *dlsch0_harq;
LTE_DL_eNB_HARQ_t *dlsch1_harq; //= dlsch1->harq_processes[harq_pid];
uint32_t i,i2,jj,jj2,re_allocated,symbol_offset;
uint16_t l,rb,re_offset;
uint32_t rb_alloc_ind;
- uint32_t *rb_alloc = dlsch0_harq->rb_alloc;
+ uint32_t *rb_alloc; //=dlsch0_harq->rb_alloc;
+
uint8_t pilots=0;
- uint8_t skip_dc=0,skip_half=0;
- uint8_t mod_order0 = get_Qm(dlsch0_harq->mcs);
+ uint8_t skip_dc,skip_half;
+ uint8_t mod_order0 = 0;
uint8_t mod_order1 = 0;
int16_t amp_rho_a, amp_rho_b;
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)(PHY_VARS_eNB*,
- int **,
- uint32_t*,
- uint32_t*,
- uint16_t,
- uint32_t,
- LTE_DL_eNB_HARQ_t *,
- LTE_DL_eNB_HARQ_t *,
- uint8_t,
- int16_t,
- uint8_t,
- int16_t *,
- int16_t *,
- uint32_t *,
- uint8_t,
- uint8_t,
- uint8_t,
- uint8_t,
- uint8_t,
- int *,
- int *);
+ int **,
+ uint32_t*,
+ uint32_t*,
+ uint16_t,
+ uint32_t,
+ LTE_DL_eNB_HARQ_t *,
+ LTE_DL_eNB_HARQ_t *,
+ uint8_t,
+ int16_t,
+ uint8_t,
+ int16_t *,
+ int16_t *,
+ 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 get_pmi_temp;
+
+ MIMO_mode_t mimo_mode;
uint8_t mprime=0,Ns;
int8_t lprime=-1;
int aa=0;
+
#ifdef DEBUG_DLSCH_MODULATION
- uint8_t Nl0 = dlsch0_harq->Nl;
+ uint8_t Nl0; //= dlsch0_harq->Nl;
uint8_t Nl1;
#endif
- if (dlsch1) {
+
+ if ((dlsch0 != NULL) && (dlsch1 != NULL)){
+
+ harq_pid = dlsch0->current_harq_pid;
+ dlsch0_harq = dlsch0->harq_processes[harq_pid];
+ mimo_mode = dlsch0_harq->mimo_mode;
+ mod_order0 = get_Qm(dlsch0_harq->mcs);
+ rb_alloc = dlsch0_harq->rb_alloc;
+#ifdef DEBUG_DLSCH_MODULATION
+ Nl0 = dlsch0_harq->Nl;
+#endif
+
dlsch1_harq = dlsch1->harq_processes[harq_pid];
mod_order1 = get_Qm(dlsch1_harq->mcs);
#ifdef DEBUG_DLSCH_MODULATION
Nl1 = dlsch1_harq->Nl;
#endif
+
+ }else if ((dlsch0 != NULL) && (dlsch1 == NULL)){
+
+ harq_pid = dlsch0->current_harq_pid;
+ dlsch0_harq = dlsch0->harq_processes[harq_pid];
+ mimo_mode = dlsch0_harq->mimo_mode;
+ mod_order0 = get_Qm(dlsch0_harq->mcs);
+ rb_alloc = dlsch0_harq->rb_alloc;
+#ifdef DEBUG_DLSCH_MODULATION
+ Nl0 = dlsch0_harq->Nl;
+#endif
+
+ dlsch1_harq = NULL;
+ mod_order1 = 0;
+#ifdef DEBUG_DLSCH_MODULATION
+ Nl1 = 0;
+#endif
+
+ }else if ((dlsch0 == NULL) && (dlsch1 != NULL)){
+
+ harq_pid = dlsch1->current_harq_pid;
+ dlsch1_harq = dlsch1->harq_processes[harq_pid];
+ mimo_mode = dlsch1_harq->mimo_mode;
+ mod_order0 = get_Qm(dlsch1_harq->mcs);
+ rb_alloc = dlsch1_harq->rb_alloc;
+#ifdef DEBUG_DLSCH_MODULATION
+ Nl0 = dlsch1_harq->Nl;
+#endif
+
+ dlsch0_harq = NULL;
+ mod_order1 = 0;
+#ifdef DEBUG_DLSCH_MODULATION
+ Nl1 = NULL;
+#endif
+
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_MODULATION, VCD_FUNCTION_IN);
nsymb = (frame_parms->Ncp==0) ? 14:12;
- amp_rho_a = (int16_t)(((int32_t)amp*dlsch0->sqrt_rho_a)>>13);
+ if (dlsch0 != NULL){
+ amp_rho_a = (int16_t)(((int32_t)amp*dlsch0->sqrt_rho_a)>>13); //amp=512 in full scale; dlsch0->sqrt_rho_a=8192in Q2.13, 1 in full scale
amp_rho_b = (int16_t)(((int32_t)amp*dlsch0->sqrt_rho_b)>>13);
+ } else{
+ amp_rho_a = (int16_t)(((int32_t)amp*dlsch1->sqrt_rho_a)>>13);
+ amp_rho_b = (int16_t)(((int32_t)amp*dlsch1->sqrt_rho_b)>>13);
+ }
if (mod_order0 == 4)
for (i=0;i<4; i++) {
@@ -1928,20 +2129,22 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
jj2=0;
re_allocated=0;
-
+
// printf("num_pdcch_symbols %d, nsymb %d\n",num_pdcch_symbols,nsymb);
for (l=num_pdcch_symbols; lmimo_mode,
- pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),
- mod_order0,
- mod_order1,
- rb_alloc[0],
- l);
+ printf("Generating DLSCH (harq_pid %d,mimo %d, pmi_alloc0 %lx, mod0 %d, mod1 %d, rb_alloc[0] %d) in %d\n",
+ harq_pid,
+ dlsch0_harq->mimo_mode,
+ pmi2hex_2Ar2(dlsch0_harq->pmi_alloc),
+ mod_order0,
+ mod_order1,
+ rb_alloc[0],
+ len);
#endif
+ }
if (frame_parms->Ncp==0) { // normal prefix
if ((l==4)||(l==11))
@@ -1987,9 +2190,9 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
for (aa=0;aanb_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;
@@ -1997,23 +2200,23 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
if (pilots>0) { // compute pilot arrays, could be done statically if performance suffers
if (frame_parms->mode1_flag == 1) {
- // printf("l %d, nushift %d, offset %d\n",l,frame_parms->nushift,offset);
- for (i=0,i2=0;i<12;i++) {
- if ((i!=(frame_parms->nushift+offset)) && (i!=((frame_parms->nushift+6+offset)%12)))
- P1_SHIFT[i2++]=1;
- else
- P1_SHIFT[i2++]=2;
- }
- P1_SHIFT[0]--;
+ // printf("l %d, nushift %d, offset %d\n",l,frame_parms->nushift,offset);
+ for (i=0,i2=0;i<12;i++) {
+ if ((i!=(frame_parms->nushift+offset)) && (i!=((frame_parms->nushift+6+offset)%12)))
+ P1_SHIFT[i2++]=1;
+ else
+ P1_SHIFT[i2++]=2;
+ }
+ P1_SHIFT[0]--;
}
else {
- for (i=0,i2=0;i<12;i++) {
- if ((i!=nushiftmod3) && (i!=nushiftmod3+6) && (i!=nushiftmod3+3) && (i!=nushiftmod3+9))
- P2_SHIFT[i2++]=1;
- else
- P2_SHIFT[i2++]=2;
- }
- P2_SHIFT[0]--;
+ for (i=0,i2=0;i<12;i++) {
+ if ((i!=nushiftmod3) && (i!=nushiftmod3+6) && (i!=nushiftmod3+3) && (i!=nushiftmod3+9))
+ P2_SHIFT[i2++]=1;
+ else
+ P2_SHIFT[i2++]=2;
+ }
+ P2_SHIFT[0]--;
}
}
P1_SHIFT[12]=1;P2_SHIFT[12]=1;
@@ -2022,44 +2225,44 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
symbol_offset = (uint32_t)frame_parms->ofdm_symbol_size*(l+(subframe_offset*nsymb));
allocate_REs = allocate_REs_in_RB;
-
+
switch (mod_order0) {
case 2:
qam_table_s0 = NULL;
break;
case 4:
if (pilots) {
- qam_table_s0 = qam16_table_b0;
- allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ?
- allocate_REs_in_RB_pilots_16QAM_siso :
- allocate_REs_in_RB;
+ qam_table_s0 = qam16_table_b0;
+ allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ?
+ allocate_REs_in_RB_pilots_16QAM_siso :
+ allocate_REs_in_RB;
}
else {
- qam_table_s0 = qam16_table_a0;
- allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ?
- allocate_REs_in_RB_no_pilots_16QAM_siso :
- allocate_REs_in_RB;
-
+ qam_table_s0 = qam16_table_a0;
+ allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ?
+ allocate_REs_in_RB_no_pilots_16QAM_siso :
+ allocate_REs_in_RB;
+
}
break;
-
+
case 6:
if (pilots) {
- qam_table_s0 = qam64_table_b0;
- allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ?
- allocate_REs_in_RB_pilots_64QAM_siso :
- allocate_REs_in_RB;
+ qam_table_s0 = qam64_table_b0;
+ allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ?
+ allocate_REs_in_RB_pilots_64QAM_siso :
+ allocate_REs_in_RB;
}
else {
- qam_table_s0 = qam64_table_a0;
- allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ?
- allocate_REs_in_RB_no_pilots_64QAM_siso :
- allocate_REs_in_RB;
+ qam_table_s0 = qam64_table_a0;
+ allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ?
+ allocate_REs_in_RB_no_pilots_64QAM_siso :
+ allocate_REs_in_RB;
}
break;
-
+
}
-
+
switch (mod_order1) {
case 2:
qam_table_s1 = NULL;
@@ -2067,25 +2270,25 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
break;
case 4:
if (pilots) {
- qam_table_s1 = qam16_table_b1;
+ qam_table_s1 = qam16_table_b1;
}
else {
- qam_table_s1 = qam16_table_a1;
+ qam_table_s1 = qam16_table_a1;
}
break;
case 6:
if (pilots) {
- qam_table_s1 = qam64_table_b1;
+ qam_table_s1 = qam64_table_b1;
}
else {
- qam_table_s1 = qam64_table_a1;
+ qam_table_s1 = qam64_table_a1;
}
break;
-
+
}
//for (aa=0;aanb_antennas_tx;aa++)
- // memset(&txdataF[aa][symbol_offset],0,frame_parms->ofdm_symbol_size<<2);
+ //memset(&txdataF[aa][symbol_offset],0,frame_parms->ofdm_symbol_size<<2);
//printf("symbol_offset %d,subframe offset %d : pilots %d\n",symbol_offset,subframe_offset,pilots);
for (rb=0; rbN_RB_DL; rb++) {
@@ -2101,15 +2304,18 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
rb_alloc_ind = 0;
if (check_skip(rb,subframe_offset,frame_parms,l,nsymb)==1)
- rb_alloc_ind = 0;
+ rb_alloc_ind = 0;
skip_half = check_skiphalf(rb,subframe_offset,frame_parms,l,nsymb);
skip_dc = check_skip_dc(rb,frame_parms);
-
- if (dlsch0_harq->Nlayers>1) {
- printf("Nlayers %d: re_offset %d, symbol %d offset %d\n",dlsch0_harq->Nlayers,re_offset,l,symbol_offset);
- return(-1);
+
+
+ if (dlsch0) {
+ if (dlsch0_harq->Nlayers>1) {
+ msg("Nlayers %d: re_offset %d, symbol %d offset %d\n",dlsch0_harq->Nlayers,re_offset,l,symbol_offset);
+ return(-1);
+ }
}
if (dlsch1) {
@@ -2122,40 +2328,52 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
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(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);
+ // 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);
+
+ if (dlsch0 != NULL) {
+ get_pmi_temp = get_pmi(frame_parms->N_RB_DL,
+ dlsch0->harq_processes[harq_pid]->mimo_mode,
+ dlsch0->harq_processes[harq_pid]->pmi_alloc,
+ rb);
+ } else
+ get_pmi_temp = get_pmi(frame_parms->N_RB_DL,
+ dlsch1->harq_processes[harq_pid]->mimo_mode,
+ dlsch1->harq_processes[harq_pid]->pmi_alloc,
+ rb);
+
+
+ allocate_REs_in_RB(phy_vars_eNB,
+ txdataF,
+ &jj,
+ &jj2,
+ re_offset,
+ symbol_offset,
+ (dlsch0 == NULL) ? NULL : dlsch0->harq_processes[harq_pid],
+ (dlsch1 == NULL) ? NULL : dlsch1->harq_processes[harq_pid],
+ pilots,
+ ((pilots) ? amp_rho_b : amp_rho_a),
+ get_pmi_temp,
+ 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);
+ // printf("Unallocated rb %d/symbol %d, re_offset %d, jj %d\n",rb,l,re_offset,jj);
}
re_offset+=12; // go to next RB
-
// check if we crossed the symbol boundary and skip DCs
+
if (re_offset >= frame_parms->ofdm_symbol_size) {
if (skip_dc == 0) //even number of RBs (doesn't straddle DC)
re_offset=1;
@@ -2163,9 +2381,159 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
re_offset=7; // odd number of RBs
}
}
-
}
+#ifdef DEBUG_DLSCH_MODULATION
+ if (dlsch0 != NULL){
+ msg("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));
+ }else{
+ msg("generate_dlsch : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch1_harq->nb_rb,dlsch1_harq->rb_alloc,mod_order1,Nl1,2,0,subframe_offset));
+ }
+#endif
+
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_MODULATION, VCD_FUNCTION_OUT);
+
+ return (re_allocated);
+}
+
+
+int dlsch_modulation_SIC(int32_t **sic_buffer,
+ 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,
+ int G)
+{
+
+ uint8_t nsymb;
+ uint8_t harq_pid = dlsch0->current_harq_pid;
+ LTE_DL_eNB_HARQ_t *dlsch0_harq = dlsch0->harq_processes[harq_pid];
+ LTE_DL_eNB_HARQ_t *dlsch1_harq; //= dlsch1->harq_processes[harq_pid];
+ uint32_t i,jj,re_allocated=0;
+ uint16_t l,rb,re_offset, amp;
+ uint32_t *rb_alloc = dlsch0_harq->rb_alloc;
+ uint8_t mod_order0 = get_Qm(dlsch0_harq->mcs);
+ uint8_t *x0 = dlsch0_harq->e;
+ uint8_t qam64_table_offset_re = 0;
+ uint8_t qam64_table_offset_im = 0;
+ uint8_t qam16_table_offset_re = 0;
+ uint8_t qam16_table_offset_im = 0;
+ int16_t gain_lin_QPSK;
+ #ifdef DEBUG_DLSCH_MODULATION
+ uint8_t Nl0 = dlsch0_harq->Nl;
+ uint8_t Nl1;
+#endif
+
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_MODULATION, VCD_FUNCTION_IN);
+
+ amp=1; //we do full scale here for SIC
+ gain_lin_QPSK = (int16_t)((ONE_OVER_SQRT2_Q15));
+ //printf("gain=%d\n", gain_lin_QPSK);
+
+ jj = 0;
+ i = 0;
+ while (jj <= G-1) {
+
+ re_allocated = re_allocated + 1;
+
+ switch (mod_order0) {
+ case 2: //QPSK
+ /* TODO: handle more than 1 antenna */
+ //printf("%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
+
+ ((int16_t*)&sic_buffer[0][i])[0] = (x0[jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i
+
+ jj = jj + 1;
+
+ ((int16_t*)&sic_buffer[0][i])[1] = (x0[jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1}
+
+ jj = jj + 1;
+
+ //printf("recon %d,%d\n",((int16_t*)&sic_buffer[0][i])[0],((int16_t*)&sic_buffer[0][i])[1]);
+ i++;
+
+ 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 *)&sic_buffer[0][i])[0]+=qam16_table[qam16_table_offset_re];
+ ((int16_t *)&sic_buffer[0][i])[1]+=qam16_table[qam16_table_offset_im];
+
+ i++;
+
+ break;
+
+ case 6:
+
+ 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 *)&sic_buffer[0][i])[0]+=(qam64_table[qam64_table_offset_re])>>1;//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15);
+ ((int16_t *)&sic_buffer[0][i])[1]+=(qam64_table[qam64_table_offset_im])>>1;//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15);
+
+ i++;
+
+ break;
+ }
+
+ }
#ifdef DEBUG_DLSCH_MODULATION
@@ -2177,6 +2545,7 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
return (re_allocated);
}
+
int mch_modulation(int32_t **txdataF,
int16_t amp,
uint32_t subframe_offset,
@@ -2221,14 +2590,13 @@ int mch_modulation(int32_t **txdataF,
if ((frame_parms->N_RB_DL&1) == 1) { // ODD N_RB_DL
- if (rb==(frame_parms->N_RB_DL>>1))
+ if (rb==(frame_parms->N_RB_DL>>1))
skip_dc = 1;
else
skip_dc = 0;
}
-
if (mod_order == 4)
qam_table_s = qam16_table_a;
else if (mod_order == 6)
@@ -2236,7 +2604,7 @@ int mch_modulation(int32_t **txdataF,
else
qam_table_s = NULL;
- // printf("Allocated rb %d, subframe_offset %d,amp %d\n",rb,subframe_offset,amp);
+ //printf("Allocated rb %d, subframe_offset %d,amp %d\n",rb,subframe_offset,amp);
allocate_REs_in_RB_MCH(txdataF,
&jj,
re_offset,
@@ -2252,7 +2620,6 @@ int mch_modulation(int32_t **txdataF,
re_offset+=12; // go to next RB
-
// check if we crossed the symbol boundary and skip DC
if (re_offset >= frame_parms->ofdm_symbol_size) {
if (skip_dc == 0) //even number of RBs (doesn't straddle DC)
@@ -2263,10 +2630,6 @@ 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,1/*transmission mode*/));
#endif
diff --git a/openair1/PHY/LTE_TRANSPORT/pcfich.c b/openair1/PHY/LTE_TRANSPORT/pcfich.c
index 3b141372f0..3319cd0f78 100644
--- a/openair1/PHY/LTE_TRANSPORT/pcfich.c
+++ b/openair1/PHY/LTE_TRANSPORT/pcfich.c
@@ -69,9 +69,9 @@ void generate_pcfich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms)
first_reg = pcfich_reg[3];
}
- //#ifdef DEBUG_PCFICH
+ #ifdef DEBUG_PCFICH
printf("pcfich_reg : %d,%d,%d,%d\n",pcfich_reg[0],pcfich_reg[1],pcfich_reg[2],pcfich_reg[3]);
- //#endif
+ #endif
}
void pcfich_scrambling(LTE_DL_FRAME_PARMS *frame_parms,
diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c
index fe4090bb47..aa99f5cca1 100644
--- a/openair1/PHY/LTE_TRANSPORT/phich.c
+++ b/openair1/PHY/LTE_TRANSPORT/phich.c
@@ -307,7 +307,7 @@ void generate_phich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms)
Ngroup_PHICH<<=1;
}
- //#ifdef DEBUG_PHICH
+ #ifdef DEBUG_PHICH
printf("Ngroup_PHICH %d (phich_config_common.phich_resource %d,phich_config_common.phich_duration %s, NidCell %d,Ncp %d, frame_type %d), smallest pcfich REG %d, n0 %d, n1 %d (first PHICH REG %d)\n",
((frame_parms->Ncp == NORMAL)?Ngroup_PHICH:(Ngroup_PHICH>>1)),
frame_parms->phich_config_common.phich_resource,
@@ -317,7 +317,7 @@ void generate_phich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms)
n0,
n1,
((frame_parms->Nid_cell))%n0);
- //#endif
+ #endif
// This is the algorithm from Section 6.9.3 in 36-211, it works only for normal PHICH duration for now ...
@@ -371,9 +371,9 @@ void generate_phich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms)
if (frame_parms->phich_reg[mprime][2]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+3)&3])
frame_parms->phich_reg[mprime][2]++;
- //#ifdef DEBUG_PHICH
+ #ifdef DEBUG_PHICH
printf("phich_reg :%d => %d,%d,%d\n",mprime,frame_parms->phich_reg[mprime][0],frame_parms->phich_reg[mprime][1],frame_parms->phich_reg[mprime][2]);
- //#endif
+ #endif
} else { // extended PHICH duration
frame_parms->phich_reg[mprime<<1][0] = (frame_parms->Nid_cell + mprime)%n0;
frame_parms->phich_reg[1+(mprime<<1)][0] = (frame_parms->Nid_cell + mprime)%n0;
diff --git a/openair1/PHY/LTE_TRANSPORT/power_control.c b/openair1/PHY/LTE_TRANSPORT/power_control.c
index 9f2bf71d27..743c16b2f0 100644
--- a/openair1/PHY/LTE_TRANSPORT/power_control.c
+++ b/openair1/PHY/LTE_TRANSPORT/power_control.c
@@ -22,41 +22,44 @@
#include "PHY/defs.h"
#include "PHY/impl_defs_lte.h"
-//#define DEBUG_PC 1
-
+//#define DEBUG_PC 0
/*
double ratioPB[2][4]={{ 1.0,4.0/5.0,3.0/5.0,2.0/5.0},
{ 5.0/4.0,1.0,3.0/4.0,1.0/2.0}};
*/
-double ratioPB[2][4]= {{ 0.00000, -0.96910, -2.21849, -3.97940},
- { 0.96910, 0.00000, -1.24939, -3.01030}
-};
+double ratioPB[2][4]={{ 0.00000, -0.96910, -2.21849, -3.97940}, //in db
+ { 0.96910, 0.00000, -1.24939, -3.01030}};
-double pa_values[8]= {-6.0,-4.77,-3.0,-1.77,0.0,1.0,2.0,3.0};
+double pa_values[8]={-6.0,-4.77,-3.0,-1.77,0.0,1.0,2.0,3.0}; //reported by higher layers
double get_pa_dB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated)
{
- return(pa_values[pdsch_config_dedicated->p_a]);
+ if (pdsch_config_dedicated)
+ return(pa_values[ pdsch_config_dedicated->p_a]);
+ else
+ return(0.0);
}
double computeRhoA_eNB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
- LTE_eNB_DLSCH_t *dlsch_eNB,int dl_power_off)
-{
+ LTE_eNB_DLSCH_t *dlsch_eNB, int dl_power_off, uint8_t n_antenna_port){
double rho_a_dB;
double sqrt_rho_a_lin;
- rho_a_dB = pa_values[ pdsch_config_dedicated->p_a];
+ rho_a_dB = get_pa_dB(pdsch_config_dedicated);
- if(!dl_power_off)
+ if(!dl_power_off) //if dl_power_offset is 0, this is for MU-interference, TM5
rho_a_dB-=10*log10(2);
+ if(n_antenna_port==4) // see TS 36.213 Section 5.2
+ rho_a_dB=+10*log10(2);
+
sqrt_rho_a_lin= pow(10,(0.05*rho_a_dB));
dlsch_eNB->sqrt_rho_a= (short) (sqrt_rho_a_lin*pow(2,13));
-#ifdef DEBUG_PC
- printf("sqrt_rho_a(eNB):%d\n",dlsch_eNB->sqrt_rho_a);
+#if DEBUG_PC
+ printf("eNB: p_a=%d, value=%f, sqrt_rho_a=%d\n",pdsch_config_dedicated->p_a,pa_values[ pdsch_config_dedicated->p_a],dlsch_eNB->sqrt_rho_a);
#endif
return(rho_a_dB);
@@ -72,7 +75,7 @@ double computeRhoB_eNB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
double rho_a_dB, rho_b_dB;
double sqrt_rho_b_lin;
- rho_a_dB= computeRhoA_eNB(pdsch_config_dedicated,dlsch_eNB,dl_power_off);
+ rho_a_dB= computeRhoA_eNB(pdsch_config_dedicated,dlsch_eNB,dl_power_off, n_antenna_port);
if(n_antenna_port>1)
rho_b_dB= ratioPB[1][pdsch_config_common->p_b] + rho_a_dB;
@@ -84,7 +87,7 @@ double computeRhoB_eNB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
dlsch_eNB->sqrt_rho_b= (short) (sqrt_rho_b_lin*pow(2,13));
#ifdef DEBUG_PC
- printf("sqrt_rho_b(eNB):%d\n",dlsch_eNB->sqrt_rho_b);
+ printf("eNB: n_ant=%d, p_b=%d -> rho_b/rho_a=%f -> sqrt_rho_b=%d\n",n_antenna_port,pdsch_config_common->p_b,ratioPB[1][pdsch_config_common->p_b],dlsch_eNB->sqrt_rho_b);
#endif
return(rho_b_dB);
}
@@ -92,23 +95,28 @@ double computeRhoB_eNB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
double computeRhoA_UE(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
LTE_UE_DLSCH_t *dlsch_ue,
- unsigned char dl_power_off)
-{
+ unsigned char dl_power_off,
+ uint8_t n_antenna_port
+ ){
double rho_a_dB;
double sqrt_rho_a_lin;
- rho_a_dB = pa_values[ pdsch_config_dedicated->p_a];
+ rho_a_dB = get_pa_dB(pdsch_config_dedicated);
if(!dl_power_off)
rho_a_dB-=10*log10(2);
+ //if dl_power_offset is 0, this is for MU-interference, TM5. But in practice UE may assume 16 or 64QAM TM4 as multiuser
+
+ if(n_antenna_port==4) // see TS 36.213 Section 5.2
+ rho_a_dB=+10*log10(2);
sqrt_rho_a_lin= pow(10,(0.05*rho_a_dB));
dlsch_ue->sqrt_rho_a= (short) (sqrt_rho_a_lin*pow(2,13));
#ifdef DEBUG_PC
- printf("p_a %d, rho_a_dB: %f, sqrt_rho_a(ue):%d \n",pdsch_config_dedicated->p_a, rho_a_dB, dlsch_ue->sqrt_rho_a);
+ printf("UE: p_a=%d, value=%f, dl_power_off=%d, sqrt_rho_a=%d\n",pdsch_config_dedicated->p_a,pa_values[ pdsch_config_dedicated->p_a],dl_power_off,dlsch_ue->sqrt_rho_a);
#endif
return(rho_a_dB);
@@ -124,7 +132,7 @@ double computeRhoB_UE(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
double rho_a_dB, rho_b_dB;
double sqrt_rho_b_lin;
- rho_a_dB= computeRhoA_UE(pdsch_config_dedicated,dlsch_ue,dl_power_off);
+ rho_a_dB= computeRhoA_UE(pdsch_config_dedicated,dlsch_ue,dl_power_off, n_antenna_port);
if(n_antenna_port>1)
rho_b_dB= ratioPB[1][pdsch_config_common->p_b] + rho_a_dB;
@@ -136,9 +144,7 @@ double computeRhoB_UE(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
dlsch_ue->sqrt_rho_b= (short) (sqrt_rho_b_lin*pow(2,13));
#ifdef DEBUG_PC
- printf("p_b : %d, rho_b_dB: %f, sqrt_rho_b(ue):%d\n",pdsch_config_common->p_b, rho_b_dB, dlsch_ue->sqrt_rho_b);
+ printf("UE: p_b=%d, n_ant=%d -> ratio=%f -> sqrt_rho_b=%d\n",pdsch_config_common->p_b, n_antenna_port,ratioPB[1][pdsch_config_common->p_b],dlsch_ue->sqrt_rho_b);
#endif
return(rho_b_dB);
}
-
-
diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h
index c90dcdbde6..78bb9add06 100644
--- a/openair1/PHY/LTE_TRANSPORT/proto.h
+++ b/openair1/PHY/LTE_TRANSPORT/proto.h
@@ -121,6 +121,18 @@ int32_t dlsch_encoding(PHY_VARS_eNB *eNB,
time_stats_t *te_stats,
time_stats_t *i_stats);
+int32_t dlsch_encoding_SIC(PHY_VARS_UE *ue,
+ uint8_t *a,
+ uint8_t num_pdcch_symbols,
+ LTE_eNB_DLSCH_t *dlsch,
+ int frame,
+ uint8_t subframe,
+ time_stats_t *rm_stats,
+ time_stats_t *te_stats,
+ time_stats_t *i_stats);
+
+
+
/** \fn dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
uint8_t *input_buffer,
uint8_t num_pdcch_symbols,
@@ -180,7 +192,7 @@ void dlsch_encoding_emul(PHY_VARS_eNB *phy_vars_eNB,
\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 jj2 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
@@ -192,7 +204,7 @@ 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 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
@@ -281,6 +293,14 @@ int32_t dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
uint8_t num_pdcch_symbols,
LTE_eNB_DLSCH_t *dlsch0,
LTE_eNB_DLSCH_t *dlsch1);
+
+int32_t dlsch_modulation_SIC(int32_t **sic_buffer,
+ 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,
+ int G);
/*
\brief This function is the top-level routine for generation of the sub-frame signal (frequency-domain) for MCH.
@param txdataF Table of pointers for frequency-domain TX signals
@@ -789,6 +809,18 @@ int32_t dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
@param beamforming_mode beamforming mode
*/
+int32_t dlsch_qpsk_llr_SIC(LTE_DL_FRAME_PARMS *frame_parms,
+ int **rxdataF_comp,
+ int32_t **sic_buffer,
+ int **rho_i,
+ short *dlsch_llr,
+ uint8_t num_pdcch_symbols,
+ uint16_t nb_rb,
+ uint8_t subframe,
+ uint32_t rb_alloc,
+ uint16_t mod_order_0,
+ LTE_UE_DLSCH_t *dlsch0);
+
void dlsch_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
int32_t **rxdataF_comp,
int16_t *dlsch_llr,
@@ -799,7 +831,6 @@ void dlsch_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
uint16_t pbch_pss_sss_adjust,
int16_t **llr128p,
uint8_t beamforming_mode);
-
/**
\brief This function generates log-likelihood ratios (decoder input) for single-stream 16QAM received waveforms
@param frame_parms Frame descriptor structure
@@ -813,6 +844,34 @@ void dlsch_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
@param pbch_pss_sss_adjust PBCH/PSS/SSS RE adjustment (in REs)
@param beamforming_mode beamforming mode
*/
+void dlsch_16qam_llr_SIC (LTE_DL_FRAME_PARMS *frame_parms,
+ int32_t **rxdataF_comp,
+ int32_t **sic_buffer, //Q15
+ int32_t **rho_i,
+ int16_t *dlsch_llr,
+ uint8_t num_pdcch_symbols,
+ int32_t **dl_ch_mag,
+ uint16_t nb_rb,
+ uint8_t subframe,
+ uint32_t rb_alloc,
+ uint16_t mod_order_0,
+ LTE_UE_DLSCH_t *dlsch0);
+
+void dlsch_64qam_llr_SIC(LTE_DL_FRAME_PARMS *frame_parms,
+ int32_t **rxdataF_comp,
+ int32_t **sic_buffer, //Q15
+ int32_t **rho_i,
+ int16_t *dlsch_llr,
+ uint8_t num_pdcch_symbols,
+ int32_t **dl_ch_mag,
+ int32_t **dl_ch_magb,
+ uint16_t nb_rb,
+ uint8_t subframe,
+ uint32_t rb_alloc,
+ uint16_t mod_order_0,
+ LTE_UE_DLSCH_t *dlsch0);
+
+
void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
int32_t **rxdataF_comp,
int16_t *dlsch_llr,
@@ -825,6 +884,7 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
int16_t **llr_save,
uint8_t beamforming_mode);
+
/** \fn dlsch_siso(LTE_DL_FRAME_PARMS *frame_parms,
int32_t **rxdataF_comp,
int32_t **rxdataF_comp_i,
@@ -922,6 +982,14 @@ void dlsch_detection_mrc(LTE_DL_FRAME_PARMS *frame_parms,
uint16_t nb_rb,
uint8_t dual_stream_UE);
+void dlsch_detection_mrc_TM34(LTE_DL_FRAME_PARMS *frame_parms,
+ LTE_UE_PDSCH *lte_ue_pdsch_vars,
+ int harq_pid,
+ int round,
+ unsigned char symbol,
+ unsigned short nb_rb,
+ unsigned char dual_stream_UE);
+
/** \fn dlsch_extract_rbs_single(int32_t **rxdataF,
int32_t **dl_ch_estimates,
int32_t **rxdataF_ext,
@@ -992,7 +1060,8 @@ uint16_t dlsch_extract_rbs_dual(int32_t **rxdataF,
uint8_t symbol,
uint8_t subframe,
uint32_t high_speed_flag,
- LTE_DL_FRAME_PARMS *frame_parms);
+ LTE_DL_FRAME_PARMS *frame_parms,
+ MIMO_mode_t mimo_mode);
/** \fn dlsch_extract_rbs_TM7(int32_t **rxdataF,
int32_t **dl_bf_ch_estimates,
@@ -1062,6 +1131,15 @@ void dlsch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms,
int **dl_ch_rho_ext,
unsigned char output_shift);
+void dlsch_dual_stream_correlationTM34(LTE_DL_FRAME_PARMS *frame_parms,
+ unsigned char symbol,
+ unsigned short nb_rb,
+ int **dl_ch_estimates_ext,
+ int **dl_ch_estimates_ext_i,
+ int **dl_ch_rho_ext,
+ unsigned char output_shift0,
+ unsigned char output_shift1);
+
void dlsch_channel_compensation_TM56(int **rxdataF_ext,
int **dl_ch_estimates_ext,
int **dl_ch_mag,
@@ -1077,16 +1155,20 @@ void dlsch_channel_compensation_TM56(int **rxdataF_ext,
unsigned char output_shift,
unsigned char dl_power_off);
-void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
+
+void dlsch_channel_compensation_TM34(LTE_DL_FRAME_PARMS *frame_parms,
LTE_UE_PDSCH *lte_ue_pdsch_vars,
PHY_MEASUREMENTS *phy_measurements,
int eNB_id,
unsigned char symbol,
unsigned char mod_order0,
unsigned char mod_order1,
+ int harq_pid,
int round,
+ MIMO_mode_t mimo_mode,
unsigned short nb_rb,
- unsigned char output_shift);
+ unsigned char output_shift0,
+ unsigned char output_shift1);
/** \brief This function computes the average channel level over all allocated RBs and antennas (TX/RX) in order to compute output shift for compensated signal
@@ -1102,11 +1184,16 @@ void dlsch_channel_level(int32_t **dl_ch_estimates_ext,
uint8_t pilots_flag,
uint16_t nb_rb);
-void dlsch_channel_level_TM3(int **dl_ch_estimates_ext,
- LTE_DL_FRAME_PARMS *frame_parms,
- int *avg,
- uint8_t symbol,
- unsigned short nb_rb);
+
+void dlsch_channel_level_TM34(int **dl_ch_estimates_ext,
+ LTE_DL_FRAME_PARMS *frame_parms,
+ unsigned char *pmi_ext,
+ int *avg_0,
+ int *avg_1,
+ uint8_t symbol,
+ unsigned short nb_rb,
+ MIMO_mode_t mimo_mode);
+
void dlsch_channel_level_TM56(int32_t **dl_ch_estimates_ext,
LTE_DL_FRAME_PARMS *frame_parms,
@@ -1167,6 +1254,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
- RE extraction (pilot, PBCH, synch. signals)
- antenna combining (MRC, Alamouti, cycling)
- LLR computation
+ This function supports TM1, 2, 3, 5, and 6.
@param phy_vars_ue Pointer to PHY variables
@param type Type of PDSCH (SI_PDSCH,RA_PDSCH,PDSCH,PMCH)
@param eNB_id eNb index (Nid1) 0,1,2
@@ -1174,7 +1262,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
@param subframe Subframe number
@param symbol Symbol on which to act (within sub-frame)
@param first_symbol_flag set to 1 on first DLSCH symbol
- @param dual_stream_UE Flag to indicate dual-stream interference cancellation
+ @param rx_type. rx_type=RX_IC_single_stream will enable interference cancellation of a second stream when decoding the first stream. In case of TM1, 2, 5, and this can cancel interference from a neighbouring cell given by eNB_id_i. In case of TM5, eNB_id_i should be set to n_connected_eNB to perform multi-user interference cancellation. In case of TM3, eNB_id_i should be set to eNB_id to perform co-channel interference cancellation; this option should be used together with an interference cancellation step [...]. In case of TM3, if rx_type=RX_IC_dual_stream, both streams will be decoded by applying the IC single stream receiver twice.
@param i_mod Modulation order of the interfering stream
*/
int32_t rx_pdsch(PHY_VARS_UE *phy_vars_ue,
@@ -1185,7 +1273,7 @@ int32_t rx_pdsch(PHY_VARS_UE *phy_vars_ue,
uint8_t subframe,
uint8_t symbol,
uint8_t first_symbol_flag,
- uint8_t dual_stream_UE,
+ RX_type_t rx_type,
uint8_t i_mod,
uint8_t harq_pid);
@@ -1397,7 +1485,7 @@ uint32_t get_TBS_UL(uint8_t mcs, uint16_t nb_rb);
*/
uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap);
-/* \brief Return prb for a given vrb index
+/* \brief Return prb for a given vrb index
@param vrb_type VRB type (0=localized,1=distributed)
@param rb_alloc_dci rballoc field from DCI
*/
@@ -1521,7 +1609,7 @@ uint8_t subframe2harq_pid(LTE_DL_FRAME_PARMS *frame_parms,frame_t frame,uint8_t
uint8_t subframe2harq_pid_eNBrx(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe);
int generate_ue_dlsch_params_from_dci(int frame,
- uint8_t subframe,
+ uint8_t subframe,
void *dci_pdu,
rnti_t rnti,
DCI_format_t dci_format,
@@ -1591,10 +1679,6 @@ int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *PHY_vars_eNB,
void dump_ulsch(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t UE_id);
-
-
-
-
int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci);
int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, UE_rxtx_proc_t *proc, char* buffer, int length, runmode_t mode, int input_level_dBm);
@@ -1771,10 +1855,20 @@ void print_CQI(void *o,UCI_format_t uci_format,uint8_t eNB_id,int N_RB_DL);
void extract_CQI(void *o,UCI_format_t uci_format,LTE_eNB_UE_stats *stats,uint8_t N_RB_DL, uint16_t * crnti, uint8_t * access_mode);
void fill_CQI(LTE_UE_ULSCH_t *ulsch,PHY_MEASUREMENTS *meas,uint8_t eNB_id, uint8_t harq_pid,int N_RB_DL, rnti_t rnti, uint8_t trans_mode,double sinr_eff);
+
void reset_cba_uci(void *o);
+/** \brief This routine computes the subband PMI bitmap based on measurements (0,1,2,3 for rank 0 and 0,1 for rank 1) in the format needed for UCI
+ @param meas pointer to measurements
+ @param eNB_id eNB_id
+ @param nb_subbands number of subbands
+ @returns subband PMI bitmap
+*/
uint16_t quantize_subband_pmi(PHY_MEASUREMENTS *meas,uint8_t eNB_id,int nb_subbands);
-uint16_t quantize_subband_pmi2(PHY_MEASUREMENTS *meas,uint8_t eNB_id,uint8_t a_id,int nb_subbands);
+
+int32_t pmi_convert_rank1_from_rank2(uint16_t pmi_alloc, int tpmi, int nb_rb);
+
+//uint16_t quantize_subband_pmi2(PHY_MEASUREMENTS *meas,uint8_t eNB_id,uint8_t a_id,int nb_subbands);
uint64_t pmi2hex_2Ar1(uint32_t pmi);
@@ -1784,14 +1878,29 @@ uint64_t cqi2hex(uint32_t cqi);
uint16_t computeRIV(uint16_t N_RB_DL,uint16_t RBstart,uint16_t Lcrbs);
-uint32_t pmi_extend(LTE_DL_FRAME_PARMS *frame_parms,uint8_t wideband_pmi);
+/** \brief This routine expands a single (wideband) PMI to subband PMI bitmap similar to the one used in the UCI and in the dlsch_modulation routine
+ @param frame_parms Pointer to DL frame configuration parameters
+ @param wideband_pmi (0,1,2,3 for rank 0 and 0,1 for rank 1)
+ @param rank (0 or 1)
+ @returns subband PMI bitmap
+*/
+uint32_t pmi_extend(LTE_DL_FRAME_PARMS *frame_parms,uint8_t wideband_pmi, uint8_t rank);
+
+/** \brief This routine extracts a single subband PMI from a bitmap coming from UCI or the pmi_extend function
+ @param N_RB_DL number of resource blocks
+ @param mimo_mode
+ @param pmi_alloc subband PMI bitmap
+ @param rb resource block for which to extract PMI
+ @returns subband PMI
+*/
+uint8_t get_pmi(uint8_t N_RB_DL,MIMO_mode_t mode, uint32_t pmi_alloc,uint16_t rb);
int get_nCCE_offset_l1(int *CCE_table,
- const unsigned char L,
- const int nCCE,
- const int common_dci,
- const unsigned short rnti,
- const unsigned char subframe);
+ const unsigned char L,
+ const int nCCE,
+ const int common_dci,
+ const unsigned short rnti,
+ const unsigned char subframe);
uint16_t get_nCCE(uint8_t num_pdcch_symbols,LTE_DL_FRAME_PARMS *frame_parms,uint8_t mi);
@@ -1867,15 +1976,15 @@ void generate_pucch_emul(PHY_VARS_UE *phy_vars_ue,
uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
- PUCCH_FMT_t fmt,
- uint8_t UE_id,
- uint16_t n1_pucch,
- uint16_t n2_pucch,
- uint8_t shortened_format,
- uint8_t *payload,
- int frame,
- uint8_t subframe,
- uint8_t pucch1_thres);
+ PUCCH_FMT_t fmt,
+ uint8_t UE_id,
+ uint16_t n1_pucch,
+ uint16_t n2_pucch,
+ uint8_t shortened_format,
+ uint8_t *payload,
+ int frame,
+ uint8_t subframe,
+ uint8_t pucch1_thres);
int32_t rx_pucch_emul(PHY_VARS_eNB *phy_vars_eNB,
eNB_rxtx_proc_t *proc,
@@ -1885,7 +1994,6 @@ int32_t rx_pucch_emul(PHY_VARS_eNB *phy_vars_eNB,
uint8_t *payload);
-
/*!
\brief Check for PRACH TXop in subframe
@param frame_parms Pointer to LTE_DL_FRAME_PARMS
@@ -1979,16 +2087,19 @@ double get_pa_dB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated);
double computeRhoA_eNB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
LTE_eNB_DLSCH_t *dlsch_eNB,
- int dl_power_off);
+ int dl_power_off,
+ uint8_t n_antenna_port);
double computeRhoB_eNB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
PDSCH_CONFIG_COMMON *pdsch_config_common,
uint8_t n_antenna_port,
- LTE_eNB_DLSCH_t *dlsch_eNB,int dl_power_off);
+ LTE_eNB_DLSCH_t *dlsch_eNB,
+ int dl_power_off);
double computeRhoA_UE(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
LTE_UE_DLSCH_t *dlsch_ue,
- uint8_t dl_power_off);
+ uint8_t dl_power_off,
+ uint8_t n_antenna_port);
double computeRhoB_UE(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
PDSCH_CONFIG_COMMON *pdsch_config_common,
@@ -2002,7 +2113,7 @@ double computeRhoB_UE(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
LTE_UE_DLSCH_t *dlsch_ue);
*/
-uint8_t get_prach_prb_offset(LTE_DL_FRAME_PARMS *frame_parms, uint8_t tdd_mapindex, uint16_t Nf);
+uint8_t get_prach_prb_offset(LTE_DL_FRAME_PARMS *frame_parms, uint8_t tdd_mapindex, uint16_t Nf);
uint8_t ul_subframe2pdcch_alloc_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t n);
diff --git a/openair1/PHY/LTE_TRANSPORT/uci_tools.c b/openair1/PHY/LTE_TRANSPORT/uci_tools.c
index 467b1bbc9a..fba5b0c0e3 100644
--- a/openair1/PHY/LTE_TRANSPORT/uci_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/uci_tools.c
@@ -168,6 +168,7 @@ void extract_CQI(void *o,UCI_format_t uci_format,LTE_eNB_UE_stats *stats, uint8_
//unsigned char rank;
//UCI_format fmt;
//uint8_t N_RB_DL = 25;
+ uint8_t i;
LOG_D(PHY,"[eNB][UCI] N_RB_DL %d uci format %d\n", N_RB_DL,uci_format);
switch(N_RB_DL) {
@@ -275,6 +276,11 @@ void extract_CQI(void *o,UCI_format_t uci_format,LTE_eNB_UE_stats *stats, uint8_
stats->DL_cqi[1] = 24;
stats->DL_pmi_dual = ((wideband_cqi_rank2_2A_5MHz *)o)->pmi;
+ //this translates the 2-layer PMI into a single layer PMI for the first codeword
+ //the PMI for the second codeword will be stats->DL_pmi_single^0x1555
+ stats->DL_pmi_single = 0;
+ for (i=0;i<7;i++)
+ stats->DL_pmi_single = stats->DL_pmi_single | (((stats->DL_pmi_dual&(1>i)*2)<<2*i;
break;
case HLC_subband_cqi_nopmi:
diff --git a/openair1/PHY/TOOLS/cadd_vv.c b/openair1/PHY/TOOLS/cadd_vv.c
index 0707f02085..f270f147d2 100644
--- a/openair1/PHY/TOOLS/cadd_vv.c
+++ b/openair1/PHY/TOOLS/cadd_vv.c
@@ -1,3 +1,29 @@
+/*******************************************************************************
+ 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 WITTOOLHOUT 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 .
+
+ Contact Information
+ OpenAirInterface Admin: openair_admin@eurecom.fr
+ OpenAirInterface Tech : openair_tech@eurecom.fr
+ OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
+
+ Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -169,6 +195,37 @@ int add_cpx_vector32(short *x,
return(0);
}
+int32_t sub_cpx_vector16(int16_t *x,
+ int16_t *y,
+ int16_t *z,
+ uint32_t N)
+{
+ unsigned int i; // loop counter
+
+ __m128i *x_128;
+ __m128i *y_128;
+ __m128i *z_128;
+
+ x_128 = (__m128i *)&x[0];
+ y_128 = (__m128i *)&y[0];
+ z_128 = (__m128i *)&z[0];
+
+ for(i=0; i<(N>>3); i++) {
+ z_128[0] = _mm_subs_epi16(x_128[0],y_128[0]);
+
+ x_128++;
+ y_128++;
+ z_128++;
+
+ }
+
+ _mm_empty();
+ _m_empty();
+ return(0);
+}
+
+
+
int add_real_vector64(short *x,
short* y,
short *z,
diff --git a/openair1/PHY/TOOLS/cdot_prod.c b/openair1/PHY/TOOLS/cdot_prod.c
index d7c7dd3fea..7e73e58e5e 100644
--- a/openair1/PHY/TOOLS/cdot_prod.c
+++ b/openair1/PHY/TOOLS/cdot_prod.c
@@ -107,10 +107,10 @@ int32_t dot_product(int16_t *x,
// print_shorts("mmtmp7",&mmtmp7);
// convert back to integer
result = _mm_cvtsi64_si32(mmtmp7);
-
+
_mm_empty();
_m_empty();
-
+
return(result);
#elif defined(__arm__)
diff --git a/openair1/PHY/TOOLS/cmult_sv.c b/openair1/PHY/TOOLS/cmult_sv.c
index aebab9b38f..bc631bd6cc 100644
--- a/openair1/PHY/TOOLS/cmult_sv.c
+++ b/openair1/PHY/TOOLS/cmult_sv.c
@@ -59,18 +59,23 @@ void multadd_complex_vector_real_scalar(int16_t *x,
if (zero_flag == 1)
for (n=0; n>2; n++) {
+ // print_shorts("x_128[n]=", &x_128[n]);
+ // print_shorts("alpha_128", &alpha_128);
y_128[n] = mulhi_int16(x_128[n],alpha_128);
+ // print_shorts("y_128[n]=", &y_128[n]);
}
else
for (n=0; n>2; n++) {
y_128[n] = adds_int16(y_128[n],mulhi_int16(x_128[n],alpha_128));
}
-
+
_mm_empty();
_m_empty();
}
+
+
void multadd_real_vector_complex_scalar(int16_t *x,
int16_t *alpha,
int16_t *y,
@@ -380,6 +385,7 @@ int rotate_cpx_vector(int16_t *x,
m3 = _mm_sra_epi32(m3,shift); // shift right by shift in order to compensate for the input amplitude
y_128[0] = _mm_packs_epi32(m2,m3); // pack in 16bit integers with saturation [re im re im re im re im]
+ //print_ints("y_128[0]=", &y_128[0]);
#elif defined(__arm__)
ab_re0 = vmull_s16(((int16x4_t*)xd)[0],((int16x4_t*)&bconj)[0]);
diff --git a/openair1/PHY/TOOLS/cmult_vv.c b/openair1/PHY/TOOLS/cmult_vv.c
index 9d5079f52b..f8caa0c6da 100644
--- a/openair1/PHY/TOOLS/cmult_vv.c
+++ b/openair1/PHY/TOOLS/cmult_vv.c
@@ -28,8 +28,11 @@
#if defined(__x86_64__) || defined(__i386__)
int16_t conjug[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1} ;
int16_t conjug2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1} ;
+
#define simd_q15_t __m128i
#define simdshort_q15_t __m64
+#define set1_int16(a) _mm_set1_epi16(a)
+#define setr_int16(a0, a1, a2, a3, a4, a5, a6, a7) _mm_setr_epi16(a0, a1, a2, a3, a4, a5, a6, a7 )
#elif defined(__arm__)
int16_t conjug[4]__attribute__((aligned(16))) = {-1,1,-1,1} ;
#define simd_q15_t int16x8_t
@@ -45,7 +48,7 @@ int mult_cpx_conj_vector(int16_t *x1,
int output_shift,
int madd)
{
- // Multiply elementwise the complex conjugate of x1 with x2.
+ // Multiply elementwise the complex conjugate of x1 with x2.
// x1 - input 1 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
// We assume x1 with a dinamic of 15 bit maximum
//
@@ -68,11 +71,12 @@ int mult_cpx_conj_vector(int16_t *x1,
#if defined(__x86_64__) || defined(__i386__)
simd_q15_t tmp_re,tmp_im;
simd_q15_t tmpy0,tmpy1;
+
#elif defined(__arm__)
int32x4_t tmp_re,tmp_im;
int32x4_t tmp_re1,tmp_im1;
- int16x4x2_t tmpy;
- int32x4_t shift = vdupq_n_s32(-output_shift);
+ int16x4x2_t tmpy;
+ int32x4_t shift = vdupq_n_s32(-output_shift);
#endif
x1_128 = (simd_q15_t *)&x1[0];
@@ -92,7 +96,7 @@ int mult_cpx_conj_vector(int16_t *x1,
tmp_im = _mm_srai_epi32(tmp_im,output_shift);
tmpy0 = _mm_unpacklo_epi32(tmp_re,tmp_im);
tmpy1 = _mm_unpackhi_epi32(tmp_re,tmp_im);
- if (madd==0)
+ if (madd==0)
*y_128 = _mm_packs_epi32(tmpy0,tmpy1);
else
*y_128 += _mm_packs_epi32(tmpy0,tmpy1);
@@ -100,12 +104,12 @@ int mult_cpx_conj_vector(int16_t *x1,
#elif defined(__arm__)
tmp_re = vmull_s16(((simdshort_q15_t *)x1_128)[0], ((simdshort_q15_t*)x2_128)[0]);
- //tmp_re = [Re(x1[0])Re(x2[0]) Im(x1[0])Im(x2[0]) Re(x1[1])Re(x2[1]) Im(x1[1])Im(x2[1])]
+ //tmp_re = [Re(x1[0])Re(x2[0]) Im(x1[0])Im(x2[0]) Re(x1[1])Re(x2[1]) Im(x1[1])Im(x2[1])]
tmp_re1 = vmull_s16(((simdshort_q15_t *)x1_128)[1], ((simdshort_q15_t*)x2_128)[1]);
- //tmp_re1 = [Re(x1[1])Re(x2[1]) Im(x1[1])Im(x2[1]) Re(x1[1])Re(x2[2]) Im(x1[1])Im(x2[2])]
+ //tmp_re1 = [Re(x1[1])Re(x2[1]) Im(x1[1])Im(x2[1]) Re(x1[1])Re(x2[2]) Im(x1[1])Im(x2[2])]
tmp_re = vcombine_s32(vpadd_s32(vget_low_s32(tmp_re),vget_high_s32(tmp_re)),
vpadd_s32(vget_low_s32(tmp_re1),vget_high_s32(tmp_re1)));
- //tmp_re = [Re(ch[0])Re(rx[0])+Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1])+Im(ch[1])Im(ch[1]) Re(ch[2])Re(rx[2])+Im(ch[2]) Im(ch[2]) Re(ch[3])Re(rx[3])+Im(ch[3])Im(ch[3])]
+ //tmp_re = [Re(ch[0])Re(rx[0])+Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1])+Im(ch[1])Im(ch[1]) Re(ch[2])Re(rx[2])+Im(ch[2]) Im(ch[2]) Re(ch[3])Re(rx[3])+Im(ch[3])Im(ch[3])]
tmp_im = vmull_s16(vrev32_s16(vmul_s16(((simdshort_q15_t*)x2_128)[0],*(simdshort_q15_t*)conjug)), ((simdshort_q15_t*)x1_128)[0]);
//tmp_im = [-Im(ch[0])Re(rx[0]) Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1]) Re(ch[1])Im(rx[1])]
@@ -135,6 +139,68 @@ int mult_cpx_conj_vector(int16_t *x1,
return(0);
}
+int mult_cpx_vector(int16_t *x1, //Q15
+ int16_t *x2,//Q13
+ int16_t *y,
+ uint32_t N,
+ int output_shift)
+{
+ // Multiply elementwise x1 with x2.
+ // x1 - input 1 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
+ // We assume x1 with a dinamic of 15 bit maximum
+ //
+ // x2 - input 2 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
+ // We assume x2 with a dinamic of 14 bit maximum
+ ///
+ // y - output in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
+ //
+ // N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4;
+ //
+ // output_shift - shift to be applied to generate output
+ uint32_t i; // loop counter
+ simd_q15_t *x1_128;
+ simd_q15_t *x2_128;
+ simd_q15_t *y_128;
+ simd_q15_t tmp_re,tmp_im;
+ simd_q15_t tmpy0,tmpy1;
+ x1_128 = (simd_q15_t *)&x1[0];
+ x2_128 = (simd_q15_t *)&x2[0];
+ y_128 = (simd_q15_t *)&y[0];
+ //print_shorts("x1_128:",&x1_128[0]);
+ // print_shorts("x2_128:",&x2_128[0]);
+
+ //right shift by 13 while p_a * x0 and 15 while
+ // we compute 4 cpx multiply for each loop
+ for(i=0; i<(N>>2); i++) {
+ tmp_re = _mm_sign_epi16(*x1_128,*(__m128i*)&conjug2[0]);// Q15
+ //print_shorts("tmp_re1:",&tmp_re[i]);
+ tmp_re = _mm_madd_epi16(tmp_re,*x2_128); //Q28
+ //print_ints("tmp_re2:",&tmp_re[i]);
+ tmp_im = _mm_shufflelo_epi16(*x1_128,_MM_SHUFFLE(2,3,0,1)); //Q15
+ //print_shorts("tmp_im1:",&tmp_im[i]);
+ tmp_im = _mm_shufflehi_epi16(tmp_im,_MM_SHUFFLE(2,3,0,1)); //Q15
+ //print_shorts("tmp_im2:",&tmp_im[i]);
+ tmp_im = _mm_madd_epi16(tmp_im, *x2_128); //Q28
+ //print_ints("tmp_im3:",&tmp_im[i]);
+ tmp_re = _mm_srai_epi32(tmp_re,output_shift);//Q(28-shift)
+ //print_ints("tmp_re shifted:",&tmp_re[i]);
+ tmp_im = _mm_srai_epi32(tmp_im,output_shift); //Q(28-shift)
+ //print_ints("tmp_im shifted:",&tmp_im[i]);
+ tmpy0 = _mm_unpacklo_epi32(tmp_re,tmp_im); //Q(28-shift)
+ //print_ints("unpack lo :",&tmpy0[i]);
+ tmpy1 = _mm_unpackhi_epi32(tmp_re,tmp_im); //Q(28-shift)
+ //print_ints("mrc rho0:",&tmpy1[i]);
+ *y_128 = _mm_packs_epi32(tmpy0,tmpy1); //must be Q15
+ //print_shorts("*y_128:",&y_128[i]);
+ x1_128++;
+ x2_128++;
+ y_128++;
+ }
+ _mm_empty();
+ _m_empty();
+ return(0);
+}
+
int multadd_cpx_vector(int16_t *x1,
int16_t *x2,
int16_t *y,
@@ -156,9 +222,7 @@ int multadd_cpx_vector(int16_t *x1,
// N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4;
//
// output_shift - shift to be applied to generate output
-
uint32_t i; // loop counter
-
simd_q15_t *x1_128;
simd_q15_t *x2_128;
simd_q15_t *y_128;
@@ -171,12 +235,9 @@ int multadd_cpx_vector(int16_t *x1,
int16x4x2_t tmpy;
int32x4_t shift = vdupq_n_s32(-output_shift);
#endif
-
x1_128 = (simd_q15_t *)&x1[0];
x2_128 = (simd_q15_t *)&x2[0];
y_128 = (simd_q15_t *)&y[0];
-
-
// we compute 4 cpx multiply for each loop
for(i=0; i<(N>>2); i++) {
#if defined(__x86_64__) || defined(__i386__)
@@ -191,25 +252,19 @@ int multadd_cpx_vector(int16_t *x1,
//print_ints("unpack lo:",&tmpy0[i]);
tmpy1 = _mm_unpackhi_epi32(tmp_re,tmp_im);
//print_ints("unpack hi:",&tmpy1[i]);
-
if (zero_flag == 1)
*y_128 = _mm_packs_epi32(tmpy0,tmpy1);
else
*y_128 = _mm_adds_epi16(*y_128,_mm_packs_epi32(tmpy0,tmpy1));
//print_shorts("*y_128:",&y_128[i]);
-
#elif defined(__arm__)
-
msg("mult_cpx_vector not implemented for __arm__");
#endif
x1_128++;
x2_128++;
y_128++;
}
-
-
_mm_empty();
_m_empty();
-
return(0);
-}
+}
\ No newline at end of file
diff --git a/openair1/PHY/TOOLS/defs.h b/openair1/PHY/TOOLS/defs.h
index 8f0ae402bf..542b8edba5 100644
--- a/openair1/PHY/TOOLS/defs.h
+++ b/openair1/PHY/TOOLS/defs.h
@@ -145,6 +145,12 @@ int multadd_cpx_vector(int16_t *x1,
uint32_t N,
int output_shift);
+int mult_cpx_vector(int16_t *x1,
+ int16_t *x2,
+ int16_t *y,
+ uint32_t N,
+ int output_shift);
+
// lte_dfts.c
void init_fft(uint16_t size,
uint8_t logsize,
@@ -228,6 +234,11 @@ int32_t add_cpx_vector(int16_t *x,
int16_t *y,
uint32_t N);
+int32_t sub_cpx_vector16(int16_t *x,
+ int16_t *y,
+ int16_t *z,
+ uint32_t N);
+
int32_t add_cpx_vector32(int16_t *x,
int16_t *y,
int16_t *z,
diff --git a/openair1/PHY/TOOLS/file_output.c b/openair1/PHY/TOOLS/file_output.c
index 1eb9f25b5a..16b8b108d0 100644
--- a/openair1/PHY/TOOLS/file_output.c
+++ b/openair1/PHY/TOOLS/file_output.c
@@ -36,9 +36,9 @@ int write_output(const char *fname,const char *vname,void *data,int length,int d
printf("Writing %d elements of type %d to %s\n",length,format,fname);
- if (format == 10 || format ==11 || format == 12 ) {
+ if (format == 10 || format ==11 || format == 12 || format == 13 || format == 14) {
fp = fopen(fname,"a+");
- } else if (format != 10 && format !=11 && format != 12 ) {
+ } else if (format != 10 && format !=11 && format != 12 && format != 13 && format != 14) {
fp = fopen(fname,"w+");
}
@@ -49,7 +49,7 @@ int write_output(const char *fname,const char *vname,void *data,int length,int d
return(-1);
}
- if (format != 10 && format !=11 && format != 12 )
+ if (format != 10 && format !=11 && format != 12 && format != 13 && format != 14)
fprintf(fp,"%s = [",vname);
@@ -63,7 +63,9 @@ int write_output(const char *fname,const char *vname,void *data,int length,int d
break;
case 1: // complex 16-bit
-
+ case 13:
+ case 14:
+ case 15:
for (i=0; iofdm_symbol_size); i++) {
- i2 = (i+(frame_parms->ofdm_symbol_size>>1))%frame_parms->ofdm_symbol_size;
- time2[i] = (float)(i-(frame_parms->ofdm_symbol_size>>1));
+ i2 = (i+(frame_parms->ofdm_symbol_size>>1))%frame_parms->ofdm_symbol_size;
+ time2[i] = (float)(i-(frame_parms->ofdm_symbol_size>>1));
chest_t_abs[0][i] = 10*log10((float) (1+chest_t[0][2*i2]*chest_t[0][2*i2]+chest_t[0][2*i2+1]*chest_t[0][2*i2+1]));
if (chest_t_abs[0][i] > ymax)
@@ -247,7 +247,7 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
if (chest_t[arx] !=NULL) {
for (i=0; i<(frame_parms->ofdm_symbol_size>>3); i++) {
chest_t_abs[arx][i] = 10*log10((float) (1+chest_t[arx][2*i]*chest_t[arx][2*i]+chest_t[arx][2*i+1]*chest_t[arx][2*i+1]));
-
+
if (chest_t_abs[arx][i] > ymax)
ymax = chest_t_abs[arx][i];
}
@@ -340,7 +340,7 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
Q_pucch[ind] = (float)pucch1ab_comp[2*(ind)+1];
A_pucch[ind] = 10*log10(pucch1_comp[ind]);
B_pucch[ind] = ind;
- C_pucch[ind] = (float)pucch1_thres[ind];
+ C_pucch[ind] = (float)pucch1_thres[ind];
}
fl_set_xyplot_data(form->pucch_comp,I_pucch,Q_pucch,10240,"","","");
fl_set_xyplot_data(form->pucch_comp1,B_pucch,A_pucch,1024,"","","");
@@ -768,4 +768,4 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
}
free(chest_t_abs);
-}
+}
\ No newline at end of file
diff --git a/openair1/PHY/TOOLS/lte_phy_scope.h b/openair1/PHY/TOOLS/lte_phy_scope.h
index a5bcfa1ce6..2e8ca96c3a 100644
--- a/openair1/PHY/TOOLS/lte_phy_scope.h
+++ b/openair1/PHY/TOOLS/lte_phy_scope.h
@@ -46,18 +46,21 @@ typedef struct {
} FD_lte_phy_scope_enb;
typedef struct {
- FL_FORM * lte_phy_scope_ue;
- FL_OBJECT * rxsig_t;
- FL_OBJECT * chest_f;
- FL_OBJECT * chest_t;
- FL_OBJECT * pbch_comp;
- FL_OBJECT * pbch_llr;
- FL_OBJECT * pdcch_comp;
- FL_OBJECT * pdcch_llr;
- FL_OBJECT * pdsch_comp;
- FL_OBJECT * pdsch_llr;
- FL_OBJECT * pdsch_tput;
- FL_OBJECT * button_0;
+ FL_FORM * lte_phy_scope_ue;
+ FL_OBJECT * rxsig_t;
+ FL_OBJECT * chest_f;
+ FL_OBJECT * chest_t;
+ FL_OBJECT * pbch_comp;
+ FL_OBJECT * pbch_llr;
+ FL_OBJECT * pdcch_comp;
+ FL_OBJECT * pdcch_llr;
+ FL_OBJECT * pdsch_comp;
+ FL_OBJECT * pdsch_llr;
+ FL_OBJECT * pdsch_comp1;
+ FL_OBJECT * pdsch_llr1;
+ FL_OBJECT * pdsch_tput;
+ FL_OBJECT * button_0;
+
} FD_lte_phy_scope_ue;
FD_lte_phy_scope_enb * create_lte_phy_scope_enb( void );
@@ -76,7 +79,4 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
-
-
-
#endif /* FD_lte_scope_h_ */
diff --git a/openair1/PHY/TOOLS/lte_phy_scope_tm4.c b/openair1/PHY/TOOLS/lte_phy_scope_tm4.c
new file mode 100755
index 0000000000..9187f6e7ba
--- /dev/null
+++ b/openair1/PHY/TOOLS/lte_phy_scope_tm4.c
@@ -0,0 +1,800 @@
+/*******************************************************************************
+ 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 .
+ Contact Information
+ OpenAirInterface Admin: openair_admin@eurecom.fr
+ OpenAirInterface Tech : openair_tech@eurecom.fr
+ OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
+ Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
+ *******************************************************************************/
+/* Form definition file generated by fdesign */
+#include
+#include "lte_phy_scope.h"
+#define TPUT_WINDOW_LENGTH 100
+int otg_enabled;
+FL_COLOR rx_antenna_colors[4] = {FL_RED,FL_BLUE,FL_GREEN,FL_YELLOW};
+float tput_time_enb[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}};
+float tput_enb[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}};
+float tput_time_ue[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}};
+float tput_ue[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}};
+float tput_ue_max[NUMBER_OF_UE_MAX] = {0};
+static void ia_receiver_on_off( FL_OBJECT *button, long arg)
+{
+ if (fl_get_button(button)) {
+ fl_set_object_label(button, "IA Receiver ON");
+ // PHY_vars_UE_g[0][0]->use_ia_receiver = 1;
+ fl_set_object_color(button, FL_GREEN, FL_GREEN);
+ } else {
+ fl_set_object_label(button, "IA Receiver OFF");
+ // PHY_vars_UE_g[0][0]->use_ia_receiver = 0;
+ fl_set_object_color(button, FL_RED, FL_RED);
+ }
+}
+static void dl_traffic_on_off( FL_OBJECT *button, long arg)
+{
+ if (fl_get_button(button)) {
+ fl_set_object_label(button, "DL Traffic ON");
+ otg_enabled = 1;
+ fl_set_object_color(button, FL_GREEN, FL_GREEN);
+ } else {
+ fl_set_object_label(button, "DL Traffic OFF");
+ otg_enabled = 0;
+ fl_set_object_color(button, FL_RED, FL_RED);
+ }
+}
+FD_lte_phy_scope_enb *create_lte_phy_scope_enb( void )
+{
+ FL_OBJECT *obj;
+ FD_lte_phy_scope_enb *fdui = fl_malloc( sizeof *fdui );
+ // Define form
+ fdui->lte_phy_scope_enb = fl_bgn_form( FL_NO_BOX, 800, 800 );
+ // This the whole UI box
+ obj = fl_add_box( FL_BORDER_BOX, 0, 0, 800, 800, "" );
+ fl_set_object_color( obj, FL_BLACK, FL_BLACK );
+ // Received signal
+ fdui->rxsig_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 20, 370, 100, "Received Signal (Time-Domain, dB)" );
+ fl_set_object_boxtype( fdui->rxsig_t, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->rxsig_t, FL_BLACK, FL_RED );
+ fl_set_object_lcolor( fdui->rxsig_t, FL_WHITE ); // Label color
+ fl_set_xyplot_ybounds(fdui->rxsig_t,10,70);
+ // Time-domain channel response
+ fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)" );
+ fl_set_object_boxtype( fdui->chest_t, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->chest_t, FL_BLACK, FL_RED );
+ fl_set_object_lcolor( fdui->chest_t, FL_WHITE ); // Label color
+ // Frequency-domain channel response
+ fdui->chest_f = fl_add_xyplot( FL_IMPULSE_XYPLOT, 20, 140, 760, 100, "Channel Frequency Response (RE, dB)" );
+ fl_set_object_boxtype( fdui->chest_f, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->chest_f, FL_BLACK, FL_RED );
+ fl_set_object_lcolor( fdui->chest_f, FL_WHITE ); // Label color
+ fl_set_xyplot_ybounds( fdui->chest_f,30,70);
+ // LLR of PUSCH
+ fdui->pusch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 260, 500, 200, "PUSCH Log-Likelihood Ratios (LLR, mag)" );
+ fl_set_object_boxtype( fdui->pusch_llr, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->pusch_llr, FL_BLACK, FL_YELLOW );
+ fl_set_object_lcolor( fdui->pusch_llr, FL_WHITE ); // Label color
+ fl_set_xyplot_symbolsize( fdui->pusch_llr,2);
+ // I/Q PUSCH comp
+ fdui->pusch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 260, 240, 200, "PUSCH I/Q of MF Output" );
+ fl_set_object_boxtype( fdui->pusch_comp, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->pusch_comp, FL_BLACK, FL_YELLOW );
+ fl_set_object_lcolor( fdui->pusch_comp, FL_WHITE ); // Label color
+ fl_set_xyplot_symbolsize( fdui->pusch_comp,2);
+ fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR);
+ // I/Q PUCCH comp (format 1)
+ fdui->pucch_comp1 = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 480, 240, 100, "PUCCH1 Energy (SR)" );
+ fl_set_object_boxtype( fdui->pucch_comp1, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->pucch_comp1, FL_BLACK, FL_YELLOW );
+ fl_set_object_lcolor( fdui->pucch_comp1, FL_WHITE ); // Label color
+ fl_set_xyplot_symbolsize( fdui->pucch_comp1,2);
+ // fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR);
+ // I/Q PUCCH comp (fromat 1a/b)
+ fdui->pucch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 600, 240, 100, "PUCCH I/Q of MF Output" );
+ fl_set_object_boxtype( fdui->pucch_comp, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->pucch_comp, FL_BLACK, FL_YELLOW );
+ fl_set_object_lcolor( fdui->pucch_comp, FL_WHITE ); // Label color
+ fl_set_xyplot_symbolsize( fdui->pucch_comp,2);
+ // fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR);
+ // Throughput on PUSCH
+ fdui->pusch_tput = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 480, 500, 100, "PUSCH Throughput [frame]/[kbit/s]" );
+ fl_set_object_boxtype( fdui->pusch_tput, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->pusch_tput, FL_BLACK, FL_WHITE );
+ fl_set_object_lcolor( fdui->pusch_tput, FL_WHITE ); // Label color
+ // Generic eNB Button
+ fdui->button_0 = fl_add_button( FL_PUSH_BUTTON, 20, 600, 240, 40, "" );
+ fl_set_object_lalign(fdui->button_0, FL_ALIGN_CENTER );
+ fl_set_button(fdui->button_0,0);
+ otg_enabled = 0;
+ fl_set_object_label(fdui->button_0, "DL Traffic OFF");
+ fl_set_object_color(fdui->button_0, FL_RED, FL_RED);
+ fl_set_object_callback(fdui->button_0, dl_traffic_on_off, 0 );
+ fl_end_form( );
+ fdui->lte_phy_scope_enb->fdui = fdui;
+ return fdui;
+}
+void phy_scope_eNB(FD_lte_phy_scope_enb *form,
+ PHY_VARS_eNB *phy_vars_enb,
+ int UE_id)
+{
+ int eNB_id = 0;
+ int i,i2,arx,atx,ind,k;
+ LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_enb->frame_parms;
+ int nsymb_ce = 12*frame_parms->N_RB_UL*frame_parms->symbols_per_tti;
+ uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
+ uint8_t nb_antennas_tx = 1; // frame_parms->nb_antennas_tx; // in LTE Rel. 8 and 9 only a single transmit antenna is assumed at the UE
+ int16_t **rxsig_t;
+ int16_t **chest_t;
+ int16_t **chest_f;
+ int16_t *pusch_llr;
+ int16_t *pusch_comp;
+ int32_t *pucch1_comp;
+ int32_t *pucch1_thres;
+ int32_t *pucch1ab_comp;
+ float Re,Im,ymax;
+ float *llr, *bit;
+ float I[nsymb_ce*2], Q[nsymb_ce*2];
+ float I_pucch[10240],Q_pucch[10240],A_pucch[10240],B_pucch[10240],C_pucch[10240];
+ float rxsig_t_dB[nb_antennas_rx][FRAME_LENGTH_COMPLEX_SAMPLES];
+ float chest_t_abs[nb_antennas_rx][frame_parms->ofdm_symbol_size];
+ float *chest_f_abs;
+ float time[FRAME_LENGTH_COMPLEX_SAMPLES];
+ float time2[2048];
+ float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx];
+ int frame = phy_vars_enb->proc.proc_rxtx[0].frame_tx;
+ uint32_t total_dlsch_bitrate = phy_vars_enb->total_dlsch_bitrate;
+ int coded_bits_per_codeword = 0;
+ uint8_t harq_pid; // in TDD config 3 it is sf-2, i.e., can be 0,1,2
+ int mcs = 0;
+ // choose max MCS to compute coded_bits_per_codeword
+ if (phy_vars_enb->ulsch[UE_id]!=NULL) {
+ for (harq_pid=0; harq_pid<3; harq_pid++) {
+ mcs = cmax(phy_vars_enb->ulsch[UE_id]->harq_processes[harq_pid]->mcs,mcs);
+ }
+ }
+ coded_bits_per_codeword = frame_parms->N_RB_UL*12*get_Qm(mcs)*frame_parms->symbols_per_tti;
+ chest_f_abs = (float*) calloc(nsymb_ce*nb_antennas_rx*nb_antennas_tx,sizeof(float));
+ llr = (float*) calloc(coded_bits_per_codeword,sizeof(float)); // init to zero
+ bit = malloc(coded_bits_per_codeword*sizeof(float));
+ rxsig_t = (int16_t**) phy_vars_enb->common_vars.rxdata[eNB_id];
+ chest_t = (int16_t**) phy_vars_enb->pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id];
+ chest_f = (int16_t**) phy_vars_enb->pusch_vars[UE_id]->drs_ch_estimates[eNB_id];
+ pusch_llr = (int16_t*) phy_vars_enb->pusch_vars[UE_id]->llr;
+ pusch_comp = (int16_t*) phy_vars_enb->pusch_vars[UE_id]->rxdataF_comp[eNB_id][0];
+ pucch1_comp = (int32_t*) phy_vars_enb->pucch1_stats[UE_id];
+ pucch1_thres = (int32_t*) phy_vars_enb->pucch1_stats_thres[UE_id];
+ pucch1ab_comp = (int32_t*) phy_vars_enb->pucch1ab_stats[UE_id];
+ // Received signal in time domain of receive antenna 0
+ if (rxsig_t != NULL) {
+ if (rxsig_t[0] != NULL) {
+ for (i=0; irxsig_t,time,rxsig_t_dB[0],FRAME_LENGTH_COMPLEX_SAMPLES,"","","");
+ }
+ for (arx=1; arxrxsig_t,arx,time,rxsig_t_dB[arx],FRAME_LENGTH_COMPLEX_SAMPLES,rx_antenna_colors[arx]);
+ }
+ }
+ }
+ // Channel Impulse Response
+ if (chest_t != NULL) {
+ ymax = 0;
+ if (chest_t[0] !=NULL) {
+ for (i=0; i<(frame_parms->ofdm_symbol_size); i++) {
+ i2 = (i+(frame_parms->ofdm_symbol_size>>1))%frame_parms->ofdm_symbol_size;
+ time2[i] = (float)(i-(frame_parms->ofdm_symbol_size>>1));
+ chest_t_abs[0][i] = 10*log10((float) (1+chest_t[0][2*i2]*chest_t[0][2*i2]+chest_t[0][2*i2+1]*chest_t[0][2*i2+1]));
+ if (chest_t_abs[0][i] > ymax)
+ ymax = chest_t_abs[0][i];
+ }
+ fl_set_xyplot_data(form->chest_t,time2,chest_t_abs[0],(frame_parms->ofdm_symbol_size),"","","");
+ }
+ for (arx=1; arxofdm_symbol_size>>3); i++) {
+ chest_t_abs[arx][i] = 10*log10((float) (1+chest_t[arx][2*i]*chest_t[arx][2*i]+chest_t[arx][2*i+1]*chest_t[arx][2*i+1]));
+ if (chest_t_abs[arx][i] > ymax)
+ ymax = chest_t_abs[arx][i];
+ }
+ fl_add_xyplot_overlay(form->chest_t,arx,time,chest_t_abs[arx],(frame_parms->ofdm_symbol_size>>3),rx_antenna_colors[arx]);
+ fl_set_xyplot_overlay_type(form->chest_t,arx,FL_DASHED_XYPLOT);
+ }
+ }
+ // Avoid flickering effect
+ // fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax);
+ fl_set_xyplot_ybounds(form->chest_t,0,ymax);
+ }
+ // Channel Frequency Response
+ if (chest_f != NULL) {
+ ind = 0;
+ for (atx=0; atxchest_f,0,nb_antennas_rx*nb_antennas_tx*nsymb_ce);
+ fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,3);
+ fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR);
+ fl_set_xyplot_data(form->chest_f,freq,chest_f_abs,nsymb_ce,"","","");
+ for (arx=1; arxchest_f,1,&freq[arx*nsymb_ce],&chest_f_abs[arx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
+ }
+ // other tx antennas
+ if (nb_antennas_tx > 1) {
+ if (nb_antennas_rx > 1) {
+ for (atx=1; atxchest_f,(atx<<1)+arx,&freq[((atx<<1)+arx)*nsymb_ce],&chest_f_abs[((atx<<1)+arx)*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
+ }
+ }
+ } else { // 1 rx antenna
+ atx=1;
+ arx=0;
+ fl_add_xyplot_overlay(form->chest_f,atx,&freq[atx*nsymb_ce],&chest_f_abs[atx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
+ }
+ }
+ }
+ // PUSCH LLRs
+ if (pusch_llr != NULL) {
+ for (i=0; ipusch_llr,bit,llr,coded_bits_per_codeword,"","","");
+ }
+ // PUSCH I/Q of MF Output
+ if (pusch_comp!=NULL) {
+ ind=0;
+ for (k=0; ksymbols_per_tti; k++) {
+ for (i=0; i<12*frame_parms->N_RB_UL; i++) {
+ I[ind] = pusch_comp[(2*frame_parms->N_RB_UL*12*k)+2*i];
+ Q[ind] = pusch_comp[(2*frame_parms->N_RB_UL*12*k)+2*i+1];
+ ind++;
+ }
+ }
+ fl_set_xyplot_data(form->pusch_comp,I,Q,ind,"","","");
+ }
+ // PUSCH I/Q of MF Output
+ if (pucch1ab_comp!=NULL) {
+ for (ind=0; ind<10240; ind++) {
+ I_pucch[ind] = (float)pucch1ab_comp[2*(ind)];
+ Q_pucch[ind] = (float)pucch1ab_comp[2*(ind)+1];
+ A_pucch[ind] = 10*log10(pucch1_comp[ind]);
+ B_pucch[ind] = ind;
+ C_pucch[ind] = (float)pucch1_thres[ind];
+ }
+ fl_set_xyplot_data(form->pucch_comp,I_pucch,Q_pucch,10240,"","","");
+ fl_set_xyplot_data(form->pucch_comp1,B_pucch,A_pucch,1024,"","","");
+ fl_add_xyplot_overlay(form->pucch_comp1,1,B_pucch,C_pucch,1024,FL_RED);
+ fl_set_xyplot_ybounds(form->pucch_comp,-5000,5000);
+ fl_set_xyplot_xbounds(form->pucch_comp,-5000,5000);
+ fl_set_xyplot_ybounds(form->pucch_comp1,0,80);
+ }
+ // PUSCH Throughput
+ memmove( tput_time_enb[UE_id], &tput_time_enb[UE_id][1], (TPUT_WINDOW_LENGTH-1)*sizeof(float) );
+ memmove( tput_enb[UE_id], &tput_enb[UE_id][1], (TPUT_WINDOW_LENGTH-1)*sizeof(float) );
+ tput_time_enb[UE_id][TPUT_WINDOW_LENGTH-1] = (float) frame;
+ tput_enb[UE_id][TPUT_WINDOW_LENGTH-1] = ((float) total_dlsch_bitrate)/1000.0;
+ fl_set_xyplot_data(form->pusch_tput,tput_time_enb[UE_id],tput_enb[UE_id],TPUT_WINDOW_LENGTH,"","","");
+ // fl_get_xyplot_ybounds(form->pusch_tput,&ymin,&ymax);
+ // fl_set_xyplot_ybounds(form->pusch_tput,0,ymax);
+ fl_check_forms();
+ free(llr);
+ free(bit);
+ free(chest_f_abs);
+}
+FD_lte_phy_scope_ue *create_lte_phy_scope_ue( void ) {
+ FL_OBJECT *obj;
+ FD_lte_phy_scope_ue *fdui = fl_malloc( sizeof *fdui );
+ // Define form
+ fdui->lte_phy_scope_ue = fl_bgn_form( FL_NO_BOX, 800, 1000 );
+ // This the whole UI box
+ obj = fl_add_box( FL_BORDER_BOX, 0, 0, 800, 1000, "" );
+ fl_set_object_color( obj, FL_BLACK, FL_BLACK );
+ // Received signal
+ fdui->rxsig_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 20, 370, 100, "Received Signal (Time-Domain, dB)" );
+ fl_set_object_boxtype( fdui->rxsig_t, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->rxsig_t, FL_BLACK, FL_RED );
+ fl_set_object_lcolor( fdui->rxsig_t, FL_WHITE ); // Label color
+ fl_set_xyplot_ybounds(fdui->rxsig_t,30,70);
+ // Time-domain channel response
+ fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)" );
+ fl_set_object_boxtype( fdui->chest_t, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->chest_t, FL_BLACK, FL_RED );
+ fl_set_object_lcolor( fdui->chest_t, FL_WHITE ); // Label color
+ // Frequency-domain channel response
+ fdui->chest_f = fl_add_xyplot( FL_IMPULSE_XYPLOT, 20, 140, 760, 100, "Channel Frequency Response (RE, dB)" );
+ fl_set_object_boxtype( fdui->chest_f, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->chest_f, FL_BLACK, FL_RED );
+ fl_set_object_lcolor( fdui->chest_f, FL_WHITE ); // Label color
+ fl_set_xyplot_ybounds( fdui->chest_f,30,70);
+ /*
+ // LLR of PBCH
+ fdui->pbch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 260, 500, 100, "PBCH Log-Likelihood Ratios (LLR, mag)" );
+ fl_set_object_boxtype( fdui->pbch_llr, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->pbch_llr, FL_BLACK, FL_GREEN );
+ fl_set_object_lcolor( fdui->pbch_llr, FL_WHITE ); // Label color
+ fl_set_xyplot_symbolsize( fdui->pbch_llr,2);
+ fl_set_xyplot_xgrid( fdui->pbch_llr,FL_GRID_MAJOR);
+ fl_set_xyplot_xbounds( fdui->pbch_llr,0,1920);
+ // I/Q PBCH comp
+ fdui->pbch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 260, 240, 100, "PBCH I/Q of MF Output" );
+ fl_set_object_boxtype( fdui->pbch_comp, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->pbch_comp, FL_BLACK, FL_GREEN );
+ fl_set_object_lcolor( fdui->pbch_comp, FL_WHITE ); // Label color
+ fl_set_xyplot_symbolsize( fdui->pbch_comp,2);
+ fl_set_xyplot_xbounds( fdui->pbch_comp,-100,100);
+ fl_set_xyplot_ybounds( fdui->pbch_comp,-100,100);
+ // LLR of PDCCH
+ fdui->pdcch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 380, 500, 100, "PDCCH Log-Likelihood Ratios (LLR, mag)" );
+ fl_set_object_boxtype( fdui->pdcch_llr, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->pdcch_llr, FL_BLACK, FL_CYAN );
+ fl_set_object_lcolor( fdui->pdcch_llr, FL_WHITE ); // Label color
+ fl_set_xyplot_symbolsize( fdui->pdcch_llr,2);
+ // I/Q PDCCH comp
+ fdui->pdcch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 380, 240, 100, "PDCCH I/Q of MF Output" );
+ fl_set_object_boxtype( fdui->pdcch_comp, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->pdcch_comp, FL_BLACK, FL_CYAN );
+ fl_set_object_lcolor( fdui->pdcch_comp, FL_WHITE ); // Label color
+ fl_set_xyplot_symbolsize( fdui->pdcch_comp,2);
+ fl_set_xyplot_xgrid( fdui->pdcch_llr,FL_GRID_MAJOR);
+ */
+ int offset=240;
+ // LLR of PDSCH
+ fdui->pdsch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 500-offset, 500, 200, "PDSCH Log-Likelihood Ratios (LLR, mag)" );
+ fl_set_object_boxtype( fdui->pdsch_llr, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->pdsch_llr, FL_BLACK, FL_YELLOW );
+ fl_set_object_lcolor( fdui->pdsch_llr, FL_WHITE ); // Label color
+ fl_set_xyplot_symbolsize( fdui->pdsch_llr,2);
+ fl_set_xyplot_xgrid( fdui->pdsch_llr,FL_GRID_MAJOR);
+ // I/Q PDSCH comp
+ fdui->pdsch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 500-offset, 240, 200, "PDSCH I/Q of MF Output" );
+ fl_set_object_boxtype( fdui->pdsch_comp, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->pdsch_comp, FL_BLACK, FL_YELLOW );
+ fl_set_object_lcolor( fdui->pdsch_comp, FL_WHITE ); // Label color
+ fl_set_xyplot_symbolsize( fdui->pdsch_comp,2);
+ // LLR of PDSCH
+ fdui->pdsch_llr1 = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 720-offset, 500, 200, "PDSCH Log-Likelihood Ratios (LLR, mag)" );
+ fl_set_object_boxtype( fdui->pdsch_llr1, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->pdsch_llr1, FL_BLACK, FL_YELLOW );
+ fl_set_object_lcolor( fdui->pdsch_llr1, FL_WHITE ); // Label color
+ fl_set_xyplot_symbolsize( fdui->pdsch_llr1,2);
+ fl_set_xyplot_xgrid( fdui->pdsch_llr1,FL_GRID_MAJOR);
+ // I/Q PDSCH comp
+ fdui->pdsch_comp1 = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 720-offset, 240, 200, "PDSCH I/Q of MF Output" );
+ fl_set_object_boxtype( fdui->pdsch_comp1, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->pdsch_comp1, FL_BLACK, FL_YELLOW );
+ fl_set_object_lcolor( fdui->pdsch_comp1, FL_WHITE ); // Label color
+ fl_set_xyplot_symbolsize( fdui->pdsch_comp1,2);
+ /*
+ // Throughput on PDSCH
+ fdui->pdsch_tput = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 720, 500, 100, "PDSCH Throughput [frame]/[kbit/s]" );
+ fl_set_object_boxtype( fdui->pdsch_tput, FL_EMBOSSED_BOX );
+ fl_set_object_color( fdui->pdsch_tput, FL_BLACK, FL_WHITE );
+ fl_set_object_lcolor( fdui->pdsch_tput, FL_WHITE ); // Label color
+ // Generic UE Button
+ fdui->button_0 = fl_add_button( FL_PUSH_BUTTON, 540, 720, 240, 40, "" );
+ fl_set_object_lalign(fdui->button_0, FL_ALIGN_CENTER );
+ //openair_daq_vars.use_ia_receiver = 0;
+ fl_set_button(fdui->button_0,0);
+ fl_set_object_label(fdui->button_0, "IA Receiver OFF");
+ fl_set_object_color(fdui->button_0, FL_RED, FL_RED);
+ fl_set_object_callback(fdui->button_0, ia_receiver_on_off, 0 );
+ fl_hide_object(fdui->button_0);
+ */
+ fl_end_form( );
+ fdui->lte_phy_scope_ue->fdui = fdui;
+ return fdui;
+}
+void phy_scope_UE(FD_lte_phy_scope_ue *form,
+ PHY_VARS_UE *phy_vars_ue,
+ int eNB_id,
+ int UE_id,
+ uint8_t subframe){
+ int i,arx,atx,ind,k;
+ 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_antenna_ports_eNB;
+ int16_t **rxsig_t;
+ int16_t **chest_t;
+ int16_t **chest_f;
+ int16_t *pdsch_llr,*pdsch_llr1;
+ int16_t *pdsch_comp,*pdsch_comp1;
+ int16_t *pdsch_mag0,*pdsch_mag1,*pdsch_magb0,*pdsch_magb1;
+ int8_t *pdcch_llr;
+ int16_t *pdcch_comp;
+ int8_t *pbch_llr;
+ int16_t *pbch_comp;
+ float Re,Im,ymax=1;
+ int num_pdcch_symbols=3;
+ float *llr0, *bit0, *llr1, *bit1, *chest_f_abs, llr_pbch[1920], bit_pbch[1920], *llr_pdcch, *bit_pdcch;
+ float *I, *Q;
+ float rxsig_t_dB[nb_antennas_rx][FRAME_LENGTH_COMPLEX_SAMPLES];
+ float **chest_t_abs;
+ float time[FRAME_LENGTH_COMPLEX_SAMPLES];
+ float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx];
+ int frame = phy_vars_ue->proc.proc_rxtx[0].frame_rx;
+ uint32_t total_dlsch_bitrate = phy_vars_ue->bitrate[eNB_id];
+ int coded_bits_per_codeword0=0,coded_bits_per_codeword1=1;
+ int mod0,mod1;
+ int mcs0 = 0;
+ int mcs1=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) {
+ harq_pid = phy_vars_ue->dlsch[eNB_id][0]->current_harq_pid;
+ if (harq_pid>=8)
+ return;
+ mcs0 = phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->mcs;
+ // Button 0
+ /*
+ if(!phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off) {
+ // we are in TM5
+ fl_show_object(form->button_0);
+ }
+ */
+ }
+ if (phy_vars_ue->dlsch[eNB_id][1]!=NULL) {
+ harq_pid = phy_vars_ue->dlsch[eNB_id][1]->current_harq_pid;
+ if (harq_pid>=8)
+ return;
+ mcs1 = phy_vars_ue->dlsch[eNB_id][1]->harq_processes[harq_pid]->mcs;
+ }
+ if (phy_vars_ue->pdcch_vars[eNB_id]!=NULL) {
+ num_pdcch_symbols = phy_vars_ue->pdcch_vars[eNB_id]->num_pdcch_symbols;
+ }
+ // coded_bits_per_codeword = frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
+ if (phy_vars_ue->dlsch[eNB_id][0]!=NULL) {
+ mod0 = get_Qm(mcs0);
+ coded_bits_per_codeword0 = get_G(frame_parms,
+ phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->nb_rb,
+ phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even,
+ get_Qm(mcs0),
+ phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Nl,
+ num_pdcch_symbols,
+ frame,
+ subframe,
+ beamforming_mode);
+ } else {
+ coded_bits_per_codeword0 = 0; //frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
+ mod0=0;
+ }
+ if (phy_vars_ue->dlsch[eNB_id][1]!=NULL) {
+ mod1 = get_Qm(mcs1);
+ coded_bits_per_codeword1 = get_G(frame_parms,
+ phy_vars_ue->dlsch[eNB_id][1]->harq_processes[harq_pid]->nb_rb,
+ phy_vars_ue->dlsch[eNB_id][1]->harq_processes[harq_pid]->rb_alloc_even,
+ get_Qm(mcs1),
+ phy_vars_ue->dlsch[eNB_id][1]->harq_processes[harq_pid]->Nl,
+ num_pdcch_symbols,
+ frame,
+ subframe,
+ beamforming_mode);
+ } else {
+ coded_bits_per_codeword1 = 0; //frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
+ mod1=0;
+ }
+ I = (float*) calloc(nsymb_ce*2,sizeof(float));
+ Q = (float*) calloc(nsymb_ce*2,sizeof(float));
+ chest_t_abs = (float**) malloc(nb_antennas_rx*sizeof(float*));
+ for (arx=0;arxofdm_symbol_size,sizeof(float));
+ }
+ chest_f_abs = (float*) calloc(nsymb_ce*nb_antennas_rx*nb_antennas_tx,sizeof(float));
+ llr0 = (float*) calloc(coded_bits_per_codeword0,sizeof(float)); // init to zero
+ bit0 = malloc(coded_bits_per_codeword0*sizeof(float));
+ llr1 = (float*) calloc(coded_bits_per_codeword1,sizeof(float)); // init to zero
+ bit1 = malloc(coded_bits_per_codeword1*sizeof(float));
+ llr_pdcch = (float*) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float)); // init to zero
+ bit_pdcch = (float*) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float));
+ rxsig_t = (int16_t**) phy_vars_ue->common_vars.rxdata;
+ chest_t = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_id];
+ chest_f = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id];
+ pbch_llr = (int8_t*) phy_vars_ue->pbch_vars[eNB_id]->llr;
+ pbch_comp = (int16_t*) phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0];
+ pdcch_llr = (int8_t*) phy_vars_ue->pdcch_vars[eNB_id]->llr;
+ pdcch_comp = (int16_t*) phy_vars_ue->pdcch_vars[eNB_id]->rxdataF_comp[0];
+ pdsch_llr = (int16_t*) phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->llr[0]; // stream 0
+ pdsch_llr1 = (int16_t*) phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->llr[1]; // stream 1
+ pdsch_comp = (int16_t*) phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp0[0];
+ //pdsch_comp = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[subframe&0x1][eNB_id]->rxdataF_ext[0];
+ //pdsch_comp1 = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[subframe&0x1][eNB_id]->rxdataF_ext[1];
+ pdsch_comp1 = (int16_t*) (phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp1[0][0])[0];
+ //pdsch_comp1 = (int16_t*) (phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[0][0])[0];
+ pdsch_mag0 = (int16_t*) phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_mag0[0];
+ pdsch_mag1 = (int16_t*) (phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_mag1[0][0])[0];
+ pdsch_magb0 = (int16_t*) phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_magb0[0];
+ pdsch_magb1 = (int16_t*) (phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_magb1[0][0])[0];
+ fl_freeze_form(form->lte_phy_scope_ue);
+ // Received signal in time domain of receive antenna 0
+ if (rxsig_t != NULL) {
+ if (rxsig_t[0] != NULL) {
+ for (i=0; irxsig_t,time,rxsig_t_dB[0],FRAME_LENGTH_COMPLEX_SAMPLES,"","","");
+ }
+ for (arx=1;arxrxsig_t,arx,time,rxsig_t_dB[arx],FRAME_LENGTH_COMPLEX_SAMPLES,rx_antenna_colors[arx]);
+ }
+ }
+ }
+ // Channel Impulse Response (still repeated format)
+ if (chest_t != NULL) {
+ ymax = 0;
+ if (chest_t[0] !=NULL) {
+ for (i=0; i<(frame_parms->ofdm_symbol_size>>3); i++) {
+ chest_t_abs[0][i] = (float) (chest_t[0][4*i]*chest_t[0][4*i]+chest_t[0][4*i+1]*chest_t[0][4*i+1]);
+ if (chest_t_abs[0][i] > ymax)
+ ymax = chest_t_abs[0][i];
+ }
+ fl_set_xyplot_data(form->chest_t,time,chest_t_abs[0],(frame_parms->ofdm_symbol_size>>3),"","","");
+ }
+ for (arx=1; arxofdm_symbol_size>>3); i++) {
+ chest_t_abs[arx][i] = (float) (chest_t[arx][4*i]*chest_t[arx][4*i]+chest_t[arx][4*i+1]*chest_t[arx][4*i+1]);
+ if (chest_t_abs[arx][i] > ymax)
+ ymax = chest_t_abs[arx][i];
+ }
+ fl_add_xyplot_overlay(form->chest_t,arx,time,chest_t_abs[arx],(frame_parms->ofdm_symbol_size>>3),rx_antenna_colors[arx]);
+ fl_set_xyplot_overlay_type(form->chest_t,arx,FL_DASHED_XYPLOT);
+ }
+ }
+ // Avoid flickering effect
+ // fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax);
+ fl_set_xyplot_ybounds(form->chest_t,0,ymax);
+ }
+ // Channel Frequency Response (includes 5 complex sample for filter)
+ if (chest_f != NULL) {
+ ind = 0;
+ for (atx=0;atxchest_f,0,nb_antennas_rx*nb_antennas_tx*nsymb_ce);
+ //fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,2);
+ // fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*2,2);
+ fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR);
+ fl_set_xyplot_data(form->chest_f,freq,chest_f_abs,nsymb_ce,"","","");
+ for (arx=1;arxchest_f,1,&freq[arx*nsymb_ce],&chest_f_abs[arx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
+ }
+ // other tx antennas
+ if (nb_antennas_tx > 1) {
+ if (nb_antennas_rx > 1) {
+ for (atx=1;atxchest_f,(atx<<1)+arx,&freq[((atx<<1)+arx)*nsymb_ce],&chest_f_abs[((atx<<1)+arx)*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
+ }
+ }
+ } else { // 1 rx antenna
+ atx=1; arx=0;
+ fl_add_xyplot_overlay(form->chest_f,atx,&freq[atx*nsymb_ce],&chest_f_abs[atx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
+ }
+ }
+ }
+ /*
+ // PBCH LLRs
+ if (pbch_llr != NULL) {
+ for (i=0; i<1920;i++) {
+ llr_pbch[i] = (float) pbch_llr[i];
+ bit_pbch[i] = (float) i;
+ }
+ fl_set_xyplot_data(form->pbch_llr,bit_pbch,llr_pbch,1920,"","","");
+ }
+ // PBCH I/Q of MF Output
+ if (pbch_comp!=NULL) {
+ for (i=0; i<72*2; i++) {
+ I[i] = pbch_comp[2*i];
+ Q[i] = pbch_comp[2*i+1];
+ }
+ fl_set_xyplot_data(form->pbch_comp,I,Q,72*2,"","","");
+ }
+ // PDCCH LLRs
+ if (pdcch_llr != NULL) {
+ for (i=0; i<12*frame_parms->N_RB_DL*2*num_pdcch_symbols;i++) {
+ llr_pdcch[i] = (float) pdcch_llr[i];
+ bit_pdcch[i] = (float) i;
+ }
+ fl_set_xyplot_xbounds(form->pdcch_llr,0,12*frame_parms->N_RB_DL*2*3);
+ fl_set_xyplot_data(form->pdcch_llr,bit_pdcch,llr_pdcch,12*frame_parms->N_RB_DL*2*num_pdcch_symbols,"","","");
+ }
+ // PDCCH I/Q of MF Output
+ if (pdcch_comp!=NULL) {
+ for (i=0; i<12*frame_parms->N_RB_DL*num_pdcch_symbols; i++) {
+ I[i] = pdcch_comp[2*i];
+ Q[i] = pdcch_comp[2*i+1];
+ }
+ fl_set_xyplot_data(form->pdcch_comp,I,Q,12*frame_parms->N_RB_DL*num_pdcch_symbols,"","","");
+ }
+ */
+ // PDSCH LLRs CW0
+ if (pdsch_llr != NULL) {
+ for (i=0; ipdsch_llr,0,coded_bits_per_codeword0);
+ fl_set_xyplot_data(form->pdsch_llr,bit0,llr0,coded_bits_per_codeword0,"","","");
+ }
+ // PDSCH I/Q of MF Output
+ if (pdsch_comp!=NULL) {
+ ind=0;
+ for (k=0; ksymbols_per_tti; k++) {
+ for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
+ I[ind] = pdsch_comp[(2*frame_parms->N_RB_DL*12*k)+4*i];
+ Q[ind] = pdsch_comp[(2*frame_parms->N_RB_DL*12*k)+4*i+1];
+ ind++;
+ }
+ }
+ fl_set_xyplot_data(form->pdsch_comp,I,Q,ind,"","","");
+ }
+ if (pdsch_mag0 != NULL) {
+ ind=0;
+ for (k=0; ksymbols_per_tti; k++) {
+ for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
+ I[ind] = pdsch_mag0[(2*frame_parms->N_RB_DL*12*k)+4*i]*cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
+ Q[ind] = pdsch_mag0[(2*frame_parms->N_RB_DL*12*k)+4*i+1]*sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
+ ind++;
+ }
+ }
+ fl_add_xyplot_overlay(form->pdsch_comp,1,I,Q,ind,FL_GREEN);
+ }
+ if (pdsch_magb0 != NULL) {
+ ind=0;
+ for (k=0; ksymbols_per_tti; k++) {
+ for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
+ I[ind] = pdsch_magb0[(2*frame_parms->N_RB_DL*12*k)+4*i]*cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
+ Q[ind] = pdsch_magb0[(2*frame_parms->N_RB_DL*12*k)+4*i+1]*sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
+ ind++;
+ }
+ }
+ fl_add_xyplot_overlay(form->pdsch_comp,2,I,Q,ind,FL_RED);
+ }
+ if ((pdsch_mag0 != NULL) && (pdsch_magb0 != NULL)) {
+ ind=0;
+ for (k=0; ksymbols_per_tti; k++) {
+ for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
+ I[ind] =
+ (pdsch_mag0[(2*frame_parms->N_RB_DL*12*k)+4*i]+
+ pdsch_magb0[(2*frame_parms->N_RB_DL*12*k)+4*i])*
+ cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
+ Q[ind] =
+ (pdsch_mag0[(2*frame_parms->N_RB_DL*12*k)+4*i+1]+
+ pdsch_magb0[(2*frame_parms->N_RB_DL*12*k)+4*i+1])*
+ sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
+ ind++;
+ }
+ }
+ fl_add_xyplot_overlay(form->pdsch_comp,3,I,Q,ind,FL_BLUE);
+ }
+ // PDSCH LLRs CW1
+ if (pdsch_llr1 != NULL) {
+ for (i=0; ipdsch_llr1,0,coded_bits_per_codeword1);
+ fl_set_xyplot_data(form->pdsch_llr1,bit1,llr1,coded_bits_per_codeword1,"","","");
+ }
+ // PDSCH I/Q of MF Output
+ if (pdsch_comp1!=NULL) {
+ ind=0;
+ for (k=0; ksymbols_per_tti; k++) {
+ for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
+ I[ind] = pdsch_comp1[(2*frame_parms->N_RB_DL*12*k)+4*i];
+ Q[ind] = pdsch_comp1[(2*frame_parms->N_RB_DL*12*k)+4*i+1];
+ ind++;
+ }
+ }
+ fl_set_xyplot_data(form->pdsch_comp1,I,Q,ind,"","","");
+ }
+ if (pdsch_mag1 != NULL) {
+ ind=0;
+ for (k=0; ksymbols_per_tti; k++) {
+ for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
+ I[ind] = pdsch_mag1[(2*frame_parms->N_RB_DL*12*k)+4*i]*cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
+ Q[ind] = pdsch_mag1[(2*frame_parms->N_RB_DL*12*k)+4*i+1]*sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
+ ind++;
+ }
+ }
+ fl_add_xyplot_overlay(form->pdsch_comp1,1,I,Q,ind,FL_GREEN);
+ }
+ if (pdsch_magb1 != NULL) {
+ ind=0;
+ for (k=0; ksymbols_per_tti; k++) {
+ for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
+ I[ind] = pdsch_magb1[(2*frame_parms->N_RB_DL*12*k)+4*i]*cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
+ Q[ind] = pdsch_magb1[(2*frame_parms->N_RB_DL*12*k)+4*i+1]*sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
+ ind++;
+ }
+ }
+ fl_add_xyplot_overlay(form->pdsch_comp1,2,I,Q,ind,FL_RED);
+ }
+ if ((pdsch_mag1 != NULL) && (pdsch_magb1 != NULL)) {
+ ind=0;
+ for (k=0; ksymbols_per_tti; k++) {
+ for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
+ I[ind] =
+ (pdsch_mag1[(2*frame_parms->N_RB_DL*12*k)+4*i]+
+ pdsch_magb1[(2*frame_parms->N_RB_DL*12*k)+4*i])*
+ cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
+ Q[ind] =
+ (pdsch_mag1[(2*frame_parms->N_RB_DL*12*k)+4*i+1]+
+ pdsch_magb1[(2*frame_parms->N_RB_DL*12*k)+4*i+1])*
+ sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2));
+ ind++;
+ }
+ }
+ fl_add_xyplot_overlay(form->pdsch_comp1,3,I,Q,ind,FL_BLUE);
+ }
+ /*
+ // PDSCH Throughput
+ memcpy((void*)tput_time_ue[UE_id],(void*)&tput_time_ue[UE_id][1],(TPUT_WINDOW_LENGTH-1)*sizeof(float));
+ memcpy((void*)tput_ue[UE_id],(void*)&tput_ue[UE_id][1],(TPUT_WINDOW_LENGTH-1)*sizeof(float));
+ tput_time_ue[UE_id][TPUT_WINDOW_LENGTH-1] = (float) frame;
+ tput_ue[UE_id][TPUT_WINDOW_LENGTH-1] = ((float) total_dlsch_bitrate)/1000.0;
+ if (tput_ue[UE_id][TPUT_WINDOW_LENGTH-1] > tput_ue_max[UE_id]) {
+ tput_ue_max[UE_id] = tput_ue[UE_id][TPUT_WINDOW_LENGTH-1];
+ }
+ fl_set_xyplot_data(form->pdsch_tput,tput_time_ue[UE_id],tput_ue[UE_id],TPUT_WINDOW_LENGTH,"","","");
+ fl_set_xyplot_ybounds(form->pdsch_tput,0,tput_ue_max[UE_id]);
+ */
+ fl_unfreeze_form(form->lte_phy_scope_ue);
+ fl_check_forms();
+ free(I);
+ free(Q);
+ free(chest_f_abs);
+ free(llr0);
+ free(bit0);
+ free(llr1);
+ free(bit1);
+ free(bit_pdcch);
+ free(llr_pdcch);
+ for (arx=0;arxmeas_flag==0) {
ts->trials++;
ts->in = rdtsc_oai();
+ ts->meas_flag=1;
+ }
+ else {
+ ts->in = rdtsc_oai();
+ }
}
}
@@ -120,7 +126,8 @@ static inline void stop_meas(time_stats_t *ts)
if ((out-ts->in) > ts->max)
ts->max = out-ts->in;
-
+
+ ts->meas_flag=0;
}
}
@@ -132,6 +139,7 @@ static inline void reset_meas(time_stats_t *ts) {
ts->p_time=0;
ts->diff_square=0;
ts->max=0;
+ ts->meas_flag=0;
}
diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h
index 5b1654958e..2ccf791703 100644
--- a/openair1/PHY/defs.h
+++ b/openair1/PHY/defs.h
@@ -153,10 +153,10 @@ enum transmission_access_mode {
typedef enum {
eNodeB_3GPP=0, // classical eNodeB function
eNodeB_3GPP_BBU, // eNodeB with NGFI IF5
- NGFI_RCC_IF4p5, // NGFI_RCC (NGFI radio cloud center)
+ NGFI_RCC_IF4p5, // NGFI_RCC (NGFI radio cloud center)
NGFI_RAU_IF4p5,
NGFI_RRU_IF5, // NGFI_RRU (NGFI remote radio-unit,IF5)
- NGFI_RRU_IF4p5 // NGFI_RRU (NGFI remote radio-unit,IF4p5)
+ NGFI_RRU_IF4p5 // NGFI_RRU (NGFI remote radio-unit,IF4p5)
} eNB_func_t;
typedef enum {
@@ -592,7 +592,7 @@ typedef struct PHY_VARS_eNB_s {
uint32_t total_transmitted_bits;
uint32_t total_system_throughput;
- int hw_timing_advance;
+ int hw_timing_advance;
time_stats_t phy_proc;
time_stats_t phy_proc_tx;
@@ -629,7 +629,7 @@ typedef struct PHY_VARS_eNB_s {
#ifdef LOCALIZATION
/// time state for localization
time_stats_t localization_stats;
-#endif
+#endif
int32_t pucch1_stats_cnt[NUMBER_OF_UE_MAX][10];
int32_t pucch1_stats[NUMBER_OF_UE_MAX][10*1024];
@@ -641,9 +641,9 @@ typedef struct PHY_VARS_eNB_s {
int32_t pusch_stats_mcs[NUMBER_OF_UE_MAX][10240];
int32_t pusch_stats_bsr[NUMBER_OF_UE_MAX][10240];
int32_t pusch_stats_BO[NUMBER_OF_UE_MAX][10240];
-
+
/// RF and Interface devices per CC
- openair0_device rfdevice;
+ openair0_device rfdevice;
openair0_device ifdevice;
/// Pointer for ifdevice buffer struct
if_buffer_t ifbuffer;
@@ -906,7 +906,18 @@ typedef struct {
time_stats_t tx_prach;
/// RF and Interface devices per CC
- openair0_device rfdevice;
+ openair0_device rfdevice;
+ time_stats_t dlsch_encoding_SIC_stats;
+ time_stats_t dlsch_scrambling_SIC_stats;
+ time_stats_t dlsch_modulation_SIC_stats;
+ time_stats_t dlsch_llr_stripping_unit_SIC_stats;
+ time_stats_t dlsch_unscrambling_SIC_stats;
+
+#if ENABLE_RAL
+ hash_table_t *ral_thresholds_timed;
+ SLIST_HEAD(ral_thresholds_gen_poll_s, ral_threshold_phy_t) ral_thresholds_gen_polled[RAL_LINK_PARAM_GEN_MAX];
+ SLIST_HEAD(ral_thresholds_lte_poll_s, ral_threshold_phy_t) ral_thresholds_lte_polled[RAL_LINK_PARAM_LTE_MAX];
+#endif
} PHY_VARS_UE;
@@ -919,7 +930,7 @@ static inline int wait_on_condition(pthread_mutex_t *mutex,pthread_cond_t *cond,
exit_fun("nothing to add");
return(-1);
}
-
+
while (*instance_cnt < 0) {
// most of the time the thread is waiting here
// proc->instance_cnt_rxtx is -1
@@ -941,7 +952,7 @@ static inline int wait_on_busy_condition(pthread_mutex_t *mutex,pthread_cond_t *
exit_fun("nothing to add");
return(-1);
}
-
+
while (*instance_cnt == 0) {
// most of the time the thread will skip this
// waits only if proc->instance_cnt_rxtx is 0
@@ -963,9 +974,9 @@ static inline int release_thread(pthread_mutex_t *mutex,int *instance_cnt,char *
exit_fun("nothing to add");
return(-1);
}
-
+
*instance_cnt=*instance_cnt-1;
-
+
if (pthread_mutex_unlock(mutex) != 0) {
LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for %s\n",name);
exit_fun("nothing to add");
diff --git a/openair1/PHY/impl_defs_lte.h b/openair1/PHY/impl_defs_lte.h
old mode 100644
new mode 100755
index f6daccfbe0..e9604a36f6
--- a/openair1/PHY/impl_defs_lte.h
+++ b/openair1/PHY/impl_defs_lte.h
@@ -666,8 +666,8 @@ typedef struct {
/// - third index: tx antenna [0..nb_antennas_tx[
/// - fourth index: sample [0..]
int32_t **beam_weights[3][15];
- /// \brief Holds the tdd reciprocity calibration coefficients
- /// - first index: eNB id [0..2] (hard coded)
+ /// \brief Holds the tdd reciprocity calibration coefficients
+ /// - first index: eNB id [0..2] (hard coded)
/// - second index: tx antenna [0..nb_antennas_tx[
/// - third index: frequency [0..]
int32_t **tdd_calib_coeffs[3];
@@ -845,15 +845,22 @@ typedef struct {
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
/// - second index: ? [0..168*N_RB_DL[
int32_t **rxdataF_comp0;
- /// \brief Received frequency-domain signal after extraction and channel compensation.
- /// - first index: ? [0..7] (hard coded) accessed via \c round
- /// - second index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
- /// - third index: ? [0..168*N_RB_DL[
- int32_t **rxdataF_comp1[8];
+ /// \brief Received frequency-domain signal after extraction and channel compensation for the second stream. For the SIC receiver we need to store the history of this for each harq process and round
+ /// - first index: ? [0..7] (hard coded) accessed via \c harq_pid
+ /// - second index: ? [0..7] (hard coded) accessed via \c round
+ /// - third index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
+ /// - fourth index: ? [0..168*N_RB_DL[
+ int32_t **rxdataF_comp1[8][8];
/// \brief Downlink channel estimates extracted in PRBS.
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
/// - second index: ? [0..168*N_RB_DL[
int32_t **dl_ch_estimates_ext;
+ /// \brief Downlink cross-correlation of MIMO channel estimates (unquantized PMI) extracted in PRBS. For the SIC receiver we need to store the history of this for each harq process and round
+ /// - first index: ? [0..7] (hard coded) accessed via \c harq_pid
+ /// - second index: ? [0..7] (hard coded) accessed via \c round
+ /// - third index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
+ /// - fourth index: ? [0..168*N_RB_DL[
+ int32_t **dl_ch_rho_ext[8][8];
/// \brief Downlink beamforming channel estimates in frequency domain.
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
/// - second index: samples? [0..symbols_per_tti*(ofdm_symbol_size+LTE_CE_FILTER_LENGTH)[
@@ -865,10 +872,6 @@ typedef struct {
/// \brief Downlink cross-correlation of MIMO channel estimates (unquantized PMI) extracted in PRBS.
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
/// - second index: ? [0..168*N_RB_DL[
- int32_t **dl_ch_rho_ext;
- /// \brief Downlink cross-correlation of MIMO channel estimates (unquantized PMI) extracted in PRBS.
- /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
- /// - second index: ? [0..168*N_RB_DL[
int32_t **dl_ch_rho2_ext;
/// \brief Downlink PMIs extracted in PRBS and grouped in subbands.
/// - first index: ressource block [0..N_RB_DL[
@@ -880,7 +883,7 @@ typedef struct {
/// \brief Magnitude of Downlink Channel second layer (16QAM level/First 64QAM level).
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
/// - second index: ? [0..168*N_RB_DL[
- int32_t **dl_ch_mag1;
+ int32_t **dl_ch_mag1[8][8];
/// \brief Magnitude of Downlink Channel, first layer (2nd 64QAM level).
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
/// - second index: ? [0..168*N_RB_DL[
@@ -888,7 +891,7 @@ typedef struct {
/// \brief Magnitude of Downlink Channel second layer (2nd 64QAM level).
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
/// - second index: ? [0..168*N_RB_DL[
- int32_t **dl_ch_magb1;
+ int32_t **dl_ch_magb1[8][8];
/// \brief Cross-correlation of two eNB signals.
/// - first index: rx antenna [0..nb_antennas_rx[
/// - second index: symbol [0..]
@@ -901,6 +904,10 @@ typedef struct {
int16_t *llr[2];
/// \f$\log_2(\max|H_i|^2)\f$
int16_t log2_maxh;
+ /// \f$\log_2(\max|H_i|^2)\f$ //this is for TM3-4 layer1 channel compensation
+ int16_t log2_maxh0;
+ /// \f$\log_2(\max|H_i|^2)\f$ //this is for TM3-4 layer2 channel commpensation
+ int16_t log2_maxh1;
/// \brief LLR shifts for subband scaling.
/// - first index: ? [0..168*N_RB_DL[
uint8_t *llr_shifts;
diff --git a/openair1/PHY/impl_defs_top.h b/openair1/PHY/impl_defs_top.h
index dd09749fbf..1273fb9cf4 100644
--- a/openair1/PHY/impl_defs_top.h
+++ b/openair1/PHY/impl_defs_top.h
@@ -202,7 +202,7 @@
#define ONE_OVER_SQRT2_Q15 23170
-
+#define ONE_OVER_2_Q15 16384
// QAM amplitude definitions
diff --git a/openair1/SCHED/defs.h b/openair1/SCHED/defs.h
index 3c5f85f6a6..5bd82dfa6b 100644
--- a/openair1/SCHED/defs.h
+++ b/openair1/SCHED/defs.h
@@ -197,7 +197,7 @@ void phy_procedures_eNB_S_TX(PHY_VARS_eNB *phy_vars_eNB,relaying_type_t r_type);
*/
void phy_procedures_eNB_S_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,relaying_type_t r_type);
-/*! \brief Scheduling for eNB PRACH RX procedures
+/*! \brief Scheduling for eNB PRACH RX procedures
@param phy_vars_eNB Pointer to eNB variables on which to act
@param proc Pointer to RXn-TXnp4 proc information
*/
@@ -510,8 +510,10 @@ int get_ue_active_harq_pid(uint8_t Mod_id,uint8_t CC_id,uint16_t rnti,int frame,
void dump_dlsch(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid);
void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe);
void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe);
+
void dump_dlsch2(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe, uint16_t coded_bits_per_codeword,int round);
+
/*@}*/
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index 5b49abbe21..6409917c67 100644
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -689,7 +689,7 @@ void generate_eNB_dlsch_params(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC
dci_alloc->format,
&eNB->dlsch_SI,
fp,
- eNB->pdsch_config_dedicated,
+ NULL,
SI_RNTI,
0,
P_RNTI,
@@ -723,7 +723,7 @@ void generate_eNB_dlsch_params(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC
dci_alloc->format,
&eNB->dlsch_ra,
fp,
- eNB->pdsch_config_dedicated,
+ NULL,
SI_RNTI,
dci_alloc->rnti,
P_RNTI,
@@ -773,7 +773,7 @@ void generate_eNB_dlsch_params(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC
dci_alloc->format,
eNB->dlsch[(uint8_t)UE_id],
fp,
- eNB->pdsch_config_dedicated,
+ &eNB->pdsch_config_dedicated[UE_id],
SI_RNTI,
0,
P_RNTI,
@@ -1480,7 +1480,13 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
0);
}
-
+ /*
+ if (frame>=10 && subframe>=9) {
+ write_output("/tmp/txsigF0.m","txsF0", &eNB->common_vars.txdataF[0][0][0],120*eNB->frame_parms.ofdm_symbol_size,1,1);
+ write_output("/tmp/txsigF1.m","txsF1", &eNB->common_vars.txdataF[0][0][0],120*eNB->frame_parms.ofdm_symbol_size,1,1);
+ abort();
+ }
+ */
#ifdef EMOS
phy_procedures_emos_eNB_TX(subframe, eNB);
@@ -3473,3 +3479,4 @@ int phy_procedures_RN_eNB_TX(unsigned char last_slot, unsigned char next_slot, r
return do_proc;
}
#endif
+
diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c
index 62b4063d29..8007243a14 100644
--- a/openair1/SIMULATION/LTE_PHY/dlsim.c
+++ b/openair1/SIMULATION/LTE_PHY/dlsim.c
@@ -118,10 +118,10 @@ void do_OFDM_mod_l(int32_t **txdataF, int32_t **txdata, uint16_t next_slot, LTE_
}
-
+
}
-void DL_channel(PHY_VARS_eNB *eNB,PHY_VARS_UE *UE,int subframe,int awgn_flag,double SNR, int tx_lev,int hold_channel,int abstx, int num_rounds, int trials, int round, channel_desc_t *eNB2UE[4],
+void DL_channel(PHY_VARS_eNB *eNB,PHY_VARS_UE *UE,int subframe,int awgn_flag,double SNR, int tx_lev,int hold_channel,int abstx, int num_rounds, int trials, int round, channel_desc_t *eNB2UE[4],
double *s_re[2],double *s_im[2],double *r_re[2],double *r_im[2],FILE *csv_fd) {
int i,u;
@@ -145,17 +145,17 @@ void DL_channel(PHY_VARS_eNB *eNB,PHY_VARS_UE *UE,int subframe,int awgn_flag,dou
r_re[aarx][i] += ((double)(((short *)eNB->common_vars.txdata[0][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)]);
r_im[aarx][i] += ((double)(((short *)eNB->common_vars.txdata[0][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]);
}
-
+
}
}
}
}
-
+
// Multipath channel
if (awgn_flag == 0) {
multipath_channel(eNB2UE[round],s_re,s_im,r_re,r_im,
2*UE->frame_parms.samples_per_tti,hold_channel);
-
+
// printf("amc: ****************** eNB2UE[%d]->n_rx = %d,dd %d\n",round,eNB2UE[round]->nb_rx,eNB2UE[round]->channel_offset);
if(abstx==1 && num_rounds>1)
if(round==0 && hold_channel==0) {
@@ -163,7 +163,7 @@ void DL_channel(PHY_VARS_eNB *eNB,PHY_VARS_UE *UE,int subframe,int awgn_flag,dou
random_channel(eNB2UE[2],0);
random_channel(eNB2UE[3],0);
}
-
+
if (UE->perfect_ce==1) {
// fill in perfect channel estimates
freq_channel(eNB2UE[round],UE->frame_parms.N_RB_DL,12*UE->frame_parms.N_RB_DL + 1);
@@ -173,15 +173,15 @@ void DL_channel(PHY_VARS_eNB *eNB,PHY_VARS_UE *UE,int subframe,int awgn_flag,dou
*/
}
}
-
-
+
+
if(abstx) {
if (trials==0 && round==0) {
// calculate freq domain representation to compute SINR
freq_channel(eNB2UE[0], eNB->frame_parms.N_RB_DL,2*eNB->frame_parms.N_RB_DL + 1);
// snr=pow(10.0,.1*SNR);
fprintf(csv_fd,"%f,",SNR);
-
+
for (u=0; u<2*eNB->frame_parms.N_RB_DL; u++) {
for (aarx=0; aarxnb_rx; aarx++) {
for (aatx=0; aatxnb_tx; aatx++) {
@@ -190,11 +190,11 @@ void DL_channel(PHY_VARS_eNB *eNB,PHY_VARS_UE *UE,int subframe,int awgn_flag,dou
fprintf(csv_fd,"%e+i*(%e),",channelx,channely);
}
}
- }
-
+ }
+
if(num_rounds>1) {
freq_channel(eNB2UE[1], eNB->frame_parms.N_RB_DL,2*eNB->frame_parms.N_RB_DL + 1);
-
+
for (u=0; u<2*eNB->frame_parms.N_RB_DL; u++) {
for (aarx=0; aarxnb_rx; aarx++) {
for (aatx=0; aatxnb_tx; aatx++) {
@@ -204,9 +204,9 @@ void DL_channel(PHY_VARS_eNB *eNB,PHY_VARS_UE *UE,int subframe,int awgn_flag,dou
}
}
}
-
+
freq_channel(eNB2UE[2], eNB->frame_parms.N_RB_DL,2*eNB->frame_parms.N_RB_DL + 1);
-
+
for (u=0; u<2*eNB->frame_parms.N_RB_DL; u++) {
for (aarx=0; aarxnb_rx; aarx++) {
for (aatx=0; aatxnb_tx; aatx++) {
@@ -216,9 +216,9 @@ void DL_channel(PHY_VARS_eNB *eNB,PHY_VARS_UE *UE,int subframe,int awgn_flag,dou
}
}
}
-
+
freq_channel(eNB2UE[3], eNB->frame_parms.N_RB_DL,2*eNB->frame_parms.N_RB_DL + 1);
-
+
for (u=0; u<2*eNB->frame_parms.N_RB_DL; u++) {
for (aarx=0; aarxnb_rx; aarx++) {
for (aatx=0; aatxnb_tx; aatx++) {
@@ -231,10 +231,11 @@ void DL_channel(PHY_VARS_eNB *eNB,PHY_VARS_UE *UE,int subframe,int awgn_flag,dou
}
}
}
-
+
//AWGN
- // This is the SNR on the PDSCH for OFDM symbols without pilots -> rho_A
- sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)eNB->frame_parms.ofdm_symbol_size/(double)(eNB->frame_parms.N_RB_DL*12)) - SNR - get_pa_dB(eNB->pdsch_config_dedicated);
+ // tx_lev is the average energy over the whole subframe
+ // but SNR should be better defined wrt the energy in the reference symbols
+ sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)eNB->frame_parms.ofdm_symbol_size/(double)(eNB->frame_parms.N_RB_DL*12)) - SNR;
sigma2 = pow(10,sigma2_dB/10);
for (i=0; i<2*UE->frame_parms.samples_per_tti; i++) {
@@ -251,7 +252,7 @@ void DL_channel(PHY_VARS_eNB *eNB,PHY_VARS_UE *UE,int subframe,int awgn_flag,dou
void fill_DCI(PHY_VARS_eNB *eNB,
DCI_ALLOC_t *dci_alloc,
- int subframe,
+ int subframe,
int n_rnti,
int n_users,
int transmission_mode,
@@ -278,9 +279,9 @@ void fill_DCI(PHY_VARS_eNB *eNB,
case 7:
if (common_flag == 0) {
-
+
if (eNB->frame_parms.frame_type == TDD) {
-
+
switch (eNB->frame_parms.N_RB_DL) {
case 6:
dci_length = sizeof_DCI1_1_5MHz_TDD_t;
@@ -294,7 +295,7 @@ void fill_DCI(PHY_VARS_eNB *eNB,
((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = ndi;
((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = rv;
break;
-
+
case 25:
dci_length = sizeof_DCI1_5MHz_TDD_t;
dci_length_bytes = sizeof(DCI1_5MHz_TDD_t);
@@ -307,7 +308,7 @@ void fill_DCI(PHY_VARS_eNB *eNB,
((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = ndi;
((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = rv;
break;
-
+
case 50:
dci_length = sizeof_DCI1_10MHz_TDD_t;
dci_length_bytes = sizeof(DCI1_10MHz_TDD_t);
@@ -1223,17 +1224,17 @@ DCI_PDU *get_dci_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t
if (subframeP == subframe) {
DCI_pdu.Num_ue_spec_dci = num_ue_spec_dci;
DCI_pdu.Num_common_dci = num_common_dci;
- DCI_pdu.num_pdcch_symbols = num_pdcch_symbols;
+ DCI_pdu.num_pdcch_symbols = num_pdcch_symbols;
return(&DCI_pdu);
} else {
DCI_pdu.Num_ue_spec_dci = 0;
DCI_pdu.Num_common_dci = 0;
- DCI_pdu.num_pdcch_symbols = num_pdcch_symbols;
+ DCI_pdu.num_pdcch_symbols = num_pdcch_symbols;
}
}
void eNB_dlsch_ulsch_scheduler(module_id_t module_idP, uint8_t cooperation_flag, frame_t frameP, sub_frame_t subframeP) {
-
+
return;
}
@@ -1459,7 +1460,7 @@ int main(int argc, char **argv)
common_flag = 1;
TPC = atoi(optarg);
break;
-
+
case 'E':
threequarter_fs=1;
break;
@@ -1779,7 +1780,7 @@ int main(int argc, char **argv)
form_ue = create_lte_phy_scope_ue();
sprintf (title, "LTE PHY SCOPE eNB");
fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
-
+
if (!dual_stream_UE==0) {
UE->use_ia_receiver = 1;
fl_set_button(form_ue->button_0,1);
@@ -1807,9 +1808,9 @@ int main(int argc, char **argv)
perfect_ce);
if ((transmission_mode==1) || (transmission_mode==7)) {
- for (aa=0; aaframe_parms.nb_antennas_tx; aa++)
- for (re=0; reframe_parms.ofdm_symbol_size; re++)
- eNB->common_vars.beam_weights[0][0][aa][re] = 0x00007fff/eNB->frame_parms.nb_antennas_tx;
+ for (aa=0; aaframe_parms.nb_antennas_tx; aa++)
+ for (re=0; reframe_parms.ofdm_symbol_size; re++)
+ eNB->common_vars.beam_weights[0][0][aa][re] = 0x00007fff/eNB->frame_parms.nb_antennas_tx;
}
if (transmission_mode<7)
@@ -1827,11 +1828,11 @@ int main(int argc, char **argv)
init_te_thread(eNB,NULL);
}
- // callback functions required for phy_procedures_tx
+ // callback functions required for phy_procedures_tx
mac_xface->get_dci_sdu = get_dci_sdu;
mac_xface->get_dlsch_sdu = get_dlsch_sdu;
mac_xface->eNB_dlsch_ulsch_scheduler = eNB_dlsch_ulsch_scheduler;
-
+
// eNB_id_i = UE->n_connected_eNB;
printf("Setting mcs1 = %d\n",mcs1);
@@ -2107,6 +2108,10 @@ int main(int argc, char **argv)
UE->dlsch[0][i]->rnti = n_rnti;
}
+ UE->dlsch_SI[0] = new_ue_dlsch(1,1,Nsoft,MAX_TURBO_ITERATIONS,N_RB_DL,0);
+ UE->dlsch_ra[0] = new_ue_dlsch(1,1,Nsoft,MAX_TURBO_ITERATIONS,N_RB_DL,0);
+ UE->ulsch[0] = new_ue_ulsch(N_RB_DL,0);
+
// structure for SIC at UE
UE->dlsch_eNB[0] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0,&eNB->frame_parms);
@@ -2335,7 +2340,7 @@ int main(int argc, char **argv)
TB0_active = 1;
eNB->dlsch[0][0]->harq_processes[0]->rvidx = round&3;
-
+
fill_DCI(eNB,&dci_alloc[0],subframe,n_rnti,n_users,transmission_mode,common_flag,DLSCH_RB_ALLOC,TPC,mcs1,mcs2,trials&1,round&3,&num_common_dci,&num_ue_spec_dci,&num_dci);
}
else {
@@ -2343,14 +2348,14 @@ int main(int argc, char **argv)
(TB0_active==1)?mcs1:0,mcs2,trials&1,(TB0_active==1)?round&3:0,&num_common_dci,&num_ue_spec_dci,&num_dci);
}
for (i=num_common_dci; isubframe_tx = subframe;
eNB->abstraction_flag=0;
-
+
phy_procedures_eNB_TX(eNB,proc_eNB,no_relay,NULL,1);
-
-
+
+
start_meas(&eNB->ofdm_mod_stats);
-
+
/*
do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id],
eNB->common_vars.txdata[eNB_id],
(subframe*2),
&eNB->frame_parms);
-
+
do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id],
eNB->common_vars.txdata[eNB_id],
(subframe*2)+1,
@@ -2425,19 +2430,19 @@ int main(int argc, char **argv)
stop_meas(&eNB->ofdm_mod_stats);
-
+
// generate next subframe for channel estimation
-
+
proc_eNB->subframe_tx = subframe+1;
-
+
phy_procedures_eNB_TX(eNB,proc_eNB,no_relay,NULL,0);
-
+
do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id],
eNB->common_vars.txdata[eNB_id],
(subframe*2)+2,
&eNB->frame_parms);
-
+
proc_eNB->frame_tx++;
tx_lev = 0;
@@ -2450,7 +2455,7 @@ int main(int argc, char **argv)
tx_lev_dB = (unsigned int) dB_fixed(tx_lev);
-
+
if (n_frames==1) {
printf("tx_lev = %d (%d dB)\n",tx_lev,tx_lev_dB);
@@ -2466,7 +2471,7 @@ int main(int argc, char **argv)
}
DL_channel(eNB,UE,subframe,awgn_flag,SNR,tx_lev,hold_channel,abstx,num_rounds,trials,round,eNB2UE,s_re,s_im,r_re,r_im,csv_fd);
-
+
UE_rxtx_proc_t *proc = &UE->proc.proc_rxtx[subframe&1];
proc->subframe_rx = subframe;
@@ -2479,7 +2484,7 @@ int main(int argc, char **argv)
UE->rx_offset,
0,
0);
-
+
if (n_frames==1) printf("Running phy_procedures_UE_RX\n");
phy_procedures_UE_RX(UE,proc,0,0,normal_txrx,no_relay,NULL);
@@ -2488,7 +2493,7 @@ int main(int argc, char **argv)
/*
write_output("pdcchF0_ext.m","pdcchF_ext", UE->pdcch_vars[eNB_id]->rxdataF_ext[0],2*3*UE->frame_parms.ofdm_symbol_size,1,1);
write_output("pdcch00_ch0_ext.m","pdcch00_ch0_ext",UE->pdcch_vars[eNB_id]->dl_ch_estimates_ext[0],12*UE->frame_parms.N_RB_DL*3,1,1);
-
+
write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",UE->pdcch_vars[eNB_id]->rxdataF_comp[0],4*12*UE->frame_parms.N_RB_DL,1,1);
write_output("pdcch_rxF_llr.m","pdcch_llr",UE->pdcch_vars[eNB_id]->llr,12*UE->frame_parms.N_RB_DL*4*2,1,4);
write_output("txsigF0.m","txsF0", &eNB->common_vars.txdataF[eNB_id][0][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],
@@ -2503,53 +2508,55 @@ int main(int argc, char **argv)
if ((test_perf ==0 ) && (n_frames==1)) {
write_output("ch0.m","ch0",eNB2UE[0]->ch[0],eNB2UE[0]->channel_length,1,8);
-
+
if (eNB->frame_parms.nb_antennas_tx>1)
write_output("ch1.m","ch1",eNB2UE[0]->ch[eNB->frame_parms.nb_antennas_rx],eNB2UE[0]->channel_length,1,8);
-
+
//common vars
write_output("rxsig0.m","rxs0", &UE->common_vars.rxdata[0][0],10*UE->frame_parms.samples_per_tti,1,1);
+
write_output("rxsigF0.m","rxsF0", &UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[0][0],UE->frame_parms.ofdm_symbol_size*nsymb,1,1);
-
+
if (UE->frame_parms.nb_antennas_rx>1) {
write_output("rxsig1.m","rxs1", UE->common_vars.rxdata[1],UE->frame_parms.samples_per_tti,1,1);
write_output("rxsigF1.m","rxsF1", UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[1],UE->frame_parms.ofdm_symbol_size*nsymb,1,1);
}
-
+
write_output("dlsch00_r0.m","dl00_r0",
&(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][0][0]),
UE->frame_parms.ofdm_symbol_size*nsymb,1,1);
-
+
if (UE->frame_parms.nb_antennas_rx>1)
write_output("dlsch01_r0.m","dl01_r0",
&(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][1][0]),
UE->frame_parms.ofdm_symbol_size*nsymb,1,1);
-
+
if (eNB->frame_parms.nb_antennas_tx>1)
write_output("dlsch10_r0.m","dl10_r0",
&(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2][0]),
UE->frame_parms.ofdm_symbol_size*nsymb,1,1);
-
+
if ((UE->frame_parms.nb_antennas_rx>1) && (eNB->frame_parms.nb_antennas_tx>1))
write_output("dlsch11_r0.m","dl11_r0",
&(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][3][0]),
UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1);
-
+
//pdsch_vars
+
dump_dlsch2(UE,eNB_id,subframe,coded_bits_per_codeword,round);
- //dump_dlsch2(UE,eNB_id_i,coded_bits_per_codeword);
+
write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4);
-
+
//pdcch_vars
write_output("pdcchF0_ext.m","pdcchF_ext", UE->pdcch_vars[eNB_id]->rxdataF_ext[0],2*3*UE->frame_parms.ofdm_symbol_size,1,1);
write_output("pdcch00_ch0_ext.m","pdcch00_ch0_ext",UE->pdcch_vars[eNB_id]->dl_ch_estimates_ext[0],300*3,1,1);
-
+
write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",UE->pdcch_vars[eNB_id]->rxdataF_comp[0],4*300,1,1);
write_output("pdcch_rxF_llr.m","pdcch_llr",UE->pdcch_vars[eNB_id]->llr,2400,1,4);
-
+
}
-
-
+
+
if (UE->dlsch_errors[0] == 0) {
@@ -2563,7 +2570,7 @@ int main(int argc, char **argv)
UE->total_TBS[eNB_id] = UE->total_TBS[eNB_id] + UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->TBS;
TB0_active = 0;
-
+
} // DLSCH received ok
else {
errs[round]++;
@@ -2594,8 +2601,9 @@ int main(int argc, char **argv)
write_output(fname,vname, &UE->common_vars.rxdata[0][0],10*UE->frame_parms.samples_per_tti,1,1);
sprintf(fname,"rxsigF0_r%d.m",round);
sprintf(vname,"rxs0F_r%d",round);
+
write_output(fname,vname, &UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[0][0],UE->frame_parms.ofdm_symbol_size*nsymb,1,1);
-
+
if (UE->frame_parms.nb_antennas_rx>1) {
sprintf(fname,"rxsig1_r%d.m",round);
sprintf(vname,"rxs1_r%d.m",round);
@@ -2636,8 +2644,9 @@ int main(int argc, char **argv)
}
//pdsch_vars
- dump_dlsch2(UE,eNB_id,subframe,coded_bits_per_codeword,round);
-
+ dump_dlsch2(UE,eNB_id,subframe,coded_bits_per_codeword,round);
+
+
//write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4);
//write_output("dlsch_ber_bit.m","ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0);
//write_output("dlsch_w.m","w",eNB->dlsch[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,4);
@@ -2645,10 +2654,10 @@ int main(int argc, char **argv)
//pdcch_vars
write_output("pdcchF0_ext.m","pdcchF_ext", UE->pdcch_vars[eNB_id]->rxdataF_ext[0],2*3*UE->frame_parms.ofdm_symbol_size,1,1);
write_output("pdcch00_ch0_ext.m","pdcch00_ch0_ext",UE->pdcch_vars[eNB_id]->dl_ch_estimates_ext[0],300*3,1,1);
-
+
write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",UE->pdcch_vars[eNB_id]->rxdataF_comp[0],4*300,1,1);
- write_output("pdcch_rxF_llr.m","pdcch_llr",UE->pdcch_vars[eNB_id]->llr,2400,1,4);
-
+ write_output("pdcch_rxF_llr.m","pdcch_llr",UE->pdcch_vars[eNB_id]->llr,2400,1,4);
+
if (round == 3) exit(-1);
}
diff --git a/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c b/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c
new file mode 100644
index 0000000000..59091c1e38
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c
@@ -0,0 +1,5343 @@
+/*******************************************************************************
+ 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 .
+
+ Contact Information
+ OpenAirInterface Admin: openair_admin@eurecom.fr
+ OpenAirInterface Tech : openair_tech@eurecom.fr
+ OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
+
+ Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
+
+ *******************************************************************************/
+
+/*! \file dlsim.c
+ \brief Top-level DL simulator
+ \author R. Knopp
+ \date 2011 - 2014
+ \version 0.1
+ \company Eurecom
+ \email: knopp@eurecom.fr
+ \note
+ \warning
+*/
+
+//#define DEBUG_HARQ
+//#define PRINT_THROUGHPUT
+
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include "SIMULATION/TOOLS/defs.h"
+#include "PHY/types.h"
+#include "PHY/defs.h"
+#include "PHY/vars.h"
+
+#include "SCHED/defs.h"
+#include "SCHED/vars.h"
+#include "LAYER2/MAC/vars.h"
+#include "OCG_vars.h"
+#include "UTIL/LOG/log.h"
+#include "UTIL/LISTS/list.h"
+
+#include "unitary_defs.h"
+
+extern unsigned int dlsch_tbs25[27][25],TBStable[27][110];
+extern unsigned char offset_mumimo_llr_drange_fix;
+
+extern uint8_t interf_unaw_shift0;
+extern uint8_t interf_unaw_shift1;
+extern uint8_t interf_unaw_shift;
+
+#include "PHY/TOOLS/lte_phy_scope.h"
+
+#define PRINT_BYTES
+
+PHY_VARS_eNB *eNB;
+PHY_VARS_UE *UE;
+
+
+int otg_enabled=0;
+/*the following parameters are used to control the processing times calculations*/
+double t_tx_max = -1000000000; /*!< \brief initial max process time for tx */
+double t_rx_max = -1000000000; /*!< \brief initial max process time for rx */
+double t_tx_min = 1000000000; /*!< \brief initial min process time for tx */
+double t_rx_min = 1000000000; /*!< \brief initial min process time for rx */
+int n_tx_dropped = 0; /*!< \brief initial max process time for tx */
+int n_rx_dropped = 0; /*!< \brief initial max process time for rx */
+
+void handler(int sig)
+{
+ void *array[10];
+ size_t size;
+
+ // get void*'s for all entries on the stack
+ size = backtrace(array, 10);
+
+ // print out all the frames to stderr
+ fprintf(stderr, "Error: signal %d:\n", sig);
+ backtrace_symbols_fd(array, size, 2);
+ exit(1);
+}
+
+
+
+//DCI2_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu2_2A[2];
+
+DCI1E_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu2_1E[2];
+uint64_t DLSCH_alloc_pdu_1[2];
+
+#define UL_RB_ALLOC 0x1ff;
+#define CCCH_RB_ALLOC computeRIV(eNB->frame_parms.N_RB_UL,0,2)
+
+//#define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13
+//#define DLSCH_RB_ALLOC 0x0001
+void do_OFDM_mod_l(int32_t **txdataF, int32_t **txdata, uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms)
+{
+
+ int aa, slot_offset, slot_offset_F;
+
+ slot_offset_F = (next_slot)*(frame_parms->ofdm_symbol_size)*((frame_parms->Ncp==1) ? 6 : 7);
+ slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1);
+
+ for (aa=0; aanb_antennas_tx; aa++) {
+ // printf("Thread %d starting ... aa %d (%llu)\n",omp_get_thread_num(),aa,rdtsc());
+
+ if (frame_parms->Ncp == 1)
+ PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input
+ &txdata[aa][slot_offset], // output
+ frame_parms->ofdm_symbol_size,
+ 6, // number of symbols
+ frame_parms->nb_prefix_samples, // number of prefix samples
+ CYCLIC_PREFIX);
+ else {
+ normal_prefix_mod(&txdataF[aa][slot_offset_F],
+ &txdata[aa][slot_offset],
+ 7,
+ frame_parms);
+ }
+
+
+ }
+
+}
+
+int main(int argc, char **argv)
+{
+
+ int c;
+ int k,i,aa,aarx,aatx;
+
+ int s,Kr,Kr_bytes;
+
+ double sigma2, sigma2_dB=10,SNR,snr0=-2.0,snr1,rate[2];
+ double snr_step=1,input_snr_step=1, snr_int=30;
+
+ LTE_DL_FRAME_PARMS *frame_parms;
+ double **s_re,**s_im,**r_re,**r_im;
+ double forgetting_factor=0.0; //in [0,1] 0 means a new channel every time, 1 means keep the same channel
+ double iqim=0.0;
+
+ uint8_t extended_prefix_flag=0,transmission_mode=1,n_tx_port=1, n_tx_phy=1, n_rx=1;
+ uint16_t Nid_cell=0;
+
+ int8_t eNB_id = 0, eNB_id_i = 1;
+ unsigned char mcs1=0,mcs2=0,mcs_i=0,awgn_flag=0,dci_flag=0;
+ unsigned char i_mod = 2;
+ unsigned short NB_RB;
+ unsigned char Ns,l,m;
+ uint16_t tdd_config=3;
+ uint16_t n_rnti=0x1234;
+ int n_users = 1;
+
+ int TB=0;
+ RX_type_t rx_type=rx_standard;
+ unsigned char cur_harq_pid;
+ int hold_rank1_precoder=0;
+ int tpmi_retr=2;
+ bool is_first_time;
+ int updated_csi = 0;
+
+ SCM_t channel_model=Rayleigh1;
+ // unsigned char *input_data,*decoded_output;
+
+ unsigned char *input_buffer0[2],*input_buffer1[2];
+ unsigned short input_buffer_length0,input_buffer_length1;
+
+ /* A variable "ret" is a nuumber of turbo iterations, that are performed in the turbo-decoder for each CW.
+ The decoder checks CRC, and if CRC test fails, it increments "ret". Ret is between 1 and 4, where 4 is for
+ the max number of turbo iterations. If the CRC is passed, ret is equal to a current iteration.
+ This is done separately for each CW inside decoding process.
+ Again: this is not a HARQ retransmission!*/
+ unsigned int ret[2];
+ unsigned int coded_bits_per_codeword[2],nsymb,dci_cnt,tbs[2];
+
+ unsigned int tx_lev=0, tx_lev_dB=0, round=0, trials, errs[2][4]={{0,0,0,0},{0,0,0,0}}, round_trials[2][4]={{0,0,0,0},{0,0,0,0}}, decoded_in_sic[4]={0,0,0,0}, sic_attempt[4]={0,0,0,0}, round_sic=0;
+ unsigned int dci_errors=0, dlsch_active=0, num_layers;
+ unsigned int resend_one[4]={0,0,0,0}, resend_both[4]={0,0,0,0}, TB0_deact[4]={0,0,0,0}, TB1_deact[4]={0,0,0,0};
+
+ int re_allocated;
+ char fname[32],vname[32];
+ FILE *bler_fd;
+ char bler_fname[256];
+ FILE *time_meas_fd;
+ char time_meas_fname[256];
+
+ FILE *input_trch_fd=NULL;
+ unsigned char input_trch_file=0;
+ FILE *input_fd=NULL;
+ unsigned char input_file=0;
+ // char input_val_str[50],input_val_str2[50];
+
+ char input_trch_val[16];
+ double channelx,channely;
+
+ // unsigned char pbch_pdu[6];
+
+ DCI_ALLOC_t dci_alloc[8],dci_alloc_rx[8];
+ int num_common_dci=0,num_ue_spec_dci=0,num_dci=0;
+
+ // FILE *rx_frame_file;
+
+ int n_frames;
+ int n_ch_rlz = 1;
+
+ channel_desc_t *eNB2UE[8];
+
+ uint8_t num_pdcch_symbols=1,num_pdcch_symbols_2=0;
+ uint8_t pilot1,pilot2,pilot3;
+ uint8_t rx_sample_offset = 0;
+ //char stats_buffer[4096];
+ //int len;
+
+ uint8_t num_rounds = 4;
+ uint8_t subframe=7;
+ int u;
+ int n=0;
+ int abstx=0;
+ int iii;
+ FILE *csv_fd=NULL;
+ char csv_fname[512];
+ int ch_realization;
+ int pmi_feedback=0;
+ int hold_channel=0;
+
+ // temporarily for retransmissions:
+ unsigned char resend_cw1=0; //if 0 resend only cw0
+ unsigned char resend_cw0_cw1=1; //if 0 resend both cw in a normal way
+
+ // void *data;
+ // int ii;
+ int bler;
+ double blerr[2][4],uncoded_ber,avg_ber;
+ short *uncoded_ber_bit=NULL;
+ uint8_t N_RB_DL=25,osf=1;
+ uint8_t fdd_flag = 0;
+ frame_t frame_type = FDD;
+ int xforms=0;
+ FD_lte_phy_scope_ue *form_ue = NULL;
+ char title[255];
+ uint32_t DLSCH_RB_ALLOC = 0x1fff;
+ int numCCE=0;
+ int dci_length_bytes=0,dci_length=0;
+ int common_flag=0,TPC=0;
+
+ double cpu_freq_GHz;
+ //time_stats_t ts;//,sts,usts;
+ int avg_iter[2],iter_trials[2];
+ int rballocset=0;
+ int print_perf=0;
+ int test_perf=0;
+ int dump_table=0;
+ int llr8_flag=0;
+
+ double effective_rate=0.0;
+
+ double thr_cw0_tm4 = 0.0;
+ double thr_cw0_tm4_nonconst = 0.0;
+ double thr_cw0[4]={0,0,0,0}, thr_cw1[4]={0,0,0,0}, thr_cw0_tot = 0.0, thr_cw1_tot = 0.0;
+ unsigned int tbs0_init=0, tbs1_init=0;
+ double rate0_init=0.0, rate1_init=0.0;
+ int mcs0_init=0, mcs1_init=0, mod_order0_init = 0, mod_order1_init=0;
+ char channel_model_input[17]="I";
+
+ int TB0_active = 1;
+ int TB1_active = 1;
+
+ uint32_t perfect_ce = 0;
+
+ LTE_DL_UE_HARQ_t *dlsch0_ue_harq;
+ LTE_DL_eNB_HARQ_t *dlsch0_eNB_harq;
+ uint8_t Kmimo;
+
+ int32_t **sic_buffer;
+ int8_t cw_to_decode_interf;
+ int8_t cw_to_decode_interf_free;
+ int8_t cw_non_sic;
+ int8_t cw_sic;
+ FILE *proc_fd = NULL;
+ char buf[64];
+ uint8_t ue_category=4;
+ uint32_t Nsoft;
+
+ int CCE_table[800];
+
+ int threequarter_fs=0;
+
+
+
+ opp_enabled=1; // to enable the time meas
+
+#if defined(__arm__)
+ FILE *proc_fd = NULL;
+ char buf[64];
+
+ proc_fd = fopen("/sys/devices/system/cpu/cpu4/cpufreq/cpuinfo_cur_freq", "r");
+ if(!proc_fd)
+ printf("cannot open /sys/devices/system/cpu/cpu4/cpufreq/cpuinfo_cur_freq");
+ else {
+ while(fgets(buf, 63, proc_fd))
+ printf("%s", buf);
+ }
+ fclose(proc_fd);
+ cpu_freq_GHz = ((double)atof(buf))/1e6;
+#else
+ cpu_freq_GHz = get_cpu_freq_GHz();
+#endif
+ printf("Detected cpu_freq %f GHz\n",cpu_freq_GHz);
+
+ //signal(SIGSEGV, handler);
+ //signal(SIGABRT, handler);
+
+ logInit();
+ set_glog(LOG_INFO, LOG_MED);
+
+ // default parameters
+ n_frames = 1000;
+ snr0 = 0;
+ // num_layers = 1;
+ perfect_ce = 0;
+
+
+ while ((c = getopt (argc, argv, "ahdpZDe:Em:n:o:s:f:t:c:g:r:F:x:y:z:AM:N:I:i:O:R:S:C:T:b:u:v:w:B:PLl:XYv:W:J:K:U")) != -1) {
+
+ switch (c) {
+ case 'a':
+ awgn_flag = 1;
+ channel_model = AWGN;
+ break;
+
+ case 'A':
+ abstx = 1;
+ break;
+
+ case 'b':
+ tdd_config=atoi(optarg);
+ break;
+
+ case 'B':
+ N_RB_DL=atoi(optarg);
+ break;
+
+ case 'c':
+ num_pdcch_symbols=atoi(optarg);
+ break;
+
+ case 'C':
+ Nid_cell = atoi(optarg);
+ break;
+
+ case 'd':
+ dci_flag = 1;
+ break;
+
+ case 'D':
+ frame_type=TDD;
+ break;
+
+ case 'e':
+ num_rounds=1;
+ common_flag = 1;
+ TPC = atoi(optarg);
+ break;
+
+ case 'E':
+ threequarter_fs=1;
+ break;
+
+ case 'f':
+ input_snr_step= atof(optarg);
+ break;
+
+ case 'F':
+ forgetting_factor = atof(optarg);
+ break;
+
+ case 'i':
+ input_fd = fopen(optarg,"r");
+ input_file=1;
+ dci_flag = 1;
+ break;
+
+ case 'I':
+ input_trch_fd = fopen(optarg,"r");
+ input_trch_file=1;
+ break;
+
+ case 'L':
+ llr8_flag=1;
+ break;
+
+ case 'l':
+ offset_mumimo_llr_drange_fix=atoi(optarg);
+ break;
+
+ case 'm':
+ mcs1 = atoi(optarg);
+ break;
+
+ case 'M':
+ mcs2 = atoi(optarg);
+ //i_mod = get_Qm(mcs2); /// think here again!!!
+ break;
+
+ case 'O':
+ test_perf=atoi(optarg);
+ //print_perf =1;
+ break;
+
+ case 't':
+ mcs_i = atoi(optarg);
+ i_mod = get_Qm(mcs_i);
+ break;
+
+ case 'n':
+ n_frames = atoi(optarg);
+ break;
+
+ case 'o':
+ rx_sample_offset = atoi(optarg);
+ break;
+
+ case 'r':
+ DLSCH_RB_ALLOC = atoi(optarg);
+ rballocset = 1;
+ break;
+
+ case 's':
+ snr0 = atof(optarg);
+ break;
+
+ case 'w':
+ snr_int = atof(optarg);
+ break;
+
+ case 'N':
+ n_ch_rlz= atof(optarg);
+ break;
+
+ case 'p':
+ extended_prefix_flag=1;
+ break;
+
+ case 'g':
+ memcpy(channel_model_input,optarg,17);
+
+ switch((char)*optarg) {
+ case 'A':
+ channel_model=SCM_A;
+ break;
+ case 'B':
+ channel_model=SCM_B;
+ break;
+ case 'C':
+ channel_model=SCM_C;
+ break;
+ case 'D':
+ channel_model=SCM_D;
+ break;
+ case 'E':
+ channel_model=EPA;
+ break;
+ case 'F':
+ channel_model=EVA;
+ break;
+ case 'G':
+ channel_model=ETU;
+ break;
+ case 'H':
+ channel_model=Rayleigh8;
+ break;
+ case 'I':
+ channel_model=Rayleigh1;
+ break;
+ case 'J':
+ channel_model=Rayleigh1_corr;
+ break;
+ case 'K':
+ channel_model=Rayleigh1_anticorr;
+ break;
+ case 'L':
+ channel_model=Rice8;
+ break;
+ case 'M':
+ channel_model=Rice1;
+ break;
+ case 'N':
+ channel_model=AWGN;
+ break;
+ case 'P':
+ channel_model=Rayleigh1_orthogonal;
+ break;
+ case 'Q':
+ channel_model=Rayleigh1_orth_eff_ch_TM4_prec_real; // for DUALSTREAM_UNIFORM_PRECODING1 when interf is precancelled
+ break;
+ case 'R':
+ channel_model=Rayleigh1_orth_eff_ch_TM4_prec_imag; // for DUALSTREAM_UNIFORM_PRECODINGj when interf is precancelled
+ break;
+ case 'S':
+ channel_model=Rayleigh8_orth_eff_ch_TM4_prec_real;//when interf is precancelled
+ break;
+ case 'T':
+ channel_model=Rayleigh8_orth_eff_ch_TM4_prec_imag;//when interf is precancelled
+ break;
+ case 'U':
+ channel_model = TS_SHIFT;
+ break;
+ case 'V':
+ channel_model=EPA_low;
+ break;
+ case 'W':
+ channel_model=EPA_medium;
+ break;
+ case 'X':
+ channel_model=EPA_high;
+ break;
+ default:
+ msg("Unsupported channel model!\n");
+ exit(-1);
+ }
+ break;
+ case 'z':
+ n_rx=atoi(optarg);
+ if ((n_rx==0) || (n_rx>2)) {
+ msg("Unsupported number of rx antennas %d\n",n_rx);
+ exit(-1);
+ }
+ break;
+
+ case 'R':
+ num_rounds=atoi(optarg);
+ break;
+ case 'S':
+ subframe=atoi(optarg);
+ break;
+ case 'T':
+ n_rnti=atoi(optarg);
+ break;
+ case 'u':
+ rx_type = (RX_type_t) atoi(optarg);
+ if (rx_typerx_SIC_dual_stream) {
+ printf("Unsupported rx type %d\n",rx_type);
+ exit(-1);
+ }
+ break;
+ case 'v':
+ i_mod = atoi(optarg);
+ if (i_mod!=2 && i_mod!=4 && i_mod!=6) {
+ msg("Wrong i_mod %d, should be 2,4 or 6\n",i_mod);
+ exit(-1);
+ }
+ break;
+ case 'P':
+ print_perf=1;
+ break;
+ case 'q':
+ n_tx_port=atoi(optarg);
+
+ if ((n_tx_port==0) || ((n_tx_port>2))) {
+ msg("Unsupported number of cell specific antennas ports %d\n",n_tx_port);
+ exit(-1);
+ }
+ break;
+ case 'x':
+ transmission_mode=atoi(optarg);
+ if ((transmission_mode!=1) &&
+ (transmission_mode!=2) &&
+ (transmission_mode!=3) &&
+ (transmission_mode!=4) &&
+ (transmission_mode!=5) &&
+ (transmission_mode!=6)) {
+ msg("Unsupported transmission mode %d\n",transmission_mode);
+ exit(-1);
+ }
+ if (transmission_mode>1 && transmission_mode<7) {
+ n_tx_port = 2;
+ }
+ break;
+ case 'y':
+ n_tx_phy=atoi(optarg);
+
+ if (n_tx_phy < n_tx_port) {
+ msg("n_tx_phy mush not be smaller than n_tx_port");
+ exit(-1);
+ }
+
+ if ((transmission_mode>1 && transmission_mode<7) && n_tx_port<2) {
+ msg("n_tx_port must be >1 for transmission_mode %d\n",transmission_mode);
+ exit(-1);
+ }
+
+ if (transmission_mode==7 && (n_tx_phy!=1 && n_tx_phy!=2 && n_tx_phy!=4 && n_tx_phy!=8 && n_tx_phy!=16 && n_tx_phy!=64 && n_tx_phy!=128)) {
+ msg("Physical number of antennas not supported for TM7.\n");
+ exit(-1);
+ }
+
+ break;
+ case 'X':
+ xforms = 1;
+ break;
+ case 'Z':
+ dump_table=1;
+ break;
+ case 'Y':
+ perfect_ce=1;
+ break;
+ case 'V':
+ interf_unaw_shift0=atoi(optarg);
+ break;
+ case 'W':
+ interf_unaw_shift1=atoi(optarg);
+ break;
+ case 'J':
+ interf_unaw_shift=atoi(optarg);
+ break;
+ case 'K':
+ tpmi_retr = atoi(optarg);
+ break;
+ case 'U':
+ updated_csi=1;
+ break;
+ case 'h':
+ default:
+ printf("%s -h(elp) -a(wgn on) -d(ci decoding on) -p(extended prefix on) -m mcs1 -M mcs2 -n n_frames -s snr0 -x transmission mode (1,2,3,5,6) -y TXant -z RXant -I trch_file\n",argv[0]);
+ printf("-h This message\n");
+ printf("-a Use AWGN channel and not multipath\n");
+ printf("-c Number of PDCCH symbols\n");
+ printf("-m MCS1 for TB 1\n");
+ printf("-M MCS2 for TB 2\n");
+ printf("-d Transmit the DCI and compute its error statistics and the overall throughput\n");
+ printf("-p Use extended prefix mode\n");
+ printf("-n Number of frames to simulate\n");
+ printf("-o Sample offset for receiver\n");
+ printf("-s Starting SNR, runs from SNR to SNR+%.1fdB in steps of %.1fdB. If n_frames is 1 then just SNR is simulated and MATLAB/OCTAVE output is generated\n", snr_int, snr_step);
+ printf("-f step size of SNR, default value is 1.\n");
+ printf("-r resource block allocation (see section 7.1.6.3 in 36.213\n");
+ printf("-g Channel model, possible values are 3GPP 25.814 SCM-A/B/C/D('A','B','C','D'), 36-101 EPA('E'), EVA ('F'),ETU('G'), Rayghleigh8 ('H'), Rayleigh1('I'), Rayleigh1_corr('J'), Rayleigh1_anticorr('K'), Rice8('L'), Rice1('M'), AWGN('N'), Rayleigh1_orthogonal('P'), Rayleigh1_orth_eff_ch_TM4_prec_real ('Q'), Rayleigh1_orth_eff_ch_TM4_prec_imag ('R'), Rayleigh8_orth_eff_ch_TM4_prec_real ('S'),Rayleigh8_orth_eff_ch_TM4_prec_imag ('T'), EPA_low ('V'), EPA_medium ('W'), EPA_high ('X') \n");
+ printf("-F forgetting factor (0 new channel every trial, 1 channel constant\n");
+ printf("-x Transmission mode (1,2,6 for the moment)\n");
+ printf("-y Number of TX antennas used in eNB\n");
+ printf("-z Number of RX antennas used in UE\n");
+ printf("-t MCS of interfering UE\n");
+ printf("-R Number of HARQ rounds (fixed)\n");
+ printf("-A Turns on calibration mode for abstraction.\n");
+ printf("-N Determines the number of Channel Realizations in Abstraction mode. Default value is 1. \n");
+ printf("-O Set the percentage of effective rate to testbench the modem performance (typically 30 and 70, range 1-100) \n");
+ printf("-I Input filename for TrCH data (binary)\n");
+ printf("-u Receiver type: 0=standard, 1 = single stream IC (for TM3,4,5,6), 2 = dual stream IC (for TM3,4), 3 = SIC (for TM3,4) \n");
+ exit(1);
+ break;
+
+ }
+ }
+
+ if (common_flag == 0) {
+ switch (N_RB_DL) {
+ case 6:
+ if (rballocset==0) DLSCH_RB_ALLOC = 0x3f;
+ num_pdcch_symbols = 3;
+ break;
+
+ case 25:
+ if (rballocset==0) DLSCH_RB_ALLOC = 0x1fff;
+ break;
+
+ case 50:
+ if (rballocset==0) DLSCH_RB_ALLOC = 0x1ffff;
+ break;
+
+ case 100:
+ if (rballocset==0) DLSCH_RB_ALLOC = 0x1ffffff;
+ break;
+ }
+
+ NB_RB=conv_nprb(0,DLSCH_RB_ALLOC,N_RB_DL);
+ } else
+ NB_RB = 4;
+
+ NB_RB=conv_nprb(0,DLSCH_RB_ALLOC,N_RB_DL);
+
+
+ if (((transmission_mode==1) || (transmission_mode==2)) && (rx_type != rx_standard)) {
+ printf("only standard rx available for TM1 and TM2\n");
+ exit(-1);
+ }
+ if (((transmission_mode==5) || (transmission_mode==6)) && (rx_type > rx_IC_single_stream)) {
+ printf("only standard rx or single stream IC available for TM5 and TM6\n");
+ exit(-1);
+ }
+
+
+ if (xforms==1) {
+ fl_initialize (&argc, argv, NULL, 0, 0);
+ form_ue = create_lte_phy_scope_ue();
+ sprintf (title, "LTE PHY SCOPE eNB");
+ fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
+
+ /*
+ if (rx_type==rx_IC_single_stream) {
+ openair_daq_vars.use_ia_receiver = 1;
+ fl_set_button(form_ue->button_0,1);
+ fl_set_object_label(form_ue->button_0, "IA Receiver ON");
+ fl_set_object_color(form_ue->button_0, FL_GREEN, FL_GREEN);
+ }
+
+ */
+ }
+
+ if (transmission_mode==5) {
+ n_users = 2;
+ eNB_id_i = UE->n_connected_eNB;
+ //eNB_id_i=1;
+ }
+ else
+ eNB_id_i = eNB_id;
+
+ lte_param_init(n_tx_port,
+ n_tx_phy,
+ n_rx,
+ transmission_mode,
+ extended_prefix_flag,
+ frame_type,
+ Nid_cell,
+ tdd_config,
+ N_RB_DL,
+ threequarter_fs,
+ osf,
+ perfect_ce);
+
+
+ printf("Setting mcs1 = %d\n",mcs1);
+ printf("Setting mcs2 = %d\n",mcs2);
+ printf("NPRB = %d\n",NB_RB);
+ printf("n_frames = %d\n",n_frames);
+ printf("Transmission mode %d with %dx%d antenna configuration, Extended Prefix %d\n",transmission_mode,n_tx_phy,n_rx,extended_prefix_flag);
+ printf("Using receiver type %d\n", rx_type);
+ printf("TM1 shift %d\n", interf_unaw_shift);
+ //printf("Using I_UA rec shift layer 1 %d\n", interf_unaw_shift0);
+ //printf("Using I_UA rec shift layer 2 %d\n", interf_unaw_shift1);
+ snr1 = snr0+snr_int;
+ printf("SNR0 %f, SNR1 %f\n",snr0,snr1);
+
+ /*
+ txdataF = (int **)malloc16(2*sizeof(int*));
+ txdataF[0] = (int *)malloc16(FRAME_LENGTH_BYTES);
+ txdataF[1] = (int *)malloc16(FRAME_LENGTH_BYTES);
+
+ txdata = (int **)malloc16(2*sizeof(int*));
+ txdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES);
+ txdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES);
+ */
+
+ frame_parms = &eNB->frame_parms;
+
+
+ s_re = malloc(2*sizeof(double*)); //transmitted signal (Sent)
+ s_im = malloc(2*sizeof(double*));
+ r_re = malloc(2*sizeof(double*)); //received signal
+ r_im = malloc(2*sizeof(double*));
+ // r_re0 = malloc(2*sizeof(double*));
+ // r_im0 = malloc(2*sizeof(double*));
+
+ nsymb = (eNB->frame_parms.Ncp == 0) ? 14 : 12;
+
+
+ printf("Channel Model= (%s,%d)\n",channel_model_input, channel_model);
+ printf("SCM-A=%d, SCM-B=%d, SCM-C=%d, SCM-D=%d, EPA=%d, EVA=%d, ETU=%d, Rayleigh8=%d, Rayleigh1=%d, Rayleigh1_corr=%d, Rayleigh1_anticorr=%d, Rice1=%d, Rice8=%d, Rayleigh1_orthogonal=%d, Rayleigh1_orth_eff_ch_TM4_prec_real22=%d, Rayleigh1_orth_eff_ch_TM4_prec_imag=%d, Rayleigh8_orth_eff_ch_TM4_prec_real=%d, Rayleigh8_orth_eff_ch_TM4_prec_imag=%d , TS_SHIFT=%d\n",
+ SCM_A, SCM_B, SCM_C, SCM_D, EPA, EVA, ETU, Rayleigh8, Rayleigh1, Rayleigh1_corr, Rayleigh1_anticorr, Rice1, Rice8, Rayleigh1_orthogonal, Rayleigh1_orth_eff_ch_TM4_prec_real, Rayleigh1_orth_eff_ch_TM4_prec_imag, Rayleigh8_orth_eff_ch_TM4_prec_real, Rayleigh8_orth_eff_ch_TM4_prec_imag, TS_SHIFT);
+ if(transmission_mode==5)
+ sprintf(bler_fname,"bler_tx%d_rec%d_chan%d_nrx%d_mcs%d_mcsi%d_u%d_imod%d.csv",transmission_mode,rx_type,channel_model,n_rx,mcs1,mcs_i,rx_type,i_mod);
+ else if (abstx == 1){
+ if (perfect_ce==1)
+ sprintf(bler_fname,"bler_tx%d_r%d_ch%d_%d_nrx%d_rnd%d_mcs%d_mcsi%d_ab_pce_sh%d_rpmi%d.csv",transmission_mode,rx_type,channel_model,n_frames, n_rx, num_rounds, mcs1, mcs2,interf_unaw_shift, tpmi_retr);
+ else
+ sprintf(bler_fname,"bler_tx%d_r%d_ch%d_%d_nrx%d_rnd%d_mcs%d_mcsi%d_ab_sh%d_rtpmi%d.csv",transmission_mode,rx_type,channel_model, n_frames, n_rx, num_rounds, mcs1, mcs2,interf_unaw_shift, tpmi_retr);
+ }
+ else {//abstx=0
+ if (perfect_ce==1){
+ if (updated_csi==1){
+ sprintf(bler_fname,"bler_tx%d_r%d_ch%d_%d_nrx%d_rnd%d_mcs%d_mcsi%d_pce_sh%d_up_rtpmi%d.csv",transmission_mode,rx_type,channel_model,n_frames, n_rx, num_rounds, mcs1, mcs2, interf_unaw_shift, tpmi_retr);
+ }
+ else{
+ sprintf(bler_fname,"bler_tx%d_r%d_ch%d_%d_nrx%d_rnd%d_mcs%d_mcsi%d_pce_sh%d_rtpmi%d.csv",transmission_mode,rx_type, channel_model,n_frames, n_rx, num_rounds, mcs1, mcs2, interf_unaw_shift, tpmi_retr);
+ }
+ }
+ else{
+ if (updated_csi==1){
+ sprintf(bler_fname,"bler_tx%d_r%d_ch%d_%d_nrx%d_rnd%d_mcs%d_mcsi%d_sh%d_up_rtpmi%d.csv",transmission_mode,rx_type,channel_model,n_frames, n_rx, num_rounds, mcs1, mcs2, interf_unaw_shift, tpmi_retr);
+ }
+ else{
+ sprintf(bler_fname,"bler_tx%d_r%d_ch%d_%d_nrx%d_rnd%d_mcs%d_mcsi%d_sh%d_rtpmi%d.csv",transmission_mode,rx_type, channel_model,n_frames, n_rx, num_rounds, mcs1, mcs2, interf_unaw_shift, tpmi_retr);
+ }
+ }
+ }
+
+ bler_fd = fopen(bler_fname,"w");
+ if (bler_fd==NULL) {
+ fprintf(stderr,"Cannot create file %s!\n",bler_fname);
+ exit(-1);
+ }
+
+ if ((transmission_mode != 3) && (transmission_mode != 4))
+ fprintf(bler_fd,"SNR; MCS1; MCS2; TBS1; TBS2; rate 0; rate 1; err0_st1; err0_st2 trials0; err1_st1; err1_st2; trials1; err2_st1; err2_st2; trials2; err3_st1; err3_st2; trials3; throug 0; throug 1; sum throug; dci_err\n");
+ else if (rx_type == rx_SIC_dual_stream)
+ fprintf(bler_fd,"SNR; MCS1; MCS2; TBS1; TBS2; rate 0; rate 1; err0_tb0; err0_tb1; trials_tb0_r0; trials_tb1_r0; sic_att0; sic_suc0; ret_both0; ret_one0; err1_tb0; err1_tb1; trials_tb0_r1; trials_tb1_r1; sic_att1; sic_suc1; ret_both1; ret_one1; err2_tb0; err2_tb1; trials_tb0_r2; trials1_tb1_r2; sic_att2; sic_suc2; ret_both2; ret_one2; err3_tb0; err3_tb1; trials_tb0_r3; trials_tb1_r3; sic_att3; sic_suc3; th_tb0_r0; th_tb1_r0; th_sum_r0; th_tb0_r1; th_tb1_r1; th_sum_r1; th_tb0_r2; th_tb1_r2; th_sum_r2; th_tb0_r3; th_tb1_r3; th_sum_r3; tot_th\n");
+ else
+ fprintf(bler_fd,"SNR; MCS1; MCS2; TBS1; TBS2; rate 0; rate 1; err0_tb0; err0_tb1; trials_tb0_r0; trials_tb1_r0; deact_tb0_r0; deact_tb1_r0; ret_both0; ret_one0; err1_tb0; err1_tb1; trials_tb0_r1; trials_tb1_r1; deact_tb0_r1; deact_tb1_r1; ret_both1; ret_one1; err2_tb0; err2_tb1; trials_tb0_r2; trials1_tb1_r2; deact_tb0_r2; deact_tb1_r2; ret_both2; ret_one2; err3_tb0; err3_tb1; trials_tb0_r3; trials_tb1_r3; th_tb0_r0; th_tb1_r0; th_sum_r0; th_tb0_r1; th_tb1_r1; th_sum_r1; th_tb0_r2; th_tb1_r2; th_sum_r2; th_tb0_r3; th_tb1_r3; th_sum_r3; tot_th\n");
+
+ if (test_perf != 0) {
+
+ char hostname[1024];
+
+ hostname[1023] = '\0';
+ gethostname(hostname, 1023);
+ printf("Hostname: %s\n", hostname);
+ //char dirname[FILENAME_MAX];
+ //sprintf(dirname, "%s/SIMU/USER/pre-ci-logs-%s", getenv("OPENAIR_TARGETS"),hostname );
+ sprintf(time_meas_fname,"time_meas_prb%d_mcs%d_anttx%d_antrx%d_pdcch%d_channel%s_tx%d.csv",
+ N_RB_DL,mcs1,n_tx_phy,n_rx,num_pdcch_symbols,channel_model_input,transmission_mode);
+ //mkdir(dirname,0777);
+ time_meas_fd = fopen(time_meas_fname,"w");
+ if (time_meas_fd==NULL) {
+ fprintf(stderr,"Cannot create file %s!\n",time_meas_fname);
+ exit(-1);
+ }
+ }
+
+ if(abstx){
+ // CSV file // add here second stream mcs
+
+ if (transmission_mode == 5)
+ sprintf(csv_fname,"dataout_tx%d_u2%d_mcs%d_chan%d_nsimus%d_R%d_abstr.m",transmission_mode,rx_type,mcs1,channel_model,n_frames,num_rounds);
+
+ else
+ if (perfect_ce==1)
+ sprintf(csv_fname,"dout_tx%d_r%d_mcs%d_mcsi%d_ch%d_ns%d_R%d_pce_sh%d_%d_pnort_r45.m",transmission_mode,rx_type,mcs1,mcs2,channel_model,n_frames,num_rounds, interf_unaw_shift, n_ch_rlz);
+ else
+ sprintf(csv_fname,"dout_tx%d_r%d_mcs%d_mcsi%d_ch%d_ns%d_R%d_sh%d_%d_pnort_r45.m",transmission_mode,rx_type,mcs1,mcs2,channel_model,n_frames,num_rounds, interf_unaw_shift, n_ch_rlz);
+
+ csv_fd = fopen(csv_fname,"w");
+ fprintf(csv_fd,"data_all%d=[",mcs1);
+ if (csv_fd==NULL) {
+ fprintf(stderr,"Cannot create file %s!\n",csv_fname);
+ exit(-1);
+ }
+ }
+
+ for (i=0; i<2; i++) {
+ s_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
+ s_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
+ r_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
+ r_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
+ // r_re0[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
+ // bzero(r_re0[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
+ // r_im0[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
+ // bzero(r_im0[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
+ }
+
+ UE->pdcch_vars[0]->crnti = n_rnti;
+ UE->transmission_mode[eNB_id]=transmission_mode;
+ if (UE->transmission_mode[eNB_id] !=4)
+ UE->measurements.rank[eNB_id]=0;
+ else
+ UE->measurements.rank[eNB_id]=1;
+
+ // Fill in UL_alloc
+ UL_alloc_pdu.type = 0;
+ UL_alloc_pdu.hopping = 0;
+ UL_alloc_pdu.rballoc = UL_RB_ALLOC;
+ UL_alloc_pdu.mcs = 1;
+ UL_alloc_pdu.ndi = 1;
+ UL_alloc_pdu.TPC = 0;
+ UL_alloc_pdu.cqi_req = 1;
+
+ CCCH_alloc_pdu.type = 0;
+ CCCH_alloc_pdu.vrb_type = 0;
+ CCCH_alloc_pdu.rballoc = CCCH_RB_ALLOC;
+ CCCH_alloc_pdu.ndi = 1;
+ CCCH_alloc_pdu.mcs = 1;
+ CCCH_alloc_pdu.harq_pid = 0;
+
+ DLSCH_alloc_pdu2_1E[0].rah = 0;
+ DLSCH_alloc_pdu2_1E[0].rballoc = DLSCH_RB_ALLOC;
+ DLSCH_alloc_pdu2_1E[0].TPC = 0;
+ DLSCH_alloc_pdu2_1E[0].dai = 0;
+ DLSCH_alloc_pdu2_1E[0].harq_pid = 0;
+ //DLSCH_alloc_pdu2_1E[0].tb_swap = 0;
+ DLSCH_alloc_pdu2_1E[0].mcs = mcs1;
+ DLSCH_alloc_pdu2_1E[0].ndi = 1;
+ DLSCH_alloc_pdu2_1E[0].rv = 0;
+ // Forget second codeword
+ DLSCH_alloc_pdu2_1E[0].tpmi = (transmission_mode>=5 ? 5 : 0); // precoding
+ DLSCH_alloc_pdu2_1E[0].dl_power_off = (transmission_mode==5 ? 0 : 1);
+
+ DLSCH_alloc_pdu2_1E[1].rah = 0;
+ DLSCH_alloc_pdu2_1E[1].rballoc = DLSCH_RB_ALLOC;
+ DLSCH_alloc_pdu2_1E[1].TPC = 0;
+ DLSCH_alloc_pdu2_1E[1].dai = 0;
+ DLSCH_alloc_pdu2_1E[1].harq_pid = 0;
+ //DLSCH_alloc_pdu2_1E[1].tb_swap = 0;
+ DLSCH_alloc_pdu2_1E[1].mcs = mcs_i;
+ DLSCH_alloc_pdu2_1E[1].ndi = 1;
+ DLSCH_alloc_pdu2_1E[1].rv = 0;
+ // Forget second codeword
+ DLSCH_alloc_pdu2_1E[1].tpmi = (transmission_mode>=5 ? 5 : 0) ; // precoding
+ DLSCH_alloc_pdu2_1E[1].dl_power_off = (transmission_mode==5 ? 0 : 1);
+
+ eNB2UE[0] = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx,
+ UE->frame_parms.nb_antennas_rx,
+ channel_model,
+ N_RB2sampling_rate(eNB->frame_parms.N_RB_DL),
+ N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL),
+ forgetting_factor,
+ rx_sample_offset,
+ 0);
+
+ if(num_rounds>1) {
+ for(n=1; n<8; n++)
+ eNB2UE[n] = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx,
+ UE->frame_parms.nb_antennas_rx,
+ channel_model,
+ N_RB2sampling_rate(eNB->frame_parms.N_RB_DL),
+ N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL),
+ forgetting_factor,
+ rx_sample_offset,
+ 0);
+ }
+
+ if (eNB2UE[0]==NULL) {
+ msg("Problem generating channel model. Exiting.\n");
+ exit(-1);
+ }
+
+ if ((transmission_mode == 3) || (transmission_mode==4) || (transmission_mode==8))
+ Kmimo=2;
+ else
+ Kmimo=1;
+
+ switch (ue_category) {
+ case 1:
+ Nsoft = 250368;
+ break;
+ case 2:
+ case 3:
+ Nsoft = 1237248;
+ break;
+ case 4:
+ Nsoft = 1827072;
+ break;
+ default:
+ printf("Unsupported UE category %d\n",ue_category);
+ exit(-1);
+ break;
+ }
+
+ for (k=0; kdlsch[k][i] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0, &eNB->frame_parms);
+
+ if (!eNB->dlsch[k][i]) {
+
+ printf("Can't get eNB dlsch structures\n");
+ exit(-1);
+ }
+
+ eNB->dlsch[k][i]->rnti = n_rnti+k;
+ }
+ }
+
+ for (i=0; i<2; i++) {
+ UE->dlsch[0][i] = new_ue_dlsch(Kmimo,8,Nsoft,MAX_TURBO_ITERATIONS,N_RB_DL,0);
+
+ if (!UE->dlsch[0][i]) {
+
+ printf("Can't get ue dlsch structures\n");
+ exit(-1);
+ }
+
+ UE->dlsch[0][i]->rnti = n_rnti;
+ }
+
+ // structure for SIC at UE
+ UE->dlsch_eNB[0] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0, &eNB->frame_parms);
+
+ if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) {
+
+ eNB->UE_stats[0].DL_pmi_single = (unsigned short)(taus()&0xffff);
+
+ if (n_users>1)
+ eNB->UE_stats[1].DL_pmi_single = (eNB->UE_stats[0].DL_pmi_single ^ 0x1555); //opposite PMI
+ } else {
+ eNB->UE_stats[0].DL_pmi_single = 0;
+
+ if (n_users>1)
+ eNB->UE_stats[1].DL_pmi_single = 0;
+ }
+
+
+ sic_buffer = (int32_t **) malloc16(frame_parms->nb_antennas_tx*sizeof(int32_t *) );
+ for (i=0; inb_antennas_tx; i++) {
+ sic_buffer[i] = malloc16_clear(FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t));
+ }
+
+ if (input_fd==NULL) {
+
+ // UE specific DCI
+ for(k=0; kframe_parms.frame_type == TDD) {
+
+ switch (eNB->frame_parms.N_RB_DL) {
+
+ case 6:
+ dci_length = sizeof_DCI1_1_5MHz_TDD_t;
+ dci_length_bytes = sizeof(DCI1_1_5MHz_TDD_t);
+ ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0;
+ ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 25:
+ dci_length = sizeof_DCI1_5MHz_TDD_t;
+ dci_length_bytes = sizeof(DCI1_5MHz_TDD_t);
+ ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0;
+ ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 50:
+ dci_length = sizeof_DCI1_10MHz_TDD_t;
+ dci_length_bytes = sizeof(DCI1_10MHz_TDD_t);
+ ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0;
+ ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 100:
+ ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0;
+ ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ dci_length = sizeof_DCI1_20MHz_TDD_t;
+ dci_length_bytes = sizeof(DCI1_20MHz_TDD_t);
+ break;
+ }
+ }
+ else { //fdd
+
+ switch (eNB->frame_parms.N_RB_DL) {
+
+ case 6:
+ dci_length = sizeof_DCI1_1_5MHz_FDD_t;
+ dci_length_bytes = sizeof(DCI1_1_5MHz_FDD_t);
+ ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0;
+ ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 25:
+ dci_length = sizeof_DCI1_5MHz_FDD_t;
+ dci_length_bytes = sizeof(DCI1_5MHz_FDD_t);
+ ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0;
+ ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 50:
+ dci_length = sizeof_DCI1_10MHz_FDD_t;
+ dci_length_bytes = sizeof(DCI1_10MHz_FDD_t);
+ ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0;
+ ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 100:
+ dci_length = sizeof_DCI1_20MHz_FDD_t;
+ dci_length_bytes = sizeof(DCI1_20MHz_FDD_t);
+ ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0;
+ ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ }
+ }
+ memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes);
+ dci_alloc[num_dci].dci_length = dci_length;
+ dci_alloc[num_dci].L = 1;
+ dci_alloc[num_dci].rnti = n_rnti+k;
+ dci_alloc[num_dci].format = format1;
+
+ dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]);
+
+
+ printf("Generating dlsch params for user %d\n",k);
+ generate_eNB_dlsch_params_from_dci(0,
+ subframe,
+ &DLSCH_alloc_pdu_1[0],
+ n_rnti+k,
+ format1,
+ eNB->dlsch[0],
+ &eNB->frame_parms,
+ eNB->pdsch_config_dedicated,
+ SI_RNTI,
+ 0,
+ P_RNTI,
+ eNB->UE_stats[0].DL_pmi_single,
+ transmission_mode>=7?transmission_mode:0);
+ num_dci++;
+ num_ue_spec_dci++;
+ }
+ else { //common flag =1
+ if (eNB->frame_parms.frame_type == TDD) {
+
+ switch (eNB->frame_parms.N_RB_DL) {
+
+ case 6:
+ dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t;
+ dci_length_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t);
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 25:
+ dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t;
+ dci_length_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t);
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 50:
+ dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t;
+ dci_length_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t);
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 100:
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t;
+ dci_length_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t);
+ break;
+ }
+ }
+ else { // fdd
+ switch (eNB->frame_parms.N_RB_DL) {
+ case 6:
+ dci_length = sizeof_DCI1A_1_5MHz_FDD_t;
+ dci_length_bytes = sizeof(DCI1A_1_5MHz_FDD_t);
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 25:
+ dci_length = sizeof_DCI1A_5MHz_FDD_t;
+ dci_length_bytes = sizeof(DCI1A_5MHz_FDD_t);
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 50:
+ dci_length = sizeof_DCI1A_10MHz_FDD_t;
+ dci_length_bytes = sizeof(DCI1A_10MHz_FDD_t);
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 100:
+ dci_length = sizeof_DCI1A_20MHz_FDD_t;
+ dci_length_bytes = sizeof(DCI1A_20MHz_FDD_t);
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ }
+ }
+ memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes);
+ dci_alloc[num_dci].dci_length = dci_length;
+ dci_alloc[num_dci].L = 1;
+ dci_alloc[num_dci].rnti = SI_RNTI;
+ dci_alloc[num_dci].format = format1A;
+ dci_alloc[num_dci].firstCCE = 0;
+ dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]);
+ printf("Generating dlsch params for user %d\n",k);
+ generate_eNB_dlsch_params_from_dci(0,
+ subframe,
+ &DLSCH_alloc_pdu_1[0],
+ SI_RNTI,
+ format1A,
+ eNB->dlsch[0],
+ &eNB->frame_parms,
+ eNB->pdsch_config_dedicated,
+ SI_RNTI,
+ 0,
+ P_RNTI,
+ eNB->UE_stats[0].DL_pmi_single,
+ transmission_mode>=7?transmission_mode:0);
+
+ num_common_dci++;
+ num_dci++;
+
+ }
+ break;
+ case 3: //LARGE CDD
+ if (common_flag == 0) {
+
+ if (eNB->frame_parms.nb_antennas_tx == 2) {
+
+ if (eNB->frame_parms.frame_type == TDD) {
+
+ switch (eNB->frame_parms.N_RB_DL) {
+ case 6:
+ dci_length = sizeof_DCI2A_1_5MHz_2A_TDD_t;
+ dci_length_bytes = sizeof(DCI2A_1_5MHz_2A_TDD_t);
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1;
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1;
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0;
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2;
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1;
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0;
+ break;
+ case 25:
+ dci_length = sizeof_DCI2A_5MHz_2A_TDD_t;
+ dci_length_bytes = sizeof(DCI2A_5MHz_2A_TDD_t);
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0;
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1;
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1;
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0;
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2;
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1;
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0;
+ break;
+ case 50:
+ dci_length = sizeof_DCI2A_10MHz_2A_TDD_t;
+ dci_length_bytes = sizeof(DCI2A_10MHz_2A_TDD_t);
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0;
+ break;
+ case 100:
+ ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0;
+ ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1;
+ ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1;
+ ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0;
+ ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2;
+ ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1;
+ ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0;
+ dci_length = sizeof_DCI2A_20MHz_2A_TDD_t;
+ dci_length_bytes = sizeof(DCI2A_20MHz_2A_TDD_t);
+ break;
+ }
+ }
+
+ else { // fdd
+ switch (eNB->frame_parms.N_RB_DL) {
+ case 6:
+ dci_length = sizeof_DCI2A_1_5MHz_2A_FDD_t;
+ dci_length_bytes = sizeof(DCI2A_1_5MHz_2A_FDD_t);
+ ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1;
+ ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1;
+ ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0;
+ ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2;
+ ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1;
+ ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0;
+ break;
+ case 25:
+ dci_length = sizeof_DCI2A_5MHz_2A_FDD_t;
+ dci_length_bytes = sizeof(DCI2A_5MHz_2A_FDD_t);
+ ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0;
+ ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1;
+ ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1;
+ ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0;
+ ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2;
+ ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1;
+ ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0;
+ break;
+ case 50:
+ dci_length = sizeof_DCI2A_10MHz_2A_FDD_t;
+ dci_length_bytes = sizeof(DCI2A_10MHz_2A_FDD_t);
+ ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0;
+ ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1;
+ ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1;
+ ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0;
+ ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2;
+ ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1;
+ ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0;
+ break;
+ case 100:
+ dci_length = sizeof_DCI2A_20MHz_2A_FDD_t;
+ dci_length_bytes = sizeof(DCI2A_20MHz_2A_FDD_t);
+ ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0;
+ ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1;
+ ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1;
+ ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0;
+ ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2;
+ ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1;
+ ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0;
+ break;
+ }
+ }
+ }
+ else if (eNB->frame_parms.nb_antennas_tx == 4) { //4 antenna, needs diff precoding codebook index depeneding on layers
+
+
+ }
+
+ memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes);
+ dci_alloc[num_dci].dci_length = dci_length;
+ dci_alloc[num_dci].L = 1;
+ dci_alloc[num_dci].rnti = n_rnti+k;
+ dci_alloc[num_dci].format = format2A;
+ dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]);
+
+
+ printf("Generating dlsch params for user %d / format 2A (%d)\n",k,format2A);
+ generate_eNB_dlsch_params_from_dci(0,
+ subframe,
+ &DLSCH_alloc_pdu_1[0],
+ n_rnti+k,
+ format2A,
+ eNB->dlsch[0],
+ &eNB->frame_parms,
+ eNB->pdsch_config_dedicated,
+ SI_RNTI,
+ 0,
+ P_RNTI,
+ eNB->UE_stats[0].DL_pmi_single,
+ transmission_mode>=7?transmission_mode:0);
+
+ num_dci++;
+ num_ue_spec_dci++;
+ }
+ else { //commonn flag 1
+ if (eNB->frame_parms.frame_type == TDD) { //tdd
+
+ switch (eNB->frame_parms.N_RB_DL) {
+
+ case 6:
+ dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t;
+ dci_length_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t);
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 25:
+ dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t;
+ dci_length_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t);
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 50:
+ dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t;
+ dci_length_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t);
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 100:
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t;
+ dci_length_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t);
+ break;
+ }
+ }
+ else { //fdd
+ switch (eNB->frame_parms.N_RB_DL) {
+ case 6:
+ dci_length = sizeof_DCI1A_1_5MHz_FDD_t;
+ dci_length_bytes = sizeof(DCI1A_1_5MHz_FDD_t);
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 25:
+ dci_length = sizeof_DCI1A_5MHz_FDD_t;
+ dci_length_bytes = sizeof(DCI1A_5MHz_FDD_t);
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 50:
+ dci_length = sizeof_DCI1A_10MHz_FDD_t;
+ dci_length_bytes = sizeof(DCI1A_10MHz_FDD_t);
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 100:
+ dci_length = sizeof_DCI1A_20MHz_FDD_t;
+ dci_length_bytes = sizeof(DCI1A_20MHz_FDD_t);
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ }
+ }
+ memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes);
+ dci_alloc[num_dci].dci_length = dci_length;
+ dci_alloc[num_dci].L = 1;
+ dci_alloc[num_dci].rnti = SI_RNTI;
+ dci_alloc[num_dci].format = format1A;
+ dci_alloc[num_dci].firstCCE = 0;
+ dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]);
+
+ printf("Generating dlsch params for user %d\n",k);
+ generate_eNB_dlsch_params_from_dci(0,
+ subframe,
+ &DLSCH_alloc_pdu_1[0],
+ SI_RNTI,
+ format1A,
+ eNB->dlsch[0],
+ &eNB->frame_parms,
+ eNB->pdsch_config_dedicated,
+ SI_RNTI,
+ 0,
+ P_RNTI,
+ eNB->UE_stats[0].DL_pmi_single,
+ transmission_mode>=7?transmission_mode:0);
+
+ num_common_dci++;
+ num_dci++;
+
+ }
+ printf("Generated DCI format 2A (Transmission Mode 3)\n");
+ break;
+
+ case 4: // !!! this dci format contains precoder information
+ if (common_flag == 0) {
+
+ if (eNB->frame_parms.nb_antennas_tx == 2) {
+
+ if (eNB->frame_parms.frame_type == TDD) {
+
+ switch (eNB->frame_parms.N_RB_DL) {
+
+ case 6:
+ dci_length = sizeof_DCI2_1_5MHz_2A_TDD_t;
+ dci_length_bytes = sizeof(DCI2_1_5MHz_2A_TDD_t);
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tb_swap = 0;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi = 2;
+ break;
+ case 25:
+ dci_length = sizeof_DCI2_5MHz_2A_TDD_t;
+ dci_length_bytes = sizeof(DCI2_5MHz_2A_TDD_t);
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tb_swap = 0;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi = 2;
+
+ break;
+ case 50:
+ dci_length = sizeof_DCI2_10MHz_2A_TDD_t;
+ dci_length_bytes = sizeof(DCI2_10MHz_2A_TDD_t);
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tb_swap = 0;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi = 2;
+
+ break;
+ case 100:
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tb_swap = 0;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi = 2;
+ dci_length = sizeof_DCI2_20MHz_2A_TDD_t;
+ dci_length_bytes = sizeof(DCI2_20MHz_2A_TDD_t);
+ break;
+ }
+ }
+
+ else {
+
+ switch (eNB->frame_parms.N_RB_DL) {
+
+ case 6:
+ dci_length = sizeof_DCI2_1_5MHz_2A_FDD_t;
+ dci_length_bytes = sizeof(DCI2_1_5MHz_2A_FDD_t);
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tb_swap = 0;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi = 2;
+ break;
+ case 25:
+ dci_length = sizeof_DCI2_5MHz_2A_FDD_t;
+ dci_length_bytes = sizeof(DCI2_5MHz_2A_FDD_t);
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tb_swap = 0;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi = 2;
+ break;
+ case 50:
+ dci_length = sizeof_DCI2_10MHz_2A_FDD_t;
+ dci_length_bytes = sizeof(DCI2_10MHz_2A_FDD_t);
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tb_swap = 0;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi = 2;
+ break;
+ case 100:
+ dci_length = sizeof_DCI2_20MHz_2A_FDD_t;
+ dci_length_bytes = sizeof(DCI2_20MHz_2A_FDD_t);
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tb_swap = 0;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi = 2;
+ break;
+ }
+ }
+ }
+ else if (eNB->frame_parms.nb_antennas_tx == 4) {
+
+
+ }
+
+ printf ("TM4 with tpmi =%d\n", ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi);
+ if ((((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 2) || (((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 2)) {
+
+ eNB->UE_stats[0].DL_pmi_single = (unsigned short)(taus()&0xffff);
+
+
+ }
+
+ memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes);
+ dci_alloc[num_dci].dci_length = dci_length;
+ dci_alloc[num_dci].L = 1;
+ dci_alloc[num_dci].rnti = n_rnti+k;
+ dci_alloc[num_dci].format = format2;
+ dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]);
+
+
+ printf("Generating dlsch params for user %d\n",k);
+ generate_eNB_dlsch_params_from_dci(0,
+ subframe,
+ &DLSCH_alloc_pdu_1[0],
+ n_rnti+k,
+ format2,
+ eNB->dlsch[0],
+ &eNB->frame_parms,
+ eNB->pdsch_config_dedicated,
+ SI_RNTI,
+ 0,
+ P_RNTI,
+ eNB->UE_stats[0].DL_pmi_single,
+ transmission_mode>=7?transmission_mode:0);
+
+ num_dci++;
+ num_ue_spec_dci++;
+ }
+ else { //common_flag==1
+ if (eNB->frame_parms.frame_type == TDD) {
+
+ switch (eNB->frame_parms.N_RB_DL) {
+ case 6:
+ dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t;
+ dci_length_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t);
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 25:
+ dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t;
+ dci_length_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t);
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 50:
+ dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t;
+ dci_length_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t);
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 100:
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0;
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t;
+ dci_length_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t);
+ break;
+ }
+ }
+ else {
+
+ switch (eNB->frame_parms.N_RB_DL) {
+ case 6:
+ dci_length = sizeof_DCI1A_1_5MHz_FDD_t;
+ dci_length_bytes = sizeof(DCI1A_1_5MHz_FDD_t);
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 25:
+ dci_length = sizeof_DCI1A_5MHz_FDD_t;
+ dci_length_bytes = sizeof(DCI1A_5MHz_FDD_t);
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 50:
+ dci_length = sizeof_DCI1A_10MHz_FDD_t;
+ dci_length_bytes = sizeof(DCI1A_10MHz_FDD_t);
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ case 100:
+ dci_length = sizeof_DCI1A_20MHz_FDD_t;
+ dci_length_bytes = sizeof(DCI1A_20MHz_FDD_t);
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1;
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0;
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC;
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0;
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1;
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1;
+ ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0;
+ break;
+ }
+ }
+ memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes);
+ dci_alloc[num_dci].dci_length = dci_length;
+ dci_alloc[num_dci].L = 1;
+ dci_alloc[num_dci].rnti = SI_RNTI;
+ dci_alloc[num_dci].format = format1A;
+ dci_alloc[num_dci].firstCCE = 0;
+ dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]);
+
+ printf("Generating dlsch params for user %d\n",k);
+ generate_eNB_dlsch_params_from_dci(0,
+ subframe,
+ &DLSCH_alloc_pdu_1[0],
+ SI_RNTI,
+ format1A,
+ eNB->dlsch[0],
+ &eNB->frame_parms,
+ eNB->pdsch_config_dedicated,
+ SI_RNTI,
+ 0,
+ P_RNTI,
+ eNB->UE_stats[0].DL_pmi_single,
+ transmission_mode>=7?transmission_mode:0);
+
+ num_common_dci++;
+ num_dci++;
+
+ }
+ break;
+
+ case 5:
+ case 6:
+ memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu2_1E[k],sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
+ dci_alloc[num_dci].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t;
+ dci_alloc[num_dci].L = 1;
+ dci_alloc[num_dci].rnti = n_rnti+k;
+ dci_alloc[num_dci].format = format1E_2A_M10PRB;
+ dci_alloc[num_dci].firstCCE = 4*k;
+ printf("Generating dlsch params for user %d\n",k);
+ generate_eNB_dlsch_params_from_dci(0,
+ subframe,
+ &DLSCH_alloc_pdu2_1E[k],
+ n_rnti+k,
+ format1E_2A_M10PRB,
+ eNB->dlsch[k],
+ &eNB->frame_parms,
+ eNB->pdsch_config_dedicated,
+ SI_RNTI,
+ 0,
+ P_RNTI,
+ eNB->UE_stats[k].DL_pmi_single,
+ transmission_mode>=7?transmission_mode:0);
+
+ dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]);
+ num_ue_spec_dci++;
+ num_dci++;
+
+ break;
+
+ default:
+ printf("Unsupported Transmission Mode!!!");
+ exit(-1);
+ break;
+ }
+
+
+
+
+ /*
+ memcpy(&dci_alloc[1].dci_pdu[0],&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD0_t));
+ dci_alloc[1].dci_length = sizeof_DCI0_5MHz_TDD_0_t;
+ dci_alloc[1].L = 2;
+ dci_alloc[1].rnti = n_rnti;
+ */
+ }
+
+ if (n_frames==1)
+ printf("num_pdcch_symbols %d, numCCE %d => ",num_pdcch_symbols,numCCE);
+
+ numCCE = get_nCCE(num_pdcch_symbols,&eNB->frame_parms,get_mi(&eNB->frame_parms,subframe));
+
+
+ if (n_frames==1)
+ printf("%d\n",numCCE);
+
+ // apply RNTI-based nCCE allocation
+ memset(CCE_table,0,800*sizeof(int));
+
+ for (i=num_common_dci; idlsch[k][0]->harq_processes[0]->TBS/8;
+ input_buffer0[k] = (unsigned char *)malloc(input_buffer_length0+4);
+ memset(input_buffer0[k],0,input_buffer_length0+4);
+ input_buffer_length1 = eNB->dlsch[k][1]->harq_processes[0]->TBS/8;
+ input_buffer1[k] = (unsigned char *)malloc(input_buffer_length1+4);
+ memset(input_buffer1[k],0,input_buffer_length1+4);
+
+ if (input_trch_file==0) {
+ for (i=0; i>3]+=(1<<(7-(i&7)));
+
+ if (i<16)
+ printf("input_trch_val %d : %c\n",i,input_trch_val[0]);
+
+ i++;
+
+ if (((i%8) == 0) && (i<17))
+ printf("%x\n",input_buffer0[k][(i-1)>>3]);
+ }
+
+ printf("Read in %d bits\n",i);
+ }
+ }
+ }
+
+ snr_step = input_snr_step;
+ UE->high_speed_flag = 1;
+ UE->ch_est_alpha=0;
+
+ for (ch_realization=0; ch_realizationproc.proc_rxtx[0].frame_rx=0;
+ for (i=0; i<4; i++) {
+ errs[0][i]=0; //CW_0
+ errs[1][i]=0; //CW_1
+ decoded_in_sic[i]=0;
+ sic_attempt[i]=0;
+ resend_one[i]=0;
+ resend_both[i]=0;
+
+ round_trials[0][i] = 0; // CW_0
+ round_trials[1][i] = 0; // CW_1
+ TB0_deact[i]=0;
+ TB1_deact[i]=0;
+ }
+ dci_errors=0;
+
+ round = 0;
+
+ avg_iter[0] = 0;
+ avg_iter[1] = 0;
+ iter_trials[0]=0;
+ iter_trials[1]=0;
+
+ reset_meas(&eNB->phy_proc_tx); // total eNB tx
+ reset_meas(&eNB->dlsch_scrambling_stats);
+ reset_meas(&UE->dlsch_unscrambling_stats);
+ reset_meas(&eNB->ofdm_mod_stats);
+ reset_meas(&eNB->dlsch_modulation_stats);
+ reset_meas(&eNB->dlsch_encoding_stats);
+ reset_meas(&eNB->dlsch_interleaving_stats);
+ reset_meas(&eNB->dlsch_rate_matching_stats);
+ reset_meas(&eNB->dlsch_turbo_encoding_stats);
+
+ reset_meas(&UE->phy_proc_rx); // total UE rx
+ reset_meas(&UE->ofdm_demod_stats);
+ reset_meas(&UE->dlsch_channel_estimation_stats);
+ reset_meas(&UE->dlsch_freq_offset_estimation_stats);
+ reset_meas(&UE->rx_dft_stats);
+ reset_meas(&UE->dlsch_llr_stats);
+ reset_meas(&UE->dlsch_decoding_stats);
+ reset_meas(&UE->dlsch_turbo_decoding_stats);
+ reset_meas(&UE->dlsch_deinterleaving_stats);
+ reset_meas(&UE->dlsch_rate_unmatching_stats);
+ reset_meas(&UE->dlsch_tc_init_stats);
+ reset_meas(&UE->dlsch_tc_alpha_stats);
+ reset_meas(&UE->dlsch_tc_beta_stats);
+ reset_meas(&UE->dlsch_tc_gamma_stats);
+ reset_meas(&UE->dlsch_tc_ext_stats);
+ reset_meas(&UE->dlsch_tc_intl1_stats);
+ reset_meas(&UE->dlsch_tc_intl2_stats);
+
+ // initialization
+ struct list time_vector_tx;
+ initialize(&time_vector_tx);
+ struct list time_vector_tx_ifft;
+ initialize(&time_vector_tx_ifft);
+ struct list time_vector_tx_mod;
+ initialize(&time_vector_tx_mod);
+ struct list time_vector_tx_enc;
+ initialize(&time_vector_tx_enc);
+
+ struct list time_vector_rx;
+ initialize(&time_vector_rx);
+ struct list time_vector_rx_fft;
+ initialize(&time_vector_rx_fft);
+ struct list time_vector_rx_demod;
+ initialize(&time_vector_rx_demod);
+ struct list time_vector_rx_dec;
+ initialize(&time_vector_rx_dec);
+
+ for (trials = 0;trialsnb_antennas_tx; i++) {
+ memset(sic_buffer[i], 0, FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t));
+ }
+
+ eNB2UE[0]->first_run = 1;
+
+ ret[0] = UE->dlsch[0][0]->max_turbo_iterations+1;
+ ret[1] = UE->dlsch[0][0]->max_turbo_iterations+1;
+
+ resend_cw0_cw1=1;
+ resend_cw1=0;
+ TB0_active=1;
+ TB1_active=1;
+
+ while (((transmission_mode == 3 || transmission_mode == 4) &&
+ ((round < num_rounds) && ((ret[0] > UE->dlsch[0][0]->max_turbo_iterations) ||
+ (ret[1] > UE->dlsch[0][0]->max_turbo_iterations)))) ||
+ ((transmission_mode!=4 && transmission_mode != 3) && ((round< num_rounds) &&
+ (ret[0] > UE->dlsch[0][0]->max_turbo_iterations)))) {
+#ifdef DEBUG_HARQ
+ printf("\n [DLSIM] On top round is %d\n", round);
+#endif
+
+
+ round_trials[0][round]++;
+ round_trials[1][round]++;
+
+ //printf("Trial %d, round %d , ret[0] %d, ret[1] %d, round_trials %d\n",trials,round, ret[0], ret[1], round_trials[round]);
+
+ /*if (ret[0] > UE->dlsch[0][0]->max_turbo_iterations) {
+ round_trials[0][round]++;
+ round_trials[1][round]++;
+ } else if ((ret[1] > UE->dlsch[0][0]->max_turbo_iterations) && (ret[0] <= UE->dlsch[0][0]->max_turbo_iterations))
+ round_trials[1][round]++;*/
+
+
+#ifdef DEBUG_HARQ
+ printf("[DLSIM] Just after while loop TB0 status %d TB1 status %d round %d\n", TB0_active, TB1_active, round);
+#endif
+
+ // printf("Trial %d, round %d , ret[0] %d, ret[1] %d, round_trials TB0 = %d, round_trials TB1 = %d \n",trials,round, ret[0], ret[1], round_trials[0][round], round_trials[1][round]);
+
+
+ /*printf("Trial %d, round cw0 = %d , round cw1 = %d, ret[0] = %d, ret[1] = %d, round_trials cw0 [%d]= %d, round_trials cw1 [%d]= %d\n",trials, round, round, \
+ ret[0], ret[1], round, round_trials[0][round], round, round_trials[1][round]);*/
+
+ //printf("round_trials %d round %d\n", round_trials[round], round);
+
+ if (transmission_mode == 4 || transmission_mode == 5 || transmission_mode == 6)
+ pmi_feedback=1;
+ else
+ pmi_feedback=0;
+
+ if (abstx) {
+ if (trials==0 && round==0 && SNR==snr0) //generate a new channel
+ hold_channel = 0;
+ else
+ hold_channel = 1;
+ }
+ else
+ hold_channel = 0;//(round==0) ? 0 : 1;
+
+ PMI_FEEDBACK:
+
+ //printf("Trial %d : Round %d, pmi_feedback %d \n",trials,round,pmi_feedback);
+ for (aa=0; aaframe_parms.nb_antennas_tx;aa++) {
+ memset(&eNB->common_vars.txdataF[eNB_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t));
+ }
+
+ if (input_fd==NULL) {
+
+ start_meas(&eNB->phy_proc_tx);
+
+ // Simulate HARQ procedures!!!
+ if (common_flag == 0) {
+
+ eNB->dlsch[0][0]->harq_processes[0]->rvidx = round&3;
+ if (transmission_mode == 3 || transmission_mode == 4)
+ eNB->dlsch[0][1]->harq_processes[0]->rvidx = round&3;
+
+ if (round == 0) { // First round
+ TB0_active = 1;
+ TB1_active = 1;
+
+ if (eNB->frame_parms.frame_type == TDD) {
+
+ switch (transmission_mode) {
+ case 1:
+ case 2:
+ switch (eNB->frame_parms.N_RB_DL) {
+ case 6:
+ ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1;
+ ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_1_5MHz_TDD_t));
+ break;
+ case 25:
+ ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1;
+ ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_5MHz_TDD_t));
+ break;
+ case 50:
+ ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1;
+ ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_10MHz_TDD_t));
+ break;
+ case 100:
+ ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1;
+ ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_20MHz_TDD_t));
+ break;
+ }
+ break;
+ case 3:
+ switch (eNB->frame_parms.N_RB_DL) {
+ case 6:
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0;
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_TDD_t));
+ break;
+ case 25:
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0;
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_TDD_t));
+ break;
+ case 50:
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_TDD_t));
+ break;
+ case 100:
+ ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0;
+ ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_TDD_t));
+ break;
+ }
+ break;
+ case 4:
+ switch (eNB->frame_parms.N_RB_DL) {
+ case 6:
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_1_5MHz_2A_TDD_t));
+ break;
+ case 25:
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_5MHz_2A_TDD_t));
+ break;
+ case 50:
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_10MHz_2A_TDD_t));
+ break;
+ case 100:
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_20MHz_2A_TDD_t));
+ break;
+ }
+ break;
+ case 5:
+ case 6:
+ DLSCH_alloc_pdu2_1E[0].ndi = trials&1;
+ DLSCH_alloc_pdu2_1E[0].rv = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu2_1E[0],sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
+ break;
+ }
+ }
+ else { // FDD
+ switch (transmission_mode) {
+ case 1:
+ case 2:
+ switch (eNB->frame_parms.N_RB_DL) {
+ case 6:
+ ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1;
+ ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_1_5MHz_FDD_t));
+ break;
+ case 25:
+ ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1;
+ ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_5MHz_FDD_t));
+ break;
+ case 50:
+ ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1;
+ ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_10MHz_FDD_t));
+ break;
+ case 100:
+ ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1;
+ ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_20MHz_FDD_t));
+ break;
+ }
+ break;
+ case 3:
+ switch (eNB->frame_parms.N_RB_DL) {
+ case 6:
+ ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0;
+ ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_FDD_t));
+ break;
+ case 25:
+ ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0;
+ ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_FDD_t));
+ break;
+ case 50:
+ ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0;
+ ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_FDD_t));
+ break;
+ case 100:
+ ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0;
+ ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_FDD_t));
+ break;
+ }
+ break;
+ case 4:
+ switch (eNB->frame_parms.N_RB_DL) {
+ case 6:
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_1_5MHz_2A_FDD_t));
+ break;
+ case 25:
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_5MHz_2A_FDD_t));
+ break;
+ case 50:
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_10MHz_2A_FDD_t));
+ break;
+ case 100:
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_20MHz_2A_FDD_t));
+ break;
+ }
+ break;
+ case 5:
+ case 6:
+ DLSCH_alloc_pdu2_1E[0].ndi = trials&1;
+ DLSCH_alloc_pdu2_1E[0].rv = 0;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu2_1E[0],sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
+ break;
+ }
+ }
+ }
+ else {
+
+ if (eNB->frame_parms.frame_type == TDD) {
+ switch (transmission_mode) {
+ case 1:
+ case 2:
+ switch (eNB->frame_parms.N_RB_DL) {
+ case 6:
+ ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1;
+ ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3;;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_1_5MHz_TDD_t));
+ break;
+ case 25:
+ ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1;
+ ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_5MHz_TDD_t));
+ break;
+ case 50:
+ ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1;
+ ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_10MHz_TDD_t));
+ break;
+ case 100:
+ ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1;
+ ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_20MHz_TDD_t));
+ break;
+ }
+ break;
+ case 3:
+ switch (eNB->frame_parms.N_RB_DL) {
+ case 6:
+ if (TB0_active == 1 && TB1_active == 1) {
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else if (TB0_active == 0) { // deactivate TB0
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else { // deactivate TB1
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0;
+ ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1;
+ }
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_TDD_t));
+ break;
+ case 25:
+ if (TB0_active == 1 && TB1_active == 1) {
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else if (TB0_active == 0) { // deactivate TB0
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else { // deactivate TB1
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0;
+ ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1;
+ }
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_TDD_t));
+ break;
+ case 50:
+ if (TB0_active == 1 && TB1_active == 1) {
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else if (TB0_active == 0){ // deactivate TB0
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else { // deactivate TB1
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1;
+ }
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_TDD_t));
+ break;
+ case 100:
+ if (TB0_active == 1 && TB1_active == 1) {
+ ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else if (TB0_active == 0){ // deactivate TB0
+ ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
+ ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
+ ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else { // deactivate TB1
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0;
+ ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1;
+ }
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_TDD_t));
+ break;
+ }
+ break;
+ case 4:
+ switch (eNB->frame_parms.N_RB_DL) {
+ case 6:
+ if (TB0_active == 1 && TB1_active == 1) {
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else if (TB0_active == 0){ // deactivate TB0
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else { // deactivate TB1
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1;
+ }
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_1_5MHz_2A_TDD_t));
+ break;
+ case 25:
+ if (TB0_active == 1 && TB1_active == 1) {
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else if (TB0_active == 0){ // deactivate TB0
+#ifdef DEBUG_HARQ
+ printf("\n[DLSIM] Requesting only TB1 from temp DCI\n");
+#endif
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else { // deactivate TB1
+#ifdef DEBUG_HARQ
+ printf("\n[DLSIM] TDD Requesting only TB0 from temp DCI\n");
+#endif
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0;
+ ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1;
+ }
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_5MHz_2A_TDD_t));
+ generate_eNB_dlsch_params_from_dci(0,
+ subframe,
+ &DLSCH_alloc_pdu_1[0],
+ n_rnti+k,
+ format2,
+ eNB->dlsch[0],
+ &eNB->frame_parms,
+ eNB->pdsch_config_dedicated,
+ SI_RNTI,
+ 0,
+ P_RNTI,
+ UE->dlsch[0][1]->pmi_alloc,
+ transmission_mode>=7?transmission_mode:0
+ );
+ break;
+ case 50:
+ if (TB0_active == 1 && TB1_active == 1) {
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else if (TB0_active == 0){ // deactivate TB0
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else { // deactivate TB1
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1;
+ }
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_10MHz_2A_TDD_t));
+ break;
+ case 100:
+ if (TB0_active == 1 && TB1_active == 1) {
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else if (TB0_active == 0){ // deactivate TB0
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else { // deactivate TB1
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1;
+ }
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_20MHz_2A_TDD_t));
+ break;
+ }
+ break;
+
+ case 5:
+ case 6:
+ DLSCH_alloc_pdu2_1E[0].ndi = trials&1;
+ DLSCH_alloc_pdu2_1E[0].rv = round&3;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu2_1E[0],sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
+ break;
+ }
+ }
+ else {
+ switch (transmission_mode) {
+ case 1:
+ case 2:
+ switch (eNB->frame_parms.N_RB_DL) {
+ case 6:
+ ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1;
+ ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3;;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_1_5MHz_FDD_t));
+ break;
+ case 25:
+ ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1;
+ ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_5MHz_FDD_t));
+ break;
+ case 50:
+ ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1;
+ ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_10MHz_FDD_t));
+ break;
+ case 100:
+ ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1;
+ ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_20MHz_FDD_t));
+ break;
+ }
+ break;
+ case 3:
+ switch (eNB->frame_parms.N_RB_DL) {
+ case 6:
+ if (TB0_active==1) {
+ ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else { // deactivate TB0
+ ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
+ ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
+ ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_FDD_t));
+ break;
+ case 25:
+ if (TB0_active==1) {
+ ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else { // deactivate TB0
+ ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
+ ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
+ ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_FDD_t));
+ break;
+ case 50:
+ if (TB0_active==1) {
+ ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else { // deactivate TB0
+ ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
+ ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
+ ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_FDD_t));
+ break;
+ case 100:
+ if (TB0_active==1) {
+ ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else { // deactivate TB0
+ ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
+ ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
+ ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_FDD_t));
+ break;
+ }
+ break;
+ case 4:
+ switch (eNB->frame_parms.N_RB_DL) {
+ case 6:
+ if (TB0_active == 1 && TB1_active == 1) {
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else if (TB0_active == 0){ // deactivate TB0
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else { // deactivate TB1
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0;
+ ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1;
+ }
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_1_5MHz_2A_FDD_t));
+ break;
+ case 25:
+ if (TB0_active == 1 && TB1_active == 1) {
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else if (TB0_active == 0){ // deactivate TB0
+#ifdef DEBUG_HARQ
+ printf("\n [DLSIM] Requesting only TB1 from temp DCI\n");
+#endif
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else { // deactivate TB1
+#ifdef DEBUG_HARQ
+ printf("\n[DLSIM] FDD Requesting only TB0 from temp DCI\n");
+#endif
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0;
+ ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1;
+ }
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_5MHz_2A_FDD_t));
+ generate_eNB_dlsch_params_from_dci(0,
+ subframe,
+ &DLSCH_alloc_pdu_1[0],
+ n_rnti+k,
+ format2,
+ eNB->dlsch[0],
+ &eNB->frame_parms,
+ eNB->pdsch_config_dedicated,
+ SI_RNTI,
+ 0,
+ P_RNTI,
+ UE->dlsch[0][1]->pmi_alloc,
+ transmission_mode>=7?transmission_mode:0
+ );
+ break;
+ case 50:
+ if (TB0_active == 1 && TB1_active == 1) {
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else if (TB0_active == 0) { // deactivate TB0
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else { // deactivate TB1
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0;
+ ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1;
+ }
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_10MHz_2A_FDD_t));
+ break;
+ case 100:
+ if (TB0_active == 1 && TB1_active == 1) {
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else if (TB0_active == 0){ // deactivate TB0
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
+ }
+ else { // deactivate TB1
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3;
+ ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0;
+ ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1;
+ }
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_20MHz_2A_FDD_t));
+ break;
+ }
+ break;
+
+
+ case 5:
+ case 6:
+ DLSCH_alloc_pdu2_1E[0].ndi = trials&1;
+ DLSCH_alloc_pdu2_1E[0].rv = round&3;
+ memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu2_1E[0],sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
+ break;
+ }
+ }
+ }
+ }
+ num_pdcch_symbols_2 = generate_dci_top(num_ue_spec_dci,
+ num_common_dci,
+ dci_alloc,
+ 0,
+ AMP,
+ &eNB->frame_parms,
+ eNB->common_vars.txdataF[eNB_id],
+ subframe);
+
+ if (num_pdcch_symbols_2 > num_pdcch_symbols) {
+ msg("Error: given num_pdcch_symbols not big enough (%d > %d)\n",num_pdcch_symbols_2,num_pdcch_symbols);
+ exit(-1);
+ }
+
+ for (k=0;kframe_parms,
+ eNB->dlsch[k][TB]->harq_processes[0]->nb_rb,
+ eNB->dlsch[k][TB]->harq_processes[0]->rb_alloc,
+ get_Qm(eNB->dlsch[k][TB]->harq_processes[0]->mcs),
+ eNB->dlsch[k][TB]->harq_processes[0]->Nl,
+ num_pdcch_symbols,
+ 0,subframe,
+ transmission_mode>=7?transmission_mode:0);
+ #ifdef TBS_FIX // This is for MESH operation!!!
+ tbs[TB] = (double)3*TBStable[get_I_TBS(eNB->dlsch[k][TB]->harq_processes[0]->mcs)][eNB->dlsch[k][TB]->nb_rb-1]/4;
+ #else
+ tbs[TB] = eNB->dlsch[k][TB]->harq_processes[0]->TBS;
+ #endif
+
+ rate[TB] = (double)tbs[TB]/(double)coded_bits_per_codeword[TB];
+
+ if ((SNR == snr0) && (trials == 0) && (round == 0) && (pmi_feedback == 0))
+ printf("User %d, TB %d: Rate = %f (%f bits/dim) (G %d, TBS %d, mod %d, pdcch_sym %d, ndi %d)\n",
+ k,TB,rate[TB],rate[TB]*get_Qm(eNB->dlsch[k][TB]->harq_processes[0]->mcs),
+ coded_bits_per_codeword[TB],
+ tbs[TB],
+ get_Qm(eNB->dlsch[k][TB]->harq_processes[0]->mcs),
+ num_pdcch_symbols,
+ eNB->dlsch[k][TB]->harq_processes[0]->round);
+
+ // use the PMI from previous trial
+ if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) {
+ eNB->dlsch[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,eNB->frame_parms.N_RB_DL);
+ UE->dlsch[0][0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,UE->frame_parms.N_RB_DL);
+ if (n_users>1)
+ eNB->dlsch[1][0]->harq_processes[0]->pmi_alloc = (eNB->dlsch[0][0]->harq_processes[0]->pmi_alloc ^ 0x1555);
+ /*
+ if ((trials<10) && (round==0)) {
+ printf("tx PMI UE0 %x (pmi_feedback %d)\n",pmi2hex_2Ar1(eNB->dlsch[0][0]->pmi_alloc),pmi_feedback);
+ if (transmission_mode ==5)
+ printf("tx PMI UE1 %x\n",pmi2hex_2Ar1(eNB->dlsch[1][0]->pmi_alloc));
+ }
+ */
+ }
+
+ //if standard case when both TBs are active
+ if (transmission_mode == 4) {
+ if (((((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 2) ||(((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 2)) && TB0_active == 1 && TB1_active == 1){
+#ifdef DEBUG_HARQ
+ printf ("[DLSIM] I am calling from the eNode B 1\n");
+#endif
+
+ eNB->dlsch[0][TB]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,eNB->frame_parms.N_RB_DL);
+#ifdef DEBUG_HARQ
+ printf ("[DLSIM] I am calling from the eNode B 2\n");
+#endif
+
+ UE->dlsch[0][TB]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,UE->frame_parms.N_RB_DL);
+ }
+
+ else if (updated_csi == 0){
+
+ if (hold_rank1_precoder == 0 && ((((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 5) ||(((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 5))){
+#ifdef DEBUG_HARQ
+ printf ("[DLSIM] I am calling from the eNode B 1\n");
+#endif
+ eNB->dlsch[0][TB]->harq_processes[0]->pmi_alloc = pmi_convert_rank1_from_rank2(eNB->dlsch[0][TB]->harq_processes[0]->pmi_alloc,5,eNB->frame_parms.N_RB_DL);
+#ifdef DEBUG_HARQ
+ printf ("[DLSIM] I am calling from the eNode B 2\n");
+#endif
+ UE->dlsch[0][TB]->pmi_alloc = pmi_convert_rank1_from_rank2(UE->dlsch[0][TB]->pmi_alloc,5,UE->frame_parms.N_RB_DL);
+ }
+
+ else if (hold_rank1_precoder == 0 && ((((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 6) ||(((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 6))){
+#ifdef DEBUG_HARQ
+ printf ("[DLSIM] I am calling from the eNode B 1\n");
+#endif
+ eNB->dlsch[0][TB]->harq_processes[0]->pmi_alloc = pmi_convert_rank1_from_rank2(eNB->dlsch[0][TB]->harq_processes[0]->pmi_alloc,6,eNB->frame_parms.N_RB_DL);
+#ifdef DEBUG_HARQ
+ printf ("[DLSIM] I am calling from the eNode B 2\n");
+#endif
+ UE->dlsch[0][TB]->pmi_alloc = pmi_convert_rank1_from_rank2(UE->dlsch[0][TB]->pmi_alloc,6,UE->frame_parms.N_RB_DL);
+ }
+ } else if (updated_csi == 1){
+
+ if (((((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 5) ||(((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 5))){
+#ifdef DEBUG_HARQ
+ printf ("[DLSIM] Updating CSI\n");
+ printf ("[DLSIM] I quantize from ENodeB 1\n");
+#endif
+
+ eNB->dlsch[0][TB]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,eNB->frame_parms.N_RB_DL);
+#ifdef DEBUG_HARQ
+ printf ("[DLSIM] I convert pmi to rank1 eNode B 1\n");
+#endif
+ eNB->dlsch[0][TB]->harq_processes[0]->pmi_alloc = pmi_convert_rank1_from_rank2(eNB->dlsch[0][TB]->harq_processes[0]->pmi_alloc,5,eNB->frame_parms.N_RB_DL);
+
+#ifdef DEBUG_HARQ
+ printf ("[DLSIM] I quantize from ENodeB 2\n");
+#endif
+ UE->dlsch[0][TB]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,UE->frame_parms.N_RB_DL);
+#ifdef DEBUG_HARQ
+ printf ("[DLSIM] I convert pmi to rank1 eNode B 2\n");
+#endif
+ UE->dlsch[0][TB]->pmi_alloc = pmi_convert_rank1_from_rank2(UE->dlsch[0][TB]->pmi_alloc,5,UE->frame_parms.N_RB_DL);
+ }
+ else if (((((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 6) ||(((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 6))){
+#ifdef DEBUG_HARQ
+ printf ("[DLSIM] Updating CSI\n");
+ printf ("[DLSIM] I quantize from ENodeB 1\n");
+#endif
+
+ eNB->dlsch[0][TB]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,eNB->frame_parms.N_RB_DL);
+#ifdef DEBUG_HARQ
+ printf ("[DLSIM] I convert pmi to rank1 eNode B 1\n");
+#endif
+ eNB->dlsch[0][TB]->harq_processes[0]->pmi_alloc = pmi_convert_rank1_from_rank2(eNB->dlsch[0][TB]->harq_processes[0]->pmi_alloc,6,eNB->frame_parms.N_RB_DL);
+#ifdef DEBUG_HARQ
+ printf ("[DLSIM] I quantize from ENodeB 2\n");
+#endif
+ UE->dlsch[0][TB]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,UE->frame_parms.N_RB_DL);
+#ifdef DEBUG_HARQ
+ printf ("[DLSIM] I convert pmi to rank1 eNode B 2\n");
+#endif
+ UE->dlsch[0][TB]->pmi_alloc = pmi_convert_rank1_from_rank2(UE->dlsch[0][TB]->pmi_alloc,6,UE->frame_parms.N_RB_DL);
+ }
+
+ }
+ }
+
+ start_meas(&eNB->dlsch_encoding_stats);
+ if (dlsch_encoding(eNB,
+ (TB==0) ? input_buffer0[k] : input_buffer1[k],
+ num_pdcch_symbols,
+ eNB->dlsch[k][TB],
+ 0,
+ subframe,
+ &eNB->dlsch_rate_matching_stats,
+ &eNB->dlsch_turbo_encoding_stats,
+ &eNB->dlsch_interleaving_stats)<0)
+ exit(-1);
+
+ stop_meas(&eNB->dlsch_encoding_stats);
+
+ eNB->dlsch[k][TB]->rnti = (common_flag==0) ? n_rnti+k : SI_RNTI;
+ start_meas(&eNB->dlsch_scrambling_stats);
+ dlsch_scrambling(&eNB->frame_parms,
+ 0,
+ eNB->dlsch[k][TB],
+ coded_bits_per_codeword[TB],
+ TB,
+ subframe<<1);
+ stop_meas(&eNB->dlsch_scrambling_stats);
+
+ if (n_frames==2) {
+ for (s=0;sdlsch[k][TB]->harq_processes[0]->C;s++) {
+ if (sdlsch[k][TB]->harq_processes[0]->Cminus)
+ Kr = eNB->dlsch[k][TB]->harq_processes[0]->Kminus;
+ else
+ Kr = eNB->dlsch[k][TB]->harq_processes[0]->Kplus;
+ Kr_bytes = Kr>>3;
+ }
+ }
+ }
+
+ start_meas(&eNB->dlsch_modulation_stats);
+ re_allocated = dlsch_modulation(eNB,
+ eNB->common_vars.txdataF[eNB_id],
+ AMP,
+ subframe,
+ num_pdcch_symbols,
+ ((TB0_active == 1)? eNB->dlsch[k][0]: NULL),
+ ((TB1_active == 1)? eNB->dlsch[k][1]: NULL));
+ stop_meas(&eNB->dlsch_modulation_stats);
+ } //n_users
+
+
+ if (((transmission_mode == 3) || (transmission_mode == 4)) && (SNR == snr0) && (trials == 0) && (round == 0)){
+ rate0_init = rate[0];
+ rate1_init = rate[1];
+ tbs0_init=tbs[0];
+ tbs1_init=tbs[1];
+ mod_order0_init=get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs);
+ mod_order1_init=get_Qm(eNB->dlsch[0][1]->harq_processes[0]->mcs);
+ mcs0_init=eNB->dlsch[0][0]->harq_processes[0]->mcs;
+ mcs1_init=eNB->dlsch[0][1]->harq_processes[0]->mcs;
+ }
+
+ generate_pilots(eNB,
+ eNB->common_vars.txdataF[eNB_id],
+ AMP,
+ LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
+
+ start_meas(&eNB->ofdm_mod_stats);
+
+ do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id],
+ eNB->common_vars.txdata[eNB_id],
+ (subframe*2),
+ &eNB->frame_parms);
+
+ do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id],
+ eNB->common_vars.txdata[eNB_id],
+ (subframe*2)+1,
+ &eNB->frame_parms);
+
+ stop_meas(&eNB->ofdm_mod_stats);
+ stop_meas(&eNB->phy_proc_tx);
+
+ do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id],
+ eNB->common_vars.txdata[eNB_id],
+ (subframe*2)+2,
+ &eNB->frame_parms);
+
+ if (n_frames==2) {
+ write_output("txsigF0.m","txsF0", &eNB->common_vars.txdataF[eNB_id][0][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],nsymb*eNB->frame_parms.ofdm_symbol_size,1,1);
+ if (eNB->frame_parms.nb_antennas_tx>1)
+ write_output("txsigF1.m","txsF1", &eNB->common_vars.txdataF[eNB_id][1][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],nsymb*eNB->frame_parms.ofdm_symbol_size,1,1);
+ }
+
+ tx_lev = 0;
+ for (aa=0; aaframe_parms.nb_antennas_tx; aa++) {
+ tx_lev += signal_energy(&eNB->common_vars.txdata[eNB_id][aa]
+ [subframe*eNB->frame_parms.samples_per_tti],
+ eNB->frame_parms.samples_per_tti);
+ }
+ tx_lev_dB = (unsigned int) dB_fixed(tx_lev);
+
+ if (n_frames==2) {
+ write_output("txsigF0.m","txsF0", &eNB->common_vars.txdataF[eNB_id][0][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],nsymb*eNB->frame_parms.ofdm_symbol_size,1,1);
+ if (eNB->frame_parms.nb_antennas_tx>1)
+ write_output("txsigF1.m","txsF1", &eNB->common_vars.txdataF[eNB_id][1][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],nsymb*eNB->frame_parms.ofdm_symbol_size,1,1);
+ }
+
+ tx_lev = 0;
+ for (aa=0; aaframe_parms.nb_antennas_tx; aa++) {
+ tx_lev += signal_energy(&eNB->common_vars.txdata[eNB_id][aa]
+ [subframe*eNB->frame_parms.samples_per_tti],
+ eNB->frame_parms.samples_per_tti);
+ }
+ tx_lev_dB = (unsigned int) dB_fixed(tx_lev);
+
+ if (n_frames==2) {
+ printf("tx_lev = %d (%d dB)\n",tx_lev,tx_lev_dB);
+ write_output("txsig0.m","txs0", &eNB->common_vars.txdata[eNB_id][0][subframe*eNB->frame_parms.samples_per_tti], eNB->frame_parms.samples_per_tti,1,1);
+ }
+ }
+ // printf("Copying tx ..., nsymb %d (n_tx %d), awgn %d\n",nsymb,eNB->frame_parms.nb_antennas_tx,awgn_flag);
+ for (i=0;i<2*frame_parms->samples_per_tti;i++) {
+ for (aa=0;aaframe_parms.nb_antennas_tx;aa++) {
+ if (awgn_flag == 0) {
+ s_re[aa][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)]);
+ s_im[aa][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]);
+ }
+ else {
+ if (transmission_mode==4) {
+ r_re[0][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][0]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)])+((double)(((short *)eNB->common_vars.txdata[eNB_id][1]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)]);
+ r_im[0][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][0]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1])+((double)(((short *)eNB->common_vars.txdata[eNB_id][1]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]);
+
+ r_re[1][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][0]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)])-((double)(((short *)eNB->common_vars.txdata[eNB_id][1]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)]);
+ r_im[1][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][0]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1])-((double)(((short *)eNB->common_vars.txdata[eNB_id][1]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]);
+ //printf("r_re0 = %d\n",r_re[0][i]);
+ //printf("r_im0 = %d\n",r_im[0][i]);
+ //printf("r_re1 = %d\n",r_re[1][i]);
+ //printf("r_im1 = %d\n",r_im[1][i]);
+
+ }
+ else {
+ for (aarx=0;aarxframe_parms.nb_antennas_rx;aarx++) {
+ if (aa==0) {
+ r_re[aarx][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)]);
+ r_im[aarx][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]);
+ }
+ else {
+ r_re[aarx][i] += ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)]);
+ r_im[aarx][i] += ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // Multipath channel
+ if (awgn_flag == 0) {
+ multipath_channel(eNB2UE[round],s_re,s_im,r_re,r_im,
+ 2*frame_parms->samples_per_tti,hold_channel);
+ // printf("amc: ****************** eNB2UE[%d]->n_rx = %d,dd %d\n",round,eNB2UE[round]->nb_rx,eNB2UE[round]->channel_offset);
+ if(abstx==1 && num_rounds>1)
+ if(round==0 && hold_channel==0){
+ random_channel(eNB2UE[1],0);
+ random_channel(eNB2UE[2],0);
+ random_channel(eNB2UE[3],0);
+ }
+ if (UE->perfect_ce==1){
+ freq_channel(eNB2UE[round],UE->frame_parms.N_RB_DL,12*UE->frame_parms.N_RB_DL + 1);
+ // write_output("channel.m","ch",eNB2UE[round]->ch[0],eNB2UE[round]->channel_length,1,8);
+ // write_output("channelF.m","chF",eNB2UE[round]->chF[0],12*UE->frame_parms.N_RB_DL +1,1,8);
+ }
+ }
+
+ // freq_channel(eNB2UE[0], NB_RB,12*NB_RB + 1);
+ if(abstx){
+ if (trials==0 && round==0) {
+ // calculate freq domain representation to compute SINR
+ freq_channel(eNB2UE[0], NB_RB,2*NB_RB + 1);
+ // snr=pow(10.0,.1*SNR);
+ fprintf(csv_fd,"%f,",SNR);
+
+ for (u=0;u<2*NB_RB;u++){
+ for (aarx=0;aarxnb_rx;aarx++) {
+ for (aatx=0;aatxnb_tx;aatx++) {
+ channelx = eNB2UE[0]->chF[aarx+(aatx*eNB2UE[0]->nb_rx)][u].x;
+ channely = eNB2UE[0]->chF[aarx+(aatx*eNB2UE[0]->nb_rx)][u].y;
+ fprintf(csv_fd,"%e+i*(%e),",channelx,channely);
+ }
+ }
+ }
+
+ if(num_rounds>1){
+ freq_channel(eNB2UE[1], NB_RB,2*NB_RB + 1);
+
+ for (u=0;u<2*NB_RB;u++){
+ for (aarx=0;aarxnb_rx;aarx++) {
+ for (aatx=0;aatxnb_tx;aatx++) {
+ channelx = eNB2UE[1]->chF[aarx+(aatx*eNB2UE[1]->nb_rx)][u].x;
+ channely = eNB2UE[1]->chF[aarx+(aatx*eNB2UE[1]->nb_rx)][u].y;
+ fprintf(csv_fd,"%e+i*(%e),",channelx,channely);
+ }
+ }
+ }
+ freq_channel(eNB2UE[2], NB_RB,2*NB_RB + 1);
+
+ for (u=0;u<2*NB_RB;u++){
+ for (aarx=0;aarxnb_rx;aarx++) {
+ for (aatx=0;aatxnb_tx;aatx++) {
+ channelx = eNB2UE[2]->chF[aarx+(aatx*eNB2UE[2]->nb_rx)][u].x;
+ channely = eNB2UE[2]->chF[aarx+(aatx*eNB2UE[2]->nb_rx)][u].y;
+ fprintf(csv_fd,"%e+i*(%e),",channelx,channely);
+ }
+ }
+ }
+
+ freq_channel(eNB2UE[3], NB_RB,2*NB_RB + 1);
+
+ for (u=0;u<2*NB_RB;u++){
+ for (aarx=0;aarxnb_rx;aarx++) {
+ for (aatx=0;aatxnb_tx;aatx++) {
+ channelx = eNB2UE[3]->chF[aarx+(aatx*eNB2UE[3]->nb_rx)][u].x;
+ channely = eNB2UE[3]->chF[aarx+(aatx*eNB2UE[3]->nb_rx)][u].y;
+ fprintf(csv_fd,"%e+i*(%e),",channelx,channely);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ //AWGN
+ // tx_lev is the average energy over the whole subframe
+ // but SNR should be better defined wrt the energy in the reference symbols
+ sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)eNB->frame_parms.ofdm_symbol_size/(double)(eNB->frame_parms.N_RB_DL*12)) - SNR;
+ sigma2 = pow(10,sigma2_dB/10);
+ if (n_frames==1)
+ printf("Sigma2 %f (sigma2_dB %f,%f,%f )\n",sigma2,sigma2_dB,10*log10((double)eNB->frame_parms.ofdm_symbol_size/(double)(NB_RB*12)),get_pa_dB(eNB->pdsch_config_dedicated));
+
+ for (i=0; i<2*frame_parms->samples_per_tti; i++) {
+ for (aa=0;aaframe_parms.nb_antennas_rx;aa++) {
+ //printf("s_re[0][%d]=> %f , r_re[0][%d]=> %f\n",i,s_re[aa][i],i,r_re[aa][i]);
+ ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti)+2*i] =
+ (short) (r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0));
+ ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti)+2*i+1] =
+ (short) (r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0));
+ }
+ }
+
+ // lte_sync_time_init(eNB->frame_parms,common_vars);
+ // lte_sync_time(common_vars->rxdata, eNB->frame_parms);
+ // lte_sync_time_free();
+
+ /*
+ // optional: read rx_frame from file
+ if ((rx_frame_file = fopen("rx_frame.dat","r")) == NULL)
+ {
+ printf("Cannot open rx_frame.m data file\n");
+ exit(0);
+ }
+
+ result = fread((void *)PHY_vars->rx_vars[0].RX_DMA_BUFFER,4,FRAME_LENGTH_COMPLEX_SAMPLES,rx_frame_file);
+ printf("Read %d bytes\n",result);
+ result = fread((void *)PHY_vars->rx_vars[1].RX_DMA_BUFFER,4,FRAME_LENGTH_COMPLEX_SAMPLES,rx_frame_file);
+ printf("Read %d bytes\n",result);
+
+ fclose(rx_frame_file);
+ */
+
+ if (n_frames==1) {
+ printf("RX level in null symbol %d\n",dB_fixed(signal_energy(&UE->common_vars.rxdata[0][160+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2)));
+ printf("RX level in data symbol %d\n",dB_fixed(signal_energy(&UE->common_vars.rxdata[0][160+(2*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2)));
+ printf("rx_level Null symbol %f\n",10*log10(signal_energy_fp(r_re,r_im,1,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2,256+(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES))));
+ printf("rx_level data symbol %f\n",10*log10(signal_energy_fp(r_re,r_im,1,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2,256+(2*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES))));
+ }
+
+ if (eNB->frame_parms.Ncp == 0) { // normal prefix
+ pilot1 = 4;
+ pilot2 = 7;
+ pilot3 = 11;
+ }
+ else { // extended prefix
+ pilot1 = 3;
+ pilot2 = 6;
+ pilot3 = 9;
+ }
+
+ start_meas(&UE->phy_proc_rx);
+ // Inner receiver scheduling for 3 slots
+ for (Ns=(2*subframe);Ns<((2*subframe)+3);Ns++) {
+ for (l=0;lofdm_demod_stats);
+ slot_fep(UE,
+ l,
+ Ns%20,
+ 0,
+ 0,
+ 0);
+
+ stop_meas(&UE->ofdm_demod_stats);
+
+ if (UE->perfect_ce==1) {
+
+ if (awgn_flag==0) {
+ for(k=0; knb_antennas_tx; aa++) {
+ for (aarx=0; aarxnb_antennas_rx; aarx++) {
+ for (i=0; iN_RB_DL*12; i++) {
+ ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[k][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=
+ (int16_t)(eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP);
+ ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=
+ (int16_t)(eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP);
+ }
+ }
+ }
+ }
+ }else {
+ if (transmission_mode==4) {
+ for (i=0; iN_RB_DL*12; i++) {
+ ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][0])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP);
+ ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][0])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0;
+ ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][1])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP);
+ ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][1])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0;
+ ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][2])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP);
+ ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][2])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0;
+ ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][3])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=-(short)(AMP);
+ ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][3])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0;
+ }
+ } else {
+ for(aa=0; aanb_antennas_tx; aa++) {
+ for (aarx=0; aarxnb_antennas_rx; aarx++) {
+ for (i=0; iN_RB_DL*12; i++) {
+ ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP);
+ ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0/2;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if ((Ns==((2*subframe))) && (l==0)) {
+ lte_ue_measurements(UE,
+ subframe*UE->frame_parms.samples_per_tti,
+ 1,
+ 0,
+ subframe);
+ //printf ("Trial %d, Measurements are done \n", trials);
+ /*
+ debug_msg("RX RSSI %d dBm, digital (%d, %d) dB, linear (%d, %d), avg rx power %d dB (%d lin), RX gain %d dB\n",
+ UE->measurements.rx_rssi_dBm[0] - ((UE->frame_parms.nb_antennas_rx==2) ? 3 : 0),
+ UE->measurements.wideband_cqi_dB[0][0],
+ UE->measurements.wideband_cqi_dB[0][1],
+ UE->measurements.wideband_cqi[0][0],
+ UE->measurements.wideband_cqi[0][1],
+ UE->measurements.rx_power_avg_dB[0],
+ UE->measurements.rx_power_avg[0],
+ UE->rx_total_gain_dB);
+ debug_msg("N0 %d dBm digital (%d, %d) dB, linear (%d, %d), avg noise power %d dB (%d lin)\n",
+ UE->measurements.n0_power_tot_dBm,
+ UE->measurements.n0_power_dB[0],
+ UE->measurements.n0_power_dB[1],
+ UE->measurements.n0_power[0],
+ UE->measurements.n0_power[1],
+ UE->measurements.n0_power_avg_dB,
+ UE->measurements.n0_power_avg);
+ debug_msg("Wideband CQI tot %d dB, wideband cqi avg %d dB\n",
+ UE->measurements.wideband_cqi_tot[0],
+ UE->measurements.wideband_cqi_avg[0]);
+ */
+
+ if (transmission_mode == 4 || transmission_mode == 5 || transmission_mode == 6) {
+ if (pmi_feedback == 1) {
+ pmi_feedback = 0;
+ hold_channel = 1;
+
+ if (updated_csi==0) {
+ if (hold_rank1_precoder == 0)
+ hold_rank1_precoder = 1;
+ }
+ //printf ("trial %d pmi_feedback %d \n", trials, pmi_feedback);
+ //printf ("go to PMI feedback\n");
+#ifdef DEBUG_HARQ
+ printf ("[DLSIM] I am doing measurements and coming back to reencoding\n");
+#endif
+ goto PMI_FEEDBACK;
+ }
+ }
+
+ }
+
+
+ if ((Ns==(2*subframe)) && (l==pilot1)) {// process symbols 0,1,2
+ if (dci_flag == 1) {
+ UE->UE_mode[0] = PUSCH;
+ start_meas(&UE->dlsch_rx_pdcch_stats);
+
+ rx_pdcch(&UE->common_vars,
+ UE->pdcch_vars,
+ &UE->frame_parms,
+ trials,
+ subframe,
+ 0,
+ (UE->frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI,
+ UE->high_speed_flag,
+ UE->is_secondary_ue);
+
+ stop_meas(&UE->dlsch_rx_pdcch_stats);
+ // overwrite number of pdcch symbols
+ UE->pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols;
+
+ dci_cnt = dci_decoding_procedure(UE,
+ dci_alloc_rx,1,
+ eNB_id,
+ subframe);
+ printf("dci_cnt %d\n",dci_cnt);
+
+ if (dci_cnt==0) {
+ dlsch_active = 0;
+ if (round==0) {
+ dci_errors++;
+
+ round=5; // this is meant to stop the "while" loop if DCI is wrong;
+ errs[0][0]++;
+
+ if (n_frames==2)
+ printf("DCI error trial %d errs[0][0] %d\n",trials,errs[0][0]);
+ }
+ }
+
+ for (i=0;idlsch[0][0]->harq_processes[0]->first_tx=1;
+ }
+ if ((transmission_mode == 3 || transmission_mode ==4) && (round == 0)) {
+ UE->dlsch[0][1]->harq_processes[0]->first_tx=1;
+ }
+
+ if ((dci_alloc_rx[i].rnti == n_rnti) &&
+ (generate_ue_dlsch_params_from_dci(0,
+ subframe,
+ dci_alloc_rx[i].dci_pdu,
+ dci_alloc_rx[i].rnti,
+ dci_alloc_rx[i].format,
+ UE->dlsch[0],
+ &UE->frame_parms,
+ UE->pdsch_config_dedicated,
+ SI_RNTI,
+ 0,
+ P_RNTI,
+ transmission_mode<7?0:transmission_mode,
+ UE->pdcch_vars[0]->crnti_is_temporary? UE->pdcch_vars[0]->crnti: 0)==0)) {
+ dump_dci(&UE->frame_parms,&dci_alloc_rx[i]);
+ coded_bits_per_codeword[0]= get_G(&eNB->frame_parms,
+ UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->nb_rb,
+ UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->rb_alloc_even,
+ get_Qm(UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs),
+ UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->Nl,
+ UE->pdcch_vars[0]->num_pdcch_symbols,
+ 0,
+ subframe,
+ transmission_mode>=7?transmission_mode:0);
+ if (transmission_mode == 3 || transmission_mode == 4) {
+ coded_bits_per_codeword[1]= get_G(&eNB->frame_parms,
+ UE->dlsch[0][1]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->nb_rb,
+ UE->dlsch[0][1]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->rb_alloc_even,
+ get_Qm(UE->dlsch[0][1]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs),
+ UE->dlsch[0][1]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->Nl,
+ UE->pdcch_vars[1]->num_pdcch_symbols,
+ 0,
+ subframe,
+ transmission_mode>=7?transmission_mode:0);
+ }
+ /*
+ rate = (double)dlsch_tbs25[get_I_TBS(UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs)][UE->dlsch[0][0]->nb_rb-1]/(coded_bits_per_codeword);
+ rate*=get_Qm(UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs);
+ */
+ printf("num_pdcch_symbols %d, G %d, TBS %d\n",UE->pdcch_vars[0]->num_pdcch_symbols,coded_bits_per_codeword [0],UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->TBS);
+
+ dlsch_active = 1; // what does it indicates???
+ } else {
+ dlsch_active = 0;
+ if (round==0) {
+ dci_errors++;
+ errs[0][0]++;
+ //round_trials[0]++;
+ round=5;
+
+ if (n_frames==1)
+ printf("DCI misdetection trial %d\n",trials);
+
+ }
+ // for (i=1;i<=round;i++)
+ // round_trials[i]--;
+ // round=5;
+ }
+ }
+ } else { //dci_flag == 0
+ UE->pdcch_vars[0]->crnti = n_rnti;
+ UE->pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols;
+ if (round == 0) {
+ UE->dlsch[0][0]->harq_processes[0]->first_tx=1;
+ UE->dlsch[0][1]->harq_processes[0]->first_tx=1;
+ }
+
+ switch (transmission_mode) {
+ case 1:
+ case 2:
+ generate_ue_dlsch_params_from_dci(0,
+ subframe,
+ &DLSCH_alloc_pdu_1[0],
+ (common_flag==0)? C_RNTI : SI_RNTI,
+ (common_flag==0)? format1 : format1A,
+ UE->dlsch[0],
+ &UE->frame_parms,
+ UE->pdsch_config_dedicated,
+ SI_RNTI,
+ 0,
+ P_RNTI,
+ transmission_mode<7?0:transmission_mode,
+ UE->pdcch_vars[0]->crnti_is_temporary? UE->pdcch_vars[0]->crnti: 0);
+ break;
+ case 3:
+
+ //printf("Rate: TM3 (before) round %d (%d) first_tx %d\n",round,UE->dlsch[0][0]->harq_processes[0]->round,UE->dlsch[0][0]->harq_processes[0]->first_tx);
+
+ generate_ue_dlsch_params_from_dci(0,
+ subframe,
+ &DLSCH_alloc_pdu_1[0],
+ (common_flag==0)? C_RNTI : SI_RNTI,
+ (common_flag==0)? format2A : format1A,
+ UE->dlsch[0],
+ &UE->frame_parms,
+ UE->pdsch_config_dedicated,
+ SI_RNTI,
+ 0,
+ P_RNTI,
+ transmission_mode<7?0:transmission_mode,
+ UE->pdcch_vars[0]->crnti_is_temporary? UE->pdcch_vars[0]->crnti: 0);
+ //printf("Rate: TM3 (after) round %d (%d) first_tx %d\n",round,UE->dlsch[0][0]->harq_processes[0]->round,UE->dlsch[0][0]->harq_processes[0]->first_tx);
+ break;
+ case 4:
+ generate_ue_dlsch_params_from_dci(0,
+ subframe,
+ &DLSCH_alloc_pdu_1[0],
+ (common_flag==0)? C_RNTI : SI_RNTI,
+ (common_flag==0)? format2 : format1A,//format1A only for a codeblock
+ UE->dlsch[0],
+ &UE->frame_parms,
+ UE->pdsch_config_dedicated,
+ SI_RNTI,
+ 0,
+ P_RNTI,
+ transmission_mode<7?0:transmission_mode,
+ UE->pdcch_vars[0]->crnti_is_temporary? UE->pdcch_vars[0]->crnti: 0);
+
+ break;
+ case 5:
+ case 6:
+ generate_ue_dlsch_params_from_dci(0,
+ subframe,
+ &DLSCH_alloc_pdu2_1E[0],
+ C_RNTI,
+ format1E_2A_M10PRB,
+ UE->dlsch[0],
+ &UE->frame_parms,
+ UE->pdsch_config_dedicated,
+ SI_RNTI,
+ 0,
+ P_RNTI,
+ transmission_mode<7?0:transmission_mode,
+ UE->pdcch_vars[0]->crnti_is_temporary? UE->pdcch_vars[0]->crnti: 0);
+ break;
+ }
+ dlsch_active = 1;
+ } // if dci_flag == 1
+ }
+
+ if (dlsch_active == 1) {
+ if (TB0_active==1)
+ cur_harq_pid =UE->dlsch[0][0]->current_harq_pid;
+ else
+ cur_harq_pid =UE->dlsch[0][1]->current_harq_pid;
+
+ if ((Ns==(1+(2*subframe))) && (l==0)) {// process PDSCH symbols 1,2,3,4,5,(6 Normal Prefix
+ /* if (transmission_mode == 5) {
+ if ((UE->dlsch[eNB_id][0]->harq_processes[cur_harq_pid]->dl_power_off==0) &&
+ (openair_daq_vars.use_ia_receiver ==1)) {
+ rx_type = rx_IC_single_stream;
+ } else {
+ rx_type = rx_standard;
+ }
+ }*/
+
+
+ start_meas(&UE->dlsch_llr_stats);
+
+ for (m=UE->pdcch_vars[0]->num_pdcch_symbols; mpdcch_vars[0]->num_pdcch_symbols)?1:0,
+ rx_type,
+ i_mod,
+ UE->dlsch[0][0]->current_harq_pid)==-1){
+ dlsch_active = 0;
+ break;
+ }
+ }
+ stop_meas(&UE->dlsch_llr_stats);
+ }
+
+ if ((Ns==(1+(2*subframe))) && (l==pilot1)){// process symbols (6 Extended Prefix),7,8,9
+ start_meas(&UE->dlsch_llr_stats);
+ for (m=pilot2;mdlsch_llr_stats);
+ }
+
+ if ((Ns==(2+(2*subframe))) && (l==0)) { // process symbols 10,11,(12,13 Normal Prefix) do deinterleaving for TTI
+ start_meas(&UE->dlsch_llr_stats);
+ for (m=pilot3; mframe_parms.symbols_per_tti; m++) {
+ if (rx_pdsch(UE,
+ PDSCH,
+ eNB_id,
+ eNB_id_i,
+ 0,
+ subframe,
+ m,
+ 0,
+ rx_type,
+ i_mod,
+ cur_harq_pid)==-1) {
+ dlsch_active=0;
+ break;
+ }
+ }
+ stop_meas(&UE->dlsch_llr_stats);
+ }
+ }
+ }
+ }
+
+ //saving PMI in case of Transmission Mode > 5
+
+ if(abstx){
+ if (trials==0 && round==0 && transmission_mode>=4){
+ for (iii=0; iiipdsch_vars[eNB_id]->pmi_ext[iii]),(UE->pdsch_vars[eNB_id_i]->pmi_ext[iii]));
+ fprintf(csv_fd,"%x,",(UE->pdsch_vars[subframe&0x1][eNB_id]->pmi_ext[iii]));
+ //printf("%x ",(UE->pdsch_vars[eNB_id]->pmi_ext[iii]));
+ }
+ }
+ }
+
+
+ for (TB=0; TBdlsch[0][TB]->rnti = (common_flag==0) ? n_rnti: SI_RNTI;
+ coded_bits_per_codeword[TB] = get_G(&eNB->frame_parms,
+ eNB->dlsch[0][TB]->harq_processes[0]->nb_rb,
+ eNB->dlsch[0][TB]->harq_processes[0]->rb_alloc,
+ get_Qm(eNB->dlsch[0][TB]->harq_processes[0]->mcs),
+ eNB->dlsch[0][TB]->harq_processes[0]->Nl,
+ num_pdcch_symbols,
+ 0,subframe,
+ transmission_mode>=7?transmission_mode:0);
+
+ UE->dlsch[0][TB]->harq_processes[UE->dlsch[0][TB]->current_harq_pid]->G = coded_bits_per_codeword[TB];
+ UE->dlsch[0][TB]->harq_processes[UE->dlsch[0][TB]->current_harq_pid]->Qm = get_Qm(eNB->dlsch[0][TB]->harq_processes[0]->mcs);
+
+ if (n_frames==2) {
+ printf("Kmimo=%d, TB=%d, G=%d, TBS=%d\n",Kmimo,TB,coded_bits_per_codeword[TB],
+ UE->dlsch[0][TB]->harq_processes[UE->dlsch[0][TB]->current_harq_pid]->TBS);
+
+ // calculate uncoded BER
+ uncoded_ber_bit = (short*) malloc(sizeof(short)*coded_bits_per_codeword[TB]);
+
+ AssertFatal(uncoded_ber_bit, "uncoded_ber_bit==NULL");
+
+ sprintf(fname,"dlsch%d_rxF_r%d_cw%d_llr.m",eNB_id,round, TB);
+ sprintf(vname,"dl%d_r%d_cw%d_llr",eNB_id,round, TB);
+ write_output(fname,vname, UE->pdsch_vars[subframe&0x1][0]->llr[UE->dlsch[0][TB]->harq_processes[UE->dlsch[0][TB]->current_harq_pid]->codeword],coded_bits_per_codeword[TB],1,0);
+ sprintf(fname,"dlsch_cw%d_e.m", TB);
+ sprintf(vname,"dlschcw%d_e", TB);
+ write_output(fname, vname,eNB->dlsch[0][TB]->harq_processes[0]->e,coded_bits_per_codeword[TB],1,4);
+ uncoded_ber=0;
+ printf("trials=%d\n", trials);
+
+ for (i=0;idlsch[0][TB]->harq_processes[0]->e[i] != (UE->pdsch_vars[subframe&0x1][0]->llr[UE->dlsch[0][TB]->harq_processes[UE->dlsch[0][TB]->current_harq_pid]->codeword][i]<0)) {
+ uncoded_ber_bit[i] = 1;
+ uncoded_ber++;
+ }
+ else
+ uncoded_ber_bit[i] = 0;
+
+ uncoded_ber/=coded_bits_per_codeword[TB];
+ avg_ber += uncoded_ber;
+ sprintf(fname,"cw%d_uncoded_ber_bit.m", TB);
+ sprintf(vname,"uncoded_ber_bit_cw%d", TB);
+ write_output(fname, vname,uncoded_ber_bit,coded_bits_per_codeword[TB],1,0);
+ printf("cw %d, uncoded ber %f\n",TB,uncoded_ber);
+
+ free(uncoded_ber_bit);
+ uncoded_ber_bit = NULL;
+
+ }
+
+ start_meas(&UE->dlsch_unscrambling_stats);
+ dlsch_unscrambling(&UE->frame_parms,
+ 0,
+ UE->dlsch[0][TB],
+ coded_bits_per_codeword[TB],
+ UE->pdsch_vars[subframe&0x1][eNB_id]->llr[UE->dlsch[0][TB]->harq_processes[UE->dlsch[0][TB]->current_harq_pid]->codeword],
+ TB,
+ subframe<<1);
+ stop_meas(&UE->dlsch_unscrambling_stats);
+
+ start_meas(&UE->dlsch_decoding_stats);
+ ret[TB] = dlsch_decoding(UE,
+ UE->pdsch_vars[subframe&0x1][eNB_id]->llr[UE->dlsch[0][TB]->harq_processes[UE->dlsch[0][TB]->current_harq_pid]->codeword],
+ &UE->frame_parms,
+ UE->dlsch[0][TB],
+ UE->dlsch[0][TB]->harq_processes[UE->dlsch[0][TB]->current_harq_pid],
+ 0,
+ subframe,
+ UE->dlsch[0][TB]->current_harq_pid,
+ 1,llr8_flag);
+ stop_meas(&UE->dlsch_decoding_stats);
+#ifdef DEBUG_HARQ
+ printf("[DLSIM] ret[%d] = %d\n", TB, ret[TB]);
+#endif
+
+ //printf("retr cw 0 = %d\n", ret[0]);
+ //printf("current round = %d\n", UE->dlsch[0][cw_non_sic]->harq_processes[UE->dlsch[0][cw_non_sic]->current_harq_pid]->round);
+
+
+
+ if (ret[TB] <= UE->dlsch[0][0]->max_turbo_iterations ) { //if CW0 is decoded, approach CW1
+#ifdef DEBUG_HARQ
+ printf("[DLSIM] TB%d is decoded\n", TB);
+#endif
+
+ /*avg_iter[TB] += ret[TB];
+ iter_trials[TB]++;*/
+
+ if (n_frames==2) {
+ printf("cw non sic %d, round %d: No DLSCH errors found, uncoded ber %f\n",TB,round,uncoded_ber);
+#ifdef PRINT_BYTES
+ for (s=0;sdlsch[0][TB]->harq_processes[0]->C;s++) {
+ if (sdlsch[0][TB]->harq_processes[0]->Cminus)
+ Kr = UE->dlsch[0][TB]->harq_processes[0]->Kminus;
+ else
+ Kr = UE->dlsch[0][TB]->harq_processes[0]->Kplus;
+
+ Kr_bytes = Kr>>3;
+
+ printf("Decoded_output (Segment %d):\n",s);
+ for (i=0;idlsch[0][TB]->harq_processes[0]->c[s][i],
+ UE->dlsch[0][TB]->harq_processes[0]->c[s][i]^eNB->dlsch[0][TB]->harq_processes[0]->c[s][i]);
+ }
+#endif
+ }
+
+ UE->total_TBS[eNB_id] = UE->total_TBS[eNB_id] + UE->dlsch[eNB_id][TB]->harq_processes[UE->dlsch[eNB_id][TB]->current_harq_pid]->TBS;
+
+ // If the receiver is NOT SIC, Here we are done with both CW, now only to calculate BLER
+ //If the receiver IS SIC, we are done only with CW0, CW1 was only compensated by this moment (y1' obtained)
+ if (UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->mimo_mode == LARGE_CDD) { //try to decode second stream using SIC
+ /*
+ //for (round = 0 ; round < UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->round ; round++) {
+ // we assume here that the second stream has a lower MCS and is thus more likely to be decoded
+ // re-encoding of second stream
+ dlsch0_ue_harq = UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid];
+ dlsch0_eNB_harq = UE->dlsch[eNB_id]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid];
+
+ dlsch0_eNB_harq->mimo_mode = LARGE_CDD;
+ dlsch0_eNB_harq->rb_alloc[0] = dlsch0_ue_harq->rb_alloc[0];
+ dlsch0_eNB_harq->nb_rb = dlsch0_ue_harq->nb_rb;
+ dlsch0_eNB_harq->mcs = dlsch0_ue_harq->mcs;
+ dlsch0_eNB_harq->rvidx = dlsch0_ue_harq->rvidx;
+ dlsch0_eNB_harq->Nl = dlsch0_ue_harq->Nl;
+ dlsch0_eNB_harq->round = dlsch0_ue_harq->round;
+
+ dlsch0_eNB_harq->TBS = dlsch0_ue_harq->TBS;
+ dlsch0_eNB_harq->dl_power_off = dlsch0_ue_harq->dl_power_off;
+ dlsch0_eNB_harq->status = dlsch0_ue_harq->status;
+
+ UE->dlsch[eNB_id]->active = UE->dlsch[eNB_id][0]->active;
+ UE->dlsch[eNB_id]->rnti = UE->dlsch[eNB_id][0]->rnti;
+ UE->dlsch[eNB_id]->current_harq_pid = UE->dlsch[eNB_id][0]->current_harq_pid;
+
+ dlsch_encoding(UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->b,
+ &UE->frame_parms,
+ num_pdcch_symbols,
+ UE->dlsch[eNB_id],
+ 0,subframe,
+ &UE->dlsch_rate_matching_stats,
+ &UE->dlsch_turbo_encoding_stats,
+ &UE->dlsch_interleaving_stats
+ );
+
+ coded_bits_per_codeword = get_G(&UE->frame_parms,
+ UE->dlsch[eNB_id]->harq_processes[UE->dlsch[eNB_id]->current_harq_pid]->nb_rb,
+ UE->dlsch[eNB_id]->harq_processes[UE->dlsch[eNB_id]->current_harq_pid]->rb_alloc,
+ get_Qm(UE->dlsch[eNB_id]->harq_processes[UE->dlsch[eNB_id]->current_harq_pid]->mcs),
+ UE->dlsch[eNB_id]->harq_processes[UE->dlsch[eNB_id]->current_harq_pid]->Nl,
+ num_pdcch_symbols,
+ 0,subframe);
+
+
+ //scrambling
+ dlsch_scrambling(&UE->frame_parms,
+ 0,
+ UE->dlsch[eNB_id],
+ coded_bits_per_codeword,
+ 0,
+ subframe<<1);
+
+
+ //modulation
+ re_allocated = dlsch_modulation(sic_buffer,
+ AMP,
+ subframe,
+ &UE->frame_parms,
+ num_pdcch_symbols,
+ &UE->dlsch[0][0],
+ NULL);
+ // sic_buffer is a vector of size nb_antennas_tx, but both contain the same signal, since we do modulation without precoding
+ // precoding is contained in effective channel estimate
+ // compute the norm of the effective channel for both receive antennas -> alphha[0], alphha[2]
+ // multiply with the norm of the effective channnel
+ */
+
+ //stripping (from matched filter output of first stream = rxdataF_comp0)
+ // this is pseudocode
+ /*
+ for (i=0; inb_antennas_rx; i++) {
+ UE->pdsch_vars[eNB_id].rxdataF_ext[i] -= alpha[i].*sic_buffer[i];
+ }
+ */
+
+ //apply rho to output
+ /*
+ dlsch_channel_compensation(UE->pdsch_vars[eNB_id].rxdataF_ext,
+ UE->pdsch_vars[eNB_id].dl_ch_rho_ext[harq_pid][round],
+ UE->pdsch_vars[eNB_id]->dl_ch_mag1,
+ UE->pdsch_vars[eNB_id]->dl_ch_magb1,
+ UE->pdsch_vars[eNB_id]->rxdataF_comp1,
+ NULL,
+ frame_parms,
+ symbol,
+ first_symbol_flag,
+ i_mod,
+ nb_rb,
+ pdsch_vars[eNB_id]->log2_maxh,
+ phy_measurements); // log2_maxh+I0_shift
+ */
+
+
+ //detection of second stream
+ //}
+
+ }
+
+
+ if ((UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) &&
+ (UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->mimo_mode <=DUALSTREAM_PUSCH_PRECODING) && (TB0_active == 1) &&
+ (rx_type==rx_SIC_dual_stream)) {
+#ifdef DEBUG_HARQ
+ printf("[DLSIM] Starting SIC procedure\n");
+#endif
+ // printf("current round = %d\n", PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->round);
+
+
+ //printf("\n CW 0 is decoded, i go for , round %d\n", round);
+ //printf("\n ret[TB0] = %d round %d\n", ret[TB], round);
+ sic_attempt[round]++;
+
+ for (round_sic = 0 ; round_sic < (round +1); round_sic++) {
+
+#ifdef DEBUG_HARQ
+ printf("[DLSIM] 0 Round sic = %d\n", round_sic);
+#endif
+ //printf("I enter round_sic loop \n");
+ //printf("round_sic= %d\n", round_sic);
+ dlsch0_ue_harq = UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid];
+ dlsch0_eNB_harq = UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid];
+
+ dlsch0_eNB_harq->mimo_mode = UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->mimo_mode;
+ dlsch0_eNB_harq->rb_alloc[0] = dlsch0_ue_harq->rb_alloc_even[0];
+ dlsch0_eNB_harq->nb_rb = dlsch0_ue_harq->nb_rb;
+ dlsch0_eNB_harq->mcs = dlsch0_ue_harq->mcs;
+ dlsch0_eNB_harq->rvidx = dlsch0_ue_harq->rvidx;
+ dlsch0_eNB_harq->Nl = dlsch0_ue_harq->Nl;
+ dlsch0_eNB_harq->round = dlsch0_ue_harq->round;
+ dlsch0_eNB_harq->TBS = dlsch0_ue_harq->TBS;
+ dlsch0_eNB_harq->dl_power_off = dlsch0_ue_harq->dl_power_off;
+ dlsch0_eNB_harq->status = dlsch0_ue_harq->status;
+
+ if (round_sic == 0){
+ UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch[eNB_id][1]->current_harq_pid]->rvidx = 0;
+ UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->rvidx=0;
+ }
+ else if (round_sic == 1){
+ UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch[eNB_id][1]->current_harq_pid]->rvidx = 1;
+ UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->rvidx=1;
+ }
+ else if (round_sic == 2){
+ UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch[eNB_id][1]->current_harq_pid]->rvidx = 2;
+ UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->rvidx=2;
+ }
+ else{
+ UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch[eNB_id][1]->current_harq_pid]->rvidx = 3;
+ UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->rvidx=3;
+ }
+
+ UE->dlsch_eNB[eNB_id]->active = UE->dlsch[eNB_id][0]->active;
+ UE->dlsch_eNB[eNB_id]->rnti = UE->dlsch[eNB_id][0]->rnti;
+ UE->dlsch_eNB[eNB_id]->current_harq_pid = UE->dlsch[eNB_id][0]->current_harq_pid;
+
+ dlsch_encoding_SIC(UE,
+ input_buffer0[0], //UE->dlsch[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->b,,
+ num_pdcch_symbols,
+ UE->dlsch_eNB[eNB_id],
+ 0,
+ subframe,
+ &UE->dlsch_rate_matching_stats,
+ &UE->dlsch_turbo_encoding_stats,
+ &UE->dlsch_interleaving_stats);
+
+
+ coded_bits_per_codeword[0]= get_G(&UE->frame_parms,
+ UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch_eNB[eNB_id]->current_harq_pid]->nb_rb,
+ UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch_eNB[eNB_id]->current_harq_pid]->rb_alloc,
+ get_Qm(UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch_eNB[eNB_id]->current_harq_pid]->mcs),
+ UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch_eNB[eNB_id]->current_harq_pid]->Nl,
+ num_pdcch_symbols,
+ 0,
+ subframe,
+ transmission_mode>=7?transmission_mode:0);
+
+ dlsch_scrambling(&UE->frame_parms,
+ 0,
+ UE->dlsch_eNB[eNB_id],
+ coded_bits_per_codeword[0],
+ 0,
+ subframe<<1);
+
+ re_allocated = dlsch_modulation_SIC(sic_buffer,
+ subframe,
+ &UE->frame_parms,
+ num_pdcch_symbols,
+ &UE->dlsch_eNB[0][0],
+ NULL,
+ coded_bits_per_codeword[0]);
+
+ // write_output("sic_buffer.m","sic", *sic_buffer,re_allocated,1,1);
+ // write_output("rxdataF_comp1.m","rxF_comp1", *UE->pdsch_vars[eNB_id]->rxdataF_comp1[UE->dlsch[0][0]->current_harq_pid][round],14*12*25,1,1);
+ // write_output("rxdataF_rho.m","rho", *UE->pdsch_vars[eNB_id]->dl_ch_rho_ext[UE->dlsch[0][0]->current_harq_pid][round],14*12*25,1,1);
+
+ switch (get_Qm(eNB->dlsch[0][1]->harq_processes[0]->mcs)){
+
+
+ case 2:
+
+ dlsch_qpsk_llr_SIC(&UE->frame_parms,
+ UE->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp1[UE->dlsch[0][0]->current_harq_pid][round_sic],
+ sic_buffer,
+ UE->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_rho_ext[UE->dlsch[0][0]->current_harq_pid][round_sic],
+ UE->pdsch_vars[subframe&0x1][eNB_id]->llr[UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->codeword],
+ num_pdcch_symbols,
+ dlsch0_eNB_harq->nb_rb,
+ subframe,
+ dlsch0_eNB_harq->rb_alloc[0],
+ get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs),
+ UE->dlsch[eNB_id][0]);
+ break;
+
+ case 4:
+
+ dlsch_16qam_llr_SIC(&UE->frame_parms,
+ UE->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp1[UE->dlsch[0][0]->current_harq_pid][round_sic],
+ sic_buffer,
+ UE->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_rho_ext[UE->dlsch[0][0]->current_harq_pid][round_sic],
+ UE->pdsch_vars[subframe&0x1][eNB_id]->llr[UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->codeword],
+ num_pdcch_symbols,
+ UE->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_mag1[UE->dlsch[0][0]->current_harq_pid][round_sic],
+ dlsch0_eNB_harq->nb_rb,
+ subframe,
+ dlsch0_eNB_harq->rb_alloc[0],
+ get_Qm(eNB->dlsch[0][TB]->harq_processes[0]->mcs),
+ UE->dlsch[eNB_id][0]);
+ break;
+ case 6:
+ dlsch_64qam_llr_SIC(&UE->frame_parms,
+ UE->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp1[UE->dlsch[0][0]->current_harq_pid][round_sic],
+ sic_buffer,
+ UE->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_rho_ext[UE->dlsch[0][0]->current_harq_pid][round_sic],
+ UE->pdsch_vars[subframe&0x1][eNB_id]->llr[UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->codeword],
+ num_pdcch_symbols,
+ UE->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_mag1[UE->dlsch[0][0]->current_harq_pid][round_sic],
+ UE->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_magb1[UE->dlsch[0][0]->current_harq_pid][round_sic],
+ dlsch0_eNB_harq->nb_rb,
+ subframe,
+ dlsch0_eNB_harq->rb_alloc[0],
+ get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs),
+ UE->dlsch[eNB_id][TB]);
+ break;
+ }
+ //}// rouns sic
+#ifdef DEBUG_HARQ
+ printf("[DLSIM] TB1 is mapped into CW%d\n", UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->codeword);
+#endif
+
+ // write_output("rxdata_llr1.m","llr1", UE->pdsch_vars[eNB_id]->llr[1],re_allocated*2,1,0);
+
+ // replace cw_sic with TB+1
+ UE->dlsch[0][1]->rnti = (common_flag==0) ? n_rnti: SI_RNTI;
+ coded_bits_per_codeword[1]= get_G(&eNB->frame_parms,
+ eNB->dlsch[0][1]->harq_processes[0]->nb_rb,
+ eNB->dlsch[0][1]->harq_processes[0]->rb_alloc,
+ get_Qm(eNB->dlsch[0][1]->harq_processes[0]->mcs),
+ eNB->dlsch[0][1]->harq_processes[0]->Nl,
+ num_pdcch_symbols,
+ 0,
+ subframe,
+ transmission_mode>=7?transmission_mode:0);
+
+ UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->G = coded_bits_per_codeword[1];
+ UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->Qm = get_Qm(eNB->dlsch[0][1]->harq_processes[0]->mcs);
+
+ if (n_frames==2) {
+ printf("Kmimo=%d, cw=%d, G=%d, TBS=%d\n",Kmimo,1,coded_bits_per_codeword[1],
+ UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->TBS);
+
+ // calculate uncoded BER
+ uncoded_ber_bit = (short*) malloc(sizeof(short)*coded_bits_per_codeword[1]);
+ AssertFatal(uncoded_ber_bit, "uncoded_ber_bit==NULL");
+ sprintf(fname,"dlsch%d_rxF_r%d_cw%d_llr.m",eNB_id,round,1);
+ sprintf(vname,"dl%d_r%d_cw%d_llr",eNB_id,round, 1);
+ write_output(fname,vname, UE->pdsch_vars[subframe&0x1][0]->llr[1],coded_bits_per_codeword[1],1,0);
+ sprintf(fname,"dlsch_cw%d_e.m", 1);
+ sprintf(vname,"dlschcw%d_e", 1);
+ write_output(fname, vname,eNB->dlsch[0][1]->harq_processes[0]->e,coded_bits_per_codeword[1],1,4);
+ uncoded_ber=0;
+ printf("trials=%d\n", trials);
+ for (i=0;idlsch[0][1]->harq_processes[0]->e[i] != (UE->pdsch_vars[subframe&0x1][0]->llr[UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->codeword][i]<0)) {
+ uncoded_ber_bit[i] = 1;
+ uncoded_ber++;
+ }
+ else
+ uncoded_ber_bit[i] = 0;
+
+ uncoded_ber/=coded_bits_per_codeword[1];
+ avg_ber += uncoded_ber;
+ sprintf(fname,"cw%d_uncoded_ber_bit.m", 1);
+ sprintf(vname,"uncoded_ber_bit_cw%d", 1);
+ write_output(fname, vname,uncoded_ber_bit,coded_bits_per_codeword[1],1,0);
+ printf("cw %d, uncoded ber %f\n",1,uncoded_ber);
+ free(uncoded_ber_bit);
+ uncoded_ber_bit = NULL;
+ }
+
+ start_meas(&UE->dlsch_unscrambling_stats);
+ dlsch_unscrambling(&UE->frame_parms,
+ 0,
+ UE->dlsch[0][1],
+ coded_bits_per_codeword[1],
+ UE->pdsch_vars[subframe&0x1][eNB_id]->llr[UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->codeword],
+ 1,
+ subframe<<1);
+ stop_meas(&UE->dlsch_unscrambling_stats);
+
+ start_meas(&UE->dlsch_decoding_stats);
+
+ ret[1] = dlsch_decoding(UE,
+ UE->pdsch_vars[subframe&0x1][eNB_id]->llr[UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->codeword],
+ &UE->frame_parms,
+ UE->dlsch[0][1],
+ UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid],
+ 0,
+ subframe,
+ UE->dlsch[0][1]->current_harq_pid,
+ 1,llr8_flag);
+ stop_meas(&UE->dlsch_decoding_stats);
+
+#ifdef DEBUG_HARQ
+ printf("[DLSIM] Decoding TB1 in SIC: ret[1] = %d, round sic %d\n", ret[1], round_sic);
+#endif
+
+ //printf("ret TB 1 = %d round %d \n", ret[1], round);
+
+ if (ret[1] <=UE->dlsch[0][0]->max_turbo_iterations ) {
+ decoded_in_sic[round]++;
+ round_sic = round+1; // to exit round_sic
+#ifdef DEBUG_HARQ
+ printf("[DLSIM] TB1 is decoded in SIC loop\n");
+#endif
+ avg_iter[1] += ret[1];
+ iter_trials[1]++;
+
+
+ if (n_frames==2) {
+ printf("cw sic %d, round %d: No DLSCH errors found, uncoded ber %f\n",1,round,uncoded_ber);
+
+ #ifdef PRINT_BYTES
+ for (s=0;sdlsch[0][1]->harq_processes[0]->C;s++) {
+ if (sdlsch[0][1]->harq_processes[0]->Cminus)
+ Kr = UE->dlsch[0][1]->harq_processes[0]->Kminus;
+ else
+ Kr = UE->dlsch[0][1]->harq_processes[0]->Kplus;
+
+ Kr_bytes = Kr>>3;
+
+ printf("Decoded_output (Segment %d):\n",s);
+
+ for (i=0;idlsch[0][1]->harq_processes[0]->c[s][i],
+ UE->dlsch[0][1]->harq_processes[0]->c[s][i]^eNB->dlsch[0][1]->harq_processes[0]->c[s][i]);
+ }
+ #endif
+ }
+ }
+ } //round_sic
+
+
+ if (ret[1] > UE->dlsch[0][0]->max_turbo_iterations ){
+ errs[1][round]++;
+#ifdef DEBUG_HARQ
+ printf("[DLSIM] TB1 is not decoded in SIC loop, errs[TB1][round %d] = %d\n",round, errs[1][round]);
+#endif
+
+ // exit(0);
+
+ avg_iter[1] += ret[1]-1;
+ iter_trials[1]++;
+
+ if (n_frames==2) {
+ //if ((n_frames==1) || (SNR>=30)) {
+ printf("cw sic %d, round %d: DLSCH errors found, uncoded ber %f\n",1,round,uncoded_ber);
+#ifdef PRINT_BYTES
+ for (s=0;sdlsch[0][1]->harq_processes[0]->C;s++) {
+ if (sdlsch[0][1]->harq_processes[0]->Cminus)
+ Kr = UE->dlsch[0][1]->harq_processes[0]->Kminus;
+ else
+ Kr = UE->dlsch[0][1]->harq_processes[0]->Kplus;
+
+ Kr_bytes = Kr>>3;
+
+ printf("Decoded_output (Segment %d):\n",s);
+ for (i=0;idlsch[0][1]->harq_processes[0]->c[s][i],
+ UE->dlsch[0][1]->harq_processes[0]->c[s][i]^eNB->dlsch[0][1]->harq_processes[0]->c[s][i]);
+ }
+#endif
+ } //n_frames==1
+ // exit(0);
+ } //if (ret > UE->dlsch[0][1]->max_turbo_iterations )
+ }//if SIC
+ } else {
+
+ errs[TB][round]++;
+#ifdef DEBUG_HARQ
+ printf("[DLSIM] TB%d is not decoded outside SIC loop, errs[TB%d][round %d] = %d\n", TB, TB, round, errs[TB][round]);
+#endif
+
+
+ /*if (cw_non_sic==0) {
+ avg_iter[0] += ret[0]-1;
+ iter_trials[0]++;
+ }*/
+
+ if ((UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) &&
+ (UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->mimo_mode <=DUALSTREAM_PUSCH_PRECODING) &&
+ (rx_type==rx_SIC_dual_stream) && (TB0_active ==1)) {
+ errs[1][round]++;
+#ifdef DEBUG_HARQ
+ printf("[DLSIM] TB%d is not decoded outside SIC loop, errs[TB%d][round %d] = %d\n", 1, 1, round, errs[1][round]);
+#endif
+ }
+
+
+ /*if (cw_non_sic==1) {
+ avg_iter[1] += ret[1]-1;
+ iter_trials[1]++;
+ }*/
+
+
+ if (n_frames==2) {
+ //if ((n_frames==1) || (SNR>=30)) {
+ printf("cw %d, round %d: DLSCH errors found, uncoded ber %f\n",TB,round,uncoded_ber);
+#ifdef PRINT_BYTES
+ for (s=0;sdlsch[0][TB]->harq_processes[0]->C;s++) {
+ if (sdlsch[0][TB]->harq_processes[0]->Cminus)
+ Kr = UE->dlsch[0][TB]->harq_processes[0]->Kminus;
+ else
+ Kr = UE->dlsch[0][TB]->harq_processes[0]->Kplus;
+
+ Kr_bytes = Kr>>3;
+
+ printf("Decoded_output (Segment %d):\n",s);
+ for (i=0;idlsch[0][TB]->harq_processes[0]->c[s][i],
+ UE->dlsch[0][TB]->harq_processes[0]->c[s][i]^eNB->dlsch[0][TB]->harq_processes[0]->c[s][i]);
+ }
+#endif
+ }
+ }
+ if (rx_type==rx_SIC_dual_stream)
+ TB++; // to terminate the loop over TB
+ }
+
+ stop_meas(&UE->phy_proc_rx);
+
+ if (n_frames==1) {
+
+ //rxsig
+ sprintf(fname,"rxsig0_r%d.m",round);
+ sprintf(vname,"rxs0_r%d",round);
+ write_output(fname,vname, &UE->common_vars.rxdata[0][0],10*UE->frame_parms.samples_per_tti,1,1);
+ sprintf(fname,"rxsigF0_r%d.m",round);
+ sprintf(vname,"rxs0F_r%d",round);
+ write_output(fname,vname, &UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[0][0],2*UE->frame_parms.ofdm_symbol_size*nsymb,2,1);
+ if (UE->frame_parms.nb_antennas_rx>1) {
+ sprintf(fname,"rxsig1_r%d.m",round);
+ sprintf(vname,"rxs1_r%d",round);
+ write_output(fname,vname, UE->common_vars.rxdata[1],UE->frame_parms.samples_per_tti,1,1);
+ sprintf(fname,"rxsig1F_r%d.m",round);
+ sprintf(vname,"rxs1F_r%d",round);
+ write_output(fname,vname, UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[1],2*UE->frame_parms.ofdm_symbol_size*nsymb,2,1);
+ }
+
+ //channel
+ write_output("chanF11.m","chF11",eNB2UE[0]->chF[0],12*NB_RB,1,8);
+ write_output("chan11.m","ch11",eNB2UE[0]->ch[0],eNB2UE[0]->channel_length,1,8);
+
+ if (eNB->frame_parms.nb_antennas_rx==2 && eNB->frame_parms.nb_antennas_tx==1 ){
+ write_output("chan21.m","ch21",eNB2UE[0]->ch[1],eNB2UE[0]->channel_length,1,8);
+ }
+ if (eNB->frame_parms.nb_antennas_tx>1){
+ write_output("chan12.m","ch12",eNB2UE[0]->ch[1],eNB2UE[0]->channel_length,1,8);
+ if ( eNB->frame_parms.nb_antennas_rx>1){
+ write_output("chan21.m","ch21",eNB2UE[0]->ch[2],eNB2UE[0]->channel_length,1,8);
+ write_output("chan22.m","ch22",eNB2UE[0]->ch[3],eNB2UE[0]->channel_length,1,8);
+ }
+ }
+
+ //channel estimates
+ sprintf(fname,"dlsch00_r%d.m",round);
+ sprintf(vname,"dl00_r%d",round);
+ write_output(fname,vname,
+ &(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][0][0]),
+ UE->frame_parms.ofdm_symbol_size*nsymb,1,1);
+ if (UE->frame_parms.nb_antennas_rx>1) {
+ sprintf(fname,"dlsch01_r%d.m",round);
+ sprintf(vname,"dl01_r%d",round);
+ write_output(fname,vname,
+ &(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][1][0]),
+ UE->frame_parms.ofdm_symbol_size*nsymb,1,1);
+ }
+ if (eNB->frame_parms.nb_antennas_tx>1) {
+ sprintf(fname,"dlsch10_r%d.m",round);
+ sprintf(vname,"dl10_r%d",round);
+ write_output(fname,vname,
+ &(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2][0]),
+ UE->frame_parms.ofdm_symbol_size*nsymb,1,1);
+ }
+ if ((UE->frame_parms.nb_antennas_rx>1) && (eNB->frame_parms.nb_antennas_tx>1)) {
+ sprintf(fname,"dlsch11_r%d.m",round);
+ sprintf(vname,"dl11_r%d",round);
+ write_output(fname,vname,
+ &(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][3][0]),
+ UE->frame_parms.ofdm_symbol_size*nsymb,1,1);
+ }
+ //pdsch_vars
+ dump_dlsch2(UE,eNB_id,coded_bits_per_codeword[0],round,UE->dlsch[0][0]->current_harq_pid);
+ /*
+ write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4);
+ write_output("dlsch_ber_bit.m","ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0);
+ write_output("dlsch_eNB_w.m","w",eNB->dlsch[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,4);
+ write_output("dlsch_UE_w.m","w",UE->dlsch[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,0);
+ */
+
+ //pdcch_vars
+ write_output("pdcchF0_ext.m","pdcchF_ext", UE->pdcch_vars[eNB_id]->rxdataF_ext[0],2*3*UE->frame_parms.ofdm_symbol_size,1,1);
+ write_output("pdcch00_ch0_ext.m","pdcch00_ch0_ext",UE->pdcch_vars[eNB_id]->dl_ch_estimates_ext[0],300*3,1,1);
+
+ write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",UE->pdcch_vars[eNB_id]->rxdataF_comp[0],4*300,1,1);
+ write_output("pdcch_rxF_llr.m","pdcch_llr",UE->pdcch_vars[eNB_id]->llr,2400,1,4);
+
+ if (round == 3) exit(-1);
+ }
+
+ if (xforms==1) {
+ phy_scope_UE(form_ue,
+ UE,
+ eNB_id,
+ 0,// UE_id
+ subframe);
+ }
+#ifdef DEBUG_HARQ
+ printf("[DLSIM] Errors errs[TB0][round %d] = %d, errs[TB1][round %d] = %d\n ", round, errs[0][round], round, errs[1][round]);
+#endif
+
+ if ((transmission_mode != 3) && (transmission_mode !=4) && (ret[0] > UE->dlsch[0][0]->max_turbo_iterations)){
+ //printf("flag 1 \n");
+ round++;
+ }
+
+
+ if (transmission_mode == 3 || transmission_mode == 4 ) {
+ if (ret[0] > UE->dlsch[0][0]->max_turbo_iterations &&
+ ret[1] > UE->dlsch[0][0]->max_turbo_iterations){
+ resend_both[round]++;
+ round++;
+ resend_cw0_cw1=1; //resend both cws
+ resend_cw1=0;
+ TB0_active=1;
+ TB1_active=1;
+ }
+ else if (ret[1] > UE->dlsch[0][0]->max_turbo_iterations &&
+ ret[0] <= UE->dlsch[0][0]->max_turbo_iterations){
+ resend_one[round]++;
+ resend_cw0_cw1=0;
+ TB0_active=0;
+ TB1_active=1;
+ if (rx_type == rx_IC_dual_stream)
+ TB0_deact[round]++;
+ if(is_first_time) {
+ hold_rank1_precoder = 0;
+ is_first_time = false;
+ }
+ else
+ hold_rank1_precoder = 1;
+
+#ifdef DEBUG_HARQ
+ printf("[DLSIM] ret[TB0] =%d, ret[TB1] =%d, trial %d \n", ret[0], ret[1], trials);
+ printf("[DLSIM] TB0 deactivated\n");
+#endif
+ round++;
+ }
+ else if (ret[0] > UE->dlsch[0][0]->max_turbo_iterations &&
+ ret[1] <= UE->dlsch[0][0]->max_turbo_iterations){
+ resend_one[round]++;
+ resend_cw0_cw1=0;
+ TB0_active=1;
+ TB1_active=0;
+ if (rx_type == rx_IC_dual_stream)
+ TB1_deact[round]++;
+ if(is_first_time) {
+ hold_rank1_precoder = 0;
+ is_first_time = false;
+ }
+ else
+ hold_rank1_precoder = 1;
+
+#ifdef DEBUG_HARQ
+ printf("[DLSIM] ret[TB0] =%d, ret[TB1] =%d, trial %d \n", ret[0], ret[1], trials);
+ printf("[DLSIM] TB1 deactivated\n");
+#endif
+ round++;
+ }
+ }
+
+#ifdef DEBUG_HARQ
+ printf("[DLSIM] Now round is %d, trial %d\n" , round, trials);
+#endif
+ }
+
+
+ if(transmission_mode != 3 && transmission_mode !=4 ){
+ if ((errs[0][0]>=n_frames/10) && (trials>(n_frames/2)) )
+ break;
+ }
+
+ //len = chbch_stats_read(stats_buffer,NULL,0,4096);
+ //printf("%s\n\n",stats_buffer);
+
+ if (UE->proc.proc_rxtx[0].frame_rx % 10 == 0) {
+ UE->bitrate[eNB_id] = (UE->total_TBS[eNB_id] - UE->total_TBS_last[eNB_id])*10;
+ LOG_D(PHY,"[UE %d] Calculating bitrate: total_TBS = %d, total_TBS_last = %d, bitrate = %d kbits/s\n",UE->Mod_id,UE->total_TBS[eNB_id],UE->total_TBS_last[eNB_id],UE->bitrate[eNB_id]/1000);
+ UE->total_TBS_last[eNB_id] = UE->total_TBS[eNB_id];
+ }
+
+
+ UE->proc.proc_rxtx[0].frame_rx++;
+
+ /* calculate the total processing time for each packet,
+ * get the max, min, and number of packets that exceed t>2000us
+ */
+ double t_tx = (double)eNB->phy_proc_tx.p_time/cpu_freq_GHz/1000.0;
+ double t_tx_ifft = (double)eNB->ofdm_mod_stats.p_time/cpu_freq_GHz/1000.0;
+ double t_tx_mod = (double)eNB->dlsch_modulation_stats.p_time/cpu_freq_GHz/1000.0;
+ double t_tx_enc = (double)eNB->dlsch_encoding_stats.p_time/cpu_freq_GHz/1000.0;
+
+
+ double t_rx = (double)UE->phy_proc_rx.p_time/cpu_freq_GHz/1000.0;
+ double t_rx_fft = (double)UE->ofdm_demod_stats.p_time/cpu_freq_GHz/1000.0;
+ double t_rx_demod = (double)UE->dlsch_rx_pdcch_stats.p_time/cpu_freq_GHz/1000.0;
+ double t_rx_dec = (double)UE->dlsch_decoding_stats.p_time/cpu_freq_GHz/1000.0;
+
+
+ if (t_tx > t_tx_max)
+ t_tx_max = t_tx;
+ if (t_tx < t_tx_min)
+ t_tx_min = t_tx;
+ if (t_rx > t_rx_max)
+ t_rx_max = t_rx;
+ if (t_rx < t_rx_min)
+ t_rx_min = t_rx;
+ if (t_tx > 2000)
+ n_tx_dropped++;
+ if (t_rx > 2000)
+ n_rx_dropped++;
+
+
+ push_front(&time_vector_tx, t_tx);
+ push_front(&time_vector_tx_ifft, t_tx_ifft);
+ push_front(&time_vector_tx_mod, t_tx_mod);
+ push_front(&time_vector_tx_enc, t_tx_enc);
+
+ push_front(&time_vector_rx, t_rx);
+ push_front(&time_vector_rx_fft, t_rx_fft);
+ push_front(&time_vector_rx_demod, t_rx_demod);
+ push_front(&time_vector_rx_dec, t_rx_dec);
+
+
+ } //trials
+
+#ifdef DEBUG_HARQ
+ printf("\n both failed round 0 = %d, both failed round 1 = %d, both failed round 2 = %d, both failed round 3 = %d\n", resend_both[0], resend_both[1], resend_both[2], resend_both[3]);
+ printf(" only one failed round 0 = %d, only one failed round 1 = %d, only one failed round 2 = %d, only one failed round 3 = %d\n", resend_one[0], resend_one[1], resend_one[2], resend_one[3]);
+ if (rx_type == rx_SIC_dual_stream){
+ printf(" sic attempt round 0 = %d, sic attempt round 1 = %d, sic attempt round 2 = %d, sic attempt round 3 = %d\n", sic_attempt[0], sic_attempt[1], sic_attempt[2], sic_attempt[3]);
+ printf(" decoded in sic round 0 = %d, decoded in sic round 1 = %d, decoded in sic round 2 = %d, decoded in sic round 3 = %d\n", decoded_in_sic[0], decoded_in_sic[1], decoded_in_sic[2], decoded_in_sic[3]);
+ }
+ else if (rx_type == rx_IC_dual_stream){
+ printf(" TB0 deactiv round 0 = %d, TB0 deactiv round 1 = %d, TB0 deactiv round 2 = %d, TB0 deactiv round 3 = %d\n", TB0_deact[0], TB0_deact[1], TB0_deact[2], TB0_deact[3]);
+ printf(" TB1 deactiv round 0 = %d, TB1 deactiv round 1 = %d, TB1 deactiv round 2 = %d, TB1 deactiv round 3 = %d\n", TB1_deact[0], TB1_deact[1], TB1_deact[2], TB1_deact[3]);
+ }
+#endif
+ // round_trials[0]: number of code word : goodput the protocol
+ double table_tx[time_vector_tx.size];
+ totable(table_tx, &time_vector_tx);
+ double table_tx_ifft[time_vector_tx_ifft.size];
+ totable(table_tx_ifft, &time_vector_tx_ifft);
+ double table_tx_mod[time_vector_tx_mod.size];
+ totable(table_tx_mod, &time_vector_tx_mod);
+ double table_tx_enc[time_vector_tx_enc.size];
+ totable(table_tx_enc, &time_vector_tx_enc);
+
+ double table_rx[time_vector_rx.size];
+ totable(table_rx, &time_vector_rx);
+ double table_rx_fft[time_vector_rx_fft.size];
+ totable(table_rx_fft, &time_vector_rx_fft);
+ double table_rx_demod[time_vector_rx_demod.size];
+ totable(table_rx_demod, &time_vector_rx_demod);
+ double table_rx_dec[time_vector_rx_dec.size];
+ totable(table_rx_dec, &time_vector_rx_dec);
+
+
+ // sort table
+ qsort (table_tx, time_vector_tx.size, sizeof(double), &compare);
+ qsort (table_rx, time_vector_rx.size, sizeof(double), &compare);
+
+ if (dump_table == 1 ) {
+ set_component_filelog(USIM); // file located in /tmp/usim.txt
+ int n;
+ LOG_F(USIM,"The transmitter raw data: \n");
+
+ for (n=0; n< time_vector_tx.size; n++) {
+ printf("%f ", table_tx[n]);
+ LOG_F(USIM,"%f ", table_tx[n]);
+ }
+
+ LOG_F(USIM,"\n");
+ LOG_F(USIM,"The receiver raw data: \n");
+
+ for (n=0; n< time_vector_rx.size; n++) {
+ // printf("%f ", table_rx[n]);
+ LOG_F(USIM,"%f ", table_rx[n]);
+ }
+
+ LOG_F(USIM,"\n");
+ }
+
+ double tx_median = table_tx[time_vector_tx.size/2];
+ double tx_q1 = table_tx[time_vector_tx.size/4];
+ double tx_q3 = table_tx[3*time_vector_tx.size/4];
+
+ double tx_ifft_median = table_tx_ifft[time_vector_tx_ifft.size/2];
+ double tx_ifft_q1 = table_tx_ifft[time_vector_tx_ifft.size/4];
+ double tx_ifft_q3 = table_tx_ifft[3*time_vector_tx_ifft.size/4];
+
+ double tx_mod_median = table_tx_mod[time_vector_tx_mod.size/2];
+ double tx_mod_q1 = table_tx_mod[time_vector_tx_mod.size/4];
+ double tx_mod_q3 = table_tx_mod[3*time_vector_tx_mod.size/4];
+
+ double tx_enc_median = table_tx_enc[time_vector_tx_enc.size/2];
+ double tx_enc_q1 = table_tx_enc[time_vector_tx_enc.size/4];
+ double tx_enc_q3 = table_tx_enc[3*time_vector_tx_enc.size/4];
+
+ double rx_median = table_rx[time_vector_rx.size/2];
+ double rx_q1 = table_rx[time_vector_rx.size/4];
+ double rx_q3 = table_rx[3*time_vector_rx.size/4];
+
+ double rx_fft_median = table_rx_fft[time_vector_rx_fft.size/2];
+ double rx_fft_q1 = table_rx_fft[time_vector_rx_fft.size/4];
+ double rx_fft_q3 = table_rx_fft[3*time_vector_rx_fft.size/4];
+
+ double rx_demod_median = table_rx_demod[time_vector_rx_demod.size/2];
+ double rx_demod_q1 = table_rx_demod[time_vector_rx_demod.size/4];
+ double rx_demod_q3 = table_rx_demod[3*time_vector_rx_demod.size/4];
+
+ double rx_dec_median = table_rx_dec[time_vector_rx_dec.size/2];
+ double rx_dec_q1 = table_rx_dec[time_vector_rx_dec.size/4];
+ double rx_dec_q3 = table_rx_dec[3*time_vector_rx_dec.size/4];
+
+ double std_phy_proc_tx=0;
+ double std_phy_proc_tx_ifft=0;
+ double std_phy_proc_tx_mod=0;
+ double std_phy_proc_tx_enc=0;
+
+ double std_phy_proc_rx=0;
+ double std_phy_proc_rx_fft=0;
+ double std_phy_proc_rx_demod=0;
+ double std_phy_proc_rx_dec=0;
+
+
+ if (transmission_mode != 3 && transmission_mode !=4) {
+ effective_rate = ((double)(round_trials[0][0]-dci_errors)/((double)round_trials[0][0] + round_trials[0][1] + round_trials[0][2] + round_trials[0][3]));
+ }
+ else {
+ effective_rate = ((double)(round_trials[0][0]-dci_errors)/((double)round_trials[0][0] + round_trials[0][1] + round_trials[0][2] + round_trials[0][3]))+
+ ((double)(round_trials[1][0])/((double)round_trials[1][0] + round_trials[1][1] + round_trials[1][2] + round_trials[1][3]));
+ }
+
+ /*
+ Here we compute throughput per cw based on the formula
+ T=P_suc[r1]R(mcs) + sum[r=2 ..r=4] (P_(suc r, fail r-1)*R/r).
+ The non-constr formula should not be used, when there are some errors on the last round,
+ meaning when not all the packages are finally decoded.
+ */
+
+ if (transmission_mode == 3 || transmission_mode == 4) {
+ // FOR CW0
+ thr_cw0[0] = rate0_init*get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs)*(1-((double)errs[0][0]/(double)round_trials[0][0]));
+ thr_cw0[1] = (rate0_init*get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs)/2)*(((double)errs[0][0] - (double)errs[0][1])/(double)round_trials[0][0]);
+ thr_cw0[2] = (rate0_init*get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs)/3)*(((double)errs[0][1] - (double)errs[0][2])/(double)round_trials[0][0]);
+ thr_cw0[3] = (rate0_init*get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs)/4)*(((double)errs[0][2] - (double)errs[0][3])/(double)round_trials[0][0]);
+ thr_cw0_tot = (double)thr_cw0[0]+(double)thr_cw0[1]+(double)thr_cw0[2]+(double)thr_cw0[3];
+#ifdef PRINT_THROUGHPUT
+ printf("rate %f \n", rate0_init);
+ printf("rate*mod_order %f \n", rate0_init*get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs));
+ printf("Probability %f \n", (1-((double)errs[0][0]/(double)round_trials[0][0])));
+ printf("Throughput cw0 sum = %f \n", thr_cw0_tot);
+ printf("Throughput cw0 round 0 = %f \n", thr_cw0[0]);
+ printf("Throughput cw0 round 1 = %f \n", thr_cw0[1]);
+ printf("Throughput cw0 round 2 = %f \n", thr_cw0[2]);
+ printf("Throughput cw0 round 3 = %f \n", thr_cw0[3]);
+ printf("round_trials = %d, errs[0][0] = %d, round_trials[0][1] = %d, errs[0][1] = %d, round_trials[0][2] = %d, errs[0][2] = %d, \
+ round_trials[0][3] = %d, errs[0][3] = %d \n", round_trials[0][0], errs[0][0],round_trials[0][1], errs[0][1], round_trials[0][2], \
+ errs[0][2], round_trials[0][3], errs[0][3]);
+#endif
+
+ thr_cw1[0] = rate1_init*get_Qm(eNB->dlsch[0][1]->harq_processes[0]->mcs)*(1-((double)errs[1][0]/(double)round_trials[1][0]));
+ thr_cw1[1] = (rate1_init*get_Qm(eNB->dlsch[0][1]->harq_processes[0]->mcs)/2)*(((double)errs[1][0] - (double)errs[1][1])/(double)round_trials[1][0]);
+ thr_cw1[2] = (rate1_init*get_Qm(eNB->dlsch[0][1]->harq_processes[0]->mcs)/3)*(((double)errs[1][1] - (double)errs[1][2])/(double)round_trials[1][0]);
+ thr_cw1[3] = (rate1_init*get_Qm(eNB->dlsch[0][1]->harq_processes[0]->mcs)/4)*(((double)errs[1][2] - (double)errs[1][3])/(double)round_trials[1][0]);
+ thr_cw1_tot = (double)thr_cw1[0]+(double)thr_cw1[1]+(double)thr_cw1[2]+(double)thr_cw1[3];
+#ifdef PRINT_THROUGHPUT
+ printf("Throughput cw1 sum = %f \n", thr_cw1_tot);
+ printf("Throughput cw1 round 0 = %f \n", thr_cw1[0]);
+ printf("Throughput cw1 round 1 = %f \n", thr_cw1[1]);
+ printf("Throughput cw1 round 2 = %f \n", thr_cw1[2]);
+ printf("Throughput cw1 round 3 = %f \n", thr_cw1[3]);
+ printf("round_trials[1][0] = %d, errs[1][0] = %d, round_trials[1][1] = %d, errs[1][1] = %d, round_trials[1][2] = %d, errs[1][2] = %d, \
+ round_trials[1][3] = %d, errs[1][3] = %d \n", round_trials[1][0], errs[1][0], round_trials[1][1], errs[1][1], round_trials[1][2], \
+ errs[1][2], round_trials[1][3], errs[1][3]);
+#endif
+ }
+
+#if 0
+ thr_cw0_tm4_nonconst = rate[0]*get_Qm(PHY_vars_eNB->dlsch[0][0]->harq_processes[0]->mcs)* \
+ ((double)(round_trials[0][0]-dci_errors)/((double)round_trials[0][0] + round_trials[0][1] + round_trials[0][2] + round_trials[0][3]));
+ printf("Throughput cw0 noncnstr = %f \n", thr_cw0_tm4_nonconst);
+#endif
+ //FOR CW1
+ /*thr_cw1[0] = rate[1]*get_Qm(PHY_vars_eNB->dlsch[0][1]->harq_processes[0]->mcs)*(1-((double)errs[0][0]/(double)round_trials[0][0])) \
+ *(1-((double)errs[1][0]/(double)round_trials[1][0]));
+ printf("thr cw1 round 0 = %f\n", thr_cw1[0]);
+ thr_cw1[1]=(rate[1]*get_Qm(PHY_vars_eNB->dlsch[0][1]->harq_processes[0]->mcs)/2)*\
+ (((double)errs[1][0]-(double)errs[1][1])*((double)round_trials[0][0] - (double)errs[0][1])/((double)round_trials[0][0]*(double)round_trials[1][0]));
+ printf("thr cw1 round 1 = %f\n", thr_cw1[1]);
+ thr_cw1[2] = (rate[0]*get_Qm(PHY_vars_eNB->dlsch[0][0]->harq_processes[0]->mcs)/3)*\
+ ((double)errs[1][1]-(double)errs[1][2])*((double)round_trials[0][0]-(double)errs[0][2])/((double)round_trials[0][0]*(double)round_trials[1][0]);
+ printf("thr cw1 round 2 = %f\n", thr_cw1[2]);
+ thr_cw1[3] = (rate[0]*get_Qm(PHY_vars_eNB->dlsch[0][0]->harq_processes[0]->mcs)/4)*\
+ ((double)errs[1][2]-(double)errs[1][3])*((double)round_trials[0][0] - (double)errs[0][3])/((double)round_trials[0][0]*(double)round_trials[1][0]);
+ resid_errs=
+ printf("thr cw1 round 3 = %f\n", thr_cw1[3]);
+ thr_cw1_tot =thr_cw1[0]+thr_cw1[1]+thr_cw1[2]+thr_cw1[3];
+ printf("Throughput cw1 sum = %f \n", thr_cw1_tot);
+ printf("round_trials = %d, errs[1][0] = %d, round_trials[1][1] = %d, errs[1][1] = %d, round_trials[1][2] = %d, errs[1][2] = %d, \
+ round_trials[1][3] = %d, errs[1][3] = %d \n", round_trials[1][0], errs[1][0],round_trials[1][1], errs[1][1], round_trials[1][2], \
+ errs[1][2], round_trials[1][3], errs[1][3]);
+ }*/
+
+
+ printf("\n**********************SNR = %f dB (tx_lev %f, sigma2_dB %f)**************************\n",
+ SNR,
+ (double)tx_lev_dB+10*log10(UE->frame_parms.ofdm_symbol_size/(NB_RB*12)),
+ sigma2_dB);
+ if ((transmission_mode != 3) && (transmission_mode != 4)){
+ printf("Errors (%d(%d)/%d %d(%d)/%d %d(%d)/%d %d(%d)/%d), Pe = (%e(%e),%e(%e),%e(%e),%e(%e)),"
+ "dci_errors %d/%d, Pe = %e => effective rate %f (%2.1f%%,%f, %f), normalized delay %f (%f), "
+ "throughput stream 0 = %f , throughput stream 1 = %f, system throughput = %f , rate 0 = %f , rate 1 = %f \n",
+ errs[0][0],
+ errs[1][0],
+ round_trials[0][0],
+ errs[0][1],
+ errs[1][1],
+ round_trials[0][0],
+ errs[0][2],
+ errs[1][2],
+ round_trials[0][0],
+ errs[0][3],
+ errs[1][3],
+ round_trials[0][0],
+ (double)errs[0][0]/(round_trials[0][0]),
+ (double)errs[1][0]/(round_trials[0][0]),
+ (double)errs[0][1]/(round_trials[0][0]),
+ (double)errs[1][1]/(round_trials[0][0]),
+ (double)errs[0][2]/(round_trials[0][0]),
+ (double)errs[1][2]/(round_trials[0][0]),
+ (double)errs[0][3]/(round_trials[0][0]),
+ (double)errs[1][3]/(round_trials[0][0]),
+ dci_errors,
+ round_trials[0][0],
+ (double)dci_errors/(round_trials[0][0]),
+ rate[0]*effective_rate,
+ 100*effective_rate,
+ rate[0],
+ rate[0]*get_Qm(UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs),
+ (1.0*(round_trials[0][0]-errs[0][0])+2.0*(round_trials[0][1]-errs[0][1])+3.0*(round_trials[0][2]-errs[0][2])+
+ 4.0*(round_trials[0][3]-errs[0][3]))/((double)round_trials[0][0])/(double)eNB->dlsch[0][0]->harq_processes[0]->TBS,
+ (1.0*(round_trials[0][0]-errs[0][0])+2.0*(round_trials[0][1]-errs[0][1])+3.0*(round_trials[0][2]-errs[0][2])
+ +4.0*(round_trials[0][3]-errs[0][3]))/((double)round_trials[0][0]),
+ thr_cw0_tot,
+ thr_cw1_tot,
+ thr_cw0_tot + thr_cw1_tot,
+ rate[0],
+ rate[1]);
+ }else{
+ printf("Errors (%d(%d)/%d %d(%d)/%d %d(%d)/%d %d(%d)/%d),"
+ "dci_errors %d/%d, thr TB0 = %f , thr TB1 = %f, overall thr = %f , rate 0 = %f , rate 1 = %f \n",
+ errs[0][0],
+ errs[1][0],
+ round_trials[0][0],
+ errs[0][1],
+ errs[1][1],
+ round_trials[0][0],
+ errs[0][2],
+ errs[1][2],
+ round_trials[0][0],
+ errs[0][3],
+ errs[1][3],
+ round_trials[0][0],
+ dci_errors,
+ round_trials[0][0],
+ thr_cw0_tot,
+ thr_cw1_tot,
+ thr_cw0_tot + thr_cw1_tot,
+ rate0_init,
+ rate1_init);
+ }
+
+ if (print_perf==1) {
+ printf("eNB TX function statistics (per 1ms subframe)\n\n");
+ std_phy_proc_tx = sqrt((double)eNB->phy_proc_tx.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+ 2)/eNB->phy_proc_tx.trials - pow((double)eNB->phy_proc_tx.diff/eNB->phy_proc_tx.trials/cpu_freq_GHz/1000,2));
+ printf("Total PHY proc tx :%f us (%d trials)\n",(double)eNB->phy_proc_tx.diff/eNB->phy_proc_tx.trials/cpu_freq_GHz/1000.0,eNB->phy_proc_tx.trials);
+ printf("|__ Statistcs std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n",std_phy_proc_tx, t_tx_max, t_tx_min, tx_median, tx_q1, tx_q3,
+ n_tx_dropped);
+ std_phy_proc_tx_ifft = sqrt((double)eNB->ofdm_mod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+ 2)/eNB->ofdm_mod_stats.trials - pow((double)eNB->ofdm_mod_stats.diff/eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000,2));
+ printf("OFDM_mod time :%f us (%d trials)\n",(double)eNB->ofdm_mod_stats.diff/eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000.0,eNB->ofdm_mod_stats.trials);
+ printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_ifft, tx_ifft_median, tx_ifft_q1, tx_ifft_q3);
+ std_phy_proc_tx_mod = sqrt((double)eNB->dlsch_modulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+ 2)/eNB->dlsch_modulation_stats.trials - pow((double)eNB->dlsch_modulation_stats.diff/eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000,2));
+ printf("DLSCH modulation time :%f us (%d trials)\n",(double)eNB->dlsch_modulation_stats.diff/eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000.0,
+ eNB->dlsch_modulation_stats.trials);
+ printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_mod, tx_mod_median, tx_mod_q1, tx_mod_q3);
+ printf("DLSCH scrambling time :%f us (%d trials)\n",(double)eNB->dlsch_scrambling_stats.diff/eNB->dlsch_scrambling_stats.trials/cpu_freq_GHz/1000.0,
+ eNB->dlsch_scrambling_stats.trials);
+ std_phy_proc_tx_enc = sqrt((double)eNB->dlsch_encoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+ 2)/eNB->dlsch_encoding_stats.trials - pow((double)eNB->dlsch_encoding_stats.diff/eNB->dlsch_encoding_stats.trials/cpu_freq_GHz/1000,2));
+ printf("DLSCH encoding time :%f us (%d trials)\n",(double)eNB->dlsch_encoding_stats.diff/eNB->dlsch_encoding_stats.trials/cpu_freq_GHz/1000.0,
+ eNB->dlsch_modulation_stats.trials);
+ printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_enc, tx_enc_median, tx_enc_q1, tx_enc_q3);
+ printf("|__ DLSCH turbo encoding time :%f us (%d trials)\n",
+ ((double)eNB->dlsch_turbo_encoding_stats.trials/eNB->dlsch_encoding_stats.trials)*(double)
+ eNB->dlsch_turbo_encoding_stats.diff/eNB->dlsch_turbo_encoding_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_turbo_encoding_stats.trials);
+ printf("|__ DLSCH rate-matching time :%f us (%d trials)\n",
+ ((double)eNB->dlsch_rate_matching_stats.trials/eNB->dlsch_encoding_stats.trials)*(double)
+ eNB->dlsch_rate_matching_stats.diff/eNB->dlsch_rate_matching_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_rate_matching_stats.trials);
+ printf("|__ DLSCH sub-block interleaving time :%f us (%d trials)\n",
+ ((double)eNB->dlsch_interleaving_stats.trials/eNB->dlsch_encoding_stats.trials)*(double)
+ eNB->dlsch_interleaving_stats.diff/eNB->dlsch_interleaving_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_interleaving_stats.trials);
+
+ printf("\n\nUE RX function statistics (per 1ms subframe)\n\n");
+ std_phy_proc_rx = sqrt((double)UE->phy_proc_rx.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+ 2)/UE->phy_proc_rx.trials - pow((double)UE->phy_proc_rx.diff/UE->phy_proc_rx.trials/cpu_freq_GHz/1000,2));
+ printf("Total PHY proc rx :%f us (%d trials)\n",(double)UE->phy_proc_rx.diff/UE->phy_proc_rx.trials/cpu_freq_GHz/1000.0,
+ UE->phy_proc_rx.trials*2/3);
+ printf("|__Statistcs std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n", std_phy_proc_rx, t_rx_max, t_rx_min, rx_median,
+ rx_q1, rx_q3, n_rx_dropped);
+ std_phy_proc_rx_fft = sqrt((double)UE->ofdm_demod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+ 2)/UE->ofdm_demod_stats.trials - pow((double)UE->ofdm_demod_stats.diff/UE->ofdm_demod_stats.trials/cpu_freq_GHz/1000,2));
+ printf("DLSCH OFDM demodulation and channel_estimation time :%f us (%d trials)\n",(nsymb)*(double)UE->ofdm_demod_stats.diff/UE->ofdm_demod_stats.trials/cpu_freq_GHz/1000.0,
+ UE->ofdm_demod_stats.trials*2/3);
+ printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_rx_fft, rx_fft_median, rx_fft_q1, rx_fft_q3);
+ printf("|__ DLSCH rx dft :%f us (%d trials)\n",
+ (nsymb*UE->frame_parms.nb_antennas_rx)*(double)UE->rx_dft_stats.diff/UE->rx_dft_stats.trials/cpu_freq_GHz/1000.0,UE->rx_dft_stats.trials*2/3);
+ printf("|__ DLSCH channel estimation time :%f us (%d trials)\n",
+ (4.0)*(double)UE->dlsch_channel_estimation_stats.diff/UE->dlsch_channel_estimation_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_channel_estimation_stats.trials*2/3);
+ printf("|__ DLSCH frequency offset estimation time :%f us (%d trials)\n",
+ (4.0)*(double)UE->dlsch_freq_offset_estimation_stats.diff/UE->dlsch_freq_offset_estimation_stats.trials/cpu_freq_GHz/1000.0,
+ UE->dlsch_freq_offset_estimation_stats.trials*2/3);
+ printf("DLSCH rx pdcch :%f us (%d trials)\n",(double)UE->dlsch_rx_pdcch_stats.diff/UE->dlsch_rx_pdcch_stats.trials/cpu_freq_GHz/1000.0,
+ UE->dlsch_rx_pdcch_stats.trials);
+ std_phy_proc_rx_demod = sqrt((double)UE->dlsch_llr_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+ 2)/UE->dlsch_llr_stats.trials - pow((double)UE->dlsch_llr_stats.diff/UE->dlsch_llr_stats.trials/cpu_freq_GHz/1000,2));
+ printf("DLSCH Channel Compensation and LLR generation time :%f us (%d trials)\n",(3)*(double)UE->dlsch_llr_stats.diff/UE->dlsch_llr_stats.trials/cpu_freq_GHz/1000.0,
+ UE->dlsch_llr_stats.trials/3);
+ printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_rx_demod, rx_demod_median, rx_demod_q1, rx_demod_q3);
+ printf("DLSCH unscrambling time :%f us (%d trials)\n",(double)UE->dlsch_unscrambling_stats.diff/UE->dlsch_unscrambling_stats.trials/cpu_freq_GHz/1000.0,
+ UE->dlsch_unscrambling_stats.trials);
+ std_phy_proc_rx_dec = sqrt((double)UE->dlsch_decoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+ 2)/UE->dlsch_decoding_stats.trials - pow((double)UE->dlsch_decoding_stats.diff/UE->dlsch_decoding_stats.trials/cpu_freq_GHz/1000,2));
+ printf("DLSCH Decoding time (%02.2f Mbit/s, avg iter %1.2f) :%f us (%d trials, max %f)\n",
+ eNB->dlsch[0][0]->harq_processes[0]->TBS/1000.0,(double)avg_iter[0]/iter_trials[0],
+ (double)UE->dlsch_decoding_stats.diff/UE->dlsch_decoding_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_decoding_stats.trials,
+ (double)UE->dlsch_decoding_stats.max/cpu_freq_GHz/1000.0);
+ printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_rx_dec, rx_dec_median, rx_dec_q1, rx_dec_q3);
+ printf("|__ DLSCH Rate Unmatching :%f us (%d trials)\n",
+ (double)UE->dlsch_rate_unmatching_stats.diff/UE->dlsch_rate_unmatching_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_rate_unmatching_stats.trials);
+ printf("|__ DLSCH Turbo Decoding(%d bits) :%f us (%d trials)\n",
+ UE->dlsch[0][0]->harq_processes[0]->Cminus ? UE->dlsch[0][0]->harq_processes[0]->Kminus : UE->dlsch[0][0]->harq_processes[0]->Kplus,
+ (double)UE->dlsch_turbo_decoding_stats.diff/UE->dlsch_turbo_decoding_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_turbo_decoding_stats.trials);
+ printf(" |__ init %f us (cycles/iter %f, %d trials)\n",
+ (double)UE->dlsch_tc_init_stats.diff/UE->dlsch_tc_init_stats.trials/cpu_freq_GHz/1000.0,
+ (double)UE->dlsch_tc_init_stats.diff/UE->dlsch_tc_init_stats.trials/((double)avg_iter[0]/iter_trials[0]),
+ UE->dlsch_tc_init_stats.trials);
+ printf(" |__ alpha %f us (cycles/iter %f, %d trials)\n",
+ (double)UE->dlsch_tc_alpha_stats.diff/UE->dlsch_tc_alpha_stats.trials/cpu_freq_GHz/1000.0,
+ (double)UE->dlsch_tc_alpha_stats.diff/UE->dlsch_tc_alpha_stats.trials*2,
+ UE->dlsch_tc_alpha_stats.trials);
+ printf(" |__ beta %f us (cycles/iter %f,%d trials)\n",
+ (double)UE->dlsch_tc_beta_stats.diff/UE->dlsch_tc_beta_stats.trials/cpu_freq_GHz/1000.0,
+ (double)UE->dlsch_tc_beta_stats.diff/UE->dlsch_tc_beta_stats.trials*2,
+ UE->dlsch_tc_beta_stats.trials);
+ printf(" |__ gamma %f us (cycles/iter %f,%d trials)\n",
+ (double)UE->dlsch_tc_gamma_stats.diff/UE->dlsch_tc_gamma_stats.trials/cpu_freq_GHz/1000.0,
+ (double)UE->dlsch_tc_gamma_stats.diff/UE->dlsch_tc_gamma_stats.trials*2,
+ UE->dlsch_tc_gamma_stats.trials);
+ printf(" |__ ext %f us (cycles/iter %f,%d trials)\n",
+ (double)UE->dlsch_tc_ext_stats.diff/UE->dlsch_tc_ext_stats.trials/cpu_freq_GHz/1000.0,
+ (double)UE->dlsch_tc_ext_stats.diff/UE->dlsch_tc_ext_stats.trials*2,
+ UE->dlsch_tc_ext_stats.trials);
+ printf(" |__ intl1 %f us (cycles/iter %f,%d trials)\n",
+ (double)UE->dlsch_tc_intl1_stats.diff/UE->dlsch_tc_intl1_stats.trials/cpu_freq_GHz/1000.0,
+ (double)UE->dlsch_tc_intl1_stats.diff/UE->dlsch_tc_intl1_stats.trials,
+ UE->dlsch_tc_intl1_stats.trials);
+ printf(" |__ intl2+HD+CRC %f us (cycles/iter %f,%d trials)\n",
+ (double)UE->dlsch_tc_intl2_stats.diff/UE->dlsch_tc_intl2_stats.trials/cpu_freq_GHz/1000.0,
+ (double)UE->dlsch_tc_intl2_stats.diff/UE->dlsch_tc_intl2_stats.trials,
+ UE->dlsch_tc_intl2_stats.trials);
+ }
+
+ if ((transmission_mode != 3) && (transmission_mode != 4)) {
+ fprintf(bler_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d\n",
+ SNR,
+ mcs1,
+ eNB->dlsch[0][0]->harq_processes[0]->TBS,
+ rate[0],
+ errs[0][0],
+ round_trials[0][0],
+ errs[0][1],
+ round_trials[0][1],
+ errs[0][2],
+ round_trials[0][2],
+ errs[0][3],
+ round_trials[0][3],
+ dci_errors);
+ }
+ else if ( rx_type== rx_SIC_dual_stream) {
+ fprintf(bler_fd,"%f;%d;%d;%d;%d;%f;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f\n",
+ SNR,
+ mcs1,
+ mcs2,
+ tbs0_init,
+ tbs1_init,
+ rate0_init,
+ rate1_init,
+ errs[0][0],
+ errs[1][0],
+ round_trials[0][0],
+ round_trials[1][0],
+ sic_attempt[0],
+ decoded_in_sic[0],
+ resend_both[0],
+ resend_one[0],
+ errs[0][1],
+ errs[1][1],
+ round_trials[0][1],
+ round_trials[1][1],
+ sic_attempt[1],
+ decoded_in_sic[1],
+ resend_both[1],
+ resend_one[1],
+ errs[0][2],
+ errs[1][2],
+ round_trials[0][2],
+ round_trials[1][2],
+ sic_attempt[2],
+ decoded_in_sic[2],
+ resend_both[2],
+ resend_one[2],
+ errs[0][3],
+ errs[1][3],
+ round_trials[0][3],
+ round_trials[1][3],
+ sic_attempt[3],
+ decoded_in_sic[3],
+ thr_cw0[0],
+ thr_cw1[0],
+ thr_cw0[0]+thr_cw1[0],
+ thr_cw0[1],
+ thr_cw1[1],
+ thr_cw0[1]+thr_cw1[1],
+ thr_cw0[2],
+ thr_cw1[2],
+ thr_cw0[2]+thr_cw1[2],
+ thr_cw0[3],
+ thr_cw1[3],
+ thr_cw0[3]+thr_cw1[3],
+ thr_cw0[0]+thr_cw0[1]+thr_cw0[2]+thr_cw0[3]+thr_cw1[0]+thr_cw1[1]+thr_cw1[2]+ thr_cw1[3]);
+ }
+ else{
+ fprintf(bler_fd,"%f;%d;%d;%d;%d;%f;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f\n",
+ SNR,
+ mcs1,
+ mcs2,
+ tbs0_init,
+ tbs1_init,
+ rate0_init,
+ rate1_init,
+ errs[0][0],
+ errs[1][0],
+ round_trials[0][0],
+ round_trials[1][0],
+ TB0_deact[0],
+ TB1_deact[0],
+ resend_both[0],
+ resend_one[0],
+ errs[0][1],
+ errs[1][1],
+ round_trials[0][1],
+ round_trials[1][1],
+ TB0_deact[1],
+ TB1_deact[1],
+ resend_both[1],
+ resend_one[1],
+ errs[0][2],
+ errs[1][2],
+ round_trials[0][2],
+ round_trials[1][2],
+ TB0_deact[2],
+ TB1_deact[2],
+ resend_both[2],
+ resend_one[2],
+ errs[0][3],
+ errs[1][3],
+ round_trials[0][3],
+ round_trials[1][3],
+ thr_cw0[0],
+ thr_cw1[0],
+ thr_cw0[0]+thr_cw1[0],
+ thr_cw0[1],
+ thr_cw1[1],
+ thr_cw0[1]+thr_cw1[1],
+ thr_cw0[2],
+ thr_cw1[2],
+ thr_cw0[2]+thr_cw1[2],
+ thr_cw0[3],
+ thr_cw1[3],
+ thr_cw0[3]+thr_cw1[3],
+ thr_cw0[0]+thr_cw0[1]+thr_cw0[2]+thr_cw0[3]+thr_cw1[0]+thr_cw1[1]+thr_cw1[2]+ thr_cw1[3]);
+ }
+
+
+ if(abstx){ //ABSTRACTION
+ if ((transmission_mode != 3)&& (transmission_mode != 4)) {
+
+ blerr[0][0] = (double)errs[0][0]/(round_trials[0][0]);
+
+ if(num_rounds>1){
+ blerr[0][1] = (double)errs[0][1]/(round_trials[0][1]);
+
+ blerr[0][2] = (double)errs[0][2]/(round_trials[0][2]);
+
+ blerr[0][3] = (double)errs[0][3]/(round_trials[0][3]);
+
+ fprintf(csv_fd,"%e;%e;%e;%e;\n",blerr[0][0],blerr[0][1],blerr[0][2],blerr[0][3]);
+ }
+ else {
+ fprintf(csv_fd,"%e;\n",blerr[0][0]);
+ }
+ }
+ else {
+ blerr[0][0] = (double)errs[0][0]/(round_trials[0][0]);
+ blerr[1][0] = (double)errs[1][0]/(round_trials[0][0]);
+ if(num_rounds>1){
+ blerr[0][1] = (double)errs[0][1]/(round_trials[0][1]);
+ blerr[1][1] = (double)errs[1][1]/(round_trials[1][1]);
+ blerr[0][2] = (double)errs[0][2]/(round_trials[0][2]);
+ blerr[1][2] = (double)errs[1][2]/(round_trials[1][2]);
+ blerr[0][3] = (double)errs[0][3]/(round_trials[0][3]);
+ blerr[1][3] = (double)errs[1][3]/(round_trials[1][3]);
+
+ fprintf(csv_fd,"%e;%e;%e;%e;%e;%e;%e;%e;\n",blerr[0][0],blerr[1][0],blerr[0][1],blerr[1][1],blerr[0][2],blerr[1][2], blerr[0][3], blerr[1][3]);
+ }
+ else {
+ fprintf(csv_fd,"%e,%e;\n",blerr[0][0], blerr[1][0]);
+ }
+ }
+ }
+
+ if ( (test_perf != 0) && (100 * effective_rate > test_perf )) {
+ //fprintf(time_meas_fd,"SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err\n");
+ if ((transmission_mode != 3) && (transmission_mode != 4)) {
+ fprintf(time_meas_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d;",
+ SNR,
+ mcs1,
+ eNB->dlsch[0][0]->harq_processes[0]->TBS,
+ rate[0],
+ errs[0][0],
+ round_trials[0][0],
+ errs[0][1],
+ round_trials[0][1],
+ errs[0][2],
+ round_trials[0][2],
+ errs[0][3],
+ round_trials[0][3],
+ dci_errors);
+
+ //fprintf(time_meas_fd,"SNR; MCS; TBS; rate; DL_DECOD_ITER; err0; trials0; err1; trials1; err2; trials2; err3; trials3; PE; dci_err;PE;ND;\n");
+ fprintf(time_meas_fd,"%f;%d;%d;%f; %2.1f%%;%f;%f;%d;%d;%d;%d;%d;%d;%d;%d;%e;%e;%e;%e;%d;%d;%e;%f;%f;",
+ SNR,
+ mcs1,
+ eNB->dlsch[0][0]->harq_processes[0]->TBS,
+ rate[0]*effective_rate,
+ 100*effective_rate,
+ rate[0],
+ (double)avg_iter[0]/iter_trials[0],
+ errs[0][0],
+ round_trials[0],
+ errs[0][1],
+ round_trials[1],
+ errs[0][2],
+ round_trials[2],
+ errs[0][3],
+ round_trials[3],
+ (double)errs[0][0]/(round_trials[0][0]),
+ (double)errs[0][1]/(round_trials[0][0]),
+ (double)errs[0][2]/(round_trials[0][0]),
+ (double)errs[0][3]/(round_trials[0][0]),
+ dci_errors,
+ round_trials[0],
+ (double)dci_errors/(round_trials[0][0]),
+ (1.0*(round_trials[0][0]-errs[0][0])+2.0*(round_trials[0][1]-errs[0][1])+3.0*(round_trials[0][2]-errs[0][2])+4.0*(round_trials[0][3]-errs[0][3]))/((double)round_trials[0][0])/(double)eNB->dlsch[0][0]->harq_processes[0]->TBS,
+ (1.0*(round_trials[0][0]-errs[0][0])+2.0*(round_trials[0][1]-errs[0][1])+3.0*(round_trials[0][2]-errs[0][2])+4.0*(round_trials[0][3]-errs[0][3]))/((double)round_trials[0][0]));
+ }
+ else {
+ fprintf(time_meas_fd,"%f;%d;%d;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d;",
+ SNR,
+ mcs1,mcs2,
+ eNB->dlsch[0][0]->harq_processes[0]->TBS,
+ eNB->dlsch[0][1]->harq_processes[0]->TBS,
+ rate[0],
+ errs[0][0],
+ round_trials[0][0],
+ errs[0][1],
+ round_trials[0][1],
+ errs[0][2],
+ round_trials[0][2],
+ errs[0][3],
+ round_trials[0][3],
+ dci_errors);
+
+ //fprintf(time_meas_fd,"SNR; MCS; TBS; rate; DL_DECOD_ITER; err0; trials0; err1; trials1; err2; trials2; err3; trials3; PE; dci_err;PE;ND;\n");
+ fprintf(time_meas_fd,"%f;%d;%d;%d;%d;%f;%2.1f;%f;%f;%d;%d;%d;%d;%d;%d;%d;%d;%e;%e;%e;%e;%d;%d;%e;%f;%f;",
+ SNR,
+ mcs1,mcs2,
+ eNB->dlsch[0][0]->harq_processes[0]->TBS,
+ eNB->dlsch[0][1]->harq_processes[0]->TBS,
+ rate[0]*effective_rate,
+ 100*effective_rate,
+ rate[0],
+ (double)avg_iter[0]/iter_trials[0],
+ errs[0][0],
+ round_trials[0][0],
+ errs[0][1],
+ round_trials[0][1],
+ errs[0][2],
+ round_trials[0][2],
+ errs[0][3],
+ round_trials[3],
+ (double)errs[0][0]/(round_trials[0][0]),
+ (double)errs[0][1]/(round_trials[0][0]),
+ (double)errs[0][2]/(round_trials[0][0]),
+ (double)errs[0][3]/(round_trials[0][0]),
+ dci_errors,
+ round_trials[0][0],
+ (double)dci_errors/(round_trials[0][0]),
+ (1.0*(round_trials[0][0]-errs[0][0])+2.0*(round_trials[0][1]-errs[0][1])+3.0*(round_trials[0][2]-errs[0][2])+4.0*(round_trials[0][3]-errs[0][3]))/((double)round_trials[0][0])/(double)eNB->dlsch[0][0]->harq_processes[0]->TBS,
+ (1.0*(round_trials[0][0]-errs[0][0])+2.0*(round_trials[0][1]-errs[0][1])+3.0*(round_trials[0][2]-errs[0][2])+4.0*(round_trials[0][3]-errs[0][3]))/((double)round_trials[0][0]));
+ }
+ //fprintf(time_meas_fd,"eNB_PROC_TX(%d); OFDM_MOD(%d); DL_MOD(%d); DL_SCR(%d); DL_ENC(%d); UE_PROC_RX(%d); OFDM_DEMOD_CH_EST(%d); RX_PDCCH(%d); CH_COMP_LLR(%d); DL_USCR(%d); DL_DECOD(%d);\n",
+ fprintf(time_meas_fd,"%d; %d; %d; %d; %d; %d; %d; %d; %d; %d; %d;",
+ eNB->phy_proc_tx.trials,
+ eNB->ofdm_mod_stats.trials,
+ eNB->dlsch_modulation_stats.trials,
+ eNB->dlsch_scrambling_stats.trials,
+ eNB->dlsch_encoding_stats.trials,
+ UE->phy_proc_rx.trials,
+ UE->ofdm_demod_stats.trials,
+ UE->dlsch_rx_pdcch_stats.trials,
+ UE->dlsch_llr_stats.trials,
+ UE->dlsch_unscrambling_stats.trials,
+ UE->dlsch_decoding_stats.trials
+ );
+ fprintf(time_meas_fd,"%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;",
+ get_time_meas_us(&eNB->phy_proc_tx),
+ get_time_meas_us(&eNB->ofdm_mod_stats),
+ get_time_meas_us(&eNB->dlsch_modulation_stats),
+ get_time_meas_us(&eNB->dlsch_scrambling_stats),
+ get_time_meas_us(&eNB->dlsch_encoding_stats),
+ get_time_meas_us(&UE->phy_proc_rx),
+ nsymb*get_time_meas_us(&UE->ofdm_demod_stats),
+ get_time_meas_us(&UE->dlsch_rx_pdcch_stats),
+ 3*get_time_meas_us(&UE->dlsch_llr_stats),
+ get_time_meas_us(&UE->dlsch_unscrambling_stats),
+ get_time_meas_us(&UE->dlsch_decoding_stats)
+ );
+ //fprintf(time_meas_fd,"eNB_PROC_TX_STD;eNB_PROC_TX_MAX;eNB_PROC_TX_MIN;eNB_PROC_TX_MED;eNB_PROC_TX_Q1;eNB_PROC_TX_Q3;eNB_PROC_TX_DROPPED;\n");
+ fprintf(time_meas_fd,"%f;%f;%f;%f;%f;%f;%d;", std_phy_proc_tx, t_tx_max, t_tx_min, tx_median, tx_q1, tx_q3, n_tx_dropped);
+
+ //fprintf(time_meas_fd,"IFFT;\n");
+ fprintf(time_meas_fd,"%f;%f;%f;%f;", std_phy_proc_tx_ifft, tx_ifft_median, tx_ifft_q1, tx_ifft_q3);
+
+ //fprintf(time_meas_fd,"MOD;\n");
+ fprintf(time_meas_fd,"%f;%f;%f;%f;", std_phy_proc_tx_mod, tx_mod_median, tx_mod_q1, tx_mod_q3);
+
+ //fprintf(time_meas_fd,"ENC;\n");
+ fprintf(time_meas_fd,"%f;%f;%f;%f;", std_phy_proc_tx_enc, tx_enc_median, tx_enc_q1, tx_enc_q3);
+
+
+ //fprintf(time_meas_fd,"UE_PROC_RX_STD;UE_PROC_RX_MAX;UE_PROC_RX_MIN;UE_PROC_RX_MED;UE_PROC_RX_Q1;UE_PROC_RX_Q3;UE_PROC_RX_DROPPED;\n");
+ fprintf(time_meas_fd,"%f;%f;%f;%f;%f;%f;%d;", std_phy_proc_rx, t_rx_max, t_rx_min, rx_median, rx_q1, rx_q3, n_rx_dropped);
+
+ //fprintf(time_meas_fd,"FFT;\n");
+ fprintf(time_meas_fd,"%f;%f;%f;%f;", std_phy_proc_rx_fft, rx_fft_median, rx_fft_q1, rx_fft_q3);
+
+ //fprintf(time_meas_fd,"DEMOD;\n");
+ fprintf(time_meas_fd,"%f;%f;%f;%f;", std_phy_proc_rx_demod,rx_demod_median, rx_demod_q1, rx_demod_q3);
+
+ //fprintf(time_meas_fd,"DEC;\n");
+ fprintf(time_meas_fd,"%f;%f;%f;%f\n", std_phy_proc_rx_dec, rx_dec_median, rx_dec_q1, rx_dec_q3);
+
+
+ /*
+ fprintf(time_meas_fd,"%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;",
+ eNB->phy_proc_tx.trials,
+ eNB->ofdm_mod_stats.trials,
+ eNB->dlsch_modulation_stats.trials,
+ eNB->dlsch_scrambling_stats.trials,
+ eNB->dlsch_encoding_stats.trials,
+ UE->phy_proc_rx.trials,
+ UE->ofdm_demod_stats.trials,
+ UE->dlsch_rx_pdcch_stats.trials,
+ UE->dlsch_llr_stats.trials,
+ UE->dlsch_unscrambling_stats.trials,
+ UE->dlsch_decoding_stats.trials);
+ */
+ printf("[passed] effective rate : %f (%2.1f%%,%f)): log and break \n",rate[0]*effective_rate, 100*effective_rate, rate[0]);
+ break;
+ } else if (test_perf !=0 ){
+ printf("[continue] effective rate : %f (%2.1f%%,%f)): increase snr \n",rate[0]*effective_rate, 100*effective_rate, rate[0]);
+ }
+ if (abstx == 1) {
+ if ((rx_type==rx_IC_dual_stream) || (rx_type==rx_standard)) {
+
+ if (((double)errs[0][0]/(round_trials[0][0]))<1e-2 && ((double)errs[1][0]/(round_trials[1][0]))<1e-2)
+ if (((double)errs[0][0]/(round_trials[0][0]))<1e-2 && ((double)errs[1][0]/(round_trials[1][0]))<1e-2)
+ break;
+ }
+ else{
+ if (((double)errs[0][0]/(round_trials[0][0]))<1e-2)
+ break;
+
+ }
+ }
+ else {
+
+ if ((rx_type==rx_IC_dual_stream) || (rx_type==rx_standard) || (rx_type==rx_SIC_dual_stream)) {
+ if (((double)errs[0][0]/(round_trials[0][0]))<1e-3 && ((double)errs[1][0]/(round_trials[1][0]))<1e-3)
+ break;
+ }
+ else{
+ if (((double)errs[0][0]/(round_trials[0][0]))<1e-3)
+ break;
+
+ }
+
+ }
+
+ if (n_frames==1)
+ break;
+
+ }// SNR
+
+ } //ch_realization
+
+ fclose(bler_fd);
+
+ if (test_perf !=0)
+ fclose (time_meas_fd);
+
+ //fprintf(tikz_fd,"};\n");
+ //fclose(tikz_fd);
+
+ if (input_trch_file==1)
+ fclose(input_trch_fd);
+
+ if (input_file==1)
+ fclose(input_fd);
+
+ if(abstx) { // ABSTRACTION
+ fprintf(csv_fd,"];");
+ fclose(csv_fd);
+ }
+
+ if (uncoded_ber_bit)
+ free(uncoded_ber_bit);
+
+ uncoded_ber_bit = NULL;
+
+ for (k=0; kdlsch[0][i]);
+ printf("UE %d\n",i);
+ free_ue_dlsch(UE->dlsch[0][i]);
+ }
+
+
+ printf("Freeing channel I/O\n");
+
+ for (i=0; i<2; i++) {
+ free(s_re[i]);
+ free(s_im[i]);
+ free(r_re[i]);
+ free(r_im[i]);
+ }
+
+ free(s_re);
+ free(s_im);
+ free(r_re);
+ free(r_im);
+
+ // lte_sync_time_free();
+
+ // printf("[MUMIMO] mcs %d, mcsi %d, offset %d, bler %f\n",mcs,mcs_i,offset_mumimo_llr_drange_fix,((double)errs[0])/((double)round_trials[0]));
+
+ return(0);
+}
+
+
diff --git a/openair1/SIMULATION/TOOLS/abstraction.c b/openair1/SIMULATION/TOOLS/abstraction.c
index 8fce4d25a6..88b3ce6406 100644
--- a/openair1/SIMULATION/TOOLS/abstraction.c
+++ b/openair1/SIMULATION/TOOLS/abstraction.c
@@ -115,7 +115,7 @@ int freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples)
start_meas(&desc->interp_freq);
- for (f=-n_samples_max/2,f2=-n_samples/2; f<=n_samples_max/2; f+=d,f2++) {
+ for (f=-n_samples_max/2,f2=-n_samples/2; f.
+
+ 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
+
+ *******************************************************************************/
#include
#include
@@ -32,6 +56,8 @@
#include "UTIL/LOG/log.h"
//#define DEBUG_CH
+extern void print_shorts(char *s,__m128i *x);
+
void fill_channel_desc(channel_desc_t *chan_desc,
uint8_t nb_tx,
uint8_t nb_rx,
@@ -42,7 +68,7 @@ void fill_channel_desc(channel_desc_t *chan_desc,
struct complex** R_sqrt,
double Td,
double sampling_rate,
- double channel_bandwidth,
+ double channel_bandwidth,
double ricean_factor,
double aoa,
double forgetting_factor,
@@ -52,11 +78,12 @@ void fill_channel_desc(channel_desc_t *chan_desc,
uint8_t random_aoa)
{
+
uint16_t i,j;
double delta_tau;
LOG_I(OCM,"[CHANNEL] Getting new channel descriptor, nb_tx %d, nb_rx %d, nb_taps %d, channel_length %d\n",
- nb_tx,nb_rx,nb_taps,channel_length);
+ nb_tx,nb_rx,nb_taps,channel_length);
chan_desc->nb_tx = nb_tx;
chan_desc->nb_rx = nb_rx;
@@ -64,31 +91,29 @@ void fill_channel_desc(channel_desc_t *chan_desc,
chan_desc->channel_length = channel_length;
chan_desc->amps = amps;
LOG_D(OCM,"[CHANNEL] Doing delays ...\n");
-
if (delays==NULL) {
chan_desc->delays = (double*) malloc(nb_taps*sizeof(double));
delta_tau = Td/nb_taps;
-
for (i=0; idelays[i] = ((double)i)*delta_tau;
- } else
- chan_desc->delays = delays;
-
- chan_desc->Td = Td;
- chan_desc->sampling_rate = sampling_rate;
- chan_desc->channel_bandwidth = channel_bandwidth;
- chan_desc->ricean_factor = ricean_factor;
- chan_desc->aoa = aoa;
- chan_desc->random_aoa = random_aoa;
- chan_desc->forgetting_factor = forgetting_factor;
- chan_desc->channel_offset = channel_offset;
- chan_desc->path_loss_dB = path_loss_dB;
- chan_desc->first_run = 1;
- chan_desc->ip = 0.0;
- chan_desc->max_Doppler = max_Doppler;
- chan_desc->ch = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*));
- chan_desc->chF = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*));
- chan_desc->a = (struct complex**) malloc(nb_taps*sizeof(struct complex*));
+ }
+ else
+ chan_desc->delays = delays;
+ chan_desc->Td = Td;
+ chan_desc->sampling_rate = sampling_rate;
+ chan_desc->channel_bandwidth = channel_bandwidth;
+ chan_desc->ricean_factor = ricean_factor;
+ chan_desc->aoa = aoa;
+ chan_desc->random_aoa = random_aoa;
+ chan_desc->forgetting_factor = forgetting_factor;
+ chan_desc->channel_offset = channel_offset;
+ chan_desc->path_loss_dB = path_loss_dB;
+ chan_desc->first_run = 1;
+ chan_desc->ip = 0.0;
+ chan_desc->max_Doppler = max_Doppler;
+ chan_desc->ch = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*));
+ chan_desc->chF = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*));
+ chan_desc->a = (struct complex**) malloc(nb_taps*sizeof(struct complex*));
LOG_D(OCM,"[CHANNEL] Filling ch \n");
@@ -99,27 +124,29 @@ void fill_channel_desc(channel_desc_t *chan_desc,
chan_desc->chF[i] = (struct complex*) malloc(1200 * sizeof(struct complex)); // allocate for up to 100 RBs, 12 samples per RB
LOG_D(OCM,"[CHANNEL] Filling a (nb_taps %d)\n",nb_taps);
-
for (i = 0; ia[i],nb_tx*nb_rx * sizeof(struct complex));
chan_desc->a[i] = (struct complex*) malloc(nb_tx*nb_rx * sizeof(struct complex));
}
LOG_D(OCM,"[CHANNEL] Doing R_sqrt ...\n");
-
if (R_sqrt == NULL) {
- chan_desc->R_sqrt = (struct complex**) calloc(nb_taps,sizeof(struct complex*));
-
+ chan_desc->R_sqrt = (struct complex**) calloc(nb_taps,sizeof(struct complex*));
for (i = 0; iR_sqrt[i] = (struct complex*) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complex));
-
+ chan_desc->R_sqrt[i] = (struct complex*) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complex));
for (j = 0; jR_sqrt[i][j].x = 1.0;
chan_desc->R_sqrt[i][j].y = 0.0;
}
}
- } else {
- chan_desc->R_sqrt = R_sqrt;
+ }
+ else {
+ chan_desc->R_sqrt = (struct complex**) calloc(nb_taps,sizeof(struct complex*));
+ for (i = 0; iR_sqrt[i] = (struct complex*) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complex));
+ //chan_desc->R_sqrt = (struct complex*)&R_sqrt[i][0];
+ chan_desc->R_sqrt[i] = R_sqrt[0];
+ }
}
for (i = 0; iricean_factor);
-
- for (i=0; inb_taps; i++)
+ for (i=0;inb_taps;i++)
LOG_D(OCM,"[CHANNEL] tap %d: amp %f, delay %f\n",i,chan_desc->amps[i],chan_desc->delays[i]);
chan_desc->nb_paths=10;
@@ -160,12 +186,14 @@ double etu_amps_dB[] = {-1.0,-1.0,-1.0,0.0,0.0,0.0,-3.0,-5.0,-7.0};
double default_amps_lin[] = {0.3868472 , 0.3094778 , 0.1547389 , 0.0773694 , 0.0386847 , 0.0193424 , 0.0096712 , 0.0038685};
double default_amp_lin[] = {1};
+double ts_shift_delays[] = {0, 1/7.68};
+double ts_shift_amps[] = {0, 1};
+
//correlation matrix for a 2x2 channel with full Tx correlation
struct complex R_sqrt_22_corr_tap[16] = {{0.70711,0}, {0.0, 0.0}, {0.70711,0}, {0.0, 0.0},
- {0.0, 0.0}, {0.70711,0}, {0.0, 0.0}, {0.70711,0},
- {0.70711,0}, {0.0, 0.0}, {0.70711,0}, {0.0, 0.0},
- {0.0, 0.0}, {0.70711,0}, {0.0, 0.0}, {0.70711,0}
-};
+ {0.0, 0.0}, {0.70711,0}, {0.0, 0.0}, {0.70711,0},
+ {0.70711,0}, {0.0, 0.0}, {0.70711,0}, {0.0, 0.0},
+ {0.0, 0.0}, {0.70711,0}, {0.0, 0.0}, {0.70711,0}};
struct complex *R_sqrt_22_corr[1] = {R_sqrt_22_corr_tap};
//correlation matrix for a fully correlated 2x1 channel (h1==h2)
@@ -174,10 +202,9 @@ struct complex *R_sqrt_21_corr[1] = {R_sqrt_21_corr_tap};
//correlation matrix for a 2x2 channel with full Tx anti-correlation
struct complex R_sqrt_22_anticorr_tap[16] = {{0.70711,0}, {0.0, 0.0}, {-0.70711,0}, {0.0, 0.0},
- {0.0, 0.0}, {0.70711,0}, {0.0, 0.0}, {-0.70711,0},
- {-0.70711,0}, {0.0, 0.0}, {0.70711,0}, {0.0, 0.0},
- {0.0, 0.0}, {-0.70711,0}, {0.0, 0.0}, {0.70711,0}
-};
+ {0.0, 0.0}, {0.70711,0}, {0.0, 0.0}, {-0.70711,0},
+ {-0.70711,0}, {0.0, 0.0}, {0.70711,0}, {0.0, 0.0},
+ {0.0, 0.0}, {-0.70711,0}, {0.0, 0.0}, {0.70711,0}};
struct complex *R_sqrt_22_anticorr[1] = {R_sqrt_22_anticorr_tap};
//correlation matrix for a fully anti-correlated 2x1 channel (h1==-h2)
@@ -186,12 +213,62 @@ struct complex *R_sqrt_21_anticorr[1] = {R_sqrt_21_anticorr_tap};
struct complex **R_sqrt_ptr2;
+// full correlation matrix in vectorized form for 2x2 channel, where h1 is perfectly orthogonal to h2
+
+struct complex R_sqrt_22_orthogonal_tap[16] = {{0.70711,0.0}, {0.0, 0.0}, {0.0,0.0}, {0.0, 0.0},
+ {0.0, 0.0}, {0.0,0.0}, {0.0, 0.0}, {0.0,0.0},
+ {0.0,0.0}, {0.0, 0.0}, {0.0,0.0}, {0.0, 0.0},
+ {0.0, 0.0}, {0.0,0.0}, {0.0, 0.0}, {0.70711,0.0}};
+struct complex *R_sqrt_22_orthogonal[1] = {R_sqrt_22_orthogonal_tap};
+
+// full correlation matrix for TM4 to make orthogonal effective channel
+
+
+
+
+struct complex R_sqrt_22_orth_eff_ch_TM4_prec_real_tap[16] = {{0.70711,0.0}, {0.0, 0.0}, {0.70711,0.0}, {0.0, 0.0},
+ {0.0, 0.0}, {0.70711,0.0}, {0.0, 0.0}, {-0.70711,0.0},
+ {0.70711,0.0}, {0.0, 0.0}, {0.70711,0.0}, {0.0, 0.0},
+ {0.0, 0.0}, {-0.70711,0.0}, {0.0, 0.0}, {0.70711,0.0}};
+struct complex *R_sqrt_22_orth_eff_ch_TM4_prec_real[1] = {R_sqrt_22_orth_eff_ch_TM4_prec_real_tap};
+
+
+
+
+struct complex R_sqrt_22_orth_eff_ch_TM4_prec_imag_tap[16] = {{0.70711,0.0}, {0.0,0.0}, {0.0, -0.70711}, {0.0,0.0},
+ {0.0, 0.0}, {0.70711,0.0}, {0.0, 0.0}, {0.0,0.70711},
+ {0.0,-0.70711}, {0.0, 0.0}, {-0.70711,0.0}, {0.0, 0.0},
+ {0.0, 0.0}, {0.0,0.70711}, {0.0, 0.0}, {-0.70711,0.0}};
+struct complex *R_sqrt_22_orth_eff_ch_TM4_prec_imag[1] = {R_sqrt_22_orth_eff_ch_TM4_prec_imag_tap};
+
+//Correlation matrix for EPA channel
+struct complex R_sqrt_22_EPA_low_tap[16] = {{1.0,0.0}, {0.0,0.0}, {0.0,0.0}, {0.0,0.0},
+ {0.0,0.0}, {1.0,0.0}, {0.0,0.0}, {0.0,0.0},
+ {0.0,0.0}, {0.0,0.0}, {1.0,0.0}, {0.0,0.0},
+ {0.0,0.0}, {0.0,0.0}, {0.0,0.0}, {1.0,0.0}};
+struct complex *R_sqrt_22_EPA_low[1] = {R_sqrt_22_EPA_low_tap};
+
+struct complex R_sqrt_22_EPA_high_tap[16] = {{0.7179,0.0}, {0.4500,0.0}, {0.4500,0.0}, {0.2821,0.0},
+ {0.4500,0.0}, {0.7179,0.0}, {0.2821,0.0}, {0.4500,0.0},
+ {0.4500,0.0}, {0.2821,0.0}, {0.7179,0.0}, {0.4500,0.0},
+ {0.2821,0.0}, {0.4500,0.0}, {0.4500,0.0}, {0.7179,0.0}};
+struct complex *R_sqrt_22_EPA_high[1] = {R_sqrt_22_EPA_high_tap};
+
+struct complex R_sqrt_22_EPA_medium_tap[16] = {{0.8375,0.0}, {0.5249,0.0}, {0.1286,0.0}, {0.0806,0.0},
+ {0.5249,0.0}, {0.8375,0.0}, {0.0806,0.0}, {0.1286,0.0},
+ {0.1286,0.0}, {0.0806,0.0}, {0.8375,0.0}, {0.5249,0.0},
+ {0.0806,0.0}, {0.1286,0.0}, {0.5249,0.0}, {0.8375,0.0}};
+struct complex *R_sqrt_22_EPA_medium[1] = {R_sqrt_22_EPA_medium_tap};
+
+
+
+//Rayleigh1_orth_eff_ch_TM4
channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
uint8_t nb_rx,
SCM_t channel_model,
double sampling_rate,
- double channel_bandwidth,
+ double channel_bandwidth,
double forgetting_factor,
int32_t channel_offset,
double path_loss_dB)
@@ -203,15 +280,15 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
double aoa,ricean_factor,Td,maxDoppler;
int channel_length,nb_taps;
- chan_desc->nb_tx = nb_tx;
- chan_desc->nb_rx = nb_rx;
- chan_desc->sampling_rate = sampling_rate;
- chan_desc->channel_bandwidth = channel_bandwidth;
- chan_desc->forgetting_factor = forgetting_factor;
- chan_desc->channel_offset = channel_offset;
- chan_desc->path_loss_dB = path_loss_dB;
- chan_desc->first_run = 1;
- chan_desc->ip = 0.0;
+ chan_desc->nb_tx = nb_tx;
+ chan_desc->nb_rx = nb_rx;
+ chan_desc->sampling_rate = sampling_rate;
+ chan_desc->channel_bandwidth = channel_bandwidth;
+ chan_desc->forgetting_factor = forgetting_factor;
+ chan_desc->channel_offset = channel_offset;
+ chan_desc->path_loss_dB = path_loss_dB;
+ chan_desc->first_run = 1;
+ chan_desc->ip = 0.0;
LOG_I(OCM,"Channel Model (inside of new_channel_desc_scm)=%d\n\n", channel_model);
@@ -220,27 +297,22 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
LOG_W(OCM,"channel model not yet supported\n");
free(chan_desc);
return(NULL);
-
case SCM_B:
LOG_W(OCM,"channel model not yet supported\n");
free(chan_desc);
return(NULL);
-
case SCM_C:
chan_desc->nb_taps = 18;
chan_desc->Td = 4.625;
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
sum_amps = 0;
chan_desc->amps = (double*) malloc(chan_desc->nb_taps*sizeof(double));
-
for (i = 0; inb_taps; i++) {
chan_desc->amps[i] = pow(10,.1*scm_c_amps_dB[i]);
sum_amps += chan_desc->amps[i];
}
-
for (i = 0; inb_taps; i++)
chan_desc->amps[i] /= sum_amps;
-
chan_desc->delays = scm_c_delays;
chan_desc->ricean_factor = 1;
chan_desc->aoa = 0;
@@ -248,42 +320,37 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc->ch = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*));
chan_desc->chF = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*));
chan_desc->a = (struct complex**) malloc(chan_desc->nb_taps*sizeof(struct complex*));
-
for (i = 0; ich[i] = (struct complex*) malloc(chan_desc->channel_length * sizeof(struct complex));
-
for (i = 0; ichF[i] = (struct complex*) malloc(1200 * sizeof(struct complex));
-
for (i = 0; inb_taps; i++)
chan_desc->a[i] = (struct complex*) malloc(nb_tx*nb_rx * sizeof(struct complex));
chan_desc->R_sqrt = (struct complex**) malloc(6*sizeof(struct complex**));
-
if (nb_tx==2 && nb_rx==2) {
for (i = 0; i<6; i++)
chan_desc->R_sqrt[i] = (struct complex*) &R22_sqrt[i][0];
- } else if (nb_tx==2 && nb_rx==1) {
+ }
+ else if (nb_tx==2 && nb_rx==1) {
for (i = 0; i<6; i++)
chan_desc->R_sqrt[i] = (struct complex*) &R21_sqrt[i][0];
- } else if (nb_tx==1 && nb_rx==2) {
+ }
+ else if (nb_tx==1 && nb_rx==2) {
for (i = 0; i<6; i++)
chan_desc->R_sqrt[i] = (struct complex*) &R12_sqrt[i][0];
- } else {
+ }
+ else {
for (i = 0; i<6; i++) {
chan_desc->R_sqrt[i] = (struct complex*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
-
for (j = 0; jR_sqrt[i][j].x = 1.0;
chan_desc->R_sqrt[i][j].y = 0.0;
}
-
LOG_W(OCM,"correlation matrix not implemented for nb_tx==%d and nb_rx==%d, using identity\n", nb_tx, nb_rx);
}
}
-
break;
-
case SCM_D:
LOG_W(OCM,"This is not the real SCM-D model! It is just SCM-C with an additional Rice factor!\n");
chan_desc->nb_taps = 18;
@@ -291,15 +358,12 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
sum_amps = 0;
chan_desc->amps = (double*) malloc(chan_desc->nb_taps*sizeof(double));
-
for (i = 0; inb_taps; i++) {
chan_desc->amps[i] = pow(10,.1*scm_c_amps_dB[i]);
sum_amps += chan_desc->amps[i];
}
-
for (i = 0; inb_taps; i++)
chan_desc->amps[i] /= sum_amps;
-
chan_desc->delays = scm_c_delays;
chan_desc->ricean_factor = 0.1;
chan_desc->aoa = 0;
@@ -307,57 +371,49 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc->ch = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*));
chan_desc->chF = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*));
chan_desc->a = (struct complex**) malloc(chan_desc->nb_taps*sizeof(struct complex*));
-
for (i = 0; ich[i] = (struct complex*) malloc(chan_desc->channel_length * sizeof(struct complex));
-
for (i = 0; ichF[i] = (struct complex*) malloc(1200 * sizeof(struct complex));
-
for (i = 0; inb_taps; i++)
chan_desc->a[i] = (struct complex*) malloc(nb_tx*nb_rx * sizeof(struct complex));
chan_desc->R_sqrt = (struct complex**) malloc(6*sizeof(struct complex**));
-
if (nb_tx==2 && nb_rx==2) {
for (i = 0; i<6; i++)
chan_desc->R_sqrt[i] = (struct complex*) &R22_sqrt[i][0];
- } else if (nb_tx==2 && nb_rx==1) {
+ }
+ else if (nb_tx==2 && nb_rx==1) {
for (i = 0; i<6; i++)
chan_desc->R_sqrt[i] = (struct complex*) &R21_sqrt[i][0];
- } else if (nb_tx==1 && nb_rx==2) {
+ }
+ else if (nb_tx==1 && nb_rx==2) {
for (i = 0; i<6; i++)
chan_desc->R_sqrt[i] = (struct complex*) &R12_sqrt[i][0];
- } else {
+ }
+ else {
for (i = 0; i<6; i++) {
chan_desc->R_sqrt[i] = (struct complex*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
-
for (j = 0; jR_sqrt[i][j].x = 1.0;
chan_desc->R_sqrt[i][j].y = 0.0;
}
-
LOG_W(OCM,"correlation matrix not implemented for nb_tx==%d and nb_rx==%d, using identity\n", nb_tx, nb_rx);
}
}
-
break;
-
case EPA:
chan_desc->nb_taps = 7;
chan_desc->Td = .410;
chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
sum_amps = 0;
chan_desc->amps = (double*) malloc(chan_desc->nb_taps*sizeof(double));
-
for (i = 0; inb_taps; i++) {
chan_desc->amps[i] = pow(10,.1*epa_amps_dB[i]);
sum_amps += chan_desc->amps[i];
}
-
for (i = 0; inb_taps; i++)
chan_desc->amps[i] /= sum_amps;
-
chan_desc->delays = epa_delays;
chan_desc->ricean_factor = 1;
chan_desc->aoa = 0;
@@ -365,53 +421,175 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
chan_desc->ch = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*));
chan_desc->chF = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*));
chan_desc->a = (struct complex**) malloc(chan_desc->nb_taps*sizeof(struct complex*));
-
for (i = 0; ich[i] = (struct complex*) malloc(chan_desc->channel_length * sizeof(struct complex));
-
for (i = 0; ichF[i] = (struct complex*) malloc(1200 * sizeof(struct complex));
-
for (i = 0; inb_taps; i++)
chan_desc->a[i] = (struct complex*) malloc(nb_tx*nb_rx * sizeof(struct complex));
-
if (nb_tx==2 && nb_rx==2) {
chan_desc->R_sqrt = (struct complex**) malloc(6*sizeof(struct complex**));
-
for (i = 0; i<6; i++)
chan_desc->R_sqrt[i] = (struct complex*) &R22_sqrt[i][0];
- } else {
+ }
+ else {
chan_desc->R_sqrt = (struct complex**) malloc(6*sizeof(struct complex**));
-
for (i = 0; i<6; i++) {
chan_desc->R_sqrt[i] = (struct complex*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
-
for (j = 0; jR_sqrt[i][j].x = 1.0;
chan_desc->R_sqrt[i][j].y = 0.0;
}
-
LOG_W(OCM,"correlation matrix only implemented for nb_tx==2 and nb_rx==2, using identity\n");
}
}
-
break;
-
+ case EPA_low:
+ chan_desc->nb_taps = 7;
+ chan_desc->Td = .410;
+ chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
+ sum_amps = 0;
+ chan_desc->amps = (double*) malloc(chan_desc->nb_taps*sizeof(double));
+ for (i = 0; inb_taps; i++) {
+ chan_desc->amps[i] = pow(10,.1*epa_amps_dB[i]);
+ sum_amps += chan_desc->amps[i];
+ }
+ for (i = 0; inb_taps; i++)
+ chan_desc->amps[i] /= sum_amps;
+ chan_desc->delays = epa_delays;
+ chan_desc->ricean_factor = 1;
+ chan_desc->aoa = 0;
+ chan_desc->random_aoa = 0;
+ chan_desc->ch = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*));
+ chan_desc->chF = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*));
+ chan_desc->a = (struct complex**) malloc(chan_desc->nb_taps*sizeof(struct complex*));
+ for (i = 0; ich[i] = (struct complex*) malloc(chan_desc->channel_length * sizeof(struct complex));
+ for (i = 0; ichF[i] = (struct complex*) malloc(1200 * sizeof(struct complex));
+ for (i = 0; inb_taps; i++)
+ chan_desc->a[i] = (struct complex*) malloc(nb_tx*nb_rx * sizeof(struct complex));
+ if (nb_tx==2 && nb_rx==2) {
+ chan_desc->R_sqrt = (struct complex**) malloc(chan_desc->nb_taps*sizeof(struct complex**));
+ for (i = 0; inb_taps; i++)
+ chan_desc->R_sqrt[i] = R_sqrt_22_EPA_low[0];
+ }
+ else {
+ printf("Correlation matrices are implemented for 2 x 2 only");
+ }
+ /*else {
+ chan_desc->R_sqrt = (struct complex**) malloc(6*sizeof(struct complex**));
+ for (i = 0; i<6; i++) {
+ chan_desc->R_sqrt[i] = (struct complex*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+ for (j = 0; j