diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index eb06b151cb..b3ef8e3312 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -315,8 +315,8 @@ elseif (${RRC_ASN1_VERSION} STREQUAL "Rel14")
make_version(RRC_VERSION 14 7 0)
set (RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/LTE/MESSAGES/asn1c/ASN1_files/lte-rrc-14.7.0.asn1)
elseif (${RRC_ASN1_VERSION} STREQUAL "Rel15")
- make_version(RRC_VERSION 15 2 2)
- set (RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/LTE/MESSAGES/asn1c/ASN1_files/RRC-36331-f22.asn)
+ make_version(RRC_VERSION 15 3 0)
+ set (RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/LTE/MESSAGES/asn1c/ASN1_files/lte-rrc-15.3.0.asn1)
endif (${RRC_ASN1_VERSION} STREQUAL "Rel8")
add_definitions(-DRRC_VERSION=${RRC_VERSION})
set (RRC_FULL_DIR ${asn1_generated_dir}/RRC_${RRC_ASN1_VERSION})
@@ -355,8 +355,8 @@ add_custom_command (
add_list2_option(NR_RRC_ASN1_VERSION "NR_Rel15" "ASN.1 version of NR_RRC interface")
if (${NR_RRC_ASN1_VERSION} STREQUAL "NR_Rel15")
- make_version(NR_RRC_VERSION 15 2 1)
- set (NR_RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/NR/MESSAGES/asn1c/ASN1_files/nr-rrc-15.2.1.asn1)
+ make_version(NR_RRC_VERSION 15 3 0)
+ set (NR_RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/NR/MESSAGES/asn1c/ASN1_files/nr-rrc-15.3.0.asn1)
endif (${NR_RRC_ASN1_VERSION} STREQUAL "NR_Rel15")
add_definitions(-DNR_RRC_VERSION=${NR_RRC_VERSION})
set (NR_RRC_FULL_DIR ${asn1_generated_dir}/${NR_RRC_ASN1_VERSION})
@@ -394,7 +394,7 @@ add_custom_command (OUTPUT ${NR_RRC_FULL_DIR}/NR_asn_constant.h
# Same limitation as described in RRC: unknown generated file list
# so we generate it at cmake time
##############
-add_list1_option(S1AP_RELEASE R14 "S1AP ASN.1 grammar version" R8 R9 R10 R14 R15)
+add_list1_option(S1AP_RELEASE R15 "S1AP ASN.1 grammar version" R8 R9 R10 R14 R15)
set(S1AP_DIR ${OPENAIR3_DIR}/S1AP)
if (${S1AP_RELEASE} STREQUAL "R8")
@@ -416,11 +416,11 @@ elseif (${S1AP_RELEASE} STREQUAL "R13")
make_version(S1AP_VERSION 13 6 0)
set(S1AP_ASN_FILES "s1ap-13.6.0.asn1")
elseif (${S1AP_RELEASE} STREQUAL "R14")
- make_version(S1AP_VERSION 14 5 0)
- set(S1AP_ASN_FILES "s1ap-14.5.0.asn1")
+ make_version(S1AP_VERSION 14 7 0)
+ set(S1AP_ASN_FILES "s1ap-14.7.0.asn1")
else (${S1AP_RELEASE} STREQUAL "R15")
- make_version(S1AP_VERSION 15 1 0)
- set(S1AP_ASN_FILES "s1ap-15.1.0.asn1")
+ make_version(S1AP_VERSION 15 3 0)
+ set(S1AP_ASN_FILES "s1ap-15.3.0.asn1")
endif(${S1AP_RELEASE} STREQUAL "R8")
add_definitions(-DS1AP_VERSION=${S1AP_VERSION})
set(S1AP_ASN_DIR ${S1AP_DIR}/MESSAGES/ASN1/${S1AP_RELEASE})
@@ -472,7 +472,7 @@ add_library(S1AP_ENB
# Same limitation as described in RRC/S1AP: unknown generated file list
# so we generate it at cmake time
##############
-add_list1_option(X2AP_RELEASE R14 "X2AP ASN.1 grammar version" R8 R11 R12 R14 R15)
+add_list1_option(X2AP_RELEASE R15 "X2AP ASN.1 grammar version" R8 R11 R12 R14 R15)
set(X2AP_DIR ${OPENAIR2_DIR}/X2AP)
if (${X2AP_RELEASE} STREQUAL "R8")
@@ -488,8 +488,8 @@ elseif (${X2AP_RELEASE} STREQUAL "R14")
make_version(X2AP_VERSION 14 6 0)
set(X2AP_ASN_FILES x2ap-14.6.0.asn1)
elseif (${X2AP_RELEASE} STREQUAL "R15")
- make_version(X2AP_VERSION 15 1 0)
- set(X2AP_ASN_FILES x2ap-15.1.0.asn1)
+ make_version(X2AP_VERSION 15 3 0)
+ set(X2AP_ASN_FILES x2ap-15.3.0.asn1)
endif(${X2AP_RELEASE} STREQUAL "R8")
add_definitions(-DX2AP_VERSION=${X2AP_VERSION})
set(X2AP_ASN_DIR ${X2AP_DIR}/MESSAGES/ASN1/${X2AP_RELEASE})
@@ -1119,24 +1119,19 @@ set(PHY_TURBOSRC
${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder.c
)
set(PHY_POLARSRC
- ${OPENAIR1_DIR}/PHY/CODING/nrPolar_init.c
+ ${OPENAIR1_DIR}/PHY/CODING/nr_polar_init.c
${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_bitwise_operations.c
${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_crc_byte.c
- ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_bit_insertion.c
- ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_channel_interleaver_pattern.c
- # ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_crc.c
-# ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/decoder_K56_N512_E864.c
+ ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_crc.c
+ ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_decoder.c
${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c
- ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_info_bit_pattern.c
+ ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_encoder.c
${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_interleaving_pattern.c
${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_kernal_operation.c
${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_kronecker_power_matrices.c
${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_matrix_and_array.c
- ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_output_length.c
- ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_rate_match.c
+ ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_procedures.c
${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_sequence_pattern.c
- ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_encoder.c
- ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_decoder.c
)
set(PHY_TURBOIF
${OPENAIR1_DIR}/PHY/CODING/coding_load.c
@@ -1179,6 +1174,8 @@ set(PHY_SRC_COMMON
${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_dl_mbsfn.c
${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_ul_ref.c
${OPENAIR1_DIR}/PHY/CODING/lte_segmentation.c
+ ${OPENAIR1_DIR}/PHY/CODING/nr_segmentation.c
+ ${OPENAIR1_DIR}/PHY/CODING/nr_compute_tbs.c
${OPENAIR1_DIR}/PHY/CODING/ccoding_byte.c
${OPENAIR1_DIR}/PHY/CODING/ccoding_byte_lte.c
${OPENAIR1_DIR}/PHY/CODING/3gpplte_sse.c
@@ -1294,6 +1291,8 @@ set(PHY_SRC_UE
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_pss.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_sss.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_pbch.c
+ ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dci.c
+ ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dci_tools.c
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold.c
${OPENAIR1_DIR}/PHY/TOOLS/file_output.c
${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c
@@ -1324,6 +1323,7 @@ set(PHY_SRC_UE
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_pbch.c
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/
+ ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_prach.c
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_nr.c
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_tools_nr.c
@@ -1458,7 +1458,7 @@ set(L2_SRC
${RRC_DIR}/L2_interface_ue.c
)
-set(NR_L2_SRC
+set(L2_NR_SRC
${NR_RRC_DIR}/rrc_gNB.c
${NR_RRC_DIR}/nr_rrc_common.c
${NR_RRC_DIR}/L2_nr_interface.c
@@ -1514,6 +1514,12 @@ set(NR_L2_SRC_UE
#${RRC_DIR}/rrc_UE.c
)
+set(L2_NR_SRC_UE
+ ${NR_UE_RRC_DIR}/L2_interface_ue.c
+ ${NR_UE_RRC_DIR}/main_ue.c
+ ${NR_UE_RRC_DIR}/rrc_UE.c
+ )
+
set (MAC_SRC
#${PHY_INTERFACE_DIR}/phy_stub_UE.c
${PHY_INTERFACE_DIR}/IF_Module.c
@@ -1536,15 +1542,16 @@ set (MAC_SRC
${MAC_DIR}/pre_processor.c
${MAC_DIR}/config.c
${MAC_DIR}/config_ue.c
- )
+ )
-set (NR_MAC_SRC
+set (MAC_NR_SRC
${NR_PHY_INTERFACE_DIR}/NR_IF_Module.c
${NR_MAC_DIR}/main.c
${NR_MAC_DIR}/config.c
${NR_MAC_DIR}/gNB_scheduler.c
${NR_MAC_DIR}/gNB_scheduler_bch.c
${NR_MAC_DIR}/gNB_scheduler_primitives.c
+ ${NR_MAC_DIR}/gNB_scheduler_phytest.c
)
@@ -1582,11 +1589,12 @@ add_library(L2
${L2_SRC}
${MAC_SRC}
${ENB_APP_SRC}
-)
+ )
+# ${OPENAIR2_DIR}/RRC/L2_INTERFACE/openair_rrc_L2_interface.c)
-add_library(NR_L2
- ${NR_L2_SRC}
- ${NR_MAC_SRC}
+add_library(L2_NR
+ ${L2_NR_SRC}
+ ${MAC_NR_SRC}
${GNB_APP_SRC}
)
@@ -2204,7 +2212,7 @@ add_executable(lte-softmodem
target_link_libraries (lte-softmodem
-Wl,--start-group
- RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2
+ RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
-Wl,--end-group z dl)
@@ -2358,8 +2366,8 @@ add_executable(nr-softmodem
target_link_libraries (nr-softmodem
-Wl,--start-group
UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_RU LFDS GTPV1U SECU_CN SECU_OSA
- ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ATLAS_LIBRARIES}
- RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB L2 NR_L2
+ ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB}
+ RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB L2 L2_NR
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
-Wl,--end-group z dl)
@@ -2380,6 +2388,7 @@ add_executable(nr-softmodem-nos1
${OPENAIR_TARGETS}/RT/USER/nr-ru.c
${OPENAIR_TARGETS}/RT/USER/nr-softmodem.c
${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
+ ${OPENAIR_TARGETS}/COMMON/create_tasks.c
${OPENAIR_TARGETS}/COMMON/create_nr_tasks.c
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
${OPENAIR2_DIR}/RRC/NAS/nas_config.c
@@ -2399,7 +2408,7 @@ target_link_libraries (nr-softmodem-nos1
-Wl,--start-group
UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_RU LFDS GTPV1U SECU_CN SECU_OSA
${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${MIH_LIB}
- RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB L2 NR_L2
+ RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB L2 L2_NR
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
-Wl,--end-group z dl)
@@ -2608,16 +2617,68 @@ if (${T_TRACER})
foreach(i
#all "add_executable" definitions (except tests, rb_tool, updatefw)
lte-softmodem lte-softmodem-nos1 lte-uesoftmodem lte-uesoftmodem-nos1
+ nr-softmodem nr-softmodem-nos1 nr-uesoftmodem nr-uesoftmodem-nos1
dlsim_tm4 dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim
pdcchsim pucchsim prachsim syncsim ulsim
+ ldpctest polartest
#all "add_library" definitions
- ITTI RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB
- oai_exmimodevif oai_usrpdevif oai_bladerfdevif oai_lmssdrdevif
- oai_eth_transpro
- FLPT_MSG ASYNC_IF FLEXRAN_AGENT HASHTABLE MSC UTIL OMG_SUMO SECU_OSA
- SECU_CN SCHED_LIB PHY L2 default_sched remote_sched RAL CN_UTILS
- GTPV1U SCTP_CLIENT UDP LIB_NAS_UE LFDS LFDS7 SIMU OPENAIR0_LIB PHY_MEX
- coding)
+ITTI
+RRC_LIB
+NR_RRC_LIB
+S1AP_LIB
+S1AP_ENB
+X2AP_LIB
+params_libconfig
+oai_exmimodevif
+oai_usrpdevif
+oai_bladerfdevif
+oai_lmssdrdevif
+oai_eth_transpro
+oai_mobipass
+tcp_bridge
+tcp_bridge_oai
+coding
+FLPT_MSG
+ASYNC_IF
+FLEXRAN_AGENT
+HASHTABLE
+MSC
+UTIL
+SECU_OSA
+SECU_CN
+SCHED_LIB
+SCHED_NR_LIB
+SCHED_RU_LIB
+SCHED_UE_LIB
+SCHED_NR_UE_LIB
+NFAPI_COMMON_LIB
+NFAPI_LIB
+NFAPI_PNF_LIB
+NFAPI_VNF_LIB
+NFAPI_USER_LIB
+PHY_COMMON
+PHY
+PHY_UE
+PHY_NR
+PHY_NR_UE
+PHY_RU
+PHY_MEX
+L2
+L2_NR
+L2_UE
+NR_L2_UE
+NR_LTE_UE_REUSE_LIB
+CN_UTILS
+GTPV1U
+SCTP_CLIENT
+UDP
+LIB_NAS_UE
+NB_IoT
+LFDS
+LFDS7
+SIMU
+SIMU_ETH
+OPENAIR0_LIB)
if (TARGET ${i})
add_dependencies(${i} generate_T)
endif()
diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml
index bfac98919e..72bc4df93a 100644
--- a/cmake_targets/autotests/test_case_list.xml
+++ b/cmake_targets/autotests/test_case_list.xml
@@ -1026,6 +1026,22 @@
segmentation fault|assertion|exiting|fatal
3
+
+
+ execution
+ polartest test cases.
+
+ $OPENAIR_DIR/cmake_targets/build_oai
+ --phy_simulators -c
+ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash
+
+ $OPENAIR_DIR/targets/bin/polartest.Rel15
+ -q -s-10 -f0
+ polartest.test1
+ BLER= 0.000000
+ segmentation fault|assertion|exiting|fatal
+ 3
+
execution
diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper
index 7727ce4fa3..8c5d33975c 100755
--- a/cmake_targets/tools/build_helper
+++ b/cmake_targets/tools/build_helper
@@ -683,7 +683,7 @@ install_asn1c_from_source(){
# better to use a given commit than a branch in case the branch
# is updated and requires modifications in the source of OAI
#git checkout velichkov_s1ap_plus_option_group
- git checkout 73d6b23dcec9ab36605b4af884143824392134c1
+ git checkout d3aed06bb2bec7df1b5c6d0333f8c7dfc5993372
autoreconf -iv
./configure
make -j`nproc`
diff --git a/nfapi/oai_integration/nfapi_vnf.c b/nfapi/oai_integration/nfapi_vnf.c
index ae7ed7acb6..305dbe6c9b 100644
--- a/nfapi/oai_integration/nfapi_vnf.c
+++ b/nfapi/oai_integration/nfapi_vnf.c
@@ -1134,7 +1134,6 @@ int oai_nfapi_nr_dl_config_req(nfapi_nr_dl_config_request_t *dl_config_req)
int retval = nfapi_vnf_p7_dl_config_req(p7_config, dl_config_req);
- dl_config_req->dl_config_request_body.number_pdcch_ofdm_symbols = 1;
dl_config_req->dl_config_request_body.number_dci = 0;
dl_config_req->dl_config_request_body.number_pdu = 0;
dl_config_req->dl_config_request_body.number_pdsch_rnti = 0;
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h
index 4ab81c1a0c..babcc6404f 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h
@@ -40,6 +40,7 @@
#define FAPI_NR_DL_CONFIG_TYPE_DCI 0x01
#define FAPI_NR_DL_CONFIG_TYPE_DLSCH 0x02
+
#define CCE_REG_MAPPING_TYPE_INTERLEAVED 0x01
#define CCE_REG_MAPPING_TYPE_NON_INTERLEAVED 0x02
@@ -55,4 +56,4 @@
#define FAPI_NR_UL_CONFIG_TYPE_SRS 0x04
-#endif
\ No newline at end of file
+#endif
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
index 58ee8f57a6..c071b6b70c 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
@@ -37,8 +37,8 @@ typedef struct {
uint8_t sul_ind_0_1 ; // 2 SUL_IND_0_1:
uint8_t slot_format_ind ; // 3 SLOT_FORMAT_IND: size of DCI format 2_0 is configurable by higher layers up to 128 bits, according to Subclause 11.1.1 of [5, TS 38.213]
uint8_t pre_emption_ind ; // 4 PRE_EMPTION_IND: size of DCI format 2_1 is configurable by higher layers up to 126 bits, according to Subclause 11.2 of [5, TS 38.213]. Each pre-emption indication is 14 bits
- uint8_t tpc_cmd_number ; // 5 TPC_CMD_NUMBER: The parameter xxx provided by higher layers determines the index to the TPC command number for an UL of a cell. Each TPC command number is 2 bits
- uint8_t block_number ; // 6 BLOCK_NUMBER: starting position of a block is determined by the parameter startingBitOfFormat2_3
+ uint8_t block_number ; // 5 BLOCK_NUMBER: starting position of a block is determined by the parameter startingBitOfFormat2_3
+ uint8_t close_loop_ind ; // 6 CLOSE_LOOP_IND:
uint8_t bandwidth_part_ind ; // 7 BANDWIDTH_PART_IND:
uint8_t short_message_ind ; // 8 SHORT_MESSAGE_IND:
uint8_t short_messages ; // 9 SHORT_MESSAGES:
@@ -81,7 +81,7 @@ typedef struct {
uint8_t antenna_ports ; // 38 ANTENNA_PORTS:
uint8_t tci ; // 39 TCI: 0 bit if higher layer parameter tci-PresentInDCI is not enabled; otherwise 3 bits
uint8_t srs_request ; // 40 SRS_REQUEST:
- uint8_t tpc_cmd_number_format2_3 ; // 41 TPC_CMD_NUMBER_FORMAT2_3:
+ uint8_t tpc_cmd ; // 41 TPC_CMD:
uint8_t csi_request ; // 42 CSI_REQUEST:
uint8_t cbgti ; // 43 CBGTI: 0, 2, 4, 6, or 8 bits determined by higher layer parameter maxCodeBlockGroupsPerTransportBlock for the PDSCH
uint8_t cbgfi ; // 44 CBGFI: 0 or 1 bit determined by higher layer parameter codeBlockGroupFlushIndicator
@@ -237,15 +237,34 @@ typedef struct {
typedef struct {
} fapi_nr_ul_config_pucch_pdu;
-
+ typedef enum {pusch_freq_hopping_disabled = 0 , pusch_freq_hopping_enabled = 1}pusch_freq_hopping_t;
+ typedef struct{
+ uint8_t aperiodicSRS_ResourceTrigger;
+ } fapi_nr_ul_srs_config_t;
typedef struct {
+ uint8_t bandwidth_part_ind;
uint16_t number_rbs;
uint16_t start_rb;
+ uint8_t frame_offset;
uint16_t number_symbols;
uint16_t start_symbol;
+ pusch_freq_hopping_t pusch_freq_hopping;
uint8_t mcs;
- uint8_t tpc_command;
+ uint8_t ndi;
uint8_t rv;
+ uint8_t harq_process_nbr;
+ int8_t accumulated_delta_PUSCH;
+ int8_t absolute_delta_PUSCH;
+ uint8_t n_layers;
+ uint8_t tpmi;
+ uint8_t n_dmrs_cdm_groups;
+ uint8_t dmrs_ports[4];
+ uint8_t n_front_load_symb;
+ fapi_nr_ul_srs_config_t srs_config;
+ uint8_t csi_reportTriggerSize;
+ uint8_t maxCodeBlockGroupsPerTransportBlock;
+ uint8_t ptrs_dmrs_association_port;
+ uint8_t beta_offset_ind;
} fapi_nr_ul_config_pusch_pdu_rel15_t;
typedef struct {
@@ -290,17 +309,43 @@ typedef struct {
typedef struct {
fapi_nr_dl_config_dci_dl_pdu_rel15_t dci_config_rel15;
} fapi_nr_dl_config_dci_pdu;
+ typedef struct{
+ uint8_t aperiodicSRS_ResourceTrigger;
+ } fapi_nr_dl_srs_config_t;
+ typedef enum{vrb_to_prb_mapping_non_interleaved = 0, vrb_to_prb_mapping_interleaved = 1} vrb_to_prb_mapping_t;
+ //typedef fapi_nr_dci_pdu_rel15_t fapi_nr_dl_config_dlsch_pdu_rel15_t;
typedef struct {
+ uint8_t bandwidth_part_ind;
uint16_t number_rbs;
uint16_t start_rb;
+ uint8_t frame_offset;
uint16_t number_symbols;
uint16_t start_symbol;
+ uint8_t prb_bundling_size_ind;
+ uint8_t rate_matching_ind;
+ uint8_t zp_csi_rs_trigger;
uint8_t mcs;
- uint8_t rv;
- uint8_t harq_pid;
uint8_t ndi;
- // TODO: check the fields needed to L1 with NR_DL_UE_HARQ_t and NR_UE_DLSCH_t
+ uint8_t rv;
+ uint8_t tb2_mcs;
+ uint8_t tb2_ndi;
+ uint8_t tb2_rv;
+ uint8_t harq_process_nbr;
+ vrb_to_prb_mapping_t vrb_to_prb_mapping;
+ uint8_t dai;
+ double scaling_factor_S;
+ int8_t accumulated_delta_PUCCH;
+ uint8_t pucch_resource_id;
+ uint8_t pdsch_to_harq_feedback_time_ind;
+ uint8_t n_dmrs_cdm_groups;
+ uint8_t dmrs_ports[10];
+ uint8_t n_front_load_symb;
+ uint8_t tci_state;
+ fapi_nr_dl_srs_config_t srs_config;
+ uint8_t cbgti;
+ uint8_t codeBlockGroupFlushIndicator;
+ // to be check the fields needed to L1 with NR_DL_UE_HARQ_t and NR_UE_DLSCH_t
} fapi_nr_dl_config_dlsch_pdu_rel15_t;
typedef struct {
@@ -598,7 +643,7 @@ typedef struct {
typedef struct {
uint8_t dmrs_type;
uint8_t dmrs_addition_position;
-
+ uint8_t ptrs_uplink_config; // to indicate if PTRS Uplink is configured of not
uint8_t ptrs_type; //cp-OFDM, dft-S-OFDM
uint16_t ptrs_frequency_density[2];
uint8_t ptrs_time_density[3];
@@ -624,9 +669,15 @@ typedef struct {
uint8_t delta_mcs;
} fapi_nr_pusch_power_control_t;
+ typedef enum {tx_config_codebook = 1, tx_config_nonCodebook = 2} tx_config_t;
+ typedef enum {transform_precoder_disabled = 0, transform_precoder_enabled = 1} transform_precoder_t;
+ typedef enum {
+ codebook_subset_fullyAndPartialAndNonCoherent = 1,
+ codebook_subset_partialAndNonCoherent = 2,
+ codebook_subset_nonCoherent = 3} codebook_subset_t;
typedef struct {
uint16_t data_scrambling_identity;
- uint8_t tx_config;
+ tx_config_t tx_config;
fapi_nr_dmrs_uplink_config_t dmrs_ul_for_pusch_mapping_type_a;
fapi_nr_dmrs_uplink_config_t dmrs_ul_for_pusch_mapping_type_b;
fapi_nr_pusch_power_control_t pusch_power_control;
@@ -637,8 +688,8 @@ typedef struct {
uint8_t pusch_aggregation_factor;
uint8_t mcs_table;
uint8_t mcs_table_transform_precoder;
- uint8_t transform_precoder;
- uint8_t codebook_subset;
+ transform_precoder_t transform_precoder;
+ codebook_subset_t codebook_subset;
uint8_t max_rank;
uint8_t rbg_size;
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h
index 85aa67f27f..23bd09dcc9 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h
@@ -11,6 +11,30 @@
#include "nfapi_interface.h"
+
+#define NFAPI_NR_MAX_NB_CCE_AGGREGATION_LEVELS 5
+
+// Extension to the generic structures for single tlv values
+typedef struct {
+ nfapi_tl_t tl;
+ int32_t value;
+} nfapi_int32_tlv_t;
+
+typedef struct {
+ nfapi_tl_t tl;
+ uint32_t value;
+} nfapi_uint32_tlv_t;
+
+/*typedef struct {
+ nfapi_tl_t tl;
+ int64_t value;
+} nfapi_int64_tlv_t;
+
+typedef struct {
+ nfapi_tl_t tl;
+ uint64_t value;
+} nfapi_uint64_tlv_t;*/
+
// nFAPI enums
typedef enum {
NFAPI_NR_DL_CONFIG_DCI_DL_PDU_TYPE = 0,
@@ -159,6 +183,7 @@ typedef struct {
nfapi_uint16_tlv_t ssb_periodicity;
nfapi_uint16_tlv_t ss_pbch_block_power;
nfapi_uint16_tlv_t n_ssb_crb;
+ nfapi_uint16_tlv_t rmsi_pdcch_config;
} nfapi_nr_sch_config_t;
#define NFAPI_NR_SCH_CONFIG_PHYSICAL_CELL_ID_TAG 0x501E
@@ -268,13 +293,10 @@ typedef enum {
NFAPI_NR_DL_DCI_FORMAT_2_0,
NFAPI_NR_DL_DCI_FORMAT_2_1,
NFAPI_NR_DL_DCI_FORMAT_2_2,
- NFAPI_NR_DL_DCI_FORMAT_2_3
-} nfapi_nr_dl_dci_format_e;
-
-typedef enum {
- NFAPI_NR_UL_DCI_FORMAT_0_0 = 0,
- NFAPI_NR_UL_DCI_FORMAT_1_0,
-} nfapi_nr_ul_dci_format_e;
+ NFAPI_NR_DL_DCI_FORMAT_2_3,
+ NFAPI_NR_UL_DCI_FORMAT_0_0,
+ NFAPI_NR_UL_DCI_FORMAT_0_1
+} nfapi_nr_dci_format_e;
typedef enum {
NFAPI_NR_RNTI_new = 0,
@@ -290,73 +312,62 @@ typedef enum {
NFAPI_NR_RNTI_TPC_PUSCH,
NFAPI_NR_RNTI_TPC_PUCCH,
NFAPI_NR_RNTI_TPC_SRS
-} nfapi_nr_rnti_type_e ;
+} nfapi_nr_rnti_type_e;
+
+typedef enum {
+ NFAPI_NR_USS_FORMAT_0_0_AND_1_0,
+ NFAPI_NR_USS_FORMAT_0_1_AND_1_1,
+} nfapi_nr_uss_dci_formats_e;
+
+typedef enum {
+ NFAPI_NR_SEARCH_SPACE_TYPE_COMMON=0,
+ NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC
+} nfapi_nr_search_space_type_e;
+
+typedef enum {
+ NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1=0,
+ NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE2,
+ NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE3
+} nfapi_nr_ssb_and_cset_mux_pattern_type_e;
+
+typedef enum {
+ NFAPI_NR_CCE_REG_MAPPING_INTERLEAVED=0,
+ NFAPI_NR_CCE_REG_MAPPING_NON_INTERLEAVED
+} nfapi_nr_cce_reg_mapping_type_e;
+
+typedef enum {
+ NFAPI_NR_CSET_CONFIG_MIB_SIB1=0,
+ NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG
+} nfapi_nr_coreset_config_type_e;
+
+typedef enum {
+ NFAPI_NR_CSET_SAME_AS_REG_BUNDLE=0,
+ NFAPI_NR_CSET_ALL_CONTIGUOUS_RBS
+} nfapi_nr_coreset_precoder_granularity_type_e;
// P7 Sub Structures
-//formats 0_0 and 0_1
+
typedef struct {
nfapi_tl_t tl;
-uint8_t cce_idx;
-uint8_t aggregation_level;
-uint16_t rnti;
-
-uint8_t dci_format; //1 bit
-uint16_t frequency_domain_resource_assignment; //up to 9 bits
-uint8_t time_domain_resource_assignment; //0, 1, 2, 3 or 4 bits
+uint8_t format_indicator; //1 bit
+uint16_t frequency_domain_assignment; //up to 16 bits
+uint8_t time_domain_assignment; // 4 bits
uint8_t frequency_hopping_flag; //1 bit
-uint8_t mcs; //5 bits
-uint8_t new_data_indicator; //1 bit
-uint8_t redundancy_version; //2 bits
-uint8_t harq_process; //4 bits
-uint8_t tpc; //2 bits
-uint16_t padding;
-uint8_t ul_sul_indicator; //0 or 1 bit
-
-uint8_t carrier_indicator; //0 or 3 bits
-uint8_t bwp_indicator; //0, 1 or 2 bits
-uint8_t downlink_assignment_index1; //1 or 2 bits
-uint8_t downlink_assignment_index2; //0 or 2 bits
-uint8_t srs_resource_indicator;
-uint8_t precoding_information;
-uint8_t antenna_ports;
-uint8_t srs_request;
-uint8_t csi_request;
-uint8_t cbgti; //CBG Transmission Information: 0, 2, 4, 6 or 8 bits
-uint8_t ptrs_dmrs_association;
-uint8_t beta_offset_indicator; //0 or 2 bits
-uint8_t dmrs_sequence_initialization; //0 or 1 bit
-uint8_t ul_sch_indicator; //1 bit
-
-} nfapi_nr_ul_config_dci_ul_pdu_rel15_t;
-//#define NFAPI_NR_UL_CONFIG_REQUEST_DCI_UL_PDU_REL15_TAG 0x????
-
-//formats 1_0, 1_1, 2_0, 2_1, 2_2 and 2_3
-typedef struct {
-
-nfapi_tl_t tl;
-
-uint8_t cce_idx;
-uint8_t aggregation_level;
-uint16_t rnti;
-
-uint8_t dci_format; //1 bit
-uint16_t frequency_domain_resource_assignment; //up to 9 bits
uint8_t ra_preamble_index; //6 bits
-uint8_t ul_sul_indicator; //1 bit
uint8_t ss_pbch_index; //6 bits
uint8_t prach_mask_index; //4 bits
-uint16_t reserved; //1_0/C-RNTI:10 bits, 1_0/P-RNTI: 6 bits, 1_0/SI-&RA-RNTI: 16 bits
-uint8_t time_domain_resource_assignment; //0, 1, 2, 3 or 4 bits
uint8_t vrb_to_prb_mapping; //0 or 1 bit
uint8_t mcs; //5 bits
-uint8_t new_data_indicator; //1 bit
-uint8_t redundancy_version; //2 bits
-uint8_t harq_process; //4 bits
-uint8_t downlink_assignment_index; //0, 2 or 4 bits
+uint8_t ndi; //1 bit
+uint8_t rv; //2 bits
+uint8_t harq_pid; //4 bits
+uint8_t dai; //0, 2 or 4 bits
+uint8_t dai1; //1 or 2 bits
+uint8_t dai2; //0 or 2 bits
uint8_t tpc; //2 bits
uint8_t pucch_resource_indicator; //3 bits
uint8_t pdsch_to_harq_feedback_timing_indicator; //0, 1, 2 or 3 bits
@@ -370,13 +381,18 @@ uint8_t bwp_indicator; //0, 1 or 2 bits
uint8_t prb_bundling_size_indicator; //0 or 1 bits
uint8_t rate_matching_indicator; //0, 1 or 2 bits
uint8_t zp_csi_rs_trigger; //0, 1 or 2 bits
-uint8_t antenna_ports; //4, 5 or 6 bits
uint8_t transmission_configuration_indication; //0 or 3 bits
uint8_t srs_request; //2 bits
uint8_t cbgti; //CBG Transmission Information: 0, 2, 4, 6 or 8 bits
uint8_t cbgfi; //CBG Flushing Out Information: 0 or 1 bit
uint8_t dmrs_sequence_initialization; //0 or 1 bit
+uint8_t srs_resource_indicator;
+uint8_t precoding_information;
+uint8_t csi_request;
+uint8_t ptrs_dmrs_association;
+uint8_t beta_offset_indicator; //0 or 2 bits
+
uint8_t slot_format_indicator_count;
uint8_t *slot_format_indicators;
@@ -386,17 +402,75 @@ uint16_t *pre_emption_indications; //14 bit
uint8_t block_number_count;
uint8_t *block_numbers;
+uint8_t ul_sul_indicator; //0 or 1 bit
+uint8_t antenna_ports;
+
+uint16_t reserved; //1_0/C-RNTI:10 bits, 1_0/P-RNTI: 6 bits, 1_0/SI-&RA-RNTI: 16 bits
+uint16_t padding;
+
} nfapi_nr_dl_config_dci_dl_pdu_rel15_t;
//#define NFAPI_NR_DL_CONFIG_REQUEST_DCI_DL_PDU_REL15_TAG 0x????
-typedef struct {
- nfapi_nr_dl_config_dci_dl_pdu_rel15_t dci_dl_pdu_rel15;
-} nfapi_nr_dl_config_dci_dl_pdu;
+typedef struct{
+ nfapi_tl_t tl;
+ uint8_t coreset_id;
+ uint64_t frequency_domain_resources;
+ uint8_t duration;
+ uint8_t cce_reg_mapping_type;
+ uint8_t reg_bundle_size;
+ uint8_t interleaver_size;
+ uint8_t shift_index;
+ uint8_t precoder_granularity;
+ uint8_t tci_state_id;
+ uint8_t tci_present_in_dci;
+ uint32_t dmrs_scrambling_id;
+} nfapi_nr_coreset_t;
+
+typedef struct{
+ nfapi_tl_t tl;
+ uint8_t search_space_id;
+ uint8_t coreset_id;
+ uint8_t search_space_type;
+ uint8_t duration;
+ uint8_t css_formats_0_0_and_1_0;
+ uint8_t css_format_2_0;
+ uint8_t css_format_2_1;
+ uint8_t css_format_2_2;
+ uint8_t css_format_2_3;
+ uint8_t uss_dci_formats;
+ uint8_t srs_monitoring_periodicity;
+ uint8_t slot_monitoring_periodicity;
+ uint8_t slot_monitoring_offset;
+ uint16_t monitoring_symbols_in_slot;
+ uint16_t number_of_candidates[NFAPI_NR_MAX_NB_CCE_AGGREGATION_LEVELS];
+} nfapi_nr_search_space_t;
typedef struct {
- nfapi_nr_ul_config_dci_ul_pdu_rel15_t dci_ul_pdu_rel15;
-} nfapi_nr_ul_config_dci_ul_pdu;
+ nfapi_tl_t tl;
+ uint8_t rnti;
+ uint8_t rnti_type;
+ uint8_t dci_format;
+ uint8_t config_type;
+ uint8_t search_space_type;
+ uint8_t aggregation_level;
+ uint8_t n_rb;
+ uint8_t n_symb;
+ uint8_t rb_offset;
+ uint8_t cr_mapping_type;
+ uint8_t reg_bundle_size;
+ uint8_t interleaver_size;
+ uint8_t shift_index;
+ uint8_t mux_pattern;
+ uint8_t precoder_granularity;
+ uint8_t first_slot;
+ uint8_t first_symbol;
+ uint8_t nb_ss_sets_per_slot;
+ uint8_t nb_slots;
+ uint8_t sfn_mod2;
+ uint16_t scrambling_id;
+ nfapi_bf_vector_t bf_vector;
+} nfapi_nr_dl_config_pdcch_parameters_rel15_t;
typedef struct {
nfapi_tl_t tl;
@@ -411,13 +485,20 @@ typedef struct {
} nfapi_nr_dl_config_bch_pdu;
typedef struct {
-
-} nfapi_nr_dl_config_dlsch_pdu;
+ nfapi_tl_t tl;
+ nfapi_nr_search_space_t sib1searchSpace;
+ nfapi_nr_coreset_t sib1ControlResourceSets;
+ nfapi_nr_search_space_t sibssearchSpace;
+ nfapi_nr_coreset_t sibsControlResourceSets;
+ nfapi_nr_search_space_t ra_SearchSpace;
+ nfapi_nr_coreset_t ra_ControlResourceSets;
+}nfapi_nr_dl_config_dlsch_pdu_rel15_t;
typedef struct {
nfapi_tl_t tl;
- nfapi_nr_SearchSpace_t pagingSearchSpace;
-} nfapi_nr_dl_config_pch_pdu;
+ nfapi_nr_search_space_t pagingSearchSpace;
+ nfapi_nr_coreset_t pagingControlResourceSets;
+}nfapi_nr_dl_config_pch_pdu_rel15_t;
typedef struct {
@@ -431,26 +512,31 @@ typedef struct {
} nfapi_nr_dl_config_ndlsch_pdu;
+typedef struct {
+ nfapi_nr_dl_config_dci_dl_pdu_rel15_t dci_dl_pdu_rel15;
+ nfapi_nr_dl_config_pdcch_parameters_rel15_t pdcch_params_rel15;
+} nfapi_nr_dl_config_dci_dl_pdu;
+
+
typedef struct {
uint8_t pdu_type;
uint8_t pdu_size;
+
union {
- nfapi_nr_dl_config_dci_dl_pdu dci_dl_pdu;
- nfapi_nr_ul_config_dci_ul_pdu dci_ul_pdu;
- nfapi_nr_dl_config_bch_pdu bch_pdu;
- nfapi_nr_dl_config_dlsch_pdu dlsch_pdu;
- nfapi_nr_dl_config_pch_pdu pch_pdu;
- nfapi_nr_dl_config_nbch_pdu nbch_pdu;
- nfapi_nr_dl_config_npdcch_pdu npdcch_pdu;
- nfapi_nr_dl_config_ndlsch_pdu ndlsch_pdu;
+ nfapi_nr_dl_config_dci_dl_pdu dci_dl_pdu;
+ nfapi_nr_dl_config_bch_pdu_rel15_t bch_pdu_rel15;
+ nfapi_nr_dl_config_dlsch_pdu_rel15_t dlsch_pdu_rel15;
+ nfapi_nr_dl_config_pch_pdu_rel15_t pch_pdu_rel15;
+ //nfapi_nr_dl_config_nbch_pdu_rel15_t nbch_pdu_rel15;
+ //nfapi_nr_dl_config_npdcch_pdu_rel15_t npdcch_pdu_rel15;
+ //nfapi_nr_dl_config_ndlsch_pdu_rel15_t ndlsch_pdu_rel15;
};
} nfapi_nr_dl_config_request_pdu_t;
typedef struct {
nfapi_tl_t tl;
- uint8_t number_pdcch_ofdm_symbols;
uint8_t number_dci;
- uint16_t number_pdu;
+ uint8_t number_pdu;
uint8_t number_pdsch_rnti;
nfapi_nr_dl_config_request_pdu_t *dl_config_pdu_list;
} nfapi_nr_dl_config_request_body_t;
diff --git a/openair1/PHY/CODING/TESTBENCH/polartest.c b/openair1/PHY/CODING/TESTBENCH/polartest.c
index e23c69215a..3c725eb5f2 100644
--- a/openair1/PHY/CODING/TESTBENCH/polartest.c
+++ b/openair1/PHY/CODING/TESTBENCH/polartest.c
@@ -7,10 +7,13 @@
#include
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
-#include "PHY/CODING/nrPolar_tools/nr_polar_pbch_defs.h"
-#include "PHY/CODING/nrPolar_tools/nr_polar_uci_defs.h"
+#include "PHY/CODING/coding_defs.h"
#include "SIMULATION/TOOLS/sim.h"
+//#define DEBUG_DCI_POLAR_PARAMS
+//#define DEBUG_POLAR_TIMING
+//#define DEBUG_CRC
+
int main(int argc, char *argv[]) {
//Initiate timing. (Results depend on CPU Frequency. Therefore, might change due to performance variances during simulation.)
@@ -18,39 +21,30 @@ int main(int argc, char *argv[]) {
time_stats_t polar_decoder_init,polar_rate_matching,decoding,bit_extraction,deinterleaving;
time_stats_t path_metric,sorting,update_LLR;
opp_enabled=1;
- int decoder_int8=0;
+ int decoder_int16=0;
+ int generate_optim_code=0;
cpu_freq_GHz = get_cpu_freq_GHz();
reset_meas(&timeEncoder);
reset_meas(&timeDecoder);
- reset_meas(&polar_decoder_init);
- reset_meas(&polar_rate_matching);
- reset_meas(&decoding);
- reset_meas(&bit_extraction);
- reset_meas(&deinterleaving);
- reset_meas(&sorting);
- reset_meas(&path_metric);
- reset_meas(&update_LLR);
+ randominit(0);
+ crcTableInit();
- randominit(1234);
//Default simulation values (Aim for iterations = 1000000.)
- int itr, iterations = 1000, arguments, polarMessageType = 1; //0=DCI, 1=PBCH, 2=UCI
+ int itr, iterations = 1000, arguments, polarMessageType = 0; //0=PBCH, 1=DCI, -1=UCI
double SNRstart = -20.0, SNRstop = 0.0, SNRinc= 0.5; //dB
double SNR, SNR_lin;
int16_t nBitError = 0; // -1 = Decoding failed (All list entries have failed the CRC checks).
int8_t decoderState=0, blockErrorState=0; //0 = Success, -1 = Decoding failed, 1 = Block Error.
- uint16_t testLength, coderLength, blockErrorCumulative=0, bitErrorCumulative=0;
+ uint16_t testLength = 0, coderLength = 0, blockErrorCumulative=0, bitErrorCumulative=0;
double timeEncoderCumulative = 0, timeDecoderCumulative = 0;
+ uint8_t aggregation_level = 8, decoderListSize = 8, pathMetricAppr = 0;
- uint8_t decoderListSize = 8, pathMetricAppr = 0; //0 --> eq. (8a) and (11b), 1 --> eq. (9) and (12)
- int generate_optim_code=0;
-
- while ((arguments = getopt (argc, argv, "s:d:f:m:i:l:a:h:qg")) != -1)
+ while ((arguments = getopt (argc, argv, "s:d:f:m:i:l:a:hqg")) != -1)
switch (arguments)
{
case 's':
SNRstart = atof(optarg);
- printf("SNRstart = %f\n", SNRstart);
break;
case 'd':
@@ -78,7 +72,7 @@ int main(int argc, char *argv[]) {
break;
case 'q':
- decoder_int8=1;
+ decoder_int16=1;
break;
case 'g':
@@ -86,10 +80,11 @@ int main(int argc, char *argv[]) {
iterations=1;
SNRstart=-6.0;
SNRstop =-6.0;
- decoder_int8=1;
+ decoder_int16=1;
break;
+
case 'h':
- printf("./polartest -s SNRstart -d SNRinc -f SNRstop -m [0=DCI|1=PBCH|2=UCI] -i iterations -l decoderListSize -a pathMetricAppr\n");
+ printf("./polartest -s SNRstart -d SNRinc -f SNRstop -m [0=PBCH|1=DCI|2=UCI] -i iterations -l decoderListSize -a pathMetricAppr -q (use fixed point decoder)\n");
exit(-1);
default:
@@ -97,139 +92,323 @@ int main(int argc, char *argv[]) {
exit(-1);
}
- if (polarMessageType == 0) { //DCI
- //testLength = ;
- //coderLength = ;
- printf("polartest for DCI not supported yet\n");
- exit(-1);
- } else if (polarMessageType == 1) { //PBCH
- testLength = NR_POLAR_PBCH_PAYLOAD_BITS;
- coderLength = NR_POLAR_PBCH_E;
- printf("running polartest for PBCH\n");
- } else if (polarMessageType == 2) { //UCI
- testLength = NR_POLAR_PUCCH_PAYLOAD_BITS;
- coderLength = NR_POLAR_PUCCH_E;
- printf("running polartest for UCI");
- } else {
- printf("unsupported polarMessageType %d (0=DCI, 1=PBCH, 2=UCI)\n",polarMessageType);
- exit(-1);
+ if (polarMessageType == 0) { //PBCH
+ testLength = NR_POLAR_PBCH_PAYLOAD_BITS;
+ coderLength = NR_POLAR_PBCH_E;
+ aggregation_level = NR_POLAR_PBCH_AGGREGATION_LEVEL;
+ } else if (polarMessageType == 1) { //DCI
+ //testLength = nr_get_dci_size(params_rel15->dci_format, params_rel15->rnti_type, &fp->initial_bwp_dl, cfg);
+ testLength = 20;
+ coderLength = 108; //to be changed by aggregate level function.
+ } else if (polarMessageType == -1) { //UCI
+ //testLength = ;
+ //coderLength = ;
}
//Logging
time_t currentTime;
time (¤tTime);
- char *folderName, fileName[512], currentTimeInfo[25];
+ char fileName[512], currentTimeInfo[25];
+ char folderName[] = ".";
+ /*
folderName=getenv("HOME");
strcat(folderName,"/Desktop/polartestResults");
+ */
+
+ #ifdef DEBUG_POLAR_TIMING
+ sprintf(fileName,"%s/TIMING_ListSize_%d_pmAppr_%d_Payload_%d_Itr_%d",folderName,decoderListSize,pathMetricAppr,testLength,iterations);
+ #else
sprintf(fileName,"%s/_ListSize_%d_pmAppr_%d_Payload_%d_Itr_%d",folderName,decoderListSize,pathMetricAppr,testLength,iterations);
+ #endif
strftime(currentTimeInfo, 25, "_%Y-%m-%d-%H-%M-%S.csv", localtime(¤tTime));
strcat(fileName,currentTimeInfo);
//Create "~/Desktop/polartestResults" folder if it doesn't already exist.
+ /*
struct stat folder = {0};
if (stat(folderName, &folder) == -1) mkdir(folderName, S_IRWXU | S_IRWXG | S_IRWXO);
-
+ */
+
FILE* logFile;
logFile = fopen(fileName, "w");
if (logFile==NULL) {
fprintf(stderr,"[polartest.c] Problem creating file %s with fopen\n",fileName);
exit(-1);
}
- fprintf(logFile,",SNR,nBitError,blockErrorState,t_encoder[us],t_decoder[us]\n");
- uint8_t *testInput = malloc(sizeof(uint8_t) * testLength); //generate randomly
- uint8_t *encoderOutput = malloc(sizeof(uint8_t) * coderLength);
+#ifdef DEBUG_POLAR_TIMING
+ fprintf(logFile,",timeEncoderCRCByte[us],timeEncoderCRCBit[us],timeEncoderInterleaver[us],timeEncoderBitInsertion[us],timeEncoder1[us],timeEncoder2[us],timeEncoderRateMatching[us],timeEncoderByte2Bit[us]\n");
+#else
+ fprintf(logFile,",SNR,nBitError,blockErrorState,t_encoder[us],t_decoder[us]\n");
+#endif
+
+ uint8_t testArrayLength = ceil(testLength / 32.0);
+ uint8_t coderArrayLength = ceil(coderLength / 32.0);
+
+ uint32_t *testInput = malloc(sizeof(uint32_t) * testArrayLength); //generate randomly
+ uint32_t *encoderOutput = malloc(sizeof(uint32_t) * coderArrayLength);
+ uint32_t *estimatedOutput = malloc(sizeof(uint32_t) * testArrayLength); //decoder output
+ memset(testInput,0,sizeof(uint32_t) * testArrayLength);
+ memset(encoderOutput,0,sizeof(uint32_t) * coderArrayLength);
+ memset(estimatedOutput,0,sizeof(uint32_t) * testArrayLength);
+
+ uint8_t *encoderOutputByte = malloc(sizeof(uint8_t) * coderLength);
double *modulatedInput = malloc (sizeof(double) * coderLength); //channel input
-
double *channelOutput = malloc (sizeof(double) * coderLength); //add noise
- int16_t *channelOutput_int8 = malloc (sizeof(int16_t) * coderLength); //add noise
- uint8_t *estimatedOutput = malloc(sizeof(uint8_t) * testLength); //decoder output
+ int16_t *channelOutput_int16;
+ if (decoder_int16 == 1) channelOutput_int16 = (int16_t*)malloc (sizeof(int16_t) * coderLength);
+
+ t_nrPolar_paramsPtr nrPolar_params = NULL, currentPtr = NULL;
+ nr_polar_init(&nrPolar_params, polarMessageType, testLength, aggregation_level);
+ currentPtr = nr_polar_params(nrPolar_params, polarMessageType, testLength, aggregation_level);
- t_nrPolar_params nrPolar_params;
- nr_polar_init(&nrPolar_params, polarMessageType);
- nr_polar_llrtableinit();
+#ifdef DEBUG_DCI_POLAR_PARAMS
+ uint32_t dci_pdu[4];
+ memset(dci_pdu,0,sizeof(uint32_t)*4);
+ dci_pdu[0]=0x01189400;
+ printf("dci_pdu: [0]->0x%08x \t [1]->0x%08x \t [2]->0x%08x \t [3]->0x%08x\n",
+ dci_pdu[0], dci_pdu[1], dci_pdu[2], dci_pdu[3]);
+ uint32_t encoder_output[54];
+ memset(encoder_output,0,sizeof(uint32_t)*54);
+ uint16_t size=41;
+ uint16_t rnti=3;
+ aggregation_level=8;
+ nr_polar_init(&nrPolar_params, 1, size, aggregation_level);
+ t_nrPolar_paramsPtr currentPtrDCI=nr_polar_params(nrPolar_params, 1, size, aggregation_level);
- if (generate_optim_code==1) nrPolar_params.decoder_kernel = NULL;
+ polar_encoder_dci(dci_pdu, encoder_output, currentPtrDCI, rnti);
+ for (int i=0;i<54;i++)
+ printf("encoder_output: [%2d]->0x%08x \n",i, encoder_output[i]);
+
+ uint8_t *encoder_outputByte = malloc(sizeof(uint8_t) * currentPtrDCI->encoderLength);
+ double *channel_output = malloc (sizeof(double) * currentPtrDCI->encoderLength);
+ uint32_t dci_estimation[4];
+ memset(dci_estimation,0,sizeof(uint32_t)*4);
+ printf("dci_estimation: [0]->0x%08x \t [1]->0x%08x \t [2]->0x%08x \t [3]->0x%08x\n",
+ dci_estimation[0], dci_estimation[1], dci_estimation[2], dci_estimation[3]);
+ nr_bit2byte_uint32_8_t(encoder_output, currentPtrDCI->encoderLength, encoder_outputByte);
+ printf("[polartest] encoder_outputByte: ");
+ for (int i = 0; i < currentPtrDCI->encoderLength; i++) printf("%d-", encoder_outputByte[i]);
+ printf("\n");
+ for(int i=0; iencoderLength; i++) {
+ if (encoder_outputByte[i] == 0) {
+ channel_output[i]=1/sqrt(2);
+ }
+ else {
+ channel_output[i]=(-1)/sqrt(2);
+ }
+ }
+
+ decoderState = polar_decoder_dci(channel_output,
+ dci_estimation,
+ currentPtrDCI,
+ NR_POLAR_DECODER_LISTSIZE,
+ NR_POLAR_DECODER_PATH_METRIC_APPROXIMATION,
+ rnti);
+ printf("dci_estimation: [0]->0x%08x \t [1]->0x%08x \t [2]->0x%08x \t [3]->0x%08x\n",
+ dci_estimation[0], dci_estimation[1], dci_estimation[2], dci_estimation[3]);
+ return 0;
+#endif
+
+#ifdef DEBUG_CRC
+ uint32_t crc;
+ unsigned int poly24c = 0xb2b11700;
+ uint32_t testInputCRC[4];
+ testInputCRC[0]=0x00291880;
+ //testInputCRC[0]=0x01189400;
+ testInputCRC[1]=0x00000000;
+ testInputCRC[2]=0x00000000;
+ testInputCRC[3]=0x00000000;
+
+ uint32_t testInputcrc=0x01189400;
+ uint32_t testInputcrc2=0x00291880;
+
+ uint8_t testInputCRC2[8];
+ nr_crc_bit2bit_uint32_8_t(testInputCRC, 32, testInputCRC2);
+ printf("testInputCRC2: [0]->%x \t [1]->%x \t [2]->%x \t [3]->%x\n"
+ " [4]->%x \t [5]->%x \t [6]->%x \t [7]->%x\n",
+ testInputCRC2[0], testInputCRC2[1], testInputCRC2[2], testInputCRC2[3],
+ testInputCRC2[4], testInputCRC2[5], testInputCRC2[6], testInputCRC2[7]);
+ unsigned int crc41 = crc24c(testInputCRC, 32);
+ unsigned int crc65 = crc24c(testInputCRC, 56);
+ printf("crc41: [0]->0x%08x\tcrc65: [0]->0x%08x\n",crc41, crc65);
+ for (int i=0;i<32;i++) printf("crc41[%d]=%d\tcrc65[%d]=%d\n",i,(crc41>>i)&1,i,(crc65>>i)&1);
+
+ crc = crc24c(testInputCRC, testLength)>>8;
+ for (int i=0;i<24;i++) printf("[i]=%d\n",(crc>>i)&1);
+ printf("crc: [0]->0x%08x\n",crc);
+ //crcbit(testInputCRC, sizeof(test) - 1, poly24c));
+
+ testInputCRC[testLength>>3] = ((uint8_t*)&crc)[2];
+ testInputCRC[1+(testLength>>3)] = ((uint8_t*)&crc)[1];
+ testInputCRC[2+(testLength>>3)] = ((uint8_t*)&crc)[0];
+ printf("testInputCRC: [0]->0x%08x \t [1]->0x%08x \t [2]->0x%08x \t [3]->0x%08x\n",
+ testInputCRC[0], testInputCRC[1], testInputCRC[2], testInputCRC[3]);
+
+
+ //uint32_t trial32 = 0xffffffff;
+ uint32_t trial32 = 0xf10fffff;
+ uint8_t a[4];
+ //memcpy(a, &trial32, sizeof(trial32));
+ *(uint32_t *)a = trial32;
+ unsigned char trial[4];
+ trial[0]=0xff; trial[1]=0xff; trial[2]=0x0f; trial[3]=0xf1;
+ uint32_t trialcrc = crc24c(trial, 32);
+ uint32_t trialcrc32 = crc24c((uint8_t *)&trial32, 32);
+ //uint32_t trialcrc32 = crc24c(a, 32);
+ printf("crcbit(trial = %x\n", crcbit(trial, 4, poly24c));
+ printf("trialcrc = %x\n", trialcrc);
+ printf("trialcrc32 = %x\n", trialcrc32);
+ for (int i=0;i<32;i++) printf("trialcrc[%2d]=%d\ttrialcrc32[%2d]=%d\n",i,(trialcrc>>i)&1,i,(trialcrc32>>i)&1);
+
+
+ //uint8_t nr_polar_A[32] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
+ uint8_t nr_polar_A[32] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,1};
+ uint8_t nr_polar_crc[24];
+ uint8_t **crc_generator_matrix = crc24c_generator_matrix(32);
+ nr_matrix_multiplication_uint8_t_1D_uint8_t_2D(nr_polar_A,
+ crc_generator_matrix,
+ nr_polar_crc,
+ 32,
+ 24);
+ for (uint8_t i = 0; i < 24; i++){
+ nr_polar_crc[i] = (nr_polar_crc[i] % 2);
+ printf("nr_polar_crc[%d]=%d\n",i,nr_polar_crc[i]);
+ }
+ return 0;
+#endif
+
+#ifdef DEBUG_POLAR_TIMING
+ for (SNR = SNRstart; SNR <= SNRstop; SNR += SNRinc) {
+ SNR_lin = pow(10, SNR / 10);
+ for (itr = 1; itr <= iterations; itr++) {
+ for (int j=0; j0x%08x \n", testInput[0]);
+ polar_encoder_timing(testInput, encoderOutput, currentPtr, cpu_freq_GHz, logFile);
+ }
+ }
+ fclose(logFile);
+ free(testInput);
+ free(encoderOutput);
+ free(modulatedInput);
+ free(channelOutput);
+ free(estimatedOutput);
+ return (0);
+#endif
// We assume no a priori knowledge available about the payload.
- double aPrioriArray[nrPolar_params.payloadBits];
- for (int i=0; i<=nrPolar_params.payloadBits; i++) aPrioriArray[i] = NAN;
-
- printf("SNRstart %f, SNRstop %f,, SNRinc %f\n",SNRstart,SNRstop,SNRinc);
+ double aPrioriArray[currentPtr->payloadBits];
+ for (int i=0; ipayloadBits; i++) aPrioriArray[i] = NAN;
for (SNR = SNRstart; SNR <= SNRstop; SNR += SNRinc) {
printf("SNR %f\n",SNR);
SNR_lin = pow(10, SNR/10);
for (itr = 1; itr <= iterations; itr++) {
- for(int i=0; i 15) channelOutput_int8[i] = 127;
- else if (channelOutput[i] < -16) channelOutput_int8[i] = -128;
- else channelOutput_int8[i] = (int16_t) (8*channelOutput[i]);
+ for (int i = 0; i < testArrayLength; i++) {
+ for (int j = 0; j < (sizeof(testInput[0])*8)-1; j++) {
+ testInput[i] |= ( ((uint32_t) (rand()%2)) &1);
+ testInput[i]<<=1;
+ }
+ testInput[i] |= ( ((uint32_t) (rand()%2)) &1);
}
- }
+
+ /*printf("testInput: [0]->0x%08x\n", testInput[0]);
+ for (int i=0; i<32; i++)
+ printf("%d\n",(testInput[0]>>i)&1);*/
+
+ start_meas(&timeEncoder);
+ polar_encoder(testInput, encoderOutput, currentPtr);
+ stop_meas(&timeEncoder);
+
+ /*printf("encoderOutput: [0]->0x%08x\n", encoderOutput[0]);
+ printf("encoderOutput: [1]->0x%08x\n", encoderOutput[1]);*/
+
+ //Bit-to-byte:
+ nr_bit2byte_uint32_8_t(encoderOutput, coderLength, encoderOutputByte);
+
+ //BPSK modulation
+ for(int i=0; i 15) channelOutput_int16[i] = 127;
+ else if (channelOutput[i] < -16) channelOutput_int16[i] = -128;
+ else channelOutput_int16[i] = (int16_t) (8*channelOutput[i]);
+ }
- start_meas(&timeDecoder);
- if (decoder_int8==0)
- decoderState = polar_decoder(channelOutput, estimatedOutput, &nrPolar_params,
- decoderListSize, aPrioriArray, pathMetricAppr,
- &polar_decoder_init,&polar_rate_matching,&decoding,
- &bit_extraction,&deinterleaving,&sorting,&path_metric,&update_LLR);
- else
- decoderState = polar_decoder_int8_new(channelOutput_int8, estimatedOutput, &nrPolar_params,
- decoderListSize, &polar_decoder_init,&polar_rate_matching,
- &decoding,&bit_extraction,&deinterleaving,
- &sorting,&path_metric,&update_LLR,
- generate_optim_code);
- stop_meas(&timeDecoder);
-
- //calculate errors
- if (decoderState==-1) {
- blockErrorState=-1;
- nBitError=-1;
- } else {
- for(int i=0; i0) blockErrorState=1;
- }
- //Iteration times are in microseconds.
- timeEncoderCumulative+=(timeEncoder.diff_now/(cpu_freq_GHz*1000.0));
- timeDecoderCumulative+=(timeDecoder.diff_now/(cpu_freq_GHz*1000.0));
- fprintf(logFile,",%f,%d,%d,%f,%f\n", SNR, nBitError, blockErrorState,
- (timeEncoder.diff_now/(cpu_freq_GHz*1000.0)), (timeDecoder.diff_now/(cpu_freq_GHz*1000.0)));
+ start_meas(&timeDecoder);
+ /*decoderState = polar_decoder(channelOutput,
+ estimatedOutput,
+ currentPtr,
+ NR_POLAR_DECODER_LISTSIZE,
+ aPrioriArray,
+ NR_POLAR_DECODER_PATH_METRIC_APPROXIMATION);*/
+ if (decoder_int16==0)
+ decoderState = polar_decoder_aPriori(channelOutput,
+ estimatedOutput,
+ currentPtr,
+ NR_POLAR_DECODER_LISTSIZE,
+ NR_POLAR_DECODER_PATH_METRIC_APPROXIMATION,
+ aPrioriArray);
+ else
+ decoderState = polar_decoder_int16(channelOutput_int16,
+ estimatedOutput,
+ currentPtr);
- if (nBitError<0) {
- blockErrorCumulative++;
- bitErrorCumulative+=testLength;
- } else {
- blockErrorCumulative+=blockErrorState;
- bitErrorCumulative+=nBitError;
- }
+
+ stop_meas(&timeDecoder);
+ /*printf("testInput: [0]->0x%08x\n", testInput[0]);
+ printf("estimatedOutput: [0]->0x%08x\n", estimatedOutput[0]);*/
- decoderState=0;
- nBitError=0;
- blockErrorState=0;
+
+ //calculate errors
+ if (decoderState==-1) {
+ blockErrorState=-1;
+ nBitError=-1;
+ } else {
+ for (int i = 0; i < testArrayLength; i++) {
+ for (int j = 0; j < (sizeof(testInput[0])*8); j++) {
+ if (((estimatedOutput[i]>>j) & 1) != ((testInput[i]>>j) & 1)) nBitError++;
+ }
+ }
+
+ if (nBitError>0) blockErrorState=1;
+ }
+
+ //Iteration times are in microseconds.
+ timeEncoderCumulative+=(timeEncoder.diff_now/(cpu_freq_GHz*1000.0));
+ timeDecoderCumulative+=(timeDecoder.diff_now/(cpu_freq_GHz*1000.0));
+ fprintf(logFile,",%f,%d,%d,%f,%f\n", SNR, nBitError, blockErrorState,
+ (timeEncoder.diff_now/(cpu_freq_GHz*1000.0)), (timeDecoder.diff_now/(cpu_freq_GHz*1000.0)));
+
+ if (nBitError<0) {
+ blockErrorCumulative++;
+ bitErrorCumulative+=testLength;
+ } else {
+ blockErrorCumulative+=blockErrorState;
+ bitErrorCumulative+=nBitError;
+ }
+
+ decoderState=0;
+ nBitError=0;
+ blockErrorState=0;
}
//Calculate error statistics for the SNR.
@@ -237,15 +416,10 @@ int main(int argc, char *argv[]) {
decoderListSize, pathMetricAppr, SNR, ((double)blockErrorCumulative/iterations),
((double)bitErrorCumulative / (iterations*testLength)),
(timeEncoderCumulative/iterations),timeDecoderCumulative/iterations);
- printf("decoding init %9.3fus\n",polar_decoder_init.diff/(cpu_freq_GHz*1000.0*polar_decoder_init.trials));
- printf("decoding polar_rate_matching %9.3fus\n",polar_rate_matching.diff/(cpu_freq_GHz*1000.0*polar_rate_matching.trials));
- printf("decoding decoding %9.3fus\n",decoding.diff/(cpu_freq_GHz*1000.0*decoding.trials));
- printf("decoding bit_extraction %9.3fus\n",bit_extraction.diff/(cpu_freq_GHz*1000.0*bit_extraction.trials));
- printf("decoding deinterleaving %9.3fus\n",deinterleaving.diff/(cpu_freq_GHz*1000.0*deinterleaving.trials));
- printf("decoding path_metric %9.3fus\n",path_metric.diff/(cpu_freq_GHz*1000.0*decoding.trials));
- printf("decoding sorting %9.3fus\n",sorting.diff/(cpu_freq_GHz*1000.0*decoding.trials));
- printf("decoding updateLLR %9.3fus\n",update_LLR.diff/(cpu_freq_GHz*1000.0*decoding.trials));
+ if (blockErrorCumulative==0 && bitErrorCumulative==0)
+ break;
+
blockErrorCumulative = 0; bitErrorCumulative = 0;
timeEncoderCumulative = 0; timeDecoderCumulative = 0;
}
@@ -254,11 +428,14 @@ int main(int argc, char *argv[]) {
print_meas(&timeDecoder,"polar_decoder",NULL,NULL);
fclose(logFile);
+ //Bit
free(testInput);
free(encoderOutput);
+ free(estimatedOutput);
+ //Byte
+ free(encoderOutputByte);
free(modulatedInput);
free(channelOutput);
- free(estimatedOutput);
return (0);
}
diff --git a/openair1/PHY/CODING/coding_defs.h b/openair1/PHY/CODING/coding_defs.h
index eccac22da3..daadac366c 100644
--- a/openair1/PHY/CODING/coding_defs.h
+++ b/openair1/PHY/CODING/coding_defs.h
@@ -355,8 +355,16 @@ based on 3GPP UMTS/LTE specifications.
@param inPtr Pointer to input byte stream
@param bitlen length of inputs in bits
*/
-unsigned int crc24b (unsigned char * inptr, int bitlen);
-
+uint32_t crc24b (uint8_t *inPtr, int32_t bitlen);
+
+/*!\fn uint32_t crc24c(uint8_t *inPtr, int32_t bitlen)
+\brief This computes a 24-bit crc ('c' variant for transport-block segments)
+based on 3GPP Rel 15 specifications.
+@param inPtr Pointer to input byte stream
+@param bitlen length of inputs in bits
+*/
+uint32_t crc24c (uint8_t *inPtr, int32_t bitlen);
+
/*!\fn uint32_t crc16(uint8_t *inPtr, int32_t bitlen)
\brief This computes a 16-bit crc based on 3GPP UMTS specifications.
@param inPtr Pointer to input byte stream
@@ -440,4 +448,20 @@ decoder_if_t phy_threegpplte_turbo_decoder;
decoder_if_t phy_threegpplte_turbo_decoder8;
decoder_if_t phy_threegpplte_turbo_decoder16;
+int32_t nr_segmentation(unsigned char *input_buffer,
+ unsigned char **output_buffers,
+ unsigned int B,
+ unsigned int *C,
+ unsigned int *Kplus,
+ unsigned int *Kminus,
+ unsigned int *Zout,
+ unsigned int *F);
+
+uint32_t nr_compute_tbs(uint8_t mcs,
+ uint16_t nb_rb,
+ uint16_t nb_symb_sch,
+ uint8_t nb_re_dmrs,
+ uint16_t length_dmrs,
+ uint8_t Nl);
+
#endif
diff --git a/openair1/PHY/CODING/crc_byte.c b/openair1/PHY/CODING/crc_byte.c
index d20b6f8ec6..6176e1f92f 100644
--- a/openair1/PHY/CODING/crc_byte.c
+++ b/openair1/PHY/CODING/crc_byte.c
@@ -35,9 +35,12 @@
/*ref 36-212 v8.6.0 , pp 8-9 */
/* the highest degree is set by default */
-unsigned int poly24a = 0x864cfb00; //1000 0110 0100 1100 1111 1011 D^24 + D^23 + D^18 + D^17 + D^14 + D^11 + D^10 + D^7 + D^6 + D^5 + D^4 + D^3 + D + 1
-unsigned int poly24b = 0x80006300; // 1000 0000 0000 0000 0110 0011 D^24 + D^23 + D^6 + D^5 + D + 1
-uint32_t poly24c = 0xB2B11700; //101100101011000100010111
+unsigned int poly24a = 0x864cfb00; // 1000 0110 0100 1100 1111 1011
+ // D^24 + D^23 + D^18 + D^17 + D^14 + D^11 + D^10 + D^7 + D^6 + D^5 + D^4 + D^3 + D + 1
+unsigned int poly24b = 0x80006300; // 1000 0000 0000 0000 0110 0011
+ // D^24 + D^23 + D^6 + D^5 + D + 1
+unsigned int poly24c = 0xb2b11700; // 1011 0010 1011 0001 0001 0111
+ // D^24+D^23+D^21+D^20+D^17+D^15+D^13+D^12+D^8+D^4+D^2+D+1
unsigned int poly16 = 0x10210000; // 0001 0000 0010 0001 D^16 + D^12 + D^5 + 1
unsigned int poly12 = 0x80F00000; // 1000 0000 1111 D^12 + D^11 + D^3 + D^2 + D + 1
unsigned int poly8 = 0x9B000000; // 1001 1011 D^8 + D^7 + D^4 + D^3 + D + 1
@@ -52,10 +55,11 @@ For initialization && verification purposes,
The first bit is in the MSB of each byte
*********************************************************/
-unsigned int
-crcbit (unsigned char * inputptr, int octetlen, unsigned int poly)
+unsigned int crcbit (unsigned char * inputptr,
+ int octetlen,
+ unsigned int poly)
{
- unsigned int i, crc = 0, c;
+ unsigned int i, crc = 0, c;
while (octetlen-- > 0) {
c = (*inputptr++) << 24;
@@ -78,19 +82,21 @@ crcbit (unsigned char * inputptr, int octetlen, unsigned int poly)
crc table initialization
*********************************************************/
-static unsigned int crc24aTable[256];
-static unsigned int crc24bTable[256];
+static unsigned int crc24aTable[256];
+static unsigned int crc24bTable[256];
+static unsigned int crc24cTable[256];
static unsigned short crc16Table[256];
static unsigned short crc12Table[256];
static unsigned char crc8Table[256];
void crcTableInit (void)
{
- unsigned char c = 0;
+ unsigned char c = 0;
do {
crc24aTable[c] = crcbit (&c, 1, poly24a);
crc24bTable[c] = crcbit (&c, 1, poly24b);
+ crc24cTable[c] = crcbit (&c, 1, poly24c);
crc16Table[c] = (unsigned short) (crcbit (&c, 1, poly16) >> 16);
crc12Table[c] = (unsigned short) (crcbit (&c, 1, poly12) >> 16);
crc8Table[c] = (unsigned char) (crcbit (&c, 1, poly8) >> 24);
@@ -114,8 +120,8 @@ Byte by byte implementations,
assuming initial byte is 0 padded (in MSB) if necessary
*********************************************************/
-unsigned int
-crc24a (unsigned char * inptr, int bitlen)
+unsigned int crc24a (unsigned char * inptr,
+ int bitlen)
{
int octetlen, resbit;
@@ -134,11 +140,11 @@ crc24a (unsigned char * inptr, int bitlen)
return crc;
}
-unsigned int crc24b (unsigned char * inptr, int bitlen)
+unsigned int crc24b (unsigned char * inptr,
+ int bitlen)
{
-
- int octetlen, resbit;
- unsigned int crc = 0;
+ int octetlen, resbit;
+ unsigned int crc = 0;
octetlen = bitlen / 8; /* Change in octets */
resbit = (bitlen % 8);
@@ -153,6 +159,27 @@ unsigned int crc24b (unsigned char * inptr, int bitlen)
return crc;
}
+unsigned int crc24c (unsigned char * inptr,
+ int bitlen)
+{
+ int octetlen, resbit;
+ unsigned int crc = 0;
+ octetlen = bitlen / 8; /* Change in octets */
+ resbit = (bitlen % 8);
+
+ while (octetlen-- > 0) {
+/*#ifdef DEBUG_CRC24C
+ printf("crc24c: in %x => crc %x (%x)\n",crc,*inptr,crc24cTable[(*inptr) ^ (crc >> 24)]);
+#endif*/
+ crc = (crc << 8) ^ crc24cTable[(*inptr++) ^ (crc >> 24)];
+ }
+
+ if (resbit > 0)
+ crc = (crc << resbit) ^ crc24cTable[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))];
+
+ return crc;
+}
+
unsigned int
crc16 (unsigned char * inptr, int bitlen)
{
@@ -228,48 +255,6 @@ unsigned int crcPayload(unsigned char * inptr, int bitlen, uint32_t* crc256Table
return crc;
}
-void nr_crc_computation(uint8_t* input, uint8_t* output, uint16_t payloadBits, uint16_t crcParityBits, uint32_t* crc256Table)
-{
- //Create payload in bit
- uint8_t* input2 = (uint8_t*)malloc(payloadBits); //divided by 8 (in bits)
- uint8_t mask = 128; // 10000000
-
- for(uint8_t ind=0; ind<(payloadBits/8); ind++)
- {
- input2[ind]=0;
- for(uint8_t ind2=0; ind2<8; ind2++)
- {
- if(input[8*ind+ind2])
- {
- input2[ind] = input2[ind] | mask;
- }
- mask= mask >> 1;
- }
- mask=128;
- }
-
- //crcTable256Init(poly);
-
- unsigned int crcBits;
- crcBits = crcPayload(input2, payloadBits, crc256Table);
-
- //create crc in byte
- unsigned int mask2=0x80000000; //100...
-
- for(uint8_t ind=0; ind> 1;
- }
-
-}
-
-
-
#ifdef DEBUG_CRC
diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_bitwise_operations.c b/openair1/PHY/CODING/nrPolar_tools/nr_bitwise_operations.c
index 8e4953574c..beabeead36 100644
--- a/openair1/PHY/CODING/nrPolar_tools/nr_bitwise_operations.c
+++ b/openair1/PHY/CODING/nrPolar_tools/nr_bitwise_operations.c
@@ -21,17 +21,38 @@
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
-void nr_byte2bit(uint8_t *array, uint8_t arraySize, uint8_t *bitArray){//First 2 parameters are in bytes.
-
- for (int i=0; i>0 & 0x01);
- bitArray[(6+(i*8))] = ( array[i]>>1 & 0x01);
- bitArray[(5+(i*8))] = ( array[i]>>2 & 0x01);
- bitArray[(4+(i*8))] = ( array[i]>>3 & 0x01);
- bitArray[(3+(i*8))] = ( array[i]>>4 & 0x01);
- bitArray[(2+(i*8))] = ( array[i]>>5 & 0x01);
- bitArray[(1+(i*8))] = ( array[i]>>6 & 0x01);
- bitArray[ (i*8) ] = ( array[i]>>7 & 0x01);
+void nr_bit2byte_uint32_8_t(uint32_t *in, uint16_t arraySize, uint8_t *out) {
+ uint8_t arrayInd = ceil(arraySize / 32.0);
+ for (int i = 0; i < (arrayInd-1); i++) {
+ for (int j = 0; j < 32; j++) {
+ out[j+(i*32)] = (in[i] >> j) & 1;
+ }
}
+ for (int j = 0; j < arraySize - ((arrayInd-1) * 32); j++) out[j + ((arrayInd-1) * 32)] = (in[(arrayInd-1)] >> j) & 1;
+}
+
+void nr_byte2bit_uint8_32_t(uint8_t *in, uint16_t arraySize, uint32_t *out) {
+ uint8_t arrayInd = ceil(arraySize / 32.0);
+ for (int i = 0; i < arrayInd; i++) {
+ out[i]=0;
+ for (int j = 31; j > 0; j--) {
+ out[i]|=in[(i*32)+j];
+ out[i]<<=1;
+ }
+ out[i]|=in[(i*32)];
+ }
+}
+
+void nr_crc_bit2bit_uint32_8_t(uint32_t *in, uint16_t arraySize, uint8_t *out) {
+ out[0]=0xff;
+ out[1]=0xff;
+ out[2]=0xff;
+ uint8_t arrayInd = ceil(arraySize / 32.0);
+ for (int i = 0; i < arrayInd; i++) {
+ out[3+i*4] = ((in[i] & (0x0000000f))<<4) | ((in[i] & (0x000000f0))>>4);
+ out[4+i*4] = (((in[i] & (0x00000f00))<<4) | ((in[i] & (0x0000f000))>>4))>>8;
+ out[5+i*4] = (((in[i] & (0x000f0000))<<4) | ((in[i] & (0x00f00000))>>4))>>16;
+ out[6+i*4] = (((in[i] & (0x0f000000))<<4) | ((in[i] & (0xf0000000))>>4))>>24;
+ }
}
diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c b/openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c
index 7b5a1c922a..ef329b3aaa 100644
--- a/openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c
+++ b/openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c
@@ -21,132 +21,7 @@
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
-/*
-// ----- New implementation ----
-uint32_t poly6 = 0x84000000; // 10000100000... -> D^6+D^5+1
-uint32_t poly11 = 0xc4200000; //11000100001000... -> D^11+D^10+D^9+D^5+1
-uint32_t poly16 = 0x10210000; //00100000010000100... - > D^16+D^12+D^5+1
-uint32_t poly24a = 0x864cfb00; //100001100100110011111011 -> D^24+D^23+D^18+D^17+D^14+D^11+D^10+D^7+D^6+D^5+D^4+D^3+D+1
-uint32_t poly24b = 0x80006300; //100000000000000001100011 -> D^24+D^23+D^6+D^5+D+1
-uint32_t poly24c = 0xB2B11700; //101100101011000100010111 -> D^24...
-//static unsigned int crc256Table[256];
-
-void nr_crc_computation(uint8_t* input, uint8_t* output, uint16_t payloadBits, uint16_t crcParityBits, uint32_t* crc256Table)
-{
- //Create payload in bit
- uint8_t* input2 = (uint8_t*)malloc(payloadBits); //divided by 8 (in bits)
- uint8_t mask = 128; // 10000000
-
- for(uint8_t ind=0; ind<(payloadBits/8); ind++)
- {
- input2[ind]=0;
- for(uint8_t ind2=0; ind2<8; ind2++)
- {
- if(input[8*ind+ind2])
- {
- input2[ind] = input2[ind] | mask;
- }
- mask= mask >> 1;
- }
- mask=128;
- }
-
- //crcTable256Init(poly);
-
- unsigned int crcBits;
- crcBits = crcPayload(input2, payloadBits, crc256Table);
-
- //create crc in byte
- unsigned int mask2=0x80000000; //100...
- output = (uint8_t*)malloc(sizeof(uint8_t)*crcParityBits);
-
- for(uint8_t ind=0; ind> 1;
- }
-
-}
-
-unsigned int crcbit (unsigned char* inputptr, int octetlen, unsigned int poly)
-{
- unsigned int i, crc = 0, c;
-
- while (octetlen-- > 0) {
- c = (*inputptr++) << 24;
-
- for (i = 8; i != 0; i--) {
- if ((1 << 31) & (c ^ crc))
- crc = (crc << 1) ^ poly;
- else
- crc <<= 1;
-
- c <<= 1;
- }
- }
-
- return crc;
-}
-
-void crcTableInit (void)
-{
- unsigned char c = 0;
-
- do {
- crc6Table[c] = crcbit(&c, 1, poly6);
- crc11Table[c]= crcbit(&c, 1, poly11);
- crc16Table[c] =crcbit(&c, 1, poly16);
- crc24aTable[c]=crcbit(&c, 1, poly24a);
- crc24bTable[c]=crcbit(&c, 1, poly24b);
- crc24cTable[c]=crcbit(&c, 1, poly24c);
-
- } while (++c);
-}
-
-void crcTable256Init (uint32_t poly, uint32_t* crc256Table)
-{
- unsigned char c = 0;
-// crc256Table = malloc(sizeof(uint32_t)*256);
-
- do {
- crc256Table[c] = crcbit(&c, 1, poly);
-
-// crc6Table[c] = crcbit(&c, 1, poly6);
- // crc11Table[c]= crcbit(&c, 1, poly11);
-// crc16Table[c] =crcbit(&c, 1, poly16);
-// crc24aTable[c]=crcbit(&c, 1, poly24a);
-// crc24bTable[c]=crcbit(&c, 1, poly24b);
-// crc24cTable[c]=crcbit(&c, 1, poly24c);
-
- } while (++c);
-
- //return crc256Table;
-}
-
-unsigned int crcPayload(unsigned char * inptr, int bitlen, uint32_t* crc256Table)
-{
- int octetlen, resbit;
- unsigned int crc = 0;
- octetlen = bitlen/8; // Change in bytes
- resbit = (bitlen % 8);
-
- while (octetlen-- > 0)
- {
- crc = (crc << 8) ^ crc256Table[(*inptr++) ^ (crc >> 24)];
- }
-
- if (resbit > 0)
- {
- crc = (crc << resbit) ^ crc256Table[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))];
- }
- return crc;
-}
-*/
// ----- Old implementation ----
uint8_t **crc24c_generator_matrix(uint16_t payloadSizeBits){
diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_channel_interleaver_pattern.c b/openair1/PHY/CODING/nrPolar_tools/nr_polar_channel_interleaver_pattern.c
deleted file mode 100644
index 35e7585e1a..0000000000
--- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_channel_interleaver_pattern.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
-
-void nr_polar_channel_interleaver_pattern(uint16_t *cip, uint8_t I_BIL, uint16_t E){
-
- if (I_BIL == 1) {
- uint16_t T=0, k;
- while( ((T/2)*(T+1)) < E ) T++;
-
-
- int16_t **v = malloc(T * sizeof(*v));
- for (int i = 0; i <= T-1; i++) v[i] = malloc((T-i) * sizeof(*(v[i])));
-
- k=0;
- for (int i = 0; i <= T-1; i++) {
- for (int j = 0; j <= (T-1)-i; j++) {
- if (k Success
@@ -26,512 +37,1041 @@
*/
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
-#include "PHY/CODING/nrPolar_tools/nr_polar_pbch_defs.h"
-#include "PHY/TOOLS/time_meas.h"
int8_t polar_decoder(
double *input,
- uint8_t *output,
- t_nrPolar_params *polarParams,
+ uint8_t *out,
+ t_nrPolar_paramsPtr polarParams,
uint8_t listSize,
- double *aPrioriPayload,
- uint8_t pathMetricAppr,
- time_stats_t *init,
- time_stats_t *polar_rate_matching,
- time_stats_t *decoding,
- time_stats_t *bit_extraction,
- time_stats_t *deinterleaving,
- time_stats_t *sorting,
- time_stats_t *path_metric,
- time_stats_t *update_LLR)
+ uint8_t pathMetricAppr)
{
+ //Assumes no a priori knowledge.
- start_meas(init);
-
- uint8_t **extended_crc_generator_matrix = malloc(polarParams->K * sizeof(uint8_t *)); //G_P3
- uint8_t **tempECGM = malloc(polarParams->K * sizeof(uint8_t *)); //G_P2
- for (int i = 0; i < polarParams->K; i++){
- extended_crc_generator_matrix[i] = malloc(polarParams->crcParityBits * sizeof(uint8_t));
- tempECGM[i] = malloc(polarParams->crcParityBits * sizeof(uint8_t));
- }
-
- for (int i=0; ipayloadBits; i++) {
- for (int j=0; jcrcParityBits; j++) {
- tempECGM[i][j]=polarParams->crc_generator_matrix[i][j];
- }
- }
- for (int i=polarParams->payloadBits; iK; i++) {
- for (int j=0; jcrcParityBits; j++) {
- if( (i-polarParams->payloadBits) == j ){
- tempECGM[i][j]=1;
- } else {
- tempECGM[i][j]=0;
- }
- }
- }
-
- for (int i=0; iK; i++) {
- for (int j=0; jcrcParityBits; j++) {
- extended_crc_generator_matrix[i][j]=tempECGM[polarParams->interleaving_pattern[i]][j];
- }
- }
- uint8_t **bitUpdated = nr_alloc_uint8_t_2D_array(polarParams->N, (polarParams->n+1)); //0=False, 1=True
- uint8_t **llrUpdated = nr_alloc_uint8_t_2D_array(polarParams->N, (polarParams->n+1)); //0=False, 1=True
-
- decoder_list_t dlist[2*listSize];
-
- for ( int i=0;i<2*listSize;i++) {
- // dlist[i].bit = nr_alloc_uint8_t_2D_array((polarParams->n+1), polarParams->N);
- // dlist[i].llr = nr_alloc_double_2D_array((polarParams->n+1), polarParams->N);
- //dlist[i].crcChecksum = malloc(sizeof(uint8_t)*polarParams->crcParityBits);
- for (int j=0; j< polarParams->n+1; j++) {
- memset((void*)&dlist[i].bit[j][0],0,sizeof(uint8_t)*polarParams->N);
- memset((void*)&dlist[i].llr[j][0],0,sizeof(double)*polarParams->N);
- }
- for (int j=0;jcrcParityBits;j++) dlist[i].crcChecksum[j] = 0;
- dlist[i].pathMetric = 0;
- }
-
-
- for (int i=0; iN; i++) {
- memset((void *)&llrUpdated[i][0],0,sizeof(uint8_t)*polarParams->n);
- memset((void *)&bitUpdated[i][0],0,sizeof(uint8_t)*polarParams->n);
- llrUpdated[i][polarParams->n]=1;
- bitUpdated[i][0]=((polarParams->information_bit_pattern[i]+1) % 2);
- }
-
-
- stop_meas(init);
- start_meas(polar_rate_matching);
-
- double d_tilde[polarParams->N];// = malloc(sizeof(double) * polarParams->N);
- nr_polar_rate_matching(input, d_tilde, polarParams->rate_matching_pattern, polarParams->K, polarParams->N, polarParams->encoderLength);
- memcpy((void*)&dlist[0].llr[polarParams->n][0],(void*)&d_tilde[0],sizeof(double)*polarParams->N);
- stop_meas(polar_rate_matching);
-
- /*
- * SCL polar decoder.
- */
- start_meas(decoding);
- uint32_t nonFrozenBit=0;
- uint8_t currentListSize=1;
-
- decoder_list_t *sorted_dlist[2*listSize];
- decoder_list_t *temp_dlist[2*listSize];
- int listIndex[2*listSize];
- double pathMetric[2*listSize];
-
- for (uint8_t i = 0; i < 2*listSize; i++) sorted_dlist[i] = &dlist[i];
-
- for (uint16_t currentBit=0; currentBitN; currentBit++){
- // printf("***************** BIT %d (currentListSize %d, information_bit_pattern %d)\n",
- // currentBit,currentListSize,polarParams->information_bit_pattern[currentBit]);
-
- start_meas(update_LLR);
- updateLLR(sorted_dlist, llrUpdated, bitUpdated, currentListSize, currentBit, 0, polarParams->N, (polarParams->n+1), pathMetricAppr);
- stop_meas(update_LLR);
-
- if (polarParams->information_bit_pattern[currentBit]==0) { //Frozen bit.
- updatePathMetric(sorted_dlist,currentListSize, 0, currentBit, pathMetricAppr); //approximation=0 --> 11b, approximation=1 --> 12
- } else { //Information or CRC bit.
- if ( (polarParams->interleaving_pattern[nonFrozenBit] < polarParams->payloadBits) && (aPrioriPayload[polarParams->interleaving_pattern[nonFrozenBit]] == 0) ) {
- //Information bit with known value of "0".
- updatePathMetric(sorted_dlist, currentListSize, 0, currentBit, pathMetricAppr);
- bitUpdated[currentBit][0]=1; //0=False, 1=True
- } else if ( (polarParams->interleaving_pattern[nonFrozenBit] < polarParams->payloadBits) && (aPrioriPayload[polarParams->interleaving_pattern[nonFrozenBit]] == 1) ) {
- //Information bit with known value of "1".
- printf("Information bit with known value of 1\n");
- updatePathMetric(sorted_dlist, currentListSize, 1, currentBit, pathMetricAppr);
- for (uint8_t i=0; ibit[0][currentBit]=1;
- bitUpdated[currentBit][0]=1;
- updateCrcChecksum(sorted_dlist, extended_crc_generator_matrix, currentListSize, nonFrozenBit, polarParams->crcParityBits);
- } else {
-
- start_meas(path_metric);
- updatePathMetric2(sorted_dlist, currentListSize, currentBit, pathMetricAppr);
- stop_meas(path_metric);
-
- start_meas(sorting);
+ uint8_t ***bit = nr_alloc_uint8_t_3D_array(polarParams->N, (polarParams->n+1), 2*listSize);
+ uint8_t **bitUpdated = nr_alloc_uint8_t_2D_array(polarParams->N, (polarParams->n+1)); //0=False, 1=True
+ uint8_t **llrUpdated = nr_alloc_uint8_t_2D_array(polarParams->N, (polarParams->n+1)); //0=False, 1=True
+ double ***llr = nr_alloc_double_3D_array(polarParams->N, (polarParams->n+1), 2*listSize);
+ uint8_t **crcChecksum = nr_alloc_uint8_t_2D_array(polarParams->crcParityBits, 2*listSize);
+ double *pathMetric = malloc(sizeof(double)*(2*listSize));
+ uint8_t *crcState = malloc(sizeof(uint8_t)*(2*listSize)); //0=False, 1=True
-
- if (currentListSize <= listSize/2) {
- // until listsize is full we need to copy bit and LLR arrays to new entries
- // below we only copy the ones we need to keep for sure
-
- for (int i = 0; i < currentListSize; i++) {
- for (int k = 0; k < (polarParams->n+1); k++) {
-
- memcpy((void*)&sorted_dlist[i+currentListSize]->bit[k][0],(void*)&sorted_dlist[i]->bit[k][0],sizeof(uint8_t)*polarParams->N);
- memcpy((void*)&sorted_dlist[i+currentListSize]->llr[k][0],(void*)&sorted_dlist[i]->llr[k][0],sizeof(double)*polarParams->N);
- }
- }
+ for (int i=0; i<(2*listSize); i++) {
+ pathMetric[i] = 0;
+ crcState[i]=1;
}
-
- for (int i = 0; i < currentListSize; i++) {
- sorted_dlist[i]->bit[0][currentBit]=0;
- sorted_dlist[i+currentListSize]->bit[0][currentBit]=1;
+ for (int i=0; iN; i++) {
+ llrUpdated[i][polarParams->n]=1;
+ bitUpdated[i][0]=((polarParams->information_bit_pattern[i]+1) % 2);
}
- bitUpdated[currentBit][0]=1;
- updateCrcChecksum2(sorted_dlist,extended_crc_generator_matrix, currentListSize, nonFrozenBit, polarParams->crcParityBits);
-
- currentListSize*=2;
-
- //Keep only the best "listSize" number of entries.
- if (currentListSize > listSize) {
- int listIndex2[listSize];
-
- for (int i = 0; i < currentListSize; i++) {
- listIndex[i]=i;
- pathMetric[i] = sorted_dlist[i]->pathMetric;
- }
- nr_sort_asc_double_1D_array_ind(pathMetric, listIndex, currentListSize);
- for (int i=0;in+1); k++) {
-
- memcpy((void*)&sorted_dlist[i+listSize]->bit[k][0],
- (void*)&sorted_dlist[i]->bit[k][0],
- sizeof(uint8_t)*polarParams->N);
- memcpy((void*)&sorted_dlist[i+listSize]->llr[k][0],
- (void*)&sorted_dlist[i]->llr[k][0],
- sizeof(double)*polarParams->N);
- }
- sorted_dlist[i]->bit[0][currentBit]=0;
- sorted_dlist[i+listSize]->bit[0][currentBit]=1;
- }
- else if (listIndex2[i+listSize]n+1); k++) {
- memcpy((void*)&sorted_dlist[i+listSize]->bit[k][0],
- (void*)&sorted_dlist[i]->bit[k][0],
- sizeof(uint8_t)*polarParams->N);
- memcpy((void*)&sorted_dlist[i+listSize]->llr[k][0],
- (void*)&sorted_dlist[i]->llr[k][0],
- sizeof(double)*polarParams->N);
- }
- sorted_dlist[i+listSize]->bit[0][currentBit]=1;
-
- /*
- decoder_list_t *tmp = sorted_dlist[i+listSize];
- sorted_dlist[i+listSize] = sorted_dlist[i];
- sorted_dlist[i+listSize]->pathMetric = tmp->pathMetric;
- sorted_dlist[i+listSize]->bit[0][currentBit]=1;
- memcpy((void*)&sorted_dlist[i+listSize]->crcChecksum[0],
- (void*)&tmp->crcChecksum[0],
- 24*sizeof(uint8_t));*/
-
- }
- }
-
- currentListSize = listSize;
-
- for (int i = 0; i < 2*listSize; i++) {
- temp_dlist[i] = sorted_dlist[i];
- }
- for (int i = 0; i < 2*listSize; i++) {
- // printf("i %d => %d\n",i,listIndex[i]);
- sorted_dlist[i] = temp_dlist[listIndex[i]];
- }
+ uint8_t **extended_crc_generator_matrix = malloc(polarParams->K * sizeof(uint8_t *)); //G_P3
+ uint8_t **tempECGM = malloc(polarParams->K * sizeof(uint8_t *)); //G_P2
+ for (int i = 0; i < polarParams->K; i++){
+ extended_crc_generator_matrix[i] = malloc(polarParams->crcParityBits * sizeof(uint8_t));
+ tempECGM[i] = malloc(polarParams->crcParityBits * sizeof(uint8_t));
}
- stop_meas(sorting);
-
- }
- nonFrozenBit++;
- }
-
- }
-
- for (uint8_t i = 0; i < fmin(listSize, (pow(2,polarParams->crcCorrectionBits)) ); i++) {
- // printf("list index %d :",i);
- // for (int j=0;jcrcParityBits;j++) printf("%d",sorted_dlist[i]->crcChecksum[j]);
- // printf(" => %d (%f)\n",sorted_dlist[i]->crcState,sorted_dlist[i]->pathMetric);
- int crcState = 1;
- for (int j=0;jcrcParityBits;j++) if (sorted_dlist[i]->crcChecksum[j]!=0) crcState=0;
- if (crcState == 1) {
- for (int j = 0; j < polarParams->N; j++) polarParams->nr_polar_u[j]=sorted_dlist[i]->bit[0][j];
-
- start_meas(bit_extraction);
- //Extract the information bits (û to ĉ)
- nr_polar_info_bit_extraction(polarParams->nr_polar_u, polarParams->nr_polar_cPrime, polarParams->information_bit_pattern, polarParams->N);
- stop_meas(bit_extraction);
- //Deinterleaving (ĉ to b)
- start_meas(deinterleaving);
- nr_polar_deinterleaver(polarParams->nr_polar_cPrime, polarParams->nr_polar_b, polarParams->interleaving_pattern, polarParams->K);
- stop_meas(deinterleaving);
- //Remove the CRC (â)
- for (int j = 0; j < polarParams->payloadBits; j++) output[j]=polarParams->nr_polar_b[j];
-
- break;
- }
- }
-
- // free(d_tilde);
- /*
- for (int i=0;i<2*listSize;i++) {
- // printf("correct: Freeing dlist[%d].bit %p\n",i,dlist[i].bit);
- nr_free_uint8_t_2D_array(dlist[i].bit, (polarParams->n+1));
- nr_free_double_2D_array(dlist[i].llr, (polarParams->n+1));
- free(dlist[i].crcChecksum);
- }*/
- nr_free_uint8_t_2D_array(extended_crc_generator_matrix, polarParams->K);
- nr_free_uint8_t_2D_array(tempECGM, polarParams->K);
- stop_meas(decoding);
- return(0);
+
+ for (int i=0; ipayloadBits; i++) {
+ for (int j=0; jcrcParityBits; j++) {
+ tempECGM[i][j]=polarParams->crc_generator_matrix[i][j];
+ }
+ }
+ for (int i=polarParams->payloadBits; iK; i++) {
+ for (int j=0; jcrcParityBits; j++) {
+ if( (i-polarParams->payloadBits) == j ){
+ tempECGM[i][j]=1;
+ } else {
+ tempECGM[i][j]=0;
+ }
+ }
+ }
+
+ for (int i=0; iK; i++) {
+ for (int j=0; jcrcParityBits; j++) {
+ extended_crc_generator_matrix[i][j]=tempECGM[polarParams->interleaving_pattern[i]][j];
+ }
+ }
+
+ //The index of the last 1-valued bit that appears in each column.
+ uint16_t last1ind[polarParams->crcParityBits];
+ for (int j=0; jcrcParityBits; j++) {
+ for (int i=0; iK; i++) {
+ if (extended_crc_generator_matrix[i][j]==1) last1ind[j]=i;
+ }
+ }
+
+ double *d_tilde = malloc(sizeof(double) * polarParams->N);
+ nr_polar_rate_matching(input, d_tilde, polarParams->rate_matching_pattern, polarParams->K, polarParams->N, polarParams->encoderLength);
+ for (int j = 0; j < polarParams->N; j++) llr[j][polarParams->n][0]=d_tilde[j];
+
+
+ /*
+ * SCL polar decoder.
+ */
+
+ uint32_t nonFrozenBit=0;
+ uint8_t currentListSize=1;
+ uint8_t decoderIterationCheck=0;
+ int16_t checkCrcBits=-1;
+ uint8_t listIndex[2*listSize], copyIndex;
+
+ for (uint16_t currentBit=0; currentBitN; currentBit++){
+ updateLLR(llr, llrUpdated, bit, bitUpdated, currentListSize, currentBit, 0, polarParams->N, (polarParams->n+1), pathMetricAppr);
+ if (polarParams->information_bit_pattern[currentBit]==0) { //Frozen bit.
+ updatePathMetric(pathMetric, llr, currentListSize, 0, currentBit, pathMetricAppr); //approximation=0 --> 11b, approximation=1 --> 12
+ } else { //Information or CRC bit.
+ updatePathMetric2(pathMetric, llr, currentListSize, currentBit, pathMetricAppr);
+
+ for (int i = 0; i < currentListSize; i++) {
+ for (int j = 0; j < polarParams->N; j++) {
+ for (int k = 0; k < (polarParams->n+1); k++) {
+ bit[j][k][i+currentListSize]=bit[j][k][i];
+ llr[j][k][i+currentListSize]=llr[j][k][i];}}}
+ for (int i = 0; i < currentListSize; i++) {
+ bit[currentBit][0][i]=0;
+ crcState[i+currentListSize]=crcState[i];
+ }
+ for (int i = currentListSize; i < 2*currentListSize; i++) bit[currentBit][0][i]=1;
+ bitUpdated[currentBit][0]=1;
+ updateCrcChecksum2(crcChecksum, extended_crc_generator_matrix, currentListSize, nonFrozenBit, polarParams->crcParityBits);
+ currentListSize*=2;
+
+ //Keep only the best "listSize" number of entries.
+ if (currentListSize > listSize) {
+ for (uint8_t i = 0; i < 2*listSize; i++) listIndex[i]=i;
+ nr_sort_asc_double_1D_array_ind(pathMetric, listIndex, currentListSize);
+
+ //sort listIndex[listSize, ..., 2*listSize-1] in descending order.
+ uint8_t swaps, tempInd;
+ for (uint8_t i = 0; i < listSize; i++) {
+ swaps = 0;
+ for (uint8_t j = listSize; j < (2*listSize - i) - 1; j++) {
+ if (listIndex[j+1] > listIndex[j]) {
+ tempInd = listIndex[j];
+ listIndex[j] = listIndex[j + 1];
+ listIndex[j + 1] = tempInd;
+ swaps++;
+ }
+ }
+ if (swaps == 0)
+ break;
+ }
+
+ //First, backup the best "listSize" number of entries.
+ for (int k=(listSize-1); k>0; k--) {
+ for (int i=0; iN; i++) {
+ for (int j=0; j<(polarParams->n+1); j++) {
+ bit[i][j][listIndex[(2*listSize-1)-k]]=bit[i][j][listIndex[k]];
+ llr[i][j][listIndex[(2*listSize-1)-k]]=llr[i][j][listIndex[k]];
+ }
+ }
+ }
+ for (int k=(listSize-1); k>0; k--) {
+ for (int i = 0; i < polarParams->crcParityBits; i++) {
+ crcChecksum[i][listIndex[(2*listSize-1)-k]] = crcChecksum[i][listIndex[k]];
+ }
+ }
+ for (int k=(listSize-1); k>0; k--) crcState[listIndex[(2*listSize-1)-k]]=crcState[listIndex[k]];
+
+ //Copy the best "listSize" number of entries to the first indices.
+ for (int k = 0; k < listSize; k++) {
+ if (k > listIndex[k]) {
+ copyIndex = listIndex[(2*listSize-1)-k];
+ } else { //Use the backup.
+ copyIndex = listIndex[k];
+ }
+ for (int i = 0; i < polarParams->N; i++) {
+ for (int j = 0; j < (polarParams->n + 1); j++) {
+ bit[i][j][k] = bit[i][j][copyIndex];
+ llr[i][j][k] = llr[i][j][copyIndex];
+ }
+ }
+ }
+ for (int k = 0; k < listSize; k++) {
+ if (k > listIndex[k]) {
+ copyIndex = listIndex[(2*listSize-1)-k];
+ } else { //Use the backup.
+ copyIndex = listIndex[k];
+ }
+ for (int i = 0; i < polarParams->crcParityBits; i++) {
+ crcChecksum[i][k]=crcChecksum[i][copyIndex];
+ }
+ }
+ for (int k = 0; k < listSize; k++) {
+ if (k > listIndex[k]) {
+ copyIndex = listIndex[(2*listSize-1)-k];
+ } else { //Use the backup.
+ copyIndex = listIndex[k];
+ }
+ crcState[k]=crcState[copyIndex];
+ }
+ currentListSize = listSize;
+ }
+
+
+ for (int i=0; icrcParityBits; i++) {
+ if (last1ind[i]==nonFrozenBit) {
+ checkCrcBits=i;
+ break;
+ }
+ }
+
+ if ( checkCrcBits > (-1) ) {
+ for (uint8_t i = 0; i < currentListSize; i++) {
+ if (crcChecksum[checkCrcBits][i]==1) {
+ crcState[i]=0; //0=False, 1=True
+ }
+ }
+ }
+
+ for (uint8_t i = 0; i < currentListSize; i++) decoderIterationCheck+=crcState[i];
+ if (decoderIterationCheck==0) {
+ //perror("[SCL polar decoder] All list entries have failed the CRC checks.");
+ free(d_tilde);
+ free(pathMetric);
+ free(crcState);
+ nr_free_uint8_t_3D_array(bit, polarParams->N, (polarParams->n+1));
+ nr_free_double_3D_array(llr, polarParams->N, (polarParams->n+1));
+ nr_free_uint8_t_2D_array(crcChecksum, polarParams->crcParityBits);
+ return(-1);
+ }
+
+ nonFrozenBit++;
+ decoderIterationCheck=0;
+ checkCrcBits=-1;
+ }
+ }
+
+ for (uint8_t i = 0; i < 2*listSize; i++) listIndex[i]=i;
+ nr_sort_asc_double_1D_array_ind(pathMetric, listIndex, currentListSize);
+
+ for (uint8_t i = 0; i < fmin(listSize, (pow(2,polarParams->crcCorrectionBits)) ); i++) {
+ if ( crcState[listIndex[i]] == 1 ) {
+ for (int j = 0; j < polarParams->N; j++) polarParams->nr_polar_U[j]=bit[j][0][listIndex[i]];
+
+ //Extract the information bits (û to ĉ)
+ nr_polar_info_bit_extraction(polarParams->nr_polar_U, polarParams->nr_polar_CPrime, polarParams->information_bit_pattern, polarParams->N);
+
+ //Deinterleaving (ĉ to b)
+ nr_polar_deinterleaver(polarParams->nr_polar_CPrime, polarParams->nr_polar_B, polarParams->interleaving_pattern, polarParams->K);
+
+ //Remove the CRC (â)
+ for (int j = 0; j < polarParams->payloadBits; j++) polarParams->nr_polar_A[j]=polarParams->nr_polar_B[j];
+
+ break;
+ }
+ }
+
+ free(d_tilde);
+ free(pathMetric);
+ free(crcState);
+ nr_free_uint8_t_3D_array(bit, polarParams->N, (polarParams->n+1));
+ nr_free_double_3D_array(llr, polarParams->N, (polarParams->n+1));
+ nr_free_uint8_t_2D_array(crcChecksum, polarParams->crcParityBits);
+ nr_free_uint8_t_2D_array(extended_crc_generator_matrix, polarParams->K);
+ nr_free_uint8_t_2D_array(tempECGM, polarParams->K);
+
+ /*
+ * Return bits.
+ */
+ //nr_byte2bit_uint8_32_t(polarParams->nr_polar_A, polarParams->payloadBits, out);
+ return(0);
+}
+
+int8_t polar_decoder_aPriori(double *input,
+ uint32_t *out,
+ t_nrPolar_paramsPtr polarParams,
+ uint8_t listSize,
+ uint8_t pathMetricAppr,
+ double *aPrioriPayload)
+{
+ uint8_t ***bit = nr_alloc_uint8_t_3D_array(polarParams->N, (polarParams->n+1), 2*listSize);
+ uint8_t **bitUpdated = nr_alloc_uint8_t_2D_array(polarParams->N, (polarParams->n+1)); //0=False, 1=True
+ uint8_t **llrUpdated = nr_alloc_uint8_t_2D_array(polarParams->N, (polarParams->n+1)); //0=False, 1=True
+ double ***llr = nr_alloc_double_3D_array(polarParams->N, (polarParams->n+1), 2*listSize);
+ uint8_t **crcChecksum = nr_alloc_uint8_t_2D_array(polarParams->crcParityBits, 2*listSize);
+ double *pathMetric = malloc(sizeof(double)*(2*listSize));
+ uint8_t *crcState = malloc(sizeof(uint8_t)*(2*listSize)); //0=False, 1=True
+
+ for (int i=0; i<(2*listSize); i++) {
+ pathMetric[i] = 0;
+ crcState[i]=1;
+ }
+ for (int i=0; iN; i++) {
+ llrUpdated[i][polarParams->n]=1;
+ bitUpdated[i][0]=((polarParams->information_bit_pattern[i]+1) % 2);
+ }
+
+ uint8_t **extended_crc_generator_matrix = malloc(polarParams->K * sizeof(uint8_t *)); //G_P3
+ uint8_t **tempECGM = malloc(polarParams->K * sizeof(uint8_t *)); //G_P2
+ for (int i = 0; i < polarParams->K; i++){
+ extended_crc_generator_matrix[i] = malloc(polarParams->crcParityBits * sizeof(uint8_t));
+ tempECGM[i] = malloc(polarParams->crcParityBits * sizeof(uint8_t));
+ }
+
+ for (int i=0; ipayloadBits; i++) {
+ for (int j=0; jcrcParityBits; j++) {
+ tempECGM[i][j]=polarParams->crc_generator_matrix[i][j];
+ }
+ }
+ for (int i=polarParams->payloadBits; iK; i++) {
+ for (int j=0; jcrcParityBits; j++) {
+ if( (i-polarParams->payloadBits) == j ){
+ tempECGM[i][j]=1;
+ } else {
+ tempECGM[i][j]=0;
+ }
+ }
+ }
+
+ for (int i=0; iK; i++) {
+ for (int j=0; jcrcParityBits; j++) {
+ extended_crc_generator_matrix[i][j]=tempECGM[polarParams->interleaving_pattern[i]][j];
+ }
+ }
+
+ //The index of the last 1-valued bit that appears in each column.
+ uint16_t last1ind[polarParams->crcParityBits];
+ for (int j=0; jcrcParityBits; j++) {
+ for (int i=0; iK; i++) {
+ if (extended_crc_generator_matrix[i][j]==1) last1ind[j]=i;
+ }
+ }
+
+ double *d_tilde = malloc(sizeof(double) * polarParams->N);
+ nr_polar_rate_matching(input, d_tilde, polarParams->rate_matching_pattern, polarParams->K, polarParams->N, polarParams->encoderLength);
+ for (int j = 0; j < polarParams->N; j++) llr[j][polarParams->n][0]=d_tilde[j];
+
+
+ /*
+ * SCL polar decoder.
+ */
+
+ uint32_t nonFrozenBit=0;
+ uint8_t currentListSize=1;
+ uint8_t decoderIterationCheck=0;
+ int16_t checkCrcBits=-1;
+ uint8_t listIndex[2*listSize], copyIndex;
+
+ for (uint16_t currentBit=0; currentBitN; currentBit++){
+
+ updateLLR(llr, llrUpdated, bit, bitUpdated, currentListSize, currentBit, 0, polarParams->N, (polarParams->n+1), pathMetricAppr);
+ if (polarParams->information_bit_pattern[currentBit]==0) { //Frozen bit.
+ updatePathMetric(pathMetric, llr, currentListSize, 0, currentBit, pathMetricAppr); //approximation=0 --> 11b, approximation=1 --> 12
+ } else { //Information or CRC bit.
+ if ( (polarParams->interleaving_pattern[nonFrozenBit] <= polarParams->payloadBits) &&
+ (aPrioriPayload[polarParams->interleaving_pattern[nonFrozenBit]] == 0) ) {
+ //Information bit with known value of "0".
+ updatePathMetric(pathMetric, llr, currentListSize, 0, currentBit, pathMetricAppr);
+ bitUpdated[currentBit][0]=1; //0=False, 1=True
+ } else if ( (polarParams->interleaving_pattern[nonFrozenBit] <= polarParams->payloadBits) &&
+ (aPrioriPayload[polarParams->interleaving_pattern[nonFrozenBit]] == 1) ) {
+ //Information bit with known value of "1".
+ updatePathMetric(pathMetric, llr, currentListSize, 1, currentBit, pathMetricAppr);
+ for (uint8_t i=0; icrcParityBits);
+ } else {
+ updatePathMetric2(pathMetric, llr, currentListSize, currentBit, pathMetricAppr);
+
+ for (int i = 0; i < currentListSize; i++) {
+ for (int j = 0; j < polarParams->N; j++) {
+ for (int k = 0; k < (polarParams->n+1); k++) {
+ bit[j][k][i+currentListSize]=bit[j][k][i];
+ llr[j][k][i+currentListSize]=llr[j][k][i];}}}
+ for (int i = 0; i < currentListSize; i++) {
+ bit[currentBit][0][i]=0;
+ crcState[i+currentListSize]=crcState[i];
+ }
+ for (int i = currentListSize; i < 2*currentListSize; i++) bit[currentBit][0][i]=1;
+ bitUpdated[currentBit][0]=1;
+ updateCrcChecksum2(crcChecksum, extended_crc_generator_matrix, currentListSize, nonFrozenBit, polarParams->crcParityBits);
+ currentListSize*=2;
+
+ //Keep only the best "listSize" number of entries.
+ if (currentListSize > listSize) {
+ for (uint8_t i = 0; i < 2*listSize; i++) listIndex[i]=i;
+ nr_sort_asc_double_1D_array_ind(pathMetric, listIndex, currentListSize);
+
+ //sort listIndex[listSize, ..., 2*listSize-1] in descending order.
+ uint8_t swaps, tempInd;
+ for (uint8_t i = 0; i < listSize; i++) {
+ swaps = 0;
+ for (uint8_t j = listSize; j < (2*listSize - i) - 1; j++) {
+ if (listIndex[j+1] > listIndex[j]) {
+ tempInd = listIndex[j];
+ listIndex[j] = listIndex[j + 1];
+ listIndex[j + 1] = tempInd;
+ swaps++;
+ }
+ }
+ if (swaps == 0)
+ break;
+ }
+
+ //First, backup the best "listSize" number of entries.
+ for (int k=(listSize-1); k>0; k--) {
+ for (int i=0; iN; i++) {
+ for (int j=0; j<(polarParams->n+1); j++) {
+ bit[i][j][listIndex[(2*listSize-1)-k]]=bit[i][j][listIndex[k]];
+ llr[i][j][listIndex[(2*listSize-1)-k]]=llr[i][j][listIndex[k]];
+ }
+ }
+ }
+ for (int k=(listSize-1); k>0; k--) {
+ for (int i = 0; i < polarParams->crcParityBits; i++) {
+ crcChecksum[i][listIndex[(2*listSize-1)-k]] = crcChecksum[i][listIndex[k]];
+ }
+ }
+ for (int k=(listSize-1); k>0; k--) crcState[listIndex[(2*listSize-1)-k]]=crcState[listIndex[k]];
+
+ //Copy the best "listSize" number of entries to the first indices.
+ for (int k = 0; k < listSize; k++) {
+ if (k > listIndex[k]) {
+ copyIndex = listIndex[(2*listSize-1)-k];
+ } else { //Use the backup.
+ copyIndex = listIndex[k];
+ }
+ for (int i = 0; i < polarParams->N; i++) {
+ for (int j = 0; j < (polarParams->n + 1); j++) {
+ bit[i][j][k] = bit[i][j][copyIndex];
+ llr[i][j][k] = llr[i][j][copyIndex];
+ }
+ }
+ }
+ for (int k = 0; k < listSize; k++) {
+ if (k > listIndex[k]) {
+ copyIndex = listIndex[(2*listSize-1)-k];
+ } else { //Use the backup.
+ copyIndex = listIndex[k];
+ }
+ for (int i = 0; i < polarParams->crcParityBits; i++) {
+ crcChecksum[i][k]=crcChecksum[i][copyIndex];
+ }
+ }
+ for (int k = 0; k < listSize; k++) {
+ if (k > listIndex[k]) {
+ copyIndex = listIndex[(2*listSize-1)-k];
+ } else { //Use the backup.
+ copyIndex = listIndex[k];
+ }
+ crcState[k]=crcState[copyIndex];
+ }
+ currentListSize = listSize;
+ }
+ }
+
+ for (int i=0; icrcParityBits; i++) {
+ if (last1ind[i]==nonFrozenBit) {
+ checkCrcBits=i;
+ break;
+ }
+ }
+
+ if ( checkCrcBits > (-1) ) {
+ for (uint8_t i = 0; i < currentListSize; i++) {
+ if (crcChecksum[checkCrcBits][i]==1) {
+ crcState[i]=0; //0=False, 1=True
+ }
+ }
+ }
+
+ for (uint8_t i = 0; i < currentListSize; i++) decoderIterationCheck+=crcState[i];
+ if (decoderIterationCheck==0) {
+ //perror("[SCL polar decoder] All list entries have failed the CRC checks.");
+ free(d_tilde);
+ free(pathMetric);
+ free(crcState);
+ nr_free_uint8_t_3D_array(bit, polarParams->N, (polarParams->n+1));
+ nr_free_double_3D_array(llr, polarParams->N, (polarParams->n+1));
+ nr_free_uint8_t_2D_array(crcChecksum, polarParams->crcParityBits);
+ return(-1);
+ }
+
+ nonFrozenBit++;
+ decoderIterationCheck=0;
+ checkCrcBits=-1;
+ }
+ }
+
+ for (uint8_t i = 0; i < 2*listSize; i++) listIndex[i]=i;
+ nr_sort_asc_double_1D_array_ind(pathMetric, listIndex, currentListSize);
+
+ for (uint8_t i = 0; i < fmin(listSize, (pow(2,polarParams->crcCorrectionBits)) ); i++) {
+ if ( crcState[listIndex[i]] == 1 ) {
+ for (int j = 0; j < polarParams->N; j++) polarParams->nr_polar_U[j]=bit[j][0][listIndex[i]];
+
+ //Extract the information bits (û to ĉ)
+ nr_polar_info_bit_extraction(polarParams->nr_polar_U, polarParams->nr_polar_CPrime, polarParams->information_bit_pattern, polarParams->N);
+
+ //Deinterleaving (ĉ to b)
+ nr_polar_deinterleaver(polarParams->nr_polar_CPrime, polarParams->nr_polar_B, polarParams->interleaving_pattern, polarParams->K);
+
+ //Remove the CRC (â)
+ for (int j = 0; j < polarParams->payloadBits; j++) polarParams->nr_polar_A[j]=polarParams->nr_polar_B[j];
+
+ break;
+ }
+ }
+
+ free(d_tilde);
+ free(pathMetric);
+ free(crcState);
+ nr_free_uint8_t_3D_array(bit, polarParams->N, (polarParams->n+1));
+ nr_free_double_3D_array(llr, polarParams->N, (polarParams->n+1));
+ nr_free_uint8_t_2D_array(crcChecksum, polarParams->crcParityBits);
+ nr_free_uint8_t_2D_array(extended_crc_generator_matrix, polarParams->K);
+ nr_free_uint8_t_2D_array(tempECGM, polarParams->K);
+
+ /*
+ * Return bits.
+ */
+ nr_byte2bit_uint8_32_t(polarParams->nr_polar_A, polarParams->payloadBits, out);
+ return(0);
+
}
-
-int8_t polar_decoder_int8(int16_t *input,
- uint8_t *output,
- t_nrPolar_params *polarParams,
- uint8_t listSize,
- time_stats_t *init,
- time_stats_t *polar_rate_matching,
- time_stats_t *decoding,
- time_stats_t *bit_extraction,
- time_stats_t *deinterleaving,
- time_stats_t *sorting,
- time_stats_t *path_metric,
- time_stats_t *update_LLR,
- int generate_optim_code)
+int8_t polar_decoder_aPriori_timing(double *input,
+ uint32_t *out,
+ t_nrPolar_paramsPtr polarParams,
+ uint8_t listSize,
+ uint8_t pathMetricAppr,
+ double *aPrioriPayload,
+ double cpuFreqGHz,
+ FILE* logFile)
{
+ uint8_t ***bit = nr_alloc_uint8_t_3D_array(polarParams->N, (polarParams->n+1), 2*listSize);
+ uint8_t **bitUpdated = nr_alloc_uint8_t_2D_array(polarParams->N, (polarParams->n+1)); //0=False, 1=True
+ uint8_t **llrUpdated = nr_alloc_uint8_t_2D_array(polarParams->N, (polarParams->n+1)); //0=False, 1=True
+ double ***llr = nr_alloc_double_3D_array(polarParams->N, (polarParams->n+1), 2*listSize);
+ uint8_t **crcChecksum = nr_alloc_uint8_t_2D_array(polarParams->crcParityBits, 2*listSize);
+ double *pathMetric = malloc(sizeof(double)*(2*listSize));
+ uint8_t *crcState = malloc(sizeof(uint8_t)*(2*listSize)); //0=False, 1=True
- uint8_t **bitUpdated;
- uint8_t **llrUpdated;
-
- if (generate_optim_code == 1 || polarParams->decoder_kernel==NULL) {
- bitUpdated = nr_alloc_uint8_t_2D_array(polarParams->N, (polarParams->n+1)); //0=False, 1=True
- llrUpdated = nr_alloc_uint8_t_2D_array(polarParams->N, (polarParams->n+1)); //0=False, 1=True
- }
- decoder_list_int8_t dlist[2*listSize];
-
-
- start_meas(init);
-
- for ( int i=0;i<2*listSize;i++) {
- // dlist[i].bit = nr_alloc_uint8_t_2D_array((polarParams->n+1), polarParams->N);
- // dlist[i].llr = nr_alloc_double_2D_array((polarParams->n+1), polarParams->N);
- //dlist[i].crcChecksum = malloc(sizeof(uint8_t)*polarParams->crcParityBits);
- for (int j=0; j< polarParams->n+1; j++) {
- memset((void*)&dlist[i].bit[j][0],0,sizeof(uint8_t)*polarParams->N);
- memset((void*)&dlist[i].llr[j][0],0,sizeof(int16_t)*polarParams->N);
- }
- for (int j=0;jcrcParityBits;j++) dlist[i].crcChecksum[j] = 0;
- dlist[i].pathMetric = 0;
- }
-
- stop_meas(init);
-
- if (generate_optim_code == 1 || polarParams->decoder_kernel==NULL) {
- for (int i=0; iN; i++) {
- memset((void *)&llrUpdated[i][0],0,sizeof(uint8_t)*polarParams->n);
- memset((void *)&bitUpdated[i][0],0,sizeof(uint8_t)*polarParams->n);
- llrUpdated[i][polarParams->n]=1;
- bitUpdated[i][0]=((polarParams->information_bit_pattern[i]+1) % 2);
- }
- }
-
-
-
- start_meas(polar_rate_matching);
-
- int16_t d_tilde[polarParams->N];// = malloc(sizeof(double) * polarParams->N);
- nr_polar_rate_matching_int8(input, d_tilde, polarParams->rate_matching_pattern, polarParams->K, polarParams->N, polarParams->encoderLength);
- for (int i=0;iN;i++) {
- if (d_tilde[i]<-128) d_tilde[i]=-128;
- else if (d_tilde[i]>127) d_tilde[i]=128;
- }
- memcpy((void*)&dlist[0].llr[polarParams->n][0],(void*)&d_tilde[0],sizeof(int16_t)*polarParams->N);
- stop_meas(polar_rate_matching);
-
- /*
- * SCL polar decoder.
- */
- start_meas(decoding);
- uint32_t nonFrozenBit=0;
- uint8_t currentListSize=1;
-
- decoder_list_int8_t *sorted_dlist[2*listSize];
-
- for (uint8_t i = 0; i < 2*listSize; i++) sorted_dlist[i] = &dlist[i];
- char fname[100];
- FILE *fd;
- if (generate_optim_code==1) {
- sprintf(fname,"decoder_K%d_N%d_E%d.c",polarParams->K,polarParams->N,polarParams->encoderLength);
- if ((fd=fopen(fname,"w"))==NULL) {printf("Cannot open %s\n",fname); exit(-1);}
- fprintf(fd,"#include \"nr_polar_defs.h\"\n");
- fprintf(fd,"void polar_decoder_K%d_N%d_E%d(t_nrPolar_params *polarParams,decoder_list_int8_t **sorted_dlist) {\n",
- polarParams->K,polarParams->N,polarParams->encoderLength);
- fprintf(fd,"int16_t mask,absllr;\n");
- }
-
- if (polarParams->decoder_kernel) polarParams->decoder_kernel(polarParams,sorted_dlist);
- else {
- for (uint16_t currentBit=0; currentBitN; currentBit++){
- printf("***************** BIT %d (currentListSize %d, information_bit_pattern %d)\n",
- currentBit,currentListSize,polarParams->information_bit_pattern[currentBit]);
-
- start_meas(update_LLR);
- updateLLR_int8(sorted_dlist, llrUpdated, bitUpdated, currentListSize, currentBit, 0, polarParams->N, (polarParams->n+1),generate_optim_code,fd);
- stop_meas(update_LLR);
-
- if (polarParams->information_bit_pattern[currentBit]==0) { //Frozen bit.
- updatePathMetric0_int8(sorted_dlist,currentListSize, currentBit,generate_optim_code,fd); //approximation=0 --> 11b, approximation=1 --> 12
- } else { //Information or CRC bit.
- start_meas(path_metric);
- updatePathMetric2_int8(sorted_dlist, currentListSize, currentBit,generate_optim_code,fd);
- stop_meas(path_metric);
-
- start_meas(sorting);
-
- if (currentListSize <= listSize/2) {
- // until listsize is full we need to copy bit and LLR arrays to new entries
- // below we only copy the ones we need to keep for sure
- decoder_int8_A(sorted_dlist,currentListSize,polarParams);
- if (generate_optim_code == 1) fprintf(fd,"decoder_int8_A(sorted_dlist,%d,polarParams);\n",currentListSize);
- }
- decoder_int8_B(sorted_dlist,currentBit,currentListSize);
- if (generate_optim_code == 1) fprintf(fd,"decoder_int8_B(sorted_dlist,%d,%d);\n",currentBit,currentListSize);
-
-
- bitUpdated[currentBit][0]=1;
-
- updateCrcChecksum2_int8(sorted_dlist,polarParams->extended_crc_generator_matrix, currentListSize, nonFrozenBit, polarParams->crcParityBits,generate_optim_code,fd);
-
- currentListSize*=2;
-
- //Keep only the best "listSize" number of entries.
- if (currentListSize > listSize) {
-
- decoder_int8_C(sorted_dlist,
- polarParams,
- currentBit,
- currentListSize,
- listSize);
-
- if (generate_optim_code == 1) fprintf(fd,"decoder_int8_C(sorted_dlist,polarParams,%d,%d,%d);\n",currentBit,currentListSize,listSize);
-
- currentListSize = listSize;
+ for (int i=0; i<(2*listSize); i++) {
+ pathMetric[i] = 0;
+ crcState[i]=1;
+ }
+ for (int i=0; iN; i++) {
+ llrUpdated[i][polarParams->n]=1;
+ bitUpdated[i][0]=((polarParams->information_bit_pattern[i]+1) % 2);
}
-
- stop_meas(sorting);
-
- nonFrozenBit++;
- }
-
- }
-
- }
- if (generate_optim_code==1) fprintf(fd,"}\n");
+ uint8_t **extended_crc_generator_matrix = malloc(polarParams->K * sizeof(uint8_t *)); //G_P3
+ uint8_t **tempECGM = malloc(polarParams->K * sizeof(uint8_t *)); //G_P2
+ for (int i = 0; i < polarParams->K; i++){
+ extended_crc_generator_matrix[i] = malloc(polarParams->crcParityBits * sizeof(uint8_t));
+ tempECGM[i] = malloc(polarParams->crcParityBits * sizeof(uint8_t));
+ }
- for (uint8_t i = 0; i < fmin(listSize, (pow(2,polarParams->crcCorrectionBits)) ); i++) {
- // printf("list index %d / %d :",i,listSize);
- // for (int j=0;jcrcParityBits;j++) printf("%d",sorted_dlist[i]->crcChecksum[j]);
- // printf(" => (%d)\n",sorted_dlist[i]->pathMetric);
- int crcState = 1;
- for (int j=0;jcrcParityBits;j++) if (sorted_dlist[i]->crcChecksum[j]!=0) crcState=0;
- if (crcState == 1) {
- for (int j = 0; j < polarParams->N; j++) polarParams->nr_polar_u[j]=sorted_dlist[i]->bit[0][j];
-
- start_meas(bit_extraction);
- //Extract the information bits (û to ĉ)
- nr_polar_info_bit_extraction(polarParams->nr_polar_u, polarParams->nr_polar_cPrime, polarParams->information_bit_pattern, polarParams->N);
- stop_meas(bit_extraction);
- //Deinterleaving (ĉ to b)
- start_meas(deinterleaving);
- nr_polar_deinterleaver(polarParams->nr_polar_cPrime, polarParams->nr_polar_b, polarParams->interleaving_pattern, polarParams->K);
- stop_meas(deinterleaving);
- //Remove the CRC (â)
- for (int j = 0; j < polarParams->payloadBits; j++) output[j]=polarParams->nr_polar_b[j];
-
- break;
- }
- }
-
- // free(d_tilde);
- /*
- for (int i=0;i<2*listSize;i++) {
- // printf("correct: Freeing dlist[%d].bit %p\n",i,dlist[i].bit);
- nr_free_uint8_t_2D_array(dlist[i].bit, (polarParams->n+1));
- nr_free_double_2D_array(dlist[i].llr, (polarParams->n+1));
- free(dlist[i].crcChecksum);
- }*/
- stop_meas(decoding);
- return(0);
+ for (int i=0; ipayloadBits; i++) {
+ for (int j=0; jcrcParityBits; j++) {
+ tempECGM[i][j]=polarParams->crc_generator_matrix[i][j];
+ }
+ }
+ for (int i=polarParams->payloadBits; iK; i++) {
+ for (int j=0; jcrcParityBits; j++) {
+ if( (i-polarParams->payloadBits) == j ){
+ tempECGM[i][j]=1;
+ } else {
+ tempECGM[i][j]=0;
+ }
+ }
+ }
+
+ for (int i=0; iK; i++) {
+ for (int j=0; jcrcParityBits; j++) {
+ extended_crc_generator_matrix[i][j]=tempECGM[polarParams->interleaving_pattern[i]][j];
+ }
+ }
+
+ //The index of the last 1-valued bit that appears in each column.
+ uint16_t last1ind[polarParams->crcParityBits];
+ for (int j=0; jcrcParityBits; j++) {
+ for (int i=0; iK; i++) {
+ if (extended_crc_generator_matrix[i][j]==1) last1ind[j]=i;
+ }
+ }
+
+ double *d_tilde = malloc(sizeof(double) * polarParams->N);
+ nr_polar_rate_matching(input, d_tilde, polarParams->rate_matching_pattern, polarParams->K, polarParams->N, polarParams->encoderLength);
+ for (int j = 0; j < polarParams->N; j++) llr[j][polarParams->n][0]=d_tilde[j];
+
+
+ /*
+ * SCL polar decoder.
+ */
+
+ uint32_t nonFrozenBit=0;
+ uint8_t currentListSize=1;
+ uint8_t decoderIterationCheck=0;
+ int16_t checkCrcBits=-1;
+ uint8_t listIndex[2*listSize], copyIndex;
+
+ for (uint16_t currentBit=0; currentBitN; currentBit++){
+ updateLLR(llr, llrUpdated, bit, bitUpdated, currentListSize, currentBit, 0, polarParams->N, (polarParams->n+1), pathMetricAppr);
+ if (polarParams->information_bit_pattern[currentBit]==0) { //Frozen bit.
+ updatePathMetric(pathMetric, llr, currentListSize, 0, currentBit, pathMetricAppr); //approximation=0 --> 11b, approximation=1 --> 12
+ } else { //Information or CRC bit.
+ if ( (polarParams->interleaving_pattern[nonFrozenBit] <= polarParams->payloadBits) &&
+ (aPrioriPayload[polarParams->interleaving_pattern[nonFrozenBit]] == 0) ) {
+ //Information bit with known value of "0".
+ updatePathMetric(pathMetric, llr, currentListSize, 0, currentBit, pathMetricAppr);
+ bitUpdated[currentBit][0]=1; //0=False, 1=True
+ } else if ( (polarParams->interleaving_pattern[nonFrozenBit] <= polarParams->payloadBits) &&
+ (aPrioriPayload[polarParams->interleaving_pattern[nonFrozenBit]] == 1) ) {
+ //Information bit with known value of "1".
+ updatePathMetric(pathMetric, llr, currentListSize, 1, currentBit, pathMetricAppr);
+ for (uint8_t i=0; icrcParityBits);
+ } else {
+ updatePathMetric2(pathMetric, llr, currentListSize, currentBit, pathMetricAppr);
+
+ for (int i = 0; i < currentListSize; i++) {
+ for (int j = 0; j < polarParams->N; j++) {
+ for (int k = 0; k < (polarParams->n+1); k++) {
+ bit[j][k][i+currentListSize]=bit[j][k][i];
+ llr[j][k][i+currentListSize]=llr[j][k][i];}}}
+ for (int i = 0; i < currentListSize; i++) {
+ bit[currentBit][0][i]=0;
+ crcState[i+currentListSize]=crcState[i];
+ }
+ for (int i = currentListSize; i < 2*currentListSize; i++) bit[currentBit][0][i]=1;
+ bitUpdated[currentBit][0]=1;
+ updateCrcChecksum2(crcChecksum, extended_crc_generator_matrix, currentListSize, nonFrozenBit, polarParams->crcParityBits);
+ currentListSize*=2;
+
+ //Keep only the best "listSize" number of entries.
+ if (currentListSize > listSize) {
+ for (uint8_t i = 0; i < 2*listSize; i++) listIndex[i]=i;
+ nr_sort_asc_double_1D_array_ind(pathMetric, listIndex, currentListSize);
+
+ //sort listIndex[listSize, ..., 2*listSize-1] in descending order.
+ uint8_t swaps, tempInd;
+ for (uint8_t i = 0; i < listSize; i++) {
+ swaps = 0;
+ for (uint8_t j = listSize; j < (2*listSize - i) - 1; j++) {
+ if (listIndex[j+1] > listIndex[j]) {
+ tempInd = listIndex[j];
+ listIndex[j] = listIndex[j + 1];
+ listIndex[j + 1] = tempInd;
+ swaps++;
+ }
+ }
+ if (swaps == 0)
+ break;
+ }
+
+ //First, backup the best "listSize" number of entries.
+ for (int k=(listSize-1); k>0; k--) {
+ for (int i=0; iN; i++) {
+ for (int j=0; j<(polarParams->n+1); j++) {
+ bit[i][j][listIndex[(2*listSize-1)-k]]=bit[i][j][listIndex[k]];
+ llr[i][j][listIndex[(2*listSize-1)-k]]=llr[i][j][listIndex[k]];
+ }
+ }
+ }
+ for (int k=(listSize-1); k>0; k--) {
+ for (int i = 0; i < polarParams->crcParityBits; i++) {
+ crcChecksum[i][listIndex[(2*listSize-1)-k]] = crcChecksum[i][listIndex[k]];
+ }
+ }
+ for (int k=(listSize-1); k>0; k--) crcState[listIndex[(2*listSize-1)-k]]=crcState[listIndex[k]];
+
+ //Copy the best "listSize" number of entries to the first indices.
+ for (int k = 0; k < listSize; k++) {
+ if (k > listIndex[k]) {
+ copyIndex = listIndex[(2*listSize-1)-k];
+ } else { //Use the backup.
+ copyIndex = listIndex[k];
+ }
+ for (int i = 0; i < polarParams->N; i++) {
+ for (int j = 0; j < (polarParams->n + 1); j++) {
+ bit[i][j][k] = bit[i][j][copyIndex];
+ llr[i][j][k] = llr[i][j][copyIndex];
+ }
+ }
+ }
+ for (int k = 0; k < listSize; k++) {
+ if (k > listIndex[k]) {
+ copyIndex = listIndex[(2*listSize-1)-k];
+ } else { //Use the backup.
+ copyIndex = listIndex[k];
+ }
+ for (int i = 0; i < polarParams->crcParityBits; i++) {
+ crcChecksum[i][k]=crcChecksum[i][copyIndex];
+ }
+ }
+ for (int k = 0; k < listSize; k++) {
+ if (k > listIndex[k]) {
+ copyIndex = listIndex[(2*listSize-1)-k];
+ } else { //Use the backup.
+ copyIndex = listIndex[k];
+ }
+ crcState[k]=crcState[copyIndex];
+ }
+ currentListSize = listSize;
+ }
+ }
+
+ for (int i=0; icrcParityBits; i++) {
+ if (last1ind[i]==nonFrozenBit) {
+ checkCrcBits=i;
+ break;
+ }
+ }
+
+ if ( checkCrcBits > (-1) ) {
+ for (uint8_t i = 0; i < currentListSize; i++) {
+ if (crcChecksum[checkCrcBits][i]==1) {
+ crcState[i]=0; //0=False, 1=True
+ }
+ }
+ }
+
+ for (uint8_t i = 0; i < currentListSize; i++) decoderIterationCheck+=crcState[i];
+ if (decoderIterationCheck==0) {
+ //perror("[SCL polar decoder] All list entries have failed the CRC checks.");
+ free(d_tilde);
+ free(pathMetric);
+ free(crcState);
+ nr_free_uint8_t_3D_array(bit, polarParams->N, (polarParams->n+1));
+ nr_free_double_3D_array(llr, polarParams->N, (polarParams->n+1));
+ nr_free_uint8_t_2D_array(crcChecksum, polarParams->crcParityBits);
+ return(-1);
+ }
+
+ nonFrozenBit++;
+ decoderIterationCheck=0;
+ checkCrcBits=-1;
+ }
+ }
+
+ for (uint8_t i = 0; i < 2*listSize; i++) listIndex[i]=i;
+ nr_sort_asc_double_1D_array_ind(pathMetric, listIndex, currentListSize);
+
+ for (uint8_t i = 0; i < fmin(listSize, (pow(2,polarParams->crcCorrectionBits)) ); i++) {
+ if ( crcState[listIndex[i]] == 1 ) {
+ for (int j = 0; j < polarParams->N; j++) polarParams->nr_polar_U[j]=bit[j][0][listIndex[i]];
+
+ //Extract the information bits (û to ĉ)
+ nr_polar_info_bit_extraction(polarParams->nr_polar_U, polarParams->nr_polar_CPrime, polarParams->information_bit_pattern, polarParams->N);
+
+ //Deinterleaving (ĉ to b)
+ nr_polar_deinterleaver(polarParams->nr_polar_CPrime, polarParams->nr_polar_B, polarParams->interleaving_pattern, polarParams->K);
+
+ //Remove the CRC (â)
+ for (int j = 0; j < polarParams->payloadBits; j++) polarParams->nr_polar_A[j]=polarParams->nr_polar_B[j];
+
+ break;
+ }
+ }
+
+ free(d_tilde);
+ free(pathMetric);
+ free(crcState);
+ nr_free_uint8_t_3D_array(bit, polarParams->N, (polarParams->n+1));
+ nr_free_double_3D_array(llr, polarParams->N, (polarParams->n+1));
+ nr_free_uint8_t_2D_array(crcChecksum, polarParams->crcParityBits);
+ nr_free_uint8_t_2D_array(extended_crc_generator_matrix, polarParams->K);
+ nr_free_uint8_t_2D_array(tempECGM, polarParams->K);
+
+ /*
+ * Return bits.
+ */
+ nr_byte2bit_uint8_32_t(polarParams->nr_polar_A, polarParams->payloadBits, out);
+ return(0);
}
-int8_t polar_decoder_int8_new(int16_t *input,
- uint8_t *output,
- t_nrPolar_params *polarParams,
- uint8_t listSize,
- time_stats_t *init,
- time_stats_t *polar_rate_matching,
- time_stats_t *decoding,
- time_stats_t *bit_extraction,
- time_stats_t *deinterleaving,
- time_stats_t *sorting,
- time_stats_t *path_metric,
- time_stats_t *update_LLR,
- int generate_optim_code)
+int8_t polar_decoder_dci(double *input,
+ uint32_t *out,
+ t_nrPolar_paramsPtr polarParams,
+ uint8_t listSize,
+ uint8_t pathMetricAppr,
+ uint16_t n_RNTI)
+{
+
+ uint8_t ***bit = nr_alloc_uint8_t_3D_array(polarParams->N, (polarParams->n+1), 2*listSize);
+ uint8_t **bitUpdated = nr_alloc_uint8_t_2D_array(polarParams->N, (polarParams->n+1)); //0=False, 1=True
+ uint8_t **llrUpdated = nr_alloc_uint8_t_2D_array(polarParams->N, (polarParams->n+1)); //0=False, 1=True
+ double ***llr = nr_alloc_double_3D_array(polarParams->N, (polarParams->n+1), 2*listSize);
+ uint8_t **crcChecksum = nr_alloc_uint8_t_2D_array(polarParams->crcParityBits, 2*listSize);
+ double *pathMetric = malloc(sizeof(double)*(2*listSize));
+ uint8_t *crcState = malloc(sizeof(uint8_t)*(2*listSize)); //0=False, 1=True
+ uint8_t extended_crc_scrambling_pattern[polarParams->crcParityBits];
+
+ for (int i=0; i<(2*listSize); i++) {
+ pathMetric[i] = 0;
+ crcState[i]=1;
+ }
+ for (int i=0; iN; i++) {
+ llrUpdated[i][polarParams->n]=1;
+ bitUpdated[i][0]=((polarParams->information_bit_pattern[i]+1) % 2);
+ }
+
+ uint8_t **extended_crc_generator_matrix = malloc(polarParams->K * sizeof(uint8_t *)); //G_P3: K-by-P
+ uint8_t **tempECGM = malloc(polarParams->K * sizeof(uint8_t *)); //G_P2: K-by-P
+ for (int i = 0; i < polarParams->K; i++){
+ extended_crc_generator_matrix[i] = malloc(polarParams->crcParityBits * sizeof(uint8_t));
+ tempECGM[i] = malloc(polarParams->crcParityBits * sizeof(uint8_t));
+ }
+
+ for (int i=0; ipayloadBits; i++) {
+ for (int j=0; jcrcParityBits; j++) {
+ tempECGM[i][j]=polarParams->crc_generator_matrix[i+polarParams->crcParityBits][j];
+ }
+ }
+ for (int i=polarParams->payloadBits; iK; i++) {
+ for (int j=0; jcrcParityBits; j++) {
+ if( (i-polarParams->payloadBits) == j ){
+ tempECGM[i][j]=1;
+ } else {
+ tempECGM[i][j]=0;
+ }
+ }
+ }
+
+ for (int i=0; iK; i++) {
+ for (int j=0; jcrcParityBits; j++) {
+ extended_crc_generator_matrix[i][j]=tempECGM[polarParams->interleaving_pattern[i]][j];
+ }
+ }
+
+ //The index of the last 1-valued bit that appears in each column.
+ uint16_t last1ind[polarParams->crcParityBits];
+ for (int j=0; jcrcParityBits; j++) {
+ for (int i=0; iK; i++) {
+ if (extended_crc_generator_matrix[i][j]==1) last1ind[j]=i;
+ }
+ }
+
+ for (int i=0;i<8;i++) extended_crc_scrambling_pattern[i]=0;
+ for (int i=8; icrcParityBits; i++) {
+ extended_crc_scrambling_pattern[i]=(n_RNTI>>(23-i))&1;
+ }
+
+ double *d_tilde = malloc(sizeof(double) * polarParams->N);
+ nr_polar_rate_matching(input, d_tilde, polarParams->rate_matching_pattern, polarParams->K, polarParams->N, polarParams->encoderLength);
+ for (int j = 0; j < polarParams->N; j++) llr[j][polarParams->n][0]=d_tilde[j];
+
+ /*
+ * SCL polar decoder.
+ */
+
+ for (int i=0; icrcParityBits; i++) {
+ for (int j=0; jcrcParityBits; j++) crcChecksum[i][0]=crcChecksum[i][0]+polarParams->crc_generator_matrix[j][i];
+ crcChecksum[i][0]=(crcChecksum[i][0]%2);
+ }
+
+ uint32_t nonFrozenBit=0;
+ uint8_t currentListSize=1;
+ uint8_t decoderIterationCheck=0;
+ int16_t checkCrcBits=-1;
+ uint8_t listIndex[2*listSize], copyIndex;
+
+ for (uint16_t currentBit=0; currentBitN; currentBit++){
+ updateLLR(llr, llrUpdated, bit, bitUpdated, currentListSize, currentBit, 0, polarParams->N, (polarParams->n+1), pathMetricAppr);
+ if (polarParams->information_bit_pattern[currentBit]==0) { //Frozen bit.
+ updatePathMetric(pathMetric, llr, currentListSize, 0, currentBit, pathMetricAppr); //approximation=0 --> 11b, approximation=1 --> 12
+ } else { //Information or CRC bit.
+ updatePathMetric2(pathMetric, llr, currentListSize, currentBit, pathMetricAppr);
+
+ for (int i = 0; i < currentListSize; i++) {
+ for (int j = 0; j < polarParams->N; j++) {
+ for (int k = 0; k < (polarParams->n+1); k++) {
+ bit[j][k][i+currentListSize]=bit[j][k][i];
+ llr[j][k][i+currentListSize]=llr[j][k][i];}}}
+ for (int i = 0; i < currentListSize; i++) {
+ bit[currentBit][0][i]=0;
+ crcState[i+currentListSize]=crcState[i];
+ }
+ for (int i = currentListSize; i < 2*currentListSize; i++) bit[currentBit][0][i]=1;
+ bitUpdated[currentBit][0]=1;
+ updateCrcChecksum2(crcChecksum, extended_crc_generator_matrix, currentListSize, nonFrozenBit, polarParams->crcParityBits);
+ currentListSize*=2;
+
+ //Keep only the best "listSize" number of entries.
+ if (currentListSize > listSize) {
+ for (uint8_t i = 0; i < 2*listSize; i++) listIndex[i]=i;
+ nr_sort_asc_double_1D_array_ind(pathMetric, listIndex, currentListSize);
+
+ //sort listIndex[listSize, ..., 2*listSize-1] in descending order.
+ uint8_t swaps, tempInd;
+ for (uint8_t i = 0; i < listSize; i++) {
+ swaps = 0;
+ for (uint8_t j = listSize; j < (2*listSize - i) - 1; j++) {
+ if (listIndex[j+1] > listIndex[j]) {
+ tempInd = listIndex[j];
+ listIndex[j] = listIndex[j + 1];
+ listIndex[j + 1] = tempInd;
+ swaps++;
+ }
+ }
+ if (swaps == 0)
+ break;
+ }
+
+ //First, backup the best "listSize" number of entries.
+ for (int k=(listSize-1); k>0; k--) {
+ for (int i=0; iN; i++) {
+ for (int j=0; j<(polarParams->n+1); j++) {
+ bit[i][j][listIndex[(2*listSize-1)-k]]=bit[i][j][listIndex[k]];
+ llr[i][j][listIndex[(2*listSize-1)-k]]=llr[i][j][listIndex[k]];
+ }
+ }
+ }
+ for (int k=(listSize-1); k>0; k--) {
+ for (int i = 0; i < polarParams->crcParityBits; i++) {
+ crcChecksum[i][listIndex[(2*listSize-1)-k]] = crcChecksum[i][listIndex[k]];
+ }
+ }
+ for (int k=(listSize-1); k>0; k--) crcState[listIndex[(2*listSize-1)-k]]=crcState[listIndex[k]];
+
+ //Copy the best "listSize" number of entries to the first indices.
+ for (int k = 0; k < listSize; k++) {
+ if (k > listIndex[k]) {
+ copyIndex = listIndex[(2*listSize-1)-k];
+ } else { //Use the backup.
+ copyIndex = listIndex[k];
+ }
+ for (int i = 0; i < polarParams->N; i++) {
+ for (int j = 0; j < (polarParams->n + 1); j++) {
+ bit[i][j][k] = bit[i][j][copyIndex];
+ llr[i][j][k] = llr[i][j][copyIndex];
+ }
+ }
+ }
+ for (int k = 0; k < listSize; k++) {
+ if (k > listIndex[k]) {
+ copyIndex = listIndex[(2*listSize-1)-k];
+ } else { //Use the backup.
+ copyIndex = listIndex[k];
+ }
+ for (int i = 0; i < polarParams->crcParityBits; i++) {
+ crcChecksum[i][k]=crcChecksum[i][copyIndex];
+ }
+ }
+ for (int k = 0; k < listSize; k++) {
+ if (k > listIndex[k]) {
+ copyIndex = listIndex[(2*listSize-1)-k];
+ } else { //Use the backup.
+ copyIndex = listIndex[k];
+ }
+ crcState[k]=crcState[copyIndex];
+ }
+ currentListSize = listSize;
+ }
+
+ for (int i=0; icrcParityBits; i++) {
+ if (last1ind[i]==nonFrozenBit) {
+ checkCrcBits=i;
+ break;
+ }
+ }
+
+ if ( checkCrcBits > (-1) ) {
+ for (uint8_t i = 0; i < currentListSize; i++) {
+ if (crcChecksum[checkCrcBits][i]!=extended_crc_scrambling_pattern[checkCrcBits]) {
+ crcState[i]=0; //0=False, 1=True
+ }
+ }
+ }
+
+ for (uint8_t i = 0; i < currentListSize; i++) decoderIterationCheck+=crcState[i];
+ if (decoderIterationCheck==0) {
+ //perror("[SCL polar decoder] All list entries have failed the CRC checks.");
+ free(d_tilde);
+ free(pathMetric);
+ free(crcState);
+ nr_free_uint8_t_3D_array(bit, polarParams->N, (polarParams->n+1));
+ nr_free_double_3D_array(llr, polarParams->N, (polarParams->n+1));
+ nr_free_uint8_t_2D_array(crcChecksum, polarParams->crcParityBits);
+ return(-1);
+ }
+
+ nonFrozenBit++;
+ decoderIterationCheck=0;
+ checkCrcBits=-1;
+ }
+ }
+
+ for (uint8_t i = 0; i < 2*listSize; i++) listIndex[i]=i;
+ nr_sort_asc_double_1D_array_ind(pathMetric, listIndex, currentListSize);
+
+ for (uint8_t i = 0; i < fmin(listSize, (pow(2,polarParams->crcCorrectionBits)) ); i++) {
+ if ( crcState[listIndex[i]] == 1 ) {
+ for (int j = 0; j < polarParams->N; j++) polarParams->nr_polar_U[j]=bit[j][0][listIndex[i]];
+
+ //Extract the information bits (û to ĉ)
+ nr_polar_info_bit_extraction(polarParams->nr_polar_U, polarParams->nr_polar_CPrime, polarParams->information_bit_pattern, polarParams->N);
+
+ //Deinterleaving (ĉ to b)
+ nr_polar_deinterleaver(polarParams->nr_polar_CPrime, polarParams->nr_polar_B, polarParams->interleaving_pattern, polarParams->K);
+
+ //Remove the CRC (â)
+ for (int j = 0; j < polarParams->payloadBits; j++) polarParams->nr_polar_A[j]=polarParams->nr_polar_B[j];
+
+ break;
+ }
+ }
+
+ free(d_tilde);
+ free(pathMetric);
+ free(crcState);
+ nr_free_uint8_t_3D_array(bit, polarParams->N, (polarParams->n+1));
+ nr_free_double_3D_array(llr, polarParams->N, (polarParams->n+1));
+ nr_free_uint8_t_2D_array(crcChecksum, polarParams->crcParityBits);
+ nr_free_uint8_t_2D_array(extended_crc_generator_matrix, polarParams->K);
+ nr_free_uint8_t_2D_array(tempECGM, polarParams->K);
+
+ /*
+ * Return bits.
+ */
+ nr_byte2bit_uint8_32_t(polarParams->nr_polar_A, polarParams->payloadBits, out);
+ return(0);
+}
+
+
+int8_t polar_decoder_int16(int16_t *input,
+ uint8_t *out,
+ t_nrPolar_params *polarParams)
{
- start_meas(init);
- stop_meas(init);
-
- start_meas(polar_rate_matching);
int16_t d_tilde[polarParams->N];// = malloc(sizeof(double) * polarParams->N);
- nr_polar_rate_matching_int8(input, d_tilde, polarParams->rate_matching_pattern, polarParams->K, polarParams->N, polarParams->encoderLength);
+ nr_polar_rate_matching_int16(input, d_tilde, polarParams->rate_matching_pattern, polarParams->K, polarParams->N, polarParams->encoderLength);
for (int i=0;iN;i++) {
if (d_tilde[i]<-128) d_tilde[i]=-128;
else if (d_tilde[i]>127) d_tilde[i]=128;
}
memcpy((void*)&polarParams->tree.root->alpha[0],(void*)&d_tilde[0],sizeof(int16_t)*polarParams->N);
- stop_meas(polar_rate_matching);
/*
* SCL polar decoder.
*/
- start_meas(decoding);
+
generic_polar_decoder(polarParams,polarParams->tree.root);
- start_meas(bit_extraction);
- //Extract the information bits (û to ĉ)
- nr_polar_info_bit_extraction(polarParams->nr_polar_u, polarParams->nr_polar_cPrime, polarParams->information_bit_pattern, polarParams->N);
- stop_meas(bit_extraction);
- //Deinterleaving (ĉ to b)
- start_meas(deinterleaving);
- nr_polar_deinterleaver(polarParams->nr_polar_cPrime, polarParams->nr_polar_b, polarParams->interleaving_pattern, polarParams->K);
- stop_meas(deinterleaving);
- //Remove the CRC (â)
- for (int j = 0; j < polarParams->payloadBits; j++) output[j]=polarParams->nr_polar_b[j];
-
+ //Extract the information bits (û to ĉ)
+ nr_polar_info_bit_extraction(polarParams->nr_polar_U, polarParams->nr_polar_CPrime, polarParams->information_bit_pattern, polarParams->N);
+
+ //Deinterleaving (ĉ to b)
+
+ nr_polar_deinterleaver(polarParams->nr_polar_CPrime, polarParams->nr_polar_B, polarParams->interleaving_pattern, polarParams->K);
+
+ //Remove the CRC (â)
+ for (int j = 0; j < polarParams->payloadBits; j++) polarParams->nr_polar_A[j]=polarParams->nr_polar_B[j];
+
+ nr_byte2bit_uint8_32_t(polarParams->nr_polar_A, polarParams->payloadBits, out);
- // free(d_tilde);
- /*
- for (int i=0;i<2*listSize;i++) {
- // printf("correct: Freeing dlist[%d].bit %p\n",i,dlist[i].bit);
- nr_free_uint8_t_2D_array(dlist[i].bit, (polarParams->n+1));
- nr_free_double_2D_array(dlist[i].llr, (polarParams->n+1));
- free(dlist[i].crcChecksum);
- }*/
- stop_meas(decoding);
return(0);
}
diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c b/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c
index d2a3903dd9..b79739e98d 100644
--- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c
+++ b/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c
@@ -19,275 +19,179 @@
* contact@openairinterface.org
*/
-#include "PHY/impl_defs_top.h"
+/*!\file PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c
+ * \brief
+ * \author Turker Yilmaz
+ * \date 2018
+ * \version 0.1
+ * \company EURECOM
+ * \email turker.yilmaz@eurecom.fr
+ * \note
+ * \warning
+*/
+
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
#include "PHY/sse_intrin.h"
+#include "PHY/impl_defs_top.h"
-inline void computeLLR(double llr[1+nmax][Nmax], uint16_t row, uint16_t col,
- uint16_t offset, uint8_t approximation) __attribute__((always_inline));
-inline void computeLLR(double llr[1+nmax][Nmax], uint16_t row, uint16_t col,
- uint16_t offset, uint8_t approximation) {
+//#define DEBUG_NEW_IMPL
- double a;
- double b;
- double absA,absB;
-
-
- a = llr[col + 1][row];
- b = llr[col+1][row + offset];
-
- if (approximation) { //eq. (9)
- absA = fabs(a);
- absB = fabs(b);
- llr[col][row] = copysign(1.0, a) * copysign(1.0, b) * fmin(absA, absB);
- } else { //eq. (8a)
- llr[col][row] = log((exp(a + b) + 1) / (exp(a) + exp(b)));
+void updateLLR(double ***llr,
+ uint8_t **llrU,
+ uint8_t ***bit,
+ uint8_t **bitU,
+ uint8_t listSize,
+ uint16_t row,
+ uint16_t col,
+ uint16_t xlen,
+ uint8_t ylen,
+ uint8_t approximation)
+{
+ uint16_t offset = (xlen/(pow(2,(ylen-col-1))));
+ for (uint8_t i=0; i= offset ) {
+ if(bitU[row-offset][col]==0) updateBit(bit, bitU, listSize, (row-offset), col, xlen, ylen);
+ if(llrU[row-offset][col+1]==0) updateLLR(llr, llrU, bit, bitU, listSize, (row-offset), (col+1), xlen, ylen, approximation);
+ if(llrU[row][col+1]==0) updateLLR(llr, llrU, bit, bitU, listSize, row, (col+1), xlen, ylen, approximation);
+ llr[row][col][i] = (pow((-1),bit[row-offset][col][i])*llr[row-offset][col+1][i]) + llr[row][col+1][i];
+ } else {
+ if(llrU[row][col+1]==0) updateLLR(llr, llrU, bit, bitU, listSize, row, (col+1), xlen, ylen, approximation);
+ if(llrU[row+offset][col+1]==0) updateLLR(llr, llrU, bit, bitU, listSize, (row+offset), (col+1), xlen, ylen, approximation);
+ computeLLR(llr, row, col, i, offset, approximation);
+ }
}
+ llrU[row][col]=1;
+
// printf("LLR (a %f, b %f): llr[%d][%d] %f\n",32*a,32*b,col,row,32*llr[col][row]);
}
-int16_t llrtab[256][256];
+void updateBit(uint8_t ***bit,
+ uint8_t **bitU,
+ uint8_t listSize,
+ uint16_t row,
+ uint16_t col,
+ uint16_t xlen,
+ uint8_t ylen)
+{
-void nr_polar_llrtableinit() {
- int16_t absA,absB;
- int16_t minabs;
+ uint16_t offset = ( xlen/(pow(2,(ylen-col))) );
- for (int a=-128;a<128;a++) {
- for (int b=-128;b<128;b++) {
- absA=abs(a);
- absB=abs(b);
- minabs = absA=0 && b>=0)) llrtab[a+128][b+128] = minabs;
- else llrtab[a+128][b+128] = -minabs;
- }
- }
+ for (uint8_t i=0; i= offset ) {
+ if (bitU[row][col-1]==0) updateBit(bit, bitU, listSize, row, (col-1), xlen, ylen);
+ bit[row][col][i] = bit[row][col-1][i];
+ } else {
+ if (bitU[row][col-1]==0) updateBit(bit, bitU, listSize, row, (col-1), xlen, ylen);
+ if (bitU[row+offset][col-1]==0) updateBit(bit, bitU, listSize, (row+offset), (col-1), xlen, ylen);
+ bit[row][col][i] = ( (bit[row][col-1][i]+bit[row+offset][col-1][i]) % 2);
+ }
+ }
+
+ bitU[row][col]=1;
+}
+
+void updatePathMetric(double *pathMetric,
+ double ***llr,
+ uint8_t listSize,
+ uint8_t bitValue,
+ uint16_t row,
+ uint8_t approximation)
+{
+ if (approximation) { //eq. (12)
+ for (uint8_t i=0; i= offset ) {
- if (bitU[row-offset][col]==0) updateBit(dlist, bitU, listSize, (row-offset), col, xlen, ylen);
- if (llrU[row-offset][col+1]==0) updateLLR(dlist, llrU, bitU, listSize, (row-offset), (col+1), xlen, ylen, approximation);
- if (llrU[row][col+1]==0) updateLLR(dlist, llrU, bitU, listSize, row, (col+1), xlen, ylen, approximation);
- for (uint8_t i=0; illr[col][row] = (pow((-1),dlist[i]->bit[col][row-offset])*dlist[i]->llr[col+1][row-offset]) + dlist[i]->llr[col+1][row];
- }
- } else {
- if (llrU[row][col+1]==0) updateLLR(dlist, llrU, bitU, listSize, row, (col+1), xlen, ylen, approximation);
- if (llrU[row+offset][col+1]==0) updateLLR(dlist, llrU, bitU, listSize, (row+offset), (col+1), xlen, ylen, approximation);
- for (int i=0;illr, row, col, offset, approximation);
- }
-
- llrU[row][col]=1;
-}
-void updateLLR_int8(decoder_list_int8_t **dlist,uint8_t **llrU, uint8_t **bitU,
- uint8_t listSize, uint16_t row, uint16_t col, uint16_t xlen, uint8_t ylen,
- int generate_optim_code,FILE *fd) {
- uint16_t offset = (xlen/(1<<(ylen-col-1)));
- if (( (row) % (2*offset) ) >= offset ) {
- if (bitU[row-offset][col]==0) updateBit_int8(dlist, bitU, listSize, (row-offset), col, xlen, ylen,generate_optim_code,fd);
- if (llrU[row-offset][col+1]==0) updateLLR_int8(dlist, llrU, bitU, listSize, (row-offset), (col+1), xlen, ylen,generate_optim_code,fd);
- if (llrU[row][col+1]==0) updateLLR_int8(dlist, llrU, bitU, listSize, row, (col+1), xlen, ylen,generate_optim_code,fd);
+ uint8_t bitValue = 0;
+ if (appr) { //eq. (12)
+ for (uint8_t i = 0; i < listSize; i++) {
+ if ((2 * bitValue) != (1 - copysign(1.0, llr[row][0][i]))) pathMetric[i] += fabs(llr[row][0][i]);
+ }
+ } else { //eq. (11b)
+ int8_t multiplier = (2 * bitValue) - 1;
+ for (uint8_t i = 0; i < listSize; i++) pathMetric[i] += log(1 + exp(multiplier * llr[row][0][i]));
+ }
-
- if (generate_optim_code==1) fprintf(fd,"updateLLR_int8_A(sorted_dlist,%d,%d,%d,%d);\n",listSize,col,row,offset);
+ bitValue = 1;
+ if (appr) { //eq. (12)
+ for (uint8_t i = listSize; i < 2*listSize; i++) {
+ if ((2 * bitValue) != (1 - copysign(1.0, llr[row][0][(i-listSize)]))) pathMetric[i] = tempPM[(i-listSize)] + fabs(llr[row][0][(i-listSize)]);
+ }
+ } else { //eq. (11b)
+ int8_t multiplier = (2 * bitValue) - 1;
+ for (uint8_t i = listSize; i < 2*listSize; i++) pathMetric[i] = tempPM[(i-listSize)] + log(1 + exp(multiplier * llr[row][0][(i-listSize)]));
+ }
- updateLLR_int8_A(dlist,listSize,col,row,offset);
-
- } else {
- if (llrU[row][col+1]==0) updateLLR_int8(dlist, llrU, bitU, listSize, row, (col+1), xlen, ylen,generate_optim_code,fd);
- if (llrU[row+offset][col+1]==0) updateLLR_int8(dlist, llrU, bitU, listSize, (row+offset), (col+1), xlen, ylen,generate_optim_code,fd);
- if (generate_optim_code==1) fprintf(fd,"computeLLR_int8(sorted_dlist,%d,%d,%d,%d);\n",listSize,row,col,offset);
- computeLLR_int8(dlist,listSize, row, col, offset);
- }
-
- llrU[row][col]=1;
-}
-
-void updateBit(decoder_list_t **dlist, uint8_t **bitU, uint8_t listSize, uint16_t row,
- uint16_t col, uint16_t xlen, uint8_t ylen) {
- uint16_t offset = ( xlen/(pow(2,(ylen-col))) );
-
- for (uint8_t i=0; i= offset ) {
- if (bitU[row][col-1]==0) updateBit(dlist, bitU, listSize, row, (col-1), xlen, ylen);
- dlist[i]->bit[col][row] = dlist[i]->bit[col-1][row];
- } else {
- if (bitU[row][col-1]==0) updateBit(dlist, bitU, listSize, row, (col-1), xlen, ylen);
- if (bitU[row+offset][col-1]==0) updateBit(dlist, bitU, listSize, (row+offset), (col-1), xlen, ylen);
- dlist[i]->bit[col][row] = ( (dlist[i]->bit[col-1][row]+dlist[i]->bit[col-1][row+offset]) % 2);
- }
- }
-
- bitU[row][col]=1;
-}
+ free(tempPM);
-void updateBit_int8(decoder_list_int8_t **dlist, uint8_t **bitU,
- uint8_t listSize, uint16_t row,
- uint16_t col, uint16_t xlen, uint8_t ylen,
- int generate_optim_code,FILE *fd) {
-
- uint16_t offset = ( xlen/(pow(2,(ylen-col))) );
-
- if (( (row) % (2*offset) ) >= offset ) {
-
- if (bitU[row][col-1]==0) updateBit_int8(dlist, bitU, listSize, row, (col-1), xlen, ylen,generate_optim_code,fd);
- // dlist[i]->bit[col][row] = dlist[i]->bit[col-1][row];
-
- if (generate_optim_code==1) fprintf(fd,"updateBit_int8_A(sorted_dlist,%d,%d,%d);\n",listSize,col,row);
-
- updateBit_int8_A(dlist,listSize,col,row);
-
- } else {
- if (bitU[row][col-1]==0) updateBit_int8(dlist, bitU, listSize, row, (col-1), xlen, ylen,generate_optim_code,fd);
- if (bitU[row+offset][col-1]==0) updateBit_int8(dlist, bitU, listSize, (row+offset), (col-1), xlen, ylen,generate_optim_code,fd);
- // dlist[i]->bit[col][row] = dlist[i]->bit[col-1][row]^dlist[i]->bit[col-1][row+offset];
- // printf("updating dlist[%d]->bit[%d][%d] => %d\n",i,col,row,dlist[i]->bit[col][row]);
-
- if (generate_optim_code==1) fprintf(fd,"updateBit_int8_B(sorted_dlist,%d,%d,%d,%d);\n",listSize,col,row,offset);
-
- updateBit_int8_B(dlist,listSize,col,row,offset);
}
-
- bitU[row][col]=1;
-}
-
-void updatePathMetric(decoder_list_t **dlist,uint8_t listSize, uint8_t bitValue,
- uint16_t row, uint8_t approximation) {
-
- if (approximation) { //eq. (12)
- for (uint8_t i=0; illr[0][row]) )) dlist[i]->pathMetric += fabs(dlist[i]->llr[0][row]);
- }
- } else { //eq. (11b)
- int8_t multiplier = (2*bitValue) - 1;
- for (uint8_t i=0; ipathMetric += log ( 1 + exp(multiplier*dlist[i]->llr[0][row]) ) ;
- }
- }
-
-}
-
-
-
-void updatePathMetric0_int8(decoder_list_int8_t **dlist,uint8_t listSize, uint16_t row,int generate_optim_code,FILE *fd) {
-
- int16_t mask,absllr;
- updatePathMetric0_int8_A(dlist,listSize,row,mask,absllr);
-
- if (generate_optim_code == 1) fprintf(fd,"updatePathMetric0_int8_A(sorted_dlist,%d,%d,mask,absllr);\n",listSize,row);
-
-
-
- /*
- mask = dlist[i]->llr[0][row]>>15;
-
- if (mask != 0) {
- int16_t absllr = (dlist[i]->llr[0][row]+mask)^mask;
- dlist[i]->pathMetric += absllr;
- }*/
+void computeLLR(double ***llr,
+ uint16_t row,
+ uint16_t col,
+ uint8_t i,
+ uint16_t offset,
+ uint8_t approximation)
+{
+ double a = llr[row][col + 1][i];
+ double absA = fabs(a);
+ double b = llr[row + offset][col + 1][i];
+ double absB = fabs(b);
+ if (approximation || isinf(absA) || isinf(absB)) { //eq. (9)
+ llr[row][col][i] = copysign(1.0, a) * copysign(1.0, b) * fmin(absA, absB);
+ } else { //eq. (8a)
+ llr[row][col][i] = log((exp(a + b) + 1) / (exp(a) + exp(b)));
+ }
}
-void updatePathMetric2(decoder_list_t **dlist, uint8_t listSize, uint16_t row, uint8_t appr) {
-
- int i;
-
- for (i=0;ipathMetric = dlist[i]->pathMetric;
- decoder_list_t **dlist2 = &dlist[listSize];
-
- if (appr) { //eq. (12)
- for (i = 0; i < listSize; i++) {
- // bitValue=0
- if (dlist[i]->llr[0][row]<0) dlist[i]->pathMetric -= dlist[i]->llr[0][row];
- // bitValue=1
- else dlist2[i]->pathMetric += dlist[i]->llr[0][row];
- }
- } else { //eq. (11b)
- for (i = 0; i < listSize; i++) {
- // bitValue=0
- dlist[i]->pathMetric += log(1 + exp(-dlist[i]->llr[0][row]));
- // bitValue=1
- dlist2[i]->pathMetric += log(1 + exp(dlist[i]->llr[0][row]));
-
- }
- }
+void updateCrcChecksum(uint8_t **crcChecksum,
+ uint8_t **crcGen,
+ uint8_t listSize,
+ uint32_t i2,
+ uint8_t len)
+{
+ for (uint8_t i = 0; i < listSize; i++) {
+ for (uint8_t j = 0; j < len; j++) {
+ crcChecksum[j][i] = ( (crcChecksum[j][i] + crcGen[i2][j]) % 2 );
+ }
+ }
}
-
-
-
-void updatePathMetric2_int8(decoder_list_int8_t **dlist, uint8_t listSize, uint16_t row,int generate_optim_code,FILE *fd) {
-
-
-
-
- if (generate_optim_code == 1) fprintf(fd,"updatePathMetric2_int8_A(sorted_dlist,%d,%d);\n",
- listSize,row);
-
- updatePathMetric2_int8_A(dlist,listSize,row);
- // dlist[i+listSize]->pathMetric = dlist[i]->pathMetric;
- //if (dlist[i]->llr[0][row]<0) dlist[i]->pathMetric -= dlist[i]->llr[0][row];
- //else dlist[i+listSize]->pathMetric += dlist[i]->llr[0][row];
-
+void updateCrcChecksum2(uint8_t **crcChecksum,
+ uint8_t **crcGen,
+ uint8_t listSize,
+ uint32_t i2,
+ uint8_t len)
+{
+ for (uint8_t i = 0; i < listSize; i++) {
+ for (uint8_t j = 0; j < len; j++) {
+ crcChecksum[j][i+listSize] = ( (crcChecksum[j][i] + crcGen[i2][j]) % 2 );
+ }
+ }
}
-void updateCrcChecksum(decoder_list_t **dlist, uint8_t **crcGen,
- uint8_t listSize, uint32_t i2, uint8_t len) {
- for (uint8_t i = 0; i < listSize; i++) {
- for (uint8_t j = 0; j < len; j++) {
- dlist[i]->crcChecksum[j] = ( (dlist[i]->crcChecksum[j] + crcGen[i2][j]) % 2 );
- }
- }
-}
-
-void updateCrcChecksum2(decoder_list_t **dlist, uint8_t **crcGen,
- uint8_t listSize, uint32_t i2, uint8_t len) {
- for (uint8_t i = 0; i < listSize; i++) {
- for (uint8_t j = 0; j < len; j++) {
- dlist[i+listSize]->crcChecksum[j] = ( (dlist[i]->crcChecksum[j] + crcGen[i2][j]) % 2 );
- }
- }
-}
-
-
-
-void updateCrcChecksum_int8(decoder_list_int8_t **dlist, uint8_t **crcGen,
- uint8_t listSize, uint32_t i2, uint8_t len,int generate_optim_code,FILE *fd) {
-
- if (generate_optim_code == 1) fprintf(fd,"updateCrcChecksum_int8_A(sorted_dlist,%d,crcGen,%d,%d);\n",listSize,i2,len);
-
- updateCrcChecksum_int8_A(dlist,listSize,crcGen,i2,len);
- // for (uint8_t j = 0; j < len; j++) {
- // dlist[i]->crcChecksum[j] = ( (dlist[i]->crcChecksum[j] + crcGen[i2][j]) % 2 );
- // }
-
-}
-
-
-
-void updateCrcChecksum2_int8(decoder_list_int8_t **dlist, uint8_t **crcGen,
- uint8_t listSize, uint32_t i2, uint8_t len,int generate_optim_code,FILE *fd) {
-
- if (generate_optim_code == 1) fprintf(fd,"updateCrcChecksum2_int8_A(sorted_dlist,%d,polarParams->extended_crc_generator_matrix,%d,%d);\n",listSize,i2,len);
-
- updateCrcChecksum2_int8_A(dlist,listSize,crcGen,i2,len);
- // for (uint8_t j = 0; j < len; j++) {
- // dlist[i+listSize]->crcChecksum[j] = ( (dlist[i]->crcChecksum[j] + crcGen[i2][j]) % 2 );
- // }
-
-}
-
decoder_node_t *new_decoder_node(int first_leaf_index,int level) {
@@ -342,6 +246,7 @@ if (all_frozen_below==0) new_node->left=add_nodes(level-1,first_leaf_index,pp);
return(new_node);
}
+
void build_decoder_tree(t_nrPolar_params *pp) {
pp->tree.num_nodes=0;
@@ -349,6 +254,18 @@ void build_decoder_tree(t_nrPolar_params *pp) {
}
+#if defined(__arm__) || defined(__aarch64__)
+// translate 1-1 SIMD functions from SSE to NEON
+#define __m128i int16x8_t
+#define __m64 int8x8_t
+#define _mm_abs_epi16(a) vabsq_s16(a)
+#define _mm_min_epi16(a,b) vminq_s16(a,b)
+#define _mm_subs_epi16(a,b) vsubq_s16(a,b)
+#define _mm_abs_pi16(a) vabs_s16(a)
+#define _mm_min_pi16(a,b) vmin_s16(a,b)
+#define _mm_subs_pi16(a,b) vsub_s16(a,b)
+#endif
+
void applyFtoleft(t_nrPolar_params *pp,decoder_node_t *node) {
int16_t *alpha_v=node->alpha;
int16_t *alpha_l=node->left->alpha;
@@ -362,23 +279,23 @@ void applyFtoleft(t_nrPolar_params *pp,decoder_node_t *node) {
for (int i=0;iNv;i++) printf("i%d (frozen %d): alpha_v[i] = %d\n",i,1-pp->information_bit_pattern[node->first_leaf_index+i],alpha_v[i]);
#endif
-
+
if (node->left->all_frozen == 0) {
-
#if defined(__AVX2__)
int avx2mod = (node->Nv/2)&15;
if (avx2mod == 0) {
__m256i a256,b256,absa256,absb256,minabs256;
int avx2len = node->Nv/2/16;
-
+
+ // printf("avx2len %d\n",avx2len);
for (int i=0;iNv/2)&7;
+ int sse4len = node->Nv/2/8;
+#if defined(__arm__) || defined(__aarch64__)
+ int16x8_t signatimesb,comp1,comp2,negminabs128;
+ int16x8_t zero=vdupq_n_s16(0);
#endif
- {
+
+ if (sse4mod == 0) {
+ for (int i=0;iNv/2/8;
+
+ a128 =*((__m128i*)alpha_v);
+ b128 =((__m128i*)alpha_v)[1];
+ absa128 =_mm_abs_epi16(a128);
+ absb128 =_mm_abs_epi16(b128);
+ minabs128 =_mm_min_epi16(absa128,absb128);
+#if defined(__arm__) || defined(__aarch64__)
+ // unfortunately no direct equivalent to _mm_sign_epi16
+ signatimesb=vxorrq_s16(a128,b128);
+ comp1=vcltq_s16(signatimesb,zero);
+ comp2=vcgeq_s16(signatimesb,zero);
+ negminabs128=vnegq_s16(minabs128);
+ *((__m128i*)alpha_l) =vorrq_s16(vandq_s16(minabs128,comp0),vandq_s16(negminabs128,comp1));
+#else
+ *((__m128i*)alpha_l) =_mm_sign_epi16(minabs128,_mm_sign_epi16(a128,b128));
+#endif
+ }
+ }
+ else if (sse4mod == 4) {
+ __m64 a64,b64,absa64,absb64,minabs64;
+ a64 =*((__m64*)alpha_v);
+ b64 =((__m64*)alpha_v)[1];
+ absa64 =_mm_abs_pi16(a64);
+ absb64 =_mm_abs_pi16(b64);
+ minabs64 =_mm_min_pi16(absa64,absb64);
+#if defined(__arm__) || defined(__aarch64__)
+ AssertFatal(1==0,"Need to do this still for ARM\n");
+#else
+ *((__m64*)alpha_l) =_mm_sign_pi16(minabs64,_mm_sign_epi16(a64,b64));
+#endif
+ }
+
+ else
+#endif
+ { // equvalent scalar code to above, activated only on non x86/ARM architectures
for (int i=0;iNv/2;i++) {
a=alpha_v[i];
b=alpha_v[i+(node->Nv/2)];
@@ -411,6 +373,7 @@ void applyFtoleft(t_nrPolar_params *pp,decoder_node_t *node) {
absb=(b+maskb)^maskb;
minabs = absaNv == 2) { // apply hard decision on left node
@@ -418,7 +381,7 @@ void applyFtoleft(t_nrPolar_params *pp,decoder_node_t *node) {
#ifdef DEBUG_NEW_IMPL
printf("betal[0] %d (%p)\n",betal[0],&betal[0]);
#endif
- pp->nr_polar_u[node->first_leaf_index] = (1+betal[0])>>1;
+ pp->nr_polar_U[node->first_leaf_index] = (1+betal[0])>>1;
#ifdef DEBUG_NEW_IMPL
printf("Setting bit %d to %d (LLR %d)\n",node->first_leaf_index,(betal[0]+1)>>1,alpha_l[0]);
#endif
@@ -453,27 +416,53 @@ void applyGtoright(t_nrPolar_params *pp,decoder_node_t *node) {
else if (avx2mod == 8) {
((__m128i *)alpha_r)[0] = _mm_subs_epi16(((__m128i *)alpha_v)[1],_mm_sign_epi16(((__m128i *)alpha_v)[0],((__m128i *)betal)[0]));
}
+ else if (avx2mod == 4) {
+ ((__m64 *)alpha_r)[0] = _mm_subs_pi16(((__m64 *)alpha_v)[1],_mm_sign_pi16(((__m64 *)alpha_v)[0],((__m64 *)betal)[0]));
+ }
+ else
+#else
+ int sse4mod = (node->Nv/2)&7;
+
+ if (sse4mod == 0) {
+ int sse4len = node->Nv/2/8;
+
+ for (int i=0;iNv/2;i++) {
alpha_r[i] = alpha_v[i+(node->Nv/2)] - (betal[i]*alpha_v[i]);
}
}
if (node->Nv == 2) { // apply hard decision on right node
betar[0] = (alpha_r[0]>0) ? -1 : 1;
- pp->nr_polar_u[node->first_leaf_index+1] = (1+betar[0])>>1;
+ pp->nr_polar_U[node->first_leaf_index+1] = (1+betar[0])>>1;
#ifdef DEBUG_NEW_IMPL
- printf("Setting bit %d to %d (LLR %d frozen_mask %d)\n",node->first_leaf_index+1,(betar[0]+1)>>1,alpha_r[0],frozen_mask);
+ printf("Setting bit %d to %d (LLR %d)\n",node->first_leaf_index+1,(betar[0]+1)>>1,alpha_r[0]);
#endif
}
}
}
-int16_t minus1[16] = {-1,-1,-1,-1,
- -1,-1,-1,-1,
- -1,-1,-1,-1,
- -1,-1,-1,-1};
+
+int16_t all1[16] = {1,1,1,1,
+ 1,1,1,1,
+ 1,1,1,1,
+ 1,1,1,1};
void computeBeta(t_nrPolar_params *pp,decoder_node_t *node) {
@@ -486,27 +475,37 @@ void computeBeta(t_nrPolar_params *pp,decoder_node_t *node) {
if (node->left->all_frozen==0) { // if left node is not aggregation of frozen bits
#if defined(__AVX2__)
int avx2mod = (node->Nv/2)&15;
+ register __m256i allones=*((__m256i*)all1);
if (avx2mod == 0) {
int avx2len = node->Nv/2/16;
-
for (int i=0;iNv/2)&15;
+
+ if (ssr4mod == 0) {
+ int ssr4len = node->Nv/2/8;
+ register __m128i allones=*((__m128i*)all1);
+ for (int i=0;i
#include
-#include "PHY/TOOLS/time_meas.h"
+#include "PHY/CODING/nrPolar_tools/nr_polar_dci_defs.h"
+#include "PHY/CODING/nrPolar_tools/nr_polar_uci_defs.h"
+#include "PHY/CODING/nrPolar_tools/nr_polar_pbch_defs.h"
+#include "PHY/CODING/coding_defs.h"
+//#include "SIMULATION/TOOLS/sim.h"
+
+#define NR_POLAR_DECODER_LISTSIZE 8 //uint8_t
+#define NR_POLAR_DECODER_PATH_METRIC_APPROXIMATION 0 //uint8_t; 0 --> eq. (8a) and (11b), 1 --> eq. (9) and (12)
+
+#define NR_POLAR_AGGREGATION_LEVEL_1_PRIME 149 //uint16_t
+#define NR_POLAR_AGGREGATION_LEVEL_2_PRIME 151 //uint16_t
+#define NR_POLAR_AGGREGATION_LEVEL_4_PRIME 157 //uint16_t
+#define NR_POLAR_AGGREGATION_LEVEL_8_PRIME 163 //uint16_t
+#define NR_POLAR_AGGREGATION_LEVEL_16_PRIME 167 //uint16_t
static const uint8_t nr_polar_subblock_interleaver_pattern[32] = { 0, 1, 2, 4, 3, 5, 6, 7, 8, 16, 9, 17, 10, 18, 11, 19, 12, 20, 13, 21, 14, 22, 15, 23, 24, 25, 26, 28, 27, 29, 30, 31 };
@@ -38,26 +60,6 @@ static const uint8_t nr_polar_subblock_interleaver_pattern[32] = { 0, 1, 2, 4, 3
#define Nmax 1024
#define nmax 10
-typedef struct decoder_list_s {
-
- uint8_t bit[1+nmax][Nmax];
- double llr[1+nmax][Nmax];
- uint8_t crcChecksum[24];
- double pathMetric;
-
-} decoder_list_t;
-
-typedef struct decoder_list_int8_s {
-
- uint8_t bit[1+nmax][Nmax] __attribute__((aligned(32)));
- int16_t llr[1+nmax][Nmax]__attribute__((aligned(32)));
- uint8_t crcChecksum[24];
- int32_t pathMetric;
-
-} decoder_list_int8_t;
-
-
-
typedef struct decoder_node_t_s {
struct decoder_node_t_s *left;
struct decoder_node_t_s *right;
@@ -76,342 +78,294 @@ typedef struct decoder_tree_t_s {
} decoder_tree_t;
struct nrPolar_params {
- uint8_t n_max;
- uint8_t i_il;
- uint8_t i_seg;
- uint8_t n_pc;
- uint8_t n_pc_wm;
- uint8_t i_bil;
- uint16_t payloadBits;
- uint16_t encoderLength;
- uint8_t crcParityBits;
- uint8_t crcCorrectionBits;
- uint16_t K;
- uint16_t N;
- uint8_t n;
-
- uint16_t *interleaving_pattern;
- uint16_t *rate_matching_pattern;
- const uint16_t *Q_0_Nminus1;
- int16_t *Q_I_N;
- int16_t *Q_F_N;
- int16_t *Q_PC_N;
- uint8_t *information_bit_pattern;
- uint16_t *channel_interleaver_pattern;
- uint32_t crc_polynomial;
-
- uint8_t **crc_generator_matrix; //G_P
- uint8_t **G_N;
- uint32_t* crc256Table;
- uint8_t **extended_crc_generator_matrix;
+ //messageType: 0=PBCH, 1=DCI, -1=UCI
+ int idx; //idx = (messageType * messageLength * aggregation_prime);
+ struct nrPolar_params *nextPtr;
- //polar_encoder vectors:
- uint8_t *nr_polar_crc;
- uint8_t *nr_polar_b;
- uint8_t *nr_polar_cPrime;
- uint8_t *nr_polar_u;
- uint8_t *nr_polar_d;
-
- void (*decoder_kernel)(struct nrPolar_params *,decoder_list_int8_t **);
- decoder_tree_t tree;
+ uint8_t n_max;
+ uint8_t i_il;
+ uint8_t i_seg;
+ uint8_t n_pc;
+ uint8_t n_pc_wm;
+ uint8_t i_bil;
+ uint16_t payloadBits;
+ uint16_t encoderLength;
+ uint8_t crcParityBits;
+ uint8_t crcCorrectionBits;
+ uint16_t K;
+ uint16_t N;
+ uint8_t n;
+ uint32_t crcBit;
+
+ uint16_t *interleaving_pattern;
+ uint16_t *rate_matching_pattern;
+ const uint16_t *Q_0_Nminus1;
+ int16_t *Q_I_N;
+ int16_t *Q_F_N;
+ int16_t *Q_PC_N;
+ uint8_t *information_bit_pattern;
+ uint16_t *channel_interleaver_pattern;
+ uint32_t crc_polynomial;
+
+ uint8_t **crc_generator_matrix; //G_P
+ uint8_t **G_N;
+ uint32_t* crc256Table;
+ uint8_t **extended_crc_generator_matrix;
+ //lowercase: bits, Uppercase: Bits stored in bytes
+ //polar_encoder vectors
+ uint8_t *nr_polar_crc;
+ uint8_t *nr_polar_aPrime;
+ uint8_t *nr_polar_APrime;
+ uint8_t *nr_polar_D;
+ uint8_t *nr_polar_E;
+
+ //Polar Coding vectors
+ uint8_t *nr_polar_A;
+ uint8_t *nr_polar_CPrime;
+ uint8_t *nr_polar_B;
+ uint8_t *nr_polar_U;
+
+decoder_tree_t tree;
} __attribute__ ((__packed__));
typedef struct nrPolar_params t_nrPolar_params;
+typedef t_nrPolar_params *t_nrPolar_paramsPtr;
+void polar_encoder(uint32_t *input,
+ uint32_t *output,
+ t_nrPolar_paramsPtr polarParams);
+void polar_encoder_dci(uint32_t *in,
+ uint32_t *out,
+ t_nrPolar_paramsPtr polarParams,
+ uint16_t n_RNTI);
+void polar_encoder_timing(uint32_t *in,
+ uint32_t *out,
+ t_nrPolar_paramsPtr polarParams,
+ double cpuFreqGHz,
+ FILE* logFile);
+int8_t polar_decoder(double *input,
+ uint8_t *output,
+ t_nrPolar_paramsPtr polarParams,
+ uint8_t listSize,
+ uint8_t pathMetricAppr);
-void polar_encoder(uint8_t *input, uint8_t *output, t_nrPolar_params* polarParams);
+int8_t polar_decoder_aPriori(double *input,
+ uint32_t *output,
+ t_nrPolar_paramsPtr polarParams,
+ uint8_t listSize,
+ uint8_t pathMetricAppr,
+ double *aPrioriPayload);
-void nr_polar_kernal_operation(uint8_t *u, uint8_t *d, uint16_t N);
+int8_t polar_decoder_aPriori_timing(double *input,
+ uint32_t *output,
+ t_nrPolar_paramsPtr polarParams,
+ uint8_t listSize,
+ uint8_t pathMetricAppr,
+ double *aPrioriPayload,
+ double cpuFreqGHz,
+ FILE* logFile);
+
+int8_t polar_decoder_dci(double *input,
+ uint32_t *out,
+ t_nrPolar_paramsPtr polarParams,
+ uint8_t listSize,
+ uint8_t pathMetricAppr,
+ uint16_t n_RNTI);
void generic_polar_decoder(t_nrPolar_params *,decoder_node_t *);
-int8_t polar_decoder(double *input, uint8_t *output, t_nrPolar_params *polarParams,
- uint8_t listSize, double *aPrioriPayload, uint8_t pathMetricAppr,
- time_stats_t *init,
- time_stats_t *polar_rate_matching,
- time_stats_t *decoding,
- time_stats_t *bit_extraction,
- time_stats_t *deinterleaving,
- time_stats_t *sorting,
- time_stats_t *path_metric,
- time_stats_t *update_LLR);
+void nr_polar_init(t_nrPolar_paramsPtr *polarParams,
+ int8_t messageType,
+ uint16_t messageLength,
+ uint8_t aggregation_level);
-int8_t polar_decoder_int8(int16_t *input,
- uint8_t *output,
- t_nrPolar_params *polarParams,
- uint8_t listSize,
- time_stats_t *init,
- time_stats_t *polar_rate_matching,
- time_stats_t *decoding,
- time_stats_t *bit_extraction,
- time_stats_t *deinterleaving,
- time_stats_t *sorting,
- time_stats_t *path_metric,
- time_stats_t *update_LLR,
- int generate_optim_code);
+void nr_polar_print_polarParams(t_nrPolar_paramsPtr polarParams);
-int8_t polar_decoder_int8_new(int16_t *input,
- uint8_t *output,
- t_nrPolar_params *polarParams,
- uint8_t listSize,
- time_stats_t *init,
- time_stats_t *polar_rate_matching,
- time_stats_t *decoding,
- time_stats_t *bit_extraction,
- time_stats_t *deinterleaving,
- time_stats_t *sorting,
- time_stats_t *path_metric,
- time_stats_t *update_LLR,
- int generate_optim_code);
+t_nrPolar_paramsPtr nr_polar_params (t_nrPolar_paramsPtr polarParams,
+ int8_t messageType,
+ uint16_t messageLength,
+ uint8_t aggregation_level);
-
-void nr_polar_llrtableinit(void);
-
-void nr_polar_init(t_nrPolar_params* polarParams, int messageType);
+uint16_t nr_polar_aggregation_prime (uint8_t aggregation_level);
uint8_t** nr_polar_kronecker_power_matrices(uint8_t n);
const uint16_t* nr_polar_sequence_pattern(uint8_t n);
-uint32_t nr_polar_output_length(uint16_t K, uint16_t E, uint8_t n_max);
+/*!@fn uint32_t nr_polar_output_length(uint16_t K, uint16_t E, uint8_t n_max)
+ * @brief Computes...
+ * @param K Number of bits to encode (=payloadBits+crcParityBits)
+ * @param E
+ * @param n_max */
+uint32_t nr_polar_output_length(uint16_t K,
+ uint16_t E,
+ uint8_t n_max);
-void nr_polar_channel_interleaver_pattern(uint16_t *cip, uint8_t I_BIL,
- uint16_t E);
+void nr_polar_channel_interleaver_pattern(uint16_t *cip,
+ uint8_t I_BIL,
+ uint16_t E);
-void nr_polar_rate_matching_pattern(uint16_t *rmp, uint16_t *J, const uint8_t *P_i_,
- uint16_t K, uint16_t N, uint16_t E);
+void nr_polar_rate_matching_pattern(uint16_t *rmp,
+ uint16_t *J,
+ const uint8_t *P_i_,
+ uint16_t K,
+ uint16_t N,
+ uint16_t E);
-void nr_polar_rate_matching(double *input, double *output, uint16_t *rmp,
- uint16_t K, uint16_t N, uint16_t E);
+void nr_polar_rate_matching(double *input,
+ double *output,
+ uint16_t *rmp,
+ uint16_t K,
+ uint16_t N,
+ uint16_t E);
-void nr_polar_rate_matching_int8(int16_t *input, int16_t *output, uint16_t *rmp,
- uint16_t K, uint16_t N, uint16_t E);
+void nr_polar_rate_matching_int16(int16_t *input, int16_t *output, uint16_t *rmp, uint16_t K, uint16_t N, uint16_t E);
-void nr_polar_interleaving_pattern(uint16_t K, uint8_t I_IL, uint16_t *PI_k_);
+void nr_polar_interleaving_pattern(uint16_t K,
+ uint8_t I_IL,
+ uint16_t *PI_k_);
-void nr_polar_info_bit_pattern(uint8_t *ibp, int16_t *Q_I_N, int16_t *Q_F_N,
- uint16_t *J, const uint16_t *Q_0_Nminus1, uint16_t K, uint16_t N, uint16_t E,
- uint8_t n_PC);
+void nr_polar_info_bit_pattern(uint8_t *ibp,
+ int16_t *Q_I_N,
+ int16_t *Q_F_N,
+ uint16_t *J,
+ const uint16_t *Q_0_Nminus1,
+ uint16_t K,
+ uint16_t N,
+ uint16_t E,
+ uint8_t n_PC);
-void nr_polar_info_bit_extraction(uint8_t *input, uint8_t *output,
- uint8_t *pattern, uint16_t size);
+void nr_polar_info_bit_extraction(uint8_t *input,
+ uint8_t *output,
+ uint8_t *pattern,
+ uint16_t size);
-void nr_byte2bit(uint8_t *array, uint8_t arraySize, uint8_t *bitArray);
+void nr_bit2byte_uint32_8_t(uint32_t *in,
+ uint16_t arraySize,
+ uint8_t *out);
-void nr_polar_bit_insertion(uint8_t *input, uint8_t *output, uint16_t N,
- uint16_t K, int16_t *Q_I_N, int16_t *Q_PC_N, uint8_t n_PC);
+void nr_byte2bit_uint8_32_t(uint8_t *in,
+ uint16_t arraySize,
+ uint32_t *out);
-void nr_matrix_multiplication_uint8_t_1D_uint8_t_2D(uint8_t *matrix1, uint8_t **matrix2,
- uint8_t *output, uint16_t row, uint16_t col);
+void nr_crc_bit2bit_uint32_8_t(uint32_t *in,
+ uint16_t arraySize,
+ uint8_t *out);
-uint8_t ***nr_alloc_uint8_t_3D_array(uint16_t xlen, uint16_t ylen,
- uint16_t zlen);
-uint8_t **nr_alloc_uint8_t_2D_array(uint16_t xlen, uint16_t ylen);
-double **nr_alloc_double_2D_array(uint16_t xlen, uint16_t ylen);
+void nr_polar_bit_insertion(uint8_t *input,
+ uint8_t *output,
+ uint16_t N,
+ uint16_t K,
+ int16_t *Q_I_N,
+ int16_t *Q_PC_N,
+ uint8_t n_PC);
-void nr_free_uint8_t_3D_array(uint8_t ***input, uint16_t xlen, uint16_t ylen);
-void nr_free_uint8_t_2D_array(uint8_t **input, uint16_t xlen);
-void nr_free_double_2D_array(double **input, uint16_t xlen);
+void nr_matrix_multiplication_uint8_t_1D_uint8_t_2D(uint8_t *matrix1,
+ uint8_t **matrix2,
+ uint8_t *output,
+ uint16_t row,
+ uint16_t col);
-void updateLLR(decoder_list_t **dlist,uint8_t **llrU, uint8_t **bitU,
- uint8_t listSize, uint16_t row, uint16_t col, uint16_t xlen, uint8_t ylen, uint8_t approximation);
+uint8_t ***nr_alloc_uint8_t_3D_array(uint16_t xlen,
+ uint16_t ylen,
+ uint16_t zlen);
-void updateLLR_int8(decoder_list_int8_t **dlist,uint8_t **llrU, uint8_t **bitU,
- uint8_t listSize, uint16_t row, uint16_t col, uint16_t xlen, uint8_t ylen,int generate_optim_code,FILE *fd);
+uint8_t **nr_alloc_uint8_t_2D_array(uint16_t xlen,
+ uint16_t ylen);
-void updateBit(decoder_list_t **dlist, uint8_t **bitU, uint8_t listSize, uint16_t row,
- uint16_t col, uint16_t xlen, uint8_t ylen);
+double ***nr_alloc_double_3D_array(uint16_t xlen,
+ uint16_t ylen,
+ uint16_t zlen);
-void updateBit_int8(decoder_list_int8_t **dlist, uint8_t **bitU, uint8_t listSize, uint16_t row,
- uint16_t col, uint16_t xlen, uint8_t ylen,int generate_optim_code,FILE *fd);
+void nr_free_uint8_t_3D_array(uint8_t ***input,
+ uint16_t xlen,
+ uint16_t ylen);
-void updatePathMetric(decoder_list_t **dlist,uint8_t listSize, uint8_t bitValue,
- uint16_t row, uint8_t approximation);
+void nr_free_uint8_t_2D_array(uint8_t **input,
+ uint16_t xlen);
-void updatePathMetric0_int8(decoder_list_int8_t **dlist,uint8_t listSize, uint16_t row,int generate_optim_code,FILE *fd);
+void nr_free_double_3D_array(double ***input,
+ uint16_t xlen,
+ uint16_t ylen);
-void updatePathMetric2(decoder_list_t **dlist, uint8_t listSize, uint16_t row, uint8_t appr);
+void updateLLR(double ***llr,
+ uint8_t **llrU,
+ uint8_t ***bit,
+ uint8_t **bitU,
+ uint8_t listSize,
+ uint16_t row,
+ uint16_t col,
+ uint16_t xlen,
+ uint8_t ylen,
+ uint8_t approximation);
-void updatePathMetric2_int8(decoder_list_int8_t **dlist, uint8_t listSize, uint16_t row,int generate_optim_code,FILE *fd);
+void updateBit(uint8_t ***bit,
+ uint8_t **bitU,
+ uint8_t listSize,
+ uint16_t row,
+ uint16_t col,
+ uint16_t xlen,
+ uint8_t ylen);
-void updateCrcChecksum(decoder_list_t **dlist, uint8_t **crcGen,
- uint8_t listSize, uint32_t i2, uint8_t len);
+void updatePathMetric(double *pathMetric,
+ double ***llr,
+ uint8_t listSize,
+ uint8_t bitValue,
+ uint16_t row,
+ uint8_t approximation);
-void updateCrcChecksum_int8(decoder_list_int8_t **dlist, uint8_t **crcGen,
- uint8_t listSize, uint32_t i2, uint8_t len,int generate_optim_code,FILE *fd);
+void updatePathMetric2(double *pathMetric,
+ double ***llr,
+ uint8_t listSize,
+ uint16_t row,
+ uint8_t approximation);
-void updateCrcChecksum2(decoder_list_t **dlist, uint8_t **crcGen,
- uint8_t listSize, uint32_t i2, uint8_t len);
+void computeLLR(double ***llr,
+ uint16_t row,
+ uint16_t col,
+ uint8_t i,
+ uint16_t offset,
+ uint8_t approximation);
-void updateCrcChecksum2_int8(decoder_list_int8_t **dlist, uint8_t **crcGen,
- uint8_t listSize, uint32_t i2, uint8_t len,int generate_optim_code,FILE *fd);
+void updateCrcChecksum(uint8_t **crcChecksum,
+ uint8_t **crcGen,
+ uint8_t listSize,
+ uint32_t i2,
+ uint8_t len);
+void updateCrcChecksum2(uint8_t **crcChecksum,
+ uint8_t **crcGen,
+ uint8_t listSize,
+ uint32_t i2,
+ uint8_t len);
-void nr_sort_asc_double_1D_array_ind(double *matrix, int *ind, int len);
-
-void nr_sort_asc_int16_1D_array_ind(int32_t *matrix, int *ind, int len);
+void nr_sort_asc_double_1D_array_ind(double *matrix,
+ uint8_t *ind,
+ uint8_t len);
uint8_t **crc24c_generator_matrix(uint16_t payloadSizeBits);
+
uint8_t **crc11_generator_matrix(uint16_t payloadSizeBits);
+
uint8_t **crc6_generator_matrix(uint16_t payloadSizeBits);
-void crcTable256Init (uint32_t poly, uint32_t* crc256Table);
-void nr_crc_computation(uint8_t* input, uint8_t* output, uint16_t payloadBits, uint16_t crcParityBits, uint32_t* crc256Table);
-unsigned int crcbit (unsigned char* inputptr, int octetlen, uint32_t poly);
-unsigned int crcPayload(unsigned char * inptr, int bitlen, uint32_t* crc256Table);
-
-static inline void nr_polar_rate_matcher(uint8_t *input, unsigned char *output, uint16_t *pattern, uint16_t size) {
+//Also nr_polar_rate_matcher
+static inline void nr_polar_interleaver(uint8_t *input,
+ uint8_t *output,
+ uint16_t *pattern,
+ uint16_t size)
+{
for (int i=0; ibit[(col)][(row)-(offset)]==0) dlist[(i)]->llr[(col)][(row)] = dlist[(i)]->llr[(col)+1][(row)-(offset)] + dlist[(i)]->llr[(col)+1][(row)]; else dlist[(i)]->llr[(col)][(row)] = -dlist[(i)]->llr[(col)+1][(row)-(offset)] + dlist[(i)]->llr[(col)+1][(row)];if(dlist[(i)]->llr[col][row]>127 || dlist[i]->llr[col][row]<-128) printf("dlist[%d]->llr[%d][%d] = %d> 8bit\n",i,col,row,dlist[i]->llr[col][row]);}}
-
-#define updateBit_int8_A(dlist,listSize,col,row) {for (int i=0;ibit[(col)][(row)] = dlist[(i)]->bit[(col)-1][(row)];}}
-#define updateBit_int8_B(dlist,listSize,col,row,offset) {for (int i=0;ibit[(col)][(row)] = dlist[(i)]->bit[(col)-1][(row)]^dlist[(i)]->bit[(col)-1][(row)+(offset)];}}
-
-#define updatePathMetric0_int8_A(dlist,listSize,row,mask,absllr) {for (int i=0;illr[0][row]>>15;if(mask!=0){absllr=(dlist[i]->llr[0][row]+mask)^mask;dlist[i]->pathMetric+=absllr;}}}
-
-#define updatePathMetric2_int8_A(dlist,listSize,row) {for (int i=0;ipathMetric = dlist[i]->pathMetric;if (dlist[i]->llr[0][row]<0) dlist[i]->pathMetric-=dlist[i]->llr[0][row];else dlist[i+listSize]->pathMetric += dlist[i]->llr[0][row];}}}
-
-#define updateCrcChecksum_int8_A(dlist,listSize,crcGen,i2,len) {for (int i=0;icrcChecksum[j] = (dlist[i]->crcChecksum[j]^crcGen[i2][j]);}}
-
-#define updateCrcChecksum2_int8_A(dlist,listSize,crcGen,i2,len) {for (int i=0;icrcChecksum[j]=dlist[i]->crcChecksum[j]^crcGen[i2][j];}}
-
-extern int16_t llrtab[256][256];
-
-inline void computeLLR_int8(decoder_list_int8_t **dlist,int listSize, uint16_t row, uint16_t col,
- uint16_t offset) __attribute__((always_inline));
-inline void computeLLR_int8(decoder_list_int8_t **dlist,int listSize, uint16_t row, uint16_t col,
- uint16_t offset) {
-
- int16_t a;
- int16_t b;
-
- int16_t absA,absB;
- int16_t maska,maskb;
- int16_t minabs;
- // int16_t **llr=dlist[i]->llr;
-
-
- for (int i=0;illr[col + 1][row];
- b = dlist[i]->llr[col+1][row + offset];
-
- // printf("LLR: a %d, b %d\n",a,b);
- maska = a>>15;
- maskb = b>>15;
- absA = (a+maska)^maska;
- absB = (b+maskb)^maskb;
- // printf("LLR: absA %d, absB %d\n",absA,absB);
- minabs = absAllr[col][row] = minabs;
- else
- dlist[i]->llr[col][row] = -minabs;
- // printf("LLR (a %d, b %d): llr[%d][%d] %d\n",a,b,col,row,llr[col][row]);
-
- //dlist[i]->llr[col][row] = llrtab[a+128][b+128];
- // printf("newLLR [%d,%d]: %d\n",col,row,dlist[i]->llr[col][row]);
- }
-}
-
-#define decoder_int8_A(sorted_dlist,currentListSize,polarParams) {for (int i = 0; i < currentListSize; i++) { \
- for (int k = 0; k < (polarParams->n+1); k++) { \
- memcpy((void*)&sorted_dlist[i+currentListSize]->bit[k][0],\
- (void*)&sorted_dlist[i]->bit[k][0],\
- sizeof(uint8_t)*polarParams->N);\
- memcpy((void*)&sorted_dlist[i+currentListSize]->llr[k][0],\
- (void*)&sorted_dlist[i]->llr[k][0],\
- sizeof(int16_t)*polarParams->N);}}}
-
-#define decoder_int8_B(sorted_dlist,currentBit,currentListSize) {for (int i = 0; i < currentListSize; i++) {sorted_dlist[i]->bit[0][currentBit]=0;sorted_dlist[i+currentListSize]->bit[0][currentBit]=1;}}
-
-void inline decoder_int8_C(decoder_list_int8_t *sorted_dlist[],
- t_nrPolar_params *polarParams,
- int currentBit,
- int currentListSize,
- int listSize) {
-
- int32_t pathMetric[2*listSize];
- decoder_list_int8_t *temp_dlist[2*listSize];
-
- int listIndex[2*listSize];
- int listIndex2[2*listSize];
-
- for (int i = 0; i < currentListSize; i++) {
- listIndex[i]=i;
- pathMetric[i] = sorted_dlist[i]->pathMetric;
- }
- nr_sort_asc_int16_1D_array_ind(pathMetric, listIndex, currentListSize);
- for (int i=0;in+1); k++) {
-
- memcpy((void*)&sorted_dlist[i+listSize]->bit[k][0],
- (void*)&sorted_dlist[i]->bit[k][0],
- sizeof(uint8_t)*polarParams->N);
- memcpy((void*)&sorted_dlist[i+listSize]->llr[k][0],
- (void*)&sorted_dlist[i]->llr[k][0],
- sizeof(int16_t)*polarParams->N);
- }
- sorted_dlist[i]->bit[0][currentBit]=0;
- sorted_dlist[i+listSize]->bit[0][currentBit]=1;
- }
- else if (listIndex2[i+listSize]n+1); k++) {
- memcpy((void*)&sorted_dlist[i+listSize]->bit[k][0],
- (void*)&sorted_dlist[i]->bit[k][0],
- sizeof(uint8_t)*polarParams->N);
- memcpy((void*)&sorted_dlist[i+listSize]->llr[k][0],
- (void*)&sorted_dlist[i]->llr[k][0],
- sizeof(int16_t)*polarParams->N);
- }
- sorted_dlist[i+listSize]->bit[0][currentBit]=1;
-
- /*
- decoder_list_t *tmp = sorted_dlist[i+listSize];
- sorted_dlist[i+listSize] = sorted_dlist[i];
- sorted_dlist[i+listSize]->pathMetric = tmp->pathMetric;
- sorted_dlist[i+listSize]->bit[0][currentBit]=1;
- memcpy((void*)&sorted_dlist[i+listSize]->crcChecksum[0],
- (void*)&tmp->crcChecksum[0],
- 24*sizeof(uint8_t));*/
-
- }
- }
-
-
-
- for (int i = 0; i < 2*listSize; i++) {
- temp_dlist[i] = sorted_dlist[i];
- }
- for (int i = 0; i < 2*listSize; i++) {
- // printf("i %d => %d\n",i,listIndex[i]);
- sorted_dlist[i] = temp_dlist[listIndex[i]];
- }
-}
#endif
diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c b/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c
index 0d7ced4f1f..9d84bc7dc8 100644
--- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c
+++ b/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c
@@ -19,57 +19,298 @@
* contact@openairinterface.org
*/
-#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
-#include "PHY/CODING/nrPolar_tools/nr_polar_pbch_defs.h"
+/*!\file PHY/CODING/nrPolar_tools/nr_polar_encoder.c
+ * \brief
+ * \author Turker Yilmaz
+ * \date 2018
+ * \version 0.1
+ * \company EURECOM
+ * \email turker.yilmaz@eurecom.fr
+ * \note
+ * \warning
+*/
-void polar_encoder(
- uint8_t *input,
- uint8_t *output,
- t_nrPolar_params *polarParams)
+//#define DEBUG_POLAR_ENCODER
+//#define DEBUG_POLAR_ENCODER_DCI
+//#define DEBUG_POLAR_ENCODER_TIMING
+
+#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
+
+//input [a_31 a_30 ... a_0]
+//output [f_31 f_30 ... f_0] [f_63 f_62 ... f_32] ...
+
+void polar_encoder(uint32_t *in,
+ uint32_t *out,
+ t_nrPolar_paramsPtr polarParams)
{
+ if (polarParams->idx == 0){//PBCH
+ nr_bit2byte_uint32_8_t(in, polarParams->payloadBits, polarParams->nr_polar_A);
+ /*
+ * Bytewise operations
+ */
+ //Calculate CRC.
+ nr_matrix_multiplication_uint8_t_1D_uint8_t_2D(polarParams->nr_polar_A,
+ polarParams->crc_generator_matrix,
+ polarParams->nr_polar_crc,
+ polarParams->payloadBits,
+ polarParams->crcParityBits);
+ for (uint8_t i = 0; i < polarParams->crcParityBits; i++)
+ polarParams->nr_polar_crc[i] = (polarParams->nr_polar_crc[i] % 2);
+
+ //Attach CRC to the Transport Block. (a to b)
+ for (uint16_t i = 0; i < polarParams->payloadBits; i++)
+ polarParams->nr_polar_B[i] = polarParams->nr_polar_A[i];
+ for (uint16_t i = polarParams->payloadBits; i < polarParams->K; i++)
+ polarParams->nr_polar_B[i]= polarParams->nr_polar_crc[i-(polarParams->payloadBits)];
+ } else { //UCI
+
+ }
+
+ //Interleaving (c to c')
+ nr_polar_interleaver(polarParams->nr_polar_B,
+ polarParams->nr_polar_CPrime,
+ polarParams->interleaving_pattern,
+ polarParams->K);
+
+ //Bit insertion (c' to u)
+ nr_polar_bit_insertion(polarParams->nr_polar_CPrime,
+ polarParams->nr_polar_U,
+ polarParams->N,
+ polarParams->K,
+ polarParams->Q_I_N,
+ polarParams->Q_PC_N,
+ polarParams->n_pc);
+
+ //Encoding (u to d)
+ nr_matrix_multiplication_uint8_t_1D_uint8_t_2D(polarParams->nr_polar_U,
+ polarParams->G_N,
+ polarParams->nr_polar_D,
+ polarParams->N,
+ polarParams->N);
+ for (uint16_t i = 0; i < polarParams->N; i++)
+ polarParams->nr_polar_D[i] = (polarParams->nr_polar_D[i] % 2);
+
+ //Rate matching
+ //Sub-block interleaving (d to y) and Bit selection (y to e)
+ nr_polar_interleaver(polarParams->nr_polar_D,
+ polarParams->nr_polar_E,
+ polarParams->rate_matching_pattern,
+ polarParams->encoderLength);
+
+ /*
+ * Return bits.
+ */
+#ifdef DEBUG_POLAR_ENCODER
+ for (int i=0; i< polarParams->encoderLength;i++) printf("f[%d]=%d\n", i, polarParams->nr_polar_E[i]);
+#endif
+
+ nr_byte2bit_uint8_32_t(polarParams->nr_polar_E, polarParams->encoderLength, out);
+}
+
+void polar_encoder_dci(uint32_t *in,
+ uint32_t *out,
+ t_nrPolar_paramsPtr polarParams,
+ uint16_t n_RNTI)
+{
+#ifdef DEBUG_POLAR_ENCODER_DCI
+ printf("[polar_encoder_dci] in: [0]->0x%08x \t [1]->0x%08x \t [2]->0x%08x \t [3]->0x%08x\n", in[0], in[1], in[2], in[3]);
+#endif
/*
* Bytewise operations
*/
-
+ //(a to a')
+ nr_bit2byte_uint32_8_t(in, polarParams->payloadBits, polarParams->nr_polar_A);
+ for (int i=0; icrcParityBits; i++) polarParams->nr_polar_APrime[i]=1;
+ for (int i=0; ipayloadBits; i++) polarParams->nr_polar_APrime[i+(polarParams->crcParityBits)]=polarParams->nr_polar_A[i];
+#ifdef DEBUG_POLAR_ENCODER_DCI
+ printf("[polar_encoder_dci] A: ");
+ for (int i=0; ipayloadBits; i++) printf("%d-", polarParams->nr_polar_A[i]);
+ printf("\n");
+ printf("[polar_encoder_dci] APrime: ");
+ for (int i=0; iK; i++) printf("%d-", polarParams->nr_polar_APrime[i]);
+ printf("\n");
+ printf("[polar_encoder_dci] GP: ");
+ for (int i=0; icrcParityBits; i++) printf("%d-", polarParams->crc_generator_matrix[0][i]);
+ printf("\n");
+#endif
//Calculate CRC.
- // --- OLD ---
- //nr_matrix_multiplication_uint8_t_1D_uint8_t_2D(input, polarParams->crc_generator_matrix,
- // polarParams->nr_polar_crc, polarParams->payloadBits, polarParams->crcParityBits);
- //for (uint8_t i = 0; i < polarParams->crcParityBits; i++) polarParams->nr_polar_crc[i] = (polarParams->nr_polar_crc[i] % 2);
-
- // --- NEW ---
- nr_crc_computation(input, polarParams->nr_polar_crc, polarParams->payloadBits, polarParams->crcParityBits, polarParams->crc256Table);
-
+ nr_matrix_multiplication_uint8_t_1D_uint8_t_2D(polarParams->nr_polar_APrime,
+ polarParams->crc_generator_matrix,
+ polarParams->nr_polar_crc,
+ polarParams->K,
+ polarParams->crcParityBits);
+ for (uint8_t i = 0; i < polarParams->crcParityBits; i++) polarParams->nr_polar_crc[i] = (polarParams->nr_polar_crc[i] % 2);
+#ifdef DEBUG_POLAR_ENCODER_DCI
+ printf("[polar_encoder_dci] CRC: ");
+ for (int i=0; icrcParityBits; i++) printf("%d-", polarParams->nr_polar_crc[i]);
+ printf("\n");
+#endif
//Attach CRC to the Transport Block. (a to b)
- for (uint16_t i = 0; i < polarParams->payloadBits; i++) polarParams->nr_polar_b[i] = input[i];
+ for (uint16_t i = 0; i < polarParams->payloadBits; i++)
+ polarParams->nr_polar_B[i] = polarParams->nr_polar_A[i];
for (uint16_t i = polarParams->payloadBits; i < polarParams->K; i++)
- polarParams->nr_polar_b[i]= polarParams->nr_polar_crc[i-(polarParams->payloadBits)];
+ polarParams->nr_polar_B[i]= polarParams->nr_polar_crc[i-(polarParams->payloadBits)];
+ //Scrambling (b to c)
+ for (int i=0; i<16; i++) {
+ polarParams->nr_polar_B[polarParams->payloadBits+8+i] =
+ ( polarParams->nr_polar_B[polarParams->payloadBits+8+i] + ((n_RNTI>>(15-i))&1) ) % 2;
+ }
+
+/* //(a to a')
+ nr_crc_bit2bit_uint32_8_t(in, polarParams->payloadBits, polarParams->nr_polar_aPrime);
+ //Parity bits computation (p)
+ polarParams->crcBit = crc24c(polarParams->nr_polar_aPrime, (polarParams->payloadBits+polarParams->crcParityBits));
+#ifdef DEBUG_POLAR_ENCODER_DCI
+ printf("[polar_encoder_dci] crc: 0x%08x\n", polarParams->crcBit);
+ for (int i=0; i<32; i++)
+ {
+ printf("%d\n",((polarParams->crcBit)>>i)&1);
+ }
+#endif
+ //(a to b)
+ //
+ // Bytewise operations
+ //
+ uint8_t arrayInd = ceil(polarParams->payloadBits / 8.0);
+ for (int i=0; inr_polar_B[j+(i*8)] = ((polarParams->nr_polar_aPrime[3+i]>>(7-j)) & 1);
+ }
+ }
+ for (int i=0; i<((polarParams->payloadBits)%8); i++) {
+ polarParams->nr_polar_B[i+(arrayInd-1)*8] = ((polarParams->nr_polar_aPrime[3+(arrayInd-1)]>>(7-i)) & 1);
+ }
+ for (int i=0; i<8; i++) {
+ polarParams->nr_polar_B[polarParams->payloadBits+i] = ((polarParams->crcBit)>>(31-i))&1;
+ }
+ //Scrambling (b to c)
+ for (int i=0; i<16; i++) {
+ polarParams->nr_polar_B[polarParams->payloadBits+8+i] =
+ ( (((polarParams->crcBit)>>(23-i))&1) + ((n_RNTI>>(15-i))&1) ) % 2;
+ }*/
+#ifdef DEBUG_POLAR_ENCODER_DCI
+ printf("[polar_encoder_dci] B: ");
+ for (int i = 0; i < polarParams->K; i++) printf("%d-", polarParams->nr_polar_B[i]);
+ printf("\n");
+#endif
//Interleaving (c to c')
- nr_polar_interleaver(polarParams->nr_polar_b, polarParams->nr_polar_cPrime, polarParams->interleaving_pattern, polarParams->K);
+ nr_polar_interleaver(polarParams->nr_polar_B,
+ polarParams->nr_polar_CPrime,
+ polarParams->interleaving_pattern,
+ polarParams->K);
//Bit insertion (c' to u)
- nr_polar_bit_insertion(polarParams->nr_polar_cPrime, polarParams->nr_polar_u, polarParams->N, polarParams->K,
- polarParams->Q_I_N, polarParams->Q_PC_N, polarParams->n_pc);
+ nr_polar_bit_insertion(polarParams->nr_polar_CPrime,
+ polarParams->nr_polar_U,
+ polarParams->N,
+ polarParams->K,
+ polarParams->Q_I_N,
+ polarParams->Q_PC_N,
+ polarParams->n_pc);
//Encoding (u to d)
- // --- OLD ---
- //nr_matrix_multiplication_uint8_t_1D_uint8_t_2D(polarParams->nr_polar_u, polarParams->G_N, polarParams->nr_polar_d, polarParams->N, polarParams->N);
- //for (uint16_t i = 0; i < polarParams->N; i++) polarParams->nr_polar_d[i] = (polarParams->nr_polar_d[i] % 2);
- //printf("\nd old: ");
- //for (uint16_t i = 0; i < polarParams->N; i++)
- //printf("%i ", polarParams->nr_polar_d[i]);
-
- // --- NEW ---
- nr_polar_kernal_operation(polarParams->nr_polar_u, polarParams->nr_polar_d, polarParams->N);
- //printf("\nd new: ");
- //for (uint16_t i = 0; i < polarParams->N; i++)
- // printf("%i ", polarParams->nr_polar_d[i]);
- //for (uint16_t i = 0; i < polarParams->N; i++) polarParams->nr_polar_d[i] = (polarParams->nr_polar_d[i] % 2);
+ nr_matrix_multiplication_uint8_t_1D_uint8_t_2D(polarParams->nr_polar_U,
+ polarParams->G_N,
+ polarParams->nr_polar_D,
+ polarParams->N,
+ polarParams->N);
+ for (uint16_t i = 0; i < polarParams->N; i++)
+ polarParams->nr_polar_D[i] = (polarParams->nr_polar_D[i] % 2);
//Rate matching
//Sub-block interleaving (d to y) and Bit selection (y to e)
- nr_polar_rate_matcher(polarParams->nr_polar_d, output, polarParams->rate_matching_pattern, polarParams->encoderLength);
+ nr_polar_interleaver(polarParams->nr_polar_D,
+ polarParams->nr_polar_E,
+ polarParams->rate_matching_pattern,
+ polarParams->encoderLength);
+
+ /*
+ * Return bits.
+ */
+ nr_byte2bit_uint8_32_t(polarParams->nr_polar_E, polarParams->encoderLength, out);
+#ifdef DEBUG_POLAR_ENCODER_DCI
+ printf("[polar_encoder_dci] E: ");
+ for (int i = 0; i < polarParams->encoderLength; i++) printf("%d-", polarParams->nr_polar_E[i]);
+ uint8_t outputInd = ceil(polarParams->encoderLength / 32.0);
+ printf("\n[polar_encoder_dci] out: ");
+ for (int i = 0; i < outputInd; i++) {
+ printf("[%d]->0x%08x\t", i, out[i]);
+ }
+#endif
+}
+
+void polar_encoder_timing(uint32_t *in,
+ uint32_t *out,
+ t_nrPolar_paramsPtr polarParams,
+ double cpuFreqGHz,
+ FILE* logFile)
+{
+ //Initiate timing.
+ time_stats_t timeEncoderCRCByte, timeEncoderCRCBit, timeEncoderInterleaver, timeEncoderBitInsertion, timeEncoder1, timeEncoder2, timeEncoderRateMatching, timeEncoderByte2Bit;
+ reset_meas(&timeEncoderCRCByte); reset_meas(&timeEncoderCRCBit); reset_meas(&timeEncoderInterleaver); reset_meas(&timeEncoderBitInsertion); reset_meas(&timeEncoder1); reset_meas(&timeEncoder2); reset_meas(&timeEncoderRateMatching); reset_meas(&timeEncoderByte2Bit);
+ uint16_t n_RNTI=0x0000;
+
+ start_meas(&timeEncoderCRCByte);
+ nr_crc_bit2bit_uint32_8_t(in, polarParams->payloadBits, polarParams->nr_polar_aPrime); //(a to a')
+ polarParams->crcBit = crc24c(polarParams->nr_polar_aPrime, (polarParams->payloadBits+polarParams->crcParityBits)); //Parity bits computation (p)
+ uint8_t arrayInd = ceil(polarParams->payloadBits / 8.0); //(a to b)
+ for (int i=0; inr_polar_B[j+(i*8)] = ((polarParams->nr_polar_aPrime[3+i]>>(7-j)) & 1);
+ for (int i=0; i<((polarParams->payloadBits)%8); i++) polarParams->nr_polar_B[i+(arrayInd-1)*8] = ((polarParams->nr_polar_aPrime[3+(arrayInd-1)]>>(7-i)) & 1);
+ for (int i=0; i<8; i++) polarParams->nr_polar_B[polarParams->payloadBits+i] = ((polarParams->crcBit)>>(31-i))&1;
+ for (int i=0; i<16; i++) polarParams->nr_polar_B[polarParams->payloadBits+8+i] = ( (((polarParams->crcBit)>>(23-i))&1) + ((n_RNTI>>(15-i))&1) ) % 2; //Scrambling (b to c)
+ stop_meas(&timeEncoderCRCByte);
+
+
+ start_meas(&timeEncoderCRCBit);
+ nr_bit2byte_uint32_8_t(in, polarParams->payloadBits, polarParams->nr_polar_A);
+ nr_matrix_multiplication_uint8_t_1D_uint8_t_2D(polarParams->nr_polar_A, polarParams->crc_generator_matrix, polarParams->nr_polar_crc, polarParams->payloadBits, polarParams->crcParityBits); //Calculate CRC.
+ for (uint8_t i = 0; i < polarParams->crcParityBits; i++) polarParams->nr_polar_crc[i] = (polarParams->nr_polar_crc[i] % 2);
+ for (uint16_t i = 0; i < polarParams->payloadBits; i++) polarParams->nr_polar_B[i] = polarParams->nr_polar_A[i]; //Attach CRC to the Transport Block. (a to b)
+ for (uint16_t i = polarParams->payloadBits; i < polarParams->K; i++) polarParams->nr_polar_B[i]= polarParams->nr_polar_crc[i-(polarParams->payloadBits)];
+ stop_meas(&timeEncoderCRCBit);
+
+
+ start_meas(&timeEncoderInterleaver); //Interleaving (c to c')
+ nr_polar_interleaver(polarParams->nr_polar_B, polarParams->nr_polar_CPrime, polarParams->interleaving_pattern, polarParams->K);
+ stop_meas(&timeEncoderInterleaver);
+
+
+ start_meas(&timeEncoderBitInsertion); //Bit insertion (c' to u)
+ nr_polar_bit_insertion(polarParams->nr_polar_CPrime, polarParams->nr_polar_U, polarParams->N, polarParams->K, polarParams->Q_I_N, polarParams->Q_PC_N, polarParams->n_pc);
+ stop_meas(&timeEncoderBitInsertion);
+
+
+ start_meas(&timeEncoder1); //Encoding (u to d)
+ nr_matrix_multiplication_uint8_t_1D_uint8_t_2D(polarParams->nr_polar_U, polarParams->G_N, polarParams->nr_polar_D, polarParams->N, polarParams->N);
+ stop_meas(&timeEncoder1);
+
+
+ start_meas(&timeEncoder2);
+ for (uint16_t i = 0; i < polarParams->N; i++) polarParams->nr_polar_D[i] = (polarParams->nr_polar_D[i] % 2);
+ stop_meas(&timeEncoder2);
+
+
+ start_meas(&timeEncoderRateMatching);//Rate matching //Sub-block interleaving (d to y) and Bit selection (y to e)
+ nr_polar_interleaver(polarParams->nr_polar_D, polarParams->nr_polar_E, polarParams->rate_matching_pattern, polarParams->encoderLength);
+ stop_meas(&timeEncoderRateMatching);
+
+
+ start_meas(&timeEncoderByte2Bit); //Return bits.
+ nr_byte2bit_uint8_32_t(polarParams->nr_polar_E, polarParams->encoderLength, out);
+ stop_meas(&timeEncoderByte2Bit);
+
+ fprintf(logFile,",%f,%f,%f,%f,%f,%f,%f,%f\n",
+ (timeEncoderCRCByte.diff_now/(cpuFreqGHz*1000.0)),
+ (timeEncoderCRCBit.diff_now/(cpuFreqGHz*1000.0)),
+ (timeEncoderInterleaver.diff_now/(cpuFreqGHz*1000.0)),
+ (timeEncoderBitInsertion.diff_now/(cpuFreqGHz*1000.0)),
+ (timeEncoder1.diff_now/(cpuFreqGHz*1000.0)),
+ (timeEncoder2.diff_now/(cpuFreqGHz*1000.0)),
+ (timeEncoderRateMatching.diff_now/(cpuFreqGHz*1000.0)),
+ (timeEncoderByte2Bit.diff_now/(cpuFreqGHz*1000.0)));
}
diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_info_bit_pattern.c b/openair1/PHY/CODING/nrPolar_tools/nr_polar_info_bit_pattern.c
deleted file mode 100644
index a46c427b81..0000000000
--- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_info_bit_pattern.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
-
-void nr_polar_info_bit_pattern(uint8_t *ibp, int16_t *Q_I_N, int16_t *Q_F_N,
- uint16_t *J, const uint16_t *Q_0_Nminus1, uint16_t K, uint16_t N, uint16_t E,
- uint8_t n_PC) {
-
- int16_t *Q_Ftmp_N = malloc(sizeof(int16_t) * (N + 1)); // Last element shows the final
- int16_t *Q_Itmp_N = malloc(sizeof(int16_t) * (N + 1)); // array index assigned a value.
-
- for (int i = 0; i <= N; i++) {
- Q_Ftmp_N[i] = -1; // Empty array.
- Q_Itmp_N[i] = -1;
- }
-
- uint8_t flag;
- uint16_t limit, ind;
-
- if (E < N) {
- if ((K / (double) E) <= (7.0 / 16)) { //puncturing
- for (int n = 0; n <= N - E - 1; n++) {
- ind = Q_Ftmp_N[N] + 1;
- Q_Ftmp_N[ind] = J[n];
- Q_Ftmp_N[N] = Q_Ftmp_N[N] + 1;
- }
-
- if ((E / (double) N) >= (3.0 / 4)) {
- limit = ceil((double) (3 * N - 2 * E) / 4);
- for (int n = 0; n <= limit - 1; n++) {
- ind = Q_Ftmp_N[N] + 1;
- Q_Ftmp_N[ind] = n;
- Q_Ftmp_N[N] = Q_Ftmp_N[N] + 1;
- }
- } else {
- limit = ceil((double) (9 * N - 4 * E) / 16);
- for (int n = 0; n <= limit - 1; n++) {
- ind = Q_Ftmp_N[N] + 1;
- Q_Ftmp_N[ind] = n;
- Q_Ftmp_N[N] = Q_Ftmp_N[N] + 1;
- }
- }
- } else { //shortening
- for (int n = E; n <= N - 1; n++) {
- ind = Q_Ftmp_N[N] + 1;
- Q_Ftmp_N[ind] = J[n];
- Q_Ftmp_N[N] = Q_Ftmp_N[N] + 1;
- }
- }
- }
-
- //Q_I,tmp_N = Q_0_N-1 \ Q_F,tmp_N
- for (int n = 0; n <= N - 1; n++) {
- flag = 1;
- for (int m = 0; m <= Q_Ftmp_N[N]; m++) {
- if (Q_0_Nminus1[n] == Q_Ftmp_N[m]) {
- flag = 0;
- break;
- }
- }
- if (flag) {
- Q_Itmp_N[Q_Itmp_N[N] + 1] = Q_0_Nminus1[n];
- Q_Itmp_N[N]++;
- }
- }
-
- //Q_I_N comprises (K+n_PC) most reliable bit indices in Q_I,tmp_N
- for (int n = 0; n <= (K + n_PC) - 1; n++) {
- ind = Q_Itmp_N[N] + n - ((K + n_PC) - 1);
- Q_I_N[n] = Q_Itmp_N[ind];
- }
-
- //Q_F_N = Q_0_N-1 \ Q_I_N
- for (int n = 0; n <= N - 1; n++) {
- flag = 1;
- for (int m = 0; m <= (K + n_PC) - 1; m++) {
- if (Q_0_Nminus1[n] == Q_I_N[m]) {
- flag = 0;
- break;
- }
- }
- if (flag) {
- Q_F_N[Q_F_N[N] + 1] = Q_0_Nminus1[n];
- Q_F_N[N]++;
- }
- }
-
- //Information Bit Pattern
- for (int n = 0; n <= N - 1; n++) {
- ibp[n] = 0;
-
- for (int m = 0; m <= (K + n_PC) - 1; m++) {
- if (n == Q_I_N[m]) {
- ibp[n] = 1;
- break;
- }
- }
- }
-
- free(Q_Ftmp_N);
- free(Q_Itmp_N);
-}
-
-void nr_polar_info_bit_extraction(uint8_t *input, uint8_t *output, uint8_t *pattern, uint16_t size) {
- uint16_t j = 0;
- for (int i = 0; i < size; i++) {
- if (pattern[i] > 0) {
- output[j] = input[i];
- j++;
- }
- }
-}
diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_interleaving_pattern.c b/openair1/PHY/CODING/nrPolar_tools/nr_polar_interleaving_pattern.c
index da9c51085f..b4ba758b96 100644
--- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_interleaving_pattern.c
+++ b/openair1/PHY/CODING/nrPolar_tools/nr_polar_interleaving_pattern.c
@@ -19,6 +19,17 @@
* contact@openairinterface.org
*/
+/*!\file PHY/CODING/nrPolar_tools/nr_polar_interleaving_pattern.c
+ * \brief
+ * \author Turker Yilmaz
+ * \date 2018
+ * \version 0.1
+ * \company EURECOM
+ * \email turker.yilmaz@eurecom.fr
+ * \note
+ * \warning
+*/
+
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
void nr_polar_interleaving_pattern(uint16_t K, uint8_t I_IL, uint16_t *PI_k_){
diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_kronecker_power_matrices.c b/openair1/PHY/CODING/nrPolar_tools/nr_polar_kronecker_power_matrices.c
index ba72cd8b11..09892cb791 100644
--- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_kronecker_power_matrices.c
+++ b/openair1/PHY/CODING/nrPolar_tools/nr_polar_kronecker_power_matrices.c
@@ -19,6 +19,17 @@
* contact@openairinterface.org
*/
+/*!\file PHY/CODING/nrPolar_tools/nr_polar_kronecker_power_matrices.c
+ * \brief
+ * \author Turker Yilmaz
+ * \date 2018
+ * \version 0.1
+ * \company EURECOM
+ * \email turker.yilmaz@eurecom.fr
+ * \note
+ * \warning
+*/
+
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
uint8_t (*const(G_N_1[])) = {
diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_matrix_and_array.c b/openair1/PHY/CODING/nrPolar_tools/nr_polar_matrix_and_array.c
index 23ec51a400..81c4125faf 100644
--- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_matrix_and_array.c
+++ b/openair1/PHY/CODING/nrPolar_tools/nr_polar_matrix_and_array.c
@@ -19,6 +19,17 @@
* contact@openairinterface.org
*/
+/*!\file PHY/CODING/nrPolar_tools/nr_polar_matrix_and_array.c
+ * \brief
+ * \author Turker Yilmaz
+ * \date 2018
+ * \version 0.1
+ * \company EURECOM
+ * \email turker.yilmaz@eurecom.fr
+ * \note
+ * \warning
+*/
+
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
void nr_matrix_multiplication_uint8_t_1D_uint8_t_2D(uint8_t *matrix1, uint8_t **matrix2,
@@ -66,6 +77,40 @@ uint8_t ***nr_alloc_uint8_t_3D_array(uint16_t xlen, uint16_t ylen, uint16_t zlen
return output;
}
+double ***nr_alloc_double_3D_array(uint16_t xlen, uint16_t ylen, uint16_t zlen) {
+ double ***output;
+ int i, j;
+
+ if ((output = malloc(xlen * sizeof(*output))) == NULL) {
+ perror("[nr_alloc_double_3D_array] Problem at 1D allocation");
+ return NULL;
+ }
+ for (i = 0; i < xlen; i++)
+ output[i] = NULL;
+
+
+ for (i = 0; i < xlen; i++)
+ if ((output[i] = malloc(ylen * sizeof *output[i])) == NULL) {
+ perror("[nr_alloc_double_3D_array] Problem at 2D allocation");
+ nr_free_double_3D_array(output, xlen, ylen);
+ return NULL;
+ }
+ for (i = 0; i < xlen; i++)
+ for (j = 0; j < ylen; j++)
+ output[i][j] = NULL;
+
+
+ for (i = 0; i < xlen; i++)
+ for (j = 0; j < ylen; j++)
+ if ((output[i][j] = malloc(zlen * sizeof *output[i][j])) == NULL) {
+ perror("[nr_alloc_double_3D_array] Problem at 3D allocation");
+ nr_free_double_3D_array(output, xlen, ylen);
+ return NULL;
+ }
+
+ return output;
+}
+
double **nr_alloc_double_2D_array(uint16_t xlen, uint16_t ylen) {
double **output;
int i, j;
@@ -117,6 +162,18 @@ uint8_t **nr_alloc_uint8_t_2D_array(uint16_t xlen, uint16_t ylen) {
return output;
}
+void nr_free_double_3D_array(double ***input, uint16_t xlen, uint16_t ylen) {
+ int i, j;
+
+ for (i = 0; i < xlen; i++) {
+ for (j = 0; j < ylen; j++) {
+ free(input[i][j]);
+ }
+ free(input[i]);
+ }
+ free(input);
+}
+
void nr_free_uint8_t_3D_array(uint8_t ***input, uint16_t xlen, uint16_t ylen) {
int i, j;
@@ -144,7 +201,7 @@ void nr_free_double_2D_array(double **input, uint16_t xlen) {
}
// Modified Bubble Sort.
-void nr_sort_asc_double_1D_array_ind(double *matrix, int *ind, int len) {
+void nr_sort_asc_double_1D_array_ind(double *matrix, uint8_t *ind, uint8_t len) {
int swaps;
double temp;
int tempInd;
diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_output_length.c b/openair1/PHY/CODING/nrPolar_tools/nr_polar_output_length.c
deleted file mode 100644
index e2d65c22fc..0000000000
--- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_output_length.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-#include
-#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
-
-uint32_t nr_polar_output_length(uint16_t K, uint16_t E, uint8_t n_max){
- uint8_t n_1, n_2, n_min=5, n;
- uint32_t polar_code_output_length;
- double R_min=1.0/8;
-
- if ( (E <= (9.0/8)*pow(2,ceil(log2(E))-1)) && (K/E < 9.0/16) ) {
- n_1 = ceil(log2(E))-1;
- } else {
- n_1 = ceil(log2(E));
- }
-
- n_2 = ceil(log2(K/R_min));
-
- n=n_max;
- if (n>n_1) n=n_1;
- if (n>n_2) n=n_2;
- if (n8 to meet false alarm rate requirements.
@@ -49,9 +51,7 @@
//Sec. 7.1.5: Rate Matching
#define NR_POLAR_PBCH_I_BIL 0 //uint8_t
#define NR_POLAR_PBCH_E 864 //uint16_t
-
-//#define NR_POLAR_PBCH_L 5 //uint8_t
-#define NR_POLAR_PBCH_PATH_METRIC_APPROXIMATION 0 //uint8_t; 0 --> eq. (8a) and (11b), 1 --> eq. (9) and (12)
+#define NR_POLAR_PBCH_E_DWORD 27 // NR_POLAR_PBCH_E/32
/*
* TEST CODE
diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_procedures.c b/openair1/PHY/CODING/nrPolar_tools/nr_polar_procedures.c
new file mode 100644
index 0000000000..95fc79ecb1
--- /dev/null
+++ b/openair1/PHY/CODING/nrPolar_tools/nr_polar_procedures.c
@@ -0,0 +1,337 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ * contact@openairinterface.org
+ */
+
+/*!\file PHY/CODING/nrPolar_tools/nr_polar_procedures.h
+ * \brief
+ * \author Turker Yilmaz
+ * \date 2018
+ * \version 0.1
+ * \company EURECOM
+ * \email turker.yilmaz@eurecom.fr
+ * \note
+ * \warning
+*/
+
+#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
+
+void nr_polar_bit_insertion(uint8_t *input,
+ uint8_t *output,
+ uint16_t N,
+ uint16_t K,
+ int16_t *Q_I_N,
+ int16_t *Q_PC_N,
+ uint8_t n_PC)
+{
+ uint16_t k=0;
+ uint8_t flag;
+
+ if (n_PC>0) {
+ /*
+ *
+ */
+ } else {
+ for (int n=0; n<=N-1; n++) {
+ flag=0;
+ for (int m=0; m<=(K+n_PC)-1; m++) {
+ if ( n == Q_I_N[m]) {
+ flag=1;
+ break;
+ }
+ }
+ if (flag) { // n ϵ Q_I_N
+ output[n]=input[k];
+ k++;
+ } else {
+ output[n] = 0;
+ }
+ }
+ }
+
+}
+
+
+uint32_t nr_polar_output_length(uint16_t K,
+ uint16_t E,
+ uint8_t n_max)
+{
+ uint8_t n_1, n_2, n_min=5, n;
+ double R_min=1.0/8;
+
+ if ( (E <= (9.0/8)*pow(2,ceil(log2(E))-1)) && (K/E < 9.0/16) ) {
+ n_1 = ceil(log2(E))-1;
+ } else {
+ n_1 = ceil(log2(E));
+ }
+
+ n_2 = ceil(log2(K/R_min));
+
+ n=n_max;
+ if (n>n_1) n=n_1;
+ if (n>n_2) n=n_2;
+ if (n= (3.0 / 4)) {
+ limit = ceil((double) (3 * N - 2 * E) / 4);
+ for (int n = 0; n <= limit - 1; n++) {
+ ind = Q_Ftmp_N[N] + 1;
+ Q_Ftmp_N[ind] = n;
+ Q_Ftmp_N[N] = Q_Ftmp_N[N] + 1;
+ }
+ } else {
+ limit = ceil((double) (9 * N - 4 * E) / 16);
+ for (int n = 0; n <= limit - 1; n++) {
+ ind = Q_Ftmp_N[N] + 1;
+ Q_Ftmp_N[ind] = n;
+ Q_Ftmp_N[N] = Q_Ftmp_N[N] + 1;
+ }
+ }
+ } else { //shortening
+ for (int n = E; n <= N - 1; n++) {
+ ind = Q_Ftmp_N[N] + 1;
+ Q_Ftmp_N[ind] = J[n];
+ Q_Ftmp_N[N] = Q_Ftmp_N[N] + 1;
+ }
+ }
+ }
+
+ //Q_I,tmp_N = Q_0_N-1 \ Q_F,tmp_N
+ for (int n = 0; n <= N - 1; n++) {
+ flag = 1;
+ for (int m = 0; m <= Q_Ftmp_N[N]; m++) {
+ if (Q_0_Nminus1[n] == Q_Ftmp_N[m]) {
+ flag = 0;
+ break;
+ }
+ }
+ if (flag) {
+ Q_Itmp_N[Q_Itmp_N[N] + 1] = Q_0_Nminus1[n];
+ Q_Itmp_N[N]++;
+ }
+ }
+
+ //Q_I_N comprises (K+n_PC) most reliable bit indices in Q_I,tmp_N
+ for (int n = 0; n <= (K + n_PC) - 1; n++) {
+ ind = Q_Itmp_N[N] + n - ((K + n_PC) - 1);
+ Q_I_N[n] = Q_Itmp_N[ind];
+ }
+
+ //Q_F_N = Q_0_N-1 \ Q_I_N
+ for (int n = 0; n <= N - 1; n++) {
+ flag = 1;
+ for (int m = 0; m <= (K + n_PC) - 1; m++) {
+ if (Q_0_Nminus1[n] == Q_I_N[m]) {
+ flag = 0;
+ break;
+ }
+ }
+ if (flag) {
+ Q_F_N[Q_F_N[N] + 1] = Q_0_Nminus1[n];
+ Q_F_N[N]++;
+ }
+ }
+
+ //Information Bit Pattern
+ for (int n = 0; n <= N - 1; n++) {
+ ibp[n] = 0;
+
+ for (int m = 0; m <= (K + n_PC) - 1; m++) {
+ if (n == Q_I_N[m]) {
+ ibp[n] = 1;
+ break;
+ }
+ }
+ }
+
+ free(Q_Ftmp_N);
+ free(Q_Itmp_N);
+}
+
+
+void nr_polar_info_bit_extraction(uint8_t *input,
+ uint8_t *output,
+ uint8_t *pattern,
+ uint16_t size)
+{
+ uint16_t j = 0;
+ for (int i = 0; i < size; i++) {
+ if (pattern[i] > 0) {
+ output[j] = input[i];
+ j++;
+ }
+ }
+}
+
+
+void nr_polar_rate_matching_pattern(uint16_t *rmp, uint16_t *J, const uint8_t *P_i_, uint16_t K, uint16_t N, uint16_t E){
+
+ uint8_t i;
+ uint16_t *d, *y, ind;
+ d = (uint16_t *)malloc(sizeof(uint16_t) * N);
+ y = (uint16_t *)malloc(sizeof(uint16_t) * N);
+
+ for (int m=0; m<=N-1; m++) d[m]=m;
+
+ for (int m=0; m<=N-1; m++){
+ i=floor((32*m)/N);
+ J[m] = (P_i_[i]*(N/32)) + (m%(N/32));
+ y[m] = d[J[m]];
+ }
+
+ if (E>=N) { //repetition
+ for (int k=0; k<=E-1; k++) {
+ ind = (k%N);
+ rmp[k]=y[ind];
+ }
+ } else {
+ if ( (K/(double)E) <= (7.0/16) ) { //puncturing
+ for (int k=0; k<=E-1; k++) {
+ rmp[k]=y[k+N-E];
+ }
+ } else { //shortening
+ for (int k=0; k<=E-1; k++) {
+ rmp[k]=y[k];
+ }
+ }
+ }
+
+ free(d);
+ free(y);
+}
+
+
+void nr_polar_rate_matching(double *input, double *output, uint16_t *rmp, uint16_t K, uint16_t N, uint16_t E){
+
+ if (E>=N) { //repetition
+ for (int i=0; i<=N-1; i++) output[i]=0;
+ for (int i=0; i<=E-1; i++){
+ output[rmp[i]]+=input[i];
+ }
+ } else {
+ if ( (K/(double)E) <= (7.0/16) ) { //puncturing
+ for (int i=0; i<=N-1; i++) output[i]=0;
+ } else { //shortening
+ for (int i=0; i<=N-1; i++) output[i]=INFINITY;
+ }
+
+ for (int i=0; i<=E-1; i++){
+ output[rmp[i]]=input[i];
+ }
+ }
+
+}
+
+void nr_polar_rate_matching_int16(int16_t *input, int16_t *output, uint16_t *rmp, uint16_t K, uint16_t N, uint16_t E){
+
+ if (E>=N) { //repetition
+ for (int i=0; i<=N-1; i++) output[i]=0;
+ for (int i=0; i<=E-1; i++){
+ output[rmp[i]]+=input[i];
+ }
+ } else {
+ if ( (K/(double)E) <= (7.0/16) ) { //puncturing
+ for (int i=0; i<=N-1; i++) output[i]=0;
+ } else { //shortening
+ for (int i=0; i<=N-1; i++) output[i]=INFINITY;
+ }
+
+ for (int i=0; i<=E-1; i++){
+ output[rmp[i]]=input[i];
+ }
+ }
+
+}
+
diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_uci_defs.h b/openair1/PHY/CODING/nrPolar_tools/nr_polar_uci_defs.h
index 8c0090fd90..724da73fa0 100644
--- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_uci_defs.h
+++ b/openair1/PHY/CODING/nrPolar_tools/nr_polar_uci_defs.h
@@ -33,27 +33,7 @@
#ifndef __NR_POLAR_UCI_DEFS__H__
#define __NR_POLAR_UCI_DEFS__H__
-#define NR_POLAR_PUCCH_PAYLOAD_BITS 32
-#define NR_POLAR_PUCCH_E 32
-
-//Ref. 38-212, Section 6.3.1.2.1
-#define NR_POLAR_PUCCH_CRC_PARITY_BITS_SHORT 6
-#define NR_POLAR_PUCCH_CRC_PARITY_BITS_LONG 11
-
-#define NR_POLAR_PUCCH_I_SEG_LONG 1
-#define NR_POLAR_PUCCH_I_SEG_SHORT 0
-
-//Ref. 38-212, Section 6.3.1.3.1
-#define NR_POLAR_PUCCH_N_MAX 10
-#define NR_POLAR_PUCCH_I_IL 0
-#define NR_POLAR_PUCCH_N_PC_SHORT 3
-#define NR_POLAR_PUCCH_N_PC_LONG 0
-#define NR_POLAR_PUCCH_N_PC_WM_LONG 0
-#define NR_POLAR_PUCCH_N_PC_WM_SHORT 1
-
-//Ref. 38-212, Section 6.3.1.4.1
-#define NR_POLAR_PUCCH_I_BIL 1
-
-
+#define NR_POLAR_UCI_MESSAGE_TYPE -1 //int8_t
+#define NR_POLAR_UCI_CRC_ERROR_CORRECTION_BITS 3
#endif
diff --git a/openair1/PHY/CODING/nr_compute_tbs.c b/openair1/PHY/CODING/nr_compute_tbs.c
new file mode 100644
index 0000000000..ddb82fed04
--- /dev/null
+++ b/openair1/PHY/CODING/nr_compute_tbs.c
@@ -0,0 +1,120 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ * contact@openairinterface.org
+ */
+
+/* file: nr_compute_tbs.c
+ purpose: Compute NR TBS
+ author: Hongzhi WANG (TCL)
+*/
+#include "PHY/defs_nr_UE.h"
+//#include "SCHED/extern.h"
+
+#define INDEX_MAX_TBS_TABLE (93)
+//Table 5.1.3.1-1
+uint16_t Mcsindextable1[29][3] = {{2,120,0.2344},
+ {2,157,0.3066},
+ {2,193,0.3770},
+ {2,251,0.4902},
+ {2,308,0.6016},
+ {2,379,0.7402},
+ {2,449,0.8770},
+ {2,526,1.0273},
+ {2,602,1.1758},
+ {2,679,1.3262},
+ {4,340,1.3281},
+ {4,378,1.4766},
+ {4,434,1.6953},
+ {4,490,1.9141},
+ {4,553,2.1602},
+ {4,616,2.4063},
+ {4,658,2.5703},
+ {6,438,2.5664},
+ {6,466,2.7305},
+ {6,517,3.0293},
+ {6,567,3.3223},
+ {6,616,3.6094},
+ {6,666,3.9023},
+ {6,719,4.2129},
+ {6,772,4.5234},
+ {6,822,4.8164},
+ {6,873,5.1152},
+ {6,910,5.3320},
+ {6,948,5.5547}};
+//Table 5.1.2.2-2
+uint16_t Tbstable_nr[INDEX_MAX_TBS_TABLE] = {24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,208,224,240,256,272,288,304,320,336,352,368,384,408,432,456,480,504,528,552,576,608,640,672,704,736,768,808,848,888,928,984,1032,1064,1128,1160,1192,1224,1256,1288,1320,1352,1416,1480,1544,1608,1672,1736,1800,1864,1928,2024,2088,2152,2216,2280,2408,2472,2536,2600,2664,2728,2792,2856,2976,3104,3240,3368,3496,3624,3752,3824};
+
+uint32_t nr_compute_tbs(uint8_t mcs,
+ uint16_t nb_rb,
+ uint16_t nb_symb_sch,
+ uint8_t nb_re_dmrs,
+ uint16_t length_dmrs,
+ uint8_t Nl)
+{
+ uint16_t nbp_re, nb_re, nb_dmrs_prb, nb_rb_oh, Ninfo,Np_info,n,Qm,R,C;
+ uint32_t nr_tbs;
+
+ nb_rb_oh = 0; //set to 0 if not configured by higher layer
+ Qm = Mcsindextable1[mcs][0];
+ R = Mcsindextable1[mcs][1];
+ nb_dmrs_prb = nb_re_dmrs*length_dmrs;
+
+ nbp_re = 12 * nb_symb_sch - nb_dmrs_prb - nb_rb_oh;
+
+ nb_re = min(156, nbp_re) * nb_rb;
+
+ // Intermediate number of information bits
+ Ninfo = (nb_re * R * Qm * Nl)/1024;
+
+ //printf("Ninfo %d nbp_re %d nb_re %d Qm %d, R %d\n", Ninfo, nbp_re, nb_re, Qm, R);
+
+ if (Ninfo <=3824) {
+
+ n = max(3, floor(log2(Ninfo)) - 6);
+ Np_info = max(24, pow(n,2) * floor(Ninfo/pow(n,2)));
+
+ for (int i=0; i= Np_info){
+ nr_tbs = Tbstable_nr[i];
+ break;
+ }
+ }
+ }
+ else {
+ n = floor(log2(Ninfo-24)) - 5;
+ Np_info = max(3840, pow(n,2) * round((Ninfo - 24)/pow(n,2)));
+
+ if (R <= 1024/4) {
+ C = ceil( (Np_info + 24)/3816 );
+ nr_tbs = 8 * C * ceil( (Np_info + 24)/(8*C) ) - 24;
+ }
+ else {
+ if (Np_info > 8424){
+ C = ceil( (Np_info + 24)/8424 );
+ nr_tbs = 8 * C * ceil( (Np_info + 24)/(8*C) ) - 24;
+ }
+ else
+ nr_tbs = 8 * ceil( (Np_info + 24)/8 ) - 24;
+
+ }
+
+ }
+
+ return nr_tbs;
+}
diff --git a/openair1/PHY/CODING/nr_polar_init.c b/openair1/PHY/CODING/nr_polar_init.c
new file mode 100644
index 0000000000..e238c7b84f
--- /dev/null
+++ b/openair1/PHY/CODING/nr_polar_init.c
@@ -0,0 +1,214 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ * contact@openairinterface.org
+ */
+
+/*!\file PHY/CODING/nr_polar_init.h
+ * \brief
+ * \author Turker Yilmaz
+ * \date 2018
+ * \version 0.1
+ * \company EURECOM
+ * \email turker.yilmaz@eurecom.fr
+ * \note
+ * \warning
+*/
+
+#include "nrPolar_tools/nr_polar_defs.h"
+#include "PHY/CODING/nrPolar_tools/nr_polar_dci_defs.h"
+#include "PHY/CODING/nrPolar_tools/nr_polar_uci_defs.h"
+#include "PHY/CODING/nrPolar_tools/nr_polar_pbch_defs.h"
+#include "PHY/NR_TRANSPORT/nr_dci.h"
+
+void nr_polar_init(t_nrPolar_paramsPtr *polarParams,
+ int8_t messageType,
+ uint16_t messageLength,
+ uint8_t aggregation_level)
+{
+ t_nrPolar_paramsPtr currentPtr = *polarParams;
+ uint16_t aggregation_prime = nr_polar_aggregation_prime(aggregation_level);
+
+ //Parse the list. If the node is already created, return without initialization.
+ while (currentPtr != NULL) {
+ if (currentPtr->idx == (messageType * messageLength * aggregation_prime)) return;
+ else currentPtr = currentPtr->nextPtr;
+ }
+
+ //Else, initialize and add node to the end of the linked list.
+ t_nrPolar_paramsPtr newPolarInitNode = malloc(sizeof(t_nrPolar_params));
+
+ if (newPolarInitNode != NULL) {
+
+ newPolarInitNode->idx = (messageType * messageLength * aggregation_prime);
+ newPolarInitNode->nextPtr = NULL;
+
+ if (messageType == 0) { //PBCH
+ newPolarInitNode->n_max = NR_POLAR_PBCH_N_MAX;
+ newPolarInitNode->i_il = NR_POLAR_PBCH_I_IL;
+ newPolarInitNode->i_seg = NR_POLAR_PBCH_I_SEG;
+ newPolarInitNode->n_pc = NR_POLAR_PBCH_N_PC;
+ newPolarInitNode->n_pc_wm = NR_POLAR_PBCH_N_PC_WM;
+ newPolarInitNode->i_bil = NR_POLAR_PBCH_I_BIL;
+ newPolarInitNode->crcParityBits = NR_POLAR_PBCH_CRC_PARITY_BITS;
+ newPolarInitNode->payloadBits = NR_POLAR_PBCH_PAYLOAD_BITS;
+ newPolarInitNode->encoderLength = NR_POLAR_PBCH_E;
+ newPolarInitNode->crcCorrectionBits = NR_POLAR_PBCH_CRC_ERROR_CORRECTION_BITS;
+ newPolarInitNode->crc_generator_matrix = crc24c_generator_matrix(newPolarInitNode->payloadBits);//G_P
+ } else if (messageType == 1) { //DCI
+ newPolarInitNode->n_max = NR_POLAR_DCI_N_MAX;
+ newPolarInitNode->i_il = NR_POLAR_DCI_I_IL;
+ newPolarInitNode->i_seg = NR_POLAR_DCI_I_SEG;
+ newPolarInitNode->n_pc = NR_POLAR_DCI_N_PC;
+ newPolarInitNode->n_pc_wm = NR_POLAR_DCI_N_PC_WM;
+ newPolarInitNode->i_bil = NR_POLAR_DCI_I_BIL;
+ newPolarInitNode->crcParityBits = NR_POLAR_DCI_CRC_PARITY_BITS;
+ newPolarInitNode->payloadBits = messageLength;
+ newPolarInitNode->encoderLength = aggregation_level*108;
+ newPolarInitNode->crcCorrectionBits = NR_POLAR_DCI_CRC_ERROR_CORRECTION_BITS;
+ newPolarInitNode->crc_generator_matrix=crc24c_generator_matrix(newPolarInitNode->payloadBits+newPolarInitNode->crcParityBits);//G_P
+ } else if (messageType == -1) { //UCI
+
+ } else {
+ AssertFatal(1 == 0, "[nr_polar_init] Incorrect Message Type(%d)", messageType);
+ }
+
+ newPolarInitNode->K = newPolarInitNode->payloadBits + newPolarInitNode->crcParityBits; // Number of bits to encode.
+ newPolarInitNode->N = nr_polar_output_length(newPolarInitNode->K, newPolarInitNode->encoderLength, newPolarInitNode->n_max);
+ newPolarInitNode->n = log2(newPolarInitNode->N);
+ newPolarInitNode->G_N = nr_polar_kronecker_power_matrices(newPolarInitNode->n);
+
+ //polar_encoder vectors:
+ newPolarInitNode->nr_polar_crc = malloc(sizeof(uint8_t) * newPolarInitNode->crcParityBits);
+ newPolarInitNode->nr_polar_aPrime = malloc(sizeof(uint8_t) * ((ceil((newPolarInitNode->payloadBits)/32.0)*4)+3));
+ newPolarInitNode->nr_polar_APrime = malloc(sizeof(uint8_t) * newPolarInitNode->K);
+ newPolarInitNode->nr_polar_D = malloc(sizeof(uint8_t) * newPolarInitNode->N);
+ newPolarInitNode->nr_polar_E = malloc(sizeof(uint8_t) * newPolarInitNode->encoderLength);
+
+ //Polar Coding vectors
+ newPolarInitNode->nr_polar_U = malloc(sizeof(uint8_t) * newPolarInitNode->N); //Decoder: nr_polar_uHat
+ newPolarInitNode->nr_polar_CPrime = malloc(sizeof(uint8_t) * newPolarInitNode->K); //Decoder: nr_polar_cHat
+ newPolarInitNode->nr_polar_B = malloc(sizeof(uint8_t) * newPolarInitNode->K); //Decoder: nr_polar_bHat
+ newPolarInitNode->nr_polar_A = malloc(sizeof(uint8_t) * newPolarInitNode->payloadBits); //Decoder: nr_polar_aHat
+
+
+
+ newPolarInitNode->Q_0_Nminus1 = nr_polar_sequence_pattern(newPolarInitNode->n);
+
+ newPolarInitNode->interleaving_pattern = malloc(sizeof(uint16_t) * newPolarInitNode->K);
+ nr_polar_interleaving_pattern(newPolarInitNode->K,
+ newPolarInitNode->i_il,
+ newPolarInitNode->interleaving_pattern);
+
+ newPolarInitNode->rate_matching_pattern = malloc(sizeof(uint16_t) * newPolarInitNode->encoderLength);
+ uint16_t *J = malloc(sizeof(uint16_t) * newPolarInitNode->N);
+ nr_polar_rate_matching_pattern(newPolarInitNode->rate_matching_pattern,
+ J,
+ nr_polar_subblock_interleaver_pattern,
+ newPolarInitNode->K,
+ newPolarInitNode->N,
+ newPolarInitNode->encoderLength);
+
+ newPolarInitNode->information_bit_pattern = malloc(sizeof(uint8_t) * newPolarInitNode->N);
+ newPolarInitNode->Q_I_N = malloc(sizeof(int16_t) * (newPolarInitNode->K + newPolarInitNode->n_pc));
+ newPolarInitNode->Q_F_N = malloc( sizeof(int16_t) * (newPolarInitNode->N + 1)); // Last element shows the final array index assigned a value.
+ newPolarInitNode->Q_PC_N = malloc( sizeof(int16_t) * (newPolarInitNode->n_pc));
+ for (int i = 0; i <= newPolarInitNode->N; i++)
+ newPolarInitNode->Q_F_N[i] = -1; // Empty array.
+ nr_polar_info_bit_pattern(newPolarInitNode->information_bit_pattern,
+ newPolarInitNode->Q_I_N,
+ newPolarInitNode->Q_F_N,
+ J,
+ newPolarInitNode->Q_0_Nminus1,
+ newPolarInitNode->K,
+ newPolarInitNode->N,
+ newPolarInitNode->encoderLength,
+ newPolarInitNode->n_pc);
+
+ newPolarInitNode->channel_interleaver_pattern = malloc(sizeof(uint16_t) * newPolarInitNode->encoderLength);
+ nr_polar_channel_interleaver_pattern(newPolarInitNode->channel_interleaver_pattern,
+ newPolarInitNode->i_bil,
+ newPolarInitNode->encoderLength);
+
+ free(J);
+
+ build_decoder_tree(newPolarInitNode);
+ printf("decoder tree nodes %d\n",newPolarInitNode->tree.num_nodes);
+
+ } else {
+ AssertFatal(1 == 0, "[nr_polar_init] New t_nrPolar_paramsPtr could not be created");
+ }
+
+ currentPtr = *polarParams;
+ //If polarParams is empty:
+ if (currentPtr == NULL)
+ {
+ *polarParams = newPolarInitNode;
+ return;
+ }
+ //Else, add node to the end of the linked list.
+ while (currentPtr->nextPtr != NULL) {
+ currentPtr = currentPtr->nextPtr;
+ }
+ currentPtr->nextPtr= newPolarInitNode;
+ return;
+}
+
+void nr_polar_print_polarParams(t_nrPolar_paramsPtr polarParams)
+{
+ uint8_t i = 0;
+ if (polarParams == NULL) {
+ printf("polarParams is empty.\n");
+ } else {
+ while (polarParams != NULL){
+ printf("polarParams[%d] = %d\n", i, polarParams->idx);
+ polarParams = polarParams->nextPtr;
+ i++;
+ }
+ }
+ return;
+}
+
+t_nrPolar_paramsPtr nr_polar_params (t_nrPolar_paramsPtr polarParams,
+ int8_t messageType,
+ uint16_t messageLength,
+ uint8_t aggregation_level)
+{
+ t_nrPolar_paramsPtr currentPtr = NULL;
+
+ while (polarParams != NULL) {
+ if (polarParams->idx ==
+ (messageType * messageLength * (nr_polar_aggregation_prime(aggregation_level)) )) {
+ currentPtr = polarParams;
+ break;
+ } else {
+ polarParams = polarParams->nextPtr;
+ }
+ }
+ return currentPtr;
+}
+
+uint16_t nr_polar_aggregation_prime (uint8_t aggregation_level)
+{
+ if (aggregation_level == 0) return 0;
+ else if (aggregation_level == 1) return NR_POLAR_AGGREGATION_LEVEL_1_PRIME;
+ else if (aggregation_level == 2) return NR_POLAR_AGGREGATION_LEVEL_2_PRIME;
+ else if (aggregation_level == 4) return NR_POLAR_AGGREGATION_LEVEL_4_PRIME;
+ else if (aggregation_level == 8) return NR_POLAR_AGGREGATION_LEVEL_8_PRIME;
+ else return NR_POLAR_AGGREGATION_LEVEL_16_PRIME; //aggregation_level == 16
+}
diff --git a/openair1/PHY/CODING/nr_segmentation.c b/openair1/PHY/CODING/nr_segmentation.c
index e7035fcfaa..ad2e809815 100644
--- a/openair1/PHY/CODING/nr_segmentation.c
+++ b/openair1/PHY/CODING/nr_segmentation.c
@@ -24,8 +24,8 @@
author: Hongzhi WANG (TCL)
date: 12.09.2017
*/
-#include "PHY/defs.h"
-#include "SCHED/extern.h"
+#include "PHY/defs_nr_UE.h"
+//#include "SCHED/extern.h"
//#define DEBUG_SEGMENTATION
diff --git a/openair1/PHY/INIT/init_top.c b/openair1/PHY/INIT/init_top.c
index e64eda740c..956e473f67 100644
--- a/openair1/PHY/INIT/init_top.c
+++ b/openair1/PHY/INIT/init_top.c
@@ -72,6 +72,7 @@ void init_lte_top(LTE_DL_FRAME_PARMS *frame_parms)
init_dfts();
+ crcTableInit();
phy_generate_viterbi_tables_lte();
diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c
index 94486c48e9..98d18f5908 100644
--- a/openair1/PHY/INIT/nr_init.c
+++ b/openair1/PHY/INIT/nr_init.c
@@ -20,8 +20,8 @@
*/
#include "PHY/defs_gNB.h"
-#include "SCHED/sched_eNB.h"
#include "PHY/phy_extern.h"
+#include "PHY/NR_REFSIG/nr_refsig.h"
#include "PHY/INIT/phy_init.h"
#include "PHY/CODING/nrPolar_tools/nr_polar_pbch_defs.h"
#include "RadioResourceConfigCommonSIB.h"
@@ -32,7 +32,7 @@
#include "assertions.h"
#include
-#include "PHY/NR_REFSIG/defs.h"
+#include "PHY/NR_REFSIG/nr_refsig.h"
#include "PHY/LTE_REFSIG/lte_refsig.h"
#include "SCHED_NR/fapi_nr_l1.h"
@@ -115,10 +115,32 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
);*/
LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_gNB][MOD %02"PRIu8"][]\n", gNB->Mod_id);
+ crcTableInit();
+
+ init_dfts();
+
// PBCH DMRS gold sequences generation
nr_init_pbch_dmrs(gNB);
// Polar encoder init for PBCH
- nr_polar_init(&fp->pbch_polar_params, 1);
+ nr_polar_init(&gNB->nrPolar_params,
+ NR_POLAR_PBCH_MESSAGE_TYPE,
+ NR_POLAR_PBCH_PAYLOAD_BITS,
+ NR_POLAR_PBCH_AGGREGATION_LEVEL);
+
+ //PDCCH DMRS init
+ gNB->nr_gold_pdcch_dmrs = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t**));
+ uint32_t ***pdcch_dmrs = gNB->nr_gold_pdcch_dmrs;
+ AssertFatal(pdcch_dmrs!=NULL, "NR init: pdcch_dmrs malloc failed\n");
+ for (int slot=0; slotslots_per_frame; slot++) {
+ pdcch_dmrs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t*));
+ AssertFatal(pdcch_dmrs[slot]!=NULL, "NR init: pdcch_dmrs for slot %d - malloc failed\n", slot);
+ for (int symb=0; symbsymbols_per_slot; symb++){
+ pdcch_dmrs[slot][symb] = (uint32_t *)malloc16(NR_MAX_PDCCH_DMRS_INIT_LENGTH_DWORD*sizeof(uint32_t));
+ AssertFatal(pdcch_dmrs[slot][symb]!=NULL, "NR init: pdcch_dmrs for slot %d symbol %d - malloc failed\n", slot, symb);
+ }
+ }
+
+ nr_init_pdcch_dmrs(gNB, cfg->sch_config.physical_cell_id.value);
/*
lte_gold(fp,gNB->lte_gold_table,fp->Nid_cell);
@@ -276,6 +298,7 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
LTE_eNB_PUSCH** const pusch_vars = gNB->pusch_vars;
LTE_eNB_SRS* const srs_vars = gNB->srs_vars;
LTE_eNB_PRACH* const prach_vars = &gNB->prach_vars;
+ uint32_t ***pdcch_dmrs = gNB->nr_gold_pdcch_dmrs;
int i, UE_id;
@@ -288,6 +311,9 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
free_and_zero(common_vars->txdataF);
free_and_zero(common_vars->rxdataF);
+ // PDCCH DMRS sequences
+ free_and_zero(pdcch_dmrs);
+
// Channel estimates for SRS
for (UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) {
for (i=0; i<64; i++) {
diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c
index b70c90791f..dfb678ddc6 100644
--- a/openair1/PHY/INIT/nr_init_ue.c
+++ b/openair1/PHY/INIT/nr_init_ue.c
@@ -34,6 +34,9 @@
#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
#include "PHY/LTE_REFSIG/lte_refsig.h"
#include "PHY/CODING/nrPolar_tools/nr_polar_pbch_defs.h"
+#include "PHY/INIT/phy_init.h"
+#include "PHY/NR_REFSIG/pss_nr.h"
+#include "openair1/PHY/NR_REFSIG/ul_ref_seq_nr.h"
//uint8_t dmrs1_tab_ue[8] = {0,2,3,4,6,8,9,10};
@@ -324,6 +327,7 @@ void phy_config_sib13_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,int mbsfn_Area_
}
}
+
void phy_config_meas_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index,uint8_t n_adj_cells,unsigned int *adj_cell_id)
{
@@ -341,6 +345,7 @@ void phy_config_meas_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index,uint8_t n
memcpy((void*)phy_meas->adj_cell_id,(void *)adj_cell_id,n_adj_cells*sizeof(unsigned int));
}
+*/
#if defined(Rel10) || defined(Rel14)
void phy_config_dedicated_scell_ue(uint8_t Mod_id,
@@ -352,17 +357,17 @@ void phy_config_dedicated_scell_ue(uint8_t Mod_id,
}
#endif
-
-void phy_config_harq_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
+void phy_config_harq_ue(module_id_t Mod_id,int CC_id,uint8_t eNB_id,
uint16_t max_harq_tx )
{
- PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id];
+ PHY_VARS_NR_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id];
phy_vars_ue->ulsch[eNB_id]->Mlimit = max_harq_tx;
}
extern uint16_t beta_cqi[16];
+/*
void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
struct PhysicalConfigDedicated *physicalConfigDedicated )
{
@@ -658,8 +663,8 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
printf("Initializing UE vars (abstraction %"PRIu8") for eNB TXant %"PRIu8", UE RXant %"PRIu8"\n",abstraction_flag,fp->nb_antennas_tx,fp->nb_antennas_rx);
//LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_UE][MOD %02u][]\n", ue->Mod_id+NB_eNB_INST);
- //phy_init_nr_top(&ue->frame_parms);
- //nr_init_frame_parms_ue(&ue->frame_parms);
+ nr_init_frame_parms_ue(&ue->frame_parms);
+ phy_init_nr_top(ue);
// many memory allocation sizes are hard coded
AssertFatal( fp->nb_antennas_rx <= 2, "hard coded allocation for ue_common_vars->dl_ch_estimates[eNB_id]" );
@@ -905,8 +910,9 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
return 0;
}
+
/*
-void nr_lte_ue_transport(PHY_VARS_UE *ue,int abstraction_flag) {
+void init_nr_ue_transport(PHY_VARS_NR_UE *ue,int abstraction_flag) {
int i,j,k;
@@ -927,17 +933,22 @@ void nr_lte_ue_transport(PHY_VARS_UE *ue,int abstraction_flag) {
ue->transmission_mode[i] = ue->frame_parms.nb_antenna_ports_eNB==1 ? 1 : 2;
}
- ue->frame_parms.pucch_config_common.deltaPUCCH_Shift = 1;
+ //ue->frame_parms.pucch_config_common.deltaPUCCH_Shift = 1;
ue->dlsch_MCH[0] = new_ue_dlsch(1,NUMBER_OF_HARQ_PID_MAX,NSOFT,MAX_TURBO_ITERATIONS_MBSFN,ue->frame_parms.N_RB_DL,0);
}*/
-void phy_init_nr_top(NR_DL_FRAME_PARMS *frame_parms)
+void phy_init_nr_top(PHY_VARS_NR_UE *ue)
{
+ NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
+ NR_UE_DLSCH_t *dlsch0 = ue->dlsch[0][0][0];
+ dlsch0 =(NR_UE_DLSCH_t *)malloc16(sizeof(NR_UE_DLSCH_t));
crcTableInit();
+ init_dfts();
+
ccodedot11_init();
ccodedot11_init_inv();
@@ -960,7 +971,12 @@ void phy_init_nr_top(NR_DL_FRAME_PARMS *frame_parms)
generate_ul_reference_signal_sequences(SHRT_MAX);
// Polar encoder init for PBCH
- nr_polar_init(&frame_parms->pbch_polar_params, 1);
+ //nr_polar_init(&frame_parms->pbch_polar_params, 1);
+ /*t_nrPolar_paramsPtr nrPolar_params = NULL, currentPtr = NULL;
+ nr_polar_init(&ue->nrPolar_params,
+ NR_POLAR_PBCH_MESSAGE_TYPE,
+ NR_POLAR_PBCH_PAYLOAD_BITS,
+ NR_POLAR_PBCH_AGGREGATION_LEVEL);*/
//lte_sync_time_init(frame_parms);
diff --git a/openair1/PHY/INIT/nr_parms.c b/openair1/PHY/INIT/nr_parms.c
index b0bfc11279..978b8a3ae7 100644
--- a/openair1/PHY/INIT/nr_parms.c
+++ b/openair1/PHY/INIT/nr_parms.c
@@ -40,7 +40,7 @@ int nr_init_frame_parms(nfapi_nr_config_request_t* config,
LOG_I(PHY,"Initializing frame parms for mu %d, N_RB %d, Ncp %d\n",mu, N_RB, Ncp);
#endif
- if (Ncp == EXTENDED)
+ if (Ncp == NFAPI_CP_EXTENDED)
AssertFatal(mu == NR_MU_2,"Invalid cyclic prefix %d for numerology index %d\n", Ncp, mu);
switch(mu) {
@@ -139,7 +139,7 @@ int nr_init_frame_parms(nfapi_nr_config_request_t* config,
AssertFatal(1==0,"Invalid numerology index %d", mu);
}
-
+ frame_parms->slots_per_frame = 10* frame_parms->slots_per_subframe;
frame_parms->symbols_per_slot = ((Ncp == NORMAL)? 14 : 12); // to redefine for different slot formats
frame_parms->samples_per_subframe_wCP = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_slot * frame_parms->slots_per_subframe;
frame_parms->samples_per_frame_wCP = 10 * frame_parms->samples_per_subframe_wCP;
@@ -148,6 +148,14 @@ int nr_init_frame_parms(nfapi_nr_config_request_t* config,
frame_parms->samples_per_frame = 10 * frame_parms->samples_per_subframe;
frame_parms->freq_range = (frame_parms->dl_CarrierFreq < 6e9)? nr_FR1 : nr_FR2;
+ // Initial bandwidth part configuration -- full carrier bandwidth
+ frame_parms->initial_bwp_dl.bwp_id = 0;
+ frame_parms->initial_bwp_dl.scs = frame_parms->subcarrier_spacing;
+ frame_parms->initial_bwp_dl.location = 0;
+ frame_parms->initial_bwp_dl.N_RB = N_RB;
+ frame_parms->initial_bwp_dl.cyclic_prefix = Ncp;
+ frame_parms->initial_bwp_dl.ofdm_symbol_size = frame_parms->ofdm_symbol_size;
+
return 0;
}
@@ -276,6 +284,7 @@ int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *frame_parms)
frame_parms->samples_per_subframe = 30720 * frame_parms->ttis_per_subframe;
//frame_parms->first_carrier_offset = 2048-600;
+ frame_parms->slots_per_frame = 10* frame_parms->slots_per_subframe;
frame_parms->symbols_per_slot = ((Ncp == NORMAL)? 14 : 12); // to redefine for different slot formats
frame_parms->samples_per_subframe_wCP = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_slot * frame_parms->slots_per_subframe;
frame_parms->samples_per_frame_wCP = 10 * frame_parms->samples_per_subframe_wCP;
@@ -298,4 +307,10 @@ void nr_dump_frame_parms(NR_DL_FRAME_PARMS *frame_parms)
LOG_I(PHY,"frame_parms->samples_per_frame_wCP=%d\n",frame_parms->samples_per_frame_wCP);
LOG_I(PHY,"frame_parms->samples_per_subframe=%d\n",frame_parms->samples_per_subframe);
LOG_I(PHY,"frame_parms->samples_per_frame=%d\n",frame_parms->samples_per_frame);
+ LOG_I(PHY,"frame_parms->initial_bwp_dl.bwp_id=%d\n",frame_parms->initial_bwp_dl.bwp_id);
+ LOG_I(PHY,"frame_parms->initial_bwp_dl.scs=%d\n",frame_parms->initial_bwp_dl.scs);
+ LOG_I(PHY,"frame_parms->initial_bwp_dl.N_RB=%d\n",frame_parms->initial_bwp_dl.N_RB);
+ LOG_I(PHY,"frame_parms->initial_bwp_dl.cyclic_prefix=%d\n",frame_parms->initial_bwp_dl.cyclic_prefix);
+ LOG_I(PHY,"frame_parms->initial_bwp_dl.location=%d\n",frame_parms->initial_bwp_dl.location);
+ LOG_I(PHY,"frame_parms->initial_bwp_dl.ofdm_symbol_size=%d\n",frame_parms->initial_bwp_dl.ofdm_symbol_size);
}
diff --git a/openair1/PHY/INIT/phy_init.h b/openair1/PHY/INIT/phy_init.h
index f79edcbe58..84a2925a82 100644
--- a/openair1/PHY/INIT/phy_init.h
+++ b/openair1/PHY/INIT/phy_init.h
@@ -56,6 +56,8 @@ int l1_north_init_eNB(void);
*/
int phy_init_top(LTE_DL_FRAME_PARMS *frame_parms);
+void phy_init_nr_top(PHY_VARS_NR_UE *ue);
+
/*!
\brief Allocate and Initialize the PHY variables relevant to the LTE ue signal buffers.
diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
index e11068796c..3dee33aa92 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
@@ -224,7 +224,12 @@ void fill_pdcch_order(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_a
proc->frame_tx, proc->subframe_tx, rel8->rnti);
}
-void fill_dci_and_dlsch(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_alloc,nfapi_dl_config_dci_dl_pdu *pdu)
+void fill_dci_and_dlsch(PHY_VARS_eNB *eNB,
+ int frame,
+ int subframe,
+ eNB_rxtx_proc_t *proc,
+ DCI_ALLOC_t *dci_alloc,
+ nfapi_dl_config_dci_dl_pdu *pdu)
{
LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
uint8_t *dci_pdu = &dci_alloc->dci_pdu[0];
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
deleted file mode 100644
index 4020056e6f..0000000000
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
+++ /dev/null
@@ -1,748 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-/*! \file PHY/LTE_TRANSPORT/dlsch_decoding.c
-* \brief Top-level routines for decoding Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03
-* \author R. Knopp
-* \date 2011
-* \version 0.1
-* \company Eurecom
-* \email: knopp@eurecom.fr
-* \note
-* \warning
-*/
-
-//#include "defs.h"
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "PHY/CODING/extern.h"
-#include "SCHED/extern.h"
-#include "SIMULATION/TOOLS/defs.h"
-//#define DEBUG_DLSCH_DECODING
-//#define UE_DEBUG_TRACE 1
-
-
-void free_ue_dlsch(LTE_UE_DLSCH_t *dlsch)
-{
-
- int i,r;
-
- if (dlsch) {
- for (i=0; iMdlharq; i++) {
- if (dlsch->harq_processes[i]) {
- if (dlsch->harq_processes[i]->b) {
- free16(dlsch->harq_processes[i]->b,MAX_DLSCH_PAYLOAD_BYTES);
- dlsch->harq_processes[i]->b = NULL;
- }
-
- for (r=0; rharq_processes[i]->c[r],((r==0)?8:0) + 3+768);
- dlsch->harq_processes[i]->c[r] = NULL;
- }
-
- for (r=0; rharq_processes[i]->d[r]) {
- free16(dlsch->harq_processes[i]->d[r],((3*8*6144)+12+96)*sizeof(short));
- dlsch->harq_processes[i]->d[r] = NULL;
- }
-
- free16(dlsch->harq_processes[i],sizeof(LTE_DL_UE_HARQ_t));
- dlsch->harq_processes[i] = NULL;
- }
- }
-
- free16(dlsch,sizeof(LTE_UE_DLSCH_t));
- dlsch = NULL;
- }
-}
-
-LTE_UE_DLSCH_t *new_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t max_turbo_iterations,uint8_t N_RB_DL, uint8_t abstraction_flag)
-{
-
- LTE_UE_DLSCH_t *dlsch;
- uint8_t exit_flag = 0,i,r;
-
- unsigned char bw_scaling =1;
-
- switch (N_RB_DL) {
- case 6:
- bw_scaling =16;
- break;
-
- case 25:
- bw_scaling =4;
- break;
-
- case 50:
- bw_scaling =2;
- break;
-
- default:
- bw_scaling =1;
- break;
- }
-
- dlsch = (LTE_UE_DLSCH_t *)malloc16(sizeof(LTE_UE_DLSCH_t));
-
- if (dlsch) {
- memset(dlsch,0,sizeof(LTE_UE_DLSCH_t));
- dlsch->Kmimo = Kmimo;
- dlsch->Mdlharq = Mdlharq;
- dlsch->Nsoft = Nsoft;
- dlsch->max_turbo_iterations = max_turbo_iterations;
-
- for (i=0; iharq_processes[i] = (LTE_DL_UE_HARQ_t *)malloc16(sizeof(LTE_DL_UE_HARQ_t));
-
- if (dlsch->harq_processes[i]) {
- memset(dlsch->harq_processes[i],0,sizeof(LTE_DL_UE_HARQ_t));
- dlsch->harq_processes[i]->first_tx=1;
- dlsch->harq_processes[i]->b = (uint8_t*)malloc16(MAX_DLSCH_PAYLOAD_BYTES/bw_scaling);
-
- if (dlsch->harq_processes[i]->b)
- memset(dlsch->harq_processes[i]->b,0,MAX_DLSCH_PAYLOAD_BYTES/bw_scaling);
- else
- exit_flag=3;
-
- if (abstraction_flag == 0) {
- for (r=0; rharq_processes[i]->c[r] = (uint8_t*)malloc16(((r==0)?8:0) + 3+ 768);
-
- if (dlsch->harq_processes[i]->c[r])
- memset(dlsch->harq_processes[i]->c[r],0,((r==0)?8:0) + 3+ 768);
- else
- exit_flag=2;
-
- dlsch->harq_processes[i]->d[r] = (short*)malloc16(((3*8*6144)+12+96)*sizeof(short));
-
- if (dlsch->harq_processes[i]->d[r])
- memset(dlsch->harq_processes[i]->d[r],0,((3*8*6144)+12+96)*sizeof(short));
- else
- exit_flag=2;
- }
- }
- } else {
- exit_flag=1;
- }
- }
-
- if (exit_flag==0)
- return(dlsch);
- }
-
- printf("new_ue_dlsch with size %zu: exit_flag = %u\n",sizeof(LTE_DL_UE_HARQ_t), exit_flag);
- free_ue_dlsch(dlsch);
-
- return(NULL);
-}
-
-uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
- short *dlsch_llr,
- LTE_DL_FRAME_PARMS *frame_parms,
- LTE_UE_DLSCH_t *dlsch,
- LTE_DL_UE_HARQ_t *harq_process,
- uint32_t frame,
- uint8_t subframe,
- uint8_t harq_pid,
- uint8_t is_crnti,
- uint8_t llr8_flag)
-{
-
-#if UE_TIMING_TRACE
- time_stats_t *dlsch_rate_unmatching_stats=&phy_vars_ue->dlsch_rate_unmatching_stats;
- time_stats_t *dlsch_turbo_decoding_stats=&phy_vars_ue->dlsch_turbo_decoding_stats;
- time_stats_t *dlsch_deinterleaving_stats=&phy_vars_ue->dlsch_deinterleaving_stats;
-#endif
- uint32_t A,E;
- uint32_t G;
- uint32_t ret,offset;
- uint16_t iind;
- // uint8_t dummy_channel_output[(3*8*block_length)+12];
- short dummy_w[MAX_NUM_DLSCH_SEGMENTS][3*(6144+64)];
- uint32_t r,r_offset=0,Kr,Kr_bytes,err_flag=0;
- uint8_t crc_type;
-#ifdef DEBUG_DLSCH_DECODING
- uint16_t i;
-#endif
- //#ifdef __AVX2__
-#if 0
- int Kr_last,skipped_last=0;
- uint8_t (*tc_2cw)(int16_t *y,
- int16_t *y2,
- uint8_t *,
- uint8_t *,
- uint16_t,
- uint16_t,
- uint16_t,
- uint8_t,
- uint8_t,
- uint8_t,
- time_stats_t *,
- time_stats_t *,
- time_stats_t *,
- time_stats_t *,
- time_stats_t *,
- time_stats_t *,
- time_stats_t *);
-
-#endif
-decoder_if_t tc;
-
-
-
-
- if (!dlsch_llr) {
- printf("dlsch_decoding.c: NULL dlsch_llr pointer\n");
- return(dlsch->max_turbo_iterations);
- }
-
- if (!harq_process) {
- printf("dlsch_decoding.c: NULL harq_process pointer\n");
- return(dlsch->max_turbo_iterations);
- }
-
- if (!frame_parms) {
- printf("dlsch_decoding.c: NULL frame_parms pointer\n");
- return(dlsch->max_turbo_iterations);
- }
-
- if (subframe>9) {
- printf("dlsch_decoding.c: Illegal subframe index %d\n",subframe);
- return(dlsch->max_turbo_iterations);
- }
-
- if (dlsch->harq_ack[subframe].ack != 2) {
- LOG_D(PHY, "[UE %d] DLSCH @ SF%d : ACK bit is %d instead of DTX even before PDSCH is decoded!\n",
- phy_vars_ue->Mod_id, subframe, dlsch->harq_ack[subframe].ack);
- }
-
- if (llr8_flag == 0) {
- //#ifdef __AVX2__
-#if 0
- tc_2cw = phy_threegpplte_turbo_decoder16avx2;
-#endif
- tc = decoder16;
- }
- else
- {
- AssertFatal (harq_process->TBS >= 256 , "Mismatch flag nbRB=%d TBS=%d mcs=%d Qm=%d RIV=%d round=%d \n",
- harq_process->nb_rb, harq_process->TBS,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round);
- tc = decoder8;
- }
-
-
- // nb_rb = dlsch->nb_rb;
-
- /*
- if (nb_rb > frame_parms->N_RB_DL) {
- printf("dlsch_decoding.c: Illegal nb_rb %d\n",nb_rb);
- return(max_turbo_iterations);
- }*/
-
- /*harq_pid = dlsch->current_harq_pid[phy_vars_ue->current_thread_id[subframe]];
- if (harq_pid >= 8) {
- printf("dlsch_decoding.c: Illegal harq_pid %d\n",harq_pid);
- return(max_turbo_iterations);
- }
- */
-
- harq_process->trials[harq_process->round]++;
-
- A = harq_process->TBS; //2072 for QPSK 1/3
-
- ret = dlsch->max_turbo_iterations;
-
-
- G = harq_process->G;
- //get_G(frame_parms,nb_rb,dlsch->rb_alloc,mod_order,num_pdcch_symbols,phy_vars_ue->frame,subframe);
-
- // printf("DLSCH Decoding, harq_pid %d Ndi %d\n",harq_pid,harq_process->Ndi);
-
- if (harq_process->round == 0) {
- // This is a new packet, so compute quantities regarding segmentation
- harq_process->B = A+24;
- lte_segmentation(NULL,
- NULL,
- harq_process->B,
- &harq_process->C,
- &harq_process->Cplus,
- &harq_process->Cminus,
- &harq_process->Kplus,
- &harq_process->Kminus,
- &harq_process->F);
- // CLEAR LLR's HERE for first packet in process
- }
-
- /*
- else {
- printf("dlsch_decoding.c: Ndi>0 not checked yet!!\n");
- return(max_turbo_iterations);
- }
- */
- err_flag = 0;
- r_offset = 0;
-
- unsigned char bw_scaling =1;
-
- switch (frame_parms->N_RB_DL) {
- case 6:
- bw_scaling =16;
- break;
-
- case 25:
- bw_scaling =4;
- break;
-
- case 50:
- bw_scaling =2;
- break;
-
- default:
- bw_scaling =1;
- break;
- }
-
- if (harq_process->C > MAX_NUM_DLSCH_SEGMENTS/bw_scaling) {
- LOG_E(PHY,"Illegal harq_process->C %d > %d\n",harq_process->C,MAX_NUM_DLSCH_SEGMENTS/bw_scaling);
- return((1+dlsch->max_turbo_iterations));
- }
-#ifdef DEBUG_DLSCH_DECODING
- printf("Segmentation: C %d, Cminus %d, Kminus %d, Kplus %d\n",harq_process->C,harq_process->Cminus,harq_process->Kminus,harq_process->Kplus);
-#endif
-
- opp_enabled=1;
-
- for (r=0; rC; r++) {
-
-
- // Get Turbo interleaver parameters
- if (rCminus)
- Kr = harq_process->Kminus;
- else
- Kr = harq_process->Kplus;
-
- Kr_bytes = Kr>>3;
-
- 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_decoding: Illegal codeword size %d!!!\n",Kr_bytes);
- return(dlsch->max_turbo_iterations);
- }
-
-#ifdef DEBUG_DLSCH_DECODING
- printf("f1 %d, f2 %d, F %d\n",f1f2mat_old[2*iind],f1f2mat_old[1+(2*iind)],(r==0) ? harq_process->F : 0);
-#endif
-
-#if UE_TIMING_TRACE
- start_meas(dlsch_rate_unmatching_stats);
-#endif
- memset(&dummy_w[r][0],0,3*(6144+64)*sizeof(short));
- harq_process->RTC[r] = generate_dummy_w(4+(Kr_bytes*8),
- (uint8_t*) &dummy_w[r][0],
- (r==0) ? harq_process->F : 0);
-
-#ifdef DEBUG_DLSCH_DECODING
- LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n",
- harq_pid,r, G,
- Kr*3,
- harq_process->TBS,
- harq_process->Qm,
- harq_process->nb_rb,
- harq_process->Nl,
- harq_process->rvidx,
- harq_process->round);
-#endif
-
-#ifdef DEBUG_DLSCH_DECODING
- printf(" in decoding dlsch->harq_processes[harq_pid]->rvidx = %d\n", dlsch->harq_processes[harq_pid]->rvidx);
-#endif
- if (lte_rate_matching_turbo_rx(harq_process->RTC[r],
- G,
- harq_process->w[r],
- (uint8_t*)&dummy_w[r][0],
- dlsch_llr+r_offset,
- harq_process->C,
- dlsch->Nsoft,
- dlsch->Mdlharq,
- dlsch->Kmimo,
- harq_process->rvidx,
- (harq_process->round==0)?1:0,
- harq_process->Qm,
- harq_process->Nl,
- r,
- &E)==-1) {
-#if UE_TIMING_TRACE
- stop_meas(dlsch_rate_unmatching_stats);
-#endif
- LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n");
- return(dlsch->max_turbo_iterations);
- } else
- {
-#if UE_TIMING_TRACE
- stop_meas(dlsch_rate_unmatching_stats);
-#endif
- }
- r_offset += E;
-
- /*
- printf("Subblock deinterleaving, d %p w %p\n",
- harq_process->d[r],
- harq_process->w);
- */
-#if UE_TIMING_TRACE
- start_meas(dlsch_deinterleaving_stats);
-#endif
- sub_block_deinterleaving_turbo(4+Kr,
- &harq_process->d[r][96],
-
- harq_process->w[r]);
-#if UE_TIMING_TRACE
- stop_meas(dlsch_deinterleaving_stats);
-#endif
-#ifdef DEBUG_DLSCH_DECODING
- /*
- if (r==0) {
- write_output("decoder_llr.m","decllr",dlsch_llr,G,1,0);
- write_output("decoder_in.m","dec",&harq_process->d[0][96],(3*8*Kr_bytes)+12,1,0);
- }
-
- printf("decoder input(segment %d) :",r);
- int i; for (i=0;i<(3*8*Kr_bytes)+12;i++)
- printf("%d : %d\n",i,harq_process->d[r][96+i]);
- printf("\n");*/
-#endif
-
-
- // printf("Clearing c, %p\n",harq_process->c[r]);
- memset(harq_process->c[r],0,Kr_bytes);
-
- // printf("done\n");
- if (harq_process->C == 1)
- crc_type = CRC24_A;
- else
- crc_type = CRC24_B;
-
- /*
- printf("decoder input(segment %d)\n",r);
- for (i=0;i<(3*8*Kr_bytes)+12;i++)
- if ((harq_process->d[r][96+i]>7) ||
- (harq_process->d[r][96+i] < -8))
- printf("%d : %d\n",i,harq_process->d[r][96+i]);
- printf("\n");
- */
-
- //#ifndef __AVX2__
-#if 1
- if (err_flag == 0) {
-/*
- LOG_I(PHY, "turbo algo Kr=%d cb_cnt=%d C=%d nbRB=%d crc_type %d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d maxIter %d\n",
- Kr,r,harq_process->C,harq_process->nb_rb,crc_type,A,harq_process->TBS,
- harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round,dlsch->max_turbo_iterations);
-*/
- if (llr8_flag) {
- AssertFatal (Kr >= 256, "turbo algo issue Kr=%d cb_cnt=%d C=%d nbRB=%d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d\n",
- Kr,r,harq_process->C,harq_process->nb_rb,A,harq_process->TBS,harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round);
- }
-#if UE_TIMING_TRACE
- start_meas(dlsch_turbo_decoding_stats);
-#endif
- LOG_D(PHY,"AbsSubframe %d.%d Start turbo segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1);
- ret = tc
- (&harq_process->d[r][96],
- NULL,
- harq_process->c[r],
- NULL,
- Kr,
- f1f2mat_old[iind*2],
- f1f2mat_old[(iind*2)+1],
- dlsch->max_turbo_iterations,
- crc_type,
- (r==0) ? harq_process->F : 0,
- &phy_vars_ue->dlsch_tc_init_stats,
- &phy_vars_ue->dlsch_tc_alpha_stats,
- &phy_vars_ue->dlsch_tc_beta_stats,
- &phy_vars_ue->dlsch_tc_gamma_stats,
- &phy_vars_ue->dlsch_tc_ext_stats,
- &phy_vars_ue->dlsch_tc_intl1_stats,
- &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1);
-
-#if UE_TIMING_TRACE
- stop_meas(dlsch_turbo_decoding_stats);
-#endif
- }
-#else
- if ((harq_process->C == 1) ||
- ((r==harq_process->C-1) && (skipped_last==0))) { // last segment with odd number of segments
-
-#if UE_TIMING_TRACE
- start_meas(dlsch_turbo_decoding_stats);
-#endif
- ret = tc
- (&harq_process->d[r][96],
- harq_process->c[r],
- Kr,
- f1f2mat_old[iind*2],
- f1f2mat_old[(iind*2)+1],
- dlsch->max_turbo_iterations,
- crc_type,
- (r==0) ? harq_process->F : 0,
- &phy_vars_ue->dlsch_tc_init_stats,
- &phy_vars_ue->dlsch_tc_alpha_stats,
- &phy_vars_ue->dlsch_tc_beta_stats,
- &phy_vars_ue->dlsch_tc_gamma_stats,
- &phy_vars_ue->dlsch_tc_ext_stats,
- &phy_vars_ue->dlsch_tc_intl1_stats,
- &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1);
- #if UE_TIMING_TRACE
- stop_meas(dlsch_turbo_decoding_stats);
-#endif
- // printf("single decode, exit\n");
- // exit(-1);
- }
- else {
- // we can merge code segments
- if ((skipped_last == 0) && (rC-1)) {
- skipped_last = 1;
- Kr_last = Kr;
- }
- 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]);
-#endif
-#if UE_TIMING_TRACE
- start_meas(dlsch_turbo_decoding_stats);
-#endif
-#ifdef DEBUG_DLSCH_DECODING
- printf("double decoding segments %d,%d (%p,%p)\n",r-1,r,&harq_process->d[r-1][96],&harq_process->d[r][96]);
-#endif
- ret = tc_2cw
- (&harq_process->d[r-1][96],
- &harq_process->d[r][96],
- harq_process->c[r-1],
- harq_process->c[r],
- Kr,
- f1f2mat_old[iind*2],
- f1f2mat_old[(iind*2)+1],
- dlsch->max_turbo_iterations,
- crc_type,
- (r==0) ? harq_process->F : 0,
- &phy_vars_ue->dlsch_tc_init_stats,
- &phy_vars_ue->dlsch_tc_alpha_stats,
- &phy_vars_ue->dlsch_tc_beta_stats,
- &phy_vars_ue->dlsch_tc_gamma_stats,
- &phy_vars_ue->dlsch_tc_ext_stats,
- &phy_vars_ue->dlsch_tc_intl1_stats,
- &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1);
- /*
- ret = tc
- (&harq_process->d[r-1][96],
- harq_process->c[r-1],
- Kr_last,
- f1f2mat_old[iind*2],
- f1f2mat_old[(iind*2)+1],
- dlsch->max_turbo_iterations,
- crc_type,
- (r==0) ? harq_process->F : 0,
- &phy_vars_ue->dlsch_tc_init_stats,
- &phy_vars_ue->dlsch_tc_alpha_stats,
- &phy_vars_ue->dlsch_tc_beta_stats,
- &phy_vars_ue->dlsch_tc_gamma_stats,
- &phy_vars_ue->dlsch_tc_ext_stats,
- &phy_vars_ue->dlsch_tc_intl1_stats,
- &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1);
-
- exit(-1);*/
-#if UE_TIMING_TRACE
- stop_meas(dlsch_turbo_decoding_stats);
-#endif
- }
- else { // Kr_last != Kr
-#if UE_TIMING_TRACE
- start_meas(dlsch_turbo_decoding_stats);
-#endif
- ret = tc
- (&harq_process->d[r-1][96],
- harq_process->c[r-1],
- Kr_last,
- f1f2mat_old[iind*2],
- f1f2mat_old[(iind*2)+1],
- dlsch->max_turbo_iterations,
- crc_type,
- (r==0) ? harq_process->F : 0,
- &phy_vars_ue->dlsch_tc_init_stats,
- &phy_vars_ue->dlsch_tc_alpha_stats,
- &phy_vars_ue->dlsch_tc_beta_stats,
- &phy_vars_ue->dlsch_tc_gamma_stats,
- &phy_vars_ue->dlsch_tc_ext_stats,
- &phy_vars_ue->dlsch_tc_intl1_stats,
- &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1);
-#if UE_TIMING_TRACE
- stop_meas(dlsch_turbo_decoding_stats);
-
- start_meas(dlsch_turbo_decoding_stats);
-#endif
-
- ret = tc
- (&harq_process->d[r][96],
- harq_process->c[r],
- Kr,
- f1f2mat_old[iind*2],
- f1f2mat_old[(iind*2)+1],
- dlsch->max_turbo_iterations,
- crc_type,
- (r==0) ? harq_process->F : 0,
- &phy_vars_ue->dlsch_tc_init_stats,
- &phy_vars_ue->dlsch_tc_alpha_stats,
- &phy_vars_ue->dlsch_tc_beta_stats,
- &phy_vars_ue->dlsch_tc_gamma_stats,
- &phy_vars_ue->dlsch_tc_ext_stats,
- &phy_vars_ue->dlsch_tc_intl1_stats,
- &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1);
-
-#if UE_TIMING_TRACE
-
- stop_meas(dlsch_turbo_decoding_stats);
-
- /*printf("Segmentation: C %d r %d, dlsch_rate_unmatching_stats %5.3f dlsch_deinterleaving_stats %5.3f dlsch_turbo_decoding_stats %5.3f \n",
- harq_process->C,
- r,
- dlsch_rate_unmatching_stats->p_time/(cpuf*1000.0),
- dlsch_deinterleaving_stats->p_time/(cpuf*1000.0),
- dlsch_turbo_decoding_stats->p_time/(cpuf*1000.0));*/
-#endif
- }
- }
- }
-#endif
-
-
- if ((err_flag == 0) && (ret>=(1+dlsch->max_turbo_iterations))) {// a Code segment is in error so break;
- LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1);
- err_flag = 1;
- }
- }
-
- int32_t frame_rx_prev = frame;
- int32_t subframe_rx_prev = subframe - 1;
- if (subframe_rx_prev < 0) {
- frame_rx_prev--;
- subframe_rx_prev += 10;
- }
- frame_rx_prev = frame_rx_prev%1024;
-
- if (err_flag == 1) {
-#if UE_DEBUG_TRACE
- LOG_I(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
- phy_vars_ue->Mod_id, frame, subframe, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
-#endif
- dlsch->harq_ack[subframe].ack = 0;
- dlsch->harq_ack[subframe].harq_id = harq_pid;
- dlsch->harq_ack[subframe].send_harq_status = 1;
- harq_process->errors[harq_process->round]++;
- harq_process->round++;
-
-
- // printf("Rate: [UE %d] DLSCH: Setting NACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
- if (harq_process->round >= dlsch->Mdlharq) {
- harq_process->status = SCH_IDLE;
- harq_process->round = 0;
- }
- if(is_crnti)
- {
- LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for subframe %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
- phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->status,harq_process->round,dlsch->Mdlharq,harq_process->TBS);
- }
-
- return((1+dlsch->max_turbo_iterations));
- } else {
-#if UE_DEBUG_TRACE
- LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d TBS %d mcs %d nb_rb %d\n",
- phy_vars_ue->Mod_id,subframe,harq_process->TBS,harq_process->mcs,harq_process->nb_rb);
-#endif
-
- harq_process->status = SCH_IDLE;
- harq_process->round = 0;
- dlsch->harq_ack[subframe].ack = 1;
- dlsch->harq_ack[subframe].harq_id = harq_pid;
- dlsch->harq_ack[subframe].send_harq_status = 1;
- //LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d)\n",
- // phy_vars_ue->Mod_id, frame, subframe, harq_pid, harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs);
-
- if(is_crnti)
- {
- LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round,harq_process->TBS);
- }
- //LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
-
- }
-
- // Reassembly of Transport block here
- offset = 0;
-
- /*
- printf("harq_pid %d\n",harq_pid);
- printf("F %d, Fbytes %d\n",harq_process->F,harq_process->F>>3);
- printf("C %d\n",harq_process->C);
- */
- for (r=0; rC; r++) {
- if (rCminus)
- Kr = harq_process->Kminus;
- else
- Kr = harq_process->Kplus;
-
- Kr_bytes = Kr>>3;
-
- // printf("Segment %d : Kr= %d bytes\n",r,Kr_bytes);
- if (r==0) {
- memcpy(harq_process->b,
- &harq_process->c[0][(harq_process->F>>3)],
- Kr_bytes - (harq_process->F>>3)- ((harq_process->C>1)?3:0));
- offset = Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0);
- // printf("copied %d bytes to b sequence (harq_pid %d)\n",
- // Kr_bytes - (harq_process->F>>3),harq_pid);
- // printf("b[0] = %x,c[%d] = %x\n",
- // harq_process->b[0],
- // harq_process->F>>3,
- // harq_process->c[0][(harq_process->F>>3)]);
- } else {
- memcpy(harq_process->b+offset,
- harq_process->c[r],
- Kr_bytes- ((harq_process->C>1)?3:0));
- offset += (Kr_bytes - ((harq_process->C>1)?3:0));
- }
- }
-
- dlsch->last_iteration_cnt = ret;
-
- return(ret);
-}
-
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
deleted file mode 100644
index 6284f279d8..0000000000
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
+++ /dev/null
@@ -1,6155 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-/*! \file PHY/LTE_TRANSPORT/dlsch_demodulation.c
- * \brief Top-level routines for demodulating the PDSCH physical channel from 36-211, V8.6 2009-03
- * \author R. Knopp, F. Kaltenberger,A. Bhamri, S. Aubert, X. Xiang
- * \date 2011
- * \version 0.1
- * \company Eurecom
- * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,ankit.bhamri@eurecom.fr,sebastien.aubert@eurecom.fr
- * \note
- * \warning
- */
-//#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "SCHED/defs.h"
-#include "defs.h"
-#include "extern.h"
-#include "PHY/sse_intrin.h"
-#include "T.h"
-
-#define NOCYGWIN_STATIC
-
-/* dynamic shift for LLR computation for TM3/4
- * set as command line argument, see lte-softmodem.c
- * default value: 0
- */
-int16_t dlsch_demod_shift = 0;
-int16_t interf_unaw_shift = 13;
-
-//#define DEBUG_HARQ
-
-#define DEBUG_PHY 1
-//#define DEBUG_DLSCH_DEMOD 1
-
-//#define DISABLE_LOG_X
-
-// [MCS][i_mod (0,1,2) = (2,4,6)]
-unsigned char offset_mumimo_llr_drange_fix=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
-{5,5,4},{5,5,5},{5,5,5},{3,3,3},{2,2,2},{2,2,2},{2,2,2}, // 16-QAM
-{2,2,1},{3,3,3},{3,3,3},{3,3,1},{2,2,2},{2,2,2},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; //64-QAM
-*/
- /*
- //first optimization try
- unsigned char offset_mumimo_llr_drange[29][3]={{7, 8, 7},{6, 6, 7},{6, 6, 7},{6, 6, 6},{5, 6, 6},{5, 5, 6},{5, 5, 6},{4, 5, 4},{4, 3, 4},{3, 2, 2},{6, 5, 5},{5, 4, 4},{5, 5, 4},{3, 3, 2},{2, 2, 1},{2, 1, 1},{2, 2, 2},{3, 3, 3},{3, 3, 2},{3, 3, 2},{3, 2, 1},{2, 2, 2},{2, 2, 2},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}};
- */
- //second optimization try
- /*
- unsigned char offset_mumimo_llr_drange[29][3]={{5, 8, 7},{4, 6, 8},{3, 6, 7},{7, 7, 6},{4, 7, 8},{4, 7, 4},{6, 6, 6},{3, 6, 6},{3, 6, 6},{1, 3, 4},{1, 1, 0},{3, 3, 2},{3, 4, 1},{4, 0, 1},{4, 2, 2},{3, 1, 2},{2, 1, 0},{2, 1, 1},{1, 0, 1},{1, 0, 1},{0, 0, 0},{1, 0, 0},{0, 0, 0},{0, 1, 0},{1, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}}; w
- */
-unsigned char offset_mumimo_llr_drange[29][3]= {{0, 6, 5},{0, 4, 5},{0, 4, 5},{0, 5, 4},{0, 5, 6},{0, 5, 3},{0, 4, 4},{0, 4, 4},{0, 3, 3},{0, 1, 2},{1, 1, 0},{1, 3, 2},{3, 4, 1},{2, 0, 0},{2, 2, 2},{1, 1, 1},{2, 1, 0},{2, 1, 1},{1, 0, 1},{1, 0, 1},{0, 0, 0},{1, 0, 0},{0, 0, 0},{0, 1, 0},{1, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}};
-
-
-extern void print_shorts(char *s,int16_t *x);
-
-
-int rx_pdsch(PHY_VARS_UE *ue,
- PDSCH_t type,
- unsigned char eNB_id,
- unsigned char eNB_id_i, //if this == ue->n_connected_eNB, we assume MU interference
- uint32_t frame,
- uint8_t subframe,
- unsigned char symbol,
- unsigned char first_symbol_flag,
- RX_type_t rx_type,
- unsigned char i_mod,
- unsigned char harq_pid)
-{
-
- LTE_UE_COMMON *common_vars = &ue->common_vars;
- LTE_UE_PDSCH **pdsch_vars;
- LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
- PHY_MEASUREMENTS *measurements = &ue->measurements;
- LTE_UE_DLSCH_t **dlsch;
-
- int avg[4];
- int avg_0[2];
- int avg_1[2];
-
-#if UE_TIMING_TRACE
- uint8_t slot = 0;
-#endif
-
- unsigned char aatx,aarx;
-
- unsigned short nb_rb = 0, round;
- int avgs = 0, 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 = -1;
- int32_t codeword_TB1 = -1;
-
-
-
- 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];
- 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];
- beamforming_mode = 0;
- break;
-
- case PDSCH:
- pdsch_vars = ue->pdsch_vars[ue->current_thread_id[subframe]];
- dlsch = ue->dlsch[ue->current_thread_id[subframe]][eNB_id];
- //printf("status TB0 = %d, status TB1 = %d \n", dlsch[0]->harq_processes[harq_pid]->status, dlsch[1]->harq_processes[harq_pid]->status);
- LOG_D(PHY,"AbsSubframe %d.%d / Sym %d harq_pid %d, harq status %d.%d \n",
- frame,subframe,symbol,harq_pid,
- dlsch[0]->harq_processes[harq_pid]->status,
- dlsch[1]->harq_processes[harq_pid]->status);
-
- 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("[DEMOD] I am assuming both TBs are 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;
-#ifdef DEBUG_HARQ
- printf("[DEMOD] I am assuming only TB0 is active\n");
-#endif
- }
- 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;
-#ifdef DEBUG_HARQ
- printf("[DEMOD] I am assuming only TB1 is active, it is in cw %d\n", dlsch0_harq->codeword);
-#endif
- }
- 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;
-
- default:
- LOG_E(PHY,"[UE][FATAL] Frame %d subframe %d: Unknown PDSCH format %d\n",ue->proc.proc_rxtx[0].frame_rx,subframe,type);
- 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;
- //printf("round = %d\n", round);
-
- if (eNB_id > 2) {
- LOG_W(PHY,"dlsch_demodulation.c: Illegal eNB_id %d\n",eNB_id);
- return(-1);
- }
-
- if (!common_vars) {
- LOG_W(PHY,"dlsch_demodulation.c: Null common_vars\n");
- return(-1);
- }
-
- if (!dlsch[0]) {
- LOG_W(PHY,"dlsch_demodulation.c: Null dlsch_ue pointer\n");
- return(-1);
- }
-
- if (!pdsch_vars) {
- LOG_W(PHY,"dlsch_demodulation.c: Null pdsch_vars pointer\n");
- return(-1);
- }
-
- if (!frame_parms) {
- LOG_W(PHY,"dlsch_demodulation.c: Null frame_parms\n");
- 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 UE_TIMING_TRACE
- if(symbol > ue->frame_parms.symbols_per_tti>>1)
- {
- slot = 1;
- }
-#endif
-
-#ifdef DEBUG_HARQ
- printf("Demod dlsch0_harq->pmi_alloc %d\n", dlsch0_harq->pmi_alloc);
-#endif
-
- 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
-
-#if UE_TIMING_TRACE
- start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
-#endif
- nb_rb = dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
- common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id],
- pdsch_vars[eNB_id]->rxdataF_ext,
- pdsch_vars[eNB_id]->dl_ch_estimates_ext,
- dlsch0_harq->pmi_alloc,
- pdsch_vars[eNB_id]->pmi_ext,
- rballoc,
- symbol,
- subframe,
- ue->high_speed_flag,
- 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 (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[ue->current_thread_id[subframe]].rxdataF,
- common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id_i],
- pdsch_vars[eNB_id_i]->rxdataF_ext,
- pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
- dlsch0_harq->pmi_alloc,
- pdsch_vars[eNB_id_i]->pmi_ext,
- rballoc,
- symbol,
- subframe,
- ue->high_speed_flag,
- frame_parms,
- dlsch0_harq->mimo_mode);
- else
- nb_rb = dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
- common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id],
- pdsch_vars[eNB_id_i]->rxdataF_ext,
- pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
- dlsch0_harq->pmi_alloc,
- pdsch_vars[eNB_id_i]->pmi_ext,
- rballoc,
- symbol,
- subframe,
- ue->high_speed_flag,
- 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[ue->current_thread_id[subframe]].rxdataF,
- common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id],
- pdsch_vars[eNB_id]->rxdataF_ext,
- pdsch_vars[eNB_id]->dl_ch_estimates_ext,
- dlsch0_harq->pmi_alloc,
- pdsch_vars[eNB_id]->pmi_ext,
- rballoc,
- symbol,
- subframe,
- ue->high_speed_flag,
- frame_parms);
-
- 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[ue->current_thread_id[subframe]].rxdataF,
- common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id_i],
- pdsch_vars[eNB_id_i]->rxdataF_ext,
- pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
- dlsch0_harq->pmi_alloc,
- pdsch_vars[eNB_id_i]->pmi_ext,
- rballoc,
- symbol,
- subframe,
- ue->high_speed_flag,
- frame_parms);
- else
- nb_rb = dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
- common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id],
- pdsch_vars[eNB_id_i]->rxdataF_ext,
- pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
- dlsch0_harq->pmi_alloc,
- pdsch_vars[eNB_id_i]->pmi_ext,
- rballoc,
- symbol,
- subframe,
- ue->high_speed_flag,
- frame_parms);
- }
- } else if (beamforming_mode==7) { //else if beamforming_mode == 7
- nb_rb = dlsch_extract_rbs_TM7(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
- pdsch_vars[eNB_id]->dl_bf_ch_estimates,
- pdsch_vars[eNB_id]->rxdataF_ext,
- pdsch_vars[eNB_id]->dl_bf_ch_estimates_ext,
- 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");
- }
-
- //printf("nb_rb = %d, eNB_id %d\n",nb_rb,eNB_id);
- if (nb_rb==0) {
- // LOG_D(PHY,"dlsch_demodulation.c: nb_rb=0\n");
- return(-1);
- }
-
-
-#if UE_TIMING_TRACE
- stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
-#if DISABLE_LOG_X
- printf("[AbsSFN %d.%d] Slot%d Symbol %d Flag %d type %d: Pilot/Data extraction %5.2f \n",frame,subframe,slot,
- symbol,ue->high_speed_flag,type,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
-#else
- LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d Flag %d type %d: Pilot/Data extraction %5.2f \n",frame,subframe,slot,symbol,
- ue->high_speed_flag,type,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
-#endif
-#endif
-
-
-#if UE_TIMING_TRACE
- start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
-#endif
- aatx = frame_parms->nb_antenna_ports_eNB;
- aarx = frame_parms->nb_antennas_rx;
-
- dlsch_scale_channel(pdsch_vars[eNB_id]->dl_ch_estimates_ext,
- frame_parms,
- dlsch,
- symbol,
- nb_rb);
-
- 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 UE_TIMING_TRACE
- stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
-#if DISABLE_LOG_X
- printf("[AbsSFN %d.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
-#else
- LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
-#endif
-#endif
-
-#if UE_TIMING_TRACE
- start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
-#endif
- 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);
-
- LOG_D(PHY,"Channel Level TM34 avg_0 %d, avg_1 %d, rx_type %d, rx_standard %d, dlsch_demod_shift %d \n", avg_0[0],
- avg_1[0], rx_type, rx_standard, dlsch_demod_shift);
- if (rx_type>rx_standard) {
- avg_0[0] = (log2_approx(avg_0[0])/2) + dlsch_demod_shift;// + 2 ;//+ 4;
- avg_1[0] = (log2_approx(avg_1[0])/2) + dlsch_demod_shift;// + 2 ;//+ 4;
- pdsch_vars[eNB_id]->log2_maxh0 = cmax(avg_0[0],0);
- pdsch_vars[eNB_id]->log2_maxh1 = cmax(avg_1[0],0);
- // printf("dlsch_demod_shift %d\n", dlsch_demod_shift);
- }
- 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);
- }
- }
- 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 UE_DEBUG_TRACE
- LOG_D(PHY,"[DLSCH] AbsSubframe %d.%d log2_maxh = %d [log2_maxh0 %d log2_maxh1 %d] (%d,%d)\n",
- frame%1024,subframe, pdsch_vars[eNB_id]->log2_maxh,
- pdsch_vars[eNB_id]->log2_maxh0,
- pdsch_vars[eNB_id]->log2_maxh1,
- avg[0],avgs);
- //LOG_D(PHY,"[DLSCH] mimo_mode = %d\n", dlsch0_harq->mimo_mode);
-#endif
-
- //wait until pdcch is decoded
- //proc->channel_level = 1;
- }
-
- /*
- uint32_t wait = 0;
- while(proc->channel_level == 0)
- {
- usleep(1);
- wait++;
- }
- */
-
-#if T_TRACER
- if (type == PDSCH)
- {
- T(T_UE_PHY_PDSCH_ENERGY, T_INT(eNB_id), T_INT(frame%1024), T_INT(subframe),
- T_INT(avg[0]), T_INT(avg[1]), T_INT(avg[2]), T_INT(avg[3]));
- }
-#endif
-
-#if UE_TIMING_TRACE
- stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
-#if DISABLE_LOG_X
- printf("[AbsSFN %d.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f \n",frame,subframe,slot,symbol,first_symbol_flag,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
-#else
- LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f \n",frame,subframe,slot,symbol,first_symbol_flag,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
-#endif
-#endif
-
-
-#if UE_TIMING_TRACE
- start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
-#endif
-// Now channel compensation
- if (dlsch0_harq->mimo_moderxdataF_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,
- (aatx>1) ? pdsch_vars[eNB_id]->rho : NULL,
- frame_parms,
- symbol,
- first_symbol_flag,
- dlsch0_harq->Qm,
- nb_rb,
- pdsch_vars[eNB_id]->log2_maxh,
- 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)) {
- 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,
- pdsch_vars[eNB_id_i]->rxdataF_comp0,
- (aatx>1) ? pdsch_vars[eNB_id_i]->rho : NULL,
- frame_parms,
- symbol,
- first_symbol_flag,
- i_mod,
- nb_rb,
- pdsch_vars[eNB_id]->log2_maxh,
- 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
-
- 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[harq_pid][round],
- pdsch_vars[eNB_id]->log2_maxh);
- }
- } 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],
- 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_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, // 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_rho2_ext,
- 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 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,
- measurements,
- eNB_id,
- symbol,
- dlsch0_harq->Qm,
- nb_rb,
- pdsch_vars[eNB_id]->log2_maxh,
- dlsch0_harq->dl_power_off);
-
- 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,
- pdsch_vars[eNB_id_i]->dl_ch_magb0,
- pdsch_vars[eNB_id_i]->rxdataF_comp0,
- pdsch_vars[eNB_id_i]->pmi_ext,
- frame_parms,
- 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);
- }
-#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[harq_pid][round],
- pdsch_vars[eNB_id]->log2_maxh);
- } 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,
- pdsch_vars[eNB_id]->dl_ch_magb0,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id]->pmi_ext,
- frame_parms,
- 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,
- measurements); // log2_maxh+I0_shift
- }
-
-#if UE_TIMING_TRACE
- stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
-#if DISABLE_LOG_X
- printf("[AbsSFN %d.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n",frame,subframe,slot,symbol,pdsch_vars[eNB_id]->log2_maxh,proc->channel_level,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
-#else
- LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n",frame,subframe,slot,symbol,pdsch_vars[eNB_id]->log2_maxh,proc->channel_level,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
-#endif
-#endif
-// MRC
-#if UE_TIMING_TRACE
- start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
-#endif
-
- 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_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[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,
- rx_type==rx_IC_single_stream);
- }
- }
- // printf("Combining");
- if ((dlsch0_harq->mimo_mode == SISO) ||
- ((dlsch0_harq->mimo_mode >= UNIFORM_PRECODING11) &&
- (dlsch0_harq->mimo_mode <= PUSCH_PRECODING0)) ||
- (dlsch0_harq->mimo_mode == TM7)) {
- /*
- dlsch_siso(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp,
- pdsch_vars[eNB_id_i]->rxdataF_comp,
- symbol,
- 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);
- }
-
- // 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
- }
-
-#if UE_TIMING_TRACE
- stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
-#if DISABLE_LOG_X
- printf("[AbsSFN %d.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
-#else
- LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
-#endif
-#endif
-
-#if UE_TIMING_TRACE
- start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
-#endif
- //printf("LLR dlsch0_harq->Qm %d rx_type %d cw0 %d cw1 %d symbol %d \n",dlsch0_harq->Qm,rx_type,codeword_TB0,codeword_TB1,symbol);
- // compute LLRs
- // -> // compute @pointer where llrs should filled for this ofdm-symbol
- int8_t *pllr_symbol_cw0;
- int8_t *pllr_symbol_cw1;
- uint32_t llr_offset_symbol;
- llr_offset_symbol = pdsch_vars[eNB_id]->llr_offset[symbol];
- pllr_symbol_cw0 = (int8_t*)pdsch_vars[eNB_id]->llr[0];
- pllr_symbol_cw1 = (int8_t*)pdsch_vars[eNB_id]->llr[1];
- pllr_symbol_cw0 += llr_offset_symbol;
- pllr_symbol_cw1 += llr_offset_symbol;
-
- LOG_I(PHY,"compute LLRs [AbsSubframe %d.%d-%d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %p @LLR Buff(symb) %p\n",
- frame, subframe,symbol,
- nb_rb,dlsch0_harq->Qm,
- pdsch_vars[eNB_id]->llr_length[symbol],
- pdsch_vars[eNB_id]->llr_offset[symbol],
- (int16_t*)pdsch_vars[eNB_id]->llr[0],
- pllr_symbol_cw0);
-
- switch (dlsch0_harq->Qm) {
- case 2 :
- if ((rx_type==rx_standard) || (codeword_TB1 == -1)) {
-
-
- dlsch_qpsk_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- (int16_t*)pllr_symbol_cw0,
- symbol,
- first_symbol_flag,
- nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
- beamforming_mode);
-
- } else if (codeword_TB0 == -1){
-
- dlsch_qpsk_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- (int16_t*)pllr_symbol_cw1,
- symbol,
- first_symbol_flag,
- nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
- beamforming_mode);
- }
- 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 ((rx_type==rx_standard ) || (codeword_TB1 == -1)) {
- 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);
- } else if (codeword_TB0 == -1){
- dlsch_16qam_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id]->llr[1],
- 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_2ndstream,
- beamforming_mode);
- }
- 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 ((rx_type==rx_standard) || (codeword_TB1 == -1)) {
- dlsch_64qam_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- (int16_t*)pllr_symbol_cw0,
- 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]->llr_offset[symbol],
- beamforming_mode);
- } else if (codeword_TB0 == -1){
- dlsch_64qam_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- (int16_t*)pllr_symbol_cw1,
- 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]->llr_offset[symbol],
- beamforming_mode);
- }
- 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,
- (int16_t*)pllr_symbol_cw0,
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol),
- pdsch_vars[eNB_id]->llr_offset[symbol]);
- 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],
- (int16_t*)pllr_symbol_cw1,
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,subframe,symbol),
- pdsch_vars[eNB_id]->llr_offset[symbol]);
- }
- }
- }
- 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,
- (int16_t*)pllr_symbol_cw0,
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
- 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,
- (int16_t*)pllr_symbol_cw0,
- 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]->llr_offset[symbol],
- beamforming_mode);
- }
- break;
- default:
- LOG_W(PHY,"rx_dlsch.c : Unknown mod_order!!!!\n");
- return(-1);
- break;
- }
- }
-
-#if UE_TIMING_TRACE
- stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]);
-#if DISABLE_LOG_X
- printf("[AbsSFN %d.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
-#else
- LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0));
-#endif
-#endif
-// Please keep it: useful for debugging
-#if 0
- if( (symbol == 13) && (subframe==0) && (dlsch0_harq->Qm == 6) /*&& (nb_rb==25)*/)
- {
- LOG_E(PHY,"Dump Phy Chan Est \n");
- if(1)
- {
-#if 1
- write_output("rxdataF0.m" , "rxdataF0", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[0][0],14*frame_parms->ofdm_symbol_size,1,1);
- //write_output("rxdataF1.m" , "rxdataF1", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[0][0],14*frame_parms->ofdm_symbol_size,1,1);
- write_output("dl_ch_estimates00.m", "dl_ch_estimates00", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][0][0],14*frame_parms->ofdm_symbol_size,1,1);
- //write_output("dl_ch_estimates01.m", "dl_ch_estimates01", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][1][0],14*frame_parms->ofdm_symbol_size,1,1);
- //write_output("dl_ch_estimates10.m", "dl_ch_estimates10", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][2][0],14*frame_parms->ofdm_symbol_size,1,1);
- //write_output("dl_ch_estimates11.m", "dl_ch_estimates11", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][3][0],14*frame_parms->ofdm_symbol_size,1,1);
-
-
- //write_output("rxdataF_ext00.m" , "rxdataF_ext00", &pdsch_vars[eNB_id]->rxdataF_ext[0][0],14*frame_parms->N_RB_DL*12,1,1);
- //write_output("rxdataF_ext01.m" , "rxdataF_ext01", &pdsch_vars[eNB_id]->rxdataF_ext[1][0],14*frame_parms->N_RB_DL*12,1,1);
- //write_output("rxdataF_ext10.m" , "rxdataF_ext10", &pdsch_vars[eNB_id]->rxdataF_ext[2][0],14*frame_parms->N_RB_DL*12,1,1);
- //write_output("rxdataF_ext11.m" , "rxdataF_ext11", &pdsch_vars[eNB_id]->rxdataF_ext[3][0],14*frame_parms->N_RB_DL*12,1,1);
- write_output("dl_ch_estimates_ext00.m", "dl_ch_estimates_ext00", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[0][0],14*frame_parms->N_RB_DL*12,1,1);
- //write_output("dl_ch_estimates_ext01.m", "dl_ch_estimates_ext01", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[1][0],14*frame_parms->N_RB_DL*12,1,1);
- //write_output("dl_ch_estimates_ext10.m", "dl_ch_estimates_ext10", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[2][0],14*frame_parms->N_RB_DL*12,1,1);
- //write_output("dl_ch_estimates_ext11.m", "dl_ch_estimates_ext11", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[3][0],14*frame_parms->N_RB_DL*12,1,1);
- write_output("rxdataF_comp00.m","rxdataF_comp00", &pdsch_vars[eNB_id]->rxdataF_comp0[0][0],14*frame_parms->N_RB_DL*12,1,1);
- //write_output("rxdataF_comp01.m","rxdataF_comp01", &pdsch_vars[eNB_id]->rxdataF_comp0[1][0],14*frame_parms->N_RB_DL*12,1,1);
- //write_output("rxdataF_comp10.m","rxdataF_comp10", &pdsch_vars[eNB_id]->rxdataF_comp1[harq_pid][round][0][0],14*frame_parms->N_RB_DL*12,1,1);
- //write_output("rxdataF_comp11.m","rxdataF_comp11", &pdsch_vars[eNB_id]->rxdataF_comp1[harq_pid][round][1][0],14*frame_parms->N_RB_DL*12,1,1);
-#endif
- write_output("llr0.m","llr0", &pdsch_vars[eNB_id]->llr[0][0],(14*nb_rb*12*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm),1,0);
- //write_output("llr1.m","llr1", &pdsch_vars[eNB_id]->llr[1][0],(14*nb_rb*12*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm),1,0);
-
-
- AssertFatal(0," ");
- }
-
- }
-#endif
-
- T(T_UE_PHY_PDSCH_IQ, T_INT(eNB_id), T_INT(frame%1024),
- T_INT(subframe), T_INT(nb_rb),
- T_INT(frame_parms->N_RB_UL), T_INT(frame_parms->symbols_per_tti),
- T_BUFFER(&pdsch_vars[eNB_id]->rxdataF_comp0[eNB_id][0],
- 2 * /* ulsch[UE_id]->harq_processes[harq_pid]->nb_rb */ frame_parms->N_RB_UL *12*frame_parms->symbols_per_tti*2));
-
- return 0;
-}
-
-//==============================================================================================
-// Pre-processing for LLR computation
-//==============================================================================================
-
-void dlsch_channel_compensation(int **rxdataF_ext,
- int **dl_ch_estimates_ext,
- int **dl_ch_mag,
- int **dl_ch_magb,
- int **rxdataF_comp,
- int **rho,
- LTE_DL_FRAME_PARMS *frame_parms,
- unsigned char symbol,
- uint8_t first_symbol_flag,
- unsigned char mod_order,
- unsigned short nb_rb,
- unsigned char output_shift,
- PHY_MEASUREMENTS *measurements)
-{
-
-#if defined(__i386) || defined(__x86_64)
-
- unsigned short rb;
- unsigned char aatx,aarx,symbol_mod,pilots=0;
- __m128i *dl_ch128,*dl_ch128_2,*dl_ch_mag128,*dl_ch_mag128b,*rxdataF128,*rxdataF_comp128,*rho128;
- __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b;
-
- 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->nb_antenna_ports_eNB==1) // 10 out of 12 so don't reduce size
- nb_rb=1+(5*nb_rb/6);
- else
- pilots=1;
- }
-
- for (aatx=0; aatxnb_antenna_ports_eNB; aatx++) {
- if (mod_order == 4) {
- QAM_amp128 = _mm_set1_epi16(QAM16_n1); // 2/sqrt(10)
- QAM_amp128b = _mm_setzero_si128();
- } else if (mod_order == 6) {
- QAM_amp128 = _mm_set1_epi16(QAM64_n1); //
- QAM_amp128b = _mm_set1_epi16(QAM64_n2);
- }
-
- // printf("comp: rxdataF_comp %p, symbol %d\n",rxdataF_comp[0],symbol);
-
- for (aarx=0; aarxnb_antennas_rx; aarx++) {
-
- dl_ch128 = (__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag128 = (__m128i *)&dl_ch_mag[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag128b = (__m128i *)&dl_ch_magb[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12];
- rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12];
- rxdataF_comp128 = (__m128i *)&rxdataF_comp[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12];
-
-
- for (rb=0; rb2) {
- // get channel amplitude if not QPSK
-
- mmtmpD0 = _mm_madd_epi16(dl_ch128[0],dl_ch128[0]);
- mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
-
- mmtmpD1 = _mm_madd_epi16(dl_ch128[1],dl_ch128[1]);
- mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
-
- mmtmpD0 = _mm_packs_epi32(mmtmpD0,mmtmpD1);
-
- // store channel magnitude here in a new field of dlsch
-
- dl_ch_mag128[0] = _mm_unpacklo_epi16(mmtmpD0,mmtmpD0);
- 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]);
- 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);
- dl_ch_mag128[1] = _mm_slli_epi16(dl_ch_mag128[1],1);
-
- if (pilots==0) {
- mmtmpD0 = _mm_madd_epi16(dl_ch128[2],dl_ch128[2]);
- mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
- mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0);
-
- dl_ch_mag128[2] = _mm_unpacklo_epi16(mmtmpD1,mmtmpD1);
- dl_ch_mag128b[2] = dl_ch_mag128[2];
-
- dl_ch_mag128[2] = _mm_mulhi_epi16(dl_ch_mag128[2],QAM_amp128);
- dl_ch_mag128[2] = _mm_slli_epi16(dl_ch_mag128[2],1);
- }
-
- dl_ch_mag128b[0] = _mm_mulhi_epi16(dl_ch_mag128b[0],QAM_amp128b);
- dl_ch_mag128b[0] = _mm_slli_epi16(dl_ch_mag128b[0],1);
-
-
- dl_ch_mag128b[1] = _mm_mulhi_epi16(dl_ch_mag128b[1],QAM_amp128b);
- dl_ch_mag128b[1] = _mm_slli_epi16(dl_ch_mag128b[1],1);
-
- 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);
- }
- }
-
- // multiply by conjugated channel
- mmtmpD0 = _mm_madd_epi16(dl_ch128[0],rxdataF128[0]);
- // print_ints("re",&mmtmpD0);
-
- // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
- mmtmpD1 = _mm_shufflelo_epi16(dl_ch128[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);
- 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);
- mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
- mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
- // print_ints("c0",&mmtmpD2);
- // 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);
-
- // multiply by conjugated channel
- mmtmpD0 = _mm_madd_epi16(dl_ch128[1],rxdataF128[1]);
- // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
- mmtmpD1 = _mm_shufflelo_epi16(dl_ch128[1],_MM_SHUFFLE(2,3,0,1));
- mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
- 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);
- mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
- mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
-
- rxdataF_comp128[1] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
- // print_shorts("rx:",rxdataF128+1);
- // print_shorts("ch:",dl_ch128+1);
- // print_shorts("pack:",rxdataF_comp128+1);
-
- if (pilots==0) {
- // multiply by conjugated channel
- mmtmpD0 = _mm_madd_epi16(dl_ch128[2],rxdataF128[2]);
- // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
- mmtmpD1 = _mm_shufflelo_epi16(dl_ch128[2],_MM_SHUFFLE(2,3,0,1));
- mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
- 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);
- mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
- mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
-
- rxdataF_comp128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
- // print_shorts("rx:",rxdataF128+2);
- // print_shorts("ch:",dl_ch128+2);
- // print_shorts("pack:",rxdataF_comp128+2);
-
- dl_ch128+=3;
- dl_ch_mag128+=3;
- dl_ch_mag128b+=3;
- rxdataF128+=3;
- 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+=2;
- dl_ch_mag128+=2;
- dl_ch_mag128b+=2;
- rxdataF128+=2;
- rxdataF_comp128+=2;
- }
-
- }
- }
- }
-
- if (rho) {
-
-
- for (aarx=0; aarxnb_antennas_rx; aarx++) {
- rho128 = (__m128i *)&rho[aarx][symbol*frame_parms->N_RB_DL*12];
- dl_ch128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12];
- dl_ch128_2 = (__m128i *)&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);
- }
- }
- }
-
- _mm_empty();
- _m_empty();
-
-#elif defined(__arm__)
-
-
- unsigned short rb;
- unsigned char aatx,aarx,symbol_mod,pilots=0;
-
- int16x4_t *dl_ch128,*dl_ch128_2,*rxdataF128;
- int32x4_t mmtmpD0,mmtmpD1,mmtmpD0b,mmtmpD1b;
- int16x8_t *dl_ch_mag128,*dl_ch_mag128b,mmtmpD2,mmtmpD3,mmtmpD4;
- int16x8_t QAM_amp128,QAM_amp128b;
- int16x4x2_t *rxdataF_comp128,*rho128;
-
- int16_t conj[4]__attribute__((aligned(16))) = {1,-1,1,-1};
- int32x4_t output_shift128 = vmovq_n_s32(-(int32_t)output_shift);
-
- 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->nb_antenna_ports_eNB==1) { // 10 out of 12 so don't reduce size
- nb_rb=1+(5*nb_rb/6);
- }
- else {
- pilots=1;
- }
- }
-
- for (aatx=0; aatxnb_antenna_ports_eNB; aatx++) {
- 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_ch128 = (int16x4_t*)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag128 = (int16x8_t*)&dl_ch_mag[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12];
- 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));
- }
-
- 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])]
-
- 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 = 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));
-
- 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)));
-
- 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);
- }
- }
- }
-#endif
-}
-
-#if defined(__x86_64__) || defined(__i386__)
-
-void prec2A_TM56_128(unsigned char pmi,__m128i *ch0,__m128i *ch1)
-{
-
- __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] = _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] = _mm_subs_epi16(ch0[0],ch1[0]);
- // print_shorts("phase 1 :ch0-ch1",ch0);
- break;
-
- case 2 : // +1 +j
- 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] = _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] = _mm_mulhi_epi16(ch0[0],amp);
- ch0[0] = _mm_slli_epi16(ch0[0],1);
-
- _mm_empty();
- _m_empty();
-}
-#elif defined(__arm__)
-void prec2A_TM56_128(unsigned char pmi,__m128i *ch0,__m128i *ch1) {
-
- // sqrt(2) is already taken into account in computation sqrt_rho_a, sqrt_rho_b,
- //so removed it
-
- //__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] = _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] = _mm_subs_epi16(ch0[0],ch1[0]);
- // print_shorts("phase 1 :ch0-ch1",ch0);
- break;
- case 2 : // +1 +j
- 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] = _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] = _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} ;
-
-void prec2A_TM3_128(__m128i *ch0,__m128i *ch1) {
-
- __m128i amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15);
-
- __m128i tmp0,tmp1;
-
- //_mm_mulhi_epi16
- // print_shorts("prec2A_TM3 ch0 (before):",ch0);
- // print_shorts("prec2A_TM3 ch1 (before):",ch1);
-
- tmp0 = ch0[0];
- tmp1 = _mm_sign_epi16(ch1[0],((__m128i*)&TM3_prec)[0]);
- // print_shorts("prec2A_TM3 ch1*s (mid):",(__m128i*)TM3_prec);
-
- ch0[0] = _mm_adds_epi16(ch0[0],tmp1);
- ch1[0] = _mm_subs_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_TM3 ch0 (mid):",&tmp0);
- // print_shorts("prec2A_TM3 ch1 (mid):",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);
- //ch1[0] = _mm_srai_epi16(ch1[0],1);
-
- // print_shorts("prec2A_TM3 ch0 (after):",ch0);
- // print_shorts("prec2A_TM3 ch1 (after):",ch1);
-
- _mm_empty();
- _m_empty();
-}
-
-// pmi = 0 => stream 0 (1,1), stream 1 (1,-1)
-// pmi = 1 => stream 0 (1,j), stream 2 (1,-j)
-
-void prec2A_TM4_128(int pmi,__m128i *ch0,__m128i *ch1) {
-
-// sqrt(2) is already taken into account in computation sqrt_rho_a, sqrt_rho_b,
-//so divide by 2 is replaced by divide by sqrt(2).
-
- // printf ("demod pmi=%d\n", pmi);
- __m128i amp;
- amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15);
- __m128i tmp0,tmp1;
-
- // 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_subs_epi16(tmp0,tmp1);
- ch1[0] = _mm_add_epi16(tmp0,tmp1);
- }
-
- //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);
-}
-
-void dlsch_channel_compensation_TM56(int **rxdataF_ext,
- int **dl_ch_estimates_ext,
- int **dl_ch_mag,
- int **dl_ch_magb,
- int **rxdataF_comp,
- unsigned char *pmi_ext,
- LTE_DL_FRAME_PARMS *frame_parms,
- PHY_MEASUREMENTS *measurements,
- int eNB_id,
- unsigned char symbol,
- unsigned char mod_order,
- unsigned short nb_rb,
- unsigned char output_shift,
- unsigned char dl_power_off)
-{
-
-#if defined(__x86_64__) || defined(__i386__)
-
- unsigned short rb,Nre;
- __m128i *dl_ch0_128,*dl_ch1_128,*dl_ch_mag128,*dl_ch_mag128b,*rxdataF128,*rxdataF_comp128;
- unsigned char aarx=0,symbol_mod,pilots=0;
- int precoded_signal_strength=0;
- __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b;
-
- 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("comp prec: symbol %d, pilots %d\n",symbol, pilots);
-
- if (mod_order == 4) {
- QAM_amp128 = _mm_set1_epi16(QAM16_n1);
- QAM_amp128b = _mm_setzero_si128();
- } else if (mod_order == 6) {
- QAM_amp128 = _mm_set1_epi16(QAM64_n1);
- QAM_amp128b = _mm_set1_epi16(QAM64_n2);
- }
-
- 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];
-
-
- dl_ch_mag128 = (__m128i *)&dl_ch_mag[aarx][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag128b = (__m128i *)&dl_ch_magb[aarx][symbol*frame_parms->N_RB_DL*12];
- rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12];
- rxdataF_comp128 = (__m128i *)&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_128[0],&dl_ch1_128[0]);
- 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]);
- }
-
- if (mod_order>2) {
- // 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);
-
- mmtmpD1 = _mm_madd_epi16(dl_ch0_128[1],dl_ch0_128[1]);
- mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
-
- mmtmpD0 = _mm_packs_epi32(mmtmpD0,mmtmpD1);
-
- dl_ch_mag128[0] = _mm_unpacklo_epi16(mmtmpD0,mmtmpD0);
- 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_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);
- dl_ch_mag128b[1] = dl_ch_mag128[1];
- dl_ch_mag128[1] = _mm_mulhi_epi16(dl_ch_mag128[1],QAM_amp128);
- dl_ch_mag128[1] = _mm_slli_epi16(dl_ch_mag128[1],1);
-
- if (pilots==0) {
- mmtmpD0 = _mm_madd_epi16(dl_ch0_128[2],dl_ch0_128[2]);
- mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
-
- mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0);
-
- dl_ch_mag128[2] = _mm_unpacklo_epi16(mmtmpD1,mmtmpD1);
- dl_ch_mag128b[2] = dl_ch_mag128[2];
-
- dl_ch_mag128[2] = _mm_mulhi_epi16(dl_ch_mag128[2],QAM_amp128);
- dl_ch_mag128[2] = _mm_slli_epi16(dl_ch_mag128[2],1);
- }
-
- dl_ch_mag128b[0] = _mm_mulhi_epi16(dl_ch_mag128b[0],QAM_amp128b);
- dl_ch_mag128b[0] = _mm_slli_epi16(dl_ch_mag128b[0],1);
-
- //print_shorts("dl_ch_mag128b[0]=",&dl_ch_mag128b[0]);
-
- dl_ch_mag128b[1] = _mm_mulhi_epi16(dl_ch_mag128b[1],QAM_amp128b);
- dl_ch_mag128b[1] = _mm_slli_epi16(dl_ch_mag128b[1],1);
-
- 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);
-
- // 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);
- 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);
- mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
- mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
- // print_ints("c0",&mmtmpD2);
- // 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);
-
- // multiply by conjugated channel
- mmtmpD0 = _mm_madd_epi16(dl_ch0_128[1],rxdataF128[1]);
- // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
- mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[1],_MM_SHUFFLE(2,3,0,1));
- mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
- 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);
- mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
- mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
-
- rxdataF_comp128[1] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
- // print_shorts("rx:",rxdataF128+1);
- // print_shorts("ch:",dl_ch128+1);
- // print_shorts("pack:",rxdataF_comp128+1);
-
- if (pilots==0) {
- // multiply by conjugated channel
- mmtmpD0 = _mm_madd_epi16(dl_ch0_128[2],rxdataF128[2]);
- // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
- mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[2],_MM_SHUFFLE(2,3,0,1));
- mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
- 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);
- mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
- mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
-
- rxdataF_comp128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
- // print_shorts("rx:",rxdataF128+2);
- // print_shorts("ch:",dl_ch128+2);
- // print_shorts("pack:",rxdataF_comp128+2);
-
- dl_ch0_128+=3;
- dl_ch1_128+=3;
- dl_ch_mag128+=3;
- dl_ch_mag128b+=3;
- rxdataF128+=3;
- rxdataF_comp128+=3;
- } else {
- dl_ch0_128+=2;
- dl_ch1_128+=2;
- dl_ch_mag128+=2;
- dl_ch_mag128b+=2;
- rxdataF128+=2;
- 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))) - (measurements->n0_power[aarx]));
- } // rx_antennas
-
- 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]);
-
-#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;
- if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) {
- if (frame_parms->nb_antenna_ports_eNB==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];
- dl_ch1_128b = (int16x8_t*)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag128 = (int16x8_t*)&dl_ch_mag[aarx][symbol*frame_parms->N_RB_DL*12];
- 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]);
- }
-
- 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);
- }
- }
- 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])]
- 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])]
- 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])]
-
- 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)));
- //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)));
-
- 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)));
-
- 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;
-
- } 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;
- }
- }
-
- 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))) - (measurements->n0_power[aarx]));
- // rx_antennas
- }
- 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_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_shift0,
- unsigned char output_shift1) {
-
-#if defined(__x86_64__) || defined(__i386__)
-
- unsigned short rb,Nre;
- __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 **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[harq_pid][round];
- int **dl_ch_magb0 = pdsch_vars->dl_ch_magb0;
- 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[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);
-
- if (mod_order0 == 4) {
- QAM_amp0_128 = _mm_set1_epi16(QAM16_n1);
- QAM_amp0_128b = _mm_setzero_si128();
- } else if (mod_order0 == 6) {
- QAM_amp0_128 = _mm_set1_epi16(QAM64_n1);
- QAM_amp0_128b = _mm_set1_epi16(QAM64_n2);
- }
-
- if (mod_order1 == 4) {
- QAM_amp1_128 = _mm_set1_epi16(QAM16_n1);
- QAM_amp1_128b = _mm_setzero_si128();
- } else if (mod_order1 == 6) {
- QAM_amp1_128 = _mm_set1_epi16(QAM64_n1);
- QAM_amp1_128b = _mm_set1_epi16(QAM64_n2);
- }
-
- for (aarx=0;aarxnb_antennas_rx;aarx++) {
-
- /* 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]; //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_shift0);
-
- mmtmpD1 = _mm_madd_epi16(dl_ch0_128[1],dl_ch0_128[1]);
- mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift0);
-
- mmtmpD0 = _mm_packs_epi32(mmtmpD0,mmtmpD1);
-
- dl_ch_mag0_128[0] = _mm_unpacklo_epi16(mmtmpD0,mmtmpD0);
- dl_ch_mag0_128b[0] = dl_ch_mag0_128[0];
- dl_ch_mag0_128[0] = _mm_mulhi_epi16(dl_ch_mag0_128[0],QAM_amp0_128);
- dl_ch_mag0_128[0] = _mm_slli_epi16(dl_ch_mag0_128[0],1);
-
- // 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);
- dl_ch_mag0_128[1] = _mm_slli_epi16(dl_ch_mag0_128[1],1);
-
- if (pilots==0) {
- mmtmpD0 = _mm_madd_epi16(dl_ch0_128[2],dl_ch0_128[2]);
- mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift0);
-
- mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0);
-
- dl_ch_mag0_128[2] = _mm_unpacklo_epi16(mmtmpD1,mmtmpD1);
- dl_ch_mag0_128b[2] = dl_ch_mag0_128[2];
-
- dl_ch_mag0_128[2] = _mm_mulhi_epi16(dl_ch_mag0_128[2],QAM_amp0_128);
- dl_ch_mag0_128[2] = _mm_slli_epi16(dl_ch_mag0_128[2],1);
- }
-
- 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_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);
-
- if (pilots==0) {
- dl_ch_mag0_128b[2] = _mm_mulhi_epi16(dl_ch_mag0_128b[2],QAM_amp0_128b);
- dl_ch_mag0_128b[2] = _mm_slli_epi16(dl_ch_mag0_128b[2],1);
- }
- }
-
- if (mod_order1>2) {
- // get channel amplitude if not QPSK
-
- mmtmpD0 = _mm_madd_epi16(dl_ch1_128[0],dl_ch1_128[0]);
- 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_shift1);
-
- mmtmpD0 = _mm_packs_epi32(mmtmpD0,mmtmpD1);
-
- dl_ch_mag1_128[0] = _mm_unpacklo_epi16(mmtmpD0,mmtmpD0);
- dl_ch_mag1_128b[0] = dl_ch_mag1_128[0];
- 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_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];
- dl_ch_mag1_128[1] = _mm_mulhi_epi16(dl_ch_mag1_128[1],QAM_amp1_128);
- dl_ch_mag1_128[1] = _mm_slli_epi16(dl_ch_mag1_128[1],1);
-
- if (pilots==0) {
- mmtmpD0 = _mm_madd_epi16(dl_ch1_128[2],dl_ch1_128[2]);
- mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift1);
-
- mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0);
-
- dl_ch_mag1_128[2] = _mm_unpacklo_epi16(mmtmpD1,mmtmpD1);
- dl_ch_mag1_128b[2] = dl_ch_mag1_128[2];
-
- dl_ch_mag1_128[2] = _mm_mulhi_epi16(dl_ch_mag1_128[2],QAM_amp1_128);
- dl_ch_mag1_128[2] = _mm_slli_epi16(dl_ch_mag1_128[2],1);
- }
-
- 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_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);
-
- if (pilots==0) {
- dl_ch_mag1_128b[2] = _mm_mulhi_epi16(dl_ch_mag1_128b[2],QAM_amp1_128b);
- dl_ch_mag1_128b[2] = _mm_slli_epi16(dl_ch_mag1_128b[2],1);
- }
- }
-
- // layer 0
- // MF multiply by conjugated channel
- mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],rxdataF128[0]);
- // 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);
- // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
- 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);
- 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);
-
- // multiply by conjugated channel
- mmtmpD0 = _mm_madd_epi16(dl_ch0_128[1],rxdataF128[1]);
- // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
- mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[1],_MM_SHUFFLE(2,3,0,1));
- mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
- 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_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_comp0_128+1);
-
- if (pilots==0) {
- // multiply by conjugated channel
- mmtmpD0 = _mm_madd_epi16(dl_ch0_128[2],rxdataF128[2]);
- // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
- mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[2],_MM_SHUFFLE(2,3,0,1));
- mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
- 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_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_comp0_128+2);
-
- }
-
-
- // layer 1
- // MF multiply by conjugated channel
- mmtmpD0 = _mm_madd_epi16(dl_ch1_128[0],rxdataF128[0]);
- // print_ints("re",&mmtmpD0);
-
- // 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);
- mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[0]);
- // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
- 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);
- rxdataF_comp1_128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
- // print_shorts("rx:",rxdataF128);
- // print_shorts("ch:",dl_ch1_128);
- // print_shorts("pack:",rxdataF_comp1_128);
-
- // 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));
- mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
- 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_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_ch1_128+1);
- // print_shorts("pack:",rxdataF_comp1_128+1);
-
- if (pilots==0) {
- // multiply by conjugated channel
- mmtmpD0 = _mm_madd_epi16(dl_ch1_128[2],rxdataF128[2]);
- // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
- mmtmpD1 = _mm_shufflelo_epi16(dl_ch1_128[2],_MM_SHUFFLE(2,3,0,1));
- mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
- 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_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_ch1_128+2);
- // print_shorts("pack:",rxdataF_comp1_128+2);
-
- dl_ch0_128+=3;
- dl_ch1_128+=3;
- dl_ch_mag0_128+=3;
- dl_ch_mag1_128+=3;
- dl_ch_mag0_128b+=3;
- dl_ch_mag1_128b+=3;
- rxdataF128+=3;
- rxdataF_comp0_128+=3;
- rxdataF_comp1_128+=3;
- }
- else {
- dl_ch0_128+=2;
- dl_ch1_128+=2;
- dl_ch_mag0_128+=2;
- dl_ch_mag1_128+=2;
- dl_ch_mag0_128b+=2;
- dl_ch_mag1_128b+=2;
- rxdataF128+=2;
- rxdataF_comp0_128+=2;
- rxdataF_comp1_128+=2;
- }
-
- } // rb loop
- 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))*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))*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]);
-
- _mm_empty();
- _m_empty();
-
- #elif defined(__arm__)
-
- unsigned short rb,Nre;
- unsigned char aarx,symbol_mod,pilots=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[harq_pid][round];
- int **dl_ch_magb0 = pdsch_vars->dl_ch_magb0;
- 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[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->nb_antenna_ports_eNB==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];
- dl_ch1_128b = (int16x8_t*)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag0_128 = (int16x8_t*)&dl_ch_mag0[aarx][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag0_128b = (int16x8_t*)&dl_ch_magb0[aarx][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag1_128 = (int16x8_t*)&dl_ch_mag1[aarx][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag1_128b = (int16x8_t*)&dl_ch_magb1[aarx][symbol*frame_parms->N_RB_DL*12];
- 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; 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);
- }
- }
-
- 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);
- }
- }
-
- 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])]
- 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])]
- 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])]
-
- 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)));
- //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)));
-
- 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)));
-
- 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)));
- 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)));
- //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)));
-
- 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)));
-
- 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));
- }
- }
-
-
-
- Nre = (pilots==0) ? 12 : 8;
-
- // rx_antennas
- }
-
-
- 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))*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))*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);
-
-#endif
-}
-
-
-void dlsch_dual_stream_correlation(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_shift)
-{
-
-#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;
-
- // 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++) {
-
-
-
- //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; rb=(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; rbnb_antennas_rx>1) {
-
- for (aatx=0; aatxnb_antenna_ports_eNB; aatx++) {
-
- rxdataF_comp128_0 = (__m128i *)&rxdataF_comp[(aatx<<1)][symbol*frame_parms->N_RB_DL*12];
- rxdataF_comp128_1 = (__m128i *)&rxdataF_comp[(aatx<<1)+1][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag128_0 = (__m128i *)&dl_ch_mag[(aatx<<1)][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag128_1 = (__m128i *)&dl_ch_mag[(aatx<<1)+1][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag128_0b = (__m128i *)&dl_ch_magb[(aatx<<1)][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag128_1b = (__m128i *)&dl_ch_magb[(aatx<<1)+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 *) &rho[1][symbol*frame_parms->N_RB_DL*12];
- for (i=0;iN_RB_DL*12];
- rho128_i1 = (__m128i *) &rho_i[1][symbol*frame_parms->N_RB_DL*12];
- rxdataF_comp128_i0 = (__m128i *)&rxdataF_comp_i[0][symbol*frame_parms->N_RB_DL*12];
- rxdataF_comp128_i1 = (__m128i *)&rxdataF_comp_i[1][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag128_i0 = (__m128i *)&dl_ch_mag_i[0][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag128_i1 = (__m128i *)&dl_ch_mag_i[1][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag128_i0b = (__m128i *)&dl_ch_magb_i[0][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag128_i1b = (__m128i *)&dl_ch_magb_i[1][symbol*frame_parms->N_RB_DL*12];
-
- for (i=0; inb_antennas_rx>1) {
-
- for (aatx=0; aatxnb_antenna_ports_eNB; aatx++) {
-
- rxdataF_comp128_0 = (int16x8_t *)&rxdataF_comp[(aatx<<1)][symbol*frame_parms->N_RB_DL*12];
- rxdataF_comp128_1 = (int16x8_t *)&rxdataF_comp[(aatx<<1)+1][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag128_0 = (int16x8_t *)&dl_ch_mag[(aatx<<1)][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag128_1 = (int16x8_t *)&dl_ch_mag[(aatx<<1)+1][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag128_0b = (int16x8_t *)&dl_ch_magb[(aatx<<1)][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag128_1b = (int16x8_t *)&dl_ch_magb[(aatx<<1)+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 = (int16x8_t *) &rho[1][symbol*frame_parms->N_RB_DL*12];
-
- for (i=0; iN_RB_DL*12];
- rho128_i1 = (int16x8_t *) &rho_i[1][symbol*frame_parms->N_RB_DL*12];
- rxdataF_comp128_i0 = (int16x8_t *)&rxdataF_comp_i[0][symbol*frame_parms->N_RB_DL*12];
- rxdataF_comp128_i1 = (int16x8_t *)&rxdataF_comp_i[1][symbol*frame_parms->N_RB_DL*12];
-
- dl_ch_mag128_i0 = (int16x8_t *)&dl_ch_mag_i[0][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag128_i1 = (int16x8_t *)&dl_ch_mag_i[1][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag128_i0b = (int16x8_t *)&dl_ch_magb_i[0][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag128_i1b = (int16x8_t *)&dl_ch_magb_i[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;i=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
-
- if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) {
- if (frame_parms->nb_antenna_ports_eNB==1) // 10 out of 12 so don't reduce size
- nb_rb=1+(5*nb_rb/6);
- else
- pilots=1;
- }
-
- // Determine scaling amplitude based the symbol
-
- 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, pilots %d nb_rb %d NCP %d symbol %d\n",symbol_mod,ch_amp,pilots,nb_rb,frame_parms->Ncp,symbol);
- // printf("Scaling PDSCH Chest in OFDM symbol %d by %d\n",symbol_mod,ch_amp);
-
- ch_amp128 = _mm_set1_epi16(ch_amp); // Q3.13
-
- for (aatx=0; aatxnb_antenna_ports_eNB; aatx++) {
- for (aarx=0; aarxnb_antennas_rx; aarx++) {
-
- 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;
-
- if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1))
- nre=8;
- else if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB==1))
- nre=10;
- else
- nre=12;
-
- //nb_rb*nre = y * 2^x
- int16_t x = factor2(nb_rb*nre);
- int16_t y = (nb_rb*nre)>>x;
- //printf("nb_rb*nre = %d = %d * 2^(%d)\n",nb_rb*nre,y,x);
-
- for (aatx=0; aatxnb_antenna_ports_eNB; aatx++)
- for (aarx=0; aarxnb_antennas_rx; aarx++) {
- //clear average level
- avg128D = _mm_setzero_si128();
- // 5 is always a symbol with no pilots for both normal and extended prefix
-
- dl_ch128=(__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12];
-
- for (rb=0;rbNcp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) {
- dl_ch128+=2;
- }
- else {
- avg128D = _mm_add_epi32(avg128D,_mm_srai_epi16(_mm_madd_epi16(dl_ch128[2],dl_ch128[2]),x));
- //avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128[2],_mm_srai_epi16(_mm_mulhi_epi16(dl_ch128[2], coeff128),15)));
- dl_ch128+=3;
- }
- /*
- if (rb==0) {
- print_shorts("dl_ch128",&dl_ch128[0]);
- print_shorts("dl_ch128",&dl_ch128[1]);
- print_shorts("dl_ch128",&dl_ch128[2]);
- }
- */
- }
-
- avg[(aatx<<1)+aarx] =(((int32_t*)&avg128D)[0] +
- ((int32_t*)&avg128D)[1] +
- ((int32_t*)&avg128D)[2] +
- ((int32_t*)&avg128D)[3])/y;
- // printf("Channel level : %d\n",avg[(aatx<<1)+aarx]);
- }
-
- _mm_empty();
- _m_empty();
-
-#elif defined(__arm__)
-
- short rb;
- unsigned char aatx,aarx,nre=12,symbol_mod;
- int32x4_t avg128D;
- int16x4_t *dl_ch128;
-
- symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
-
- for (aatx=0; aatxnb_antenna_ports_eNB; aatx++)
- for (aarx=0; aarxnb_antennas_rx; aarx++) {
- //clear average level
- avg128D = vdupq_n_s32(0);
- // 5 is always a symbol with no pilots for both normal and extended prefix
-
- dl_ch128=(int16x4_t *)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12];
-
- for (rb=0; rbNcp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) {
- dl_ch128+=4;
- } else {
- avg128D = vqaddq_s32(avg128D,vmull_s16(dl_ch128[4],dl_ch128[4]));
- avg128D = vqaddq_s32(avg128D,vmull_s16(dl_ch128[5],dl_ch128[5]));
- dl_ch128+=6;
- }
-
- /*
- if (rb==0) {
- print_shorts("dl_ch128",&dl_ch128[0]);
- print_shorts("dl_ch128",&dl_ch128[1]);
- print_shorts("dl_ch128",&dl_ch128[2]);
- }
- */
- }
-
-
- if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1))
- nre=8;
- else if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB==1))
- nre=10;
- else
- nre=12;
-
- avg[(aatx<<1)+aarx] = (((int32_t*)&avg128D)[0] +
- ((int32_t*)&avg128D)[1] +
- ((int32_t*)&avg128D)[2] +
- ((int32_t*)&avg128D)[3])/(nb_rb*nre);
-
- // printf("Channel level : %d\n",avg[(aatx<<1)+aarx]);
- }
-
-
-#endif
-}
-
-//compute average channel_level of effective (precoded) channel
-
-//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->nb_antenna_ports_eNB!=1))
- nre=8;
- else if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB==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->nb_antenna_ports_eNB!=1)) {
- 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;
-
- symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
-
- //clear average level
- avg128D = _mm_setzero_si128();
- avg[0] = 0;
- avg[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->nb_antenna_ports_eNB!=1))
- nre=8;
- else if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB==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];
-
- for (rb=0; rbNcp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) {
- 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);
-
- // 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;
- dl_ch1_128+=3;
- }
- }
-
- avg[aarx] = (((int*)&avg128D)[0])/(nb_rb*nre) +
- (((int*)&avg128D)[1])/(nb_rb*nre) +
- (((int*)&avg128D)[2])/(nb_rb*nre) +
- (((int*)&avg128D)[3])/(nb_rb*nre);
- }
-
- // choose maximum of the 2 effective channels
- avg[0] = cmax(avg[0],avg[1]);
-
- _mm_empty();
- _m_empty();
-
-#elif defined(__arm__)
-
-#endif
-}*/
-
-//compute average channel_level of effective (precoded) channel
-void dlsch_channel_level_TM56(int **dl_ch_estimates_ext,
- LTE_DL_FRAME_PARMS *frame_parms,
- unsigned char *pmi_ext,
- int *avg,
- uint8_t symbol,
- unsigned short nb_rb)
-{
-
-#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;
-
- symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
-
- //clear average level
- avg128D = _mm_setzero_si128();
- avg[0] = 0;
- avg[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->nb_antenna_ports_eNB!=1))
- nre=8;
- else if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB==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];
-
- for (rb=0; rbNcp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) {
- 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]);
-
- 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);
- avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp));
-
- dl_ch0_128+=3;
- dl_ch1_128+=3;
- }
- }
-
- avg[aarx] = (((int*)&avg128D)[0])/(nb_rb*nre) +
- (((int*)&avg128D)[1])/(nb_rb*nre) +
- (((int*)&avg128D)[2])/(nb_rb*nre) +
- (((int*)&avg128D)[3])/(nb_rb*nre);
- }
-
- // choose maximum of the 2 effective channels
- avg[0] = cmax(avg[0],avg[1]);
-
- _mm_empty();
- _m_empty();
-
-#elif defined(__arm__)
-
-
-#endif
-}
-
-//compute average channel_level for TM7
-void dlsch_channel_level_TM7(int **dl_bf_ch_estimates_ext,
- LTE_DL_FRAME_PARMS *frame_parms,
- int *avg,
- uint8_t symbol,
- unsigned short nb_rb)
-{
-
-#if defined(__x86_64__)||defined(__i386__)
-
- short rb;
- unsigned char aatx,aarx,nre=12,symbol_mod;
- __m128i *dl_ch128,avg128D;
-
- symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
-
- for (aatx=0; aatxnb_antenna_ports_eNB; aatx++)
- for (aarx=0; aarxnb_antennas_rx; aarx++) {
- //clear average level
- avg128D = _mm_setzero_si128();
- // 5 is always a symbol with no pilots for both normal and extended prefix
-
- dl_ch128=(__m128i *)&dl_bf_ch_estimates_ext[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12];
-
- for (rb=0; rbNcp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) {
- dl_ch128+=2;
- } 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]);
- print_shorts("dl_ch128",&dl_ch128[1]);
- print_shorts("dl_ch128",&dl_ch128[2]);
- }
- */
- }
-
- if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1))))
- nre=10;
- else if ((frame_parms->Ncp==0) && (symbol==3 || symbol==6 || symbol==9 || symbol==12))
- nre=9;
- else if ((frame_parms->Ncp==1) && (symbol==4 || symbol==7 || symbol==9))
- nre=8;
- else
- nre=12;
-
- avg[(aatx<<1)+aarx] = (((int*)&avg128D)[0] +
- ((int*)&avg128D)[1] +
- ((int*)&avg128D)[2] +
- ((int*)&avg128D)[3])/(nb_rb*nre);
-
- // printf("Channel level : %d\n",avg[(aatx<<1)+aarx]);
- }
-
- _mm_empty();
- _m_empty();
-
-#elif defined(__arm__)
-
-#endif
-}
-//#define ONE_OVER_2_Q15 16384
-void dlsch_alamouti(LTE_DL_FRAME_PARMS *frame_parms,
- int **rxdataF_comp,
- int **dl_ch_mag,
- int **dl_ch_magb,
- unsigned char symbol,
- unsigned short nb_rb)
-{
-
-#if defined(__x86_64__)||defined(__i386__)
-
- short *rxF0,*rxF1;
- __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);
-
-
- // printf("Doing alamouti!\n");
- rxF0 = (short*)&rxdataF_comp[0][jj]; //tx antenna 0 h0*y
- rxF1 = (short*)&rxdataF_comp[2][jj]; //tx antenna 1 h1*y
- ch_mag0 = (__m128i *)&dl_ch_mag[0][jj];
- 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; rb=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
- pilots = ((symbol_mod==0)||(symbol_mod==(4-frame_parms->Ncp))) ? 1 : 0;
- l=symbol;
- nsymb = (frame_parms->Ncp==NORMAL) ? 14:12;
-
- if (frame_parms->frame_type == TDD) { // TDD
- sss_symb = nsymb-1;
- pss_symb = 2;
- } else {
- sss_symb = (nsymb>>1)-2;
- pss_symb = (nsymb>>1)-1;
- }
-
- if (symbol_mod==(4-frame_parms->Ncp))
- poffset=3;
-
- for (aarx=0; aarxnb_antennas_rx; aarx++) {
-
- if (high_speed_flag == 1)
- dl_ch0 = &dl_ch_estimates[aarx][5+(symbol*(frame_parms->ofdm_symbol_size))];
- else
- dl_ch0 = &dl_ch_estimates[aarx][5];
-
- dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*(frame_parms->N_RB_DL*12)];
-
- rxF_ext = &rxdataF_ext[aarx][symbol*(frame_parms->N_RB_DL*12)];
- rxF = &rxdataF[aarx][(frame_parms->first_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++) {
-
- if (rb < 32)
- rb_alloc_ind = (rb_alloc[0]>>rb) & 1;
- else if (rb < 64)
- rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1;
- else if (rb < 96)
- rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1;
- else if (rb < 100)
- rb_alloc_ind = (rb_alloc[3]>>(rb-96)) & 1;
- else
- rb_alloc_ind = 0;
-
- if (rb_alloc_ind == 1)
- nb_rb++;
-
- // For second half of RBs skip DC carrier
- if (rb==(frame_parms->N_RB_DL>>1)) {
- 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;
- }
-
- //SSS
- if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) {
- rb_alloc_ind = 0;
- }
-
-
- if (frame_parms->frame_type == FDD) {
- //PSS
- if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
- rb_alloc_ind = 0;
- }
- }
-
- if ((frame_parms->frame_type == TDD) &&
- (subframe==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_alloc_ind==1) {
- *pmi_ext = (pmi>>((rb>>2)<<1))&3;
- 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");
- */
- 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]);*/
- }
-
- dl_ch0_ext+=12;
- rxF_ext+=12;
- } else {
- j=0;
-
- for (i=0; i<12; i++) {
- if ((i!=(frame_parms->nushift+poffset)) &&
- (i!=((frame_parms->nushift+poffset+6)%12))) {
- rxF_ext[j]=rxF[i];
- // printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
- dl_ch0_ext[j++]=dl_ch0[i];
-
- }
- }
-
- dl_ch0_ext+=10;
- rxF_ext+=10;
- }
-
-
- }
-
- dl_ch0+=12;
- rxF+=12;
-
- }
- 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]);
-#endif
- skip_half=0;
-
- if (rb < 32)
- rb_alloc_ind = (rb_alloc[0]>>rb) & 1;
- else if (rb < 64)
- rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1;
- else if (rb < 96)
- rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1;
- else if (rb < 100)
- rb_alloc_ind = (rb_alloc[3]>>(rb-96)) & 1;
- else
- rb_alloc_ind = 0;
-
- 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;
- else if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4)))
- skip_half=2;
-
- //SSS
-
- if (((subframe==0)||(subframe==5)) &&
- (rb>((frame_parms->N_RB_DL>>1)-3)) &&
- (rb<((frame_parms->N_RB_DL>>1)+3)) &&
- (l==sss_symb) ) {
- rb_alloc_ind = 0;
- }
- //SSS
- if (((subframe==0)||(subframe==5)) &&
- (rb==((frame_parms->N_RB_DL>>1)-3)) &&
- (l==sss_symb))
- skip_half=1;
- else if (((subframe==0)||(subframe==5)) &&
- (rb==((frame_parms->N_RB_DL>>1)+3)) &&
- (l==sss_symb))
- skip_half=2;
-
- //PSS in subframe 0/5 if FDD
- if (frame_parms->frame_type == FDD) { //FDD
-
- if (((subframe==0)||(subframe==5)) &&
- (rb>((frame_parms->N_RB_DL>>1)-3)) &&
- (rb<((frame_parms->N_RB_DL>>1)+3)) &&
- (l==pss_symb) ) {
- rb_alloc_ind = 0;
- }
-
- if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb))
- skip_half=1;
- else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb))
- skip_half=2;
- }
-
- if ((frame_parms->frame_type == TDD) &&
- (subframe==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))
- skip_half=2;
- }
-
-
- if (rb_alloc_ind==1) {
-
-#ifdef DEBUG_DLSCH_DEMOD
- 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);
- 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]));
-#endif
- }
- dl_ch0_ext+=6;
- rxF_ext+=6;
- } else if (skip_half==2) {
- memcpy(dl_ch0_ext,dl_ch0+6,6*sizeof(int));
-
- 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]));
-#endif
- }
- dl_ch0_ext+=6;
- rxF_ext+=6;
- } else {
- memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int));
-
- 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]));
-#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);
- j=0;
-
- if (skip_half==1) {
- for (i=0; i<6; i++) {
- 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]));
-#endif
- dl_ch0_ext[j++]=dl_ch0[i];
- }
- }
- 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]));
-#endif
- dl_ch0_ext[j++]=dl_ch0[i+6];
- }
- }
-
- dl_ch0_ext+=5;
- rxF_ext+=5;
- } else {
- for (i=0; i<12; i++) {
- if ((i!=(frame_parms->nushift+poffset)) &&
- (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]));
-#endif
- dl_ch0_ext[j++]=dl_ch0[i];
-
- }
- }
-
- dl_ch0_ext+=10;
- rxF_ext+=10;
- }
- }
- }
- dl_ch0+=12;
- rxF+=12;
- } // first half loop
-
-
- // Do middle RB (around DC)
- if (rb < 32)
- rb_alloc_ind = (rb_alloc[0]>>rb) & 1;
- else if (rb < 64)
- rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1;
- else if (rb < 96)
- rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1;
- else if (rb < 100)
- rb_alloc_ind = (rb_alloc[3]>>(rb-96)) & 1;
- else
- rb_alloc_ind = 0;
-
-
- if (rb_alloc_ind == 1)
- nb_rb++;
-
- // PBCH
-
- if ((subframe==0) &&
- (l>=(nsymb>>1)) &&
- (l<((nsymb>>1) + 4))) {
- rb_alloc_ind = 0;
- }
-
- //SSS
- if (((subframe==0)||(subframe==5)) && (l==sss_symb) ) {
- rb_alloc_ind = 0;
- }
-
- if (frame_parms->frame_type == FDD) {
- //PSS
- if (((subframe==0)||(subframe==5)) && (l==pss_symb) ) {
- rb_alloc_ind = 0;
- }
- }
-
- //PSS
- if ((frame_parms->frame_type == TDD) &&
- (subframe==6) &&
- (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);
-#endif
- if (pilots==0) {
- for (i=0; i<6; i++) {
- dl_ch0_ext[i]=dl_ch0[i];
- rxF_ext[i]=rxF[i];
- }
-
- rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))];
-
- for (; i<12; i++) {
- dl_ch0_ext[i]=dl_ch0[i];
- rxF_ext[i]=rxF[(1+i-6)];
- }
-
- dl_ch0_ext+=12;
- rxF_ext+=12;
- } else { // pilots==1
- j=0;
-
- for (i=0; i<6; i++) {
- if (i!=((frame_parms->nushift+poffset)%6)) {
- 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[j-1],*(1+(short*)&rxF_ext[j-1]));
-#endif
- }
- }
-
- rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))];
-
- for (; i<12; i++) {
- if (i!=((frame_parms->nushift+6+poffset)%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[j-1],*(1+(short*)&rxF_ext[j-1]));
-#endif
- }
- }
-
- dl_ch0_ext+=10;
- rxF_ext+=10;
- } // symbol_mod==0
- } // rballoc==1
- else {
- rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))];
- }
-
- dl_ch0+=12;
- 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);
- skip_half=0;
-
- if (rb < 32)
- rb_alloc_ind = (rb_alloc[0]>>rb) & 1;
- else if (rb < 64)
- rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1;
- else if (rb < 96)
- rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1;
- else if (rb < 100)
- rb_alloc_ind = (rb_alloc[3]>>(rb-96)) & 1;
- else
- rb_alloc_ind = 0;
-
- 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;
- else if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4)))
- skip_half=2;
-
- //SSS
- if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) {
- rb_alloc_ind = 0;
- }
- //SSS
- if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==sss_symb))
- skip_half=1;
- else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb))
- skip_half=2;
- if (frame_parms->frame_type == FDD) {
- //PSS
- if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
- rb_alloc_ind = 0;
- }
-
- //PSS
-
- if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb))
- skip_half=1;
- else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb))
- skip_half=2;
- }
-
- if ((frame_parms->frame_type == TDD) &&
-
- (subframe==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))
- skip_half=2;
- }
-
- if (rb_alloc_ind==1) {
-#ifdef DEBUG_DLSCH_DEMOD
- printf("rb %d/symbol %d (skip_half %d)\n",rb,l,skip_half);
-#endif
- /*
- 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);
- 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]));
-#endif
- }
- dl_ch0_ext+=6;
- rxF_ext+=6;
-
- } else if (skip_half==2) {
- memcpy(dl_ch0_ext,dl_ch0+6,6*sizeof(int));
-
- 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]));
-#endif
- }
- dl_ch0_ext+=6;
- rxF_ext+=6;
-
- } else {
- memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int));
-
- 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]));
-#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);
- j=0;
-
- if (skip_half==1) {
- for (i=0; i<6; i++) {
- 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]));
-#endif
- dl_ch0_ext[j++]=dl_ch0[i];
- }
- }
-
- dl_ch0_ext+=5;
- rxF_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]));
-#endif
- dl_ch0_ext[j++]=dl_ch0[i+6];
- }
- }
-
- dl_ch0_ext+=5;
- rxF_ext+=5;
- } else {
- for (i=0; i<12; i++) {
- if ((i!=(frame_parms->nushift+poffset)) &&
- (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]));
-#endif
- dl_ch0_ext[j++]=dl_ch0[i];
- }
- }
- dl_ch0_ext+=10;
- rxF_ext+=10;
- }
- } // pilots=0
- }
-
- dl_ch0+=12;
- rxF+=12;
- }
- }
- }
-
-
- return(nb_rb/frame_parms->nb_antennas_rx);
-}
-
-unsigned short dlsch_extract_rbs_dual(int **rxdataF,
- int **dl_ch_estimates,
- int **rxdataF_ext,
- int **dl_ch_estimates_ext,
- unsigned short pmi,
- unsigned char *pmi_ext,
- unsigned int *rb_alloc,
- unsigned char symbol,
- unsigned char subframe,
- uint32_t high_speed_flag,
- LTE_DL_FRAME_PARMS *frame_parms,
- MIMO_mode_t mimo_mode) {
-
- int prb,nb_rb=0;
- int prb_off,prb_off2;
- int rb_alloc_ind,skip_half=0,sss_symb,pss_symb=0,nsymb,l;
- int i,aarx;
- int32_t *dl_ch0,*dl_ch0p,*dl_ch0_ext,*dl_ch1,*dl_ch1p,*dl_ch1_ext,*rxF,*rxF_ext;
- int symbol_mod,pilots=0,j=0;
- unsigned char *pmi_loc;
-
- symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
- // printf("extract_rbs: symbol_mod %d\n",symbol_mod);
-
- if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp)))
- pilots=1;
-
- nsymb = (frame_parms->Ncp==NORMAL) ? 14:12;
- l=symbol;
-
- if (frame_parms->frame_type == TDD) { // TDD
- sss_symb = nsymb-1;
- pss_symb = 2;
- } else {
- sss_symb = (nsymb>>1)-2;
- pss_symb = (nsymb>>1)-1;
- }
-
- for (aarx=0; aarxnb_antennas_rx; aarx++) {
-
- if (high_speed_flag==1) {
- dl_ch0 = &dl_ch_estimates[aarx][5+(symbol*(frame_parms->ofdm_symbol_size))];
- dl_ch1 = &dl_ch_estimates[2+aarx][5+(symbol*(frame_parms->ofdm_symbol_size))];
- } else {
- dl_ch0 = &dl_ch_estimates[aarx][5];
- dl_ch1 = &dl_ch_estimates[2+aarx][5];
- }
-
- 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)];
- dl_ch1_ext = &dl_ch_estimates_ext[2+aarx][symbol*(frame_parms->N_RB_DL*12)];
-
- for (prb=0; prbN_RB_DL; prb++) {
- skip_half=0;
-
- if (prb < 32)
- rb_alloc_ind = (rb_alloc[0]>>prb) & 1;
- else if (prb < 64)
- rb_alloc_ind = (rb_alloc[1]>>(prb-32)) & 1;
- else if (prb < 96)
- rb_alloc_ind = (rb_alloc[2]>>(prb-64)) & 1;
- else if (prb < 100)
- rb_alloc_ind = (rb_alloc[3]>>(prb-96)) & 1;
- else
- 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
-
-
-
- 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;
- } else { // pilots==1
- j=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];
- // printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
- 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;
- } // 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 (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);
-#endif
- /* 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));
-#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]));
-#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));
-#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]));
-#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));
-#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]));
-#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;
-
- } 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
- printf("(pilots)extract rb %d, re %d => (%d,%d)\n",prb,i,*(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));
-#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]));
- }
-#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)))];
-
- 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]));
- }
-#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];
-#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 aarx
- return(nb_rb/frame_parms->nb_antennas_rx);
-}
-
-unsigned short dlsch_extract_rbs_TM7(int **rxdataF,
- int **dl_bf_ch_estimates,
- int **rxdataF_ext,
- int **dl_bf_ch_estimates_ext,
- unsigned int *rb_alloc,
- unsigned char symbol,
- unsigned char subframe,
- uint32_t high_speed_flag,
- LTE_DL_FRAME_PARMS *frame_parms)
-{
-
- unsigned short rb,nb_rb=0;
- unsigned char rb_alloc_ind;
- unsigned char i,aarx,l,nsymb,skip_half=0,sss_symb,pss_symb=0;
- int *dl_ch0,*dl_ch0_ext,*rxF,*rxF_ext;
-
- unsigned char symbol_mod,pilots=0,uespec_pilots=0,j=0,poffset=0,uespec_poffset=0;
- int8_t uespec_nushift = frame_parms->Nid_cell%3;
-
- symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
- pilots = ((symbol_mod==0)||(symbol_mod==(4-frame_parms->Ncp))) ? 1 : 0;
- l=symbol;
- nsymb = (frame_parms->Ncp==NORMAL) ? 14:12;
-
- if (frame_parms->Ncp==0){
- if (symbol==3 || symbol==6 || symbol==9 || symbol==12)
- uespec_pilots = 1;
- } else{
- if (symbol==4 || symbol==7 || symbol==10)
- uespec_pilots = 1;
- }
-
- if (frame_parms->frame_type == TDD) {// TDD
- sss_symb = nsymb-1;
- pss_symb = 2;
- } else {
- sss_symb = (nsymb>>1)-2;
- pss_symb = (nsymb>>1)-1;
- }
-
- if (symbol_mod==(4-frame_parms->Ncp))
- poffset=3;
-
- if ((frame_parms->Ncp==0 && (symbol==6 ||symbol ==12)) || (frame_parms->Ncp==1 && symbol==7))
- uespec_poffset=2;
-
- for (aarx=0; aarxnb_antennas_rx; aarx++) {
-
- if (high_speed_flag == 1)
- dl_ch0 = &dl_bf_ch_estimates[aarx][symbol*(frame_parms->ofdm_symbol_size)];
- else
- dl_ch0 = &dl_bf_ch_estimates[aarx][0];
-
- dl_ch0_ext = &dl_bf_ch_estimates_ext[aarx][symbol*(frame_parms->N_RB_DL*12)];
-
- rxF_ext = &rxdataF_ext[aarx][symbol*(frame_parms->N_RB_DL*12)];
- rxF = &rxdataF[aarx][(frame_parms->first_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++) {
-
- if (rb < 32)
- rb_alloc_ind = (rb_alloc[0]>>rb) & 1;
- else if (rb < 64)
- rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1;
- else if (rb < 96)
- rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1;
- else if (rb < 100)
- rb_alloc_ind = (rb_alloc[3]>>(rb-96)) & 1;
- else
- rb_alloc_ind = 0;
-
- if (rb_alloc_ind == 1)
- nb_rb++;
-
- // For second half of RBs skip DC carrier
- if (rb==(frame_parms->N_RB_DL>>1)) {
- 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;
- }
-
- //SSS
- if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) {
- rb_alloc_ind = 0;
- }
-
-
- if (frame_parms->frame_type == FDD) {
- //PSS
- if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
- rb_alloc_ind = 0;
- }
- }
-
- if ((frame_parms->frame_type == TDD) &&
- (subframe==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_alloc_ind==1) {
-
- /*
- 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 && uespec_pilots==0) {
- memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int));
-
- for (i=0; i<12; i++) {
- rxF_ext[i]=rxF[i];
- }
-
- dl_ch0_ext+=12;
- rxF_ext+=12;
- } else if(pilots==1 && uespec_pilots==0) {
- j=0;
-
- for (i=0; i<12; i++) {
- if ((i!=(frame_parms->nushift+poffset)) &&
- (i!=((frame_parms->nushift+poffset+6)%12))) {
- rxF_ext[j]=rxF[i];
- dl_ch0_ext[j++]=dl_ch0[i];
- }
- }
-
- dl_ch0_ext+=10;
- rxF_ext+=10;
-
- } else if (pilots==0 && uespec_pilots==1) {
- j=0;
-
-
- 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];
- }
- } 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];
- }
- }
-
- }
-
- dl_ch0_ext+=9-frame_parms->Ncp;
- rxF_ext+=9-frame_parms->Ncp;
-
- } else {
- LOG_E(PHY,"dlsch_extract_rbs_TM7(dl_demodulation.c):pilot or ue spec pilot detection error\n");
- exit(-1);
- }
-
- }
-
- dl_ch0+=12;
- rxF+=12;
-
- }
- else { // Odd number of RBs
- for (rb=0; rbN_RB_DL>>1; rb++) {
- skip_half=0;
-
- if (rb < 32)
- rb_alloc_ind = (rb_alloc[0]>>rb) & 1;
- else if (rb < 64)
- rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1;
- else if (rb < 96)
- rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1;
- else if (rb < 100)
- rb_alloc_ind = (rb_alloc[3]>>(rb-96)) & 1;
- else
- rb_alloc_ind = 0;
-
- 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;
- else if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4)))
- skip_half=2;
-
- //SSS
-
- if (((subframe==0)||(subframe==5)) &&
- (rb>((frame_parms->N_RB_DL>>1)-3)) &&
- (rb<((frame_parms->N_RB_DL>>1)+3)) &&
- (l==sss_symb) ) {
- rb_alloc_ind = 0;
- }
-
- //SSS
- if (((subframe==0)||(subframe==5)) &&
- (rb==((frame_parms->N_RB_DL>>1)-3)) &&
- (l==sss_symb))
- skip_half=1;
- else if (((subframe==0)||(subframe==5)) &&
- (rb==((frame_parms->N_RB_DL>>1)+3)) &&
- (l==sss_symb))
- skip_half=2;
-
- //PSS in subframe 0/5 if FDD
- if (frame_parms->frame_type == FDD) { //FDD
- if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
- rb_alloc_ind = 0;
- }
-
- if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb))
- skip_half=1;
- else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb))
- skip_half=2;
- }
-
- if ((frame_parms->frame_type == TDD) && ((subframe==1)||(subframe==6))) { //TDD Subframe 1 and 6
- if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
- rb_alloc_ind = 0;
- }
-
- if ((rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb))
- skip_half=1;
- else if ((rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb))
- skip_half=2;
- }
-
-
- if (rb_alloc_ind==1) {
-#ifdef DEBUG_DLSCH_DEMOD
- printf("rb %d/symbol %d pilots %d, uespec_pilots %d, (skip_half %d)\n",rb,l,pilots,uespec_pilots,skip_half);
-#endif
-
- if (pilots==0 && uespec_pilots==0) {
- //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]));
-#endif
- }
-
- dl_ch0_ext+=6;
- rxF_ext+=6;
- } else if (skip_half==2) {
- memcpy(dl_ch0_ext,dl_ch0+6,6*sizeof(int));
-
- 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]));
-#endif
- }
-
- dl_ch0_ext+=6;
- rxF_ext+=6;
- } else {
- memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int));
-
- for (i=0; i<12; i++){
- rxF_ext[i]=rxF[i];
-#ifdef DEBUG_DLSCH_DEMOD
- printf("extract rb %d, re %d => (%d,%d)\n",symbol,rb,i,*(short *)&rxF[i],*(1+(short*)&rxF[i]));
-#endif
- }
- dl_ch0_ext+=12;
- rxF_ext+=12;
- }
- } else if (pilots==1 && uespec_pilots==0) {
- // printf("Extracting with pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half);
- j=0;
-
- if (skip_half==1) {
- for (i=0; i<6; i++) {
- if (i!=((frame_parms->nushift+poffset)%6)) {
- 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]));
-#endif
- }
- }
-
- dl_ch0_ext+=5;
- rxF_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)];
- 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]));
-#endif
- }
- }
-
- dl_ch0_ext+=5;
- rxF_ext+=5;
- } else {
- for (i=0; i<12; i++) {
- if ((i!=(frame_parms->nushift+poffset)) &&
- (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]));
-#endif
- dl_ch0_ext[j++]=dl_ch0[i];
-
- }
- }
-
- dl_ch0_ext+=10;
- rxF_ext+=10;
- }
- } else if(pilots==0 && uespec_pilots==1){
- //printf("Extracting with uespec pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half);
- j=0;
-
- if (skip_half==1) {
- if (frame_parms->Ncp==0){
- for (i=0; i<6; 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];
-#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-(uespec_nushift+uespec_poffset<6)-(uespec_nushift+uespec_poffset+4<6)-((uespec_nushift+uespec_poffset+8)%12<6);
- rxF_ext+=6-(uespec_nushift+uespec_poffset<6)-(uespec_nushift+uespec_poffset+4<6)-((uespec_nushift+uespec_poffset+8)%12<6);
-
- } 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){
- 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]));
-#endif
- }
- }
- dl_ch0_ext+=4;
- rxF_ext+=4;
- }
-
- } else if (skip_half==2) {
- if(frame_parms->Ncp==0){
- for (i=0; i<6; 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+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]));
-#endif
- }
- }
- dl_ch0_ext+=6-(uespec_nushift+uespec_poffset>6)-(uespec_nushift+uespec_poffset+4>6)-((uespec_nushift+uespec_poffset+8)%12>6);
- rxF_ext+=6-(uespec_nushift+uespec_poffset>6)-(uespec_nushift+uespec_poffset+4>6)-((uespec_nushift+uespec_poffset+8)%12>6);
-
- } 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){
- 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]));
-#endif
- }
- }
- dl_ch0_ext+=4;
- rxF_ext+=4;
- }
-
- } else {
-
- 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];
-#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];
-#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+=9-frame_parms->Ncp;
- rxF_ext+=9-frame_parms->Ncp;
- }
-
- } else {
- LOG_E(PHY,"dlsch_extract_rbs_TM7(dl_demodulation.c):pilot or ue spec pilot detection error\n");
- exit(-1);
-
- }
- }
-
- dl_ch0+=12;
- rxF+=12;
- } // first half loop
-
-
- // Do middle RB (around DC)
- if (rb < 32)
- rb_alloc_ind = (rb_alloc[0]>>rb) & 1;
- else if (rb < 64)
- rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1;
- else if (rb < 96)
- rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1;
- else if (rb < 100)
- rb_alloc_ind = (rb_alloc[3]>>(rb-96)) & 1;
- else
- rb_alloc_ind = 0;
-
- 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;
- }
-
- //SSS
- if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) {
- rb_alloc_ind = 0;
- }
-
- if (frame_parms->frame_type == FDD) {
- //PSS
- if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
- rb_alloc_ind = 0;
- }
- }
-
- if ((frame_parms->frame_type == TDD) && ((subframe==1)||(subframe==6))) {
- //PSS
- if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
- rb_alloc_ind = 0;
- }
- }
-
- //printf("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) {
- //printf("rb %d/symbol %d (skip_half %d)\n",rb,l,skip_half);
- if (pilots==0 && uespec_pilots==0) {
- for (i=0; i<6; i++) {
- 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]));
-#endif
- }
-
- rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))];
-
- for (; i<12; i++) {
- 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]));
-#endif
- }
-
- dl_ch0_ext+=12;
- rxF_ext+=12;
- } else if(pilots==1 && uespec_pilots==0){ // pilots==1
- j=0;
-
- for (i=0; i<6; i++) {
- if (i!=((frame_parms->nushift+poffset)%6)) {
- 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]));
-#endif
- }
- }
-
- rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))];
-
- for (; i<12; i++) {
- if (i!=((frame_parms->nushift+6+poffset)%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]));
-#endif
- }
- }
-
- dl_ch0_ext+=10;
- rxF_ext+=10;
- } else if(pilots==0 && uespec_pilots==1) {
- j=0;
-
- 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];
-#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
- }
- } 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];
-#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
- }
- }
- }
-
- 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){
- 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]));
-#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)];
-#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+=9-frame_parms->Ncp;
- rxF_ext+=9-frame_parms->Ncp;
-
- }// symbol_mod==0
-
- } // rballoc==1
- else {
- rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))];
- }
-
- dl_ch0+=12;
- 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);
- skip_half=0;
-
- if (rb < 32)
- rb_alloc_ind = (rb_alloc[0]>>rb) & 1;
- else if (rb < 64)
- rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1;
- else if (rb < 96)
- rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1;
- else if (rb < 100)
- rb_alloc_ind = (rb_alloc[3]>>(rb-96)) & 1;
- else
- rb_alloc_ind = 0;
-
- 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;
- else if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4)))
- skip_half=2;
-
- //SSS
- if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) {
- rb_alloc_ind = 0;
- }
-
- //SSS
- if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==sss_symb))
- skip_half=1;
- else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb))
- skip_half=2;
-
- //PSS
- if (frame_parms->frame_type == FDD) {
- if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
- rb_alloc_ind = 0;
- }
-
- if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb))
- skip_half=1;
- else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb))
- skip_half=2;
- }
-
- if ((frame_parms->frame_type == TDD) && ((subframe==1)||(subframe==6))) { //TDD Subframe 1 and 6
- if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
- rb_alloc_ind = 0;
- }
-
- if ((rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb))
- skip_half=1;
- else if ((rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb))
- skip_half=2;
- }
-
- if (rb_alloc_ind==1) {
-#ifdef DEBUG_DLSCH_DEMOD
- printf("rb %d/symbol %d (skip_half %d)\n",rb,l,skip_half);
-#endif
- /*
- 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 && uespec_pilots==0) {
- //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]));
-#endif
- }
-
- dl_ch0_ext+=6;
- rxF_ext+=6;
-
- } else if (skip_half==2) {
- memcpy(dl_ch0_ext,dl_ch0+6,6*sizeof(int));
-
- 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]));
-#endif
- }
-
- dl_ch0_ext+=6;
- rxF_ext+=6;
-
- } else {
- memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int));
- //printf("symbol %d, extract rb %d, => (%d,%d)\n",symbol,rb,*(short *)&dl_ch0[j],*(1+(short*)&dl_ch0[i]));
-
- 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]));
-#endif
- }
-
- dl_ch0_ext+=12;
- rxF_ext+=12;
- }
- } else if (pilots==1 && uespec_pilots==0){
- //printf("Extracting with pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half);
- j=0;
-
- if (skip_half==1) {
- for (i=0; i<6; i++) {
- if (i!=((frame_parms->nushift+poffset)%6)) {
- 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]));
-#endif
- }
- }
-
- dl_ch0_ext+=5;
- rxF_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)];
- 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]));
-#endif
- }
- }
-
- dl_ch0_ext+=5;
- rxF_ext+=5;
- } else {
- for (i=0; i<12; i++) {
- if ((i!=(frame_parms->nushift+poffset)) &&
- (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]));
-#endif
- dl_ch0_ext[j++]=dl_ch0[i];
- }
- }
-
- dl_ch0_ext+=10;
- rxF_ext+=10;
- }
- } else if(pilots==0 && uespec_pilots==1) {
- j=0;
-
- if (skip_half==1) {
- if (frame_parms->Ncp==0){
- for (i=0; i<6; 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];
-#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-(uespec_nushift+uespec_poffset<6)-(uespec_nushift+uespec_poffset+4<6)-((uespec_nushift+uespec_poffset+8)%12<6);
- rxF_ext+=6-(uespec_nushift+uespec_poffset<6)-(uespec_nushift+uespec_poffset+4<6)-((uespec_nushift+uespec_poffset+8)%12<6);
-
- } 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){
- 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]));
-#endif
- }
- }
- dl_ch0_ext+=4;
- rxF_ext+=4;
- }
-
- } else if (skip_half==2) {
- if(frame_parms->Ncp==0){
- for (i=0; i<6; 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+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]));
-#endif
- }
- }
- dl_ch0_ext+=6-(uespec_nushift+uespec_poffset>6)-(uespec_nushift+uespec_poffset+4>6)-((uespec_nushift+uespec_poffset+8)%12>6);
- rxF_ext+=6-(uespec_nushift+uespec_poffset>6)-(uespec_nushift+uespec_poffset+4>6)-((uespec_nushift+uespec_poffset+8)%12>6);
-
- } 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){
- 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]));
-#endif
- }
- }
- dl_ch0_ext+=4;
- rxF_ext+=4;
- }
-
- } else {
- 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];
-#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
- }
- } 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];
-#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+=9-frame_parms->Ncp;
- rxF_ext+=9-frame_parms->Ncp;
-
- }
-
- }// pilots=0
- }
-
- dl_ch0+=12;
- rxF+=12;
- }
- }
- }
-
- _mm_empty();
- _m_empty();
-
- return(nb_rb/frame_parms->nb_antennas_rx);
-}
-
-//==============================================================================================
-
-void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe,unsigned int *coded_bits_per_codeword,int round, unsigned char harq_pid)
-{
- 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;
-
- sprintf(fname,"dlsch%d_rxF_r%d_ext0.m",eNB_id,round);
- sprintf(vname,"dl%d_rxF_r%d_ext0",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->rxdataF_ext[0],12*N_RB_DL*nsymb,1,1);
-
- if (ue->frame_parms.nb_antennas_rx >1) {
- sprintf(fname,"dlsch%d_rxF_r%d_ext1.m",eNB_id,round);
- sprintf(vname,"dl%d_rxF_r%d_ext1",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->rxdataF_ext[1],12*N_RB_DL*nsymb,1,1);
- }
-
- sprintf(fname,"dlsch%d_ch_r%d_ext00.m",eNB_id,round);
- sprintf(vname,"dl%d_ch_r%d_ext00",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1);
-
- if (ue->transmission_mode[eNB_id]==7){
- sprintf(fname,"dlsch%d_bf_ch_r%d.m",eNB_id,round);
- sprintf(vname,"dl%d_bf_ch_r%d",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_bf_ch_estimates[0],512*nsymb,1,1);
- //write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_bf_ch_estimates[0],512,1,1);
-
- sprintf(fname,"dlsch%d_bf_ch_r%d_ext00.m",eNB_id,round);
- sprintf(vname,"dl%d_bf_ch_r%d_ext00",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_bf_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1);
- }
-
- if (ue->frame_parms.nb_antennas_rx == 2) {
- sprintf(fname,"dlsch%d_ch_r%d_ext01.m",eNB_id,round);
- sprintf(vname,"dl%d_ch_r%d_ext01",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1);
- }
-
- if (ue->frame_parms.nb_antenna_ports_eNB == 2) {
- sprintf(fname,"dlsch%d_ch_r%d_ext10.m",eNB_id,round);
- sprintf(vname,"dl%d_ch_r%d_ext10",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1);
-
- if (ue->frame_parms.nb_antennas_rx == 2) {
- sprintf(fname,"dlsch%d_ch_r%d_ext11.m",eNB_id,round);
- sprintf(vname,"dl%d_ch_r%d_ext11",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1);
- }
- }
-
- sprintf(fname,"dlsch%d_rxF_r%d_uespec0.m",eNB_id,round);
- sprintf(vname,"dl%d_rxF_r%d_uespec0",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->rxdataF_uespec_pilots[0],12*N_RB_DL,1,1);
-
- /*
- write_output("dlsch%d_ch_ext01.m","dl01_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1);
- write_output("dlsch%d_ch_ext10.m","dl10_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1);
- write_output("dlsch%d_ch_ext11.m","dl11_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1);
- */
- 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[ue->current_thread_id[subframe]][eNB_id]->dl_ch_rho_ext[harq_pid][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[ue->current_thread_id[subframe]][eNB_id]->dl_ch_rho2_ext[0],12*N_RB_DL*nsymb,1,1);
-
- sprintf(fname,"dlsch%d_rxF_r%d_comp0.m",eNB_id,round);
- sprintf(vname,"dl%d_rxF_r%d_comp0",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb,1,1);
- if (ue->frame_parms.nb_antenna_ports_eNB == 2) {
- sprintf(fname,"dlsch%d_rxF_r%d_comp1.m",eNB_id,round);
- sprintf(vname,"dl%d_rxF_r%d_comp1",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp1[harq_pid][round][0],12*N_RB_DL*nsymb,1,1);
- }
-
- sprintf(fname,"dlsch%d_rxF_r%d_llr.m",eNB_id,round);
- sprintf(vname,"dl%d_r%d_llr",eNB_id,round);
- write_output(fname,vname, ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->llr[0],coded_bits_per_codeword[0],1,0);
- sprintf(fname,"dlsch%d_r%d_mag1.m",eNB_id,round);
- sprintf(vname,"dl%d_r%d_mag1",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb,1,1);
- sprintf(fname,"dlsch%d_r%d_mag2.m",eNB_id,round);
- sprintf(vname,"dl%d_r%d_mag2",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb,1,1);
-
- // printf("log2_maxh = %d\n",ue->pdsch_vars[eNB_id]->log2_maxh);
-}
-
-#ifdef DEBUG_DLSCH_DEMOD
-/*
-void print_bytes(char *s,__m128i *x)
-{
-
- char *tempb = (char *)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]
- );
-
-}
-
-void print_shorts(char *s,__m128i *x)
-{
-
- short *tempb = (short *)x;
- printf("%s : %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]);
-
-}
-
-void print_shorts2(char *s,__m64 *x)
-{
-
- short *tempb = (short *)x;
- printf("%s : %d,%d,%d,%d\n",s,
- tempb[0],tempb[1],tempb[2],tempb[3]);
-
-}
-
-void print_ints(char *s,__m128i *x)
-{
-
- int *tempb = (int *)x;
- printf("%s : %d,%d,%d,%d\n",s,
- tempb[0],tempb[1],tempb[2],tempb[3]);
-
-}*/
-#endif
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c
deleted file mode 100644
index 7682045ae1..0000000000
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c
+++ /dev/null
@@ -1,8899 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-/*! \file PHY/LTE_TRANSPORT/dlsch_llr_computation.c
- * \brief Top-level routines for LLR computation of the PDSCH physical channel from 36-211, V8.6 2009-03
- * \author R. Knopp, F. Kaltenberger,A. Bhamri, S. Aubert, S. Wagner, X Jiang
- * \date 2011
- * \version 0.1
- * \company Eurecom
- * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,ankit.bhamri@eurecom.fr,sebastien.aubert@eurecom.fr, sebastian.wagner@eurecom.fr
- * \note
- * \warning
- */
-
-#include "PHY/defs.h"
-#include "PHY/TOOLS/defs.h"
-#include "PHY/extern.h"
-#include "defs.h"
-#include "extern.h"
-#include "PHY/sse_intrin.h"
-
-//#define DEBUG_LLR_SIC
-
-
-int16_t zeros[8] __attribute__ ((aligned(16))) = {0,0,0,0,0,0,0,0};
-int16_t ones[8] __attribute__ ((aligned(16))) = {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff};
-#if defined(__x86_64__) || defined(__i386__)
-__m128i rho_rpi __attribute__ ((aligned(16)));
-__m128i rho_rmi __attribute__ ((aligned(16)));
-__m128i rho_rpi_1_1 __attribute__ ((aligned(16)));
-__m128i rho_rpi_1_3 __attribute__ ((aligned(16)));
-__m128i rho_rpi_1_5 __attribute__ ((aligned(16)));
-__m128i rho_rpi_1_7 __attribute__ ((aligned(16)));
-__m128i rho_rpi_3_1 __attribute__ ((aligned(16)));
-__m128i rho_rpi_3_3 __attribute__ ((aligned(16)));
-__m128i rho_rpi_3_5 __attribute__ ((aligned(16)));
-__m128i rho_rpi_3_7 __attribute__ ((aligned(16)));
-__m128i rho_rpi_5_1 __attribute__ ((aligned(16)));
-__m128i rho_rpi_5_3 __attribute__ ((aligned(16)));
-__m128i rho_rpi_5_5 __attribute__ ((aligned(16)));
-__m128i rho_rpi_5_7 __attribute__ ((aligned(16)));
-__m128i rho_rpi_7_1 __attribute__ ((aligned(16)));
-__m128i rho_rpi_7_3 __attribute__ ((aligned(16)));
-__m128i rho_rpi_7_5 __attribute__ ((aligned(16)));
-__m128i rho_rpi_7_7 __attribute__ ((aligned(16)));
-__m128i rho_rmi_1_1 __attribute__ ((aligned(16)));
-__m128i rho_rmi_1_3 __attribute__ ((aligned(16)));
-__m128i rho_rmi_1_5 __attribute__ ((aligned(16)));
-__m128i rho_rmi_1_7 __attribute__ ((aligned(16)));
-__m128i rho_rmi_3_1 __attribute__ ((aligned(16)));
-__m128i rho_rmi_3_3 __attribute__ ((aligned(16)));
-__m128i rho_rmi_3_5 __attribute__ ((aligned(16)));
-__m128i rho_rmi_3_7 __attribute__ ((aligned(16)));
-__m128i rho_rmi_5_1 __attribute__ ((aligned(16)));
-__m128i rho_rmi_5_3 __attribute__ ((aligned(16)));
-__m128i rho_rmi_5_5 __attribute__ ((aligned(16)));
-__m128i rho_rmi_5_7 __attribute__ ((aligned(16)));
-__m128i rho_rmi_7_1 __attribute__ ((aligned(16)));
-__m128i rho_rmi_7_3 __attribute__ ((aligned(16)));
-__m128i rho_rmi_7_5 __attribute__ ((aligned(16)));
-__m128i rho_rmi_7_7 __attribute__ ((aligned(16)));
-
-__m128i psi_r_m7_m7 __attribute__ ((aligned(16)));
-__m128i psi_r_m7_m5 __attribute__ ((aligned(16)));
-__m128i psi_r_m7_m3 __attribute__ ((aligned(16)));
-__m128i psi_r_m7_m1 __attribute__ ((aligned(16)));
-__m128i psi_r_m7_p1 __attribute__ ((aligned(16)));
-__m128i psi_r_m7_p3 __attribute__ ((aligned(16)));
-__m128i psi_r_m7_p5 __attribute__ ((aligned(16)));
-__m128i psi_r_m7_p7 __attribute__ ((aligned(16)));
-__m128i psi_r_m5_m7 __attribute__ ((aligned(16)));
-__m128i psi_r_m5_m5 __attribute__ ((aligned(16)));
-__m128i psi_r_m5_m3 __attribute__ ((aligned(16)));
-__m128i psi_r_m5_m1 __attribute__ ((aligned(16)));
-__m128i psi_r_m5_p1 __attribute__ ((aligned(16)));
-__m128i psi_r_m5_p3 __attribute__ ((aligned(16)));
-__m128i psi_r_m5_p5 __attribute__ ((aligned(16)));
-__m128i psi_r_m5_p7 __attribute__ ((aligned(16)));
-__m128i psi_r_m3_m7 __attribute__ ((aligned(16)));
-__m128i psi_r_m3_m5 __attribute__ ((aligned(16)));
-__m128i psi_r_m3_m3 __attribute__ ((aligned(16)));
-__m128i psi_r_m3_m1 __attribute__ ((aligned(16)));
-__m128i psi_r_m3_p1 __attribute__ ((aligned(16)));
-__m128i psi_r_m3_p3 __attribute__ ((aligned(16)));
-__m128i psi_r_m3_p5 __attribute__ ((aligned(16)));
-__m128i psi_r_m3_p7 __attribute__ ((aligned(16)));
-__m128i psi_r_m1_m7 __attribute__ ((aligned(16)));
-__m128i psi_r_m1_m5 __attribute__ ((aligned(16)));
-__m128i psi_r_m1_m3 __attribute__ ((aligned(16)));
-__m128i psi_r_m1_m1 __attribute__ ((aligned(16)));
-__m128i psi_r_m1_p1 __attribute__ ((aligned(16)));
-__m128i psi_r_m1_p3 __attribute__ ((aligned(16)));
-__m128i psi_r_m1_p5 __attribute__ ((aligned(16)));
-__m128i psi_r_m1_p7 __attribute__ ((aligned(16)));
-__m128i psi_r_p1_m7 __attribute__ ((aligned(16)));
-__m128i psi_r_p1_m5 __attribute__ ((aligned(16)));
-__m128i psi_r_p1_m3 __attribute__ ((aligned(16)));
-__m128i psi_r_p1_m1 __attribute__ ((aligned(16)));
-__m128i psi_r_p1_p1 __attribute__ ((aligned(16)));
-__m128i psi_r_p1_p3 __attribute__ ((aligned(16)));
-__m128i psi_r_p1_p5 __attribute__ ((aligned(16)));
-__m128i psi_r_p1_p7 __attribute__ ((aligned(16)));
-__m128i psi_r_p3_m7 __attribute__ ((aligned(16)));
-__m128i psi_r_p3_m5 __attribute__ ((aligned(16)));
-__m128i psi_r_p3_m3 __attribute__ ((aligned(16)));
-__m128i psi_r_p3_m1 __attribute__ ((aligned(16)));
-__m128i psi_r_p3_p1 __attribute__ ((aligned(16)));
-__m128i psi_r_p3_p3 __attribute__ ((aligned(16)));
-__m128i psi_r_p3_p5 __attribute__ ((aligned(16)));
-__m128i psi_r_p3_p7 __attribute__ ((aligned(16)));
-__m128i psi_r_p5_m7 __attribute__ ((aligned(16)));
-__m128i psi_r_p5_m5 __attribute__ ((aligned(16)));
-__m128i psi_r_p5_m3 __attribute__ ((aligned(16)));
-__m128i psi_r_p5_m1 __attribute__ ((aligned(16)));
-__m128i psi_r_p5_p1 __attribute__ ((aligned(16)));
-__m128i psi_r_p5_p3 __attribute__ ((aligned(16)));
-__m128i psi_r_p5_p5 __attribute__ ((aligned(16)));
-__m128i psi_r_p5_p7 __attribute__ ((aligned(16)));
-__m128i psi_r_p7_m7 __attribute__ ((aligned(16)));
-__m128i psi_r_p7_m5 __attribute__ ((aligned(16)));
-__m128i psi_r_p7_m3 __attribute__ ((aligned(16)));
-__m128i psi_r_p7_m1 __attribute__ ((aligned(16)));
-__m128i psi_r_p7_p1 __attribute__ ((aligned(16)));
-__m128i psi_r_p7_p3 __attribute__ ((aligned(16)));
-__m128i psi_r_p7_p5 __attribute__ ((aligned(16)));
-__m128i psi_r_p7_p7 __attribute__ ((aligned(16)));
-
-__m128i psi_i_m7_m7 __attribute__ ((aligned(16)));
-__m128i psi_i_m7_m5 __attribute__ ((aligned(16)));
-__m128i psi_i_m7_m3 __attribute__ ((aligned(16)));
-__m128i psi_i_m7_m1 __attribute__ ((aligned(16)));
-__m128i psi_i_m7_p1 __attribute__ ((aligned(16)));
-__m128i psi_i_m7_p3 __attribute__ ((aligned(16)));
-__m128i psi_i_m7_p5 __attribute__ ((aligned(16)));
-__m128i psi_i_m7_p7 __attribute__ ((aligned(16)));
-__m128i psi_i_m5_m7 __attribute__ ((aligned(16)));
-__m128i psi_i_m5_m5 __attribute__ ((aligned(16)));
-__m128i psi_i_m5_m3 __attribute__ ((aligned(16)));
-__m128i psi_i_m5_m1 __attribute__ ((aligned(16)));
-__m128i psi_i_m5_p1 __attribute__ ((aligned(16)));
-__m128i psi_i_m5_p3 __attribute__ ((aligned(16)));
-__m128i psi_i_m5_p5 __attribute__ ((aligned(16)));
-__m128i psi_i_m5_p7 __attribute__ ((aligned(16)));
-__m128i psi_i_m3_m7 __attribute__ ((aligned(16)));
-__m128i psi_i_m3_m5 __attribute__ ((aligned(16)));
-__m128i psi_i_m3_m3 __attribute__ ((aligned(16)));
-__m128i psi_i_m3_m1 __attribute__ ((aligned(16)));
-__m128i psi_i_m3_p1 __attribute__ ((aligned(16)));
-__m128i psi_i_m3_p3 __attribute__ ((aligned(16)));
-__m128i psi_i_m3_p5 __attribute__ ((aligned(16)));
-__m128i psi_i_m3_p7 __attribute__ ((aligned(16)));
-__m128i psi_i_m1_m7 __attribute__ ((aligned(16)));
-__m128i psi_i_m1_m5 __attribute__ ((aligned(16)));
-__m128i psi_i_m1_m3 __attribute__ ((aligned(16)));
-__m128i psi_i_m1_m1 __attribute__ ((aligned(16)));
-__m128i psi_i_m1_p1 __attribute__ ((aligned(16)));
-__m128i psi_i_m1_p3 __attribute__ ((aligned(16)));
-__m128i psi_i_m1_p5 __attribute__ ((aligned(16)));
-__m128i psi_i_m1_p7 __attribute__ ((aligned(16)));
-__m128i psi_i_p1_m7 __attribute__ ((aligned(16)));
-__m128i psi_i_p1_m5 __attribute__ ((aligned(16)));
-__m128i psi_i_p1_m3 __attribute__ ((aligned(16)));
-__m128i psi_i_p1_m1 __attribute__ ((aligned(16)));
-__m128i psi_i_p1_p1 __attribute__ ((aligned(16)));
-__m128i psi_i_p1_p3 __attribute__ ((aligned(16)));
-__m128i psi_i_p1_p5 __attribute__ ((aligned(16)));
-__m128i psi_i_p1_p7 __attribute__ ((aligned(16)));
-__m128i psi_i_p3_m7 __attribute__ ((aligned(16)));
-__m128i psi_i_p3_m5 __attribute__ ((aligned(16)));
-__m128i psi_i_p3_m3 __attribute__ ((aligned(16)));
-__m128i psi_i_p3_m1 __attribute__ ((aligned(16)));
-__m128i psi_i_p3_p1 __attribute__ ((aligned(16)));
-__m128i psi_i_p3_p3 __attribute__ ((aligned(16)));
-__m128i psi_i_p3_p5 __attribute__ ((aligned(16)));
-__m128i psi_i_p3_p7 __attribute__ ((aligned(16)));
-__m128i psi_i_p5_m7 __attribute__ ((aligned(16)));
-__m128i psi_i_p5_m5 __attribute__ ((aligned(16)));
-__m128i psi_i_p5_m3 __attribute__ ((aligned(16)));
-__m128i psi_i_p5_m1 __attribute__ ((aligned(16)));
-__m128i psi_i_p5_p1 __attribute__ ((aligned(16)));
-__m128i psi_i_p5_p3 __attribute__ ((aligned(16)));
-__m128i psi_i_p5_p5 __attribute__ ((aligned(16)));
-__m128i psi_i_p5_p7 __attribute__ ((aligned(16)));
-__m128i psi_i_p7_m7 __attribute__ ((aligned(16)));
-__m128i psi_i_p7_m5 __attribute__ ((aligned(16)));
-__m128i psi_i_p7_m3 __attribute__ ((aligned(16)));
-__m128i psi_i_p7_m1 __attribute__ ((aligned(16)));
-__m128i psi_i_p7_p1 __attribute__ ((aligned(16)));
-__m128i psi_i_p7_p3 __attribute__ ((aligned(16)));
-__m128i psi_i_p7_p5 __attribute__ ((aligned(16)));
-__m128i psi_i_p7_p7 __attribute__ ((aligned(16)));
-
-__m128i a_r_m7_m7 __attribute__ ((aligned(16)));
-__m128i a_r_m7_m5 __attribute__ ((aligned(16)));
-__m128i a_r_m7_m3 __attribute__ ((aligned(16)));
-__m128i a_r_m7_m1 __attribute__ ((aligned(16)));
-__m128i a_r_m7_p1 __attribute__ ((aligned(16)));
-__m128i a_r_m7_p3 __attribute__ ((aligned(16)));
-__m128i a_r_m7_p5 __attribute__ ((aligned(16)));
-__m128i a_r_m7_p7 __attribute__ ((aligned(16)));
-__m128i a_r_m5_m7 __attribute__ ((aligned(16)));
-__m128i a_r_m5_m5 __attribute__ ((aligned(16)));
-__m128i a_r_m5_m3 __attribute__ ((aligned(16)));
-__m128i a_r_m5_m1 __attribute__ ((aligned(16)));
-__m128i a_r_m5_p1 __attribute__ ((aligned(16)));
-__m128i a_r_m5_p3 __attribute__ ((aligned(16)));
-__m128i a_r_m5_p5 __attribute__ ((aligned(16)));
-__m128i a_r_m5_p7 __attribute__ ((aligned(16)));
-__m128i a_r_m3_m7 __attribute__ ((aligned(16)));
-__m128i a_r_m3_m5 __attribute__ ((aligned(16)));
-__m128i a_r_m3_m3 __attribute__ ((aligned(16)));
-__m128i a_r_m3_m1 __attribute__ ((aligned(16)));
-__m128i a_r_m3_p1 __attribute__ ((aligned(16)));
-__m128i a_r_m3_p3 __attribute__ ((aligned(16)));
-__m128i a_r_m3_p5 __attribute__ ((aligned(16)));
-__m128i a_r_m3_p7 __attribute__ ((aligned(16)));
-__m128i a_r_m1_m7 __attribute__ ((aligned(16)));
-__m128i a_r_m1_m5 __attribute__ ((aligned(16)));
-__m128i a_r_m1_m3 __attribute__ ((aligned(16)));
-__m128i a_r_m1_m1 __attribute__ ((aligned(16)));
-__m128i a_r_m1_p1 __attribute__ ((aligned(16)));
-__m128i a_r_m1_p3 __attribute__ ((aligned(16)));
-__m128i a_r_m1_p5 __attribute__ ((aligned(16)));
-__m128i a_r_m1_p7 __attribute__ ((aligned(16)));
-__m128i a_r_p1_m7 __attribute__ ((aligned(16)));
-__m128i a_r_p1_m5 __attribute__ ((aligned(16)));
-__m128i a_r_p1_m3 __attribute__ ((aligned(16)));
-__m128i a_r_p1_m1 __attribute__ ((aligned(16)));
-__m128i a_r_p1_p1 __attribute__ ((aligned(16)));
-__m128i a_r_p1_p3 __attribute__ ((aligned(16)));
-__m128i a_r_p1_p5 __attribute__ ((aligned(16)));
-__m128i a_r_p1_p7 __attribute__ ((aligned(16)));
-__m128i a_r_p3_m7 __attribute__ ((aligned(16)));
-__m128i a_r_p3_m5 __attribute__ ((aligned(16)));
-__m128i a_r_p3_m3 __attribute__ ((aligned(16)));
-__m128i a_r_p3_m1 __attribute__ ((aligned(16)));
-__m128i a_r_p3_p1 __attribute__ ((aligned(16)));
-__m128i a_r_p3_p3 __attribute__ ((aligned(16)));
-__m128i a_r_p3_p5 __attribute__ ((aligned(16)));
-__m128i a_r_p3_p7 __attribute__ ((aligned(16)));
-__m128i a_r_p5_m7 __attribute__ ((aligned(16)));
-__m128i a_r_p5_m5 __attribute__ ((aligned(16)));
-__m128i a_r_p5_m3 __attribute__ ((aligned(16)));
-__m128i a_r_p5_m1 __attribute__ ((aligned(16)));
-__m128i a_r_p5_p1 __attribute__ ((aligned(16)));
-__m128i a_r_p5_p3 __attribute__ ((aligned(16)));
-__m128i a_r_p5_p5 __attribute__ ((aligned(16)));
-__m128i a_r_p5_p7 __attribute__ ((aligned(16)));
-__m128i a_r_p7_m7 __attribute__ ((aligned(16)));
-__m128i a_r_p7_m5 __attribute__ ((aligned(16)));
-__m128i a_r_p7_m3 __attribute__ ((aligned(16)));
-__m128i a_r_p7_m1 __attribute__ ((aligned(16)));
-__m128i a_r_p7_p1 __attribute__ ((aligned(16)));
-__m128i a_r_p7_p3 __attribute__ ((aligned(16)));
-__m128i a_r_p7_p5 __attribute__ ((aligned(16)));
-__m128i a_r_p7_p7 __attribute__ ((aligned(16)));
-
-__m128i a_i_m7_m7 __attribute__ ((aligned(16)));
-__m128i a_i_m7_m5 __attribute__ ((aligned(16)));
-__m128i a_i_m7_m3 __attribute__ ((aligned(16)));
-__m128i a_i_m7_m1 __attribute__ ((aligned(16)));
-__m128i a_i_m7_p1 __attribute__ ((aligned(16)));
-__m128i a_i_m7_p3 __attribute__ ((aligned(16)));
-__m128i a_i_m7_p5 __attribute__ ((aligned(16)));
-__m128i a_i_m7_p7 __attribute__ ((aligned(16)));
-__m128i a_i_m5_m7 __attribute__ ((aligned(16)));
-__m128i a_i_m5_m5 __attribute__ ((aligned(16)));
-__m128i a_i_m5_m3 __attribute__ ((aligned(16)));
-__m128i a_i_m5_m1 __attribute__ ((aligned(16)));
-__m128i a_i_m5_p1 __attribute__ ((aligned(16)));
-__m128i a_i_m5_p3 __attribute__ ((aligned(16)));
-__m128i a_i_m5_p5 __attribute__ ((aligned(16)));
-__m128i a_i_m5_p7 __attribute__ ((aligned(16)));
-__m128i a_i_m3_m7 __attribute__ ((aligned(16)));
-__m128i a_i_m3_m5 __attribute__ ((aligned(16)));
-__m128i a_i_m3_m3 __attribute__ ((aligned(16)));
-__m128i a_i_m3_m1 __attribute__ ((aligned(16)));
-__m128i a_i_m3_p1 __attribute__ ((aligned(16)));
-__m128i a_i_m3_p3 __attribute__ ((aligned(16)));
-__m128i a_i_m3_p5 __attribute__ ((aligned(16)));
-__m128i a_i_m3_p7 __attribute__ ((aligned(16)));
-__m128i a_i_m1_m7 __attribute__ ((aligned(16)));
-__m128i a_i_m1_m5 __attribute__ ((aligned(16)));
-__m128i a_i_m1_m3 __attribute__ ((aligned(16)));
-__m128i a_i_m1_m1 __attribute__ ((aligned(16)));
-__m128i a_i_m1_p1 __attribute__ ((aligned(16)));
-__m128i a_i_m1_p3 __attribute__ ((aligned(16)));
-__m128i a_i_m1_p5 __attribute__ ((aligned(16)));
-__m128i a_i_m1_p7 __attribute__ ((aligned(16)));
-__m128i a_i_p1_m7 __attribute__ ((aligned(16)));
-__m128i a_i_p1_m5 __attribute__ ((aligned(16)));
-__m128i a_i_p1_m3 __attribute__ ((aligned(16)));
-__m128i a_i_p1_m1 __attribute__ ((aligned(16)));
-__m128i a_i_p1_p1 __attribute__ ((aligned(16)));
-__m128i a_i_p1_p3 __attribute__ ((aligned(16)));
-__m128i a_i_p1_p5 __attribute__ ((aligned(16)));
-__m128i a_i_p1_p7 __attribute__ ((aligned(16)));
-__m128i a_i_p3_m7 __attribute__ ((aligned(16)));
-__m128i a_i_p3_m5 __attribute__ ((aligned(16)));
-__m128i a_i_p3_m3 __attribute__ ((aligned(16)));
-__m128i a_i_p3_m1 __attribute__ ((aligned(16)));
-__m128i a_i_p3_p1 __attribute__ ((aligned(16)));
-__m128i a_i_p3_p3 __attribute__ ((aligned(16)));
-__m128i a_i_p3_p5 __attribute__ ((aligned(16)));
-__m128i a_i_p3_p7 __attribute__ ((aligned(16)));
-__m128i a_i_p5_m7 __attribute__ ((aligned(16)));
-__m128i a_i_p5_m5 __attribute__ ((aligned(16)));
-__m128i a_i_p5_m3 __attribute__ ((aligned(16)));
-__m128i a_i_p5_m1 __attribute__ ((aligned(16)));
-__m128i a_i_p5_p1 __attribute__ ((aligned(16)));
-__m128i a_i_p5_p3 __attribute__ ((aligned(16)));
-__m128i a_i_p5_p5 __attribute__ ((aligned(16)));
-__m128i a_i_p5_p7 __attribute__ ((aligned(16)));
-__m128i a_i_p7_m7 __attribute__ ((aligned(16)));
-__m128i a_i_p7_m5 __attribute__ ((aligned(16)));
-__m128i a_i_p7_m3 __attribute__ ((aligned(16)));
-__m128i a_i_p7_m1 __attribute__ ((aligned(16)));
-__m128i a_i_p7_p1 __attribute__ ((aligned(16)));
-__m128i a_i_p7_p3 __attribute__ ((aligned(16)));
-__m128i a_i_p7_p5 __attribute__ ((aligned(16)));
-__m128i a_i_p7_p7 __attribute__ ((aligned(16)));
-
-__m128i psi_a_m7_m7 __attribute__ ((aligned(16)));
-__m128i psi_a_m7_m5 __attribute__ ((aligned(16)));
-__m128i psi_a_m7_m3 __attribute__ ((aligned(16)));
-__m128i psi_a_m7_m1 __attribute__ ((aligned(16)));
-__m128i psi_a_m7_p1 __attribute__ ((aligned(16)));
-__m128i psi_a_m7_p3 __attribute__ ((aligned(16)));
-__m128i psi_a_m7_p5 __attribute__ ((aligned(16)));
-__m128i psi_a_m7_p7 __attribute__ ((aligned(16)));
-__m128i psi_a_m5_m7 __attribute__ ((aligned(16)));
-__m128i psi_a_m5_m5 __attribute__ ((aligned(16)));
-__m128i psi_a_m5_m3 __attribute__ ((aligned(16)));
-__m128i psi_a_m5_m1 __attribute__ ((aligned(16)));
-__m128i psi_a_m5_p1 __attribute__ ((aligned(16)));
-__m128i psi_a_m5_p3 __attribute__ ((aligned(16)));
-__m128i psi_a_m5_p5 __attribute__ ((aligned(16)));
-__m128i psi_a_m5_p7 __attribute__ ((aligned(16)));
-__m128i psi_a_m3_m7 __attribute__ ((aligned(16)));
-__m128i psi_a_m3_m5 __attribute__ ((aligned(16)));
-__m128i psi_a_m3_m3 __attribute__ ((aligned(16)));
-__m128i psi_a_m3_m1 __attribute__ ((aligned(16)));
-__m128i psi_a_m3_p1 __attribute__ ((aligned(16)));
-__m128i psi_a_m3_p3 __attribute__ ((aligned(16)));
-__m128i psi_a_m3_p5 __attribute__ ((aligned(16)));
-__m128i psi_a_m3_p7 __attribute__ ((aligned(16)));
-__m128i psi_a_m1_m7 __attribute__ ((aligned(16)));
-__m128i psi_a_m1_m5 __attribute__ ((aligned(16)));
-__m128i psi_a_m1_m3 __attribute__ ((aligned(16)));
-__m128i psi_a_m1_m1 __attribute__ ((aligned(16)));
-__m128i psi_a_m1_p1 __attribute__ ((aligned(16)));
-__m128i psi_a_m1_p3 __attribute__ ((aligned(16)));
-__m128i psi_a_m1_p5 __attribute__ ((aligned(16)));
-__m128i psi_a_m1_p7 __attribute__ ((aligned(16)));
-__m128i psi_a_p1_m7 __attribute__ ((aligned(16)));
-__m128i psi_a_p1_m5 __attribute__ ((aligned(16)));
-__m128i psi_a_p1_m3 __attribute__ ((aligned(16)));
-__m128i psi_a_p1_m1 __attribute__ ((aligned(16)));
-__m128i psi_a_p1_p1 __attribute__ ((aligned(16)));
-__m128i psi_a_p1_p3 __attribute__ ((aligned(16)));
-__m128i psi_a_p1_p5 __attribute__ ((aligned(16)));
-__m128i psi_a_p1_p7 __attribute__ ((aligned(16)));
-__m128i psi_a_p3_m7 __attribute__ ((aligned(16)));
-__m128i psi_a_p3_m5 __attribute__ ((aligned(16)));
-__m128i psi_a_p3_m3 __attribute__ ((aligned(16)));
-__m128i psi_a_p3_m1 __attribute__ ((aligned(16)));
-__m128i psi_a_p3_p1 __attribute__ ((aligned(16)));
-__m128i psi_a_p3_p3 __attribute__ ((aligned(16)));
-__m128i psi_a_p3_p5 __attribute__ ((aligned(16)));
-__m128i psi_a_p3_p7 __attribute__ ((aligned(16)));
-__m128i psi_a_p5_m7 __attribute__ ((aligned(16)));
-__m128i psi_a_p5_m5 __attribute__ ((aligned(16)));
-__m128i psi_a_p5_m3 __attribute__ ((aligned(16)));
-__m128i psi_a_p5_m1 __attribute__ ((aligned(16)));
-__m128i psi_a_p5_p1 __attribute__ ((aligned(16)));
-__m128i psi_a_p5_p3 __attribute__ ((aligned(16)));
-__m128i psi_a_p5_p5 __attribute__ ((aligned(16)));
-__m128i psi_a_p5_p7 __attribute__ ((aligned(16)));
-__m128i psi_a_p7_m7 __attribute__ ((aligned(16)));
-__m128i psi_a_p7_m5 __attribute__ ((aligned(16)));
-__m128i psi_a_p7_m3 __attribute__ ((aligned(16)));
-__m128i psi_a_p7_m1 __attribute__ ((aligned(16)));
-__m128i psi_a_p7_p1 __attribute__ ((aligned(16)));
-__m128i psi_a_p7_p3 __attribute__ ((aligned(16)));
-__m128i psi_a_p7_p5 __attribute__ ((aligned(16)));
-__m128i psi_a_p7_p7 __attribute__ ((aligned(16)));
-
-__m128i a_sq_m7_m7 __attribute__ ((aligned(16)));
-__m128i a_sq_m7_m5 __attribute__ ((aligned(16)));
-__m128i a_sq_m7_m3 __attribute__ ((aligned(16)));
-__m128i a_sq_m7_m1 __attribute__ ((aligned(16)));
-__m128i a_sq_m7_p1 __attribute__ ((aligned(16)));
-__m128i a_sq_m7_p3 __attribute__ ((aligned(16)));
-__m128i a_sq_m7_p5 __attribute__ ((aligned(16)));
-__m128i a_sq_m7_p7 __attribute__ ((aligned(16)));
-__m128i a_sq_m5_m7 __attribute__ ((aligned(16)));
-__m128i a_sq_m5_m5 __attribute__ ((aligned(16)));
-__m128i a_sq_m5_m3 __attribute__ ((aligned(16)));
-__m128i a_sq_m5_m1 __attribute__ ((aligned(16)));
-__m128i a_sq_m5_p1 __attribute__ ((aligned(16)));
-__m128i a_sq_m5_p3 __attribute__ ((aligned(16)));
-__m128i a_sq_m5_p5 __attribute__ ((aligned(16)));
-__m128i a_sq_m5_p7 __attribute__ ((aligned(16)));
-__m128i a_sq_m3_m7 __attribute__ ((aligned(16)));
-__m128i a_sq_m3_m5 __attribute__ ((aligned(16)));
-__m128i a_sq_m3_m3 __attribute__ ((aligned(16)));
-__m128i a_sq_m3_m1 __attribute__ ((aligned(16)));
-__m128i a_sq_m3_p1 __attribute__ ((aligned(16)));
-__m128i a_sq_m3_p3 __attribute__ ((aligned(16)));
-__m128i a_sq_m3_p5 __attribute__ ((aligned(16)));
-__m128i a_sq_m3_p7 __attribute__ ((aligned(16)));
-__m128i a_sq_m1_m7 __attribute__ ((aligned(16)));
-__m128i a_sq_m1_m5 __attribute__ ((aligned(16)));
-__m128i a_sq_m1_m3 __attribute__ ((aligned(16)));
-__m128i a_sq_m1_m1 __attribute__ ((aligned(16)));
-__m128i a_sq_m1_p1 __attribute__ ((aligned(16)));
-__m128i a_sq_m1_p3 __attribute__ ((aligned(16)));
-__m128i a_sq_m1_p5 __attribute__ ((aligned(16)));
-__m128i a_sq_m1_p7 __attribute__ ((aligned(16)));
-__m128i a_sq_p1_m7 __attribute__ ((aligned(16)));
-__m128i a_sq_p1_m5 __attribute__ ((aligned(16)));
-__m128i a_sq_p1_m3 __attribute__ ((aligned(16)));
-__m128i a_sq_p1_m1 __attribute__ ((aligned(16)));
-__m128i a_sq_p1_p1 __attribute__ ((aligned(16)));
-__m128i a_sq_p1_p3 __attribute__ ((aligned(16)));
-__m128i a_sq_p1_p5 __attribute__ ((aligned(16)));
-__m128i a_sq_p1_p7 __attribute__ ((aligned(16)));
-__m128i a_sq_p3_m7 __attribute__ ((aligned(16)));
-__m128i a_sq_p3_m5 __attribute__ ((aligned(16)));
-__m128i a_sq_p3_m3 __attribute__ ((aligned(16)));
-__m128i a_sq_p3_m1 __attribute__ ((aligned(16)));
-__m128i a_sq_p3_p1 __attribute__ ((aligned(16)));
-__m128i a_sq_p3_p3 __attribute__ ((aligned(16)));
-__m128i a_sq_p3_p5 __attribute__ ((aligned(16)));
-__m128i a_sq_p3_p7 __attribute__ ((aligned(16)));
-__m128i a_sq_p5_m7 __attribute__ ((aligned(16)));
-__m128i a_sq_p5_m5 __attribute__ ((aligned(16)));
-__m128i a_sq_p5_m3 __attribute__ ((aligned(16)));
-__m128i a_sq_p5_m1 __attribute__ ((aligned(16)));
-__m128i a_sq_p5_p1 __attribute__ ((aligned(16)));
-__m128i a_sq_p5_p3 __attribute__ ((aligned(16)));
-__m128i a_sq_p5_p5 __attribute__ ((aligned(16)));
-__m128i a_sq_p5_p7 __attribute__ ((aligned(16)));
-__m128i a_sq_p7_m7 __attribute__ ((aligned(16)));
-__m128i a_sq_p7_m5 __attribute__ ((aligned(16)));
-__m128i a_sq_p7_m3 __attribute__ ((aligned(16)));
-__m128i a_sq_p7_m1 __attribute__ ((aligned(16)));
-__m128i a_sq_p7_p1 __attribute__ ((aligned(16)));
-__m128i a_sq_p7_p3 __attribute__ ((aligned(16)));
-__m128i a_sq_p7_p5 __attribute__ ((aligned(16)));
-__m128i a_sq_p7_p7 __attribute__ ((aligned(16)));
-
-__m128i bit_met_m7_m7 __attribute__ ((aligned(16)));
-__m128i bit_met_m7_m5 __attribute__ ((aligned(16)));
-__m128i bit_met_m7_m3 __attribute__ ((aligned(16)));
-__m128i bit_met_m7_m1 __attribute__ ((aligned(16)));
-__m128i bit_met_m7_p1 __attribute__ ((aligned(16)));
-__m128i bit_met_m7_p3 __attribute__ ((aligned(16)));
-__m128i bit_met_m7_p5 __attribute__ ((aligned(16)));
-__m128i bit_met_m7_p7 __attribute__ ((aligned(16)));
-__m128i bit_met_m5_m7 __attribute__ ((aligned(16)));
-__m128i bit_met_m5_m5 __attribute__ ((aligned(16)));
-__m128i bit_met_m5_m3 __attribute__ ((aligned(16)));
-__m128i bit_met_m5_m1 __attribute__ ((aligned(16)));
-__m128i bit_met_m5_p1 __attribute__ ((aligned(16)));
-__m128i bit_met_m5_p3 __attribute__ ((aligned(16)));
-__m128i bit_met_m5_p5 __attribute__ ((aligned(16)));
-__m128i bit_met_m5_p7 __attribute__ ((aligned(16)));
-__m128i bit_met_m3_m7 __attribute__ ((aligned(16)));
-__m128i bit_met_m3_m5 __attribute__ ((aligned(16)));
-__m128i bit_met_m3_m3 __attribute__ ((aligned(16)));
-__m128i bit_met_m3_m1 __attribute__ ((aligned(16)));
-__m128i bit_met_m3_p1 __attribute__ ((aligned(16)));
-__m128i bit_met_m3_p3 __attribute__ ((aligned(16)));
-__m128i bit_met_m3_p5 __attribute__ ((aligned(16)));
-__m128i bit_met_m3_p7 __attribute__ ((aligned(16)));
-__m128i bit_met_m1_m7 __attribute__ ((aligned(16)));
-__m128i bit_met_m1_m5 __attribute__ ((aligned(16)));
-__m128i bit_met_m1_m3 __attribute__ ((aligned(16)));
-__m128i bit_met_m1_m1 __attribute__ ((aligned(16)));
-__m128i bit_met_m1_p1 __attribute__ ((aligned(16)));
-__m128i bit_met_m1_p3 __attribute__ ((aligned(16)));
-__m128i bit_met_m1_p5 __attribute__ ((aligned(16)));
-__m128i bit_met_m1_p7 __attribute__ ((aligned(16)));
-__m128i bit_met_p1_m7 __attribute__ ((aligned(16)));
-__m128i bit_met_p1_m5 __attribute__ ((aligned(16)));
-__m128i bit_met_p1_m3 __attribute__ ((aligned(16)));
-__m128i bit_met_p1_m1 __attribute__ ((aligned(16)));
-__m128i bit_met_p1_p1 __attribute__ ((aligned(16)));
-__m128i bit_met_p1_p3 __attribute__ ((aligned(16)));
-__m128i bit_met_p1_p5 __attribute__ ((aligned(16)));
-__m128i bit_met_p1_p7 __attribute__ ((aligned(16)));
-__m128i bit_met_p3_m7 __attribute__ ((aligned(16)));
-__m128i bit_met_p3_m5 __attribute__ ((aligned(16)));
-__m128i bit_met_p3_m3 __attribute__ ((aligned(16)));
-__m128i bit_met_p3_m1 __attribute__ ((aligned(16)));
-__m128i bit_met_p3_p1 __attribute__ ((aligned(16)));
-__m128i bit_met_p3_p3 __attribute__ ((aligned(16)));
-__m128i bit_met_p3_p5 __attribute__ ((aligned(16)));
-__m128i bit_met_p3_p7 __attribute__ ((aligned(16)));
-__m128i bit_met_p5_m7 __attribute__ ((aligned(16)));
-__m128i bit_met_p5_m5 __attribute__ ((aligned(16)));
-__m128i bit_met_p5_m3 __attribute__ ((aligned(16)));
-__m128i bit_met_p5_m1 __attribute__ ((aligned(16)));
-__m128i bit_met_p5_p1 __attribute__ ((aligned(16)));
-__m128i bit_met_p5_p3 __attribute__ ((aligned(16)));
-__m128i bit_met_p5_p5 __attribute__ ((aligned(16)));
-__m128i bit_met_p5_p7 __attribute__ ((aligned(16)));
-__m128i bit_met_p7_m7 __attribute__ ((aligned(16)));
-__m128i bit_met_p7_m5 __attribute__ ((aligned(16)));
-__m128i bit_met_p7_m3 __attribute__ ((aligned(16)));
-__m128i bit_met_p7_m1 __attribute__ ((aligned(16)));
-__m128i bit_met_p7_p1 __attribute__ ((aligned(16)));
-__m128i bit_met_p7_p3 __attribute__ ((aligned(16)));
-__m128i bit_met_p7_p5 __attribute__ ((aligned(16)));
-__m128i bit_met_p7_p7 __attribute__ ((aligned(16)));
-
-__m128i y0_p_1_1 __attribute__ ((aligned(16)));
-__m128i y0_p_1_3 __attribute__ ((aligned(16)));
-__m128i y0_p_1_5 __attribute__ ((aligned(16)));
-__m128i y0_p_1_7 __attribute__ ((aligned(16)));
-__m128i y0_p_3_1 __attribute__ ((aligned(16)));
-__m128i y0_p_3_3 __attribute__ ((aligned(16)));
-__m128i y0_p_3_5 __attribute__ ((aligned(16)));
-__m128i y0_p_3_7 __attribute__ ((aligned(16)));
-__m128i y0_p_5_1 __attribute__ ((aligned(16)));
-__m128i y0_p_5_3 __attribute__ ((aligned(16)));
-__m128i y0_p_5_5 __attribute__ ((aligned(16)));
-__m128i y0_p_5_7 __attribute__ ((aligned(16)));
-__m128i y0_p_7_1 __attribute__ ((aligned(16)));
-__m128i y0_p_7_3 __attribute__ ((aligned(16)));
-__m128i y0_p_7_5 __attribute__ ((aligned(16)));
-__m128i y0_p_7_7 __attribute__ ((aligned(16)));
-__m128i y0_m_1_1 __attribute__ ((aligned(16)));
-__m128i y0_m_1_3 __attribute__ ((aligned(16)));
-__m128i y0_m_1_5 __attribute__ ((aligned(16)));
-__m128i y0_m_1_7 __attribute__ ((aligned(16)));
-__m128i y0_m_3_1 __attribute__ ((aligned(16)));
-__m128i y0_m_3_3 __attribute__ ((aligned(16)));
-__m128i y0_m_3_5 __attribute__ ((aligned(16)));
-__m128i y0_m_3_7 __attribute__ ((aligned(16)));
-__m128i y0_m_5_1 __attribute__ ((aligned(16)));
-__m128i y0_m_5_3 __attribute__ ((aligned(16)));
-__m128i y0_m_5_5 __attribute__ ((aligned(16)));
-__m128i y0_m_5_7 __attribute__ ((aligned(16)));
-__m128i y0_m_7_1 __attribute__ ((aligned(16)));
-__m128i y0_m_7_3 __attribute__ ((aligned(16)));
-__m128i y0_m_7_5 __attribute__ ((aligned(16)));
-__m128i y0_m_7_7 __attribute__ ((aligned(16)));
-
-__m128i xmm0 __attribute__ ((aligned(16)));
-__m128i xmm1 __attribute__ ((aligned(16)));
-__m128i xmm2 __attribute__ ((aligned(16)));
-__m128i xmm3 __attribute__ ((aligned(16)));
-__m128i xmm4 __attribute__ ((aligned(16)));
-__m128i xmm5 __attribute__ ((aligned(16)));
-__m128i xmm6 __attribute__ ((aligned(16)));
-__m128i xmm7 __attribute__ ((aligned(16)));
-__m128i xmm8 __attribute__ ((aligned(16)));
-
-__m128i y0r __attribute__ ((aligned(16)));
-__m128i y0i __attribute__ ((aligned(16)));
-__m128i y1r __attribute__ ((aligned(16)));
-__m128i y1i __attribute__ ((aligned(16)));
-__m128i y2r __attribute__ ((aligned(16)));
-__m128i y2i __attribute__ ((aligned(16)));
-
-__m128i logmax_num_re0 __attribute__ ((aligned(16)));
-__m128i logmax_num_im0 __attribute__ ((aligned(16)));
-__m128i logmax_den_re0 __attribute__ ((aligned(16)));
-__m128i logmax_den_im0 __attribute__ ((aligned(16)));
-__m128i logmax_num_re1 __attribute__ ((aligned(16)));
-__m128i logmax_num_im1 __attribute__ ((aligned(16)));
-__m128i logmax_den_re1 __attribute__ ((aligned(16)));
-__m128i logmax_den_im1 __attribute__ ((aligned(16)));
-
-__m128i tmp_result __attribute__ ((aligned(16)));
-__m128i tmp_result2 __attribute__ ((aligned(16)));
-__m128i tmp_result3 __attribute__ ((aligned(16)));
-__m128i tmp_result4 __attribute__ ((aligned(16)));
-
-
-//==============================================================================================
-// Auxiliary Makros
-
-// calculates psi_a = psi_r*a_r + psi_i*a_i
-#define prodsum_psi_a_epi16(psi_r,a_r,psi_i,a_i,psi_a) tmp_result = _mm_mulhi_epi16(psi_r,a_r); tmp_result = _mm_slli_epi16(tmp_result,1); tmp_result2 = _mm_mulhi_epi16(psi_i,a_i); tmp_result2 = _mm_slli_epi16(tmp_result2,1); psi_a = _mm_adds_epi16(tmp_result,tmp_result2);
-
-// calculate interference magnitude
-#define interference_abs_epi16(psi,int_ch_mag,int_mag,c1,c2) tmp_result = _mm_cmplt_epi16(psi,int_ch_mag); tmp_result2 = _mm_xor_si128(tmp_result,(*(__m128i*)&ones[0])); tmp_result = _mm_and_si128(tmp_result,c1); tmp_result2 = _mm_and_si128(tmp_result2,c2); int_mag = _mm_or_si128(tmp_result,tmp_result2);
-
-// calculate interference magnitude
-// tmp_result = ones in shorts corr. to interval 2<=x<=4, tmp_result2 interval < 2, tmp_result3 interval 46
-#define interference_abs_64qam_epi16(psi,int_ch_mag,int_two_ch_mag,int_three_ch_mag,a,c1,c3,c5,c7) tmp_result = _mm_cmplt_epi16(psi,int_two_ch_mag); tmp_result3 = _mm_xor_si128(tmp_result,(*(__m128i*)&ones[0])); tmp_result2 = _mm_cmplt_epi16(psi,int_ch_mag); tmp_result = _mm_xor_si128(tmp_result,tmp_result2); tmp_result4 = _mm_cmpgt_epi16(psi,int_three_ch_mag); tmp_result3 = _mm_xor_si128(tmp_result3,tmp_result4); tmp_result = _mm_and_si128(tmp_result,c3); tmp_result2 = _mm_and_si128(tmp_result2,c1); tmp_result3 = _mm_and_si128(tmp_result3,c5); tmp_result4 = _mm_and_si128(tmp_result4,c7); tmp_result = _mm_or_si128(tmp_result,tmp_result2); tmp_result3 = _mm_or_si128(tmp_result3,tmp_result4); a = _mm_or_si128(tmp_result,tmp_result3);
-
-// calculates a_sq = int_ch_mag*(a_r^2 + a_i^2)*scale_factor
-#define square_a_epi16(a_r,a_i,int_ch_mag,scale_factor,a_sq) tmp_result = _mm_mulhi_epi16(a_r,a_r); tmp_result = _mm_slli_epi16(tmp_result,1); tmp_result = _mm_mulhi_epi16(tmp_result,scale_factor); tmp_result = _mm_slli_epi16(tmp_result,1); tmp_result = _mm_mulhi_epi16(tmp_result,int_ch_mag); tmp_result = _mm_slli_epi16(tmp_result,1); tmp_result2 = _mm_mulhi_epi16(a_i,a_i); tmp_result2 = _mm_slli_epi16(tmp_result2,1); tmp_result2 = _mm_mulhi_epi16(tmp_result2,scale_factor); tmp_result2 = _mm_slli_epi16(tmp_result2,1); tmp_result2 = _mm_mulhi_epi16(tmp_result2,int_ch_mag); tmp_result2 = _mm_slli_epi16(tmp_result2,1); a_sq = _mm_adds_epi16(tmp_result,tmp_result2);
-
-// calculates a_sq = int_ch_mag*(a_r^2 + a_i^2)*scale_factor for 64-QAM
-#define square_a_64qam_epi16(a_r,a_i,int_ch_mag,scale_factor,a_sq) tmp_result = _mm_mulhi_epi16(a_r,a_r); tmp_result = _mm_slli_epi16(tmp_result,1); tmp_result = _mm_mulhi_epi16(tmp_result,scale_factor); tmp_result = _mm_slli_epi16(tmp_result,3); tmp_result = _mm_mulhi_epi16(tmp_result,int_ch_mag); tmp_result = _mm_slli_epi16(tmp_result,1); tmp_result2 = _mm_mulhi_epi16(a_i,a_i); tmp_result2 = _mm_slli_epi16(tmp_result2,1); tmp_result2 = _mm_mulhi_epi16(tmp_result2,scale_factor); tmp_result2 = _mm_slli_epi16(tmp_result2,3); tmp_result2 = _mm_mulhi_epi16(tmp_result2,int_ch_mag); tmp_result2 = _mm_slli_epi16(tmp_result2,1); a_sq = _mm_adds_epi16(tmp_result,tmp_result2);
-
-#elif defined(__arm__)
-
-#endif
-
-//==============================================================================================
-// SINGLE-STREAM
-//==============================================================================================
-
-//----------------------------------------------------------------------------------------------
-// QPSK
-//----------------------------------------------------------------------------------------------
-
-int dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
- int32_t **rxdataF_comp,
- int16_t *dlsch_llr,
- uint8_t symbol,
- uint8_t first_symbol_flag,
- uint16_t nb_rb,
- uint16_t pbch_pss_sss_adjust,
- uint8_t beamforming_mode)
-{
-
- uint32_t *rxF = (uint32_t*)&rxdataF_comp[0][((int32_t)symbol*frame_parms->N_RB_DL*12)];
- uint32_t *llr32;
- int i,len;
- uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
-
- /*
- if (first_symbol_flag==1) {
- llr32 = (uint32_t*)dlsch_llr;
- } else {
- llr32 = (uint32_t*)(*llr32p);
- }*/
-
- llr32 = (uint32_t*)dlsch_llr;
- if (!llr32) {
- LOG_E(PHY,"dlsch_qpsk_llr: llr is null, symbol %d, llr32=%p\n",symbol, llr32);
- return(-1);
- }
-
-
- if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
- if (frame_parms->nb_antenna_ports_eNB!=1)
- len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
- else
- len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
- } else if((beamforming_mode==7) && (frame_parms->Ncp==0) && (symbol==3 || symbol==6 || symbol==9 || symbol==12)){
- len = (nb_rb*9) - (3*pbch_pss_sss_adjust/4);
- } else if((beamforming_mode==7) && (frame_parms->Ncp==1) && (symbol==4 || symbol==7 || symbol==10)){
- len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
- } else {
- len = (nb_rb*12) - pbch_pss_sss_adjust;
- }
-
-
- /*
- LOG_I(PHY,"dlsch_qpsk_llr: [symb %d / FirstSym %d / Length %d]: @LLR Buff %x, @LLR Buff(symb) %x \n",
- symbol,
- first_symbol_flag,
- len,
- dlsch_llr,
- llr32);
- */
- //printf("ll32p=%p , dlsch_llr=%p, symbol=%d, flag=%d \n", llr32, dlsch_llr, symbol, first_symbol_flag);
- for (i=0; iN_RB_DL*12];
- int16_t rho_rho_amp_x0[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;
- 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=0x1fff;//dlsch0->sqrt_rho_b; already taken into account
- else //pilots=0
- amp_tmp=0x1fff;//1.5*dlsch0->sqrt_rho_a; already taken into account
-
- 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);
-
- if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
- if (frame_parms->nb_antenna_ports_eNB!=1)
- 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);
-
- mult_cpx_vector((int16_t *)rho_1, //Q15
- (int16_t *)rho_amp_x0, //Q13
- (int16_t*)rho_rho_amp_x0,
- len,
- 13);
-
-#ifdef DEBUG_LLR_SIC
- write_output("rho_for_multipl.m","rho_for_m", 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);
-#endif
-
- sub_cpx_vector16((int16_t *)rxF,
- (int16_t *)rho_rho_amp_x0,
- //(int16_t *)clean_x1,
- (int16_t *)rxF,
- len*2);
-
-#ifdef DEBUG_LLR_SIC
- write_output("rxFdata_comp1_after.m","rxF_a", rxF,len,1,1);
- write_output("rxF_comp1.m","rxF_1_comp", rxF,len,1,
- symbol==num_pdcch_symbols ? 15 :
- symbol==nsymb-1 ? 14 : 13);
-#endif
-
- //this is for QPSK only!!!
- for (i=0; iN_RB_DL*12)];
- __m128i *ch_mag;
- __m128i llr128[2];
- uint32_t *llr32;
-#elif defined(__arm__)
- int16x8_t *rxF = (int16x8_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
- int16x8_t *ch_mag;
- int16x8_t xmm0;
- int16_t *llr16;
-#endif
-
-
- int i,len;
- unsigned char symbol_mod,len_mod4=0;
-
-
-#if defined(__x86_64__) || defined(__i386__)
- if (first_symbol_flag==1) {
- llr32 = (uint32_t*)dlsch_llr;
- } else {
- llr32 = (uint32_t*)*llr32p;
- }
-#elif defined(__arm__)
- if (first_symbol_flag==1) {
- llr16 = (int16_t*)dlsch_llr;
- } else {
- llr16 = (int16_t*)*llr32p;
- }
-#endif
-
- symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
-
-#if defined(__x86_64__) || defined(__i386__)
- ch_mag = (__m128i*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)];
-#elif defined(__arm__)
- ch_mag = (int16x8_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)];
-#endif
- if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
- if (frame_parms->nb_antenna_ports_eNB!=1)
- len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
- else
- len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
- } else if((beamforming_mode==7) && (frame_parms->Ncp==0) && (symbol==3 || symbol==6 || symbol==9 || symbol==12)){
- len = (nb_rb*9) - (3*pbch_pss_sss_adjust/4);
- } else if((beamforming_mode==7) && (frame_parms->Ncp==1) && (symbol==4 || symbol==7 || symbol==10)){
- len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
- } else {
- len = (nb_rb*12) - pbch_pss_sss_adjust;
- }
-
- // update output pointer according to number of REs in this symbol (<<2 because 4 bits per RE)
- if (first_symbol_flag == 1)
- *llr32p = dlsch_llr + (len<<2);
- else
- *llr32p += (len<<2);
-
- // printf("len=%d\n", len);
- len_mod4 = len&3;
- // printf("len_mod4=%d\n", len_mod4);
- len>>=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];
- uint16_t amp_tmp;
- uint32_t *llr32=(uint32_t*)dlsch_llr;
- int i, len, nsymb;
- uint8_t symbol, symbol_mod;
- 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=0x1fff;//dlsch0->sqrt_rho_b; already taken into account
- if (frame_parms->nb_antenna_ports_eNB!=1)
- len = nb_rb*8 - (2*pbch_pss_sss_adjust/3);
- else
- len = nb_rb*10 - (5*pbch_pss_sss_adjust/6);
- } else {
- amp_tmp=0x1fff;;//dlsch0->sqrt_rho_a; already taken into account
- 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)];
- __m128i *ch_mag,*ch_magb;
-#elif defined(__arm__)
- int16x8_t *rxF = (int16x8_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
- int16x8_t *ch_mag,*ch_magb,xmm1,xmm2;
-#endif
- int i,len,len2;
- unsigned char symbol_mod,len_mod4;
- short *llr;
- int16_t *llr2;
- int8_t *pllr_symbol;
-
- /*
- if (first_symbol_flag==1)
- llr = dlsch_llr;
- else
- llr = *llr_save;
- */
- llr = dlsch_llr;
-
- pllr_symbol = (int8_t*)dlsch_llr;
- pllr_symbol += llr_offset;
-
- symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
-
-#if defined(__x86_64__) || defined(__i386__)
- ch_mag = (__m128i*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)];
- ch_magb = (__m128i*)&dl_ch_magb[0][(symbol*frame_parms->N_RB_DL*12)];
-#elif defined(__arm__)
- ch_mag = (int16x8_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)];
- ch_magb = (int16x8_t*)&dl_ch_magb[0][(symbol*frame_parms->N_RB_DL*12)];
-#endif
- if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
- if (frame_parms->nb_antenna_ports_eNB!=1)
- len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
- else
- len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
- } else if((beamforming_mode==7) && (frame_parms->Ncp==0) && (symbol==3 || symbol==6 || symbol==9 || symbol==12)){
- len = (nb_rb*9) - (3*pbch_pss_sss_adjust/4);
- } else if((beamforming_mode==7) && (frame_parms->Ncp==1) && (symbol==4 || symbol==7 || symbol==10)){
- len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
- } else {
- len = (nb_rb*12) - pbch_pss_sss_adjust;
- }
-
-// printf("dlsch_64qam_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
-
-/* LOG_I(PHY,"dlsch_64qam_llr [symb %d / FirstSym %d / Length %d]: @LLR Buff %x \n",
- symbol,
- first_symbol_flag,
- len,
- dlsch_llr,
- pllr_symbol);*/
-
- llr2 = llr;
- llr += (len*6);
-
- len_mod4 =len&3;
- len2=len>>2; // length in quad words (4 REs)
- len2+=((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];
- 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 = 0x1fff;//dlsch0->sqrt_rho_b; already taken into account
- if (frame_parms->nb_antenna_ports_eNB!=1)
- len = nb_rb*8 - (2*pbch_pss_sss_adjust/3);
- else
- len = nb_rb*10 - (5*pbch_pss_sss_adjust/6);
- } else {
- amp_tmp = 0x1fff; //dlsch0->sqrt_rho_a; already taken into account
- 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; iN_RB_DL*12)];
- int16_t *rxF_i=(int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rho=(int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *llr16;
- int len;
- uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
-
- if (first_symbol_flag == 1) {
- llr16 = (int16_t*)dlsch_llr;
- } else {
- llr16 = (int16_t*)(*llr16p);
- }
-
- AssertFatal(llr16!=NULL,"dlsch_qpsk_qpsk_llr: llr is null, symbol %d\n",symbol);
-
- if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
- // if symbol has pilots
- if (frame_parms->nb_antenna_ports_eNB!=1)
- // in 2 antenna ports we have 8 REs per symbol per RB
- len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
- else
- // for 1 antenna port we have 10 REs per symbol per RB
- len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
- } else {
- // symbol has no pilots
- len = (nb_rb*12) - pbch_pss_sss_adjust;
- }
-
- // printf("dlsch_qpsk_qpsk_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
- // printf("qpsk_qpsk: len %d, llr16 %p\n",len,llr16);
- qpsk_qpsk((short *)rxF,
- (short *)rxF_i,
- (short *)llr16,
- (short *)rho,
- len);
-
- llr16 += (len<<1);
- *llr16p = (short *)llr16;
-
- return(0);
-}
-
-//__m128i ONE_OVER_SQRT_8 __attribute__((aligned(16)));
-
-void qpsk_qpsk(short *stream0_in,
- short *stream1_in,
- short *stream0_out,
- short *rho01,
- int length
- )
-{
-
- /*
- This function computes the LLRs of stream 0 (s_0) in presence of the interfering stream 1 (s_1) assuming that both symbols are QPSK. It can be used for both MU-MIMO interference-aware receiver or for SU-MIMO receivers.
-
- Parameters:
- stream0_in = Matched filter output y0' = (h0*g0)*y0
- stream1_in = Matched filter output y1' = (h0*g1)*y0
- stream0_out = LLRs
- rho01 = Correlation between the two effective channels \rho_{10} = (h1*g1)*(h0*g0)
- length = number of resource elements
- */
-
-#if defined(__x86_64__) || defined(__i386__)
- __m128i *rho01_128i = (__m128i *)rho01;
- __m128i *stream0_128i_in = (__m128i *)stream0_in;
- __m128i *stream1_128i_in = (__m128i *)stream1_in;
- __m128i *stream0_128i_out = (__m128i *)stream0_out;
- __m128i ONE_OVER_SQRT_8 = _mm_set1_epi16(23170); //round(2^16/sqrt(8))
-#elif defined(__arm__)
- int16x8_t *rho01_128i = (int16x8_t *)rho01;
- int16x8_t *stream0_128i_in = (int16x8_t *)stream0_in;
- int16x8_t *stream1_128i_in = (int16x8_t *)stream1_in;
- int16x8_t *stream0_128i_out = (int16x8_t *)stream0_out;
- int16x8_t ONE_OVER_SQRT_8 = vdupq_n_s16(23170); //round(2^16/sqrt(8))
-#endif
-
- int i;
-
-
- for (i=0; i>2; i+=2) {
- // in each iteration, we take 8 complex samples
-#if defined(__x86_64__) || defined(__i386__)
- xmm0 = rho01_128i[i]; // 4 symbols
- xmm1 = rho01_128i[i+1];
-
- // put (rho_r + rho_i)/2sqrt2 in rho_rpi
- // put (rho_r - rho_i)/2sqrt2 in rho_rmi
-
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho)
- xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho)
- rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho)
- rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho)
-
- // divide by sqrt(8), no shift needed ONE_OVER_SQRT_8 = Q1.16
- rho_rpi = _mm_mulhi_epi16(rho_rpi,ONE_OVER_SQRT_8);
- rho_rmi = _mm_mulhi_epi16(rho_rmi,ONE_OVER_SQRT_8);
-#elif defined(__arm__)
-
-
-#endif
- // Compute LLR for first bit of stream 0
-
- // Compute real and imaginary parts of MF output for stream 0
-#if defined(__x86_64__) || defined(__i386__)
- xmm0 = stream0_128i_in[i];
- xmm1 = stream0_128i_in[i+1];
-
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)]
- y0i = _mm_unpackhi_epi64(xmm0,xmm1);
-
- y0r_over2 = _mm_srai_epi16(y0r,1); // divide by 2
- y0i_over2 = _mm_srai_epi16(y0i,1); // divide by 2
-#elif defined(__arm__)
-
-
-#endif
- // Compute real and imaginary parts of MF output for stream 1
-#if defined(__x86_64__) || defined(__i386__)
- xmm0 = stream1_128i_in[i];
- xmm1 = stream1_128i_in[i+1];
-
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)]
- y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)]
-
- y1r_over2 = _mm_srai_epi16(y1r,1); // divide by 2
- y1i_over2 = _mm_srai_epi16(y1i,1); // divide by 2
-
- // Compute the terms for the LLR of first bit
-
- xmm0 = _mm_setzero_si128(); // ZERO
-
- // 1 term for numerator of LLR
- xmm3 = _mm_subs_epi16(y1r_over2,rho_rpi);
- A = _mm_abs_epi16(xmm3); // A = |y1r/2 - rho/sqrt(8)|
- xmm2 = _mm_adds_epi16(A,y0i_over2); // = |y1r/2 - rho/sqrt(8)| + y0i/2
- xmm3 = _mm_subs_epi16(y1i_over2,rho_rmi);
- B = _mm_abs_epi16(xmm3); // B = |y1i/2 - rho*/sqrt(8)|
- logmax_num_re0 = _mm_adds_epi16(B,xmm2); // = |y1r/2 - rho/sqrt(8)|+|y1i/2 - rho*/sqrt(8)| + y0i/2
-
- // 2 term for numerator of LLR
- xmm3 = _mm_subs_epi16(y1r_over2,rho_rmi);
- C = _mm_abs_epi16(xmm3); // C = |y1r/2 - rho*/4|
- xmm2 = _mm_subs_epi16(C,y0i_over2); // = |y1r/2 - rho*/4| - y0i/2
- xmm3 = _mm_adds_epi16(y1i_over2,rho_rpi);
- D = _mm_abs_epi16(xmm3); // D = |y1i/2 + rho/4|
- xmm2 = _mm_adds_epi16(xmm2,D); // |y1r/2 - rho*/4| + |y1i/2 + rho/4| - y0i/2
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0,xmm2); // max, numerator done
-
- // 1 term for denominator of LLR
- xmm3 = _mm_adds_epi16(y1r_over2,rho_rmi);
- E = _mm_abs_epi16(xmm3); // E = |y1r/2 + rho*/4|
- xmm2 = _mm_adds_epi16(E,y0i_over2); // = |y1r/2 + rho*/4| + y0i/2
- xmm3 = _mm_subs_epi16(y1i_over2,rho_rpi);
- F = _mm_abs_epi16(xmm3); // F = |y1i/2 - rho/4|
- logmax_den_re0 = _mm_adds_epi16(F,xmm2); // = |y1r/2 + rho*/4| + |y1i/2 - rho/4| + y0i/2
-
- // 2 term for denominator of LLR
- xmm3 = _mm_adds_epi16(y1r_over2,rho_rpi);
- G = _mm_abs_epi16(xmm3); // G = |y1r/2 + rho/4|
- xmm2 = _mm_subs_epi16(G,y0i_over2); // = |y1r/2 + rho/4| - y0i/2
- xmm3 = _mm_adds_epi16(y1i_over2,rho_rmi);
- H = _mm_abs_epi16(xmm3); // H = |y1i/2 + rho*/4|
- xmm2 = _mm_adds_epi16(xmm2,H); // = |y1r/2 + rho/4| + |y1i/2 + rho*/4| - y0i/2
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0,xmm2); // max, denominator done
-
- // Compute the terms for the LLR of first bit
-
- // 1 term for nominator of LLR
- xmm2 = _mm_adds_epi16(A,y0r_over2);
- logmax_num_im0 = _mm_adds_epi16(B,xmm2); // = |y1r/2 - rho/4| + |y1i/2 - rho*/4| + y0r/2
-
- // 2 term for nominator of LLR
- xmm2 = _mm_subs_epi16(E,y0r_over2);
- xmm2 = _mm_adds_epi16(xmm2,F); // = |y1r/2 + rho*/4| + |y1i/2 - rho/4| - y0r/2
-
- logmax_num_im0 = _mm_max_epi16(logmax_num_im0,xmm2); // max, nominator done
-
- // 1 term for denominator of LLR
- xmm2 = _mm_adds_epi16(C,y0r_over2);
- logmax_den_im0 = _mm_adds_epi16(D,xmm2); // = |y1r/2 - rho*/4| + |y1i/2 + rho/4| - y0r/2
-
- xmm2 = _mm_subs_epi16(G,y0r_over2);
- xmm2 = _mm_adds_epi16(xmm2,H); // = |y1r/2 + rho/4| + |y1i/2 + rho*/4| - y0r/2
-
- logmax_den_im0 = _mm_max_epi16(logmax_den_im0,xmm2); // max, denominator done
-
- // LLR of first bit [L1(1), L1(2), L1(3), L1(4)]
- y0r = _mm_adds_epi16(y0r,logmax_num_re0);
- y0r = _mm_subs_epi16(y0r,logmax_den_re0);
-
- // LLR of second bit [L2(1), L2(2), L2(3), L2(4)]
- y0i = _mm_adds_epi16(y0i,logmax_num_im0);
- y0i = _mm_subs_epi16(y0i,logmax_den_im0);
-
- _mm_storeu_si128(&stream0_128i_out[i],_mm_unpacklo_epi16(y0r,y0i)); // = [L1(1), L2(1), L1(2), L2(2)]
-
- if (i<((length>>1) - 1)) // false if only 2 REs remain
- _mm_storeu_si128(&stream0_128i_out[i+1],_mm_unpackhi_epi16(y0r,y0i));
-
-#elif defined(__x86_64__)
-
-#endif
- }
-
-#if defined(__x86_64__) || defined(__i386__)
- _mm_empty();
- _m_empty();
-#endif
-}
-
-int dlsch_qpsk_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
- int32_t **rxdataF_comp,
- int32_t **rxdataF_comp_i,
- int32_t **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10})
- int32_t **rho_i,
- int16_t *dlsch_llr,
- uint8_t symbol,
- uint8_t first_symbol_flag,
- uint16_t nb_rb,
- uint16_t pbch_pss_sss_adjust,
- int16_t **llr16p)
-{
-
- int16_t *rxF=(int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rxF_i=(int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rho=(int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *llr16;
- int len;
- uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
-
- if (first_symbol_flag == 1) {
- llr16 = (int16_t*)dlsch_llr;
- } else {
- llr16 = (int16_t*)(*llr16p);
- }
-
- AssertFatal(llr16!=NULL,"dlsch_qpsk_qpsk_llr: llr is null, symbol %d\n",symbol);
-
-
- if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
- // if symbol has pilots
- if (frame_parms->nb_antenna_ports_eNB!=1)
- // in 2 antenna ports we have 8 REs per symbol per RB
- len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
- else
- // for 1 antenna port we have 10 REs per symbol per RB
- len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
- } else {
- // symbol has no pilots
- len = (nb_rb*12) - pbch_pss_sss_adjust;
- }
-
- qpsk_qam16((short *)rxF,
- (short *)rxF_i,
- (short *)ch_mag_i,
- (short *)llr16,
- (short *)rho,
- len);
-
- llr16 += (len<<1);
- *llr16p = (short *)llr16;
-
- return(0);
-}
-
-/*
-#if defined(__x86_64__) || defined(__i386__)
-__m128i ONE_OVER_SQRT_2 __attribute__((aligned(16)));
-__m128i ONE_OVER_SQRT_10 __attribute__((aligned(16)));
-__m128i THREE_OVER_SQRT_10 __attribute__((aligned(16)));
-__m128i ONE_OVER_SQRT_10_Q15 __attribute__((aligned(16)));
-__m128i SQRT_10_OVER_FOUR __attribute__((aligned(16)));
-__m128i ch_mag_int;
-#endif
-*/
-void qpsk_qam16(int16_t *stream0_in,
- int16_t *stream1_in,
- int16_t *ch_mag_i,
- int16_t *stream0_out,
- int16_t *rho01,
- int32_t length
- )
-{
- /*
- This function computes the LLRs of stream 0 (s_0) in presence of the interfering stream 1 (s_1) assuming that both symbols are QPSK. It can be used for both MU-MIMO interference-aware receiver or for SU-MIMO receivers.
-
- Parameters:
- stream0_in = Matched filter output y0' = (h0*g0)*y0
- stream1_in = Matched filter output y1' = (h0*g1)*y0
- stream0_out = LLRs
- rho01 = Correlation between the two effective channels \rho_{10} = (h1*g1)*(h0*g0)
- length = number of resource elements
- */
-
-#if defined(__x86_64__) || defined(__i386__)
- __m128i *rho01_128i = (__m128i *)rho01;
- __m128i *stream0_128i_in = (__m128i *)stream0_in;
- __m128i *stream1_128i_in = (__m128i *)stream1_in;
- __m128i *stream0_128i_out = (__m128i *)stream0_out;
- __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_Q15 = _mm_set1_epi16(10362); // round(1/sqrt(10)*2^15)
- __m128i THREE_OVER_SQRT_10 = _mm_set1_epi16(31086); // round(3/sqrt(10)*2^15)
- __m128i SQRT_10_OVER_FOUR = _mm_set1_epi16(25905); // round(sqrt(10)/4*2^15)
- __m128i ch_mag_int __attribute__((aligned(16)));
-#elif defined(__arm__)
- int16x8_t *rho01_128i = (int16x8_t *)rho01;
- int16x8_t *stream0_128i_in = (int16x8_t *)stream0_in;
- int16x8_t *stream1_128i_in = (int16x8_t *)stream1_in;
- int16x8_t *stream0_128i_out = (int16x8_t *)stream0_out;
- int16x8_t *ch_mag_128i_i = (int16x8_t *)ch_mag_i;
- int16x8_t ONE_OVER_SQRT_2 = vdupq_n_s16(23170); // round(1/sqrt(2)*2^15)
- int16x8_t ONE_OVER_SQRT_10_Q15 = vdupq_n_s16(10362); // round(1/sqrt(10)*2^15)
- int16x8_t THREE_OVER_SQRT_10 = vdupq_n_s16(31086); // round(3/sqrt(10)*2^15)
- int16x8_t SQRT_10_OVER_FOUR = vdupq_n_s16(25905); // round(sqrt(10)/4*2^15)
- int16x8_t ch_mag_int __attribute__((aligned(16)));
-#endif
-
-#ifdef DEBUG_LLR
- print_shorts2("rho01_128i:\n",rho01_128i);
-#endif
-
- int i;
-
-
- for (i=0; i>2; i+=2) {
- // in each iteration, we take 8 complex samples
-
-#if defined(__x86_64__) || defined(__i386__)
-
- xmm0 = rho01_128i[i]; // 4 symbols
- xmm1 = rho01_128i[i+1];
-
- // put (rho_r + rho_i)/2sqrt2 in rho_rpi
- // put (rho_r - rho_i)/2sqrt2 in rho_rmi
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho)
- xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho)
- rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho)
- rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho)
-
- // divide by sqrt(2)
- rho_rpi = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_2);
- rho_rmi = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_2);
- rho_rpi = _mm_slli_epi16(rho_rpi,1);
- rho_rmi = _mm_slli_epi16(rho_rmi,1);
-
- // Compute LLR for first bit of stream 0
-
- // Compute real and imaginary parts of MF output for stream 0
- xmm0 = stream0_128i_in[i];
- xmm1 = stream0_128i_in[i+1];
-
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)]
- y0i = _mm_unpackhi_epi64(xmm0,xmm1);
-
- // divide by sqrt(2)
- y0r_over2 = _mm_mulhi_epi16(y0r, ONE_OVER_SQRT_2);
- y0i_over2 = _mm_mulhi_epi16(y0i, ONE_OVER_SQRT_2);
- y0r_over2 = _mm_slli_epi16(y0r,1);
- y0i_over2 = _mm_slli_epi16(y0i,1);
-
- y0_p_1_1 = _mm_adds_epi16(y0r_over2, y0i_over2);
- y0_m_1_1 = _mm_subs_epi16(y0r_over2, y0i_over2);
-
- // Compute real and imaginary parts of MF output for stream 1
- xmm0 = stream1_128i_in[i];
- xmm1 = stream1_128i_in[i+1];
-
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)]
- y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)]
-
- xmm0 = _mm_setzero_si128(); // ZERO
-
- // compute psi
- xmm3 = _mm_subs_epi16(y1r,rho_rpi);
- psi_r_p1_p1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_subs_epi16(y1i,rho_rmi);
- psi_i_p1_p1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_subs_epi16(y1r,rho_rmi);
- psi_r_p1_m1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_adds_epi16(y1i,rho_rpi);
- psi_i_p1_m1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_adds_epi16(y1r,rho_rmi);
- psi_r_m1_p1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_subs_epi16(y1i,rho_rpi);
- psi_i_m1_p1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_adds_epi16(y1r,rho_rpi);
- psi_r_m1_m1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_adds_epi16(y1i,rho_rmi);
- psi_i_m1_m1 = _mm_abs_epi16(xmm3);
-
- // Rearrange interfering channel magnitudes
- xmm2 = ch_mag_128i_i[i];
- xmm3 = ch_mag_128i_i[i+1];
-
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
-
- ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3);
-
- // calculate optimal interference amplitudes
- interference_abs_epi16(psi_r_p1_p1 , ch_mag_int, a_r_p1_p1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_p1 , ch_mag_int, a_i_p1_p1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_m1 , ch_mag_int, a_r_p1_m1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_m1 , ch_mag_int, a_i_p1_m1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_p1 , ch_mag_int, a_r_m1_p1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_p1 , ch_mag_int, a_i_m1_p1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_m1 , ch_mag_int, a_r_m1_m1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_m1 , ch_mag_int, a_i_m1_m1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
-
- // prodsum
- prodsum_psi_a_epi16(psi_r_p1_p1, a_r_p1_p1, psi_i_p1_p1, a_i_p1_p1, psi_a_p1_p1);
- prodsum_psi_a_epi16(psi_r_p1_m1, a_r_p1_m1, psi_i_p1_m1, a_i_p1_m1, psi_a_p1_m1);
- prodsum_psi_a_epi16(psi_r_m1_p1, a_r_m1_p1, psi_i_m1_p1, a_i_m1_p1, psi_a_m1_p1);
- prodsum_psi_a_epi16(psi_r_m1_m1, a_r_m1_m1, psi_i_m1_m1, a_i_m1_m1, psi_a_m1_m1);
-
- // squares
- square_a_epi16(a_r_p1_p1, a_i_p1_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_p1);
- square_a_epi16(a_r_p1_m1, a_i_p1_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_m1);
- square_a_epi16(a_r_m1_p1, a_i_m1_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_p1);
- square_a_epi16(a_r_m1_m1, a_i_m1_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_m1);
-
- // Computing Metrics
- xmm0 = _mm_subs_epi16(psi_a_p1_p1, a_sq_p1_p1);
- bit_met_p1_p1 = _mm_adds_epi16(xmm0, y0_p_1_1);
-
- xmm0 = _mm_subs_epi16(psi_a_p1_m1, a_sq_p1_m1);
- bit_met_p1_m1 = _mm_adds_epi16(xmm0, y0_m_1_1);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_p1, a_sq_m1_p1);
- bit_met_m1_p1 = _mm_subs_epi16(xmm0, y0_m_1_1);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_m1, a_sq_m1_m1);
- bit_met_m1_m1 = _mm_subs_epi16(xmm0, y0_p_1_1);
-
- // MSB
- logmax_num_re0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_m1); // bit=0
- logmax_den_re0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_m1); // bit=1
-
- y0r = _mm_subs_epi16(logmax_num_re0,logmax_den_re0);
-
- // LSB
- logmax_num_im0 = _mm_max_epi16(bit_met_p1_p1,bit_met_m1_p1); // bit=0
- logmax_den_im0 = _mm_max_epi16(bit_met_p1_m1,bit_met_m1_m1); // bit=1
-
- y0i = _mm_subs_epi16(logmax_num_im0,logmax_den_im0);
-
- stream0_128i_out[i] = _mm_unpacklo_epi16(y0r,y0i); // = [L1(1), L2(1), L1(2), L2(2)]
-
- if (i<((length>>1) - 1)) // false if only 2 REs remain
- stream0_128i_out[i+1] = _mm_unpackhi_epi16(y0r,y0i);
-
-#elif defined(__arm__)
-
-#endif
- }
-
-#if defined(__x86_64__) || defined(__i386__)
- _mm_empty();
- _m_empty();
-#endif
-}
-
-int dlsch_qpsk_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
- int32_t **rxdataF_comp,
- int32_t **rxdataF_comp_i,
- int32_t **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10})
- int32_t **rho_i,
- int16_t *dlsch_llr,
- uint8_t symbol,
- uint8_t first_symbol_flag,
- uint16_t nb_rb,
- uint16_t pbch_pss_sss_adjust,
- int16_t **llr16p)
-{
-
- int16_t *rxF=(int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rxF_i=(int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rho=(int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *llr16;
- int len;
- uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
-
-
- if (first_symbol_flag == 1) {
- llr16 = (int16_t*)dlsch_llr;
- } else {
- llr16 = (int16_t*)(*llr16p);
- }
-
- AssertFatal(llr16!=NULL,"dlsch_qpsk_qam64_llr: llr is null, symbol %d\n",symbol);
-
- if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
- // if symbol has pilots
- if (frame_parms->nb_antenna_ports_eNB!=1)
- // in 2 antenna ports we have 8 REs per symbol per RB
- len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
- else
- // for 1 antenna port we have 10 REs per symbol per RB
- len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
- } else {
- // symbol has no pilots
- len = (nb_rb*12) - pbch_pss_sss_adjust;
- }
-
- qpsk_qam64((short *)rxF,
- (short *)rxF_i,
- (short *)ch_mag_i,
- (short *)llr16,
- (short *)rho,
- len);
-
- llr16 += (len<<1);
- *llr16p = (short *)llr16;
-
- return(0);
-}
-/*
-__m128i ONE_OVER_SQRT_2_42 __attribute__((aligned(16)));
-__m128i THREE_OVER_SQRT_2_42 __attribute__((aligned(16)));
-__m128i FIVE_OVER_SQRT_2_42 __attribute__((aligned(16)));
-__m128i SEVEN_OVER_SQRT_2_42 __attribute__((aligned(16)));
-
-__m128i ch_mag_int_with_sigma2 __attribute__((aligned(16)));
-__m128i two_ch_mag_int_with_sigma2 __attribute__((aligned(16)));
-__m128i three_ch_mag_int_with_sigma2 __attribute__((aligned(16)));
-__m128i SQRT_42_OVER_FOUR __attribute__((aligned(16)));
-*/
-void qpsk_qam64(short *stream0_in,
- short *stream1_in,
- short *ch_mag_i,
- short *stream0_out,
- short *rho01,
- int length
- )
-{
-
- /*
- This function computes the LLRs of stream 0 (s_0) in presence of the interfering stream 1 (s_1) assuming that both symbols are QPSK. It can be used for both MU-MIMO interference-aware receiver or for SU-MIMO receivers.
-
- Parameters:
- stream0_in = Matched filter output y0' = (h0*g0)*y0
- stream1_in = Matched filter output y1' = (h0*g1)*y0
- stream0_out = LLRs
- rho01 = Correlation between the two effective channels \rho_{10} = (h1*g1)*(h0*g0)
- length = number of resource elements
- */
-
-#if defined(__x86_64__) || defined(__i386__)
- __m128i *rho01_128i = (__m128i *)rho01;
- __m128i *stream0_128i_in = (__m128i *)stream0_in;
- __m128i *stream1_128i_in = (__m128i *)stream1_in;
- __m128i *stream0_128i_out = (__m128i *)stream0_out;
- __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_2_42 = _mm_set1_epi16(3575); // round(1/sqrt(2*42)*2^15)
- __m128i THREE_OVER_SQRT_2_42 = _mm_set1_epi16(10726); // round(3/sqrt(2*42)*2^15)
- __m128i FIVE_OVER_SQRT_2_42 = _mm_set1_epi16(17876); // round(5/sqrt(2*42)*2^15)
- __m128i SEVEN_OVER_SQRT_2_42 = _mm_set1_epi16(25027); // round(7/sqrt(2*42)*2^15)
- __m128i SQRT_42_OVER_FOUR = _mm_set1_epi16(13272); // round(sqrt(42)/4*2^13), Q3.1
- __m128i ch_mag_int;
- __m128i ch_mag_int_with_sigma2;
- __m128i two_ch_mag_int_with_sigma2;
- __m128i three_ch_mag_int_with_sigma2;
-#elif defined(__arm__)
-
-#endif
-
-#ifdef DEBUG_LLR
- print_shorts2("rho01_128i:\n",rho01_128i);
-#endif
-
- int i;
-
-
- for (i=0; i>2; i+=2) {
- // in each iteration, we take 8 complex samples
-
-#if defined(__x86_64__) || defined(__i386__)
-
- xmm0 = rho01_128i[i]; // 4 symbols
- xmm1 = rho01_128i[i+1];
-
- // put (rho_r + rho_i)/sqrt2 in rho_rpi
- // put (rho_r - rho_i)/sqrt2 in rho_rmi
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho)
- xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho)
- rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho)
- rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho)
-
- // divide by sqrt(2)
- rho_rpi = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_2);
- rho_rmi = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_2);
- rho_rpi = _mm_slli_epi16(rho_rpi,1);
- rho_rmi = _mm_slli_epi16(rho_rmi,1);
-
- // Compute LLR for first bit of stream 0
-
- // Compute real and imaginary parts of MF output for stream 0
- xmm0 = stream0_128i_in[i];
- xmm1 = stream0_128i_in[i+1];
-
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)]
- y0i = _mm_unpackhi_epi64(xmm0,xmm1);
-
- // divide by sqrt(2)
- y0r_over2 = _mm_mulhi_epi16(y0r, ONE_OVER_SQRT_2);
- y0i_over2 = _mm_mulhi_epi16(y0i, ONE_OVER_SQRT_2);
- y0r_over2 = _mm_slli_epi16(y0r,1);
- y0i_over2 = _mm_slli_epi16(y0i,1);
-
- y0_p_1_1 = _mm_adds_epi16(y0r_over2, y0i_over2);
- y0_m_1_1 = _mm_subs_epi16(y0r_over2, y0i_over2);
-
- // Compute real and imaginary parts of MF output for stream 1
- xmm0 = stream1_128i_in[i];
- xmm1 = stream1_128i_in[i+1];
-
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)]
- y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)]
-
- xmm0 = _mm_setzero_si128(); // ZERO
-
- // compute psi
- xmm3 = _mm_subs_epi16(y1r,rho_rpi);
- psi_r_p1_p1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_subs_epi16(y1i,rho_rmi);
- psi_i_p1_p1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_subs_epi16(y1r,rho_rmi);
- psi_r_p1_m1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_adds_epi16(y1i,rho_rpi);
- psi_i_p1_m1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_adds_epi16(y1r,rho_rmi);
- psi_r_m1_p1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_subs_epi16(y1i,rho_rpi);
- psi_i_m1_p1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_adds_epi16(y1r,rho_rpi);
- psi_r_m1_m1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_adds_epi16(y1i,rho_rmi);
- psi_i_m1_m1 = _mm_abs_epi16(xmm3);
-
- // Rearrange interfering channel magnitudes
- xmm2 = ch_mag_128i_i[i];
- xmm3 = ch_mag_128i_i[i+1];
-
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
-
- ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3);
- ch_mag_int_with_sigma2 = _mm_srai_epi16(ch_mag_int, 1); // *2
- two_ch_mag_int_with_sigma2 = ch_mag_int; // *4
- three_ch_mag_int_with_sigma2 = _mm_adds_epi16(ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2); // *6
-
- interference_abs_64qam_epi16(psi_r_p1_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
-
- // prodsum
- prodsum_psi_a_epi16(psi_r_p1_p1, a_r_p1_p1, psi_i_p1_p1, a_i_p1_p1, psi_a_p1_p1);
- prodsum_psi_a_epi16(psi_r_p1_m1, a_r_p1_m1, psi_i_p1_m1, a_i_p1_m1, psi_a_p1_m1);
- prodsum_psi_a_epi16(psi_r_m1_p1, a_r_m1_p1, psi_i_m1_p1, a_i_m1_p1, psi_a_m1_p1);
- prodsum_psi_a_epi16(psi_r_m1_m1, a_r_m1_m1, psi_i_m1_m1, a_i_m1_m1, psi_a_m1_m1);
-
- // Multiply by sqrt(2)
- psi_a_p1_p1 = _mm_mulhi_epi16(psi_a_p1_p1, ONE_OVER_SQRT_2);
- psi_a_p1_p1 = _mm_slli_epi16(psi_a_p1_p1, 2);
- psi_a_p1_m1 = _mm_mulhi_epi16(psi_a_p1_m1, ONE_OVER_SQRT_2);
- psi_a_p1_m1 = _mm_slli_epi16(psi_a_p1_m1, 2);
- psi_a_m1_p1 = _mm_mulhi_epi16(psi_a_m1_p1, ONE_OVER_SQRT_2);
- psi_a_m1_p1 = _mm_slli_epi16(psi_a_m1_p1, 2);
- psi_a_m1_m1 = _mm_mulhi_epi16(psi_a_m1_m1, ONE_OVER_SQRT_2);
- psi_a_m1_m1 = _mm_slli_epi16(psi_a_m1_m1, 2);
-
- square_a_64qam_epi16(a_r_p1_p1, a_i_p1_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_p1);
- square_a_64qam_epi16(a_r_p1_m1, a_i_p1_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_m1);
- square_a_64qam_epi16(a_r_m1_p1, a_i_m1_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_p1);
- square_a_64qam_epi16(a_r_m1_m1, a_i_m1_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_m1);
-
- // Computing Metrics
- xmm0 = _mm_subs_epi16(psi_a_p1_p1, a_sq_p1_p1);
- bit_met_p1_p1 = _mm_adds_epi16(xmm0, y0_p_1_1);
-
- xmm0 = _mm_subs_epi16(psi_a_p1_m1, a_sq_p1_m1);
- bit_met_p1_m1 = _mm_adds_epi16(xmm0, y0_m_1_1);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_p1, a_sq_m1_p1);
- bit_met_m1_p1 = _mm_subs_epi16(xmm0, y0_m_1_1);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_m1, a_sq_m1_m1);
- bit_met_m1_m1 = _mm_subs_epi16(xmm0, y0_p_1_1);
-
- // MSB
- logmax_num_re0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_m1); // bit=0
- logmax_den_re0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_m1); // bit=1
-
- y0r = _mm_subs_epi16(logmax_num_re0,logmax_den_re0);
-
- // LSB
- logmax_num_im0 = _mm_max_epi16(bit_met_p1_p1,bit_met_m1_p1); // bit=0
- logmax_den_im0 = _mm_max_epi16(bit_met_p1_m1,bit_met_m1_m1); // bit=1
-
- y0i = _mm_subs_epi16(logmax_num_im0,logmax_den_im0);
-
- stream0_128i_out[i] = _mm_unpacklo_epi16(y0r,y0i); // = [L1(1), L2(1), L1(2), L2(2)]
-
- if (i<((length>>1) - 1)) // false if only 2 REs remain
- stream0_128i_out[i+1] = _mm_unpackhi_epi16(y0r,y0i);
-
-#elif defined(__arm__)
-
-#endif
- }
-
-#if defined(__x86_64__) || defined(__i386__)
- _mm_empty();
- _m_empty();
-#endif
-}
-
-
-//----------------------------------------------------------------------------------------------
-// 16-QAM
-//----------------------------------------------------------------------------------------------
-
-/*
-__m128i ONE_OVER_TWO_SQRT_10 __attribute__((aligned(16)));
-__m128i NINE_OVER_TWO_SQRT_10 __attribute__((aligned(16)));
-
-__m128i y0r_over_sqrt10 __attribute__ ((aligned(16)));
-__m128i y0i_over_sqrt10 __attribute__ ((aligned(16)));
-__m128i y0r_three_over_sqrt10 __attribute__ ((aligned(16)));
-__m128i y0i_three_over_sqrt10 __attribute__ ((aligned(16)));
-
-__m128i ch_mag_des __attribute__((aligned(16)));
-__m128i ch_mag_over_10 __attribute__ ((aligned(16)));
-__m128i ch_mag_over_2 __attribute__ ((aligned(16)));
-__m128i ch_mag_9_over_10 __attribute__ ((aligned(16)));
-*/
-
-void qam16_qpsk(short *stream0_in,
- short *stream1_in,
- short *ch_mag,
- short *stream0_out,
- short *rho01,
- int length
- )
-{
-
- /*
- Author: Sebastian Wagner
- Date: 2012-06-04
-
- Input:
- stream0_in: MF filter for 1st stream, i.e., y0=h0'*y
- stream!_in: MF filter for 2nd stream, i.e., y1=h1'*y
- ch_mag: 2*h0/sqrt(00), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- ch_mag_i: 2*h1/sqrt(00), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- rho01: Channel cross correlation, i.e., h1'*h0
-
- Output:
- stream0_out: output LLRs for 1st stream
- */
-
-#if defined(__x86_64__) || defined(__i386__)
- __m128i *rho01_128i = (__m128i *)rho01;
- __m128i *stream0_128i_in = (__m128i *)stream0_in;
- __m128i *stream1_128i_in = (__m128i *)stream1_in;
- __m128i *stream0_128i_out = (__m128i *)stream0_out;
- __m128i *ch_mag_128i = (__m128i *)ch_mag;
- __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)
- __m128i SQRT_10_OVER_FOUR = _mm_set1_epi16(25905); // round(sqrt(10)/4*2^15)
- __m128i ONE_OVER_TWO_SQRT_10 = _mm_set1_epi16(10362); // round(1/2/sqrt(10)*2^16)
- __m128i NINE_OVER_TWO_SQRT_10 = _mm_set1_epi16(23315); // round(9/2/sqrt(10)*2^14)
- __m128i y0r_over_sqrt10;
- __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;
- __m128i ch_mag_9_over_10;
-#elif defined(__arm__)
-
-#endif
-
- int i;
-
-
- for (i=0; i>2; i+=2) {
- // In one iteration, we deal with 8 REs
-
-#if defined(__x86_64__) || defined(__i386__)
- // Get rho
- xmm0 = rho01_128i[i];
- xmm1 = rho01_128i[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho)
- xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho)
- rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho)
- rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho)
-
- // Compute the different rhos
- rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi,ONE_OVER_SQRT_10);
- rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi,ONE_OVER_SQRT_10);
- rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi,THREE_OVER_SQRT_10);
- rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi,THREE_OVER_SQRT_10);
- rho_rpi_3_3 = _mm_slli_epi16(rho_rpi_3_3,1);
- rho_rmi_3_3 = _mm_slli_epi16(rho_rmi_3_3,1);
-
- xmm4 = _mm_mulhi_epi16(xmm2,ONE_OVER_SQRT_10); // Re(rho)
- xmm5 = _mm_mulhi_epi16(xmm3,THREE_OVER_SQRT_10); // Im(rho)
- xmm5 = _mm_slli_epi16(xmm5,1);
-
- rho_rpi_1_3 = _mm_adds_epi16(xmm4,xmm5);
- rho_rmi_1_3 = _mm_subs_epi16(xmm4,xmm5);
-
- xmm6 = _mm_mulhi_epi16(xmm2,THREE_OVER_SQRT_10); // Re(rho)
- xmm7 = _mm_mulhi_epi16(xmm3,ONE_OVER_SQRT_10); // Im(rho)
- xmm6 = _mm_slli_epi16(xmm6,1);
-
- rho_rpi_3_1 = _mm_adds_epi16(xmm6,xmm7);
- rho_rmi_3_1 = _mm_subs_epi16(xmm6,xmm7);
-
- // Rearrange interfering MF output
- xmm0 = stream1_128i_in[i];
- xmm1 = stream1_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)]
- y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)]
-
- xmm0 = _mm_setzero_si128(); // ZERO
- xmm2 = _mm_subs_epi16(rho_rpi_1_1,y1r); // = [Re(rho)+ Im(rho)]/sqrt(10) - y1r
- psi_r_p1_p1 = _mm_abs_epi16(xmm2); // = |[Re(rho)+ Im(rho)]/sqrt(10) - y1r|
-
- xmm2= _mm_subs_epi16(rho_rmi_1_1,y1r);
- psi_r_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_1_1,y1i);
- psi_i_p1_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_1_3,y1r);
- psi_r_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_1_3,y1r);
- psi_r_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_1,y1i);
- psi_i_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_1,y1r);
- psi_r_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_1,y1r);
- psi_r_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_1_3,y1i);
- psi_i_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_3,y1r);
- psi_r_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_3,y1r);
- psi_r_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_3,y1i);
- psi_i_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_1_1,y1i);
- psi_i_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_1,y1i);
- psi_i_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_1_3,y1i);
- psi_i_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_3,y1i);
- psi_i_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_1,y1i);
- psi_i_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_1,y1i);
- psi_i_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_3,y1i);
- psi_i_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_3,y1i);
- psi_i_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_1,y1r);
- psi_r_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_3,y1r);
- psi_r_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_1,y1r);
- psi_r_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_3,y1r);
- psi_r_m3_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_1_1);
- psi_r_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_1_3);
- psi_r_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_1_1);
- psi_i_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_3_1);
- psi_i_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_3_1);
- psi_r_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_3_3);
- psi_r_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_1_3);
- psi_i_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_3_3);
- psi_i_m3_m3 = _mm_abs_epi16(xmm2);
-
- // Rearrange desired MF output
- xmm0 = stream0_128i_in[i];
- xmm1 = stream0_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)]
- y0i = _mm_unpackhi_epi64(xmm0,xmm1);
-
- // Rearrange desired channel magnitudes
- xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10))
- xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10))
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
-
- ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3); // = [|h|^2(1),|h|^2(2),|h|^2(3),|h|^2(4)]*(2/sqrt(10))
-
- // Scale MF output of desired signal
- y0r_over_sqrt10 = _mm_mulhi_epi16(y0r,ONE_OVER_SQRT_10);
- y0i_over_sqrt10 = _mm_mulhi_epi16(y0i,ONE_OVER_SQRT_10);
- y0r_three_over_sqrt10 = _mm_mulhi_epi16(y0r,THREE_OVER_SQRT_10);
- y0i_three_over_sqrt10 = _mm_mulhi_epi16(y0i,THREE_OVER_SQRT_10);
- y0r_three_over_sqrt10 = _mm_slli_epi16(y0r_three_over_sqrt10,1);
- y0i_three_over_sqrt10 = _mm_slli_epi16(y0i_three_over_sqrt10,1);
-
- // Compute necessary combination of required terms
- y0_p_1_1 = _mm_adds_epi16(y0r_over_sqrt10,y0i_over_sqrt10);
- y0_m_1_1 = _mm_subs_epi16(y0r_over_sqrt10,y0i_over_sqrt10);
-
- y0_p_1_3 = _mm_adds_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10);
- y0_m_1_3 = _mm_subs_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10);
-
- y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10);
- y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10);
-
- y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10);
- y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10);
-
- // Add psi
- psi_a_p1_p1 = _mm_adds_epi16(psi_r_p1_p1 ,psi_i_p1_p1);
- psi_a_p1_p3 = _mm_adds_epi16(psi_r_p1_p3 ,psi_i_p1_p3);
- psi_a_p3_p1 = _mm_adds_epi16(psi_r_p3_p1 ,psi_i_p3_p1);
- psi_a_p3_p3 = _mm_adds_epi16(psi_r_p3_p3 ,psi_i_p3_p3);
- psi_a_p1_m1 = _mm_adds_epi16(psi_r_p1_m1 ,psi_i_p1_m1);
- psi_a_p1_m3 = _mm_adds_epi16(psi_r_p1_m3 ,psi_i_p1_m3);
- psi_a_p3_m1 = _mm_adds_epi16(psi_r_p3_m1 ,psi_i_p3_m1);
- psi_a_p3_m3 = _mm_adds_epi16(psi_r_p3_m3 ,psi_i_p3_m3);
- psi_a_m1_p1 = _mm_adds_epi16(psi_r_m1_p1 ,psi_i_m1_p1);
- psi_a_m1_p3 = _mm_adds_epi16(psi_r_m1_p3 ,psi_i_m1_p3);
- psi_a_m3_p1 = _mm_adds_epi16(psi_r_m3_p1 ,psi_i_m3_p1);
- psi_a_m3_p3 = _mm_adds_epi16(psi_r_m3_p3 ,psi_i_m3_p3);
- psi_a_m1_m1 = _mm_adds_epi16(psi_r_m1_m1 ,psi_i_m1_m1);
- psi_a_m1_m3 = _mm_adds_epi16(psi_r_m1_m3 ,psi_i_m1_m3);
- psi_a_m3_m1 = _mm_adds_epi16(psi_r_m3_m1 ,psi_i_m3_m1);
- psi_a_m3_m3 = _mm_adds_epi16(psi_r_m3_m3 ,psi_i_m3_m3);
-
- // scale by sqrt(2)
- psi_a_p1_p1 = _mm_mulhi_epi16(psi_a_p1_p1,ONE_OVER_SQRT_2);
- psi_a_p1_p1 = _mm_slli_epi16(psi_a_p1_p1,1);
- psi_a_p1_p3 = _mm_mulhi_epi16(psi_a_p1_p3,ONE_OVER_SQRT_2);
- psi_a_p1_p3 = _mm_slli_epi16(psi_a_p1_p3,1);
- psi_a_p3_p1 = _mm_mulhi_epi16(psi_a_p3_p1,ONE_OVER_SQRT_2);
- psi_a_p3_p1 = _mm_slli_epi16(psi_a_p3_p1,1);
- psi_a_p3_p3 = _mm_mulhi_epi16(psi_a_p3_p3,ONE_OVER_SQRT_2);
- psi_a_p3_p3 = _mm_slli_epi16(psi_a_p3_p3,1);
-
- psi_a_p1_m1 = _mm_mulhi_epi16(psi_a_p1_m1,ONE_OVER_SQRT_2);
- psi_a_p1_m1 = _mm_slli_epi16(psi_a_p1_m1,1);
- psi_a_p1_m3 = _mm_mulhi_epi16(psi_a_p1_m3,ONE_OVER_SQRT_2);
- psi_a_p1_m3 = _mm_slli_epi16(psi_a_p1_m3,1);
- psi_a_p3_m1 = _mm_mulhi_epi16(psi_a_p3_m1,ONE_OVER_SQRT_2);
- psi_a_p3_m1 = _mm_slli_epi16(psi_a_p3_m1,1);
- psi_a_p3_m3 = _mm_mulhi_epi16(psi_a_p3_m3,ONE_OVER_SQRT_2);
- psi_a_p3_m3 = _mm_slli_epi16(psi_a_p3_m3,1);
-
- psi_a_m1_p1 = _mm_mulhi_epi16(psi_a_m1_p1,ONE_OVER_SQRT_2);
- psi_a_m1_p1 = _mm_slli_epi16(psi_a_m1_p1,1);
- psi_a_m1_p3 = _mm_mulhi_epi16(psi_a_m1_p3,ONE_OVER_SQRT_2);
- psi_a_m1_p3 = _mm_slli_epi16(psi_a_m1_p3,1);
- psi_a_m3_p1 = _mm_mulhi_epi16(psi_a_m3_p1,ONE_OVER_SQRT_2);
- psi_a_m3_p1 = _mm_slli_epi16(psi_a_m3_p1,1);
- psi_a_m3_p3 = _mm_mulhi_epi16(psi_a_m3_p3,ONE_OVER_SQRT_2);
- psi_a_m3_p3 = _mm_slli_epi16(psi_a_m3_p3,1);
-
- psi_a_m1_m1 = _mm_mulhi_epi16(psi_a_m1_m1,ONE_OVER_SQRT_2);
- psi_a_m1_m1 = _mm_slli_epi16(psi_a_m1_m1,1);
- psi_a_m1_m3 = _mm_mulhi_epi16(psi_a_m1_m3,ONE_OVER_SQRT_2);
- psi_a_m1_m3 = _mm_slli_epi16(psi_a_m1_m3,1);
- psi_a_m3_m1 = _mm_mulhi_epi16(psi_a_m3_m1,ONE_OVER_SQRT_2);
- psi_a_m3_m1 = _mm_slli_epi16(psi_a_m3_m1,1);
- psi_a_m3_m3 = _mm_mulhi_epi16(psi_a_m3_m3,ONE_OVER_SQRT_2);
- psi_a_m3_m3 = _mm_slli_epi16(psi_a_m3_m3,1);
-
- // Computing different multiples of channel norms
- ch_mag_over_10=_mm_mulhi_epi16(ch_mag_des, ONE_OVER_TWO_SQRT_10);
- ch_mag_over_2=_mm_mulhi_epi16(ch_mag_des, SQRT_10_OVER_FOUR);
- ch_mag_over_2=_mm_slli_epi16(ch_mag_over_2, 1);
- ch_mag_9_over_10=_mm_mulhi_epi16(ch_mag_des, NINE_OVER_TWO_SQRT_10);
- ch_mag_9_over_10=_mm_slli_epi16(ch_mag_9_over_10, 2);
-
- // Computing Metrics
- xmm1 = _mm_adds_epi16(psi_a_p1_p1, y0_p_1_1);
- bit_met_p1_p1= _mm_subs_epi16(xmm1, ch_mag_over_10);
-
- xmm1 = _mm_adds_epi16(psi_a_p1_p3, y0_p_1_3);
- bit_met_p1_p3= _mm_subs_epi16(xmm1, ch_mag_over_2);
-
- xmm1 = _mm_adds_epi16(psi_a_p1_m1, y0_m_1_1);
- bit_met_p1_m1= _mm_subs_epi16(xmm1, ch_mag_over_10);
-
- xmm1 = _mm_adds_epi16(psi_a_p1_m3, y0_m_1_3);
- bit_met_p1_m3= _mm_subs_epi16(xmm1, ch_mag_over_2);
-
- xmm1 = _mm_adds_epi16(psi_a_p3_p1, y0_p_3_1);
- bit_met_p3_p1= _mm_subs_epi16(xmm1, ch_mag_over_2);
-
- xmm1 = _mm_adds_epi16(psi_a_p3_p3, y0_p_3_3);
- bit_met_p3_p3= _mm_subs_epi16(xmm1, ch_mag_9_over_10);
-
- xmm1 = _mm_adds_epi16(psi_a_p3_m1, y0_m_3_1);
- bit_met_p3_m1= _mm_subs_epi16(xmm1, ch_mag_over_2);
-
- xmm1 = _mm_adds_epi16(psi_a_p3_m3, y0_m_3_3);
- bit_met_p3_m3= _mm_subs_epi16(xmm1, ch_mag_9_over_10);
-
- xmm1 = _mm_subs_epi16(psi_a_m1_p1, y0_m_1_1);
- bit_met_m1_p1= _mm_subs_epi16(xmm1, ch_mag_over_10);
-
- xmm1 = _mm_subs_epi16(psi_a_m1_p3, y0_m_1_3);
- bit_met_m1_p3= _mm_subs_epi16(xmm1, ch_mag_over_2);
-
- xmm1 = _mm_subs_epi16(psi_a_m1_m1, y0_p_1_1);
- bit_met_m1_m1= _mm_subs_epi16(xmm1, ch_mag_over_10);
-
- xmm1 = _mm_subs_epi16(psi_a_m1_m3, y0_p_1_3);
- bit_met_m1_m3= _mm_subs_epi16(xmm1, ch_mag_over_2);
-
- xmm1 = _mm_subs_epi16(psi_a_m3_p1, y0_m_3_1);
- bit_met_m3_p1= _mm_subs_epi16(xmm1, ch_mag_over_2);
-
- xmm1 = _mm_subs_epi16(psi_a_m3_p3, y0_m_3_3);
- bit_met_m3_p3= _mm_subs_epi16(xmm1, ch_mag_9_over_10);
-
- xmm1 = _mm_subs_epi16(psi_a_m3_m1, y0_p_3_1);
- bit_met_m3_m1= _mm_subs_epi16(xmm1, ch_mag_over_2);
-
- xmm1 = _mm_subs_epi16(psi_a_m3_m3, y0_p_3_3);
- bit_met_m3_m3= _mm_subs_epi16(xmm1, ch_mag_9_over_10);
-
- // LLR of the first bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3);
- xmm2 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_re0= _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3);
- xmm1 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of first bit [L1(1), L1(2), L1(3), L1(4), L1(5), L1(6), L1(7), L1(8)]
- y0r = _mm_subs_epi16(logmax_den_re0,logmax_num_re0);
-
- // LLR of the second bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3);
- xmm3 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_re1 = _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1);
- xmm1 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1);
- xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_re1 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of second bit [L2(1), L2(2), L2(3), L2(4)]
- y1r = _mm_subs_epi16(logmax_den_re1,logmax_num_re1);
-
- // LLR of the third bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3);
- xmm1 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3);
- xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_im0 = _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3);
- xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3);
- xmm3 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_im0 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of third bit [L3(1), L3(2), L3(3), L3(4)]
- y0i = _mm_subs_epi16(logmax_den_im0,logmax_num_im0);
-
- // LLR of the fourth bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3);
- xmm1 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3);
- xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_im1 = _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1);
- xmm3 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_im1 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of fourth bit [L4(1), L4(2), L4(3), L4(4)]
- y1i = _mm_subs_epi16(logmax_den_im1,logmax_num_im1);
-
- // Pack LLRs in output
- // [L1(1), L2(1), L1(2), L2(2), L1(3), L2(3), L1(4), L2(4)]
- xmm0 = _mm_unpacklo_epi16(y0r,y1r);
- // [L1(5), L2(5), L1(6), L2(6), L1(7), L2(7), L1(8), L2(8)]
- xmm1 = _mm_unpackhi_epi16(y0r,y1r);
- // [L3(1), L4(1), L3(2), L4(2), L3(3), L4(3), L3(4), L4(4)]
- xmm2 = _mm_unpacklo_epi16(y0i,y1i);
- // [L3(5), L4(5), L3(6), L4(6), L3(7), L4(7), L3(8), L4(8)]
- xmm3 = _mm_unpackhi_epi16(y0i,y1i);
-
- stream0_128i_out[2*i+0] = _mm_unpacklo_epi32(xmm0,xmm2); // 8LLRs, 2REs
- stream0_128i_out[2*i+1] = _mm_unpackhi_epi32(xmm0,xmm2);
- stream0_128i_out[2*i+2] = _mm_unpacklo_epi32(xmm1,xmm3);
- stream0_128i_out[2*i+3] = _mm_unpackhi_epi32(xmm1,xmm3);
-
-#elif defined(__arm__)
-
-#endif
- }
-
-#if defined(__x86_64__) || defined(__i386__)
- _mm_empty();
- _m_empty();
-#endif
-
-}
-
-int dlsch_16qam_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
- int32_t **rxdataF_comp,
- int32_t **rxdataF_comp_i,
- int32_t **dl_ch_mag, //|h_0|^2*(2/sqrt{10})
- int32_t **rho_i,
- int16_t *dlsch_llr,
- uint8_t symbol,
- uint8_t first_symbol_flag,
- uint16_t nb_rb,
- uint16_t pbch_pss_sss_adjust,
- int16_t **llr16p)
-{
-
- int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *llr16;
- int len;
- uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
-
- // first symbol has different structure due to more pilots
- if (first_symbol_flag == 1) {
- llr16 = (int16_t*)dlsch_llr;
- } else {
- llr16 = (int16_t*)(*llr16p);
- }
-
- AssertFatal(llr16!=NULL,"dlsch_16qam_qpsk_llr: llr is null, symbol %d\n",symbol);
-
- if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
- // if symbol has pilots
- if (frame_parms->nb_antenna_ports_eNB!=1)
- // in 2 antenna ports we have 8 REs per symbol per RB
- len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
- else
- // for 1 antenna port we have 10 REs per symbol per RB
- len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
- } else {
- // symbol has no pilots
- len = (nb_rb*12) - pbch_pss_sss_adjust;
- }
-
- // printf("symbol %d: qam16_llr, len %d (llr16 %p)\n",symbol,len,llr16);
-
- qam16_qpsk((short *)rxF,
- (short *)rxF_i,
- (short *)ch_mag,
- (short *)llr16,
- (short *)rho,
- len);
-
- llr16 += (len<<2);
- *llr16p = (short *)llr16;
-
- return(0);
-}
-
-void qam16_qam16(short *stream0_in,
- short *stream1_in,
- short *ch_mag,
- short *ch_mag_i,
- short *stream0_out,
- short *rho01,
- int length
- )
-{
-
- /*
- Author: Sebastian Wagner
- Date: 2012-06-04
-
- Input:
- stream0_in: MF filter for 1st stream, i.e., y0=h0'*y
- stream!_in: MF filter for 2nd stream, i.e., y1=h1'*y
- ch_mag: 2*h0/sqrt(00), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- ch_mag_i: 2*h1/sqrt(00), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- rho01: Channel cross correlation, i.e., h1'*h0
-
- Output:
- stream0_out: output LLRs for 1st stream
- */
-#if defined(__x86_64__) || defined(__i386__)
- __m128i *rho01_128i = (__m128i *)rho01;
- __m128i *stream0_128i_in = (__m128i *)stream0_in;
- __m128i *stream1_128i_in = (__m128i *)stream1_in;
- __m128i *stream0_128i_out = (__m128i *)stream0_out;
- __m128i *ch_mag_128i = (__m128i *)ch_mag;
- __m128i *ch_mag_128i_i = (__m128i *)ch_mag_i;
-
-
-
- __m128i ONE_OVER_SQRT_10 = _mm_set1_epi16(20724); // round(1/sqrt(10)*2^16)
- __m128i ONE_OVER_SQRT_10_Q15 = _mm_set1_epi16(10362); // round(1/sqrt(10)*2^15)
- __m128i THREE_OVER_SQRT_10 = _mm_set1_epi16(31086); // round(3/sqrt(10)*2^15)
- __m128i SQRT_10_OVER_FOUR = _mm_set1_epi16(25905); // round(sqrt(10)/4*2^15)
- __m128i ONE_OVER_TWO_SQRT_10 = _mm_set1_epi16(10362); // round(1/2/sqrt(10)*2^16)
- __m128i NINE_OVER_TWO_SQRT_10 = _mm_set1_epi16(23315); // round(9/2/sqrt(10)*2^14)
- __m128i ch_mag_des,ch_mag_int;
- __m128i y0r_over_sqrt10;
- __m128i y0i_over_sqrt10;
- __m128i y0r_three_over_sqrt10;
- __m128i y0i_three_over_sqrt10;
- __m128i ch_mag_over_10;
- __m128i ch_mag_over_2;
- __m128i ch_mag_9_over_10;
-#elif defined(__arm__)
-
-#endif
-
- int i;
-
- for (i=0; i>2; i+=2) {
- // In one iteration, we deal with 8 REs
-
-#if defined(__x86_64__) || defined(__i386__)
- // Get rho
- xmm0 = rho01_128i[i];
- xmm1 = rho01_128i[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho)
- xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho)
- rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho)
- rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho)
-
- // Compute the different rhos
- rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi,ONE_OVER_SQRT_10);
- rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi,ONE_OVER_SQRT_10);
- rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi,THREE_OVER_SQRT_10);
- rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi,THREE_OVER_SQRT_10);
- rho_rpi_3_3 = _mm_slli_epi16(rho_rpi_3_3,1);
- rho_rmi_3_3 = _mm_slli_epi16(rho_rmi_3_3,1);
-
- xmm4 = _mm_mulhi_epi16(xmm2,ONE_OVER_SQRT_10); // Re(rho)
- xmm5 = _mm_mulhi_epi16(xmm3,THREE_OVER_SQRT_10); // Im(rho)
- xmm5 = _mm_slli_epi16(xmm5,1);
-
- rho_rpi_1_3 = _mm_adds_epi16(xmm4,xmm5);
- rho_rmi_1_3 = _mm_subs_epi16(xmm4,xmm5);
-
- xmm6 = _mm_mulhi_epi16(xmm2,THREE_OVER_SQRT_10); // Re(rho)
- xmm7 = _mm_mulhi_epi16(xmm3,ONE_OVER_SQRT_10); // Im(rho)
- xmm6 = _mm_slli_epi16(xmm6,1);
-
- rho_rpi_3_1 = _mm_adds_epi16(xmm6,xmm7);
- rho_rmi_3_1 = _mm_subs_epi16(xmm6,xmm7);
-
- // Rearrange interfering MF output
- xmm0 = stream1_128i_in[i];
- xmm1 = stream1_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)]
- y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)]
-
- xmm0 = _mm_setzero_si128(); // ZERO
- xmm2 = _mm_subs_epi16(rho_rpi_1_1,y1r); // = [Re(rho)+ Im(rho)]/sqrt(10) - y1r
- psi_r_p1_p1 = _mm_abs_epi16(xmm2); // = |[Re(rho)+ Im(rho)]/sqrt(10) - y1r|
-
- xmm2= _mm_subs_epi16(rho_rmi_1_1,y1r);
- psi_r_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_1_1,y1i);
- psi_i_p1_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_1_3,y1r);
- psi_r_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_1_3,y1r);
- psi_r_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_1,y1i);
- psi_i_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_1,y1r);
- psi_r_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_1,y1r);
- psi_r_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_1_3,y1i);
- psi_i_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_3,y1r);
- psi_r_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_3,y1r);
- psi_r_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_3,y1i);
- psi_i_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_1_1,y1i);
- psi_i_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_1,y1i);
- psi_i_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_1_3,y1i);
- psi_i_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_3,y1i);
- psi_i_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_1,y1i);
- psi_i_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_1,y1i);
- psi_i_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_3,y1i);
- psi_i_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_3,y1i);
- psi_i_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_1,y1r);
- psi_r_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_3,y1r);
- psi_r_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_1,y1r);
- psi_r_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_3,y1r);
- psi_r_m3_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_1_1);
- psi_r_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_1_3);
- psi_r_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_1_1);
- psi_i_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_3_1);
- psi_i_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_3_1);
- psi_r_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_3_3);
- psi_r_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_1_3);
- psi_i_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_3_3);
- psi_i_m3_m3 = _mm_abs_epi16(xmm2);
-
- // Rearrange desired MF output
- xmm0 = stream0_128i_in[i];
- xmm1 = stream0_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)]
- y0i = _mm_unpackhi_epi64(xmm0,xmm1);
-
- // Rearrange desired channel magnitudes
- xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10))
- xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10))
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
-
- ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3); // = [|h|^2(1),|h|^2(2),|h|^2(3),|h|^2(4)]*(2/sqrt(10))
-
- // Rearrange interfering channel magnitudes
- xmm2 = ch_mag_128i_i[i];
- xmm3 = ch_mag_128i_i[i+1];
-
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
-
- ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3);
-
- // Scale MF output of desired signal
- y0r_over_sqrt10 = _mm_mulhi_epi16(y0r,ONE_OVER_SQRT_10);
- y0i_over_sqrt10 = _mm_mulhi_epi16(y0i,ONE_OVER_SQRT_10);
- y0r_three_over_sqrt10 = _mm_mulhi_epi16(y0r,THREE_OVER_SQRT_10);
- y0i_three_over_sqrt10 = _mm_mulhi_epi16(y0i,THREE_OVER_SQRT_10);
- y0r_three_over_sqrt10 = _mm_slli_epi16(y0r_three_over_sqrt10,1);
- y0i_three_over_sqrt10 = _mm_slli_epi16(y0i_three_over_sqrt10,1);
-
- // Compute necessary combination of required terms
- y0_p_1_1 = _mm_adds_epi16(y0r_over_sqrt10,y0i_over_sqrt10);
- y0_m_1_1 = _mm_subs_epi16(y0r_over_sqrt10,y0i_over_sqrt10);
-
- y0_p_1_3 = _mm_adds_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10);
- y0_m_1_3 = _mm_subs_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10);
-
- y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10);
- y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10);
-
- y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10);
- y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10);
-
- // Compute optimal interfering symbol magnitude
- interference_abs_epi16(psi_r_p1_p1 ,ch_mag_int,a_r_p1_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_p1 ,ch_mag_int,a_i_p1_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_p3 ,ch_mag_int,a_r_p1_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_p3 ,ch_mag_int,a_i_p1_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_m1 ,ch_mag_int,a_r_p1_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_m1 ,ch_mag_int,a_i_p1_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_m3 ,ch_mag_int,a_r_p1_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_m3 ,ch_mag_int,a_i_p1_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_p1 ,ch_mag_int,a_r_p3_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_p1 ,ch_mag_int,a_i_p3_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_p3 ,ch_mag_int,a_r_p3_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_p3 ,ch_mag_int,a_i_p3_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_m1 ,ch_mag_int,a_r_p3_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_m1 ,ch_mag_int,a_i_p3_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_m3 ,ch_mag_int,a_r_p3_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_m3 ,ch_mag_int,a_i_p3_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_p1 ,ch_mag_int,a_r_m1_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_p1 ,ch_mag_int,a_i_m1_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_p3 ,ch_mag_int,a_r_m1_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_p3 ,ch_mag_int,a_i_m1_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_m1 ,ch_mag_int,a_r_m1_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_m1 ,ch_mag_int,a_i_m1_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_m3 ,ch_mag_int,a_r_m1_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_m3 ,ch_mag_int,a_i_m1_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_p1 ,ch_mag_int,a_r_m3_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_p1 ,ch_mag_int,a_i_m3_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_p3 ,ch_mag_int,a_r_m3_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_p3 ,ch_mag_int,a_i_m3_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_m1 ,ch_mag_int,a_r_m3_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_m1 ,ch_mag_int,a_i_m3_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_m3 ,ch_mag_int,a_r_m3_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_m3 ,ch_mag_int,a_i_m3_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
-
- // Calculation of groups of two terms in the bit metric involving product of psi and interference magnitude
- prodsum_psi_a_epi16(psi_r_p1_p1,a_r_p1_p1,psi_i_p1_p1,a_i_p1_p1,psi_a_p1_p1);
- prodsum_psi_a_epi16(psi_r_p1_p3,a_r_p1_p3,psi_i_p1_p3,a_i_p1_p3,psi_a_p1_p3);
- prodsum_psi_a_epi16(psi_r_p3_p1,a_r_p3_p1,psi_i_p3_p1,a_i_p3_p1,psi_a_p3_p1);
- prodsum_psi_a_epi16(psi_r_p3_p3,a_r_p3_p3,psi_i_p3_p3,a_i_p3_p3,psi_a_p3_p3);
- prodsum_psi_a_epi16(psi_r_p1_m1,a_r_p1_m1,psi_i_p1_m1,a_i_p1_m1,psi_a_p1_m1);
- prodsum_psi_a_epi16(psi_r_p1_m3,a_r_p1_m3,psi_i_p1_m3,a_i_p1_m3,psi_a_p1_m3);
- prodsum_psi_a_epi16(psi_r_p3_m1,a_r_p3_m1,psi_i_p3_m1,a_i_p3_m1,psi_a_p3_m1);
- prodsum_psi_a_epi16(psi_r_p3_m3,a_r_p3_m3,psi_i_p3_m3,a_i_p3_m3,psi_a_p3_m3);
- prodsum_psi_a_epi16(psi_r_m1_p1,a_r_m1_p1,psi_i_m1_p1,a_i_m1_p1,psi_a_m1_p1);
- prodsum_psi_a_epi16(psi_r_m1_p3,a_r_m1_p3,psi_i_m1_p3,a_i_m1_p3,psi_a_m1_p3);
- prodsum_psi_a_epi16(psi_r_m3_p1,a_r_m3_p1,psi_i_m3_p1,a_i_m3_p1,psi_a_m3_p1);
- prodsum_psi_a_epi16(psi_r_m3_p3,a_r_m3_p3,psi_i_m3_p3,a_i_m3_p3,psi_a_m3_p3);
- prodsum_psi_a_epi16(psi_r_m1_m1,a_r_m1_m1,psi_i_m1_m1,a_i_m1_m1,psi_a_m1_m1);
- prodsum_psi_a_epi16(psi_r_m1_m3,a_r_m1_m3,psi_i_m1_m3,a_i_m1_m3,psi_a_m1_m3);
- prodsum_psi_a_epi16(psi_r_m3_m1,a_r_m3_m1,psi_i_m3_m1,a_i_m3_m1,psi_a_m3_m1);
- prodsum_psi_a_epi16(psi_r_m3_m3,a_r_m3_m3,psi_i_m3_m3,a_i_m3_m3,psi_a_m3_m3);
-
-
- // squared interference magnitude times int. ch. power
- square_a_epi16(a_r_p1_p1,a_i_p1_p1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p1_p1);
- square_a_epi16(a_r_p1_p3,a_i_p1_p3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p1_p3);
- square_a_epi16(a_r_p3_p1,a_i_p3_p1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p3_p1);
- square_a_epi16(a_r_p3_p3,a_i_p3_p3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p3_p3);
- square_a_epi16(a_r_p1_m1,a_i_p1_m1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p1_m1);
- square_a_epi16(a_r_p1_m3,a_i_p1_m3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p1_m3);
- square_a_epi16(a_r_p3_m1,a_i_p3_m1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p3_m1);
- square_a_epi16(a_r_p3_m3,a_i_p3_m3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p3_m3);
- square_a_epi16(a_r_m1_p1,a_i_m1_p1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m1_p1);
- square_a_epi16(a_r_m1_p3,a_i_m1_p3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m1_p3);
- square_a_epi16(a_r_m3_p1,a_i_m3_p1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m3_p1);
- square_a_epi16(a_r_m3_p3,a_i_m3_p3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m3_p3);
- square_a_epi16(a_r_m1_m1,a_i_m1_m1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m1_m1);
- square_a_epi16(a_r_m1_m3,a_i_m1_m3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m1_m3);
- square_a_epi16(a_r_m3_m1,a_i_m3_m1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m3_m1);
- square_a_epi16(a_r_m3_m3,a_i_m3_m3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m3_m3);
-
- // Computing different multiples of channel norms
- ch_mag_over_10=_mm_mulhi_epi16(ch_mag_des, ONE_OVER_TWO_SQRT_10);
- ch_mag_over_2=_mm_mulhi_epi16(ch_mag_des, SQRT_10_OVER_FOUR);
- ch_mag_over_2=_mm_slli_epi16(ch_mag_over_2, 1);
- ch_mag_9_over_10=_mm_mulhi_epi16(ch_mag_des, NINE_OVER_TWO_SQRT_10);
- ch_mag_9_over_10=_mm_slli_epi16(ch_mag_9_over_10, 2);
-
- // Computing Metrics
- xmm0 = _mm_subs_epi16(psi_a_p1_p1,a_sq_p1_p1);
- xmm1 = _mm_adds_epi16(xmm0,y0_p_1_1);
- bit_met_p1_p1= _mm_subs_epi16(xmm1,ch_mag_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_p1_p3,a_sq_p1_p3);
- xmm1 = _mm_adds_epi16(xmm0,y0_p_1_3);
- bit_met_p1_p3= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_p1_m1,a_sq_p1_m1);
- xmm1 = _mm_adds_epi16(xmm0,y0_m_1_1);
- bit_met_p1_m1= _mm_subs_epi16(xmm1,ch_mag_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_p1_m3,a_sq_p1_m3);
- xmm1 = _mm_adds_epi16(xmm0,y0_m_1_3);
- bit_met_p1_m3= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_p3_p1,a_sq_p3_p1);
- xmm1 = _mm_adds_epi16(xmm0,y0_p_3_1);
- bit_met_p3_p1= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_p3_p3,a_sq_p3_p3);
- xmm1 = _mm_adds_epi16(xmm0,y0_p_3_3);
- bit_met_p3_p3= _mm_subs_epi16(xmm1,ch_mag_9_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_p3_m1,a_sq_p3_m1);
- xmm1 = _mm_adds_epi16(xmm0,y0_m_3_1);
- bit_met_p3_m1= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_p3_m3,a_sq_p3_m3);
- xmm1 = _mm_adds_epi16(xmm0,y0_m_3_3);
- bit_met_p3_m3= _mm_subs_epi16(xmm1,ch_mag_9_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_p1,a_sq_m1_p1);
- xmm1 = _mm_subs_epi16(xmm0,y0_m_1_1);
- bit_met_m1_p1= _mm_subs_epi16(xmm1,ch_mag_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_p3,a_sq_m1_p3);
- xmm1 = _mm_subs_epi16(xmm0,y0_m_1_3);
- bit_met_m1_p3= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_m1,a_sq_m1_m1);
- xmm1 = _mm_subs_epi16(xmm0,y0_p_1_1);
- bit_met_m1_m1= _mm_subs_epi16(xmm1,ch_mag_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_m3,a_sq_m1_m3);
- xmm1 = _mm_subs_epi16(xmm0,y0_p_1_3);
- bit_met_m1_m3= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_m3_p1,a_sq_m3_p1);
- xmm1 = _mm_subs_epi16(xmm0,y0_m_3_1);
- bit_met_m3_p1= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_m3_p3,a_sq_m3_p3);
- xmm1 = _mm_subs_epi16(xmm0,y0_m_3_3);
- bit_met_m3_p3= _mm_subs_epi16(xmm1,ch_mag_9_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_m3_m1,a_sq_m3_m1);
- xmm1 = _mm_subs_epi16(xmm0,y0_p_3_1);
- bit_met_m3_m1= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_m3_m3,a_sq_m3_m3);
- xmm1 = _mm_subs_epi16(xmm0,y0_p_3_3);
- bit_met_m3_m3= _mm_subs_epi16(xmm1,ch_mag_9_over_10);
-
- // LLR of the first bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3);
- xmm2 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_re0= _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3);
- xmm1 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of first bit [L1(1), L1(2), L1(3), L1(4), L1(5), L1(6), L1(7), L1(8)]
- y0r = _mm_subs_epi16(logmax_den_re0,logmax_num_re0);
-
- // LLR of the second bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3);
- xmm3 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_re1 = _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1);
- xmm1 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1);
- xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_re1 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of second bit [L2(1), L2(2), L2(3), L2(4)]
- y1r = _mm_subs_epi16(logmax_den_re1,logmax_num_re1);
-
- // LLR of the third bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3);
- xmm1 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3);
- xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_im0 = _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3);
- xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3);
- xmm3 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_im0 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of third bit [L3(1), L3(2), L3(3), L3(4)]
- y0i = _mm_subs_epi16(logmax_den_im0,logmax_num_im0);
-
- // LLR of the fourth bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3);
- xmm1 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3);
- xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_im1 = _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1);
- xmm3 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_im1 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of fourth bit [L4(1), L4(2), L4(3), L4(4)]
- y1i = _mm_subs_epi16(logmax_den_im1,logmax_num_im1);
-
- // Pack LLRs in output
- // [L1(1), L2(1), L1(2), L2(2), L1(3), L2(3), L1(4), L2(4)]
- xmm0 = _mm_unpacklo_epi16(y0r,y1r);
- // [L1(5), L2(5), L1(6), L2(6), L1(7), L2(7), L1(8), L2(8)]
- xmm1 = _mm_unpackhi_epi16(y0r,y1r);
- // [L3(1), L4(1), L3(2), L4(2), L3(3), L4(3), L3(4), L4(4)]
- xmm2 = _mm_unpacklo_epi16(y0i,y1i);
- // [L3(5), L4(5), L3(6), L4(6), L3(7), L4(7), L3(8), L4(8)]
- xmm3 = _mm_unpackhi_epi16(y0i,y1i);
-
- stream0_128i_out[2*i+0] = _mm_unpacklo_epi32(xmm0,xmm2); // 8LLRs, 2REs
- stream0_128i_out[2*i+1] = _mm_unpackhi_epi32(xmm0,xmm2);
- stream0_128i_out[2*i+2] = _mm_unpacklo_epi32(xmm1,xmm3);
- stream0_128i_out[2*i+3] = _mm_unpackhi_epi32(xmm1,xmm3);
-#elif defined(__arm__)
-
-#endif
-
- }
-
-#if defined(__x86_64__) || defined(__i386__)
- _mm_empty();
- _m_empty();
-#endif
-}
-
-int dlsch_16qam_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
- int32_t **rxdataF_comp,
- int32_t **rxdataF_comp_i,
- int32_t **dl_ch_mag, //|h_0|^2*(2/sqrt{10})
- int32_t **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10})
- int32_t **rho_i,
- int16_t *dlsch_llr,
- uint8_t symbol,
- uint8_t first_symbol_flag,
- uint16_t nb_rb,
- uint16_t pbch_pss_sss_adjust,
- int16_t **llr16p)
-{
-
- int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *llr16;
- int len;
- uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
-
- // first symbol has different structure due to more pilots
- if (first_symbol_flag == 1) {
- llr16 = (int16_t*)dlsch_llr;
- } else {
- llr16 = (int16_t*)(*llr16p);
- }
-
-
- AssertFatal(llr16!=NULL,"dlsch_16qam_16qam_llr: llr is null, symbol %d\n",symbol);
-
- if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
- // if symbol has pilots
- if (frame_parms->nb_antenna_ports_eNB!=1)
- // in 2 antenna ports we have 8 REs per symbol per RB
- len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
- else
- // for 1 antenna port we have 10 REs per symbol per RB
- len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
- } else {
- // symbol has no pilots
- len = (nb_rb*12) - pbch_pss_sss_adjust;
- }
-
- // printf("symbol %d: qam16_llr, len %d (llr16 %p)\n",symbol,len,llr16);
-
- qam16_qam16((short *)rxF,
- (short *)rxF_i,
- (short *)ch_mag,
- (short *)ch_mag_i,
- (short *)llr16,
- (short *)rho,
- len);
-
- llr16 += (len<<2);
- *llr16p = (short *)llr16;
-
- return(0);
-}
-
-void qam16_qam64(int16_t *stream0_in,
- int16_t *stream1_in,
- int16_t *ch_mag,
- int16_t *ch_mag_i,
- int16_t *stream0_out,
- int16_t *rho01,
- int32_t length
- )
-{
-
- /*
- Author: Sebastian Wagner
- Date: 2012-06-04
-
- Input:
- stream0_in: MF filter for 1st stream, i.e., y0=h0'*y
- stream!_in: MF filter for 2nd stream, i.e., y1=h1'*y
- ch_mag: 2*h0/sqrt(00), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- ch_mag_i: 2*h1/sqrt(00), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- rho01: Channel cross correlation, i.e., h1'*h0
-
- Output:
- stream0_out: output LLRs for 1st stream
- */
-
-#if defined(__x86_64__) || defined(__i386__)
- __m128i *rho01_128i = (__m128i *)rho01;
- __m128i *stream0_128i_in = (__m128i *)stream0_in;
- __m128i *stream1_128i_in = (__m128i *)stream1_in;
- __m128i *stream0_128i_out = (__m128i *)stream0_out;
- __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)
- __m128i SQRT_10_OVER_FOUR = _mm_set1_epi16(25905); // round(sqrt(10)/4*2^15)
- __m128i ONE_OVER_TWO_SQRT_10 = _mm_set1_epi16(10362); // round(1/2/sqrt(10)*2^16)
- __m128i NINE_OVER_TWO_SQRT_10 = _mm_set1_epi16(23315); // round(9/2/sqrt(10)*2^14)
- __m128i ONE_OVER_SQRT_2_42 = _mm_set1_epi16(3575); // round(1/sqrt(2*42)*2^15)
- __m128i THREE_OVER_SQRT_2_42 = _mm_set1_epi16(10726); // round(3/sqrt(2*42)*2^15)
- __m128i FIVE_OVER_SQRT_2_42 = _mm_set1_epi16(17876); // round(5/sqrt(2*42)*2^15)
- __m128i SEVEN_OVER_SQRT_2_42 = _mm_set1_epi16(25027); // round(7/sqrt(2*42)*2^15)
- __m128i SQRT_42_OVER_FOUR = _mm_set1_epi16(13272); // round(sqrt(42)/4*2^13), Q3.
- __m128i ch_mag_des,ch_mag_int;
- __m128i y0r_over_sqrt10;
- __m128i y0i_over_sqrt10;
- __m128i y0r_three_over_sqrt10;
- __m128i y0i_three_over_sqrt10;
- __m128i ch_mag_over_10;
- __m128i ch_mag_over_2;
- __m128i ch_mag_9_over_10;
- __m128i ch_mag_int_with_sigma2;
- __m128i two_ch_mag_int_with_sigma2;
- __m128i three_ch_mag_int_with_sigma2;
-
-#elif defined(__arm__)
-
-#endif
- int i;
-
- for (i=0; i>2; i+=2) {
- // In one iteration, we deal with 8 REs
-
-#if defined(__x86_64__) || defined(__i386__)
- // Get rho
- xmm0 = rho01_128i[i];
- xmm1 = rho01_128i[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho)
- xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho)
- rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho)
- rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho)
-
- // Compute the different rhos
- rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi,ONE_OVER_SQRT_10);
- rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi,ONE_OVER_SQRT_10);
- rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi,THREE_OVER_SQRT_10);
- rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi,THREE_OVER_SQRT_10);
- rho_rpi_3_3 = _mm_slli_epi16(rho_rpi_3_3,1);
- rho_rmi_3_3 = _mm_slli_epi16(rho_rmi_3_3,1);
-
- xmm4 = _mm_mulhi_epi16(xmm2,ONE_OVER_SQRT_10); // Re(rho)
- xmm5 = _mm_mulhi_epi16(xmm3,THREE_OVER_SQRT_10); // Im(rho)
- xmm5 = _mm_slli_epi16(xmm5,1);
-
- rho_rpi_1_3 = _mm_adds_epi16(xmm4,xmm5);
- rho_rmi_1_3 = _mm_subs_epi16(xmm4,xmm5);
-
- xmm6 = _mm_mulhi_epi16(xmm2,THREE_OVER_SQRT_10); // Re(rho)
- xmm7 = _mm_mulhi_epi16(xmm3,ONE_OVER_SQRT_10); // Im(rho)
- xmm6 = _mm_slli_epi16(xmm6,1);
-
- rho_rpi_3_1 = _mm_adds_epi16(xmm6,xmm7);
- rho_rmi_3_1 = _mm_subs_epi16(xmm6,xmm7);
-
- // Rearrange interfering MF output
- xmm0 = stream1_128i_in[i];
- xmm1 = stream1_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)]
- y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)]
-
- xmm0 = _mm_setzero_si128(); // ZERO
- xmm2 = _mm_subs_epi16(rho_rpi_1_1,y1r); // = [Re(rho)+ Im(rho)]/sqrt(10) - y1r
- psi_r_p1_p1 = _mm_abs_epi16(xmm2); // = |[Re(rho)+ Im(rho)]/sqrt(10) - y1r|
-
- xmm2= _mm_subs_epi16(rho_rmi_1_1,y1r);
- psi_r_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_1_1,y1i);
- psi_i_p1_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_1_3,y1r);
- psi_r_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_1_3,y1r);
- psi_r_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_1,y1i);
- psi_i_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_1,y1r);
- psi_r_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_1,y1r);
- psi_r_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_1_3,y1i);
- psi_i_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_3,y1r);
- psi_r_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_3,y1r);
- psi_r_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_3,y1i);
- psi_i_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_1_1,y1i);
- psi_i_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_1,y1i);
- psi_i_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_1_3,y1i);
- psi_i_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_3,y1i);
- psi_i_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_1,y1i);
- psi_i_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_1,y1i);
- psi_i_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_3,y1i);
- psi_i_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_3,y1i);
- psi_i_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_1,y1r);
- psi_r_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_3,y1r);
- psi_r_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_1,y1r);
- psi_r_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_3,y1r);
- psi_r_m3_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_1_1);
- psi_r_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_1_3);
- psi_r_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_1_1);
- psi_i_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_3_1);
- psi_i_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_3_1);
- psi_r_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_3_3);
- psi_r_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_1_3);
- psi_i_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_3_3);
- psi_i_m3_m3 = _mm_abs_epi16(xmm2);
-
- // Rearrange desired MF output
- xmm0 = stream0_128i_in[i];
- xmm1 = stream0_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)]
- y0i = _mm_unpackhi_epi64(xmm0,xmm1);
-
- // Rearrange desired channel magnitudes
- xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10))
- xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10))
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
-
- ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3); // = [|h|^2(1),|h|^2(2),|h|^2(3),|h|^2(4)]*(2/sqrt(10))
-
- // Rearrange interfering channel magnitudes
- xmm2 = ch_mag_128i_i[i];
- xmm3 = ch_mag_128i_i[i+1];
-
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
-
- ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3);
-
- // Scale MF output of desired signal
- y0r_over_sqrt10 = _mm_mulhi_epi16(y0r,ONE_OVER_SQRT_10);
- y0i_over_sqrt10 = _mm_mulhi_epi16(y0i,ONE_OVER_SQRT_10);
- y0r_three_over_sqrt10 = _mm_mulhi_epi16(y0r,THREE_OVER_SQRT_10);
- y0i_three_over_sqrt10 = _mm_mulhi_epi16(y0i,THREE_OVER_SQRT_10);
- y0r_three_over_sqrt10 = _mm_slli_epi16(y0r_three_over_sqrt10,1);
- y0i_three_over_sqrt10 = _mm_slli_epi16(y0i_three_over_sqrt10,1);
-
- // Compute necessary combination of required terms
- y0_p_1_1 = _mm_adds_epi16(y0r_over_sqrt10,y0i_over_sqrt10);
- y0_m_1_1 = _mm_subs_epi16(y0r_over_sqrt10,y0i_over_sqrt10);
-
- y0_p_1_3 = _mm_adds_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10);
- y0_m_1_3 = _mm_subs_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10);
-
- y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10);
- y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10);
-
- y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10);
- y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10);
-
- // Compute optimal interfering symbol magnitude
- ch_mag_int_with_sigma2 = _mm_srai_epi16(ch_mag_int, 1); // *2
- two_ch_mag_int_with_sigma2 = ch_mag_int; // *4
- three_ch_mag_int_with_sigma2 = _mm_adds_epi16(ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2); // *6
-
- interference_abs_64qam_epi16(psi_r_p1_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
-
- // Calculation of groups of two terms in the bit metric involving product of psi and interference magnitude
- prodsum_psi_a_epi16(psi_r_p1_p1,a_r_p1_p1,psi_i_p1_p1,a_i_p1_p1,psi_a_p1_p1);
- prodsum_psi_a_epi16(psi_r_p1_p3,a_r_p1_p3,psi_i_p1_p3,a_i_p1_p3,psi_a_p1_p3);
- prodsum_psi_a_epi16(psi_r_p3_p1,a_r_p3_p1,psi_i_p3_p1,a_i_p3_p1,psi_a_p3_p1);
- prodsum_psi_a_epi16(psi_r_p3_p3,a_r_p3_p3,psi_i_p3_p3,a_i_p3_p3,psi_a_p3_p3);
- prodsum_psi_a_epi16(psi_r_p1_m1,a_r_p1_m1,psi_i_p1_m1,a_i_p1_m1,psi_a_p1_m1);
- prodsum_psi_a_epi16(psi_r_p1_m3,a_r_p1_m3,psi_i_p1_m3,a_i_p1_m3,psi_a_p1_m3);
- prodsum_psi_a_epi16(psi_r_p3_m1,a_r_p3_m1,psi_i_p3_m1,a_i_p3_m1,psi_a_p3_m1);
- prodsum_psi_a_epi16(psi_r_p3_m3,a_r_p3_m3,psi_i_p3_m3,a_i_p3_m3,psi_a_p3_m3);
- prodsum_psi_a_epi16(psi_r_m1_p1,a_r_m1_p1,psi_i_m1_p1,a_i_m1_p1,psi_a_m1_p1);
- prodsum_psi_a_epi16(psi_r_m1_p3,a_r_m1_p3,psi_i_m1_p3,a_i_m1_p3,psi_a_m1_p3);
- prodsum_psi_a_epi16(psi_r_m3_p1,a_r_m3_p1,psi_i_m3_p1,a_i_m3_p1,psi_a_m3_p1);
- prodsum_psi_a_epi16(psi_r_m3_p3,a_r_m3_p3,psi_i_m3_p3,a_i_m3_p3,psi_a_m3_p3);
- prodsum_psi_a_epi16(psi_r_m1_m1,a_r_m1_m1,psi_i_m1_m1,a_i_m1_m1,psi_a_m1_m1);
- prodsum_psi_a_epi16(psi_r_m1_m3,a_r_m1_m3,psi_i_m1_m3,a_i_m1_m3,psi_a_m1_m3);
- prodsum_psi_a_epi16(psi_r_m3_m1,a_r_m3_m1,psi_i_m3_m1,a_i_m3_m1,psi_a_m3_m1);
- prodsum_psi_a_epi16(psi_r_m3_m3,a_r_m3_m3,psi_i_m3_m3,a_i_m3_m3,psi_a_m3_m3);
-
- // Multiply by sqrt(2)
- psi_a_p1_p1 = _mm_mulhi_epi16(psi_a_p1_p1, ONE_OVER_SQRT_2);
- psi_a_p1_p1 = _mm_slli_epi16(psi_a_p1_p1, 2);
- psi_a_p1_p3 = _mm_mulhi_epi16(psi_a_p1_p3, ONE_OVER_SQRT_2);
- psi_a_p1_p3 = _mm_slli_epi16(psi_a_p1_p3, 2);
- psi_a_p3_p1 = _mm_mulhi_epi16(psi_a_p3_p1, ONE_OVER_SQRT_2);
- psi_a_p3_p1 = _mm_slli_epi16(psi_a_p3_p1, 2);
- psi_a_p3_p3 = _mm_mulhi_epi16(psi_a_p3_p3, ONE_OVER_SQRT_2);
- psi_a_p3_p3 = _mm_slli_epi16(psi_a_p3_p3, 2);
- psi_a_p1_m1 = _mm_mulhi_epi16(psi_a_p1_m1, ONE_OVER_SQRT_2);
- psi_a_p1_m1 = _mm_slli_epi16(psi_a_p1_m1, 2);
- psi_a_p1_m3 = _mm_mulhi_epi16(psi_a_p1_m3, ONE_OVER_SQRT_2);
- psi_a_p1_m3 = _mm_slli_epi16(psi_a_p1_m3, 2);
- psi_a_p3_m1 = _mm_mulhi_epi16(psi_a_p3_m1, ONE_OVER_SQRT_2);
- psi_a_p3_m1 = _mm_slli_epi16(psi_a_p3_m1, 2);
- psi_a_p3_m3 = _mm_mulhi_epi16(psi_a_p3_m3, ONE_OVER_SQRT_2);
- psi_a_p3_m3 = _mm_slli_epi16(psi_a_p3_m3, 2);
- psi_a_m1_p1 = _mm_mulhi_epi16(psi_a_m1_p1, ONE_OVER_SQRT_2);
- psi_a_m1_p1 = _mm_slli_epi16(psi_a_m1_p1, 2);
- psi_a_m1_p3 = _mm_mulhi_epi16(psi_a_m1_p3, ONE_OVER_SQRT_2);
- psi_a_m1_p3 = _mm_slli_epi16(psi_a_m1_p3, 2);
- psi_a_m3_p1 = _mm_mulhi_epi16(psi_a_m3_p1, ONE_OVER_SQRT_2);
- psi_a_m3_p1 = _mm_slli_epi16(psi_a_m3_p1, 2);
- psi_a_m3_p3 = _mm_mulhi_epi16(psi_a_m3_p3, ONE_OVER_SQRT_2);
- psi_a_m3_p3 = _mm_slli_epi16(psi_a_m3_p3, 2);
- psi_a_m1_m1 = _mm_mulhi_epi16(psi_a_m1_m1, ONE_OVER_SQRT_2);
- psi_a_m1_m1 = _mm_slli_epi16(psi_a_m1_m1, 2);
- psi_a_m1_m3 = _mm_mulhi_epi16(psi_a_m1_m3, ONE_OVER_SQRT_2);
- psi_a_m1_m3 = _mm_slli_epi16(psi_a_m1_m3, 2);
- psi_a_m3_m1 = _mm_mulhi_epi16(psi_a_m3_m1, ONE_OVER_SQRT_2);
- psi_a_m3_m1 = _mm_slli_epi16(psi_a_m3_m1, 2);
- psi_a_m3_m3 = _mm_mulhi_epi16(psi_a_m3_m3, ONE_OVER_SQRT_2);
- psi_a_m3_m3 = _mm_slli_epi16(psi_a_m3_m3, 2);
-
- // squared interference magnitude times int. ch. power
- square_a_64qam_epi16(a_r_p1_p1,a_i_p1_p1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p1_p1);
- square_a_64qam_epi16(a_r_p1_p3,a_i_p1_p3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p1_p3);
- square_a_64qam_epi16(a_r_p3_p1,a_i_p3_p1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p3_p1);
- square_a_64qam_epi16(a_r_p3_p3,a_i_p3_p3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p3_p3);
- square_a_64qam_epi16(a_r_p1_m1,a_i_p1_m1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p1_m1);
- square_a_64qam_epi16(a_r_p1_m3,a_i_p1_m3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p1_m3);
- square_a_64qam_epi16(a_r_p3_m1,a_i_p3_m1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p3_m1);
- square_a_64qam_epi16(a_r_p3_m3,a_i_p3_m3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p3_m3);
- square_a_64qam_epi16(a_r_m1_p1,a_i_m1_p1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m1_p1);
- square_a_64qam_epi16(a_r_m1_p3,a_i_m1_p3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m1_p3);
- square_a_64qam_epi16(a_r_m3_p1,a_i_m3_p1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m3_p1);
- square_a_64qam_epi16(a_r_m3_p3,a_i_m3_p3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m3_p3);
- square_a_64qam_epi16(a_r_m1_m1,a_i_m1_m1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m1_m1);
- square_a_64qam_epi16(a_r_m1_m3,a_i_m1_m3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m1_m3);
- square_a_64qam_epi16(a_r_m3_m1,a_i_m3_m1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m3_m1);
- square_a_64qam_epi16(a_r_m3_m3,a_i_m3_m3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m3_m3);
-
- // Computing different multiples of channel norms
- ch_mag_over_10=_mm_mulhi_epi16(ch_mag_des, ONE_OVER_TWO_SQRT_10);
- ch_mag_over_2=_mm_mulhi_epi16(ch_mag_des, SQRT_10_OVER_FOUR);
- ch_mag_over_2=_mm_slli_epi16(ch_mag_over_2, 1);
- ch_mag_9_over_10=_mm_mulhi_epi16(ch_mag_des, NINE_OVER_TWO_SQRT_10);
- ch_mag_9_over_10=_mm_slli_epi16(ch_mag_9_over_10, 2);
-
- // Computing Metrics
- xmm0 = _mm_subs_epi16(psi_a_p1_p1,a_sq_p1_p1);
- xmm1 = _mm_adds_epi16(xmm0,y0_p_1_1);
- bit_met_p1_p1= _mm_subs_epi16(xmm1,ch_mag_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_p1_p3,a_sq_p1_p3);
- xmm1 = _mm_adds_epi16(xmm0,y0_p_1_3);
- bit_met_p1_p3= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_p1_m1,a_sq_p1_m1);
- xmm1 = _mm_adds_epi16(xmm0,y0_m_1_1);
- bit_met_p1_m1= _mm_subs_epi16(xmm1,ch_mag_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_p1_m3,a_sq_p1_m3);
- xmm1 = _mm_adds_epi16(xmm0,y0_m_1_3);
- bit_met_p1_m3= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_p3_p1,a_sq_p3_p1);
- xmm1 = _mm_adds_epi16(xmm0,y0_p_3_1);
- bit_met_p3_p1= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_p3_p3,a_sq_p3_p3);
- xmm1 = _mm_adds_epi16(xmm0,y0_p_3_3);
- bit_met_p3_p3= _mm_subs_epi16(xmm1,ch_mag_9_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_p3_m1,a_sq_p3_m1);
- xmm1 = _mm_adds_epi16(xmm0,y0_m_3_1);
- bit_met_p3_m1= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_p3_m3,a_sq_p3_m3);
- xmm1 = _mm_adds_epi16(xmm0,y0_m_3_3);
- bit_met_p3_m3= _mm_subs_epi16(xmm1,ch_mag_9_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_p1,a_sq_m1_p1);
- xmm1 = _mm_subs_epi16(xmm0,y0_m_1_1);
- bit_met_m1_p1= _mm_subs_epi16(xmm1,ch_mag_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_p3,a_sq_m1_p3);
- xmm1 = _mm_subs_epi16(xmm0,y0_m_1_3);
- bit_met_m1_p3= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_m1,a_sq_m1_m1);
- xmm1 = _mm_subs_epi16(xmm0,y0_p_1_1);
- bit_met_m1_m1= _mm_subs_epi16(xmm1,ch_mag_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_m3,a_sq_m1_m3);
- xmm1 = _mm_subs_epi16(xmm0,y0_p_1_3);
- bit_met_m1_m3= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_m3_p1,a_sq_m3_p1);
- xmm1 = _mm_subs_epi16(xmm0,y0_m_3_1);
- bit_met_m3_p1= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_m3_p3,a_sq_m3_p3);
- xmm1 = _mm_subs_epi16(xmm0,y0_m_3_3);
- bit_met_m3_p3= _mm_subs_epi16(xmm1,ch_mag_9_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_m3_m1,a_sq_m3_m1);
- xmm1 = _mm_subs_epi16(xmm0,y0_p_3_1);
- bit_met_m3_m1= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_m3_m3,a_sq_m3_m3);
- xmm1 = _mm_subs_epi16(xmm0,y0_p_3_3);
- bit_met_m3_m3= _mm_subs_epi16(xmm1,ch_mag_9_over_10);
-
- // LLR of the first bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3);
- xmm2 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_re0= _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3);
- xmm1 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of first bit [L1(1), L1(2), L1(3), L1(4), L1(5), L1(6), L1(7), L1(8)]
- y0r = _mm_subs_epi16(logmax_den_re0,logmax_num_re0);
-
- // LLR of the second bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3);
- xmm3 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_re1 = _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1);
- xmm1 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1);
- xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_re1 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of second bit [L2(1), L2(2), L2(3), L2(4)]
- y1r = _mm_subs_epi16(logmax_den_re1,logmax_num_re1);
-
- // LLR of the third bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3);
- xmm1 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3);
- xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_im0 = _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3);
- xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3);
- xmm3 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_im0 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of third bit [L3(1), L3(2), L3(3), L3(4)]
- y0i = _mm_subs_epi16(logmax_den_im0,logmax_num_im0);
-
- // LLR of the fourth bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3);
- xmm1 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3);
- xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_im1 = _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1);
- xmm3 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_im1 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of fourth bit [L4(1), L4(2), L4(3), L4(4)]
- y1i = _mm_subs_epi16(logmax_den_im1,logmax_num_im1);
-
- // Pack LLRs in output
- // [L1(1), L2(1), L1(2), L2(2), L1(3), L2(3), L1(4), L2(4)]
- xmm0 = _mm_unpacklo_epi16(y0r,y1r);
- // [L1(5), L2(5), L1(6), L2(6), L1(7), L2(7), L1(8), L2(8)]
- xmm1 = _mm_unpackhi_epi16(y0r,y1r);
- // [L3(1), L4(1), L3(2), L4(2), L3(3), L4(3), L3(4), L4(4)]
- xmm2 = _mm_unpacklo_epi16(y0i,y1i);
- // [L3(5), L4(5), L3(6), L4(6), L3(7), L4(7), L3(8), L4(8)]
- xmm3 = _mm_unpackhi_epi16(y0i,y1i);
-
- stream0_128i_out[2*i+0] = _mm_unpacklo_epi32(xmm0,xmm2); // 8LLRs, 2REs
- stream0_128i_out[2*i+1] = _mm_unpackhi_epi32(xmm0,xmm2);
- stream0_128i_out[2*i+2] = _mm_unpacklo_epi32(xmm1,xmm3);
- stream0_128i_out[2*i+3] = _mm_unpackhi_epi32(xmm1,xmm3);
-#elif defined(__arm__)
-
-#endif
-
- }
-
-#if defined(__x86_64__) || defined(__i386__)
- _mm_empty();
- _m_empty();
-#endif
-}
-
-int dlsch_16qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
- int32_t **rxdataF_comp,
- int32_t **rxdataF_comp_i,
- int32_t **dl_ch_mag, //|h_0|^2*(2/sqrt{10})
- int32_t **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10})
- int32_t **rho_i,
- int16_t *dlsch_llr,
- uint8_t symbol,
- uint8_t first_symbol_flag,
- uint16_t nb_rb,
- uint16_t pbch_pss_sss_adjust,
- int16_t **llr16p)
-{
-
- int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *llr16;
- int len;
- uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
-
- // first symbol has different structure due to more pilots
- if (first_symbol_flag == 1) {
- llr16 = (int16_t*)dlsch_llr;
- } else {
- llr16 = (int16_t*)(*llr16p);
- }
-
-
- AssertFatal(llr16!=NULL,"dlsch_16qam_64qam_llr:llr is null, symbol %d\n",symbol);
-
-
- if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
- // if symbol has pilots
- if (frame_parms->nb_antenna_ports_eNB!=1)
- // in 2 antenna ports we have 8 REs per symbol per RB
- len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
- else
- // for 1 antenna port we have 10 REs per symbol per RB
- len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
- } else {
- // symbol has no pilots
- len = (nb_rb*12) - pbch_pss_sss_adjust;
- }
-
- // printf("symbol %d: qam16_llr, len %d (llr16 %p)\n",symbol,len,llr16);
-
- qam16_qam64((short *)rxF,
- (short *)rxF_i,
- (short *)ch_mag,
- (short *)ch_mag_i,
- (short *)llr16,
- (short *)rho,
- len);
-
- llr16 += (len<<2);
- *llr16p = (short *)llr16;
-
- return(0);
-}
-
-//----------------------------------------------------------------------------------------------
-// 64-QAM
-//----------------------------------------------------------------------------------------------
-
-/*
-__m128i ONE_OVER_SQRT_42 __attribute__((aligned(16)));
-__m128i THREE_OVER_SQRT_42 __attribute__((aligned(16)));
-__m128i FIVE_OVER_SQRT_42 __attribute__((aligned(16)));
-__m128i SEVEN_OVER_SQRT_42 __attribute__((aligned(16)));
-
-__m128i FORTYNINE_OVER_FOUR_SQRT_42 __attribute__((aligned(16)));
-__m128i THIRTYSEVEN_OVER_FOUR_SQRT_42 __attribute__((aligned(16)));
-__m128i TWENTYNINE_OVER_FOUR_SQRT_42 __attribute__((aligned(16)));
-__m128i TWENTYFIVE_OVER_FOUR_SQRT_42 __attribute__((aligned(16)));
-__m128i SEVENTEEN_OVER_FOUR_SQRT_42 __attribute__((aligned(16)));
-__m128i NINE_OVER_FOUR_SQRT_42 __attribute__((aligned(16)));
-__m128i THIRTEEN_OVER_FOUR_SQRT_42 __attribute__((aligned(16)));
-__m128i FIVE_OVER_FOUR_SQRT_42 __attribute__((aligned(16)));
-__m128i ONE_OVER_FOUR_SQRT_42 __attribute__((aligned(16)));
-
-__m128i y0r_one_over_sqrt_21 __attribute__((aligned(16)));
-__m128i y0r_three_over_sqrt_21 __attribute__((aligned(16)));
-__m128i y0r_five_over_sqrt_21 __attribute__((aligned(16)));
-__m128i y0r_seven_over_sqrt_21 __attribute__((aligned(16)));
-__m128i y0i_one_over_sqrt_21 __attribute__((aligned(16)));
-__m128i y0i_three_over_sqrt_21 __attribute__((aligned(16)));
-__m128i y0i_five_over_sqrt_21 __attribute__((aligned(16)));
-__m128i y0i_seven_over_sqrt_21 __attribute__((aligned(16)));
-
-__m128i ch_mag_98_over_42_with_sigma2 __attribute__((aligned(16)));
-__m128i ch_mag_74_over_42_with_sigma2 __attribute__((aligned(16)));
-__m128i ch_mag_58_over_42_with_sigma2 __attribute__((aligned(16)));
-__m128i ch_mag_50_over_42_with_sigma2 __attribute__((aligned(16)));
-__m128i ch_mag_34_over_42_with_sigma2 __attribute__((aligned(16)));
-__m128i ch_mag_18_over_42_with_sigma2 __attribute__((aligned(16)));
-__m128i ch_mag_26_over_42_with_sigma2 __attribute__((aligned(16)));
-__m128i ch_mag_10_over_42_with_sigma2 __attribute__((aligned(16)));
-__m128i ch_mag_2_over_42_with_sigma2 __attribute__((aligned(16)));
-
-*/
-
-void qam64_qpsk(int16_t *stream0_in,
- int16_t *stream1_in,
- int16_t *ch_mag,
- int16_t *stream0_out,
- int16_t *rho01,
- int32_t length
- )
-{
-
- /*
- Author: S. Wagner
- Date: 31-07-12
-
- Input:
- stream0_in: MF filter for 1st stream, i.e., y0=h0'*y
- stream1_in: MF filter for 2nd stream, i.e., y1=h1'*y
- ch_mag: 4*h0/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- ch_mag_i: 4*h1/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- rho01: Channel cross correlation, i.e., h1'*h0
-
- Output:
- stream0_out: output LLRs for 1st stream
- */
-
-#if defined(__x86_64__) || defined(__i386__)
- __m128i *rho01_128i = (__m128i *)rho01;
- __m128i *stream0_128i_in = (__m128i *)stream0_in;
- __m128i *stream1_128i_in = (__m128i *)stream1_in;
- __m128i *ch_mag_128i = (__m128i *)ch_mag;
-
-
- __m128i ONE_OVER_SQRT_42 = _mm_set1_epi16(10112); // round(1/sqrt(42)*2^16)
- __m128i THREE_OVER_SQRT_42 = _mm_set1_epi16(30337); // round(3/sqrt(42)*2^16)
- __m128i FIVE_OVER_SQRT_42 = _mm_set1_epi16(25281); // round(5/sqrt(42)*2^15)
- __m128i SEVEN_OVER_SQRT_42 = _mm_set1_epi16(17697); // round(5/sqrt(42)*2^15)
- __m128i ONE_OVER_SQRT_2 = _mm_set1_epi16(23170); // round(1/sqrt(2)*2^15)
- __m128i FORTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(30969); // round(49/(4*sqrt(42))*2^14), Q2.14
- __m128i THIRTYSEVEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(23385); // round(37/(4*sqrt(42))*2^14), Q2.14
- __m128i TWENTYFIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(31601); // round(25/(4*sqrt(42))*2^15)
- __m128i TWENTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(18329); // round(29/(4*sqrt(42))*2^15), Q2.14
- __m128i SEVENTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(21489); // round(17/(4*sqrt(42))*2^15)
- __m128i NINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(11376); // round(9/(4*sqrt(42))*2^15)
- __m128i THIRTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(16433); // round(13/(4*sqrt(42))*2^15)
- __m128i FIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(6320); // round(5/(4*sqrt(42))*2^15)
- __m128i ONE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(1264); // round(1/(4*sqrt(42))*2^15)
-
-
- __m128i ch_mag_des;
- __m128i ch_mag_98_over_42_with_sigma2;
- __m128i ch_mag_74_over_42_with_sigma2;
- __m128i ch_mag_58_over_42_with_sigma2;
- __m128i ch_mag_50_over_42_with_sigma2;
- __m128i ch_mag_34_over_42_with_sigma2;
- __m128i ch_mag_18_over_42_with_sigma2;
- __m128i ch_mag_26_over_42_with_sigma2;
- __m128i ch_mag_10_over_42_with_sigma2;
- __m128i ch_mag_2_over_42_with_sigma2;
- __m128i y0r_one_over_sqrt_21;
- __m128i y0r_three_over_sqrt_21;
- __m128i y0r_five_over_sqrt_21;
- __m128i y0r_seven_over_sqrt_21;
- __m128i y0i_one_over_sqrt_21;
- __m128i y0i_three_over_sqrt_21;
- __m128i y0i_five_over_sqrt_21;
- __m128i y0i_seven_over_sqrt_21;
-#elif defined(__arm__)
-
-#endif
-
- int i,j;
-
- for (i=0; i>2; i+=2) {
-
-#if defined(__x86_64) || defined(__i386__)
- // Get rho
- xmm0 = rho01_128i[i];
- xmm1 = rho01_128i[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho)
- xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho)
- rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho)
- rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho)
-
- // Compute the different rhos
- rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_42);
- rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_42);
- rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_42);
- rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_42);
- rho_rpi_5_5 = _mm_mulhi_epi16(rho_rpi, FIVE_OVER_SQRT_42);
- rho_rmi_5_5 = _mm_mulhi_epi16(rho_rmi, FIVE_OVER_SQRT_42);
- rho_rpi_7_7 = _mm_mulhi_epi16(rho_rpi, SEVEN_OVER_SQRT_42);
- rho_rmi_7_7 = _mm_mulhi_epi16(rho_rmi, SEVEN_OVER_SQRT_42);
-
- rho_rpi_5_5 = _mm_slli_epi16(rho_rpi_5_5, 1);
- rho_rmi_5_5 = _mm_slli_epi16(rho_rmi_5_5, 1);
- rho_rpi_7_7 = _mm_slli_epi16(rho_rpi_7_7, 2);
- rho_rmi_7_7 = _mm_slli_epi16(rho_rmi_7_7, 2);
-
- xmm4 = _mm_mulhi_epi16(xmm2, ONE_OVER_SQRT_42);
- xmm5 = _mm_mulhi_epi16(xmm3, ONE_OVER_SQRT_42);
- xmm6 = _mm_mulhi_epi16(xmm3, THREE_OVER_SQRT_42);
- xmm7 = _mm_mulhi_epi16(xmm3, FIVE_OVER_SQRT_42);
- xmm8 = _mm_mulhi_epi16(xmm3, SEVEN_OVER_SQRT_42);
- xmm7 = _mm_slli_epi16(xmm7, 1);
- xmm8 = _mm_slli_epi16(xmm8, 2);
-
- rho_rpi_1_3 = _mm_adds_epi16(xmm4, xmm6);
- rho_rmi_1_3 = _mm_subs_epi16(xmm4, xmm6);
- rho_rpi_1_5 = _mm_adds_epi16(xmm4, xmm7);
- rho_rmi_1_5 = _mm_subs_epi16(xmm4, xmm7);
- rho_rpi_1_7 = _mm_adds_epi16(xmm4, xmm8);
- rho_rmi_1_7 = _mm_subs_epi16(xmm4, xmm8);
-
- xmm4 = _mm_mulhi_epi16(xmm2, THREE_OVER_SQRT_42);
- rho_rpi_3_1 = _mm_adds_epi16(xmm4, xmm5);
- rho_rmi_3_1 = _mm_subs_epi16(xmm4, xmm5);
- rho_rpi_3_5 = _mm_adds_epi16(xmm4, xmm7);
- rho_rmi_3_5 = _mm_subs_epi16(xmm4, xmm7);
- rho_rpi_3_7 = _mm_adds_epi16(xmm4, xmm8);
- rho_rmi_3_7 = _mm_subs_epi16(xmm4, xmm8);
-
- xmm4 = _mm_mulhi_epi16(xmm2, FIVE_OVER_SQRT_42);
- xmm4 = _mm_slli_epi16(xmm4, 1);
- rho_rpi_5_1 = _mm_adds_epi16(xmm4, xmm5);
- rho_rmi_5_1 = _mm_subs_epi16(xmm4, xmm5);
- rho_rpi_5_3 = _mm_adds_epi16(xmm4, xmm6);
- rho_rmi_5_3 = _mm_subs_epi16(xmm4, xmm6);
- rho_rpi_5_7 = _mm_adds_epi16(xmm4, xmm8);
- rho_rmi_5_7 = _mm_subs_epi16(xmm4, xmm8);
-
- xmm4 = _mm_mulhi_epi16(xmm2, SEVEN_OVER_SQRT_42);
- xmm4 = _mm_slli_epi16(xmm4, 2);
- rho_rpi_7_1 = _mm_adds_epi16(xmm4, xmm5);
- rho_rmi_7_1 = _mm_subs_epi16(xmm4, xmm5);
- rho_rpi_7_3 = _mm_adds_epi16(xmm4, xmm6);
- rho_rmi_7_3 = _mm_subs_epi16(xmm4, xmm6);
- rho_rpi_7_5 = _mm_adds_epi16(xmm4, xmm7);
- rho_rmi_7_5 = _mm_subs_epi16(xmm4, xmm7);
-
- // Rearrange interfering MF output
- xmm0 = stream1_128i_in[i];
- xmm1 = stream1_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)]
- y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)]
-
- // Psi_r calculation from rho_rpi or rho_rmi
- xmm0 = _mm_setzero_si128(); // ZERO for abs_pi16
- xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1r);
- psi_r_p7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1r);
- psi_r_p7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1r);
- psi_r_p7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1r);
- psi_r_p7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1r);
- psi_r_p7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1r);
- psi_r_p7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1r);
- psi_r_p7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1r);
- psi_r_p7_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1r);
- psi_r_p5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1r);
- psi_r_p5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1r);
- psi_r_p5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1r);
- psi_r_p5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1r);
- psi_r_p5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1r);
- psi_r_p5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1r);
- psi_r_p5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1r);
- psi_r_p5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1r);
- psi_r_p3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1r);
- psi_r_p3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1r);
- psi_r_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1r);
- psi_r_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1r);
- psi_r_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1r);
- psi_r_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1r);
- psi_r_p3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1r);
- psi_r_p3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1r);
- psi_r_p1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1r);
- psi_r_p1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1r);
- psi_r_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1r);
- psi_r_p1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1r);
- psi_r_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1r);
- psi_r_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1r);
- psi_r_p1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1r);
- psi_r_p1_m7 = _mm_abs_epi16(xmm2);
-
- xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1r);
- psi_r_m1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1r);
- psi_r_m1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1r);
- psi_r_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1r);
- psi_r_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1r);
- psi_r_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1r);
- psi_r_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1r);
- psi_r_m1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1r);
- psi_r_m1_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1r);
- psi_r_m3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1r);
- psi_r_m3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1r);
- psi_r_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1r);
- psi_r_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1r);
- psi_r_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1r);
- psi_r_m3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1r);
- psi_r_m3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1r);
- psi_r_m3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1r);
- psi_r_m5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1r);
- psi_r_m5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1r);
- psi_r_m5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1r);
- psi_r_m5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1r);
- psi_r_m5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1r);
- psi_r_m5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1r);
- psi_r_m5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1r);
- psi_r_m5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1r);
- psi_r_m7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1r);
- psi_r_m7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1r);
- psi_r_m7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1r);
- psi_r_m7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1r);
- psi_r_m7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1r);
- psi_r_m7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1r);
- psi_r_m7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1r);
- psi_r_m7_m7 = _mm_abs_epi16(xmm2);
-
- // Psi_i calculation from rho_rpi or rho_rmi
- xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1i);
- psi_i_p7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1i);
- psi_i_p7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1i);
- psi_i_p7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1i);
- psi_i_p7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1i);
- psi_i_p7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1i);
- psi_i_p7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1i);
- psi_i_p7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1i);
- psi_i_p7_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1i);
- psi_i_p5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1i);
- psi_i_p5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1i);
- psi_i_p5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1i);
- psi_i_p5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1i);
- psi_i_p5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1i);
- psi_i_p5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1i);
- psi_i_p5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1i);
- psi_i_p5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1i);
- psi_i_p3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1i);
- psi_i_p3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1i);
- psi_i_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1i);
- psi_i_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1i);
- psi_i_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1i);
- psi_i_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1i);
- psi_i_p3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1i);
- psi_i_p3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1i);
- psi_i_p1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1i);
- psi_i_p1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1i);
- psi_i_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1i);
- psi_i_p1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1i);
- psi_i_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1i);
- psi_i_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1i);
- psi_i_p1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1i);
- psi_i_p1_m7 = _mm_abs_epi16(xmm2);
-
- xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1i);
- psi_i_m1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1i);
- psi_i_m1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1i);
- psi_i_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1i);
- psi_i_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1i);
- psi_i_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1i);
- psi_i_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1i);
- psi_i_m1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1i);
- psi_i_m1_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1i);
- psi_i_m3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1i);
- psi_i_m3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1i);
- psi_i_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1i);
- psi_i_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1i);
- psi_i_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1i);
- psi_i_m3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1i);
- psi_i_m3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1i);
- psi_i_m3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1i);
- psi_i_m5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1i);
- psi_i_m5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1i);
- psi_i_m5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1i);
- psi_i_m5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1i);
- psi_i_m5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1i);
- psi_i_m5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1i);
- psi_i_m5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1i);
- psi_i_m5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1i);
- psi_i_m7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1i);
- psi_i_m7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1i);
- psi_i_m7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1i);
- psi_i_m7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1i);
- psi_i_m7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1i);
- psi_i_m7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1i);
- psi_i_m7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1i);
- psi_i_m7_m7 = _mm_abs_epi16(xmm2);
-
-
- // Rearrange desired MF output
- xmm0 = stream0_128i_in[i];
- xmm1 = stream0_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)]
- y0i = _mm_unpackhi_epi64(xmm0,xmm1);
-
- // Rearrange desired channel magnitudes
- xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10))
- xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10))
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3);
-
- y0r_one_over_sqrt_21 = _mm_mulhi_epi16(y0r, ONE_OVER_SQRT_42);
- y0r_three_over_sqrt_21 = _mm_mulhi_epi16(y0r, THREE_OVER_SQRT_42);
- y0r_five_over_sqrt_21 = _mm_mulhi_epi16(y0r, FIVE_OVER_SQRT_42);
- y0r_five_over_sqrt_21 = _mm_slli_epi16(y0r_five_over_sqrt_21, 1);
- y0r_seven_over_sqrt_21 = _mm_mulhi_epi16(y0r, SEVEN_OVER_SQRT_42);
- y0r_seven_over_sqrt_21 = _mm_slli_epi16(y0r_seven_over_sqrt_21, 2); // Q2.14
-
- y0i_one_over_sqrt_21 = _mm_mulhi_epi16(y0i, ONE_OVER_SQRT_42);
- y0i_three_over_sqrt_21 = _mm_mulhi_epi16(y0i, THREE_OVER_SQRT_42);
- y0i_five_over_sqrt_21 = _mm_mulhi_epi16(y0i, FIVE_OVER_SQRT_42);
- y0i_five_over_sqrt_21 = _mm_slli_epi16(y0i_five_over_sqrt_21, 1);
- y0i_seven_over_sqrt_21 = _mm_mulhi_epi16(y0i, SEVEN_OVER_SQRT_42);
- y0i_seven_over_sqrt_21 = _mm_slli_epi16(y0i_seven_over_sqrt_21, 2); // Q2.14
-
- y0_p_7_1 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_7_3 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_7_5 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_7_7 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_p_5_1 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_5_3 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_5_5 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_5_7 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_3_5 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_3_7 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_p_1_1 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_1_3 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_1_5 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_1_7 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21);
-
- y0_m_1_1 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_1_3 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_1_5 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_1_7 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_3_5 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_3_7 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_m_5_1 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_5_3 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_5_5 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_5_7 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_m_7_1 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_7_3 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_7_5 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_7_7 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21);
-
- // divide by sqrt(2)
- psi_r_p7_p7 = _mm_mulhi_epi16(psi_r_p7_p7, ONE_OVER_SQRT_2);
- psi_r_p7_p7 = _mm_slli_epi16(psi_r_p7_p7, 1);
- psi_r_p7_p5 = _mm_mulhi_epi16(psi_r_p7_p5, ONE_OVER_SQRT_2);
- psi_r_p7_p5 = _mm_slli_epi16(psi_r_p7_p5, 1);
- psi_r_p7_p3 = _mm_mulhi_epi16(psi_r_p7_p3, ONE_OVER_SQRT_2);
- psi_r_p7_p3 = _mm_slli_epi16(psi_r_p7_p3, 1);
- psi_r_p7_p1 = _mm_mulhi_epi16(psi_r_p7_p1, ONE_OVER_SQRT_2);
- psi_r_p7_p1 = _mm_slli_epi16(psi_r_p7_p1, 1);
- psi_r_p7_m1 = _mm_mulhi_epi16(psi_r_p7_m1, ONE_OVER_SQRT_2);
- psi_r_p7_m1 = _mm_slli_epi16(psi_r_p7_m1, 1);
- psi_r_p7_m3 = _mm_mulhi_epi16(psi_r_p7_m3, ONE_OVER_SQRT_2);
- psi_r_p7_m3 = _mm_slli_epi16(psi_r_p7_m3, 1);
- psi_r_p7_m5 = _mm_mulhi_epi16(psi_r_p7_m5, ONE_OVER_SQRT_2);
- psi_r_p7_m5 = _mm_slli_epi16(psi_r_p7_m5, 1);
- psi_r_p7_m7 = _mm_mulhi_epi16(psi_r_p7_m7, ONE_OVER_SQRT_2);
- psi_r_p7_m7 = _mm_slli_epi16(psi_r_p7_m7, 1);
- psi_r_p5_p7 = _mm_mulhi_epi16(psi_r_p5_p7, ONE_OVER_SQRT_2);
- psi_r_p5_p7 = _mm_slli_epi16(psi_r_p5_p7, 1);
- psi_r_p5_p5 = _mm_mulhi_epi16(psi_r_p5_p5, ONE_OVER_SQRT_2);
- psi_r_p5_p5 = _mm_slli_epi16(psi_r_p5_p5, 1);
- psi_r_p5_p3 = _mm_mulhi_epi16(psi_r_p5_p3, ONE_OVER_SQRT_2);
- psi_r_p5_p3 = _mm_slli_epi16(psi_r_p5_p3, 1);
- psi_r_p5_p1 = _mm_mulhi_epi16(psi_r_p5_p1, ONE_OVER_SQRT_2);
- psi_r_p5_p1 = _mm_slli_epi16(psi_r_p5_p1, 1);
- psi_r_p5_m1 = _mm_mulhi_epi16(psi_r_p5_m1, ONE_OVER_SQRT_2);
- psi_r_p5_m1 = _mm_slli_epi16(psi_r_p5_m1, 1);
- psi_r_p5_m3 = _mm_mulhi_epi16(psi_r_p5_m3, ONE_OVER_SQRT_2);
- psi_r_p5_m3 = _mm_slli_epi16(psi_r_p5_m3, 1);
- psi_r_p5_m5 = _mm_mulhi_epi16(psi_r_p5_m5, ONE_OVER_SQRT_2);
- psi_r_p5_m5 = _mm_slli_epi16(psi_r_p5_m5, 1);
- psi_r_p5_m7 = _mm_mulhi_epi16(psi_r_p5_m7, ONE_OVER_SQRT_2);
- psi_r_p5_m7 = _mm_slli_epi16(psi_r_p5_m7, 1);
- psi_r_p3_p7 = _mm_mulhi_epi16(psi_r_p3_p7, ONE_OVER_SQRT_2);
- psi_r_p3_p7 = _mm_slli_epi16(psi_r_p3_p7, 1);
- psi_r_p3_p5 = _mm_mulhi_epi16(psi_r_p3_p5, ONE_OVER_SQRT_2);
- psi_r_p3_p5 = _mm_slli_epi16(psi_r_p3_p5, 1);
- psi_r_p3_p3 = _mm_mulhi_epi16(psi_r_p3_p3, ONE_OVER_SQRT_2);
- psi_r_p3_p3 = _mm_slli_epi16(psi_r_p3_p3, 1);
- psi_r_p3_p1 = _mm_mulhi_epi16(psi_r_p3_p1, ONE_OVER_SQRT_2);
- psi_r_p3_p1 = _mm_slli_epi16(psi_r_p3_p1, 1);
- psi_r_p3_m1 = _mm_mulhi_epi16(psi_r_p3_m1, ONE_OVER_SQRT_2);
- psi_r_p3_m1 = _mm_slli_epi16(psi_r_p3_m1, 1);
- psi_r_p3_m3 = _mm_mulhi_epi16(psi_r_p3_m3, ONE_OVER_SQRT_2);
- psi_r_p3_m3 = _mm_slli_epi16(psi_r_p3_m3, 1);
- psi_r_p3_m5 = _mm_mulhi_epi16(psi_r_p3_m5, ONE_OVER_SQRT_2);
- psi_r_p3_m5 = _mm_slli_epi16(psi_r_p3_m5, 1);
- psi_r_p3_m7 = _mm_mulhi_epi16(psi_r_p3_m7, ONE_OVER_SQRT_2);
- psi_r_p3_m7 = _mm_slli_epi16(psi_r_p3_m7, 1);
- psi_r_p1_p7 = _mm_mulhi_epi16(psi_r_p1_p7, ONE_OVER_SQRT_2);
- psi_r_p1_p7 = _mm_slli_epi16(psi_r_p1_p7, 1);
- psi_r_p1_p5 = _mm_mulhi_epi16(psi_r_p1_p5, ONE_OVER_SQRT_2);
- psi_r_p1_p5 = _mm_slli_epi16(psi_r_p1_p5, 1);
- psi_r_p1_p3 = _mm_mulhi_epi16(psi_r_p1_p3, ONE_OVER_SQRT_2);
- psi_r_p1_p3 = _mm_slli_epi16(psi_r_p1_p3, 1);
- psi_r_p1_p1 = _mm_mulhi_epi16(psi_r_p1_p1, ONE_OVER_SQRT_2);
- psi_r_p1_p1 = _mm_slli_epi16(psi_r_p1_p1, 1);
- psi_r_p1_m1 = _mm_mulhi_epi16(psi_r_p1_m1, ONE_OVER_SQRT_2);
- psi_r_p1_m1 = _mm_slli_epi16(psi_r_p1_m1, 1);
- psi_r_p1_m3 = _mm_mulhi_epi16(psi_r_p1_m3, ONE_OVER_SQRT_2);
- psi_r_p1_m3 = _mm_slli_epi16(psi_r_p1_m3, 1);
- psi_r_p1_m5 = _mm_mulhi_epi16(psi_r_p1_m5, ONE_OVER_SQRT_2);
- psi_r_p1_m5 = _mm_slli_epi16(psi_r_p1_m5, 1);
- psi_r_p1_m7 = _mm_mulhi_epi16(psi_r_p1_m7, ONE_OVER_SQRT_2);
- psi_r_p1_m7 = _mm_slli_epi16(psi_r_p1_m7, 1);
- psi_r_m1_p7 = _mm_mulhi_epi16(psi_r_m1_p7, ONE_OVER_SQRT_2);
- psi_r_m1_p7 = _mm_slli_epi16(psi_r_m1_p7, 1);
- psi_r_m1_p5 = _mm_mulhi_epi16(psi_r_m1_p5, ONE_OVER_SQRT_2);
- psi_r_m1_p5 = _mm_slli_epi16(psi_r_m1_p5, 1);
- psi_r_m1_p3 = _mm_mulhi_epi16(psi_r_m1_p3, ONE_OVER_SQRT_2);
- psi_r_m1_p3 = _mm_slli_epi16(psi_r_m1_p3, 1);
- psi_r_m1_p1 = _mm_mulhi_epi16(psi_r_m1_p1, ONE_OVER_SQRT_2);
- psi_r_m1_p1 = _mm_slli_epi16(psi_r_m1_p1, 1);
- psi_r_m1_m1 = _mm_mulhi_epi16(psi_r_m1_m1, ONE_OVER_SQRT_2);
- psi_r_m1_m1 = _mm_slli_epi16(psi_r_m1_m1, 1);
- psi_r_m1_m3 = _mm_mulhi_epi16(psi_r_m1_m3, ONE_OVER_SQRT_2);
- psi_r_m1_m3 = _mm_slli_epi16(psi_r_m1_m3, 1);
- psi_r_m1_m5 = _mm_mulhi_epi16(psi_r_m1_m5, ONE_OVER_SQRT_2);
- psi_r_m1_m5 = _mm_slli_epi16(psi_r_m1_m5, 1);
- psi_r_m1_m7 = _mm_mulhi_epi16(psi_r_m1_m7, ONE_OVER_SQRT_2);
- psi_r_m1_m7 = _mm_slli_epi16(psi_r_m1_m7, 1);
- psi_r_m3_p7 = _mm_mulhi_epi16(psi_r_m3_p7, ONE_OVER_SQRT_2);
- psi_r_m3_p7 = _mm_slli_epi16(psi_r_m3_p7, 1);
- psi_r_m3_p5 = _mm_mulhi_epi16(psi_r_m3_p5, ONE_OVER_SQRT_2);
- psi_r_m3_p5 = _mm_slli_epi16(psi_r_m3_p5, 1);
- psi_r_m3_p3 = _mm_mulhi_epi16(psi_r_m3_p3, ONE_OVER_SQRT_2);
- psi_r_m3_p3 = _mm_slli_epi16(psi_r_m3_p3, 1);
- psi_r_m3_p1 = _mm_mulhi_epi16(psi_r_m3_p1, ONE_OVER_SQRT_2);
- psi_r_m3_p1 = _mm_slli_epi16(psi_r_m3_p1, 1);
- psi_r_m3_m1 = _mm_mulhi_epi16(psi_r_m3_m1, ONE_OVER_SQRT_2);
- psi_r_m3_m1 = _mm_slli_epi16(psi_r_m3_m1, 1);
- psi_r_m3_m3 = _mm_mulhi_epi16(psi_r_m3_m3, ONE_OVER_SQRT_2);
- psi_r_m3_m3 = _mm_slli_epi16(psi_r_m3_m3, 1);
- psi_r_m3_m5 = _mm_mulhi_epi16(psi_r_m3_m5, ONE_OVER_SQRT_2);
- psi_r_m3_m5 = _mm_slli_epi16(psi_r_m3_m5, 1);
- psi_r_m3_m7 = _mm_mulhi_epi16(psi_r_m3_m7, ONE_OVER_SQRT_2);
- psi_r_m3_m7 = _mm_slli_epi16(psi_r_m3_m7, 1);
- psi_r_m5_p7 = _mm_mulhi_epi16(psi_r_m5_p7, ONE_OVER_SQRT_2);
- psi_r_m5_p7 = _mm_slli_epi16(psi_r_m5_p7, 1);
- psi_r_m5_p5 = _mm_mulhi_epi16(psi_r_m5_p5, ONE_OVER_SQRT_2);
- psi_r_m5_p5 = _mm_slli_epi16(psi_r_m5_p5, 1);
- psi_r_m5_p3 = _mm_mulhi_epi16(psi_r_m5_p3, ONE_OVER_SQRT_2);
- psi_r_m5_p3 = _mm_slli_epi16(psi_r_m5_p3, 1);
- psi_r_m5_p1 = _mm_mulhi_epi16(psi_r_m5_p1, ONE_OVER_SQRT_2);
- psi_r_m5_p1 = _mm_slli_epi16(psi_r_m5_p1, 1);
- psi_r_m5_m1 = _mm_mulhi_epi16(psi_r_m5_m1, ONE_OVER_SQRT_2);
- psi_r_m5_m1 = _mm_slli_epi16(psi_r_m5_m1, 1);
- psi_r_m5_m3 = _mm_mulhi_epi16(psi_r_m5_m3, ONE_OVER_SQRT_2);
- psi_r_m5_m3 = _mm_slli_epi16(psi_r_m5_m3, 1);
- psi_r_m5_m5 = _mm_mulhi_epi16(psi_r_m5_m5, ONE_OVER_SQRT_2);
- psi_r_m5_m5 = _mm_slli_epi16(psi_r_m5_m5, 1);
- psi_r_m5_m7 = _mm_mulhi_epi16(psi_r_m5_m7, ONE_OVER_SQRT_2);
- psi_r_m5_m7 = _mm_slli_epi16(psi_r_m5_m7, 1);
- psi_r_m7_p7 = _mm_mulhi_epi16(psi_r_m7_p7, ONE_OVER_SQRT_2);
- psi_r_m7_p7 = _mm_slli_epi16(psi_r_m7_p7, 1);
- psi_r_m7_p5 = _mm_mulhi_epi16(psi_r_m7_p5, ONE_OVER_SQRT_2);
- psi_r_m7_p5 = _mm_slli_epi16(psi_r_m7_p5, 1);
- psi_r_m7_p3 = _mm_mulhi_epi16(psi_r_m7_p3, ONE_OVER_SQRT_2);
- psi_r_m7_p3 = _mm_slli_epi16(psi_r_m7_p3, 1);
- psi_r_m7_p1 = _mm_mulhi_epi16(psi_r_m7_p1, ONE_OVER_SQRT_2);
- psi_r_m7_p1 = _mm_slli_epi16(psi_r_m7_p1, 1);
- psi_r_m7_m1 = _mm_mulhi_epi16(psi_r_m7_m1, ONE_OVER_SQRT_2);
- psi_r_m7_m1 = _mm_slli_epi16(psi_r_m7_m1, 1);
- psi_r_m7_m3 = _mm_mulhi_epi16(psi_r_m7_m3, ONE_OVER_SQRT_2);
- psi_r_m7_m3 = _mm_slli_epi16(psi_r_m7_m3, 1);
- psi_r_m7_m5 = _mm_mulhi_epi16(psi_r_m7_m5, ONE_OVER_SQRT_2);
- psi_r_m7_m5 = _mm_slli_epi16(psi_r_m7_m5, 1);
- psi_r_m7_m7 = _mm_mulhi_epi16(psi_r_m7_m7, ONE_OVER_SQRT_2);
- psi_r_m7_m7 = _mm_slli_epi16(psi_r_m7_m7, 1);
-
- psi_i_p7_p7 = _mm_mulhi_epi16(psi_i_p7_p7, ONE_OVER_SQRT_2);
- psi_i_p7_p7 = _mm_slli_epi16(psi_i_p7_p7, 1);
- psi_i_p7_p5 = _mm_mulhi_epi16(psi_i_p7_p5, ONE_OVER_SQRT_2);
- psi_i_p7_p5 = _mm_slli_epi16(psi_i_p7_p5, 1);
- psi_i_p7_p3 = _mm_mulhi_epi16(psi_i_p7_p3, ONE_OVER_SQRT_2);
- psi_i_p7_p3 = _mm_slli_epi16(psi_i_p7_p3, 1);
- psi_i_p7_p1 = _mm_mulhi_epi16(psi_i_p7_p1, ONE_OVER_SQRT_2);
- psi_i_p7_p1 = _mm_slli_epi16(psi_i_p7_p1, 1);
- psi_i_p7_m1 = _mm_mulhi_epi16(psi_i_p7_m1, ONE_OVER_SQRT_2);
- psi_i_p7_m1 = _mm_slli_epi16(psi_i_p7_m1, 1);
- psi_i_p7_m3 = _mm_mulhi_epi16(psi_i_p7_m3, ONE_OVER_SQRT_2);
- psi_i_p7_m3 = _mm_slli_epi16(psi_i_p7_m3, 1);
- psi_i_p7_m5 = _mm_mulhi_epi16(psi_i_p7_m5, ONE_OVER_SQRT_2);
- psi_i_p7_m5 = _mm_slli_epi16(psi_i_p7_m5, 1);
- psi_i_p7_m7 = _mm_mulhi_epi16(psi_i_p7_m7, ONE_OVER_SQRT_2);
- psi_i_p7_m7 = _mm_slli_epi16(psi_i_p7_m7, 1);
- psi_i_p5_p7 = _mm_mulhi_epi16(psi_i_p5_p7, ONE_OVER_SQRT_2);
- psi_i_p5_p7 = _mm_slli_epi16(psi_i_p5_p7, 1);
- psi_i_p5_p5 = _mm_mulhi_epi16(psi_i_p5_p5, ONE_OVER_SQRT_2);
- psi_i_p5_p5 = _mm_slli_epi16(psi_i_p5_p5, 1);
- psi_i_p5_p3 = _mm_mulhi_epi16(psi_i_p5_p3, ONE_OVER_SQRT_2);
- psi_i_p5_p3 = _mm_slli_epi16(psi_i_p5_p3, 1);
- psi_i_p5_p1 = _mm_mulhi_epi16(psi_i_p5_p1, ONE_OVER_SQRT_2);
- psi_i_p5_p1 = _mm_slli_epi16(psi_i_p5_p1, 1);
- psi_i_p5_m1 = _mm_mulhi_epi16(psi_i_p5_m1, ONE_OVER_SQRT_2);
- psi_i_p5_m1 = _mm_slli_epi16(psi_i_p5_m1, 1);
- psi_i_p5_m3 = _mm_mulhi_epi16(psi_i_p5_m3, ONE_OVER_SQRT_2);
- psi_i_p5_m3 = _mm_slli_epi16(psi_i_p5_m3, 1);
- psi_i_p5_m5 = _mm_mulhi_epi16(psi_i_p5_m5, ONE_OVER_SQRT_2);
- psi_i_p5_m5 = _mm_slli_epi16(psi_i_p5_m5, 1);
- psi_i_p5_m7 = _mm_mulhi_epi16(psi_i_p5_m7, ONE_OVER_SQRT_2);
- psi_i_p5_m7 = _mm_slli_epi16(psi_i_p5_m7, 1);
- psi_i_p3_p7 = _mm_mulhi_epi16(psi_i_p3_p7, ONE_OVER_SQRT_2);
- psi_i_p3_p7 = _mm_slli_epi16(psi_i_p3_p7, 1);
- psi_i_p3_p5 = _mm_mulhi_epi16(psi_i_p3_p5, ONE_OVER_SQRT_2);
- psi_i_p3_p5 = _mm_slli_epi16(psi_i_p3_p5, 1);
- psi_i_p3_p3 = _mm_mulhi_epi16(psi_i_p3_p3, ONE_OVER_SQRT_2);
- psi_i_p3_p3 = _mm_slli_epi16(psi_i_p3_p3, 1);
- psi_i_p3_p1 = _mm_mulhi_epi16(psi_i_p3_p1, ONE_OVER_SQRT_2);
- psi_i_p3_p1 = _mm_slli_epi16(psi_i_p3_p1, 1);
- psi_i_p3_m1 = _mm_mulhi_epi16(psi_i_p3_m1, ONE_OVER_SQRT_2);
- psi_i_p3_m1 = _mm_slli_epi16(psi_i_p3_m1, 1);
- psi_i_p3_m3 = _mm_mulhi_epi16(psi_i_p3_m3, ONE_OVER_SQRT_2);
- psi_i_p3_m3 = _mm_slli_epi16(psi_i_p3_m3, 1);
- psi_i_p3_m5 = _mm_mulhi_epi16(psi_i_p3_m5, ONE_OVER_SQRT_2);
- psi_i_p3_m5 = _mm_slli_epi16(psi_i_p3_m5, 1);
- psi_i_p3_m7 = _mm_mulhi_epi16(psi_i_p3_m7, ONE_OVER_SQRT_2);
- psi_i_p3_m7 = _mm_slli_epi16(psi_i_p3_m7, 1);
- psi_i_p1_p7 = _mm_mulhi_epi16(psi_i_p1_p7, ONE_OVER_SQRT_2);
- psi_i_p1_p7 = _mm_slli_epi16(psi_i_p1_p7, 1);
- psi_i_p1_p5 = _mm_mulhi_epi16(psi_i_p1_p5, ONE_OVER_SQRT_2);
- psi_i_p1_p5 = _mm_slli_epi16(psi_i_p1_p5, 1);
- psi_i_p1_p3 = _mm_mulhi_epi16(psi_i_p1_p3, ONE_OVER_SQRT_2);
- psi_i_p1_p3 = _mm_slli_epi16(psi_i_p1_p3, 1);
- psi_i_p1_p1 = _mm_mulhi_epi16(psi_i_p1_p1, ONE_OVER_SQRT_2);
- psi_i_p1_p1 = _mm_slli_epi16(psi_i_p1_p1, 1);
- psi_i_p1_m1 = _mm_mulhi_epi16(psi_i_p1_m1, ONE_OVER_SQRT_2);
- psi_i_p1_m1 = _mm_slli_epi16(psi_i_p1_m1, 1);
- psi_i_p1_m3 = _mm_mulhi_epi16(psi_i_p1_m3, ONE_OVER_SQRT_2);
- psi_i_p1_m3 = _mm_slli_epi16(psi_i_p1_m3, 1);
- psi_i_p1_m5 = _mm_mulhi_epi16(psi_i_p1_m5, ONE_OVER_SQRT_2);
- psi_i_p1_m5 = _mm_slli_epi16(psi_i_p1_m5, 1);
- psi_i_p1_m7 = _mm_mulhi_epi16(psi_i_p1_m7, ONE_OVER_SQRT_2);
- psi_i_p1_m7 = _mm_slli_epi16(psi_i_p1_m7, 1);
- psi_i_m1_p7 = _mm_mulhi_epi16(psi_i_m1_p7, ONE_OVER_SQRT_2);
- psi_i_m1_p7 = _mm_slli_epi16(psi_i_m1_p7, 1);
- psi_i_m1_p5 = _mm_mulhi_epi16(psi_i_m1_p5, ONE_OVER_SQRT_2);
- psi_i_m1_p5 = _mm_slli_epi16(psi_i_m1_p5, 1);
- psi_i_m1_p3 = _mm_mulhi_epi16(psi_i_m1_p3, ONE_OVER_SQRT_2);
- psi_i_m1_p3 = _mm_slli_epi16(psi_i_m1_p3, 1);
- psi_i_m1_p1 = _mm_mulhi_epi16(psi_i_m1_p1, ONE_OVER_SQRT_2);
- psi_i_m1_p1 = _mm_slli_epi16(psi_i_m1_p1, 1);
- psi_i_m1_m1 = _mm_mulhi_epi16(psi_i_m1_m1, ONE_OVER_SQRT_2);
- psi_i_m1_m1 = _mm_slli_epi16(psi_i_m1_m1, 1);
- psi_i_m1_m3 = _mm_mulhi_epi16(psi_i_m1_m3, ONE_OVER_SQRT_2);
- psi_i_m1_m3 = _mm_slli_epi16(psi_i_m1_m3, 1);
- psi_i_m1_m5 = _mm_mulhi_epi16(psi_i_m1_m5, ONE_OVER_SQRT_2);
- psi_i_m1_m5 = _mm_slli_epi16(psi_i_m1_m5, 1);
- psi_i_m1_m7 = _mm_mulhi_epi16(psi_i_m1_m7, ONE_OVER_SQRT_2);
- psi_i_m1_m7 = _mm_slli_epi16(psi_i_m1_m7, 1);
- psi_i_m3_p7 = _mm_mulhi_epi16(psi_i_m3_p7, ONE_OVER_SQRT_2);
- psi_i_m3_p7 = _mm_slli_epi16(psi_i_m3_p7, 1);
- psi_i_m3_p5 = _mm_mulhi_epi16(psi_i_m3_p5, ONE_OVER_SQRT_2);
- psi_i_m3_p5 = _mm_slli_epi16(psi_i_m3_p5, 1);
- psi_i_m3_p3 = _mm_mulhi_epi16(psi_i_m3_p3, ONE_OVER_SQRT_2);
- psi_i_m3_p3 = _mm_slli_epi16(psi_i_m3_p3, 1);
- psi_i_m3_p1 = _mm_mulhi_epi16(psi_i_m3_p1, ONE_OVER_SQRT_2);
- psi_i_m3_p1 = _mm_slli_epi16(psi_i_m3_p1, 1);
- psi_i_m3_m1 = _mm_mulhi_epi16(psi_i_m3_m1, ONE_OVER_SQRT_2);
- psi_i_m3_m1 = _mm_slli_epi16(psi_i_m3_m1, 1);
- psi_i_m3_m3 = _mm_mulhi_epi16(psi_i_m3_m3, ONE_OVER_SQRT_2);
- psi_i_m3_m3 = _mm_slli_epi16(psi_i_m3_m3, 1);
- psi_i_m3_m5 = _mm_mulhi_epi16(psi_i_m3_m5, ONE_OVER_SQRT_2);
- psi_i_m3_m5 = _mm_slli_epi16(psi_i_m3_m5, 1);
- psi_i_m3_m7 = _mm_mulhi_epi16(psi_i_m3_m7, ONE_OVER_SQRT_2);
- psi_i_m3_m7 = _mm_slli_epi16(psi_i_m3_m7, 1);
- psi_i_m5_p7 = _mm_mulhi_epi16(psi_i_m5_p7, ONE_OVER_SQRT_2);
- psi_i_m5_p7 = _mm_slli_epi16(psi_i_m5_p7, 1);
- psi_i_m5_p5 = _mm_mulhi_epi16(psi_i_m5_p5, ONE_OVER_SQRT_2);
- psi_i_m5_p5 = _mm_slli_epi16(psi_i_m5_p5, 1);
- psi_i_m5_p3 = _mm_mulhi_epi16(psi_i_m5_p3, ONE_OVER_SQRT_2);
- psi_i_m5_p3 = _mm_slli_epi16(psi_i_m5_p3, 1);
- psi_i_m5_p1 = _mm_mulhi_epi16(psi_i_m5_p1, ONE_OVER_SQRT_2);
- psi_i_m5_p1 = _mm_slli_epi16(psi_i_m5_p1, 1);
- psi_i_m5_m1 = _mm_mulhi_epi16(psi_i_m5_m1, ONE_OVER_SQRT_2);
- psi_i_m5_m1 = _mm_slli_epi16(psi_i_m5_m1, 1);
- psi_i_m5_m3 = _mm_mulhi_epi16(psi_i_m5_m3, ONE_OVER_SQRT_2);
- psi_i_m5_m3 = _mm_slli_epi16(psi_i_m5_m3, 1);
- psi_i_m5_m5 = _mm_mulhi_epi16(psi_i_m5_m5, ONE_OVER_SQRT_2);
- psi_i_m5_m5 = _mm_slli_epi16(psi_i_m5_m5, 1);
- psi_i_m5_m7 = _mm_mulhi_epi16(psi_i_m5_m7, ONE_OVER_SQRT_2);
- psi_i_m5_m7 = _mm_slli_epi16(psi_i_m5_m7, 1);
- psi_i_m7_p7 = _mm_mulhi_epi16(psi_i_m7_p7, ONE_OVER_SQRT_2);
- psi_i_m7_p7 = _mm_slli_epi16(psi_i_m7_p7, 1);
- psi_i_m7_p5 = _mm_mulhi_epi16(psi_i_m7_p5, ONE_OVER_SQRT_2);
- psi_i_m7_p5 = _mm_slli_epi16(psi_i_m7_p5, 1);
- psi_i_m7_p3 = _mm_mulhi_epi16(psi_i_m7_p3, ONE_OVER_SQRT_2);
- psi_i_m7_p3 = _mm_slli_epi16(psi_i_m7_p3, 1);
- psi_i_m7_p1 = _mm_mulhi_epi16(psi_i_m7_p1, ONE_OVER_SQRT_2);
- psi_i_m7_p1 = _mm_slli_epi16(psi_i_m7_p1, 1);
- psi_i_m7_m1 = _mm_mulhi_epi16(psi_i_m7_m1, ONE_OVER_SQRT_2);
- psi_i_m7_m1 = _mm_slli_epi16(psi_i_m7_m1, 1);
- psi_i_m7_m3 = _mm_mulhi_epi16(psi_i_m7_m3, ONE_OVER_SQRT_2);
- psi_i_m7_m3 = _mm_slli_epi16(psi_i_m7_m3, 1);
- psi_i_m7_m5 = _mm_mulhi_epi16(psi_i_m7_m5, ONE_OVER_SQRT_2);
- psi_i_m7_m5 = _mm_slli_epi16(psi_i_m7_m5, 1);
- psi_i_m7_m7 = _mm_mulhi_epi16(psi_i_m7_m7, ONE_OVER_SQRT_2);
- psi_i_m7_m7 = _mm_slli_epi16(psi_i_m7_m7, 1);
-
- psi_a_p7_p7 = _mm_adds_epi16(psi_r_p7_p7, psi_i_p7_p7);
- psi_a_p7_p5 = _mm_adds_epi16(psi_r_p7_p5, psi_i_p7_p5);
- psi_a_p7_p3 = _mm_adds_epi16(psi_r_p7_p3, psi_i_p7_p3);
- psi_a_p7_p1 = _mm_adds_epi16(psi_r_p7_p1, psi_i_p7_p1);
- psi_a_p7_m1 = _mm_adds_epi16(psi_r_p7_m1, psi_i_p7_m1);
- psi_a_p7_m3 = _mm_adds_epi16(psi_r_p7_m3, psi_i_p7_m3);
- psi_a_p7_m5 = _mm_adds_epi16(psi_r_p7_m5, psi_i_p7_m5);
- psi_a_p7_m7 = _mm_adds_epi16(psi_r_p7_m7, psi_i_p7_m7);
- psi_a_p5_p7 = _mm_adds_epi16(psi_r_p5_p7, psi_i_p5_p7);
- psi_a_p5_p5 = _mm_adds_epi16(psi_r_p5_p5, psi_i_p5_p5);
- psi_a_p5_p3 = _mm_adds_epi16(psi_r_p5_p3, psi_i_p5_p3);
- psi_a_p5_p1 = _mm_adds_epi16(psi_r_p5_p1, psi_i_p5_p1);
- psi_a_p5_m1 = _mm_adds_epi16(psi_r_p5_m1, psi_i_p5_m1);
- psi_a_p5_m3 = _mm_adds_epi16(psi_r_p5_m3, psi_i_p5_m3);
- psi_a_p5_m5 = _mm_adds_epi16(psi_r_p5_m5, psi_i_p5_m5);
- psi_a_p5_m7 = _mm_adds_epi16(psi_r_p5_m7, psi_i_p5_m7);
- psi_a_p3_p7 = _mm_adds_epi16(psi_r_p3_p7, psi_i_p3_p7);
- psi_a_p3_p5 = _mm_adds_epi16(psi_r_p3_p5, psi_i_p3_p5);
- psi_a_p3_p3 = _mm_adds_epi16(psi_r_p3_p3, psi_i_p3_p3);
- psi_a_p3_p1 = _mm_adds_epi16(psi_r_p3_p1, psi_i_p3_p1);
- psi_a_p3_m1 = _mm_adds_epi16(psi_r_p3_m1, psi_i_p3_m1);
- psi_a_p3_m3 = _mm_adds_epi16(psi_r_p3_m3, psi_i_p3_m3);
- psi_a_p3_m5 = _mm_adds_epi16(psi_r_p3_m5, psi_i_p3_m5);
- psi_a_p3_m7 = _mm_adds_epi16(psi_r_p3_m7, psi_i_p3_m7);
- psi_a_p1_p7 = _mm_adds_epi16(psi_r_p1_p7, psi_i_p1_p7);
- psi_a_p1_p5 = _mm_adds_epi16(psi_r_p1_p5, psi_i_p1_p5);
- psi_a_p1_p3 = _mm_adds_epi16(psi_r_p1_p3, psi_i_p1_p3);
- psi_a_p1_p1 = _mm_adds_epi16(psi_r_p1_p1, psi_i_p1_p1);
- psi_a_p1_m1 = _mm_adds_epi16(psi_r_p1_m1, psi_i_p1_m1);
- psi_a_p1_m3 = _mm_adds_epi16(psi_r_p1_m3, psi_i_p1_m3);
- psi_a_p1_m5 = _mm_adds_epi16(psi_r_p1_m5, psi_i_p1_m5);
- psi_a_p1_m7 = _mm_adds_epi16(psi_r_p1_m7, psi_i_p1_m7);
- psi_a_m1_p7 = _mm_adds_epi16(psi_r_m1_p7, psi_i_m1_p7);
- psi_a_m1_p5 = _mm_adds_epi16(psi_r_m1_p5, psi_i_m1_p5);
- psi_a_m1_p3 = _mm_adds_epi16(psi_r_m1_p3, psi_i_m1_p3);
- psi_a_m1_p1 = _mm_adds_epi16(psi_r_m1_p1, psi_i_m1_p1);
- psi_a_m1_m1 = _mm_adds_epi16(psi_r_m1_m1, psi_i_m1_m1);
- psi_a_m1_m3 = _mm_adds_epi16(psi_r_m1_m3, psi_i_m1_m3);
- psi_a_m1_m5 = _mm_adds_epi16(psi_r_m1_m5, psi_i_m1_m5);
- psi_a_m1_m7 = _mm_adds_epi16(psi_r_m1_m7, psi_i_m1_m7);
- psi_a_m3_p7 = _mm_adds_epi16(psi_r_m3_p7, psi_i_m3_p7);
- psi_a_m3_p5 = _mm_adds_epi16(psi_r_m3_p5, psi_i_m3_p5);
- psi_a_m3_p3 = _mm_adds_epi16(psi_r_m3_p3, psi_i_m3_p3);
- psi_a_m3_p1 = _mm_adds_epi16(psi_r_m3_p1, psi_i_m3_p1);
- psi_a_m3_m1 = _mm_adds_epi16(psi_r_m3_m1, psi_i_m3_m1);
- psi_a_m3_m3 = _mm_adds_epi16(psi_r_m3_m3, psi_i_m3_m3);
- psi_a_m3_m5 = _mm_adds_epi16(psi_r_m3_m5, psi_i_m3_m5);
- psi_a_m3_m7 = _mm_adds_epi16(psi_r_m3_m7, psi_i_m3_m7);
- psi_a_m5_p7 = _mm_adds_epi16(psi_r_m5_p7, psi_i_m5_p7);
- psi_a_m5_p5 = _mm_adds_epi16(psi_r_m5_p5, psi_i_m5_p5);
- psi_a_m5_p3 = _mm_adds_epi16(psi_r_m5_p3, psi_i_m5_p3);
- psi_a_m5_p1 = _mm_adds_epi16(psi_r_m5_p1, psi_i_m5_p1);
- psi_a_m5_m1 = _mm_adds_epi16(psi_r_m5_m1, psi_i_m5_m1);
- psi_a_m5_m3 = _mm_adds_epi16(psi_r_m5_m3, psi_i_m5_m3);
- psi_a_m5_m5 = _mm_adds_epi16(psi_r_m5_m5, psi_i_m5_m5);
- psi_a_m5_m7 = _mm_adds_epi16(psi_r_m5_m7, psi_i_m5_m7);
- psi_a_m7_p7 = _mm_adds_epi16(psi_r_m7_p7, psi_i_m7_p7);
- psi_a_m7_p5 = _mm_adds_epi16(psi_r_m7_p5, psi_i_m7_p5);
- psi_a_m7_p3 = _mm_adds_epi16(psi_r_m7_p3, psi_i_m7_p3);
- psi_a_m7_p1 = _mm_adds_epi16(psi_r_m7_p1, psi_i_m7_p1);
- psi_a_m7_m1 = _mm_adds_epi16(psi_r_m7_m1, psi_i_m7_m1);
- psi_a_m7_m3 = _mm_adds_epi16(psi_r_m7_m3, psi_i_m7_m3);
- psi_a_m7_m5 = _mm_adds_epi16(psi_r_m7_m5, psi_i_m7_m5);
- psi_a_m7_m7 = _mm_adds_epi16(psi_r_m7_m7, psi_i_m7_m7);
-
- // Computing different multiples of ||h0||^2
- // x=1, y=1
- ch_mag_2_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,ONE_OVER_FOUR_SQRT_42);
- ch_mag_2_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_2_over_42_with_sigma2,1);
- // x=1, y=3
- ch_mag_10_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FIVE_OVER_FOUR_SQRT_42);
- ch_mag_10_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_10_over_42_with_sigma2,1);
- // x=1, x=5
- ch_mag_26_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTEEN_OVER_FOUR_SQRT_42);
- ch_mag_26_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_26_over_42_with_sigma2,1);
- // x=1, y=7
- ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42);
- ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1);
- // x=3, y=3
- ch_mag_18_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,NINE_OVER_FOUR_SQRT_42);
- ch_mag_18_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_18_over_42_with_sigma2,1);
- // x=3, y=5
- ch_mag_34_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,SEVENTEEN_OVER_FOUR_SQRT_42);
- ch_mag_34_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_34_over_42_with_sigma2,1);
- // x=3, y=7
- ch_mag_58_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYNINE_OVER_FOUR_SQRT_42);
- ch_mag_58_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_58_over_42_with_sigma2,2);
- // x=5, y=5
- ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42);
- ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1);
- // x=5, y=7
- ch_mag_74_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTYSEVEN_OVER_FOUR_SQRT_42);
- ch_mag_74_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_74_over_42_with_sigma2,2);
- // x=7, y=7
- ch_mag_98_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FORTYNINE_OVER_FOUR_SQRT_42);
- ch_mag_98_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_98_over_42_with_sigma2,2);
-
- // Computing Metrics
- xmm1 = _mm_adds_epi16(psi_a_p7_p7, y0_p_7_7);
- bit_met_p7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p7_p5, y0_p_7_5);
- bit_met_p7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p7_p3, y0_p_7_3);
- bit_met_p7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p7_p1, y0_p_7_1);
- bit_met_p7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p7_m1, y0_m_7_1);
- bit_met_p7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p7_m3, y0_m_7_3);
- bit_met_p7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p7_m5, y0_m_7_5);
- bit_met_p7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p7_m7, y0_m_7_7);
- bit_met_p7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p5_p7, y0_p_5_7);
- bit_met_p5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p5_p5, y0_p_5_5);
- bit_met_p5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p5_p3, y0_p_5_3);
- bit_met_p5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p5_p1, y0_p_5_1);
- bit_met_p5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p5_m1, y0_m_5_1);
- bit_met_p5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p5_m3, y0_m_5_3);
- bit_met_p5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p5_m5, y0_m_5_5);
- bit_met_p5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p5_m7, y0_m_5_7);
- bit_met_p5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p3_p7, y0_p_3_7);
- bit_met_p3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p3_p5, y0_p_3_5);
- bit_met_p3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p3_p3, y0_p_3_3);
- bit_met_p3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p3_p1, y0_p_3_1);
- bit_met_p3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p3_m1, y0_m_3_1);
- bit_met_p3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p3_m3, y0_m_3_3);
- bit_met_p3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p3_m5, y0_m_3_5);
- bit_met_p3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p3_m7, y0_m_3_7);
- bit_met_p3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p1_p7, y0_p_1_7);
- bit_met_p1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p1_p5, y0_p_1_5);
- bit_met_p1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p1_p3, y0_p_1_3);
- bit_met_p1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p1_p1, y0_p_1_1);
- bit_met_p1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p1_m1, y0_m_1_1);
- bit_met_p1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p1_m3, y0_m_1_3);
- bit_met_p1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p1_m5, y0_m_1_5);
- bit_met_p1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p1_m7, y0_m_1_7);
- bit_met_p1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
-
- xmm1 = _mm_subs_epi16(psi_a_m1_p7, y0_m_1_7);
- bit_met_m1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m1_p5, y0_m_1_5);
- bit_met_m1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m1_p3, y0_m_1_3);
- bit_met_m1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m1_p1, y0_m_1_1);
- bit_met_m1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m1_m1, y0_p_1_1);
- bit_met_m1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m1_m3, y0_p_1_3);
- bit_met_m1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m1_m5, y0_p_1_5);
- bit_met_m1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m1_m7, y0_p_1_7);
- bit_met_m1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m3_p7, y0_m_3_7);
- bit_met_m3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m3_p5, y0_m_3_5);
- bit_met_m3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m3_p3, y0_m_3_3);
- bit_met_m3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m3_p1, y0_m_3_1);
- bit_met_m3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m3_m1, y0_p_3_1);
- bit_met_m3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m3_m3, y0_p_3_3);
- bit_met_m3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m3_m5, y0_p_3_5);
- bit_met_m3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m3_m7, y0_p_3_7);
- bit_met_m3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m5_p7, y0_m_5_7);
- bit_met_m5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m5_p5, y0_m_5_5);
- bit_met_m5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m5_p3, y0_m_5_3);
- bit_met_m5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m5_p1, y0_m_5_1);
- bit_met_m5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m5_m1, y0_p_5_1);
- bit_met_m5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m5_m3, y0_p_5_3);
- bit_met_m5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m5_m5, y0_p_5_5);
- bit_met_m5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m5_m7, y0_p_5_7);
- bit_met_m5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m7_p7, y0_m_7_7);
- bit_met_m7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m7_p5, y0_m_7_5);
- bit_met_m7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m7_p3, y0_m_7_3);
- bit_met_m7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m7_p1, y0_m_7_1);
- bit_met_m7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m7_m1, y0_p_7_1);
- bit_met_m7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m7_m3, y0_p_7_3);
- bit_met_m7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m7_m5, y0_p_7_5);
- bit_met_m7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m7_m7, y0_p_7_7);
- bit_met_m7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
-
- // Detection for 1st bit (LTE mapping)
- // bit = 1
- xmm0 = _mm_max_epi16(bit_met_m7_p7, bit_met_m7_p5);
- xmm1 = _mm_max_epi16(bit_met_m7_p3, bit_met_m7_p1);
- xmm2 = _mm_max_epi16(bit_met_m7_m1, bit_met_m7_m3);
- xmm3 = _mm_max_epi16(bit_met_m7_m5, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m5_p7, bit_met_m5_p5);
- xmm1 = _mm_max_epi16(bit_met_m5_p3, bit_met_m5_p1);
- xmm2 = _mm_max_epi16(bit_met_m5_m1, bit_met_m5_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m5_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m3_p7, bit_met_m3_p5);
- xmm1 = _mm_max_epi16(bit_met_m3_p3, bit_met_m3_p1);
- xmm2 = _mm_max_epi16(bit_met_m3_m1, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m3_m5, bit_met_m3_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m1_p7, bit_met_m1_p5);
- xmm1 = _mm_max_epi16(bit_met_m1_p3, bit_met_m1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m1_m3);
- xmm3 = _mm_max_epi16(bit_met_m1_m5, bit_met_m1_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- // bit = 0
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p7_p5);
- xmm1 = _mm_max_epi16(bit_met_p7_p3, bit_met_p7_p1);
- xmm2 = _mm_max_epi16(bit_met_p7_m1, bit_met_p7_m3);
- xmm3 = _mm_max_epi16(bit_met_p7_m5, bit_met_p7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p5_p7, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p5_p3, bit_met_p5_p1);
- xmm2 = _mm_max_epi16(bit_met_p5_m1, bit_met_p5_m3);
- xmm3 = _mm_max_epi16(bit_met_p5_m5, bit_met_p5_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p3_p7, bit_met_p3_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p3_p1);
- xmm2 = _mm_max_epi16(bit_met_p3_m1, bit_met_p3_m3);
- xmm3 = _mm_max_epi16(bit_met_p3_m5, bit_met_p3_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p1_p7, bit_met_p1_p5);
- xmm1 = _mm_max_epi16(bit_met_p1_p3, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_p1_m1, bit_met_p1_m3);
- xmm3 = _mm_max_epi16(bit_met_p1_m5, bit_met_p1_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y0r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 2nd bit (LTE mapping)
- // bit = 1
- xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1);
- xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1);
- xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5);
- xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7);
- xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7);
- xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7);
- xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- // bit = 0
- xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1);
- xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1);
- xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3);
- xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5);
- xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7);
- xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7);
- xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7);
- xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y1r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 3rd bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5);
- xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1);
- xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3);
- xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5);
- xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1);
- xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1);
- xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3);
- xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5);
- xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1);
- xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3);
- xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5);
- xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5);
- xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5);
- xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3);
- xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1);
- xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y2r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 4th bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7);
- xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7);
- xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7);
- xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5);
- xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5);
- xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7);
- xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7);
- xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7);
- xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1);
- xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1);
- xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1);
- xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1);
- xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3);
- xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y0i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
-
- // Detection for 5th bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5);
- xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1);
- xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3);
- xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5);
- xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5);
- xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3);
- xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5);
- xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1);
- xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3);
- xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5);
- xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1);
- xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5);
- xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1);
- xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1);
- xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3);
- xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y1i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 6th bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7);
- xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7);
- xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7);
- xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1);
- xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1);
- xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1);
- xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1);
- xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7);
- xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7);
- xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7);
- xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5);
- xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3);
- xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5);
- xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y2i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
-
- // map to output stream, difficult to do in SIMD since we have 6 16bit LLRs
- // RE 1
- j = 24*i;
- stream0_out[j + 0] = ((short *)&y0r)[0];
- stream0_out[j + 1] = ((short *)&y1r)[0];
- stream0_out[j + 2] = ((short *)&y2r)[0];
- stream0_out[j + 3] = ((short *)&y0i)[0];
- stream0_out[j + 4] = ((short *)&y1i)[0];
- stream0_out[j + 5] = ((short *)&y2i)[0];
- // RE 2
- stream0_out[j + 6] = ((short *)&y0r)[1];
- stream0_out[j + 7] = ((short *)&y1r)[1];
- stream0_out[j + 8] = ((short *)&y2r)[1];
- stream0_out[j + 9] = ((short *)&y0i)[1];
- stream0_out[j + 10] = ((short *)&y1i)[1];
- stream0_out[j + 11] = ((short *)&y2i)[1];
- // RE 3
- stream0_out[j + 12] = ((short *)&y0r)[2];
- stream0_out[j + 13] = ((short *)&y1r)[2];
- stream0_out[j + 14] = ((short *)&y2r)[2];
- stream0_out[j + 15] = ((short *)&y0i)[2];
- stream0_out[j + 16] = ((short *)&y1i)[2];
- stream0_out[j + 17] = ((short *)&y2i)[2];
- // RE 4
- stream0_out[j + 18] = ((short *)&y0r)[3];
- stream0_out[j + 19] = ((short *)&y1r)[3];
- stream0_out[j + 20] = ((short *)&y2r)[3];
- stream0_out[j + 21] = ((short *)&y0i)[3];
- stream0_out[j + 22] = ((short *)&y1i)[3];
- stream0_out[j + 23] = ((short *)&y2i)[3];
- // RE 5
- stream0_out[j + 24] = ((short *)&y0r)[4];
- stream0_out[j + 25] = ((short *)&y1r)[4];
- stream0_out[j + 26] = ((short *)&y2r)[4];
- stream0_out[j + 27] = ((short *)&y0i)[4];
- stream0_out[j + 28] = ((short *)&y1i)[4];
- stream0_out[j + 29] = ((short *)&y2i)[4];
- // RE 6
- stream0_out[j + 30] = ((short *)&y0r)[5];
- stream0_out[j + 31] = ((short *)&y1r)[5];
- stream0_out[j + 32] = ((short *)&y2r)[5];
- stream0_out[j + 33] = ((short *)&y0i)[5];
- stream0_out[j + 34] = ((short *)&y1i)[5];
- stream0_out[j + 35] = ((short *)&y2i)[5];
- // RE 7
- stream0_out[j + 36] = ((short *)&y0r)[6];
- stream0_out[j + 37] = ((short *)&y1r)[6];
- stream0_out[j + 38] = ((short *)&y2r)[6];
- stream0_out[j + 39] = ((short *)&y0i)[6];
- stream0_out[j + 40] = ((short *)&y1i)[6];
- stream0_out[j + 41] = ((short *)&y2i)[6];
- // RE 8
- stream0_out[j + 42] = ((short *)&y0r)[7];
- stream0_out[j + 43] = ((short *)&y1r)[7];
- stream0_out[j + 44] = ((short *)&y2r)[7];
- stream0_out[j + 45] = ((short *)&y0i)[7];
- stream0_out[j + 46] = ((short *)&y1i)[7];
- stream0_out[j + 47] = ((short *)&y2i)[7];
-#elif defined(__arm__)
-
-#endif
- }
-
-#if defined(__x86_64__) || defined(__i386__)
- _mm_empty();
- _m_empty();
-#endif
-}
-
-
-int dlsch_64qam_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
- int32_t **rxdataF_comp,
- int32_t **rxdataF_comp_i,
- int32_t **dl_ch_mag,
- int32_t **rho_i,
- int16_t *dlsch_llr,
- uint8_t symbol,
- uint8_t first_symbol_flag,
- uint16_t nb_rb,
- uint16_t pbch_pss_sss_adjust,
- int16_t **llr16p)
-{
-
- int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *llr16;
- int len;
- uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
-
- //first symbol has different structure due to more pilots
- if (first_symbol_flag == 1) {
- llr16 = (int16_t*)dlsch_llr;
- } else {
- llr16 = (int16_t*)(*llr16p);
- }
-
- AssertFatal(llr16!=NULL,"dlsch_16qam_64qam_llr:llr is null, symbol %d\n",symbol);
-
- if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
- // if symbol has pilots
- if (frame_parms->nb_antenna_ports_eNB!=1)
- // in 2 antenna ports we have 8 REs per symbol per RB
- len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
- else
- // for 1 antenna port we have 10 REs per symbol per RB
- len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
- } else {
- // symbol has no pilots
- len = (nb_rb*12) - pbch_pss_sss_adjust;
- }
-
- qam64_qpsk((short *)rxF,
- (short *)rxF_i,
- (short *)ch_mag,
- (short *)llr16,
- (short *)rho,
- len);
-
- llr16 += (6*len);
- *llr16p = (short *)llr16;
- return(0);
-}
-
-
-
-void qam64_qam16(short *stream0_in,
- short *stream1_in,
- short *ch_mag,
- short *ch_mag_i,
- short *stream0_out,
- short *rho01,
- int length
- )
-{
-
- /*
- Author: S. Wagner
- Date: 31-07-12
-
- Input:
- stream0_in: MF filter for 1st stream, i.e., y0=h0'*y
- stream1_in: MF filter for 2nd stream, i.e., y1=h1'*y
- ch_mag: 4*h0/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- ch_mag_i: 4*h1/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- rho01: Channel cross correlation, i.e., h1'*h0
-
- Output:
- stream0_out: output LLRs for 1st stream
- */
-
-#if defined(__x86_64__) || defined(__i386__)
-
- __m128i *rho01_128i = (__m128i *)rho01;
- __m128i *stream0_128i_in = (__m128i *)stream0_in;
- __m128i *stream1_128i_in = (__m128i *)stream1_in;
- __m128i *ch_mag_128i = (__m128i *)ch_mag;
- __m128i *ch_mag_128i_i = (__m128i *)ch_mag_i;
-
- __m128i ONE_OVER_SQRT_42 = _mm_set1_epi16(10112); // round(1/sqrt(42)*2^16)
- __m128i THREE_OVER_SQRT_42 = _mm_set1_epi16(30337); // round(3/sqrt(42)*2^16)
- __m128i FIVE_OVER_SQRT_42 = _mm_set1_epi16(25281); // round(5/sqrt(42)*2^15)
- __m128i SEVEN_OVER_SQRT_42 = _mm_set1_epi16(17697); // round(5/sqrt(42)*2^15)
- __m128i FORTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(30969); // round(49/(4*sqrt(42))*2^14), Q2.14
- __m128i THIRTYSEVEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(23385); // round(37/(4*sqrt(42))*2^14), Q2.14
- __m128i TWENTYFIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(31601); // round(25/(4*sqrt(42))*2^15)
- __m128i TWENTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(18329); // round(29/(4*sqrt(42))*2^15), Q2.14
- __m128i SEVENTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(21489); // round(17/(4*sqrt(42))*2^15)
- __m128i NINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(11376); // round(9/(4*sqrt(42))*2^15)
- __m128i THIRTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(16433); // round(13/(4*sqrt(42))*2^15)
- __m128i FIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(6320); // round(5/(4*sqrt(42))*2^15)
- __m128i ONE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(1264); // round(1/(4*sqrt(42))*2^15)
- __m128i ONE_OVER_SQRT_10_Q15 = _mm_set1_epi16(10362); // round(1/sqrt(10)*2^15)
- __m128i THREE_OVER_SQRT_10 = _mm_set1_epi16(31086); // round(3/sqrt(10)*2^15)
- __m128i SQRT_10_OVER_FOUR = _mm_set1_epi16(25905); // round(sqrt(10)/4*2^15)
-
-
- __m128i ch_mag_int;
- __m128i ch_mag_des;
- __m128i ch_mag_98_over_42_with_sigma2;
- __m128i ch_mag_74_over_42_with_sigma2;
- __m128i ch_mag_58_over_42_with_sigma2;
- __m128i ch_mag_50_over_42_with_sigma2;
- __m128i ch_mag_34_over_42_with_sigma2;
- __m128i ch_mag_18_over_42_with_sigma2;
- __m128i ch_mag_26_over_42_with_sigma2;
- __m128i ch_mag_10_over_42_with_sigma2;
- __m128i ch_mag_2_over_42_with_sigma2;
- __m128i y0r_one_over_sqrt_21;
- __m128i y0r_three_over_sqrt_21;
- __m128i y0r_five_over_sqrt_21;
- __m128i y0r_seven_over_sqrt_21;
- __m128i y0i_one_over_sqrt_21;
- __m128i y0i_three_over_sqrt_21;
- __m128i y0i_five_over_sqrt_21;
- __m128i y0i_seven_over_sqrt_21;
-
-#elif defined(__arm__)
-
-#endif
- int i,j;
-
-
-
- for (i=0; i>2; i+=2) {
-
-#if defined(__x86_64__) || defined(__i386__)
- // Get rho
- xmm0 = rho01_128i[i];
- xmm1 = rho01_128i[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho)
- xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho)
- rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho)
- rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho)
-
- // Compute the different rhos
- rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_42);
- rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_42);
- rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_42);
- rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_42);
- rho_rpi_5_5 = _mm_mulhi_epi16(rho_rpi, FIVE_OVER_SQRT_42);
- rho_rmi_5_5 = _mm_mulhi_epi16(rho_rmi, FIVE_OVER_SQRT_42);
- rho_rpi_7_7 = _mm_mulhi_epi16(rho_rpi, SEVEN_OVER_SQRT_42);
- rho_rmi_7_7 = _mm_mulhi_epi16(rho_rmi, SEVEN_OVER_SQRT_42);
-
- rho_rpi_5_5 = _mm_slli_epi16(rho_rpi_5_5, 1);
- rho_rmi_5_5 = _mm_slli_epi16(rho_rmi_5_5, 1);
- rho_rpi_7_7 = _mm_slli_epi16(rho_rpi_7_7, 2);
- rho_rmi_7_7 = _mm_slli_epi16(rho_rmi_7_7, 2);
-
- xmm4 = _mm_mulhi_epi16(xmm2, ONE_OVER_SQRT_42);
- xmm5 = _mm_mulhi_epi16(xmm3, ONE_OVER_SQRT_42);
- xmm6 = _mm_mulhi_epi16(xmm3, THREE_OVER_SQRT_42);
- xmm7 = _mm_mulhi_epi16(xmm3, FIVE_OVER_SQRT_42);
- xmm8 = _mm_mulhi_epi16(xmm3, SEVEN_OVER_SQRT_42);
- xmm7 = _mm_slli_epi16(xmm7, 1);
- xmm8 = _mm_slli_epi16(xmm8, 2);
-
- rho_rpi_1_3 = _mm_adds_epi16(xmm4, xmm6);
- rho_rmi_1_3 = _mm_subs_epi16(xmm4, xmm6);
- rho_rpi_1_5 = _mm_adds_epi16(xmm4, xmm7);
- rho_rmi_1_5 = _mm_subs_epi16(xmm4, xmm7);
- rho_rpi_1_7 = _mm_adds_epi16(xmm4, xmm8);
- rho_rmi_1_7 = _mm_subs_epi16(xmm4, xmm8);
-
- xmm4 = _mm_mulhi_epi16(xmm2, THREE_OVER_SQRT_42);
- rho_rpi_3_1 = _mm_adds_epi16(xmm4, xmm5);
- rho_rmi_3_1 = _mm_subs_epi16(xmm4, xmm5);
- rho_rpi_3_5 = _mm_adds_epi16(xmm4, xmm7);
- rho_rmi_3_5 = _mm_subs_epi16(xmm4, xmm7);
- rho_rpi_3_7 = _mm_adds_epi16(xmm4, xmm8);
- rho_rmi_3_7 = _mm_subs_epi16(xmm4, xmm8);
-
- xmm4 = _mm_mulhi_epi16(xmm2, FIVE_OVER_SQRT_42);
- xmm4 = _mm_slli_epi16(xmm4, 1);
- rho_rpi_5_1 = _mm_adds_epi16(xmm4, xmm5);
- rho_rmi_5_1 = _mm_subs_epi16(xmm4, xmm5);
- rho_rpi_5_3 = _mm_adds_epi16(xmm4, xmm6);
- rho_rmi_5_3 = _mm_subs_epi16(xmm4, xmm6);
- rho_rpi_5_7 = _mm_adds_epi16(xmm4, xmm8);
- rho_rmi_5_7 = _mm_subs_epi16(xmm4, xmm8);
-
- xmm4 = _mm_mulhi_epi16(xmm2, SEVEN_OVER_SQRT_42);
- xmm4 = _mm_slli_epi16(xmm4, 2);
- rho_rpi_7_1 = _mm_adds_epi16(xmm4, xmm5);
- rho_rmi_7_1 = _mm_subs_epi16(xmm4, xmm5);
- rho_rpi_7_3 = _mm_adds_epi16(xmm4, xmm6);
- rho_rmi_7_3 = _mm_subs_epi16(xmm4, xmm6);
- rho_rpi_7_5 = _mm_adds_epi16(xmm4, xmm7);
- rho_rmi_7_5 = _mm_subs_epi16(xmm4, xmm7);
-
- // Rearrange interfering MF output
- xmm0 = stream1_128i_in[i];
- xmm1 = stream1_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)]
- y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)]
-
- // Psi_r calculation from rho_rpi or rho_rmi
- xmm0 = _mm_setzero_si128(); // ZERO for abs_pi16
- xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1r);
- psi_r_p7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1r);
- psi_r_p7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1r);
- psi_r_p7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1r);
- psi_r_p7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1r);
- psi_r_p7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1r);
- psi_r_p7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1r);
- psi_r_p7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1r);
- psi_r_p7_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1r);
- psi_r_p5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1r);
- psi_r_p5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1r);
- psi_r_p5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1r);
- psi_r_p5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1r);
- psi_r_p5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1r);
- psi_r_p5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1r);
- psi_r_p5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1r);
- psi_r_p5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1r);
- psi_r_p3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1r);
- psi_r_p3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1r);
- psi_r_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1r);
- psi_r_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1r);
- psi_r_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1r);
- psi_r_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1r);
- psi_r_p3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1r);
- psi_r_p3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1r);
- psi_r_p1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1r);
- psi_r_p1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1r);
- psi_r_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1r);
- psi_r_p1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1r);
- psi_r_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1r);
- psi_r_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1r);
- psi_r_p1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1r);
- psi_r_p1_m7 = _mm_abs_epi16(xmm2);
-
- xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1r);
- psi_r_m1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1r);
- psi_r_m1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1r);
- psi_r_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1r);
- psi_r_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1r);
- psi_r_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1r);
- psi_r_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1r);
- psi_r_m1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1r);
- psi_r_m1_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1r);
- psi_r_m3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1r);
- psi_r_m3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1r);
- psi_r_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1r);
- psi_r_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1r);
- psi_r_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1r);
- psi_r_m3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1r);
- psi_r_m3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1r);
- psi_r_m3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1r);
- psi_r_m5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1r);
- psi_r_m5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1r);
- psi_r_m5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1r);
- psi_r_m5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1r);
- psi_r_m5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1r);
- psi_r_m5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1r);
- psi_r_m5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1r);
- psi_r_m5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1r);
- psi_r_m7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1r);
- psi_r_m7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1r);
- psi_r_m7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1r);
- psi_r_m7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1r);
- psi_r_m7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1r);
- psi_r_m7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1r);
- psi_r_m7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1r);
- psi_r_m7_m7 = _mm_abs_epi16(xmm2);
-
- // Psi_i calculation from rho_rpi or rho_rmi
- xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1i);
- psi_i_p7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1i);
- psi_i_p7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1i);
- psi_i_p7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1i);
- psi_i_p7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1i);
- psi_i_p7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1i);
- psi_i_p7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1i);
- psi_i_p7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1i);
- psi_i_p7_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1i);
- psi_i_p5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1i);
- psi_i_p5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1i);
- psi_i_p5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1i);
- psi_i_p5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1i);
- psi_i_p5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1i);
- psi_i_p5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1i);
- psi_i_p5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1i);
- psi_i_p5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1i);
- psi_i_p3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1i);
- psi_i_p3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1i);
- psi_i_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1i);
- psi_i_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1i);
- psi_i_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1i);
- psi_i_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1i);
- psi_i_p3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1i);
- psi_i_p3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1i);
- psi_i_p1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1i);
- psi_i_p1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1i);
- psi_i_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1i);
- psi_i_p1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1i);
- psi_i_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1i);
- psi_i_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1i);
- psi_i_p1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1i);
- psi_i_p1_m7 = _mm_abs_epi16(xmm2);
-
- xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1i);
- psi_i_m1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1i);
- psi_i_m1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1i);
- psi_i_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1i);
- psi_i_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1i);
- psi_i_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1i);
- psi_i_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1i);
- psi_i_m1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1i);
- psi_i_m1_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1i);
- psi_i_m3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1i);
- psi_i_m3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1i);
- psi_i_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1i);
- psi_i_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1i);
- psi_i_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1i);
- psi_i_m3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1i);
- psi_i_m3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1i);
- psi_i_m3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1i);
- psi_i_m5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1i);
- psi_i_m5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1i);
- psi_i_m5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1i);
- psi_i_m5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1i);
- psi_i_m5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1i);
- psi_i_m5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1i);
- psi_i_m5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1i);
- psi_i_m5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1i);
- psi_i_m7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1i);
- psi_i_m7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1i);
- psi_i_m7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1i);
- psi_i_m7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1i);
- psi_i_m7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1i);
- psi_i_m7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1i);
- psi_i_m7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1i);
- psi_i_m7_m7 = _mm_abs_epi16(xmm2);
-
-
- // Rearrange desired MF output
- xmm0 = stream0_128i_in[i];
- xmm1 = stream0_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)]
- y0i = _mm_unpackhi_epi64(xmm0,xmm1);
-
- // Rearrange desired channel magnitudes
- xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10))
- xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10))
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3);
-
- // Rearrange interfering channel magnitudes
- xmm2 = ch_mag_128i_i[i];
- xmm3 = ch_mag_128i_i[i+1];
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3);
-
- y0r_one_over_sqrt_21 = _mm_mulhi_epi16(y0r, ONE_OVER_SQRT_42);
- y0r_three_over_sqrt_21 = _mm_mulhi_epi16(y0r, THREE_OVER_SQRT_42);
- y0r_five_over_sqrt_21 = _mm_mulhi_epi16(y0r, FIVE_OVER_SQRT_42);
- y0r_five_over_sqrt_21 = _mm_slli_epi16(y0r_five_over_sqrt_21, 1);
- y0r_seven_over_sqrt_21 = _mm_mulhi_epi16(y0r, SEVEN_OVER_SQRT_42);
- y0r_seven_over_sqrt_21 = _mm_slli_epi16(y0r_seven_over_sqrt_21, 2); // Q2.14
-
- y0i_one_over_sqrt_21 = _mm_mulhi_epi16(y0i, ONE_OVER_SQRT_42);
- y0i_three_over_sqrt_21 = _mm_mulhi_epi16(y0i, THREE_OVER_SQRT_42);
- y0i_five_over_sqrt_21 = _mm_mulhi_epi16(y0i, FIVE_OVER_SQRT_42);
- y0i_five_over_sqrt_21 = _mm_slli_epi16(y0i_five_over_sqrt_21, 1);
- y0i_seven_over_sqrt_21 = _mm_mulhi_epi16(y0i, SEVEN_OVER_SQRT_42);
- y0i_seven_over_sqrt_21 = _mm_slli_epi16(y0i_seven_over_sqrt_21, 2); // Q2.14
-
- y0_p_7_1 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_7_3 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_7_5 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_7_7 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_p_5_1 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_5_3 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_5_5 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_5_7 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_3_5 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_3_7 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_p_1_1 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_1_3 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_1_5 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_1_7 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21);
-
- y0_m_1_1 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_1_3 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_1_5 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_1_7 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_3_5 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_3_7 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_m_5_1 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_5_3 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_5_5 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_5_7 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_m_7_1 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_7_3 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_7_5 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_7_7 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21);
-
- interference_abs_epi16(psi_r_p7_p7, ch_mag_int, a_r_p7_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p7_p5, ch_mag_int, a_r_p7_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p7_p3, ch_mag_int, a_r_p7_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p7_p1, ch_mag_int, a_r_p7_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p7_m1, ch_mag_int, a_r_p7_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p7_m3, ch_mag_int, a_r_p7_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p7_m5, ch_mag_int, a_r_p7_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p7_m7, ch_mag_int, a_r_p7_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p5_p7, ch_mag_int, a_r_p5_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p5_p5, ch_mag_int, a_r_p5_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p5_p3, ch_mag_int, a_r_p5_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p5_p1, ch_mag_int, a_r_p5_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p5_m1, ch_mag_int, a_r_p5_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p5_m3, ch_mag_int, a_r_p5_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p5_m5, ch_mag_int, a_r_p5_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p5_m7, ch_mag_int, a_r_p5_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_p7, ch_mag_int, a_r_p3_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_p5, ch_mag_int, a_r_p3_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_p3, ch_mag_int, a_r_p3_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_p1, ch_mag_int, a_r_p3_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_m1, ch_mag_int, a_r_p3_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_m3, ch_mag_int, a_r_p3_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_m5, ch_mag_int, a_r_p3_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_m7, ch_mag_int, a_r_p3_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_p7, ch_mag_int, a_r_p1_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_p5, ch_mag_int, a_r_p1_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_p3, ch_mag_int, a_r_p1_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_p1, ch_mag_int, a_r_p1_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_m1, ch_mag_int, a_r_p1_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_m3, ch_mag_int, a_r_p1_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_m5, ch_mag_int, a_r_p1_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_m7, ch_mag_int, a_r_p1_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_p7, ch_mag_int, a_r_m1_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_p5, ch_mag_int, a_r_m1_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_p3, ch_mag_int, a_r_m1_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_p1, ch_mag_int, a_r_m1_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_m1, ch_mag_int, a_r_m1_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_m3, ch_mag_int, a_r_m1_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_m5, ch_mag_int, a_r_m1_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_m7, ch_mag_int, a_r_m1_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_p7, ch_mag_int, a_r_m3_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_p5, ch_mag_int, a_r_m3_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_p3, ch_mag_int, a_r_m3_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_p1, ch_mag_int, a_r_m3_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_m1, ch_mag_int, a_r_m3_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_m3, ch_mag_int, a_r_m3_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_m5, ch_mag_int, a_r_m3_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_m7, ch_mag_int, a_r_m3_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m5_p7, ch_mag_int, a_r_m5_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m5_p5, ch_mag_int, a_r_m5_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m5_p3, ch_mag_int, a_r_m5_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m5_p1, ch_mag_int, a_r_m5_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m5_m1, ch_mag_int, a_r_m5_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m5_m3, ch_mag_int, a_r_m5_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m5_m5, ch_mag_int, a_r_m5_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m5_m7, ch_mag_int, a_r_m5_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m7_p7, ch_mag_int, a_r_m7_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m7_p5, ch_mag_int, a_r_m7_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m7_p3, ch_mag_int, a_r_m7_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m7_p1, ch_mag_int, a_r_m7_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m7_m1, ch_mag_int, a_r_m7_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m7_m3, ch_mag_int, a_r_m7_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m7_m5, ch_mag_int, a_r_m7_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m7_m7, ch_mag_int, a_r_m7_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
-
- interference_abs_epi16(psi_i_p7_p7, ch_mag_int, a_i_p7_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p7_p5, ch_mag_int, a_i_p7_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p7_p3, ch_mag_int, a_i_p7_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p7_p1, ch_mag_int, a_i_p7_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p7_m1, ch_mag_int, a_i_p7_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p7_m3, ch_mag_int, a_i_p7_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p7_m5, ch_mag_int, a_i_p7_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p7_m7, ch_mag_int, a_i_p7_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p5_p7, ch_mag_int, a_i_p5_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p5_p5, ch_mag_int, a_i_p5_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p5_p3, ch_mag_int, a_i_p5_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p5_p1, ch_mag_int, a_i_p5_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p5_m1, ch_mag_int, a_i_p5_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p5_m3, ch_mag_int, a_i_p5_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p5_m5, ch_mag_int, a_i_p5_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p5_m7, ch_mag_int, a_i_p5_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_p7, ch_mag_int, a_i_p3_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_p5, ch_mag_int, a_i_p3_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_p3, ch_mag_int, a_i_p3_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_p1, ch_mag_int, a_i_p3_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_m1, ch_mag_int, a_i_p3_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_m3, ch_mag_int, a_i_p3_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_m5, ch_mag_int, a_i_p3_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_m7, ch_mag_int, a_i_p3_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_p7, ch_mag_int, a_i_p1_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_p5, ch_mag_int, a_i_p1_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_p3, ch_mag_int, a_i_p1_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_p1, ch_mag_int, a_i_p1_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_m1, ch_mag_int, a_i_p1_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_m3, ch_mag_int, a_i_p1_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_m5, ch_mag_int, a_i_p1_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_m7, ch_mag_int, a_i_p1_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_p7, ch_mag_int, a_i_m1_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_p5, ch_mag_int, a_i_m1_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_p3, ch_mag_int, a_i_m1_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_p1, ch_mag_int, a_i_m1_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_m1, ch_mag_int, a_i_m1_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_m3, ch_mag_int, a_i_m1_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_m5, ch_mag_int, a_i_m1_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_m7, ch_mag_int, a_i_m1_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_p7, ch_mag_int, a_i_m3_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_p5, ch_mag_int, a_i_m3_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_p3, ch_mag_int, a_i_m3_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_p1, ch_mag_int, a_i_m3_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_m1, ch_mag_int, a_i_m3_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_m3, ch_mag_int, a_i_m3_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_m5, ch_mag_int, a_i_m3_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_m7, ch_mag_int, a_i_m3_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m5_p7, ch_mag_int, a_i_m5_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m5_p5, ch_mag_int, a_i_m5_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m5_p3, ch_mag_int, a_i_m5_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m5_p1, ch_mag_int, a_i_m5_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m5_m1, ch_mag_int, a_i_m5_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m5_m3, ch_mag_int, a_i_m5_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m5_m5, ch_mag_int, a_i_m5_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m5_m7, ch_mag_int, a_i_m5_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m7_p7, ch_mag_int, a_i_m7_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m7_p5, ch_mag_int, a_i_m7_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m7_p3, ch_mag_int, a_i_m7_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m7_p1, ch_mag_int, a_i_m7_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m7_m1, ch_mag_int, a_i_m7_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m7_m3, ch_mag_int, a_i_m7_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m7_m5, ch_mag_int, a_i_m7_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m7_m7, ch_mag_int, a_i_m7_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
-
- // Calculation of a group of two terms in the bit metric involving product of psi and interference
- prodsum_psi_a_epi16(psi_r_p7_p7, a_r_p7_p7, psi_i_p7_p7, a_i_p7_p7, psi_a_p7_p7);
- prodsum_psi_a_epi16(psi_r_p7_p5, a_r_p7_p5, psi_i_p7_p5, a_i_p7_p5, psi_a_p7_p5);
- prodsum_psi_a_epi16(psi_r_p7_p3, a_r_p7_p3, psi_i_p7_p3, a_i_p7_p3, psi_a_p7_p3);
- prodsum_psi_a_epi16(psi_r_p7_p1, a_r_p7_p1, psi_i_p7_p1, a_i_p7_p1, psi_a_p7_p1);
- prodsum_psi_a_epi16(psi_r_p7_m1, a_r_p7_m1, psi_i_p7_m1, a_i_p7_m1, psi_a_p7_m1);
- prodsum_psi_a_epi16(psi_r_p7_m3, a_r_p7_m3, psi_i_p7_m3, a_i_p7_m3, psi_a_p7_m3);
- prodsum_psi_a_epi16(psi_r_p7_m5, a_r_p7_m5, psi_i_p7_m5, a_i_p7_m5, psi_a_p7_m5);
- prodsum_psi_a_epi16(psi_r_p7_m7, a_r_p7_m7, psi_i_p7_m7, a_i_p7_m7, psi_a_p7_m7);
- prodsum_psi_a_epi16(psi_r_p5_p7, a_r_p5_p7, psi_i_p5_p7, a_i_p5_p7, psi_a_p5_p7);
- prodsum_psi_a_epi16(psi_r_p5_p5, a_r_p5_p5, psi_i_p5_p5, a_i_p5_p5, psi_a_p5_p5);
- prodsum_psi_a_epi16(psi_r_p5_p3, a_r_p5_p3, psi_i_p5_p3, a_i_p5_p3, psi_a_p5_p3);
- prodsum_psi_a_epi16(psi_r_p5_p1, a_r_p5_p1, psi_i_p5_p1, a_i_p5_p1, psi_a_p5_p1);
- prodsum_psi_a_epi16(psi_r_p5_m1, a_r_p5_m1, psi_i_p5_m1, a_i_p5_m1, psi_a_p5_m1);
- prodsum_psi_a_epi16(psi_r_p5_m3, a_r_p5_m3, psi_i_p5_m3, a_i_p5_m3, psi_a_p5_m3);
- prodsum_psi_a_epi16(psi_r_p5_m5, a_r_p5_m5, psi_i_p5_m5, a_i_p5_m5, psi_a_p5_m5);
- prodsum_psi_a_epi16(psi_r_p5_m7, a_r_p5_m7, psi_i_p5_m7, a_i_p5_m7, psi_a_p5_m7);
- prodsum_psi_a_epi16(psi_r_p3_p7, a_r_p3_p7, psi_i_p3_p7, a_i_p3_p7, psi_a_p3_p7);
- prodsum_psi_a_epi16(psi_r_p3_p5, a_r_p3_p5, psi_i_p3_p5, a_i_p3_p5, psi_a_p3_p5);
- prodsum_psi_a_epi16(psi_r_p3_p3, a_r_p3_p3, psi_i_p3_p3, a_i_p3_p3, psi_a_p3_p3);
- prodsum_psi_a_epi16(psi_r_p3_p1, a_r_p3_p1, psi_i_p3_p1, a_i_p3_p1, psi_a_p3_p1);
- prodsum_psi_a_epi16(psi_r_p3_m1, a_r_p3_m1, psi_i_p3_m1, a_i_p3_m1, psi_a_p3_m1);
- prodsum_psi_a_epi16(psi_r_p3_m3, a_r_p3_m3, psi_i_p3_m3, a_i_p3_m3, psi_a_p3_m3);
- prodsum_psi_a_epi16(psi_r_p3_m5, a_r_p3_m5, psi_i_p3_m5, a_i_p3_m5, psi_a_p3_m5);
- prodsum_psi_a_epi16(psi_r_p3_m7, a_r_p3_m7, psi_i_p3_m7, a_i_p3_m7, psi_a_p3_m7);
- prodsum_psi_a_epi16(psi_r_p1_p7, a_r_p1_p7, psi_i_p1_p7, a_i_p1_p7, psi_a_p1_p7);
- prodsum_psi_a_epi16(psi_r_p1_p5, a_r_p1_p5, psi_i_p1_p5, a_i_p1_p5, psi_a_p1_p5);
- prodsum_psi_a_epi16(psi_r_p1_p3, a_r_p1_p3, psi_i_p1_p3, a_i_p1_p3, psi_a_p1_p3);
- prodsum_psi_a_epi16(psi_r_p1_p1, a_r_p1_p1, psi_i_p1_p1, a_i_p1_p1, psi_a_p1_p1);
- prodsum_psi_a_epi16(psi_r_p1_m1, a_r_p1_m1, psi_i_p1_m1, a_i_p1_m1, psi_a_p1_m1);
- prodsum_psi_a_epi16(psi_r_p1_m3, a_r_p1_m3, psi_i_p1_m3, a_i_p1_m3, psi_a_p1_m3);
- prodsum_psi_a_epi16(psi_r_p1_m5, a_r_p1_m5, psi_i_p1_m5, a_i_p1_m5, psi_a_p1_m5);
- prodsum_psi_a_epi16(psi_r_p1_m7, a_r_p1_m7, psi_i_p1_m7, a_i_p1_m7, psi_a_p1_m7);
- prodsum_psi_a_epi16(psi_r_m1_p7, a_r_m1_p7, psi_i_m1_p7, a_i_m1_p7, psi_a_m1_p7);
- prodsum_psi_a_epi16(psi_r_m1_p5, a_r_m1_p5, psi_i_m1_p5, a_i_m1_p5, psi_a_m1_p5);
- prodsum_psi_a_epi16(psi_r_m1_p3, a_r_m1_p3, psi_i_m1_p3, a_i_m1_p3, psi_a_m1_p3);
- prodsum_psi_a_epi16(psi_r_m1_p1, a_r_m1_p1, psi_i_m1_p1, a_i_m1_p1, psi_a_m1_p1);
- prodsum_psi_a_epi16(psi_r_m1_m1, a_r_m1_m1, psi_i_m1_m1, a_i_m1_m1, psi_a_m1_m1);
- prodsum_psi_a_epi16(psi_r_m1_m3, a_r_m1_m3, psi_i_m1_m3, a_i_m1_m3, psi_a_m1_m3);
- prodsum_psi_a_epi16(psi_r_m1_m5, a_r_m1_m5, psi_i_m1_m5, a_i_m1_m5, psi_a_m1_m5);
- prodsum_psi_a_epi16(psi_r_m1_m7, a_r_m1_m7, psi_i_m1_m7, a_i_m1_m7, psi_a_m1_m7);
- prodsum_psi_a_epi16(psi_r_m3_p7, a_r_m3_p7, psi_i_m3_p7, a_i_m3_p7, psi_a_m3_p7);
- prodsum_psi_a_epi16(psi_r_m3_p5, a_r_m3_p5, psi_i_m3_p5, a_i_m3_p5, psi_a_m3_p5);
- prodsum_psi_a_epi16(psi_r_m3_p3, a_r_m3_p3, psi_i_m3_p3, a_i_m3_p3, psi_a_m3_p3);
- prodsum_psi_a_epi16(psi_r_m3_p1, a_r_m3_p1, psi_i_m3_p1, a_i_m3_p1, psi_a_m3_p1);
- prodsum_psi_a_epi16(psi_r_m3_m1, a_r_m3_m1, psi_i_m3_m1, a_i_m3_m1, psi_a_m3_m1);
- prodsum_psi_a_epi16(psi_r_m3_m3, a_r_m3_m3, psi_i_m3_m3, a_i_m3_m3, psi_a_m3_m3);
- prodsum_psi_a_epi16(psi_r_m3_m5, a_r_m3_m5, psi_i_m3_m5, a_i_m3_m5, psi_a_m3_m5);
- prodsum_psi_a_epi16(psi_r_m3_m7, a_r_m3_m7, psi_i_m3_m7, a_i_m3_m7, psi_a_m3_m7);
- prodsum_psi_a_epi16(psi_r_m5_p7, a_r_m5_p7, psi_i_m5_p7, a_i_m5_p7, psi_a_m5_p7);
- prodsum_psi_a_epi16(psi_r_m5_p5, a_r_m5_p5, psi_i_m5_p5, a_i_m5_p5, psi_a_m5_p5);
- prodsum_psi_a_epi16(psi_r_m5_p3, a_r_m5_p3, psi_i_m5_p3, a_i_m5_p3, psi_a_m5_p3);
- prodsum_psi_a_epi16(psi_r_m5_p1, a_r_m5_p1, psi_i_m5_p1, a_i_m5_p1, psi_a_m5_p1);
- prodsum_psi_a_epi16(psi_r_m5_m1, a_r_m5_m1, psi_i_m5_m1, a_i_m5_m1, psi_a_m5_m1);
- prodsum_psi_a_epi16(psi_r_m5_m3, a_r_m5_m3, psi_i_m5_m3, a_i_m5_m3, psi_a_m5_m3);
- prodsum_psi_a_epi16(psi_r_m5_m5, a_r_m5_m5, psi_i_m5_m5, a_i_m5_m5, psi_a_m5_m5);
- prodsum_psi_a_epi16(psi_r_m5_m7, a_r_m5_m7, psi_i_m5_m7, a_i_m5_m7, psi_a_m5_m7);
- prodsum_psi_a_epi16(psi_r_m7_p7, a_r_m7_p7, psi_i_m7_p7, a_i_m7_p7, psi_a_m7_p7);
- prodsum_psi_a_epi16(psi_r_m7_p5, a_r_m7_p5, psi_i_m7_p5, a_i_m7_p5, psi_a_m7_p5);
- prodsum_psi_a_epi16(psi_r_m7_p3, a_r_m7_p3, psi_i_m7_p3, a_i_m7_p3, psi_a_m7_p3);
- prodsum_psi_a_epi16(psi_r_m7_p1, a_r_m7_p1, psi_i_m7_p1, a_i_m7_p1, psi_a_m7_p1);
- prodsum_psi_a_epi16(psi_r_m7_m1, a_r_m7_m1, psi_i_m7_m1, a_i_m7_m1, psi_a_m7_m1);
- prodsum_psi_a_epi16(psi_r_m7_m3, a_r_m7_m3, psi_i_m7_m3, a_i_m7_m3, psi_a_m7_m3);
- prodsum_psi_a_epi16(psi_r_m7_m5, a_r_m7_m5, psi_i_m7_m5, a_i_m7_m5, psi_a_m7_m5);
- prodsum_psi_a_epi16(psi_r_m7_m7, a_r_m7_m7, psi_i_m7_m7, a_i_m7_m7, psi_a_m7_m7);
-
- // Calculation of a group of two terms in the bit metric involving squares of interference
- square_a_epi16(a_r_p7_p7, a_i_p7_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_p7);
- square_a_epi16(a_r_p7_p5, a_i_p7_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_p5);
- square_a_epi16(a_r_p7_p3, a_i_p7_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_p3);
- square_a_epi16(a_r_p7_p1, a_i_p7_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_p1);
- square_a_epi16(a_r_p7_m1, a_i_p7_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_m1);
- square_a_epi16(a_r_p7_m3, a_i_p7_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_m3);
- square_a_epi16(a_r_p7_m5, a_i_p7_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_m5);
- square_a_epi16(a_r_p7_m7, a_i_p7_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_m7);
- square_a_epi16(a_r_p5_p7, a_i_p5_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_p7);
- square_a_epi16(a_r_p5_p5, a_i_p5_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_p5);
- square_a_epi16(a_r_p5_p3, a_i_p5_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_p3);
- square_a_epi16(a_r_p5_p1, a_i_p5_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_p1);
- square_a_epi16(a_r_p5_m1, a_i_p5_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_m1);
- square_a_epi16(a_r_p5_m3, a_i_p5_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_m3);
- square_a_epi16(a_r_p5_m5, a_i_p5_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_m5);
- square_a_epi16(a_r_p5_m7, a_i_p5_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_m7);
- square_a_epi16(a_r_p3_p7, a_i_p3_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_p7);
- square_a_epi16(a_r_p3_p5, a_i_p3_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_p5);
- square_a_epi16(a_r_p3_p3, a_i_p3_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_p3);
- square_a_epi16(a_r_p3_p1, a_i_p3_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_p1);
- square_a_epi16(a_r_p3_m1, a_i_p3_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_m1);
- square_a_epi16(a_r_p3_m3, a_i_p3_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_m3);
- square_a_epi16(a_r_p3_m5, a_i_p3_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_m5);
- square_a_epi16(a_r_p3_m7, a_i_p3_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_m7);
- square_a_epi16(a_r_p1_p7, a_i_p1_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_p7);
- square_a_epi16(a_r_p1_p5, a_i_p1_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_p5);
- square_a_epi16(a_r_p1_p3, a_i_p1_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_p3);
- square_a_epi16(a_r_p1_p1, a_i_p1_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_p1);
- square_a_epi16(a_r_p1_m1, a_i_p1_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_m1);
- square_a_epi16(a_r_p1_m3, a_i_p1_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_m3);
- square_a_epi16(a_r_p1_m5, a_i_p1_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_m5);
- square_a_epi16(a_r_p1_m7, a_i_p1_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_m7);
- square_a_epi16(a_r_m1_p7, a_i_m1_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_p7);
- square_a_epi16(a_r_m1_p5, a_i_m1_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_p5);
- square_a_epi16(a_r_m1_p3, a_i_m1_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_p3);
- square_a_epi16(a_r_m1_p1, a_i_m1_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_p1);
- square_a_epi16(a_r_m1_m1, a_i_m1_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_m1);
- square_a_epi16(a_r_m1_m3, a_i_m1_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_m3);
- square_a_epi16(a_r_m1_m5, a_i_m1_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_m5);
- square_a_epi16(a_r_m1_m7, a_i_m1_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_m7);
- square_a_epi16(a_r_m3_p7, a_i_m3_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_p7);
- square_a_epi16(a_r_m3_p5, a_i_m3_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_p5);
- square_a_epi16(a_r_m3_p3, a_i_m3_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_p3);
- square_a_epi16(a_r_m3_p1, a_i_m3_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_p1);
- square_a_epi16(a_r_m3_m1, a_i_m3_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_m1);
- square_a_epi16(a_r_m3_m3, a_i_m3_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_m3);
- square_a_epi16(a_r_m3_m5, a_i_m3_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_m5);
- square_a_epi16(a_r_m3_m7, a_i_m3_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_m7);
- square_a_epi16(a_r_m5_p7, a_i_m5_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_p7);
- square_a_epi16(a_r_m5_p5, a_i_m5_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_p5);
- square_a_epi16(a_r_m5_p3, a_i_m5_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_p3);
- square_a_epi16(a_r_m5_p1, a_i_m5_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_p1);
- square_a_epi16(a_r_m5_m1, a_i_m5_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_m1);
- square_a_epi16(a_r_m5_m3, a_i_m5_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_m3);
- square_a_epi16(a_r_m5_m5, a_i_m5_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_m5);
- square_a_epi16(a_r_m5_m7, a_i_m5_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_m7);
- square_a_epi16(a_r_m7_p7, a_i_m7_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_p7);
- square_a_epi16(a_r_m7_p5, a_i_m7_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_p5);
- square_a_epi16(a_r_m7_p3, a_i_m7_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_p3);
- square_a_epi16(a_r_m7_p1, a_i_m7_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_p1);
- square_a_epi16(a_r_m7_m1, a_i_m7_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_m1);
- square_a_epi16(a_r_m7_m3, a_i_m7_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_m3);
- square_a_epi16(a_r_m7_m5, a_i_m7_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_m5);
- square_a_epi16(a_r_m7_m7, a_i_m7_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_m7);
-
- // Computing different multiples of ||h0||^2
- // x=1, y=1
- ch_mag_2_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,ONE_OVER_FOUR_SQRT_42);
- ch_mag_2_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_2_over_42_with_sigma2,1);
- // x=1, y=3
- ch_mag_10_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FIVE_OVER_FOUR_SQRT_42);
- ch_mag_10_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_10_over_42_with_sigma2,1);
- // x=1, x=5
- ch_mag_26_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTEEN_OVER_FOUR_SQRT_42);
- ch_mag_26_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_26_over_42_with_sigma2,1);
- // x=1, y=7
- ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42);
- ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1);
- // x=3, y=3
- ch_mag_18_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,NINE_OVER_FOUR_SQRT_42);
- ch_mag_18_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_18_over_42_with_sigma2,1);
- // x=3, y=5
- ch_mag_34_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,SEVENTEEN_OVER_FOUR_SQRT_42);
- ch_mag_34_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_34_over_42_with_sigma2,1);
- // x=3, y=7
- ch_mag_58_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYNINE_OVER_FOUR_SQRT_42);
- ch_mag_58_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_58_over_42_with_sigma2,2);
- // x=5, y=5
- ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42);
- ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1);
- // x=5, y=7
- ch_mag_74_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTYSEVEN_OVER_FOUR_SQRT_42);
- ch_mag_74_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_74_over_42_with_sigma2,2);
- // x=7, y=7
- ch_mag_98_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FORTYNINE_OVER_FOUR_SQRT_42);
- ch_mag_98_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_98_over_42_with_sigma2,2);
-
- // Computing Metrics
- xmm0 = _mm_subs_epi16(psi_a_p7_p7, a_sq_p7_p7);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_7_7);
- bit_met_p7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_p5, a_sq_p7_p5);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_7_5);
- bit_met_p7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_p3, a_sq_p7_p3);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_7_3);
- bit_met_p7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_p1, a_sq_p7_p1);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_7_1);
- bit_met_p7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_m1, a_sq_p7_m1);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_7_1);
- bit_met_p7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_m3, a_sq_p7_m3);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_7_3);
- bit_met_p7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_m5, a_sq_p7_m5);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_7_5);
- bit_met_p7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_m7, a_sq_p7_m7);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_7_7);
- bit_met_p7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_p7, a_sq_p5_p7);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_5_7);
- bit_met_p5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_p5, a_sq_p5_p5);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_5_5);
- bit_met_p5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_p3, a_sq_p5_p3);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_5_3);
- bit_met_p5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_p1, a_sq_p5_p1);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_5_1);
- bit_met_p5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_m1, a_sq_p5_m1);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_5_1);
- bit_met_p5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_m3, a_sq_p5_m3);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_5_3);
- bit_met_p5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_m5, a_sq_p5_m5);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_5_5);
- bit_met_p5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_m7, a_sq_p5_m7);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_5_7);
- bit_met_p5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_p7, a_sq_p3_p7);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_3_7);
- bit_met_p3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_p5, a_sq_p3_p5);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_3_5);
- bit_met_p3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_p3, a_sq_p3_p3);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_3_3);
- bit_met_p3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_p1, a_sq_p3_p1);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_3_1);
- bit_met_p3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_m1, a_sq_p3_m1);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_3_1);
- bit_met_p3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_m3, a_sq_p3_m3);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_3_3);
- bit_met_p3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_m5, a_sq_p3_m5);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_3_5);
- bit_met_p3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_m7, a_sq_p3_m7);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_3_7);
- bit_met_p3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_p7, a_sq_p1_p7);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_1_7);
- bit_met_p1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_p5, a_sq_p1_p5);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_1_5);
- bit_met_p1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_p3, a_sq_p1_p3);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_1_3);
- bit_met_p1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_p1, a_sq_p1_p1);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_1_1);
- bit_met_p1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_m1, a_sq_p1_m1);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_1_1);
- bit_met_p1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_m3, a_sq_p1_m3);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_1_3);
- bit_met_p1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_m5, a_sq_p1_m5);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_1_5);
- bit_met_p1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_m7, a_sq_p1_m7);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_1_7);
- bit_met_p1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_p7, a_sq_m1_p7);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_1_7);
- bit_met_m1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_p5, a_sq_m1_p5);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_1_5);
- bit_met_m1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_p3, a_sq_m1_p3);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_1_3);
- bit_met_m1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_p1, a_sq_m1_p1);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_1_1);
- bit_met_m1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_m1, a_sq_m1_m1);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_1_1);
- bit_met_m1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_m3, a_sq_m1_m3);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_1_3);
- bit_met_m1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_m5, a_sq_m1_m5);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_1_5);
- bit_met_m1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_m7, a_sq_m1_m7);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_1_7);
- bit_met_m1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_p7, a_sq_m3_p7);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_3_7);
- bit_met_m3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_p5, a_sq_m3_p5);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_3_5);
- bit_met_m3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_p3, a_sq_m3_p3);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_3_3);
- bit_met_m3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_p1, a_sq_m3_p1);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_3_1);
- bit_met_m3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_m1, a_sq_m3_m1);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_3_1);
- bit_met_m3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_m3, a_sq_m3_m3);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_3_3);
- bit_met_m3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_m5, a_sq_m3_m5);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_3_5);
- bit_met_m3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_m7, a_sq_m3_m7);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_3_7);
- bit_met_m3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_p7, a_sq_m5_p7);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_5_7);
- bit_met_m5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_p5, a_sq_m5_p5);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_5_5);
- bit_met_m5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_p3, a_sq_m5_p3);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_5_3);
- bit_met_m5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_p1, a_sq_m5_p1);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_5_1);
- bit_met_m5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_m1, a_sq_m5_m1);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_5_1);
- bit_met_m5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_m3, a_sq_m5_m3);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_5_3);
- bit_met_m5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_m5, a_sq_m5_m5);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_5_5);
- bit_met_m5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_m7, a_sq_m5_m7);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_5_7);
- bit_met_m5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_p7, a_sq_m7_p7);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_7_7);
- bit_met_m7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_p5, a_sq_m7_p5);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_7_5);
- bit_met_m7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_p3, a_sq_m7_p3);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_7_3);
- bit_met_m7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_p1, a_sq_m7_p1);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_7_1);
- bit_met_m7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_m1, a_sq_m7_m1);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_7_1);
- bit_met_m7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_m3, a_sq_m7_m3);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_7_3);
- bit_met_m7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_m5, a_sq_m7_m5);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_7_5);
- bit_met_m7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_m7, a_sq_m7_m7);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_7_7);
- bit_met_m7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
-
- // Detection for 1st bit (LTE mapping)
- // bit = 1
- xmm0 = _mm_max_epi16(bit_met_m7_p7, bit_met_m7_p5);
- xmm1 = _mm_max_epi16(bit_met_m7_p3, bit_met_m7_p1);
- xmm2 = _mm_max_epi16(bit_met_m7_m1, bit_met_m7_m3);
- xmm3 = _mm_max_epi16(bit_met_m7_m5, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m5_p7, bit_met_m5_p5);
- xmm1 = _mm_max_epi16(bit_met_m5_p3, bit_met_m5_p1);
- xmm2 = _mm_max_epi16(bit_met_m5_m1, bit_met_m5_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m5_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m3_p7, bit_met_m3_p5);
- xmm1 = _mm_max_epi16(bit_met_m3_p3, bit_met_m3_p1);
- xmm2 = _mm_max_epi16(bit_met_m3_m1, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m3_m5, bit_met_m3_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m1_p7, bit_met_m1_p5);
- xmm1 = _mm_max_epi16(bit_met_m1_p3, bit_met_m1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m1_m3);
- xmm3 = _mm_max_epi16(bit_met_m1_m5, bit_met_m1_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- // bit = 0
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p7_p5);
- xmm1 = _mm_max_epi16(bit_met_p7_p3, bit_met_p7_p1);
- xmm2 = _mm_max_epi16(bit_met_p7_m1, bit_met_p7_m3);
- xmm3 = _mm_max_epi16(bit_met_p7_m5, bit_met_p7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p5_p7, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p5_p3, bit_met_p5_p1);
- xmm2 = _mm_max_epi16(bit_met_p5_m1, bit_met_p5_m3);
- xmm3 = _mm_max_epi16(bit_met_p5_m5, bit_met_p5_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p3_p7, bit_met_p3_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p3_p1);
- xmm2 = _mm_max_epi16(bit_met_p3_m1, bit_met_p3_m3);
- xmm3 = _mm_max_epi16(bit_met_p3_m5, bit_met_p3_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p1_p7, bit_met_p1_p5);
- xmm1 = _mm_max_epi16(bit_met_p1_p3, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_p1_m1, bit_met_p1_m3);
- xmm3 = _mm_max_epi16(bit_met_p1_m5, bit_met_p1_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y0r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 2nd bit (LTE mapping)
- // bit = 1
- xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1);
- xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1);
- xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5);
- xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7);
- xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7);
- xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7);
- xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- // bit = 0
- xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1);
- xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1);
- xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3);
- xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5);
- xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7);
- xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7);
- xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7);
- xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y1r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 3rd bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5);
- xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1);
- xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3);
- xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5);
- xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1);
- xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1);
- xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3);
- xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5);
- xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1);
- xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3);
- xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5);
- xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5);
- xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5);
- xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3);
- xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1);
- xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y2r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 4th bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7);
- xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7);
- xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7);
- xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5);
- xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5);
- xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7);
- xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7);
- xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7);
- xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1);
- xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1);
- xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1);
- xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1);
- xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3);
- xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y0i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
-
- // Detection for 5th bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5);
- xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1);
- xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3);
- xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5);
- xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5);
- xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3);
- xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5);
- xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1);
- xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3);
- xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5);
- xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1);
- xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5);
- xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1);
- xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1);
- xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3);
- xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y1i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 6th bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7);
- xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7);
- xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7);
- xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1);
- xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1);
- xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1);
- xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1);
- xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7);
- xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7);
- xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7);
- xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5);
- xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3);
- xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5);
- xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y2i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
-
- // map to output stream, difficult to do in SIMD since we have 6 16bit LLRs
- // RE 1
- j = 24*i;
- stream0_out[j + 0] = ((short *)&y0r)[0];
- stream0_out[j + 1] = ((short *)&y1r)[0];
- stream0_out[j + 2] = ((short *)&y2r)[0];
- stream0_out[j + 3] = ((short *)&y0i)[0];
- stream0_out[j + 4] = ((short *)&y1i)[0];
- stream0_out[j + 5] = ((short *)&y2i)[0];
- // RE 2
- stream0_out[j + 6] = ((short *)&y0r)[1];
- stream0_out[j + 7] = ((short *)&y1r)[1];
- stream0_out[j + 8] = ((short *)&y2r)[1];
- stream0_out[j + 9] = ((short *)&y0i)[1];
- stream0_out[j + 10] = ((short *)&y1i)[1];
- stream0_out[j + 11] = ((short *)&y2i)[1];
- // RE 3
- stream0_out[j + 12] = ((short *)&y0r)[2];
- stream0_out[j + 13] = ((short *)&y1r)[2];
- stream0_out[j + 14] = ((short *)&y2r)[2];
- stream0_out[j + 15] = ((short *)&y0i)[2];
- stream0_out[j + 16] = ((short *)&y1i)[2];
- stream0_out[j + 17] = ((short *)&y2i)[2];
- // RE 4
- stream0_out[j + 18] = ((short *)&y0r)[3];
- stream0_out[j + 19] = ((short *)&y1r)[3];
- stream0_out[j + 20] = ((short *)&y2r)[3];
- stream0_out[j + 21] = ((short *)&y0i)[3];
- stream0_out[j + 22] = ((short *)&y1i)[3];
- stream0_out[j + 23] = ((short *)&y2i)[3];
- // RE 5
- stream0_out[j + 24] = ((short *)&y0r)[4];
- stream0_out[j + 25] = ((short *)&y1r)[4];
- stream0_out[j + 26] = ((short *)&y2r)[4];
- stream0_out[j + 27] = ((short *)&y0i)[4];
- stream0_out[j + 28] = ((short *)&y1i)[4];
- stream0_out[j + 29] = ((short *)&y2i)[4];
- // RE 6
- stream0_out[j + 30] = ((short *)&y0r)[5];
- stream0_out[j + 31] = ((short *)&y1r)[5];
- stream0_out[j + 32] = ((short *)&y2r)[5];
- stream0_out[j + 33] = ((short *)&y0i)[5];
- stream0_out[j + 34] = ((short *)&y1i)[5];
- stream0_out[j + 35] = ((short *)&y2i)[5];
- // RE 7
- stream0_out[j + 36] = ((short *)&y0r)[6];
- stream0_out[j + 37] = ((short *)&y1r)[6];
- stream0_out[j + 38] = ((short *)&y2r)[6];
- stream0_out[j + 39] = ((short *)&y0i)[6];
- stream0_out[j + 40] = ((short *)&y1i)[6];
- stream0_out[j + 41] = ((short *)&y2i)[6];
- // RE 8
- stream0_out[j + 42] = ((short *)&y0r)[7];
- stream0_out[j + 43] = ((short *)&y1r)[7];
- stream0_out[j + 44] = ((short *)&y2r)[7];
- stream0_out[j + 45] = ((short *)&y0i)[7];
- stream0_out[j + 46] = ((short *)&y1i)[7];
- stream0_out[j + 47] = ((short *)&y2i)[7];
-
-#elif defined(__arm__)
-
-#endif
- }
-
-#if defined(__x86_64__) || defined(__i386__)
- _mm_empty();
- _m_empty();
-#endif
-
-}
-
-
-int dlsch_64qam_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
- int32_t **rxdataF_comp,
- int32_t **rxdataF_comp_i,
- int32_t **dl_ch_mag,
- int32_t **dl_ch_mag_i,
- int32_t **rho_i,
- int16_t *dlsch_llr,
- uint8_t symbol,
- uint8_t first_symbol_flag,
- uint16_t nb_rb,
- uint16_t pbch_pss_sss_adjust,
- int16_t **llr16p)
-{
-
- int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *llr16;
- int len;
- uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
-
- //first symbol has different structure due to more pilots
- if (first_symbol_flag == 1) {
- llr16 = (int16_t*)dlsch_llr;
- } else {
- llr16 = (int16_t*)(*llr16p);
- }
-
- AssertFatal(llr16!=NULL,"dlsch_16qam_64qam_llr:llr is null, symbol %d\n",symbol);
-
- if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
- // if symbol has pilots
- if (frame_parms->nb_antenna_ports_eNB!=1)
- // in 2 antenna ports we have 8 REs per symbol per RB
- len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
- else
- // for 1 antenna port we have 10 REs per symbol per RB
- len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
- } else {
- // symbol has no pilots
- len = (nb_rb*12) - pbch_pss_sss_adjust;
- }
-
- qam64_qam16((short *)rxF,
- (short *)rxF_i,
- (short *)ch_mag,
- (short *)ch_mag_i,
- (short *)llr16,
- (short *)rho,
- len);
-
- llr16 += (6*len);
- *llr16p = (short *)llr16;
- return(0);
-}
-
-void qam64_qam64(short *stream0_in,
- short *stream1_in,
- short *ch_mag,
- short *ch_mag_i,
- short *stream0_out,
- short *rho01,
- int length
- )
-{
-
- /*
- Author: S. Wagner
- Date: 31-07-12
-
- Input:
- stream0_in: MF filter for 1st stream, i.e., y0=h0'*y
- stream1_in: MF filter for 2nd stream, i.e., y1=h1'*y
- ch_mag: 4*h0/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- ch_mag_i: 4*h1/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- rho01: Channel cross correlation, i.e., h1'*h0
-
- Output:
- stream0_out: output LLRs for 1st stream
- */
-
-#if defined(__x86_64__) || defined(__i386__)
-
- __m128i *rho01_128i = (__m128i *)rho01;
- __m128i *stream0_128i_in = (__m128i *)stream0_in;
- __m128i *stream1_128i_in = (__m128i *)stream1_in;
- __m128i *ch_mag_128i = (__m128i *)ch_mag;
- __m128i *ch_mag_128i_i = (__m128i *)ch_mag_i;
-
- __m128i ONE_OVER_SQRT_42 = _mm_set1_epi16(10112); // round(1/sqrt(42)*2^16)
- __m128i THREE_OVER_SQRT_42 = _mm_set1_epi16(30337); // round(3/sqrt(42)*2^16)
- __m128i FIVE_OVER_SQRT_42 = _mm_set1_epi16(25281); // round(5/sqrt(42)*2^15)
- __m128i SEVEN_OVER_SQRT_42 = _mm_set1_epi16(17697); // round(7/sqrt(42)*2^14) Q2.14
- __m128i ONE_OVER_SQRT_2 = _mm_set1_epi16(23170); // round(1/sqrt(2)*2^15)
- __m128i ONE_OVER_SQRT_2_42 = _mm_set1_epi16(3575); // round(1/sqrt(2*42)*2^15)
- __m128i THREE_OVER_SQRT_2_42 = _mm_set1_epi16(10726); // round(3/sqrt(2*42)*2^15)
- __m128i FIVE_OVER_SQRT_2_42 = _mm_set1_epi16(17876); // round(5/sqrt(2*42)*2^15)
- __m128i SEVEN_OVER_SQRT_2_42 = _mm_set1_epi16(25027); // round(7/sqrt(2*42)*2^15)
- __m128i FORTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(30969); // round(49/(4*sqrt(42))*2^14), Q2.14
- __m128i THIRTYSEVEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(23385); // round(37/(4*sqrt(42))*2^14), Q2.14
- __m128i TWENTYFIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(31601); // round(25/(4*sqrt(42))*2^15)
- __m128i TWENTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(18329); // round(29/(4*sqrt(42))*2^15), Q2.14
- __m128i SEVENTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(21489); // round(17/(4*sqrt(42))*2^15)
- __m128i NINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(11376); // round(9/(4*sqrt(42))*2^15)
- __m128i THIRTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(16433); // round(13/(4*sqrt(42))*2^15)
- __m128i FIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(6320); // round(5/(4*sqrt(42))*2^15)
- __m128i ONE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(1264); // round(1/(4*sqrt(42))*2^15)
- __m128i SQRT_42_OVER_FOUR = _mm_set1_epi16(13272); // round(sqrt(42)/4*2^13), Q3.12
-
- __m128i ch_mag_des;
- __m128i ch_mag_int;
- __m128i ch_mag_98_over_42_with_sigma2;
- __m128i ch_mag_74_over_42_with_sigma2;
- __m128i ch_mag_58_over_42_with_sigma2;
- __m128i ch_mag_50_over_42_with_sigma2;
- __m128i ch_mag_34_over_42_with_sigma2;
- __m128i ch_mag_18_over_42_with_sigma2;
- __m128i ch_mag_26_over_42_with_sigma2;
- __m128i ch_mag_10_over_42_with_sigma2;
- __m128i ch_mag_2_over_42_with_sigma2;
- __m128i y0r_one_over_sqrt_21;
- __m128i y0r_three_over_sqrt_21;
- __m128i y0r_five_over_sqrt_21;
- __m128i y0r_seven_over_sqrt_21;
- __m128i y0i_one_over_sqrt_21;
- __m128i y0i_three_over_sqrt_21;
- __m128i y0i_five_over_sqrt_21;
- __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;
-#elif defined(__arm__)
-
-#endif
-
- int i,j;
-
-
- for (i=0; i>2; i+=2) {
-
-#if defined(__x86_64__) || defined(__i386__)
-
- // Get rho
- xmm0 = rho01_128i[i];
- xmm1 = rho01_128i[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho)
- xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho)
- rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho)
- rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho)
-
- // Compute the different rhos
- rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_42);
- rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_42);
- rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_42);
- rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_42);
- rho_rpi_5_5 = _mm_mulhi_epi16(rho_rpi, FIVE_OVER_SQRT_42);
- rho_rmi_5_5 = _mm_mulhi_epi16(rho_rmi, FIVE_OVER_SQRT_42);
- rho_rpi_7_7 = _mm_mulhi_epi16(rho_rpi, SEVEN_OVER_SQRT_42);
- rho_rmi_7_7 = _mm_mulhi_epi16(rho_rmi, SEVEN_OVER_SQRT_42);
-
- rho_rpi_5_5 = _mm_slli_epi16(rho_rpi_5_5, 1);
- rho_rmi_5_5 = _mm_slli_epi16(rho_rmi_5_5, 1);
- rho_rpi_7_7 = _mm_slli_epi16(rho_rpi_7_7, 2);
- rho_rmi_7_7 = _mm_slli_epi16(rho_rmi_7_7, 2);
-
- xmm4 = _mm_mulhi_epi16(xmm2, ONE_OVER_SQRT_42);
- xmm5 = _mm_mulhi_epi16(xmm3, ONE_OVER_SQRT_42);
- xmm6 = _mm_mulhi_epi16(xmm3, THREE_OVER_SQRT_42);
- xmm7 = _mm_mulhi_epi16(xmm3, FIVE_OVER_SQRT_42);
- xmm8 = _mm_mulhi_epi16(xmm3, SEVEN_OVER_SQRT_42);
- xmm7 = _mm_slli_epi16(xmm7, 1);
- xmm8 = _mm_slli_epi16(xmm8, 2);
-
- rho_rpi_1_3 = _mm_adds_epi16(xmm4, xmm6);
- rho_rmi_1_3 = _mm_subs_epi16(xmm4, xmm6);
- rho_rpi_1_5 = _mm_adds_epi16(xmm4, xmm7);
- rho_rmi_1_5 = _mm_subs_epi16(xmm4, xmm7);
- rho_rpi_1_7 = _mm_adds_epi16(xmm4, xmm8);
- rho_rmi_1_7 = _mm_subs_epi16(xmm4, xmm8);
-
- xmm4 = _mm_mulhi_epi16(xmm2, THREE_OVER_SQRT_42);
- rho_rpi_3_1 = _mm_adds_epi16(xmm4, xmm5);
- rho_rmi_3_1 = _mm_subs_epi16(xmm4, xmm5);
- rho_rpi_3_5 = _mm_adds_epi16(xmm4, xmm7);
- rho_rmi_3_5 = _mm_subs_epi16(xmm4, xmm7);
- rho_rpi_3_7 = _mm_adds_epi16(xmm4, xmm8);
- rho_rmi_3_7 = _mm_subs_epi16(xmm4, xmm8);
-
- xmm4 = _mm_mulhi_epi16(xmm2, FIVE_OVER_SQRT_42);
- xmm4 = _mm_slli_epi16(xmm4, 1);
- rho_rpi_5_1 = _mm_adds_epi16(xmm4, xmm5);
- rho_rmi_5_1 = _mm_subs_epi16(xmm4, xmm5);
- rho_rpi_5_3 = _mm_adds_epi16(xmm4, xmm6);
- rho_rmi_5_3 = _mm_subs_epi16(xmm4, xmm6);
- rho_rpi_5_7 = _mm_adds_epi16(xmm4, xmm8);
- rho_rmi_5_7 = _mm_subs_epi16(xmm4, xmm8);
-
- xmm4 = _mm_mulhi_epi16(xmm2, SEVEN_OVER_SQRT_42);
- xmm4 = _mm_slli_epi16(xmm4, 2);
- rho_rpi_7_1 = _mm_adds_epi16(xmm4, xmm5);
- rho_rmi_7_1 = _mm_subs_epi16(xmm4, xmm5);
- rho_rpi_7_3 = _mm_adds_epi16(xmm4, xmm6);
- rho_rmi_7_3 = _mm_subs_epi16(xmm4, xmm6);
- rho_rpi_7_5 = _mm_adds_epi16(xmm4, xmm7);
- rho_rmi_7_5 = _mm_subs_epi16(xmm4, xmm7);
-
- // Rearrange interfering MF output
- xmm0 = stream1_128i_in[i];
- xmm1 = stream1_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)]
- y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)]
-
- // Psi_r calculation from rho_rpi or rho_rmi
- xmm0 = _mm_setzero_si128(); // ZERO for abs_pi16
- xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1r);
- psi_r_p7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1r);
- psi_r_p7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1r);
- psi_r_p7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1r);
- psi_r_p7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1r);
- psi_r_p7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1r);
- psi_r_p7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1r);
- psi_r_p7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1r);
- psi_r_p7_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1r);
- psi_r_p5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1r);
- psi_r_p5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1r);
- psi_r_p5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1r);
- psi_r_p5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1r);
- psi_r_p5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1r);
- psi_r_p5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1r);
- psi_r_p5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1r);
- psi_r_p5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1r);
- psi_r_p3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1r);
- psi_r_p3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1r);
- psi_r_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1r);
- psi_r_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1r);
- psi_r_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1r);
- psi_r_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1r);
- psi_r_p3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1r);
- psi_r_p3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1r);
- psi_r_p1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1r);
- psi_r_p1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1r);
- psi_r_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1r);
- psi_r_p1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1r);
- psi_r_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1r);
- psi_r_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1r);
- psi_r_p1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1r);
- psi_r_p1_m7 = _mm_abs_epi16(xmm2);
-
- xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1r);
- psi_r_m1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1r);
- psi_r_m1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1r);
- psi_r_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1r);
- psi_r_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1r);
- psi_r_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1r);
- psi_r_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1r);
- psi_r_m1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1r);
- psi_r_m1_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1r);
- psi_r_m3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1r);
- psi_r_m3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1r);
- psi_r_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1r);
- psi_r_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1r);
- psi_r_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1r);
- psi_r_m3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1r);
- psi_r_m3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1r);
- psi_r_m3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1r);
- psi_r_m5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1r);
- psi_r_m5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1r);
- psi_r_m5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1r);
- psi_r_m5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1r);
- psi_r_m5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1r);
- psi_r_m5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1r);
- psi_r_m5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1r);
- psi_r_m5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1r);
- psi_r_m7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1r);
- psi_r_m7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1r);
- psi_r_m7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1r);
- psi_r_m7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1r);
- psi_r_m7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1r);
- psi_r_m7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1r);
- psi_r_m7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1r);
- psi_r_m7_m7 = _mm_abs_epi16(xmm2);
-
- // Psi_i calculation from rho_rpi or rho_rmi
- xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1i);
- psi_i_p7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1i);
- psi_i_p7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1i);
- psi_i_p7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1i);
- psi_i_p7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1i);
- psi_i_p7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1i);
- psi_i_p7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1i);
- psi_i_p7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1i);
- psi_i_p7_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1i);
- psi_i_p5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1i);
- psi_i_p5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1i);
- psi_i_p5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1i);
- psi_i_p5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1i);
- psi_i_p5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1i);
- psi_i_p5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1i);
- psi_i_p5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1i);
- psi_i_p5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1i);
- psi_i_p3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1i);
- psi_i_p3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1i);
- psi_i_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1i);
- psi_i_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1i);
- psi_i_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1i);
- psi_i_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1i);
- psi_i_p3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1i);
- psi_i_p3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1i);
- psi_i_p1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1i);
- psi_i_p1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1i);
- psi_i_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1i);
- psi_i_p1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1i);
- psi_i_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1i);
- psi_i_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1i);
- psi_i_p1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1i);
- psi_i_p1_m7 = _mm_abs_epi16(xmm2);
-
- xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1i);
- psi_i_m1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1i);
- psi_i_m1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1i);
- psi_i_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1i);
- psi_i_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1i);
- psi_i_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1i);
- psi_i_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1i);
- psi_i_m1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1i);
- psi_i_m1_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1i);
- psi_i_m3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1i);
- psi_i_m3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1i);
- psi_i_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1i);
- psi_i_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1i);
- psi_i_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1i);
- psi_i_m3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1i);
- psi_i_m3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1i);
- psi_i_m3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1i);
- psi_i_m5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1i);
- psi_i_m5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1i);
- psi_i_m5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1i);
- psi_i_m5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1i);
- psi_i_m5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1i);
- psi_i_m5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1i);
- psi_i_m5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1i);
- psi_i_m5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1i);
- psi_i_m7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1i);
- psi_i_m7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1i);
- psi_i_m7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1i);
- psi_i_m7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1i);
- psi_i_m7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1i);
- psi_i_m7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1i);
- psi_i_m7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1i);
- psi_i_m7_m7 = _mm_abs_epi16(xmm2);
-
-
- // Rearrange desired MF output
- xmm0 = stream0_128i_in[i];
- xmm1 = stream0_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)]
- y0i = _mm_unpackhi_epi64(xmm0,xmm1);
-
- // Rearrange desired channel magnitudes
- xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10))
- xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10))
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3);
-
- // Rearrange interfering channel magnitudes
- xmm2 = ch_mag_128i_i[i];
- xmm3 = ch_mag_128i_i[i+1];
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3);
-
- y0r_one_over_sqrt_21 = _mm_mulhi_epi16(y0r, ONE_OVER_SQRT_42);
- y0r_three_over_sqrt_21 = _mm_mulhi_epi16(y0r, THREE_OVER_SQRT_42);
- y0r_five_over_sqrt_21 = _mm_mulhi_epi16(y0r, FIVE_OVER_SQRT_42);
- y0r_five_over_sqrt_21 = _mm_slli_epi16(y0r_five_over_sqrt_21, 1);
- y0r_seven_over_sqrt_21 = _mm_mulhi_epi16(y0r, SEVEN_OVER_SQRT_42);
- y0r_seven_over_sqrt_21 = _mm_slli_epi16(y0r_seven_over_sqrt_21, 2); // Q2.14
-
- y0i_one_over_sqrt_21 = _mm_mulhi_epi16(y0i, ONE_OVER_SQRT_42);
- y0i_three_over_sqrt_21 = _mm_mulhi_epi16(y0i, THREE_OVER_SQRT_42);
- y0i_five_over_sqrt_21 = _mm_mulhi_epi16(y0i, FIVE_OVER_SQRT_42);
- y0i_five_over_sqrt_21 = _mm_slli_epi16(y0i_five_over_sqrt_21, 1);
- y0i_seven_over_sqrt_21 = _mm_mulhi_epi16(y0i, SEVEN_OVER_SQRT_42);
- y0i_seven_over_sqrt_21 = _mm_slli_epi16(y0i_seven_over_sqrt_21, 2); // Q2.14
-
- y0_p_7_1 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_7_3 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_7_5 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_7_7 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_p_5_1 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_5_3 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_5_5 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_5_7 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_3_5 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_3_7 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_p_1_1 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_1_3 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_1_5 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_1_7 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21);
-
- y0_m_1_1 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_1_3 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_1_5 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_1_7 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_3_5 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_3_7 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_m_5_1 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_5_3 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_5_5 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_5_7 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_m_7_1 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_7_3 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_7_5 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_7_7 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21);
-
- // Detection of interference term
- ch_mag_int_with_sigma2 = _mm_srai_epi16(ch_mag_int, 1); // *2
- two_ch_mag_int_with_sigma2 = ch_mag_int; // *4
- three_ch_mag_int_with_sigma2 = _mm_adds_epi16(ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2); // *6
-
- interference_abs_64qam_epi16(psi_r_p7_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p7_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p7_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p7_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p7_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p7_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p7_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p7_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p5_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p5_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p5_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p5_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p5_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p5_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p5_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p5_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m5_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m5_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m5_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m5_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m5_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m5_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m5_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m5_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m7_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m7_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m7_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m7_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m7_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m7_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m7_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m7_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
-
- interference_abs_64qam_epi16(psi_i_p7_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p7_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p7_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p7_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p7_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p7_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p7_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p7_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p5_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p5_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p5_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p5_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p5_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p5_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p5_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p5_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m5_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m5_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m5_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m5_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m5_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m5_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m5_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m5_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m7_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m7_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m7_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m7_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m7_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m7_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m7_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m7_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
-
- // Calculation of a group of two terms in the bit metric involving product of psi and interference
- prodsum_psi_a_epi16(psi_r_p7_p7, a_r_p7_p7, psi_i_p7_p7, a_i_p7_p7, psi_a_p7_p7);
- prodsum_psi_a_epi16(psi_r_p7_p5, a_r_p7_p5, psi_i_p7_p5, a_i_p7_p5, psi_a_p7_p5);
- prodsum_psi_a_epi16(psi_r_p7_p3, a_r_p7_p3, psi_i_p7_p3, a_i_p7_p3, psi_a_p7_p3);
- prodsum_psi_a_epi16(psi_r_p7_p1, a_r_p7_p1, psi_i_p7_p1, a_i_p7_p1, psi_a_p7_p1);
- prodsum_psi_a_epi16(psi_r_p7_m1, a_r_p7_m1, psi_i_p7_m1, a_i_p7_m1, psi_a_p7_m1);
- prodsum_psi_a_epi16(psi_r_p7_m3, a_r_p7_m3, psi_i_p7_m3, a_i_p7_m3, psi_a_p7_m3);
- prodsum_psi_a_epi16(psi_r_p7_m5, a_r_p7_m5, psi_i_p7_m5, a_i_p7_m5, psi_a_p7_m5);
- prodsum_psi_a_epi16(psi_r_p7_m7, a_r_p7_m7, psi_i_p7_m7, a_i_p7_m7, psi_a_p7_m7);
- prodsum_psi_a_epi16(psi_r_p5_p7, a_r_p5_p7, psi_i_p5_p7, a_i_p5_p7, psi_a_p5_p7);
- prodsum_psi_a_epi16(psi_r_p5_p5, a_r_p5_p5, psi_i_p5_p5, a_i_p5_p5, psi_a_p5_p5);
- prodsum_psi_a_epi16(psi_r_p5_p3, a_r_p5_p3, psi_i_p5_p3, a_i_p5_p3, psi_a_p5_p3);
- prodsum_psi_a_epi16(psi_r_p5_p1, a_r_p5_p1, psi_i_p5_p1, a_i_p5_p1, psi_a_p5_p1);
- prodsum_psi_a_epi16(psi_r_p5_m1, a_r_p5_m1, psi_i_p5_m1, a_i_p5_m1, psi_a_p5_m1);
- prodsum_psi_a_epi16(psi_r_p5_m3, a_r_p5_m3, psi_i_p5_m3, a_i_p5_m3, psi_a_p5_m3);
- prodsum_psi_a_epi16(psi_r_p5_m5, a_r_p5_m5, psi_i_p5_m5, a_i_p5_m5, psi_a_p5_m5);
- prodsum_psi_a_epi16(psi_r_p5_m7, a_r_p5_m7, psi_i_p5_m7, a_i_p5_m7, psi_a_p5_m7);
- prodsum_psi_a_epi16(psi_r_p3_p7, a_r_p3_p7, psi_i_p3_p7, a_i_p3_p7, psi_a_p3_p7);
- prodsum_psi_a_epi16(psi_r_p3_p5, a_r_p3_p5, psi_i_p3_p5, a_i_p3_p5, psi_a_p3_p5);
- prodsum_psi_a_epi16(psi_r_p3_p3, a_r_p3_p3, psi_i_p3_p3, a_i_p3_p3, psi_a_p3_p3);
- prodsum_psi_a_epi16(psi_r_p3_p1, a_r_p3_p1, psi_i_p3_p1, a_i_p3_p1, psi_a_p3_p1);
- prodsum_psi_a_epi16(psi_r_p3_m1, a_r_p3_m1, psi_i_p3_m1, a_i_p3_m1, psi_a_p3_m1);
- prodsum_psi_a_epi16(psi_r_p3_m3, a_r_p3_m3, psi_i_p3_m3, a_i_p3_m3, psi_a_p3_m3);
- prodsum_psi_a_epi16(psi_r_p3_m5, a_r_p3_m5, psi_i_p3_m5, a_i_p3_m5, psi_a_p3_m5);
- prodsum_psi_a_epi16(psi_r_p3_m7, a_r_p3_m7, psi_i_p3_m7, a_i_p3_m7, psi_a_p3_m7);
- prodsum_psi_a_epi16(psi_r_p1_p7, a_r_p1_p7, psi_i_p1_p7, a_i_p1_p7, psi_a_p1_p7);
- prodsum_psi_a_epi16(psi_r_p1_p5, a_r_p1_p5, psi_i_p1_p5, a_i_p1_p5, psi_a_p1_p5);
- prodsum_psi_a_epi16(psi_r_p1_p3, a_r_p1_p3, psi_i_p1_p3, a_i_p1_p3, psi_a_p1_p3);
- prodsum_psi_a_epi16(psi_r_p1_p1, a_r_p1_p1, psi_i_p1_p1, a_i_p1_p1, psi_a_p1_p1);
- prodsum_psi_a_epi16(psi_r_p1_m1, a_r_p1_m1, psi_i_p1_m1, a_i_p1_m1, psi_a_p1_m1);
- prodsum_psi_a_epi16(psi_r_p1_m3, a_r_p1_m3, psi_i_p1_m3, a_i_p1_m3, psi_a_p1_m3);
- prodsum_psi_a_epi16(psi_r_p1_m5, a_r_p1_m5, psi_i_p1_m5, a_i_p1_m5, psi_a_p1_m5);
- prodsum_psi_a_epi16(psi_r_p1_m7, a_r_p1_m7, psi_i_p1_m7, a_i_p1_m7, psi_a_p1_m7);
- prodsum_psi_a_epi16(psi_r_m1_p7, a_r_m1_p7, psi_i_m1_p7, a_i_m1_p7, psi_a_m1_p7);
- prodsum_psi_a_epi16(psi_r_m1_p5, a_r_m1_p5, psi_i_m1_p5, a_i_m1_p5, psi_a_m1_p5);
- prodsum_psi_a_epi16(psi_r_m1_p3, a_r_m1_p3, psi_i_m1_p3, a_i_m1_p3, psi_a_m1_p3);
- prodsum_psi_a_epi16(psi_r_m1_p1, a_r_m1_p1, psi_i_m1_p1, a_i_m1_p1, psi_a_m1_p1);
- prodsum_psi_a_epi16(psi_r_m1_m1, a_r_m1_m1, psi_i_m1_m1, a_i_m1_m1, psi_a_m1_m1);
- prodsum_psi_a_epi16(psi_r_m1_m3, a_r_m1_m3, psi_i_m1_m3, a_i_m1_m3, psi_a_m1_m3);
- prodsum_psi_a_epi16(psi_r_m1_m5, a_r_m1_m5, psi_i_m1_m5, a_i_m1_m5, psi_a_m1_m5);
- prodsum_psi_a_epi16(psi_r_m1_m7, a_r_m1_m7, psi_i_m1_m7, a_i_m1_m7, psi_a_m1_m7);
- prodsum_psi_a_epi16(psi_r_m3_p7, a_r_m3_p7, psi_i_m3_p7, a_i_m3_p7, psi_a_m3_p7);
- prodsum_psi_a_epi16(psi_r_m3_p5, a_r_m3_p5, psi_i_m3_p5, a_i_m3_p5, psi_a_m3_p5);
- prodsum_psi_a_epi16(psi_r_m3_p3, a_r_m3_p3, psi_i_m3_p3, a_i_m3_p3, psi_a_m3_p3);
- prodsum_psi_a_epi16(psi_r_m3_p1, a_r_m3_p1, psi_i_m3_p1, a_i_m3_p1, psi_a_m3_p1);
- prodsum_psi_a_epi16(psi_r_m3_m1, a_r_m3_m1, psi_i_m3_m1, a_i_m3_m1, psi_a_m3_m1);
- prodsum_psi_a_epi16(psi_r_m3_m3, a_r_m3_m3, psi_i_m3_m3, a_i_m3_m3, psi_a_m3_m3);
- prodsum_psi_a_epi16(psi_r_m3_m5, a_r_m3_m5, psi_i_m3_m5, a_i_m3_m5, psi_a_m3_m5);
- prodsum_psi_a_epi16(psi_r_m3_m7, a_r_m3_m7, psi_i_m3_m7, a_i_m3_m7, psi_a_m3_m7);
- prodsum_psi_a_epi16(psi_r_m5_p7, a_r_m5_p7, psi_i_m5_p7, a_i_m5_p7, psi_a_m5_p7);
- prodsum_psi_a_epi16(psi_r_m5_p5, a_r_m5_p5, psi_i_m5_p5, a_i_m5_p5, psi_a_m5_p5);
- prodsum_psi_a_epi16(psi_r_m5_p3, a_r_m5_p3, psi_i_m5_p3, a_i_m5_p3, psi_a_m5_p3);
- prodsum_psi_a_epi16(psi_r_m5_p1, a_r_m5_p1, psi_i_m5_p1, a_i_m5_p1, psi_a_m5_p1);
- prodsum_psi_a_epi16(psi_r_m5_m1, a_r_m5_m1, psi_i_m5_m1, a_i_m5_m1, psi_a_m5_m1);
- prodsum_psi_a_epi16(psi_r_m5_m3, a_r_m5_m3, psi_i_m5_m3, a_i_m5_m3, psi_a_m5_m3);
- prodsum_psi_a_epi16(psi_r_m5_m5, a_r_m5_m5, psi_i_m5_m5, a_i_m5_m5, psi_a_m5_m5);
- prodsum_psi_a_epi16(psi_r_m5_m7, a_r_m5_m7, psi_i_m5_m7, a_i_m5_m7, psi_a_m5_m7);
- prodsum_psi_a_epi16(psi_r_m7_p7, a_r_m7_p7, psi_i_m7_p7, a_i_m7_p7, psi_a_m7_p7);
- prodsum_psi_a_epi16(psi_r_m7_p5, a_r_m7_p5, psi_i_m7_p5, a_i_m7_p5, psi_a_m7_p5);
- prodsum_psi_a_epi16(psi_r_m7_p3, a_r_m7_p3, psi_i_m7_p3, a_i_m7_p3, psi_a_m7_p3);
- prodsum_psi_a_epi16(psi_r_m7_p1, a_r_m7_p1, psi_i_m7_p1, a_i_m7_p1, psi_a_m7_p1);
- prodsum_psi_a_epi16(psi_r_m7_m1, a_r_m7_m1, psi_i_m7_m1, a_i_m7_m1, psi_a_m7_m1);
- prodsum_psi_a_epi16(psi_r_m7_m3, a_r_m7_m3, psi_i_m7_m3, a_i_m7_m3, psi_a_m7_m3);
- prodsum_psi_a_epi16(psi_r_m7_m5, a_r_m7_m5, psi_i_m7_m5, a_i_m7_m5, psi_a_m7_m5);
- prodsum_psi_a_epi16(psi_r_m7_m7, a_r_m7_m7, psi_i_m7_m7, a_i_m7_m7, psi_a_m7_m7);
-
- // Multiply by sqrt(2)
- psi_a_p7_p7 = _mm_mulhi_epi16(psi_a_p7_p7, ONE_OVER_SQRT_2);
- psi_a_p7_p7 = _mm_slli_epi16(psi_a_p7_p7, 2);
- psi_a_p7_p5 = _mm_mulhi_epi16(psi_a_p7_p5, ONE_OVER_SQRT_2);
- psi_a_p7_p5 = _mm_slli_epi16(psi_a_p7_p5, 2);
- psi_a_p7_p3 = _mm_mulhi_epi16(psi_a_p7_p3, ONE_OVER_SQRT_2);
- psi_a_p7_p3 = _mm_slli_epi16(psi_a_p7_p3, 2);
- psi_a_p7_p1 = _mm_mulhi_epi16(psi_a_p7_p1, ONE_OVER_SQRT_2);
- psi_a_p7_p1 = _mm_slli_epi16(psi_a_p7_p1, 2);
- psi_a_p7_m1 = _mm_mulhi_epi16(psi_a_p7_m1, ONE_OVER_SQRT_2);
- psi_a_p7_m1 = _mm_slli_epi16(psi_a_p7_m1, 2);
- psi_a_p7_m3 = _mm_mulhi_epi16(psi_a_p7_m3, ONE_OVER_SQRT_2);
- psi_a_p7_m3 = _mm_slli_epi16(psi_a_p7_m3, 2);
- psi_a_p7_m5 = _mm_mulhi_epi16(psi_a_p7_m5, ONE_OVER_SQRT_2);
- psi_a_p7_m5 = _mm_slli_epi16(psi_a_p7_m5, 2);
- psi_a_p7_m7 = _mm_mulhi_epi16(psi_a_p7_m7, ONE_OVER_SQRT_2);
- psi_a_p7_m7 = _mm_slli_epi16(psi_a_p7_m7, 2);
- psi_a_p5_p7 = _mm_mulhi_epi16(psi_a_p5_p7, ONE_OVER_SQRT_2);
- psi_a_p5_p7 = _mm_slli_epi16(psi_a_p5_p7, 2);
- psi_a_p5_p5 = _mm_mulhi_epi16(psi_a_p5_p5, ONE_OVER_SQRT_2);
- psi_a_p5_p5 = _mm_slli_epi16(psi_a_p5_p5, 2);
- psi_a_p5_p3 = _mm_mulhi_epi16(psi_a_p5_p3, ONE_OVER_SQRT_2);
- psi_a_p5_p3 = _mm_slli_epi16(psi_a_p5_p3, 2);
- psi_a_p5_p1 = _mm_mulhi_epi16(psi_a_p5_p1, ONE_OVER_SQRT_2);
- psi_a_p5_p1 = _mm_slli_epi16(psi_a_p5_p1, 2);
- psi_a_p5_m1 = _mm_mulhi_epi16(psi_a_p5_m1, ONE_OVER_SQRT_2);
- psi_a_p5_m1 = _mm_slli_epi16(psi_a_p5_m1, 2);
- psi_a_p5_m3 = _mm_mulhi_epi16(psi_a_p5_m3, ONE_OVER_SQRT_2);
- psi_a_p5_m3 = _mm_slli_epi16(psi_a_p5_m3, 2);
- psi_a_p5_m5 = _mm_mulhi_epi16(psi_a_p5_m5, ONE_OVER_SQRT_2);
- psi_a_p5_m5 = _mm_slli_epi16(psi_a_p5_m5, 2);
- psi_a_p5_m7 = _mm_mulhi_epi16(psi_a_p5_m7, ONE_OVER_SQRT_2);
- psi_a_p5_m7 = _mm_slli_epi16(psi_a_p5_m7, 2);
- psi_a_p3_p7 = _mm_mulhi_epi16(psi_a_p3_p7, ONE_OVER_SQRT_2);
- psi_a_p3_p7 = _mm_slli_epi16(psi_a_p3_p7, 2);
- psi_a_p3_p5 = _mm_mulhi_epi16(psi_a_p3_p5, ONE_OVER_SQRT_2);
- psi_a_p3_p5 = _mm_slli_epi16(psi_a_p3_p5, 2);
- psi_a_p3_p3 = _mm_mulhi_epi16(psi_a_p3_p3, ONE_OVER_SQRT_2);
- psi_a_p3_p3 = _mm_slli_epi16(psi_a_p3_p3, 2);
- psi_a_p3_p1 = _mm_mulhi_epi16(psi_a_p3_p1, ONE_OVER_SQRT_2);
- psi_a_p3_p1 = _mm_slli_epi16(psi_a_p3_p1, 2);
- psi_a_p3_m1 = _mm_mulhi_epi16(psi_a_p3_m1, ONE_OVER_SQRT_2);
- psi_a_p3_m1 = _mm_slli_epi16(psi_a_p3_m1, 2);
- psi_a_p3_m3 = _mm_mulhi_epi16(psi_a_p3_m3, ONE_OVER_SQRT_2);
- psi_a_p3_m3 = _mm_slli_epi16(psi_a_p3_m3, 2);
- psi_a_p3_m5 = _mm_mulhi_epi16(psi_a_p3_m5, ONE_OVER_SQRT_2);
- psi_a_p3_m5 = _mm_slli_epi16(psi_a_p3_m5, 2);
- psi_a_p3_m7 = _mm_mulhi_epi16(psi_a_p3_m7, ONE_OVER_SQRT_2);
- psi_a_p3_m7 = _mm_slli_epi16(psi_a_p3_m7, 2);
- psi_a_p1_p7 = _mm_mulhi_epi16(psi_a_p1_p7, ONE_OVER_SQRT_2);
- psi_a_p1_p7 = _mm_slli_epi16(psi_a_p1_p7, 2);
- psi_a_p1_p5 = _mm_mulhi_epi16(psi_a_p1_p5, ONE_OVER_SQRT_2);
- psi_a_p1_p5 = _mm_slli_epi16(psi_a_p1_p5, 2);
- psi_a_p1_p3 = _mm_mulhi_epi16(psi_a_p1_p3, ONE_OVER_SQRT_2);
- psi_a_p1_p3 = _mm_slli_epi16(psi_a_p1_p3, 2);
- psi_a_p1_p1 = _mm_mulhi_epi16(psi_a_p1_p1, ONE_OVER_SQRT_2);
- psi_a_p1_p1 = _mm_slli_epi16(psi_a_p1_p1, 2);
- psi_a_p1_m1 = _mm_mulhi_epi16(psi_a_p1_m1, ONE_OVER_SQRT_2);
- psi_a_p1_m1 = _mm_slli_epi16(psi_a_p1_m1, 2);
- psi_a_p1_m3 = _mm_mulhi_epi16(psi_a_p1_m3, ONE_OVER_SQRT_2);
- psi_a_p1_m3 = _mm_slli_epi16(psi_a_p1_m3, 2);
- psi_a_p1_m5 = _mm_mulhi_epi16(psi_a_p1_m5, ONE_OVER_SQRT_2);
- psi_a_p1_m5 = _mm_slli_epi16(psi_a_p1_m5, 2);
- psi_a_p1_m7 = _mm_mulhi_epi16(psi_a_p1_m7, ONE_OVER_SQRT_2);
- psi_a_p1_m7 = _mm_slli_epi16(psi_a_p1_m7, 2);
- psi_a_m1_p7 = _mm_mulhi_epi16(psi_a_m1_p7, ONE_OVER_SQRT_2);
- psi_a_m1_p7 = _mm_slli_epi16(psi_a_m1_p7, 2);
- psi_a_m1_p5 = _mm_mulhi_epi16(psi_a_m1_p5, ONE_OVER_SQRT_2);
- psi_a_m1_p5 = _mm_slli_epi16(psi_a_m1_p5, 2);
- psi_a_m1_p3 = _mm_mulhi_epi16(psi_a_m1_p3, ONE_OVER_SQRT_2);
- psi_a_m1_p3 = _mm_slli_epi16(psi_a_m1_p3, 2);
- psi_a_m1_p1 = _mm_mulhi_epi16(psi_a_m1_p1, ONE_OVER_SQRT_2);
- psi_a_m1_p1 = _mm_slli_epi16(psi_a_m1_p1, 2);
- psi_a_m1_m1 = _mm_mulhi_epi16(psi_a_m1_m1, ONE_OVER_SQRT_2);
- psi_a_m1_m1 = _mm_slli_epi16(psi_a_m1_m1, 2);
- psi_a_m1_m3 = _mm_mulhi_epi16(psi_a_m1_m3, ONE_OVER_SQRT_2);
- psi_a_m1_m3 = _mm_slli_epi16(psi_a_m1_m3, 2);
- psi_a_m1_m5 = _mm_mulhi_epi16(psi_a_m1_m5, ONE_OVER_SQRT_2);
- psi_a_m1_m5 = _mm_slli_epi16(psi_a_m1_m5, 2);
- psi_a_m1_m7 = _mm_mulhi_epi16(psi_a_m1_m7, ONE_OVER_SQRT_2);
- psi_a_m1_m7 = _mm_slli_epi16(psi_a_m1_m7, 2);
- psi_a_m3_p7 = _mm_mulhi_epi16(psi_a_m3_p7, ONE_OVER_SQRT_2);
- psi_a_m3_p7 = _mm_slli_epi16(psi_a_m3_p7, 2);
- psi_a_m3_p5 = _mm_mulhi_epi16(psi_a_m3_p5, ONE_OVER_SQRT_2);
- psi_a_m3_p5 = _mm_slli_epi16(psi_a_m3_p5, 2);
- psi_a_m3_p3 = _mm_mulhi_epi16(psi_a_m3_p3, ONE_OVER_SQRT_2);
- psi_a_m3_p3 = _mm_slli_epi16(psi_a_m3_p3, 2);
- psi_a_m3_p1 = _mm_mulhi_epi16(psi_a_m3_p1, ONE_OVER_SQRT_2);
- psi_a_m3_p1 = _mm_slli_epi16(psi_a_m3_p1, 2);
- psi_a_m3_m1 = _mm_mulhi_epi16(psi_a_m3_m1, ONE_OVER_SQRT_2);
- psi_a_m3_m1 = _mm_slli_epi16(psi_a_m3_m1, 2);
- psi_a_m3_m3 = _mm_mulhi_epi16(psi_a_m3_m3, ONE_OVER_SQRT_2);
- psi_a_m3_m3 = _mm_slli_epi16(psi_a_m3_m3, 2);
- psi_a_m3_m5 = _mm_mulhi_epi16(psi_a_m3_m5, ONE_OVER_SQRT_2);
- psi_a_m3_m5 = _mm_slli_epi16(psi_a_m3_m5, 2);
- psi_a_m3_m7 = _mm_mulhi_epi16(psi_a_m3_m7, ONE_OVER_SQRT_2);
- psi_a_m3_m7 = _mm_slli_epi16(psi_a_m3_m7, 2);
- psi_a_m5_p7 = _mm_mulhi_epi16(psi_a_m5_p7, ONE_OVER_SQRT_2);
- psi_a_m5_p7 = _mm_slli_epi16(psi_a_m5_p7, 2);
- psi_a_m5_p5 = _mm_mulhi_epi16(psi_a_m5_p5, ONE_OVER_SQRT_2);
- psi_a_m5_p5 = _mm_slli_epi16(psi_a_m5_p5, 2);
- psi_a_m5_p3 = _mm_mulhi_epi16(psi_a_m5_p3, ONE_OVER_SQRT_2);
- psi_a_m5_p3 = _mm_slli_epi16(psi_a_m5_p3, 2);
- psi_a_m5_p1 = _mm_mulhi_epi16(psi_a_m5_p1, ONE_OVER_SQRT_2);
- psi_a_m5_p1 = _mm_slli_epi16(psi_a_m5_p1, 2);
- psi_a_m5_m1 = _mm_mulhi_epi16(psi_a_m5_m1, ONE_OVER_SQRT_2);
- psi_a_m5_m1 = _mm_slli_epi16(psi_a_m5_m1, 2);
- psi_a_m5_m3 = _mm_mulhi_epi16(psi_a_m5_m3, ONE_OVER_SQRT_2);
- psi_a_m5_m3 = _mm_slli_epi16(psi_a_m5_m3, 2);
- psi_a_m5_m5 = _mm_mulhi_epi16(psi_a_m5_m5, ONE_OVER_SQRT_2);
- psi_a_m5_m5 = _mm_slli_epi16(psi_a_m5_m5, 2);
- psi_a_m5_m7 = _mm_mulhi_epi16(psi_a_m5_m7, ONE_OVER_SQRT_2);
- psi_a_m5_m7 = _mm_slli_epi16(psi_a_m5_m7, 2);
- psi_a_m7_p7 = _mm_mulhi_epi16(psi_a_m7_p7, ONE_OVER_SQRT_2);
- psi_a_m7_p7 = _mm_slli_epi16(psi_a_m7_p7, 2);
- psi_a_m7_p5 = _mm_mulhi_epi16(psi_a_m7_p5, ONE_OVER_SQRT_2);
- psi_a_m7_p5 = _mm_slli_epi16(psi_a_m7_p5, 2);
- psi_a_m7_p3 = _mm_mulhi_epi16(psi_a_m7_p3, ONE_OVER_SQRT_2);
- psi_a_m7_p3 = _mm_slli_epi16(psi_a_m7_p3, 2);
- psi_a_m7_p1 = _mm_mulhi_epi16(psi_a_m7_p1, ONE_OVER_SQRT_2);
- psi_a_m7_p1 = _mm_slli_epi16(psi_a_m7_p1, 2);
- psi_a_m7_m1 = _mm_mulhi_epi16(psi_a_m7_m1, ONE_OVER_SQRT_2);
- psi_a_m7_m1 = _mm_slli_epi16(psi_a_m7_m1, 2);
- psi_a_m7_m3 = _mm_mulhi_epi16(psi_a_m7_m3, ONE_OVER_SQRT_2);
- psi_a_m7_m3 = _mm_slli_epi16(psi_a_m7_m3, 2);
- psi_a_m7_m5 = _mm_mulhi_epi16(psi_a_m7_m5, ONE_OVER_SQRT_2);
- psi_a_m7_m5 = _mm_slli_epi16(psi_a_m7_m5, 2);
- psi_a_m7_m7 = _mm_mulhi_epi16(psi_a_m7_m7, ONE_OVER_SQRT_2);
- psi_a_m7_m7 = _mm_slli_epi16(psi_a_m7_m7, 2);
-
- // Calculation of a group of two terms in the bit metric involving squares of interference
- square_a_64qam_epi16(a_r_p7_p7, a_i_p7_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_p7);
- square_a_64qam_epi16(a_r_p7_p5, a_i_p7_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_p5);
- square_a_64qam_epi16(a_r_p7_p3, a_i_p7_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_p3);
- square_a_64qam_epi16(a_r_p7_p1, a_i_p7_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_p1);
- square_a_64qam_epi16(a_r_p7_m1, a_i_p7_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_m1);
- square_a_64qam_epi16(a_r_p7_m3, a_i_p7_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_m3);
- square_a_64qam_epi16(a_r_p7_m5, a_i_p7_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_m5);
- square_a_64qam_epi16(a_r_p7_m7, a_i_p7_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_m7);
- square_a_64qam_epi16(a_r_p5_p7, a_i_p5_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_p7);
- square_a_64qam_epi16(a_r_p5_p5, a_i_p5_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_p5);
- square_a_64qam_epi16(a_r_p5_p3, a_i_p5_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_p3);
- square_a_64qam_epi16(a_r_p5_p1, a_i_p5_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_p1);
- square_a_64qam_epi16(a_r_p5_m1, a_i_p5_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_m1);
- square_a_64qam_epi16(a_r_p5_m3, a_i_p5_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_m3);
- square_a_64qam_epi16(a_r_p5_m5, a_i_p5_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_m5);
- square_a_64qam_epi16(a_r_p5_m7, a_i_p5_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_m7);
- square_a_64qam_epi16(a_r_p3_p7, a_i_p3_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_p7);
- square_a_64qam_epi16(a_r_p3_p5, a_i_p3_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_p5);
- square_a_64qam_epi16(a_r_p3_p3, a_i_p3_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_p3);
- square_a_64qam_epi16(a_r_p3_p1, a_i_p3_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_p1);
- square_a_64qam_epi16(a_r_p3_m1, a_i_p3_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_m1);
- square_a_64qam_epi16(a_r_p3_m3, a_i_p3_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_m3);
- square_a_64qam_epi16(a_r_p3_m5, a_i_p3_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_m5);
- square_a_64qam_epi16(a_r_p3_m7, a_i_p3_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_m7);
- square_a_64qam_epi16(a_r_p1_p7, a_i_p1_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_p7);
- square_a_64qam_epi16(a_r_p1_p5, a_i_p1_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_p5);
- square_a_64qam_epi16(a_r_p1_p3, a_i_p1_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_p3);
- square_a_64qam_epi16(a_r_p1_p1, a_i_p1_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_p1);
- square_a_64qam_epi16(a_r_p1_m1, a_i_p1_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_m1);
- square_a_64qam_epi16(a_r_p1_m3, a_i_p1_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_m3);
- square_a_64qam_epi16(a_r_p1_m5, a_i_p1_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_m5);
- square_a_64qam_epi16(a_r_p1_m7, a_i_p1_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_m7);
- square_a_64qam_epi16(a_r_m1_p7, a_i_m1_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_p7);
- square_a_64qam_epi16(a_r_m1_p5, a_i_m1_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_p5);
- square_a_64qam_epi16(a_r_m1_p3, a_i_m1_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_p3);
- square_a_64qam_epi16(a_r_m1_p1, a_i_m1_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_p1);
- square_a_64qam_epi16(a_r_m1_m1, a_i_m1_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_m1);
- square_a_64qam_epi16(a_r_m1_m3, a_i_m1_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_m3);
- square_a_64qam_epi16(a_r_m1_m5, a_i_m1_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_m5);
- square_a_64qam_epi16(a_r_m1_m7, a_i_m1_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_m7);
- square_a_64qam_epi16(a_r_m3_p7, a_i_m3_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_p7);
- square_a_64qam_epi16(a_r_m3_p5, a_i_m3_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_p5);
- square_a_64qam_epi16(a_r_m3_p3, a_i_m3_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_p3);
- square_a_64qam_epi16(a_r_m3_p1, a_i_m3_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_p1);
- square_a_64qam_epi16(a_r_m3_m1, a_i_m3_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_m1);
- square_a_64qam_epi16(a_r_m3_m3, a_i_m3_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_m3);
- square_a_64qam_epi16(a_r_m3_m5, a_i_m3_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_m5);
- square_a_64qam_epi16(a_r_m3_m7, a_i_m3_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_m7);
- square_a_64qam_epi16(a_r_m5_p7, a_i_m5_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_p7);
- square_a_64qam_epi16(a_r_m5_p5, a_i_m5_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_p5);
- square_a_64qam_epi16(a_r_m5_p3, a_i_m5_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_p3);
- square_a_64qam_epi16(a_r_m5_p1, a_i_m5_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_p1);
- square_a_64qam_epi16(a_r_m5_m1, a_i_m5_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_m1);
- square_a_64qam_epi16(a_r_m5_m3, a_i_m5_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_m3);
- square_a_64qam_epi16(a_r_m5_m5, a_i_m5_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_m5);
- square_a_64qam_epi16(a_r_m5_m7, a_i_m5_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_m7);
- square_a_64qam_epi16(a_r_m7_p7, a_i_m7_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_p7);
- square_a_64qam_epi16(a_r_m7_p5, a_i_m7_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_p5);
- square_a_64qam_epi16(a_r_m7_p3, a_i_m7_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_p3);
- square_a_64qam_epi16(a_r_m7_p1, a_i_m7_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_p1);
- square_a_64qam_epi16(a_r_m7_m1, a_i_m7_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_m1);
- square_a_64qam_epi16(a_r_m7_m3, a_i_m7_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_m3);
- square_a_64qam_epi16(a_r_m7_m5, a_i_m7_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_m5);
- square_a_64qam_epi16(a_r_m7_m7, a_i_m7_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_m7);
-
- // Computing different multiples of ||h0||^2
- // x=1, y=1
- ch_mag_2_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,ONE_OVER_FOUR_SQRT_42);
- ch_mag_2_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_2_over_42_with_sigma2,1);
- // x=1, y=3
- ch_mag_10_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FIVE_OVER_FOUR_SQRT_42);
- ch_mag_10_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_10_over_42_with_sigma2,1);
- // x=1, x=5
- ch_mag_26_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTEEN_OVER_FOUR_SQRT_42);
- ch_mag_26_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_26_over_42_with_sigma2,1);
- // x=1, y=7
- ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42);
- ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1);
- // x=3, y=3
- ch_mag_18_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,NINE_OVER_FOUR_SQRT_42);
- ch_mag_18_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_18_over_42_with_sigma2,1);
- // x=3, y=5
- ch_mag_34_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,SEVENTEEN_OVER_FOUR_SQRT_42);
- ch_mag_34_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_34_over_42_with_sigma2,1);
- // x=3, y=7
- ch_mag_58_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYNINE_OVER_FOUR_SQRT_42);
- ch_mag_58_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_58_over_42_with_sigma2,2);
- // x=5, y=5
- ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42);
- ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1);
- // x=5, y=7
- ch_mag_74_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTYSEVEN_OVER_FOUR_SQRT_42);
- ch_mag_74_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_74_over_42_with_sigma2,2);
- // x=7, y=7
- ch_mag_98_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FORTYNINE_OVER_FOUR_SQRT_42);
- ch_mag_98_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_98_over_42_with_sigma2,2);
-
- // Computing Metrics
- xmm0 = _mm_subs_epi16(psi_a_p7_p7, a_sq_p7_p7);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_7_7);
- bit_met_p7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_p5, a_sq_p7_p5);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_7_5);
- bit_met_p7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_p3, a_sq_p7_p3);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_7_3);
- bit_met_p7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_p1, a_sq_p7_p1);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_7_1);
- bit_met_p7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_m1, a_sq_p7_m1);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_7_1);
- bit_met_p7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_m3, a_sq_p7_m3);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_7_3);
- bit_met_p7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_m5, a_sq_p7_m5);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_7_5);
- bit_met_p7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_m7, a_sq_p7_m7);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_7_7);
- bit_met_p7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_p7, a_sq_p5_p7);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_5_7);
- bit_met_p5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_p5, a_sq_p5_p5);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_5_5);
- bit_met_p5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_p3, a_sq_p5_p3);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_5_3);
- bit_met_p5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_p1, a_sq_p5_p1);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_5_1);
- bit_met_p5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_m1, a_sq_p5_m1);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_5_1);
- bit_met_p5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_m3, a_sq_p5_m3);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_5_3);
- bit_met_p5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_m5, a_sq_p5_m5);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_5_5);
- bit_met_p5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_m7, a_sq_p5_m7);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_5_7);
- bit_met_p5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_p7, a_sq_p3_p7);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_3_7);
- bit_met_p3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_p5, a_sq_p3_p5);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_3_5);
- bit_met_p3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_p3, a_sq_p3_p3);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_3_3);
- bit_met_p3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_p1, a_sq_p3_p1);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_3_1);
- bit_met_p3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_m1, a_sq_p3_m1);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_3_1);
- bit_met_p3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_m3, a_sq_p3_m3);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_3_3);
- bit_met_p3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_m5, a_sq_p3_m5);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_3_5);
- bit_met_p3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_m7, a_sq_p3_m7);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_3_7);
- bit_met_p3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_p7, a_sq_p1_p7);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_1_7);
- bit_met_p1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_p5, a_sq_p1_p5);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_1_5);
- bit_met_p1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_p3, a_sq_p1_p3);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_1_3);
- bit_met_p1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_p1, a_sq_p1_p1);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_1_1);
- bit_met_p1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_m1, a_sq_p1_m1);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_1_1);
- bit_met_p1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_m3, a_sq_p1_m3);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_1_3);
- bit_met_p1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_m5, a_sq_p1_m5);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_1_5);
- bit_met_p1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_m7, a_sq_p1_m7);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_1_7);
- bit_met_p1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_p7, a_sq_m1_p7);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_1_7);
- bit_met_m1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_p5, a_sq_m1_p5);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_1_5);
- bit_met_m1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_p3, a_sq_m1_p3);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_1_3);
- bit_met_m1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_p1, a_sq_m1_p1);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_1_1);
- bit_met_m1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_m1, a_sq_m1_m1);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_1_1);
- bit_met_m1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_m3, a_sq_m1_m3);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_1_3);
- bit_met_m1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_m5, a_sq_m1_m5);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_1_5);
- bit_met_m1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_m7, a_sq_m1_m7);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_1_7);
- bit_met_m1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_p7, a_sq_m3_p7);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_3_7);
- bit_met_m3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_p5, a_sq_m3_p5);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_3_5);
- bit_met_m3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_p3, a_sq_m3_p3);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_3_3);
- bit_met_m3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_p1, a_sq_m3_p1);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_3_1);
- bit_met_m3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_m1, a_sq_m3_m1);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_3_1);
- bit_met_m3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_m3, a_sq_m3_m3);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_3_3);
- bit_met_m3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_m5, a_sq_m3_m5);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_3_5);
- bit_met_m3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_m7, a_sq_m3_m7);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_3_7);
- bit_met_m3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_p7, a_sq_m5_p7);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_5_7);
- bit_met_m5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_p5, a_sq_m5_p5);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_5_5);
- bit_met_m5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_p3, a_sq_m5_p3);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_5_3);
- bit_met_m5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_p1, a_sq_m5_p1);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_5_1);
- bit_met_m5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_m1, a_sq_m5_m1);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_5_1);
- bit_met_m5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_m3, a_sq_m5_m3);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_5_3);
- bit_met_m5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_m5, a_sq_m5_m5);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_5_5);
- bit_met_m5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_m7, a_sq_m5_m7);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_5_7);
- bit_met_m5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_p7, a_sq_m7_p7);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_7_7);
- bit_met_m7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_p5, a_sq_m7_p5);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_7_5);
- bit_met_m7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_p3, a_sq_m7_p3);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_7_3);
- bit_met_m7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_p1, a_sq_m7_p1);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_7_1);
- bit_met_m7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_m1, a_sq_m7_m1);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_7_1);
- bit_met_m7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_m3, a_sq_m7_m3);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_7_3);
- bit_met_m7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_m5, a_sq_m7_m5);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_7_5);
- bit_met_m7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_m7, a_sq_m7_m7);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_7_7);
- bit_met_m7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
-
- // Detection for 1st bit (LTE mapping)
- // bit = 1
- xmm0 = _mm_max_epi16(bit_met_m7_p7, bit_met_m7_p5);
- xmm1 = _mm_max_epi16(bit_met_m7_p3, bit_met_m7_p1);
- xmm2 = _mm_max_epi16(bit_met_m7_m1, bit_met_m7_m3);
- xmm3 = _mm_max_epi16(bit_met_m7_m5, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m5_p7, bit_met_m5_p5);
- xmm1 = _mm_max_epi16(bit_met_m5_p3, bit_met_m5_p1);
- xmm2 = _mm_max_epi16(bit_met_m5_m1, bit_met_m5_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m5_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m3_p7, bit_met_m3_p5);
- xmm1 = _mm_max_epi16(bit_met_m3_p3, bit_met_m3_p1);
- xmm2 = _mm_max_epi16(bit_met_m3_m1, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m3_m5, bit_met_m3_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m1_p7, bit_met_m1_p5);
- xmm1 = _mm_max_epi16(bit_met_m1_p3, bit_met_m1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m1_m3);
- xmm3 = _mm_max_epi16(bit_met_m1_m5, bit_met_m1_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- // bit = 0
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p7_p5);
- xmm1 = _mm_max_epi16(bit_met_p7_p3, bit_met_p7_p1);
- xmm2 = _mm_max_epi16(bit_met_p7_m1, bit_met_p7_m3);
- xmm3 = _mm_max_epi16(bit_met_p7_m5, bit_met_p7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p5_p7, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p5_p3, bit_met_p5_p1);
- xmm2 = _mm_max_epi16(bit_met_p5_m1, bit_met_p5_m3);
- xmm3 = _mm_max_epi16(bit_met_p5_m5, bit_met_p5_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p3_p7, bit_met_p3_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p3_p1);
- xmm2 = _mm_max_epi16(bit_met_p3_m1, bit_met_p3_m3);
- xmm3 = _mm_max_epi16(bit_met_p3_m5, bit_met_p3_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p1_p7, bit_met_p1_p5);
- xmm1 = _mm_max_epi16(bit_met_p1_p3, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_p1_m1, bit_met_p1_m3);
- xmm3 = _mm_max_epi16(bit_met_p1_m5, bit_met_p1_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y0r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 2nd bit (LTE mapping)
- // bit = 1
- xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1);
- xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1);
- xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5);
- xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7);
- xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7);
- xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7);
- xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- // bit = 0
- xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1);
- xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1);
- xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3);
- xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5);
- xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7);
- xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7);
- xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7);
- xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y1r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 3rd bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5);
- xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1);
- xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3);
- xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5);
- xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1);
- xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1);
- xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3);
- xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5);
- xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1);
- xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3);
- xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5);
- xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5);
- xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5);
- xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3);
- xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1);
- xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y2r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 4th bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7);
- xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7);
- xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7);
- xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5);
- xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5);
- xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7);
- xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7);
- xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7);
- xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1);
- xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1);
- xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1);
- xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1);
- xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3);
- xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y0i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
-
- // Detection for 5th bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5);
- xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1);
- xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3);
- xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5);
- xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5);
- xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3);
- xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5);
- xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1);
- xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3);
- xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5);
- xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1);
- xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5);
- xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1);
- xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1);
- xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3);
- xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y1i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 6th bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7);
- xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7);
- xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7);
- xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1);
- xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1);
- xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1);
- xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1);
- xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7);
- xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7);
- xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7);
- xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5);
- xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3);
- xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5);
- xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y2i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
-
- // map to output stream, difficult to do in SIMD since we have 6 16bit LLRs
- // RE 1
- j = 24*i;
- stream0_out[j + 0] = ((short *)&y0r)[0];
- stream0_out[j + 1] = ((short *)&y1r)[0];
- stream0_out[j + 2] = ((short *)&y2r)[0];
- stream0_out[j + 3] = ((short *)&y0i)[0];
- stream0_out[j + 4] = ((short *)&y1i)[0];
- stream0_out[j + 5] = ((short *)&y2i)[0];
- // RE 2
- stream0_out[j + 6] = ((short *)&y0r)[1];
- stream0_out[j + 7] = ((short *)&y1r)[1];
- stream0_out[j + 8] = ((short *)&y2r)[1];
- stream0_out[j + 9] = ((short *)&y0i)[1];
- stream0_out[j + 10] = ((short *)&y1i)[1];
- stream0_out[j + 11] = ((short *)&y2i)[1];
- // RE 3
- stream0_out[j + 12] = ((short *)&y0r)[2];
- stream0_out[j + 13] = ((short *)&y1r)[2];
- stream0_out[j + 14] = ((short *)&y2r)[2];
- stream0_out[j + 15] = ((short *)&y0i)[2];
- stream0_out[j + 16] = ((short *)&y1i)[2];
- stream0_out[j + 17] = ((short *)&y2i)[2];
- // RE 4
- stream0_out[j + 18] = ((short *)&y0r)[3];
- stream0_out[j + 19] = ((short *)&y1r)[3];
- stream0_out[j + 20] = ((short *)&y2r)[3];
- stream0_out[j + 21] = ((short *)&y0i)[3];
- stream0_out[j + 22] = ((short *)&y1i)[3];
- stream0_out[j + 23] = ((short *)&y2i)[3];
- // RE 5
- stream0_out[j + 24] = ((short *)&y0r)[4];
- stream0_out[j + 25] = ((short *)&y1r)[4];
- stream0_out[j + 26] = ((short *)&y2r)[4];
- stream0_out[j + 27] = ((short *)&y0i)[4];
- stream0_out[j + 28] = ((short *)&y1i)[4];
- stream0_out[j + 29] = ((short *)&y2i)[4];
- // RE 6
- stream0_out[j + 30] = ((short *)&y0r)[5];
- stream0_out[j + 31] = ((short *)&y1r)[5];
- stream0_out[j + 32] = ((short *)&y2r)[5];
- stream0_out[j + 33] = ((short *)&y0i)[5];
- stream0_out[j + 34] = ((short *)&y1i)[5];
- stream0_out[j + 35] = ((short *)&y2i)[5];
- // RE 7
- stream0_out[j + 36] = ((short *)&y0r)[6];
- stream0_out[j + 37] = ((short *)&y1r)[6];
- stream0_out[j + 38] = ((short *)&y2r)[6];
- stream0_out[j + 39] = ((short *)&y0i)[6];
- stream0_out[j + 40] = ((short *)&y1i)[6];
- stream0_out[j + 41] = ((short *)&y2i)[6];
- // RE 8
- stream0_out[j + 42] = ((short *)&y0r)[7];
- stream0_out[j + 43] = ((short *)&y1r)[7];
- stream0_out[j + 44] = ((short *)&y2r)[7];
- stream0_out[j + 45] = ((short *)&y0i)[7];
- stream0_out[j + 46] = ((short *)&y1i)[7];
- stream0_out[j + 47] = ((short *)&y2i)[7];
-
-#elif defined(__arm__)
-
-#endif
-
- }
-
-#if defined(__x86_64__) || defined(__i386__)
- _mm_empty();
- _m_empty();
-#endif
-}
-
-
-int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
- int32_t **rxdataF_comp,
- int32_t **rxdataF_comp_i,
- int32_t **dl_ch_mag,
- int32_t **dl_ch_mag_i,
- int32_t **rho_i,
- int16_t *dlsch_llr,
- uint8_t symbol,
- uint8_t first_symbol_flag,
- uint16_t nb_rb,
- uint16_t pbch_pss_sss_adjust,
- //int16_t **llr16p,
- uint32_t llr_offset)
-{
-
- int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *llr16;
- int8_t *pllr_symbol; // pointer where llrs should filled for this ofdm symbol
- int len;
- uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
-
- //first symbol has different structure due to more pilots
- /*if (first_symbol_flag == 1) {
- llr16 = (int16_t*)dlsch_llr;
- } else {
- llr16 = (int16_t*)(*llr16p);
- }*/
-
- llr16 = (int16_t*)dlsch_llr;
-
- AssertFatal(llr16!=NULL,"dlsch_16qam_64qam_llr:llr is null, symbol %d\n",symbol);
-
-
- if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
- // if symbol has pilots
- if (frame_parms->nb_antenna_ports_eNB!=1)
- // in 2 antenna ports we have 8 REs per symbol per RB
- len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
- else
- // for 1 antenna port we have 10 REs per symbol per RB
- len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
- } else {
- // symbol has no pilots
- len = (nb_rb*12) - pbch_pss_sss_adjust;
- }
-
- pllr_symbol = (int8_t*)dlsch_llr;
- pllr_symbol += llr_offset;
- //printf("dlsch_64qam_64qam_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
- /*LOG_I(PHY,"dlsch_64qam_64qam_llr [symb %d / FirstSym %d / Length %d / LLR Offset %d]: @LLR Buff %x, @LLR Buff(symb) %x, , @Compute LLR Buff(symb) %x \n",
- symbol,
- first_symbol_flag,
- len,
- llr_offset,
- (int16_t*)dlsch_llr,
- llr16,
- pllr_symbol);*/
-
-#ifdef __AVX2__
-
- // Round length up to multiple of 16 words
- uint32_t len256i = ((len+16)>>4)*16;
- int32_t *rxF_256i = (int32_t*) malloc16_clear(len256i*4);
- int32_t *rxF_i_256i = (int32_t*) malloc16_clear(len256i*4);
- int32_t *ch_mag_256i = (int32_t*) malloc16_clear(len256i*4);
- int32_t *ch_mag_i_256i = (int32_t*) malloc16_clear(len256i*4);
- int32_t *rho_256i = (int32_t*) malloc16_clear(len256i*4);
-
- memcpy(rxF_256i, rxF, len*4);
- memcpy(rxF_i_256i, rxF_i, len*4);
- memcpy(ch_mag_256i, ch_mag, len*4);
- memcpy(ch_mag_i_256i, ch_mag_i, len*4);
- memcpy(rho_256i, rho, len*4);
-
-#if 0
- qam64_qam16_avx2((short *)rxF_256i,
- (short *)rxF_i_256i,
- (short *)ch_mag_256i,
- (short *)ch_mag_i_256i,
- (short *)llr16,
- (short *) rho_256i,
- len);
-#else
- qam64_qam64_avx2((int32_t *)rxF_256i,
- (int32_t *)rxF_i_256i,
- (int32_t *)ch_mag_256i,
- (int32_t *)ch_mag_i_256i,
- (int16_t *)llr16,
- (int32_t *) rho_256i,
- len);
-#endif
-
- free16(rxF_256i, sizeof(rxF_256i));
- free16(rxF_i_256i, sizeof(rxF_i_256i));
- free16(ch_mag_256i, sizeof(ch_mag_256i));
- free16(ch_mag_i_256i, sizeof(ch_mag_i_256i));
- free16(rho_256i, sizeof(rho_256i));
-
-#else
- qam64_qam64((short *)rxF,
- (short *)rxF_i,
- (short *)ch_mag,
- (short *)ch_mag_i,
- (short *)llr16,
- (short *)rho,
- len);
-#endif
-
- llr16 += (6*len);
- //*llr16p = (short *)llr16;
-
- return(0);
-}
diff --git a/openair1/PHY/LTE_TRANSPORT/drs_modulation.c b/openair1/PHY/LTE_TRANSPORT/drs_modulation.c
deleted file mode 100644
index a0bde219b5..0000000000
--- a/openair1/PHY/LTE_TRANSPORT/drs_modulation.c
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-/*! \file PHY/LTE_TRANSPORT/drs_modulation.c
-* \brief Top-level routines for generating the Demodulation Reference Signals from 36-211, V8.6 2009-03
-* \author R. Knopp, F. Kaltenberger, A. Bhamri
-* \date 2011
-* \version 0.1
-* \company Eurecom
-* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,ankit.bhamri@eurecom.fr
-* \note
-* \warning
-*/
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "PHY/sse_intrin.h"
-//#define DEBUG_DRS
-
-int generate_drs_pusch(PHY_VARS_UE *ue,
- UE_rxtx_proc_t *proc,
- uint8_t eNB_id,
- short amp,
- unsigned int subframe,
- unsigned int first_rb,
- unsigned int nb_rb,
- uint8_t ant)
-{
-
- uint16_t k,l,Msc_RS,Msc_RS_idx,rb,drs_offset;
- uint16_t * Msc_idx_ptr;
- int subframe_offset,re_offset,symbol_offset;
-
- //uint32_t phase_shift; // phase shift for cyclic delay in DM RS
- //uint8_t alpha_ind;
-
- int16_t alpha_re[12] = {32767, 28377, 16383, 0,-16384, -28378,-32768,-28378,-16384, -1, 16383, 28377};
- int16_t alpha_im[12] = {0, 16383, 28377, 32767, 28377, 16383, 0,-16384,-28378,-32768,-28378,-16384};
-
- uint8_t cyclic_shift,cyclic_shift0,cyclic_shift1;
- LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
- int32_t *txdataF = ue->common_vars.txdataF[ant];
- uint32_t u,v,alpha_ind;
- uint32_t u0=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[subframe<<1];
- uint32_t u1=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[1+(subframe<<1)];
- uint32_t v0=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[subframe<<1];
- uint32_t v1=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)];
- int32_t ref_re,ref_im;
- uint8_t harq_pid = subframe2harq_pid(frame_parms,proc->frame_tx,subframe);
-
- cyclic_shift0 = (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift +
- ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2 +
- frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]+
- ((ue->ulsch[0]->cooperation_flag==2)?10:0)+
- ant*6) % 12;
- // printf("PUSCH.cyclicShift %d, n_DMRS2 %d, nPRS %d\n",frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift,ue->ulsch[eNB_id]->n_DMRS2,ue->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]);
- cyclic_shift1 = (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift +
- ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2 +
- frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[(subframe<<1)+1]+
- ((ue->ulsch[0]->cooperation_flag==2)?10:0)+
- ant*6) % 12;
-
- // cyclic_shift0 = 0;
- // cyclic_shift1 = 0;
- Msc_RS = 12*nb_rb;
-
- Msc_idx_ptr = (uint16_t*) bsearch(&Msc_RS, dftsizes, 33, sizeof(uint16_t), compareints);
-
- if (Msc_idx_ptr)
- Msc_RS_idx = Msc_idx_ptr - dftsizes;
- else {
- LOG_I(PHY,"generate_drs_pusch: index for Msc_RS=%d not found\n",Msc_RS);
- return(-1);
- }
-
- for (l = (3 - frame_parms->Ncp),u=u0,v=v0,cyclic_shift=cyclic_shift0;
- lsymbols_per_tti;
- l += (7 - frame_parms->Ncp),u=u1,v=v1,cyclic_shift=cyclic_shift1) {
-
- drs_offset = 0;
-#ifdef DEBUG_DRS
- printf("drs_modulation: Msc_RS = %d, Msc_RS_idx = %d, u=%d,v=%d\n",Msc_RS, Msc_RS_idx,u,v);
-#endif
-
-
- re_offset = frame_parms->first_carrier_offset;
- subframe_offset = subframe*frame_parms->symbols_per_tti*frame_parms->ofdm_symbol_size;
- symbol_offset = subframe_offset + frame_parms->ofdm_symbol_size*l;
-
-
-#ifdef DEBUG_DRS
- printf("generate_drs_pusch: symbol_offset %d, subframe offset %d, cyclic shift %d\n",symbol_offset,subframe_offset,cyclic_shift);
-#endif
- alpha_ind = 0;
-
- for (rb=0; rbN_RB_UL; rb++) {
-
- if ((rb >= first_rb) && (rb<(first_rb+nb_rb))) {
-
-#ifdef DEBUG_DRS
- printf("generate_drs_pusch: doing RB %d, re_offset=%d, drs_offset=%d,cyclic shift %d\n",rb,re_offset,drs_offset,cyclic_shift);
-#endif
-
- for (k=0; k<12; k++) {
- ref_re = (int32_t) ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1];
- ref_im = (int32_t) ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1];
-
- ((int16_t*) txdataF)[2*(symbol_offset + re_offset)] = (int16_t) (((ref_re*alpha_re[alpha_ind]) -
- (ref_im*alpha_im[alpha_ind]))>>15);
- ((int16_t*) txdataF)[2*(symbol_offset + re_offset)+1] = (int16_t) (((ref_re*alpha_im[alpha_ind]) +
- (ref_im*alpha_re[alpha_ind]))>>15);
- ((short*) txdataF)[2*(symbol_offset + re_offset)] = (short) ((((short*) txdataF)[2*(symbol_offset + re_offset)]*(int32_t)amp)>>15);
- ((short*) txdataF)[2*(symbol_offset + re_offset)+1] = (short) ((((short*) txdataF)[2*(symbol_offset + re_offset)+1]*(int32_t)amp)>>15);
-
-
- alpha_ind = (alpha_ind + cyclic_shift);
-
- if (alpha_ind > 11)
- alpha_ind-=12;
-
-#ifdef DEBUG_DRS
- printf("symbol_offset %d, alpha_ind %d , re_offset %d : (%d,%d)\n",
- symbol_offset,
- alpha_ind,
- re_offset,
- ((short*) txdataF)[2*(symbol_offset + re_offset)],
- ((short*) txdataF)[2*(symbol_offset + re_offset)+1]);
-
-#endif // DEBUG_DRS
- re_offset++;
- drs_offset++;
-
- if (re_offset >= frame_parms->ofdm_symbol_size)
- re_offset = 0;
- }
-
- } else {
- 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 (frame_parms->N_RB_DL&1) // odd number of RBs
- re_offset=6;
- else // even number of RBs (doesn't straddle DC)
- re_offset=0;
- }
-
-
- }
- }
- }
-
- return(0);
-}
-
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c
deleted file mode 100644
index 09420f48ab..0000000000
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c
+++ /dev/null
@@ -1,933 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-/*! \file PHY/LTE_TRANSPORT/ulsch_coding.c
-* \brief Top-level routines for coding the ULSCH transport channel as described in 36.212 V8.6 2009-03
-* \author R. Knopp
-* \date 2011
-* \version 0.1
-* \company Eurecom
-* \email: knopp@eurecom.fr
-* \note
-* \warning
-*/
-
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-
-#include "PHY/CODING/defs.h"
-#include "PHY/CODING/extern.h"
-#include "PHY/CODING/lte_interleaver_inline.h"
-#include "PHY/LTE_TRANSPORT/defs.h"
-#include "defs.h"
-#include "extern.h"
-#include "SIMULATION/ETH_TRANSPORT/extern.h"
-#include "UTIL/LOG/vcd_signal_dumper.h"
-
-//#define DEBUG_ULSCH_CODING
-//#define DEBUG_ULSCH_FREE 1
-
-/*
-#define is_not_pilot(pilots,first_pilot,re) (pilots==0) || \
- ((pilots==1)&&(first_pilot==1)&&(((re>2)&&(re<6))||((re>8)&&(re<12)))) || \
- ((pilots==1)&&(first_pilot==0)&&(((re<3))||((re>5)&&(re<9)))) \
-*/
-#define is_not_pilot(pilots,first_pilot,re) (1)
-
-
-
-
-void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch)
-{
- int i;
- int r;
-
- if (ulsch) {
-#ifdef DEBUG_ULSCH_FREE
- printf("Freeing ulsch %p\n",ulsch);
-#endif
-
- for (i=0; i<8; i++) {
- if (ulsch->harq_processes[i]) {
- if (ulsch->harq_processes[i]->b) {
- free16(ulsch->harq_processes[i]->b,MAX_ULSCH_PAYLOAD_BYTES);
- ulsch->harq_processes[i]->b = NULL;
- }
- for (r=0; rharq_processes[i]->c[r]) {
- free16(ulsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+768);
- ulsch->harq_processes[i]->c[r] = NULL;
- }
- }
-
- free16(ulsch->harq_processes[i],sizeof(LTE_UL_UE_HARQ_t));
- ulsch->harq_processes[i] = NULL;
- }
- }
- free16(ulsch,sizeof(LTE_UE_ULSCH_t));
- ulsch = NULL;
- }
-
-}
-
-LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag)
-{
-
- LTE_UE_ULSCH_t *ulsch;
- unsigned char exit_flag = 0,i,j,r;
- unsigned char bw_scaling =1;
-
- switch (N_RB_UL) {
- case 6:
- bw_scaling =16;
- break;
-
- case 25:
- bw_scaling =4;
- break;
-
- case 50:
- bw_scaling =2;
- break;
-
- default:
- bw_scaling =1;
- break;
- }
-
- ulsch = (LTE_UE_ULSCH_t *)malloc16(sizeof(LTE_UE_ULSCH_t));
-
- if (ulsch) {
- memset(ulsch,0,sizeof(LTE_UE_ULSCH_t));
-
- ulsch->Mlimit = 4;
-
- for (i=0; i<8; i++) {
-
- ulsch->harq_processes[i] = (LTE_UL_UE_HARQ_t *)malloc16(sizeof(LTE_UL_UE_HARQ_t));
-
- // printf("ulsch->harq_processes[%d] %p\n",i,ulsch->harq_processes[i]);
- if (ulsch->harq_processes[i]) {
- memset(ulsch->harq_processes[i], 0, sizeof(LTE_UL_UE_HARQ_t));
- ulsch->harq_processes[i]->b = (unsigned char*)malloc16(MAX_ULSCH_PAYLOAD_BYTES/bw_scaling);
-
- if (ulsch->harq_processes[i]->b)
- memset(ulsch->harq_processes[i]->b,0,MAX_ULSCH_PAYLOAD_BYTES/bw_scaling);
- else {
- LOG_E(PHY,"Can't get b\n");
- exit_flag=1;
- }
-
- if (abstraction_flag==0) {
- for (r=0; rharq_processes[i]->c[r] = (unsigned char*)malloc16(((r==0)?8:0) + 3+768); // account for filler in first segment and CRCs for multiple segment case
-
- if (ulsch->harq_processes[i]->c[r])
- memset(ulsch->harq_processes[i]->c[r],0,((r==0)?8:0) + 3+768);
- else {
- LOG_E(PHY,"Can't get c\n");
- exit_flag=2;
- }
- }
- }
-
- ulsch->harq_processes[i]->subframe_scheduling_flag = 0;
- ulsch->harq_processes[i]->first_tx = 1;
- } else {
- LOG_E(PHY,"Can't get harq_p %d\n",i);
- exit_flag=3;
- }
- }
-
- if ((abstraction_flag == 0) && (exit_flag==0)) {
- for (i=0; i<8; i++)
- for (j=0; j<96; j++)
- for (r=0; rharq_processes[i]->d[r][j] = LTE_NULL;
-
- return(ulsch);
- } else if (abstraction_flag==1)
- return(ulsch);
- }
-
- LOG_E(PHY,"new_ue_ulsch exit flag, size of %d , %zu\n",exit_flag, sizeof(LTE_UE_ULSCH_t));
- free_ue_ulsch(ulsch);
- return(NULL);
-
-
-}
-
-
-uint32_t ulsch_encoding(uint8_t *a,
- PHY_VARS_UE *ue,
- uint8_t harq_pid,
- uint8_t eNB_id,
- uint8_t subframe_rx,
- uint8_t tmode,
- uint8_t control_only_flag,
- uint8_t Nbundled)
-{
-
- time_stats_t *seg_stats=&ue->ulsch_segmentation_stats;
- time_stats_t *rm_stats=&ue->ulsch_rate_matching_stats;
- time_stats_t *te_stats=&ue->ulsch_turbo_encoding_stats;
- time_stats_t *i_stats=&ue->ulsch_interleaving_stats;
- time_stats_t *m_stats=&ue->ulsch_multiplexing_stats;
-
- // uint16_t offset;
- uint32_t crc=1;
- uint16_t iind;
- uint32_t A;
- uint8_t Q_m=0;
- uint32_t Kr=0,Kr_bytes,r,r_offset=0;
- uint8_t y[6*14*1200],*yptr;;
- uint8_t *columnset;
- uint32_t sumKr=0;
- uint32_t Qprime,L,G,Q_CQI=0,Q_RI=0,Q_ACK=0,H=0,Hprime=0,Hpp=0,Cmux=0,Rmux=0,Rmux_prime=0;
- uint32_t Qprime_ACK=0,Qprime_CQI=0,Qprime_RI=0,len_ACK=0,len_RI=0;
- // uint32_t E;
- uint8_t ack_parity;
- uint32_t i,q,j,iprime,j2;
- uint16_t o_RCC;
- uint8_t o_flip[8];
- uint32_t wACK_idx;
- LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
- PHY_MEASUREMENTS *meas = &ue->measurements;
- LTE_UE_ULSCH_t *ulsch=ue->ulsch[eNB_id];
- LTE_UE_DLSCH_t **dlsch = ue->dlsch[0][eNB_id];
- uint16_t rnti = 0xffff;
-
- if (!ulsch) {
- LOG_E(PHY,"Null ulsch ptr %p\n",ulsch);
- return(-1);
- }
-
- if (harq_pid >= 8) {
- LOG_E(PHY,"Illegal harq_pid %d\n",harq_pid);
- return(-1);
- }
-
- if (ulsch->harq_processes[harq_pid]->O_ACK > 2) {
- LOG_E(PHY,"Illegal O_ACK %d\n",ulsch->harq_processes[harq_pid]->O_ACK);
- return(-1);
- }
-
- if (ulsch->O_RI > 1) {
- LOG_E(PHY,"Illegal O_RI %d\n",ulsch->O_RI);
- return(-1);
- }
-
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING, VCD_FUNCTION_IN);
-
- // fill CQI/PMI information
- if (ulsch->O>0) {
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING_FILL_CQI, VCD_FUNCTION_IN);
- rnti = ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti;
- fill_CQI(ulsch,meas,0,harq_pid,ue->frame_parms.N_RB_DL,rnti, tmode,ue->sinr_eff);
-
- LOG_D(PHY,"ULSCH Encoding rnti %x \n", rnti);
- print_CQI(ulsch->o,ulsch->uci_format,0,ue->frame_parms.N_RB_DL);
-
- // save PUSCH pmi for later (transmission modes 4,5,6)
- if (dlsch[0]) {
- //LOG_I(PHY,"XXX saving pmi for DL %x\n",pmi2hex_2Ar1(((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi));
- dlsch[0]->pmi_alloc = ((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi;
- }
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING_FILL_CQI, VCD_FUNCTION_OUT);
- }
-
- if (ulsch->O<=32) {
- o_flip[0] = ulsch->o[3];
- o_flip[1] = ulsch->o[2];
- o_flip[2] = ulsch->o[1];
- o_flip[3] = ulsch->o[0];
- } else {
- o_flip[0] = ulsch->o[7];
- o_flip[1] = ulsch->o[6];
- o_flip[2] = ulsch->o[5];
- o_flip[3] = ulsch->o[4];
- o_flip[4] = ulsch->o[3];
- o_flip[5] = ulsch->o[2];
- o_flip[6] = ulsch->o[1];
- o_flip[7] = ulsch->o[0];
- }
-
- if (control_only_flag == 0) {
- A=ulsch->harq_processes[harq_pid]->TBS;
- Q_m = get_Qm_ul(ulsch->harq_processes[harq_pid]->mcs);
-
- ulsch->harq_processes[harq_pid]->control_only = 0;
-
-#ifdef DEBUG_ULSCH_CODING
- printf("[PHY][UE] ULSCH coding : A %d, Qm %d, mcs %d, harq_pid %d, round %d, RV %d\n",
- ulsch->harq_processes[harq_pid]->TBS,
- Q_m,
- ulsch->harq_processes[harq_pid]->mcs,
- harq_pid,
- ulsch->harq_processes[harq_pid]->round,
- ulsch->harq_processes[harq_pid]->rvidx);
-
- for (i=0; iharq_processes[harq_pid]->O_ACK; i++)
- printf("ulsch_coding: o_ACK[%d] %d\n",i,ulsch->o_ACK[i]);
-
- for (i=0; iO_RI; i++)
- printf("ulsch_coding: o_RI[%d] %d\n",i,ulsch->o_RI[i]);
-
- printf("ulsch_coding: O=%d\n",ulsch->O);
-
- for (i=0; i<1+((8+ulsch->O)/8); i++) {
- // ulsch->o[i] = i;
- printf("ulsch_coding: O[%d] %d\n",i,ulsch->o[i]);
- }
-
- if ((tmode != 4))
- print_CQI(ulsch->o,wideband_cqi_rank1_2A,0,ue->frame_parms.N_RB_DL);
- else
- print_CQI(ulsch->o,HLC_subband_cqi_rank1_2A,0,ue->frame_parms.N_RB_DL);
-
-#endif
-
- if (ulsch->harq_processes[harq_pid]->round == 0) { // this is a new packet
-
- start_meas(seg_stats);
- // 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];
-
- ulsch->harq_processes[harq_pid]->B = A+24;
- ulsch->harq_processes[harq_pid]->b = a;
- lte_segmentation(ulsch->harq_processes[harq_pid]->b,
- ulsch->harq_processes[harq_pid]->c,
- ulsch->harq_processes[harq_pid]->B,
- &ulsch->harq_processes[harq_pid]->C,
- &ulsch->harq_processes[harq_pid]->Cplus,
- &ulsch->harq_processes[harq_pid]->Cminus,
- &ulsch->harq_processes[harq_pid]->Kplus,
- &ulsch->harq_processes[harq_pid]->Kminus,
- &ulsch->harq_processes[harq_pid]->F);
-
- stop_meas(seg_stats);
-
- for (r=0; rharq_processes[harq_pid]->C; r++) {
- if (rharq_processes[harq_pid]->Cminus)
- Kr = ulsch->harq_processes[harq_pid]->Kminus;
- else
- Kr = ulsch->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 {
- LOG_E(PHY,"ulsch_coding: Illegal codeword size %d!!!\n",Kr_bytes);
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING, VCD_FUNCTION_OUT);
- return(-1);
- }
-
-
-#ifdef DEBUG_ULSCH_CODING
- printf("Generating Code Segment %d (%d bits)\n",r,Kr);
- // generate codewords
-
- printf("bits_per_codeword (Kr)= %d\n",Kr);
- printf("N_RB = %d\n",ulsch->harq_processes[harq_pid]->nb_rb);
- printf("Ncp %d\n",frame_parms->Ncp);
- printf("Qm %d\n",Q_m);
-#endif
-
- // offset=0;
-
-
-#ifdef DEBUG_ULSCH_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);
- encoder(ulsch->harq_processes[harq_pid]->c[r],
- Kr>>3,
- &ulsch->harq_processes[harq_pid]->d[r][96],
- (r==0) ? ulsch->harq_processes[harq_pid]->F : 0,
- f1f2mat_old[iind*2], // f1 (see 36212-820, page 14)
- f1f2mat_old[(iind*2)+1] // f2 (see 36212-820, page 14)
- );
- stop_meas(te_stats);
-#ifdef DEBUG_ULSCH_CODING
-
- if (r==0)
- write_output("enc_output0.m","enc0",&ulsch->harq_processes[harq_pid]->d[r][96],(3*8*Kr_bytes)+12,1,4);
-
-#endif
- start_meas(i_stats);
- ulsch->harq_processes[harq_pid]->RTC[r] =
- sub_block_interleaving_turbo(4+(Kr_bytes*8),
- &ulsch->harq_processes[harq_pid]->d[r][96],
- ulsch->harq_processes[harq_pid]->w[r]);
- stop_meas(i_stats);
- }
-
- }
-
- if (ulsch->harq_processes[harq_pid]->C == 0) {
- LOG_E(PHY,"null segment\n");
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING, VCD_FUNCTION_OUT);
- return(-1);
- }
-
- sumKr = 0;
-
- for (r=0; rharq_processes[harq_pid]->C; r++) {
- if (rharq_processes[harq_pid]->Cminus)
- Kr = ulsch->harq_processes[harq_pid]->Kminus;
- else
- Kr = ulsch->harq_processes[harq_pid]->Kplus;
-
- sumKr += Kr;
- }
- } else { // This is a control-only PUSCH, set sumKr to O_CQI-MIN
- ulsch->harq_processes[harq_pid]->control_only = 1;
- sumKr = ulsch->O_CQI_MIN;
- }
-
- ulsch->harq_processes[harq_pid]->sumKr = sumKr;
- // Compute Q_ri (p. 23 36-212)
-
- Qprime = ulsch->O_RI*ulsch->harq_processes[harq_pid]->Msc_initial*ulsch->harq_processes[harq_pid]->Nsymb_initial * ulsch->beta_offset_ri_times8;
-
- if (Qprime > 0) {
- if ((Qprime % (8*sumKr)) > 0)
- Qprime = 1+(Qprime/(8*sumKr));
- else
- Qprime = Qprime/(8*sumKr);
-
- if (Qprime > 4*ulsch->harq_processes[harq_pid]->nb_rb * 12)
- Qprime = 4*ulsch->harq_processes[harq_pid]->nb_rb * 12;
- }
-
- Q_RI = Q_m*Qprime;
- Qprime_RI = Qprime;
-
- // Compute Q_ack (p. 23 36-212)
- Qprime = ulsch->harq_processes[harq_pid]->O_ACK*ulsch->harq_processes[harq_pid]->Msc_initial*ulsch->harq_processes[harq_pid]->Nsymb_initial * ulsch->beta_offset_harqack_times8;
-
- if (Qprime > 0) {
- if ((Qprime % (8*sumKr)) > 0)
- Qprime = 1+(Qprime/(8*sumKr));
- else
- Qprime = Qprime/(8*sumKr);
-
- if (Qprime > 4*ulsch->harq_processes[harq_pid]->nb_rb * 12)
- Qprime = 4*ulsch->harq_processes[harq_pid]->nb_rb * 12;
- }
-
- Q_ACK = Qprime * Q_m;
- Qprime_ACK = Qprime;
-
- LOG_D(PHY,"UE (%x/%d) O_ACK %d, Mcs_initial %d, Nsymb_initial %d, beta_offset_harqack*8 %d, sum Kr %d, Qprime_ACK %d, Q_ACK %d\n",
- rnti, harq_pid,
- ulsch->harq_processes[harq_pid]->O_ACK,
- ulsch->harq_processes[harq_pid]->Msc_initial,
- ulsch->harq_processes[harq_pid]->Nsymb_initial,
- ulsch->beta_offset_harqack_times8,
- sumKr,
- Qprime_ACK,
- Q_ACK);
-
- // Compute Q_cqi, assume O>11, p. 26 36-212
- if (control_only_flag == 0) {
-
- if (ulsch->O < 12)
- L=0;
- else
- L=8;
-
- if (ulsch->O > 0)
- Qprime = (ulsch->O + L) * ulsch->harq_processes[harq_pid]->Msc_initial*ulsch->harq_processes[harq_pid]->Nsymb_initial * ulsch->beta_offset_cqi_times8;
- else
- Qprime = 0;
-
- if (Qprime > 0) {
- if ((Qprime % (8*sumKr)) > 0)
- Qprime = 1+(Qprime/(8*sumKr));
- else
- Qprime = Qprime/(8*sumKr);
- }
-
- G = ulsch->harq_processes[harq_pid]->nb_rb * (12 * Q_m) * (ulsch->Nsymb_pusch);
-
- if (Qprime > (G - ulsch->O_RI))
- Qprime = G - ulsch->O_RI;
-
- Q_CQI = Q_m * Qprime;
- Qprime_CQI = Qprime;
-
-
-
- G = G - Q_RI - Q_CQI;
- ulsch->harq_processes[harq_pid]->G = G;
-
-/*
- LOG_I(PHY,"ULSCH Encoding G %d, Q_RI %d (O_RI%d, Msc_initial %d, Nsymb_initial%d, beta_offset_ri_times8 %d), Q_CQI %d, Q_ACK %d \n",G,Q_RI,ulsch->O_RI,ulsch->harq_processes[harq_pid]->Msc_initial,ulsch->harq_processes[harq_pid]->Nsymb_initial,ulsch->beta_offset_ri_times8,Q_CQI,Q_ACK);
-
- LOG_I(PHY,"ULSCH Encoding (Nid_cell %d, rnti %x): harq_pid %d round %d, RV %d, mcs %d, O_RI %d, O_ACK %d, G %d\n",
- frame_parms->Nid_cell,ulsch->rnti,
- harq_pid,
- ulsch->harq_processes[harq_pid]->round,
- ulsch->harq_processes[harq_pid]->rvidx,
- ulsch->harq_processes[harq_pid]->mcs,
- ulsch->O_RI,
- ulsch->harq_processes[harq_pid]->O_ACK,
- G);
-*/
-
- if ((int)G < 0) {
- LOG_E(PHY,"FATAL: ulsch_coding.c G < 0 (%d) : Q_RI %d, Q_CQI %d, O %d, betaCQI_times8 %d)\n",G,Q_RI,Q_CQI,ulsch->O,ulsch->beta_offset_cqi_times8);
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING, VCD_FUNCTION_OUT);
- return(-1);
- }
-
-
- // Data and control multiplexing (5.2.2.7 36-212)
-
- H = G + Q_CQI;
- Hprime = H/Q_m;
-
-
-
- // 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_ULSCH_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,
- Q_m,ulsch->harq_processes[harq_pid]->nb_rb);
-#endif
-
- start_meas(rm_stats);
- r_offset += lte_rate_matching_turbo(ulsch->harq_processes[harq_pid]->RTC[r],
- G,
- ulsch->harq_processes[harq_pid]->w[r],
- ulsch->e+r_offset,
- ulsch->harq_processes[harq_pid]->C, // C
- NSOFT, // Nsoft,
- 0, // this means UL
- 1,
- ulsch->harq_processes[harq_pid]->rvidx,
- get_Qm_ul(ulsch->harq_processes[harq_pid]->mcs),
- 1,
- r,
- ulsch->harq_processes[harq_pid]->nb_rb);
- //ulsch->harq_processes[harq_pid]->mcs); // r
- stop_meas(rm_stats);
-#ifdef DEBUG_ULSCH_CODING
-
- if (r==ulsch->harq_processes[harq_pid]->C-1)
- write_output("enc_output.m","enc",ulsch->e,r_offset,1,4);
-
-#endif
- }
- } else { //control-only PUSCH
- Q_CQI = (ulsch->harq_processes[harq_pid]->nb_rb * (12 * Q_m) * (ulsch->Nsymb_pusch)) - Q_RI;
- H = Q_CQI;
- Hprime = H/Q_m;
- }
-
-
- // Do CQI coding
- if ((ulsch->O>1) && (ulsch->O < 12)) {
- LOG_E(PHY,"short CQI sizes not supported yet\n");
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING, VCD_FUNCTION_OUT);
- return(-1);
- } else {
- // add 8-bit CRC
- crc = crc8(o_flip,
- ulsch->O)>>24;
-#ifdef DEBUG_ULSCH_CODING
- printf("crc(cqi) tx : %x\n",crc);
-#endif
- memset((void *)&ulsch->o_d[0],LTE_NULL,96);
-
- ccodelte_encode(ulsch->O,
- 1,
- o_flip,
- &ulsch->o_d[96],
- 0);
-
-
- o_RCC = sub_block_interleaving_cc(8+ulsch->O,
- &ulsch->o_d[96],
- ulsch->o_w);
-
- lte_rate_matching_cc(o_RCC,
- Q_CQI,
- ulsch->o_w,
- ulsch->q);
-
- }
-
- i=0;
-
- // Do RI coding
- if (ulsch->O_RI == 1) {
- switch (Q_m) {
- case 2:
- ulsch->q_RI[0] = ulsch->o_RI[0];
- ulsch->q_RI[1] = PUSCH_y;//ulsch->o_RI[0];
- len_RI=2;
- break;
-
- case 4:
- ulsch->q_RI[0] = ulsch->o_RI[0];
- ulsch->q_RI[1] = PUSCH_y;//1;
- ulsch->q_RI[2] = PUSCH_x;//ulsch->o_RI[0];
- ulsch->q_RI[3] = PUSCH_x;//1;
- len_RI=4;
- break;
-
- case 6:
- ulsch->q_RI[0] = ulsch->o_RI[0];
- ulsch->q_RI[1] = PUSCH_y;//1;
- ulsch->q_RI[2] = PUSCH_x;//1;
- ulsch->q_RI[3] = PUSCH_x;//ulsch->o_RI[0];
- ulsch->q_RI[4] = PUSCH_x;//1;
- ulsch->q_RI[5] = PUSCH_x;//1;
- len_RI=6;
- break;
- }
- } else if (ulsch->O_RI>1) {
- LOG_E(PHY,"RI cannot be more than 1 bit yet\n");
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING, VCD_FUNCTION_OUT);
- return(-1);
- }
-
- // Do ACK coding, Section 5.2.2.6 36.213 (p.23-24 in v8.6)
- wACK_idx = (ulsch->bundling==0) ? 4 : ((Nbundled-1)&3);
-#ifdef DEBUG_ULSCH_CODING
- printf("ulsch_coding.c: Bundling %d, Nbundled %d, wACK_idx %d\n",
- ulsch->bundling,Nbundled,wACK_idx);
-#endif
-
- // 1-bit ACK/NAK
- if (ulsch->harq_processes[harq_pid]->O_ACK == 1) {
- switch (Q_m) {
- case 2:
- ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
- ulsch->q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : ((ulsch->o_ACK[0]+wACK[wACK_idx][1])&1);//ulsch->o_ACK[0];
- len_ACK = 2;
- break;
-
- case 4:
- ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
- ulsch->q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : ((ulsch->o_ACK[0]+wACK[wACK_idx][1])&1);
- ulsch->q_ACK[2] = PUSCH_x;
- ulsch->q_ACK[3] = PUSCH_x;
- len_ACK = 4;
- break;
-
- case 6:
- ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
- ulsch->q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : ((ulsch->o_ACK[0]+wACK[wACK_idx][1])&1);
- ulsch->q_ACK[2] = PUSCH_x;
- ulsch->q_ACK[3] = PUSCH_x;
- ulsch->q_ACK[4] = PUSCH_x;
- ulsch->q_ACK[6] = PUSCH_x;
- len_ACK = 6;
- break;
- }
- }
-
- // two-bit ACK/NAK
- if (ulsch->harq_processes[harq_pid]->O_ACK == 2) {
- ack_parity = (ulsch->o_ACK[0]+ulsch->o_ACK[1])&1;
-
- switch (Q_m) {
- case 2:
- ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
- ulsch->q_ACK[1] = (ulsch->o_ACK[1]+wACK[wACK_idx][0])&1;
- ulsch->q_ACK[2] = (ack_parity+wACK[wACK_idx][0])&1;
- ulsch->q_ACK[3] = (ulsch->o_ACK[0]+wACK[wACK_idx][1])&1;
- ulsch->q_ACK[4] = (ulsch->o_ACK[1]+wACK[wACK_idx][1])&1;
- ulsch->q_ACK[5] = (ack_parity+wACK[wACK_idx][1])&1;
- len_ACK = 6;
- break;
-
- case 4:
- ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
- ulsch->q_ACK[1] = (ulsch->o_ACK[1]+wACK[wACK_idx][0])&1;
- ulsch->q_ACK[2] = PUSCH_x;
- ulsch->q_ACK[3] = PUSCH_x;//1;
- ulsch->q_ACK[4] = (ack_parity+wACK[wACK_idx][0])&1;
- ulsch->q_ACK[5] = (ulsch->o_ACK[0]+wACK[wACK_idx][1])&1;
- ulsch->q_ACK[6] = PUSCH_x;
- ulsch->q_ACK[7] = PUSCH_x;//1;
- ulsch->q_ACK[8] = (ulsch->o_ACK[1]+wACK[wACK_idx][1])&1;
- ulsch->q_ACK[9] = (ack_parity+wACK[wACK_idx][1])&1;
- ulsch->q_ACK[10] = PUSCH_x;
- ulsch->q_ACK[11] = PUSCH_x;//1;
- len_ACK = 12;
- break;
-
- case 6:
- ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
- ulsch->q_ACK[1] = (ulsch->o_ACK[1]+wACK[wACK_idx][0])&1;
- ulsch->q_ACK[2] = PUSCH_x;
- ulsch->q_ACK[3] = PUSCH_x;
- ulsch->q_ACK[4] = PUSCH_x;
- ulsch->q_ACK[5] = PUSCH_x;
-
- ulsch->q_ACK[6] = (ack_parity+wACK[wACK_idx][0])&1;
- ulsch->q_ACK[7] = (ulsch->o_ACK[0]+wACK[wACK_idx][1])&1;
- ulsch->q_ACK[8] = PUSCH_x;
- ulsch->q_ACK[9] = PUSCH_x;
- ulsch->q_ACK[10] = PUSCH_x;
- ulsch->q_ACK[11] = PUSCH_x;
-
- ulsch->q_ACK[12] = (ulsch->o_ACK[1]+wACK[wACK_idx][1])&1;
- ulsch->q_ACK[13] = (ack_parity+wACK[wACK_idx][1])&1;
- ulsch->q_ACK[14] = PUSCH_x;
- ulsch->q_ACK[15] = PUSCH_x;
- ulsch->q_ACK[16] = PUSCH_x;
- ulsch->q_ACK[17] = PUSCH_x;
- len_ACK = 18;
-
- break;
- }
- }
-
- if (ulsch->harq_processes[harq_pid]->O_ACK > 2) {
- LOG_E(PHY,"ACK cannot be more than 2 bits yet\n");
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING, VCD_FUNCTION_OUT);
- return(-1);
- }
-
-
- // channel multiplexing/interleaving
-
- start_meas(m_stats);
- Hpp = Hprime + Q_RI;
-
- Cmux = ulsch->Nsymb_pusch;
- Rmux = Hpp*Q_m/Cmux;
- Rmux_prime = Rmux/Q_m;
-
- Qprime_RI = Q_RI / Q_m;
- Qprime_ACK = Q_ACK / Q_m;
- Qprime_CQI = Q_CQI / Q_m;
-
- // printf("Qprime_CQI = %d\n",Qprime_CQI);
- // RI BITS
-
- memset(y,LTE_NULL,Q_m*Hpp);
-
- if (frame_parms->Ncp == 0)
- columnset = cs_ri_normal;
- else
- columnset = cs_ri_extended;
-
- j=0;
-
- for (i=0; i>2);
-
- for (q=0; qq_RI[(q+(Q_m*i))%len_RI];
- // printf("ri[%d] %d => y[%d]\n",q+(Q_m*i)%len_RI,ulsch->q_RI[(q+(Q_m*i))%len_RI],q+(Q_m*((r*Cmux) + columnset[j])),y[q+(Q_m*((r*Cmux) + columnset[j]))]);
- }
-
- j=(j+3)&3;
-
- }
-
-
- // CQI and Data bits
- j=0;
- /*
- for (i=0,iprime=-Qprime_CQI;iq[q+(Q_m*i)];
- //printf("cqi[%d] %d => y[%d]\n",q+(Q_m*i),ulsch->q[q+(Q_m*i)],q+(Q_m*j));
- }
- }
- else {
- for (q=0;qe[q+(Q_m*iprime)];
- // printf("e[%d] %d => y[%d]\n",q+(Q_m*iprime),ulsch->e[q+(Q_m*iprime)],q+(Q_m*j));
- }
- }
- j++;
- }
- */
-
- for (i=0; iq[q+(Q_m*i)];
- // printf("cqi[%d] %d => y[%d] (j %d)\n",q+(Q_m*i),ulsch->q[q+(Q_m*i)],q+(Q_m*j),j);
- }
-
- j++;
- }
-
- j2 = j*Q_m;
-
- switch (Q_m) {
-
- case 2:
-
- for (iprime=0; iprime<(Hprime-Qprime_CQI)<<1; iprime+=2) {
- while (y[j2] != LTE_NULL) j2+=2;
-
- y[j2] = ulsch->e[iprime];
- y[1+j2] = ulsch->e[1+iprime];
- j2+=2;
- }
-
- break;
-
- case 4:
- for (iprime=0; iprime<(Hprime-Qprime_CQI)<<2; iprime+=4) {
- while (y[j2] != LTE_NULL) j2+=4;
-
- y[j2] = ulsch->e[iprime];
- y[1+j2] = ulsch->e[1+iprime];
- y[2+j2] = ulsch->e[2+iprime];
- y[3+j2] = ulsch->e[3+iprime];
- j2+=4;
- }
-
- break;
-
- case 6:
- for (iprime=0; iprime<(Hprime-Qprime_CQI)*6; iprime+=6) {
- while (y[j2] != LTE_NULL) j2+=6;
-
- y[j2] = ulsch->e[iprime];
- y[1+j2] = ulsch->e[1+iprime];
- y[2+j2] = ulsch->e[2+iprime];
- y[3+j2] = ulsch->e[3+iprime];
- y[4+j2] = ulsch->e[4+iprime];
- y[5+j2] = ulsch->e[5+iprime];
- j2+=6;
- }
-
- break;
-
- }
-
- // HARQ-ACK Bits (Note these overwrite some bits)
-
- if (frame_parms->Ncp == 0)
- columnset = cs_ack_normal;
- else
- columnset = cs_ack_extended;
-
- j=0;
-
- for (i=0; i>2);
-
- for (q=0; q