From d0e2938baabf6abf52889dec662f1abef1bc8e56 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Fri, 24 Mar 2017 16:46:42 +0100 Subject: [PATCH 001/117] remove asn1 compilation fixes that went to asn1c (IMPORTANT: reinstall asn1c!) The files NativeInteger.c.diff and constr_SET_OF.c.diff from asn1c were generating compilation warnings. We had local patches applied on generated files by asn1c. A new version of asn1c has been pushed to https://gitlab.eurecom.fr/oai/asn1c (commit 224dc1f991b7e7ad705ce92e171b942f87b7b7e7) making obsolete the fixes we do here. So we now remove those fixes. ************************* * IMPORTANT BEGIN * ************************* Everyone should update their asn1c installation. The simplest is to do: source oaienv cd cmake_targets ./build_oai -I ************************* * IMPORTANT END * ************************* --- cmake_targets/tools/fix_asn1 | 10 +--------- .../fix_asn1.data/S1AP.rel10.5/NativeInteger.c.diff | 8 -------- .../fix_asn1.data/S1AP.rel10.5/constr_SET_OF.c.diff | 4 ---- .../fix_asn1.data/X2AP.rel11.2/NativeInteger.c.diff | 8 -------- .../fix_asn1.data/X2AP.rel11.2/constr_SET_OF.c.diff | 4 ---- 5 files changed, 1 insertion(+), 33 deletions(-) delete mode 100644 cmake_targets/tools/fix_asn1.data/S1AP.rel10.5/NativeInteger.c.diff delete mode 100644 cmake_targets/tools/fix_asn1.data/S1AP.rel10.5/constr_SET_OF.c.diff delete mode 100644 cmake_targets/tools/fix_asn1.data/X2AP.rel11.2/NativeInteger.c.diff delete mode 100644 cmake_targets/tools/fix_asn1.data/X2AP.rel11.2/constr_SET_OF.c.diff diff --git a/cmake_targets/tools/fix_asn1 b/cmake_targets/tools/fix_asn1 index 0661d7878d..6d55e1e9bc 100755 --- a/cmake_targets/tools/fix_asn1 +++ b/cmake_targets/tools/fix_asn1 @@ -9,13 +9,6 @@ RRC_Rel10=( X2AP_Rel11_2=( "X2ap-CriticalityDiagnostics-IE-List.h" ae96308b37fcbcbf39da5012e42968135fc5f27b "fix_asn1.data/X2AP.rel11.2/X2ap-CriticalityDiagnostics-IE-List.h.diff" - "NativeInteger.c" 1a55f5402fd363318cf5444ffe1f67530dcf66ff "fix_asn1.data/X2AP.rel11.2/NativeInteger.c.diff" - "constr_SET_OF.c" 808cbbdf19b118c0bdb04e3acf2cbe6e4133be2b "fix_asn1.data/X2AP.rel11.2/constr_SET_OF.c.diff" -) - -S1AP_Rel10_5=( - "NativeInteger.c" 1a55f5402fd363318cf5444ffe1f67530dcf66ff "fix_asn1.data/S1AP.rel10.5/NativeInteger.c.diff" - "constr_SET_OF.c" 808cbbdf19b118c0bdb04e3acf2cbe6e4133be2b "fix_asn1.data/S1AP.rel10.5/constr_SET_OF.c.diff" ) red_color="$(tput setaf 1)" @@ -130,8 +123,7 @@ function patch_s1ap() case "$version" in R10 ) - echo "patching S1AP files release 10.5" - apply_patches "$directory" S1AP_Rel10_5 ${#S1AP_Rel10_5[*]} + #nothing to do anymore (fixes went to asn1c) ;; * ) error unknwon/unhandled S1AP version \'"$version"\' diff --git a/cmake_targets/tools/fix_asn1.data/S1AP.rel10.5/NativeInteger.c.diff b/cmake_targets/tools/fix_asn1.data/S1AP.rel10.5/NativeInteger.c.diff deleted file mode 100644 index 3b51426ad3..0000000000 --- a/cmake_targets/tools/fix_asn1.data/S1AP.rel10.5/NativeInteger.c.diff +++ /dev/null @@ -1,8 +0,0 @@ -283c283 -< int dynamic = 0; ---- -> //int dynamic = 0; -290c290 -< dynamic = 1; ---- -> //dynamic = 1; diff --git a/cmake_targets/tools/fix_asn1.data/S1AP.rel10.5/constr_SET_OF.c.diff b/cmake_targets/tools/fix_asn1.data/S1AP.rel10.5/constr_SET_OF.c.diff deleted file mode 100644 index 3ceaf5e3e5..0000000000 --- a/cmake_targets/tools/fix_asn1.data/S1AP.rel10.5/constr_SET_OF.c.diff +++ /dev/null @@ -1,4 +0,0 @@ -1007c1007 -< (int)nelems, (int)ct ? ct->effective_bits : -1); ---- -> (int)nelems, ct ? ct->effective_bits : -1); diff --git a/cmake_targets/tools/fix_asn1.data/X2AP.rel11.2/NativeInteger.c.diff b/cmake_targets/tools/fix_asn1.data/X2AP.rel11.2/NativeInteger.c.diff deleted file mode 100644 index 3b51426ad3..0000000000 --- a/cmake_targets/tools/fix_asn1.data/X2AP.rel11.2/NativeInteger.c.diff +++ /dev/null @@ -1,8 +0,0 @@ -283c283 -< int dynamic = 0; ---- -> //int dynamic = 0; -290c290 -< dynamic = 1; ---- -> //dynamic = 1; diff --git a/cmake_targets/tools/fix_asn1.data/X2AP.rel11.2/constr_SET_OF.c.diff b/cmake_targets/tools/fix_asn1.data/X2AP.rel11.2/constr_SET_OF.c.diff deleted file mode 100644 index 3ceaf5e3e5..0000000000 --- a/cmake_targets/tools/fix_asn1.data/X2AP.rel11.2/constr_SET_OF.c.diff +++ /dev/null @@ -1,4 +0,0 @@ -1007c1007 -< (int)nelems, (int)ct ? ct->effective_bits : -1); ---- -> (int)nelems, ct ? ct->effective_bits : -1); From 45212d3b2fd22fdeec8e0062844eaff8de3039a0 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Tue, 8 Aug 2017 09:58:36 +0200 Subject: [PATCH 002/117] hotfix: protobuf-c compilation failure protobuf-c does not compile anymore. Let's handle this a bit better. We now install protobuf and protobuf-c only for the flexran agent. That is, if you want to use the flexran agent, you need to install protobuf/protobuf-c and you do it this way: ./build_oai -I -a (you add -a) Other targets don't need protobuf nor protobuf-c, so it's not installed by the -I command of build_oai, unless you pass -a with -I. Also, we now use protobuf 3.3.0, not 2.6.1. The code has been adapted, a quick test seems to indicate that the system works, but it has not been intensively tested. --- cmake_targets/build_oai | 5 +++++ cmake_targets/tools/build_helper | 14 ++++++++------ openair2/ENB_APP/MESSAGES/V2/config_common.proto | 2 +- openair2/ENB_APP/MESSAGES/V2/config_messages.proto | 2 +- .../ENB_APP/MESSAGES/V2/control_delegation.proto | 2 +- .../ENB_APP/MESSAGES/V2/controller_commands.proto | 1 + openair2/ENB_APP/MESSAGES/V2/flexran.proto | 4 ++-- openair2/ENB_APP/MESSAGES/V2/header.proto | 1 + openair2/ENB_APP/MESSAGES/V2/mac_primitives.proto | 1 + openair2/ENB_APP/MESSAGES/V2/stats_common.proto | 1 + openair2/ENB_APP/MESSAGES/V2/stats_messages.proto | 1 + openair2/ENB_APP/MESSAGES/V2/time_common.proto | 1 + 12 files changed, 24 insertions(+), 11 deletions(-) diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index 93a7ac073e..c0cd450757 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -448,6 +448,11 @@ function main() { flash_firmware_bladerf fi fi + if [ "$FLEXRAN_AGENT" == "1" ] ; then + echo_info "installing protobuf/protobuf-c for flexran agent support" + install_protobuf_from_source + install_protobuf_c_from_source + fi fi if [ "$INSTALL_OPTIONAL" = "1" ] ; then diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index a57040449c..6c16666963 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -184,10 +184,14 @@ install_protobuf_from_source(){ ( cd /tmp echo "Downloading protobuf" - rm -rf /tmp/protobuf-2.6.1.tar.gz* /tmp/protobuf-2.6.1 - wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz - tar -xzvf protobuf-2.6.1.tar.gz --owner $USER --group $USER --no-same-owner - cd protobuf-2.6.1/ + #rm -rf /tmp/protobuf-2.6.1.tar.gz* /tmp/protobuf-2.6.1 + #wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz + #tar -xzvf protobuf-2.6.1.tar.gz --owner $USER --group $USER --no-same-owner + #cd protobuf-2.6.1/ + rm -rf /tmp/protobuf-cpp-3.3.0.tar.gz* /tmp/protobuf-3.3.0 + wget https://github.com/google/protobuf/releases/download/v3.3.0/protobuf-cpp-3.3.0.tar.gz + tar -xzvf protobuf-cpp-3.3.0.tar.gz --owner $USER --group $USER --no-same-owner + cd protobuf-3.3.0/ ./configure echo "Compiling protobuf" make -j`nproc` @@ -410,8 +414,6 @@ check_install_oai_software() { install_asn1c_from_source $SUDO rm -fr /opt/ssh $SUDO git clone https://gist.github.com/2190472.git /opt/ssh - install_protobuf_from_source - install_protobuf_c_from_source } ### Remove Nettle installation which was done from sources diff --git a/openair2/ENB_APP/MESSAGES/V2/config_common.proto b/openair2/ENB_APP/MESSAGES/V2/config_common.proto index 51ae711277..7b392b6b3b 100644 --- a/openair2/ENB_APP/MESSAGES/V2/config_common.proto +++ b/openair2/ENB_APP/MESSAGES/V2/config_common.proto @@ -1,4 +1,4 @@ -//'syntax = "proto2";' +syntax = "proto2"; package protocol; // diff --git a/openair2/ENB_APP/MESSAGES/V2/config_messages.proto b/openair2/ENB_APP/MESSAGES/V2/config_messages.proto index 441e193569..ac939b828c 100644 --- a/openair2/ENB_APP/MESSAGES/V2/config_messages.proto +++ b/openair2/ENB_APP/MESSAGES/V2/config_messages.proto @@ -1,4 +1,4 @@ -//'syntax = "proto2";' +syntax = "proto2"; package protocol; import "config_common.proto"; diff --git a/openair2/ENB_APP/MESSAGES/V2/control_delegation.proto b/openair2/ENB_APP/MESSAGES/V2/control_delegation.proto index 3a5efaf7d4..0f7e34de15 100644 --- a/openair2/ENB_APP/MESSAGES/V2/control_delegation.proto +++ b/openair2/ENB_APP/MESSAGES/V2/control_delegation.proto @@ -1,4 +1,4 @@ -//'syntax = "proto2";' +syntax = "proto2"; package protocol; enum flex_control_delegation_type { diff --git a/openair2/ENB_APP/MESSAGES/V2/controller_commands.proto b/openair2/ENB_APP/MESSAGES/V2/controller_commands.proto index cbec332b30..c92f171b0e 100644 --- a/openair2/ENB_APP/MESSAGES/V2/controller_commands.proto +++ b/openair2/ENB_APP/MESSAGES/V2/controller_commands.proto @@ -1,3 +1,4 @@ +syntax = "proto2"; package protocol; import "mac_primitives.proto"; diff --git a/openair2/ENB_APP/MESSAGES/V2/flexran.proto b/openair2/ENB_APP/MESSAGES/V2/flexran.proto index 3a1d40bca6..8c0c300efe 100644 --- a/openair2/ENB_APP/MESSAGES/V2/flexran.proto +++ b/openair2/ENB_APP/MESSAGES/V2/flexran.proto @@ -1,4 +1,4 @@ -//'syntax = "proto2";' +syntax = "proto2"; package protocol; import "stats_messages.proto"; @@ -40,7 +40,7 @@ enum flexran_direction { } enum flexran_err { - option allow_alias = true; + //option allow_alias = true; // message errors NO_ERR = 0; MSG_DEQUEUING = -1; diff --git a/openair2/ENB_APP/MESSAGES/V2/header.proto b/openair2/ENB_APP/MESSAGES/V2/header.proto index dfd5ea6c99..939429f51f 100644 --- a/openair2/ENB_APP/MESSAGES/V2/header.proto +++ b/openair2/ENB_APP/MESSAGES/V2/header.proto @@ -1,3 +1,4 @@ +syntax = "proto2"; package protocol; message flex_header { diff --git a/openair2/ENB_APP/MESSAGES/V2/mac_primitives.proto b/openair2/ENB_APP/MESSAGES/V2/mac_primitives.proto index be7c72ab7b..89b8f0e380 100644 --- a/openair2/ENB_APP/MESSAGES/V2/mac_primitives.proto +++ b/openair2/ENB_APP/MESSAGES/V2/mac_primitives.proto @@ -1,3 +1,4 @@ +syntax = "proto2"; package protocol; // diff --git a/openair2/ENB_APP/MESSAGES/V2/stats_common.proto b/openair2/ENB_APP/MESSAGES/V2/stats_common.proto index 080883ea97..fa985bf9cc 100644 --- a/openair2/ENB_APP/MESSAGES/V2/stats_common.proto +++ b/openair2/ENB_APP/MESSAGES/V2/stats_common.proto @@ -1,3 +1,4 @@ +syntax = "proto2"; package protocol; // diff --git a/openair2/ENB_APP/MESSAGES/V2/stats_messages.proto b/openair2/ENB_APP/MESSAGES/V2/stats_messages.proto index 1b1567dda1..d8c0651fa1 100644 --- a/openair2/ENB_APP/MESSAGES/V2/stats_messages.proto +++ b/openair2/ENB_APP/MESSAGES/V2/stats_messages.proto @@ -1,3 +1,4 @@ +syntax = "proto2"; package protocol; //import "header.proto"; diff --git a/openair2/ENB_APP/MESSAGES/V2/time_common.proto b/openair2/ENB_APP/MESSAGES/V2/time_common.proto index 30a56bb776..8bd2497443 100644 --- a/openair2/ENB_APP/MESSAGES/V2/time_common.proto +++ b/openair2/ENB_APP/MESSAGES/V2/time_common.proto @@ -1,3 +1,4 @@ +syntax = "proto2"; package protocol; enum flex_harq_status { From 55f0fc30bf92f7d042c10faa6b2849588f5965f5 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Thu, 19 Oct 2017 10:16:34 +0200 Subject: [PATCH 003/117] new config files --- .../CONF/enb.band38.tm1.100PRB.usrpx310.conf | 175 ++++++++++++++++++ .../CONF/enb.band38.tm1.usrpx310.conf | 175 ++++++++++++++++++ 2 files changed, 350 insertions(+) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.100PRB.usrpx310.conf create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.usrpx310.conf diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.100PRB.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.100PRB.usrpx310.conf new file mode 100644 index 0000000000..38e471ac54 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.100PRB.usrpx310.conf @@ -0,0 +1,175 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + mobile_network_code = "92"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "TDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 38; + downlink_frequency = 2600000000L; + uplink_frequency_offset = 0; + Nid_cell = 0; + N_RB_DL = 100; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 32; + rx_gain = 116; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -16; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -108; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 1; + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.26"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + log_config : + { + global_log_level ="debug"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.usrpx310.conf new file mode 100644 index 0000000000..2c11ea3187 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.usrpx310.conf @@ -0,0 +1,175 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + mobile_network_code = "92"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "TDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 38; + downlink_frequency = 2600000000L; + uplink_frequency_offset = 0; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 32; + rx_gain = 116; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -16; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -108; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 1; + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.26"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + log_config : + { + global_log_level ="debug"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + + } +); From 4989c0f03022a222ede147d3ce6193488c98d089 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Thu, 19 Oct 2017 17:55:39 +0200 Subject: [PATCH 004/117] fix for TDD: TX is powered on a few samples earlier to allow it to settle before start of DL --- targets/RT/USER/lte-enb.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 30a203dd02..50f40e38cc 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -948,12 +948,11 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { lte_subframe_t SF_type = subframe_select(fp,(proc->subframe_rx+tx_sfoffset)%10); lte_subframe_t prevSF_type = subframe_select(fp,(proc->subframe_rx+tx_sfoffset+9)%10); lte_subframe_t nextSF_type = subframe_select(fp,(proc->subframe_rx+tx_sfoffset+1)%10); + int sf_extension = 0; + if ((SF_type == SF_DL) || (SF_type == SF_S)) { - for (i=0; inb_antennas_tx; i++) - txp[i] = (void*)&eNB->common_vars.txdata[0][i][((proc->subframe_rx+tx_sfoffset)%10)*fp->samples_per_tti]; - int siglen=fp->samples_per_tti,flags=1; if (SF_type == SF_S) { @@ -962,22 +961,29 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { } if ((fp->frame_type == TDD) && (SF_type == SF_DL)&& - (prevSF_type == SF_UL) && - (nextSF_type == SF_DL)) + (prevSF_type == SF_UL) && + (nextSF_type == SF_DL)) { flags = 2; // start of burst - + //sf_extension = eNB->N_TA_offset<<1; + } if ((fp->frame_type == TDD) && (SF_type == SF_DL)&& (prevSF_type == SF_UL) && - (nextSF_type == SF_UL)) + (nextSF_type == SF_UL)) { flags = 4; // start of burst and end of burst (only one DL SF between two UL) + //sf_extension = eNB->N_TA_offset<<1; + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_WRITE_FLAGS,flags); + + for (i=0; inb_antennas_tx; i++) + txp[i] = (void*)&eNB->common_vars.txdata[0][i][((proc->subframe_rx+tx_sfoffset)%10)*fp->samples_per_tti-sf_extension]; + txs = eNB->rfdevice.trx_write_func(&eNB->rfdevice, - proc->timestamp_rx+eNB->ts_offset+(tx_sfoffset*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance, + proc->timestamp_rx+eNB->ts_offset+(tx_sfoffset*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance-sf_extension, txp, - siglen, + siglen+sf_extension, fp->nb_antennas_tx, flags); clock_gettime( CLOCK_MONOTONIC, &end_rf); @@ -991,7 +997,7 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { - if (txs != siglen) { + if (txs != siglen+sf_extension) { LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, fp->samples_per_tti); exit_fun( "problem transmitting samples" ); } From 67df8e0e7b46200b2ee43a2705def3340ddfd719 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Mon, 23 Oct 2017 16:42:54 +0200 Subject: [PATCH 005/117] fix to previous commit --- targets/RT/USER/lte-enb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 50f40e38cc..86e11d0fd1 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -964,14 +964,14 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { (prevSF_type == SF_UL) && (nextSF_type == SF_DL)) { flags = 2; // start of burst - //sf_extension = eNB->N_TA_offset<<1; + sf_extension = eNB->N_TA_offset<<1; } if ((fp->frame_type == TDD) && (SF_type == SF_DL)&& (prevSF_type == SF_UL) && (nextSF_type == SF_UL)) { flags = 4; // start of burst and end of burst (only one DL SF between two UL) - //sf_extension = eNB->N_TA_offset<<1; + sf_extension = eNB->N_TA_offset<<1; } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); From 261b586e26b3227d6bd3695c627071d903633fb8 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Mon, 3 Sep 2018 11:06:30 +0200 Subject: [PATCH 006/117] Time domain alloc type DLSCH --- .../nfapi/public_inc/nfapi_nr_interface.h | 16 +- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 31 ++++ openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 35 +++++ openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c | 75 +++++++++ openair1/PHY/defs_gNB.h | 145 +++++++++++++++++- openair1/SCHED_NR/phy_procedures_nr_common.c | 2 + targets/RT/USER/nr-softmodem.c | 4 +- 7 files changed, 301 insertions(+), 7 deletions(-) create mode 100644 openair1/PHY/NR_TRANSPORT/nr_dlsch.c create mode 100644 openair1/PHY/NR_TRANSPORT/nr_dlsch.h create mode 100644 openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c 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 b195b69f38..5b687e46e6 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h @@ -278,6 +278,13 @@ typedef enum { NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC } nfapi_nr_search_space_type_e; +typedef enum { + NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_0=0, + NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_0A, + NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_1, + NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_2 +} nfapi_nr_common_search_space_type_e; + typedef enum { NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1=0, NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE2, @@ -299,6 +306,12 @@ typedef enum { NFAPI_NR_CSET_ALL_CONTIGUOUS_RBS } nfapi_nr_coreset_precoder_granularity_type_e; +typedef enum { + NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A=0, + NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_B, + NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_C +} nfapi_nr_pdsch_time_domain_alloc_type_e; + // P7 Sub Structures typedef struct { @@ -406,7 +419,8 @@ typedef struct { uint8_t rnti_type; uint8_t dci_format; uint8_t config_type; - uint8_t search_space_type; + uint8_t search_space_type; + uint8_t common_search_space_type; uint8_t aggregation_level; uint8_t n_rb; uint8_t n_symb; diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c new file mode 100644 index 0000000000..5171527d87 --- /dev/null +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -0,0 +1,31 @@ +/* + * 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 +*/ diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h new file mode 100644 index 0000000000..1125a33c1a --- /dev/null +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -0,0 +1,35 @@ +/* + * 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/defs.h +* \brief data structures for PDSCH/DLSCH/PUSCH/ULSCH physical and transport channel descriptors (TX/RX) +* \author R. Knopp +* \date 2011 +* \version 0.1 +* \company Eurecom +* \email: raymond.knopp@eurecom.fr, florian.kaltenberger@eurecom.fr, oscar.tonelli@yahoo.it +* \note +* \warning +*/ + +#include "PHY/defs_gNB.h" + + diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c new file mode 100644 index 0000000000..0e143db019 --- /dev/null +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c @@ -0,0 +1,75 @@ +/* + * 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 "nr_dlsch.h" + +void nr_get_time_domain_allocation_type(nfapi_nr_config_request_t config, + NR_gNB_DCI_ALLOC_t dci_alloc, + NR_gNB_DLSCH_t* dlsch) { + + nfapi_nr_ssb_and_cset_mux_pattern_type_e mux_pattern = dci_alloc.mux_pattern; + + switch(dci_alloc.rnti_type) { + + case NFAPI_NR_RNTI_SI: + AssertFatal(dci_alloc.pdcch_params.common_search_space_type == NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_0, + "Invalid common search space type %d for SI RNTI, expected %d\n", + dci_alloc.pdcch_params.common_search_space_type, NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_0); + dlsch->time_alloc_type = (mux_pattern == NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1)?NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A : + (mux_pattern == NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE2)?NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_B : + (mux_pattern == NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE3)?NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_C; + break; + + case NFAPI_NR_RNTI_RA: + case NFAPI_NR_RNTI_TC: + /*AssertFatal(dci_alloc.pdcch_params.common_search_space_type == NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_1, + "Invalid common search space type %d for RNTI %d, expected %d\n",dci_alloc.pdcch_params.common_search_space_type, + NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_1, dci_alloc.rnti_type);*/ + if (!dlsch->time_alloc_list_flag) + dlsch->time_alloc_type = NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A; + break; + + case NFAPI_NR_RNTI_P: + break; + + case NFAPI_NR_RNTI_C: + case NFAPI_NR_RNTI_CS: + if () + break; + + case + + + } +} + + diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 116e940c71..9c36535a94 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -64,6 +64,143 @@ typedef struct { NR_gNB_DCI_ALLOC_t dci_alloc[256]; } NR_gNB_PDCCH; + +typedef struct { +/* /// Status Flag indicating for this DLSCH (idle,active,disabled) + //SCH_status_t status; + /// Transport block size + uint32_t TBS; + /// pointer to pdu from MAC interface (this is "a" in 36.212) + uint8_t *pdu; + /// The payload + CRC size in bits, "B" from 36-212 + uint32_t B; + /// Pointer to the payload + uint8_t *b; + /// Pointers to transport block segments + uint8_t *c[MAX_NUM_DLSCH_SEGMENTS]; + /// RTC values for each segment (for definition see 36-212 V8.6 2009-03, p.15) + uint32_t RTC[MAX_NUM_DLSCH_SEGMENTS]; + /// Frame where current HARQ round was sent + uint32_t frame; + /// Subframe where current HARQ round was sent + uint32_t subframe; + /// Index of current HARQ round for this DLSCH + uint8_t round; + /// Modulation order + uint8_t Qm; + /// MCS + uint8_t mcs; + /// Redundancy-version of the current sub-frame + uint8_t rvidx; + /// MIMO mode for this DLSCH + MIMO_mode_t mimo_mode; + /// Current RB allocation + uint32_t rb_alloc[4]; + /// distributed/localized flag + vrb_t vrb_type; + /// Current subband PMI allocation + uint16_t pmi_alloc; + /// Current subband RI allocation + uint32_t ri_alloc; + /// Current subband CQI1 allocation + uint32_t cqi_alloc1; + /// Current subband CQI2 allocation + uint32_t cqi_alloc2; + /// Current Number of RBs + uint16_t nb_rb; + /// Current NDI + uint8_t ndi; + /// downlink power offset field + uint8_t dl_power_off; + /// start symbold of pdsch + uint8_t pdsch_start; + /// Concatenated "e"-sequences (for definition see 36-212 V8.6 2009-03, p.17-18) + uint8_t e[MAX_NUM_CHANNEL_BITS] __attribute__((aligned(32))); + /// Turbo-code outputs (36-212 V8.6 2009-03, p.12 + uint8_t *d[MAX_NUM_DLSCH_SEGMENTS];//[(96+3+(3*6144))]; + /// Sub-block interleaver outputs (36-212 V8.6 2009-03, p.16-17) + uint8_t w[MAX_NUM_DLSCH_SEGMENTS][3*6144]; + /// Number of code segments (for definition see 36-212 V8.6 2009-03, p.9) + uint32_t C; + /// Number of "small" code segments (for definition see 36-212 V8.6 2009-03, p.10) + uint32_t Cminus; + /// Number of "large" code segments (for definition see 36-212 V8.6 2009-03, p.10) + uint32_t Cplus; + /// Number of bits in "small" code segments (<6144) (for definition see 36-212 V8.6 2009-03, p.10) + uint32_t Kminus; + /// Number of bits in "large" code segments (<6144) (for definition see 36-212 V8.6 2009-03, p.10) + uint32_t Kplus; + /// Number of "Filler" bits (for definition see 36-212 V8.6 2009-03, p.10) + uint32_t F; + /// Number of MIMO layers (streams) (for definition see 36-212 V8.6 2009-03, p.17, TM3-4) + uint8_t Nl; + /// Number of layers for this PDSCH transmission (TM8-10) + uint8_t Nlayers; + /// First layer for this PSCH transmission + uint8_t first_layer; + /// codeword this transport block is mapped to + uint8_t codeword;*/ +} NR_DL_gNB_HARQ_t; + + +typedef struct { + + /// Pointers to 8 HARQ processes for the DLSCH + LTE_DL_eNB_HARQ_t *harq_processes[8]; + nfapi_nr_pdsch_time_domain_alloc_type_e time_alloc_type; + uint8_t time_alloc_list_flag; + + +//LTE remainders to be removed +/* /// TX buffers for UE-spec transmission (antenna ports 5 or 7..14, prior to precoding) + int32_t *txdataF[8]; + /// beamforming weights for UE-spec transmission (antenna ports 5 or 7..14), for each codeword, maximum 4 layers? + int32_t **ue_spec_bf_weights[4]; + /// dl channel estimates (estimated from ul channel estimates) + int32_t **calib_dl_ch_estimates; + /// Allocated RNTI (0 means DLSCH_t is not currently used) + uint16_t rnti; + /// Active flag for baseband transmitter processing + uint8_t active; + /// HARQ process mask, indicates which processes are currently active + uint16_t harq_mask; + /// Indicator of TX activation per subframe. Used during PUCCH detection for ACK/NAK. + uint8_t subframe_tx[10]; + /// First CCE of last PDSCH scheduling per subframe. Again used during PUCCH detection for ACK/NAK. + uint8_t nCCE[10]; + /// Process ID's per subframe. Used to associate received ACKs on PUSCH/PUCCH to DLSCH harq process ids + uint8_t harq_ids[10]; + /// Window size (in outgoing transport blocks) for fine-grain rate adaptation + uint8_t ra_window_size; + /// First-round error threshold for fine-grain rate adaptation + uint8_t error_threshold; + + /// Number of soft channel bits + uint32_t G; + /// Codebook index for this dlsch (0,1,2,3) + uint8_t codebook_index; + /// Maximum number of HARQ processes (for definition see 36-212 V8.6 2009-03, p.17) + uint8_t Mdlharq; + /// Maximum number of HARQ rounds + uint8_t Mlimit; + /// MIMO transmission mode indicator for this sub-frame (for definition see 36-212 V8.6 2009-03, p.17) + uint8_t Kmimo; + /// Nsoft parameter related to UE Category + uint32_t Nsoft; + /// amplitude of PDSCH (compared to RS) in symbols without pilots + int16_t sqrt_rho_a; + /// amplitude of PDSCH (compared to RS) in symbols containing pilots + int16_t sqrt_rho_b; +#ifdef Rel14 + /// indicator that this DLSCH corresponds to SIB1-BR, needed for c_init for scrambling + uint8_t sib1_br_flag; + /// initial absolute subframe (see 36.211 Section 6.3.1), needed for c_init for scrambling + uint16_t i0; + CEmode_t CEmode; +#endif*/ +} NR_gNB_DLSCH_t; + + typedef struct { /// \brief Pointers (dynamic) to the received data in the time domain. /// - first index: rx antenna [0..nb_antennas_rx[ @@ -295,11 +432,11 @@ typedef struct PHY_VARS_gNB_s { LTE_eNB_SRS srs_vars[NUMBER_OF_UE_MAX]; LTE_eNB_PUSCH *pusch_vars[NUMBER_OF_UE_MAX]; LTE_eNB_PRACH prach_vars; - LTE_eNB_DLSCH_t *dlsch[NUMBER_OF_UE_MAX][2]; // Nusers times two spatial streams + NR_gNB_DLSCH_t *dlsch[NUMBER_OF_UE_MAX][2]; // Nusers times two spatial streams LTE_eNB_ULSCH_t *ulsch[NUMBER_OF_UE_MAX+1]; // Nusers + number of RA - LTE_eNB_DLSCH_t *dlsch_SI,*dlsch_ra,*dlsch_p; - LTE_eNB_DLSCH_t *dlsch_MCH; - LTE_eNB_DLSCH_t *dlsch_PCH; + NR_gNB_DLSCH_t *dlsch_SI,*dlsch_ra,*dlsch_p; + NR_gNB_DLSCH_t *dlsch_MCH; + NR_gNB_DLSCH_t *dlsch_PCH; LTE_eNB_UE_stats UE_stats[NUMBER_OF_UE_MAX]; LTE_eNB_UE_stats *UE_stats_ptr[NUMBER_OF_UE_MAX]; diff --git a/openair1/SCHED_NR/phy_procedures_nr_common.c b/openair1/SCHED_NR/phy_procedures_nr_common.c index ad73457cb3..44f56a22b0 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_common.c +++ b/openair1/SCHED_NR/phy_procedures_nr_common.c @@ -166,6 +166,8 @@ void nr_configure_css_dci_from_mib(nfapi_nr_dl_config_pdcch_parameters_rel15_t* AssertFatal(1==0, "Invalid SSB and coreset multiplexing pattern %d\n", pdcch_params->mux_pattern); } pdcch_params->config_type = NFAPI_NR_CSET_CONFIG_MIB_SIB1; + pdcch_params->search_space_type = NFAPI_NR_SEARCH_SPACE_TYPE_COMMON; + pdcch_params->common_search_space_type = NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_0; pdcch_params->cr_mapping_type = NFAPI_NR_CCE_REG_MAPPING_INTERLEAVED; pdcch_params->precoder_granularity = NFAPI_NR_CSET_SAME_AS_REG_BUNDLE; pdcch_params->reg_bundle_size = 6; diff --git a/targets/RT/USER/nr-softmodem.c b/targets/RT/USER/nr-softmodem.c index 992ca65981..57d5c30d15 100644 --- a/targets/RT/USER/nr-softmodem.c +++ b/targets/RT/USER/nr-softmodem.c @@ -351,11 +351,11 @@ void reset_stats(FL_OBJECT *button, long arg) for (i=0; idlsch[i][0]->Mlimit; j++) { +/* for (j=0; jdlsch[i][0]->Mlimit; j++) { phy_vars_gNB->UE_stats[i].dlsch_NAK[k][j]=0; phy_vars_gNB->UE_stats[i].dlsch_ACK[k][j]=0; phy_vars_gNB->UE_stats[i].dlsch_trials[k][j]=0; - } + }*/ phy_vars_gNB->UE_stats[i].dlsch_l2_errors[k]=0; phy_vars_gNB->UE_stats[i].ulsch_errors[k]=0; From 645a0a61e71fd578d38d87d6d14834492ebb233a Mon Sep 17 00:00:00 2001 From: ISIP CS/NCTU Date: Wed, 5 Sep 2018 14:07:21 +0200 Subject: [PATCH 007/117] add 256QAM & dmrs_pdsch --- openair1/PHY/INIT/nr_init.c | 15 +++ openair1/PHY/NR_REFSIG/nr_gen_mod_table.m | 110 +++++++++++++++++++++- openair1/PHY/NR_REFSIG/nr_gold.c | 28 ++++++ openair1/PHY/NR_REFSIG/nr_mod_table.h | 7 +- openair1/PHY/NR_REFSIG/nr_refsig.h | 2 +- openair1/PHY/defs_gNB.h | 3 + openair1/PHY/defs_nr_common.h | 3 + 7 files changed, 163 insertions(+), 5 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index e736f356db..8c2b4ec8bd 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -139,6 +139,21 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, nr_init_pdcch_dmrs(gNB, cfg->sch_config.physical_cell_id.value); + + //PDSCH DMRS init + gNB->nr_gold_pdsch_dmrs = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t**)); + uint32_t ***pdsch_dmrs = gNB->nr_gold_pdsch_dmrs; + for (int slot=0; slotslots_per_frame; slot++) { + pdsch_dmrs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t*)); + AssertFatal(pdsch_dmrs[slot]!=NULL, "NR init: pdsch_dmrs for slot %d - malloc failed\n", slot); + for (int symb=0; symbsymbols_per_slot; symb++){ + pdsch_dmrs[slot][symb] = (uint32_t *)malloc16(NR_MAX_PDSCH_DMRS_INIT_LENGTH_DWORD*sizeof(uint32_t)); + AssertFatal(pdsch_dmrs[slot][symb]!=NULL, "NR init: pdsch_dmrs for slot %d symbol %d - malloc failed\n", slot, symb); + } + } + + nr_init_pdsch_dmrs(gNB, cfg->sch_config.physical_cell_id.value); + /* lte_gold(fp,gNB->lte_gold_table,fp->Nid_cell); generate_pcfich_reg_mapping(fp); diff --git a/openair1/PHY/NR_REFSIG/nr_gen_mod_table.m b/openair1/PHY/NR_REFSIG/nr_gen_mod_table.m index a081ad1baa..60cf6d34e8 100644 --- a/openair1/PHY/NR_REFSIG/nr_gen_mod_table.m +++ b/openair1/PHY/NR_REFSIG/nr_gen_mod_table.m @@ -9,6 +9,30 @@ BPSK = 23170; % Amplitude for QPSK (\f$ 2^15 \times 1/\sqrt{2}\f$) QPSK = 23170; + +% First Amplitude for QAM16 (\f$ 2^15 \times 2/\sqrt{10}\f$) +QAM16_n1 = 20724; +% Second Amplitude for QAM16 (\f$ 2^15 \times 1/\sqrt{10}\f$) +QAM16_n2 = 10362; + +% First Amplitude for QAM64 (\f$ 2^15 \times 4/\sqrt{42}\f$) +QAM64_n1 = 20225; +% Second Amplitude for QAM64 (\f$ 2^15 \times 2/\sqrt{42}\f$) +QAM64_n2 = 10112; +% Third Amplitude for QAM64 (\f$ 2^15 \times 1/\sqrt{42}\f$) +QAM64_n3 = 5056; + + +% First Amplitude for QAM256 (\f$ 2^15 \times 8/\sqrt{170}\f$) +QAM256_n1 = 20105; +% Second Amplitude for QAM256 (\f$ 2^15 \times 4/\sqrt{170}\f$) +QAM256_n2 = 10052; +% Third Amplitude for QAM256 (\f$ 2^15 \times 2/\sqrt{170}\f$) +QAM256_n3 = 5026; +% Third Amplitude for QAM256 (\f$ 2^15 \times 1/\sqrt{170}\f$) +QAM256_n4 = 2513; + + % BPSK for b = 0:1 bpsk_table(b+1) = (1 - 2*b)*BPSK + 1j*(1-2*b)*BPSK; @@ -17,12 +41,91 @@ end %% QPSK for r=0:1 %0 -- 1 LS for j=0:1 %0 -- 1 MS + %% Formula is dispalayed + qpsk_table(2*r+j+1) = ((1-r*2)*QPSK + 1j*(1-2*j)*QPSK); end end -table = [ 0; bpsk_table(:); qpsk_table(:) ]; +%% QAM16 + for a=-1:2:1 + for b=-1:2:1 + index = (1+a) + (1+b)/2; + qam16_table(index+1) = -a*(QAM16_n1 + (b*QAM16_n2)); + end + end +for b0=0:1 +for b1=0:1 +for b2=0:1 +for b3=0:1 +qam16_table2(b0*8+b1*4+b2*2+b3*1+1) = qam16_table(b0*2+b2*1+1) + 1j*qam16_table(b1*2+b3*1+1); +end +end +end +end + + +%% QAM64 + for a=-1:2:1 + for b=-1:2:1 + for c=-1:2:1 + index = (1+a)*2 + (1+b) + (1+c)/2; + qam64_table(index+1) = -a*(QAM64_n1 + b*(QAM64_n2 + (c*QAM64_n3))); + end + end + end + +for b0=0:1 +for b1=0:1 +for b2=0:1 +for b3=0:1 +for b4=0:1 +for b5=0:1 +qam64_table2(b0*32+b1*16+b2*8+b3*4+b4*2+b5*1+1) = qam64_table(b0*4+b2*2+b4*1+1) + 1j*qam64_table(b1*4+b3*2+b5*1+1); +end +end +end +end +end +end + + +%%256QAM +%% QAM256 ******************************************************************************************* + for a=-1:2:1 + for b=-1:2:1 + for c=-1:2:1 + for d = -1:2:1 + + index = (1+a)*4 + (1+b)*2 + (1+c)+(1+d)/2; + qam256_table(index+1) = -a*(QAM256_n1 + b*(QAM256_n2 + (c*(QAM256_n3+d*QAM256_n4)))); + end + end + end +end +for b0=0:1 +for b1=0:1 +for b2=0:1 +for b3=0:1 +for b4=0:1 +for b5=0:1 +for b6=0:1 +for b7=0:1 + +%%qam64_table2(b0*32+b1*16+b2*8+b3*4+b4*2+b5*1+1) = qam64_table(b0*4+b2*2+b4*1+1) + 1j*qam64_table(b1*4+b3*2+b5*1+1); +qam256_table2(b0*128+b1*64+b2*32+b3*16+b4*8+b5*4+b6*2+b7*1+1) = qam256_table(b0*8+b2*4+b4*2+b6*1+1) + 1j*qam256_table(b1*8+b3*4+b5*2+b7*1+1); +end +end +end +end +end +end +end +end + +table = [ 0; bpsk_table(:); qpsk_table(:);qam16_table2(:); qam64_table2(:);qam256_table2(:) ]; +scatter (real(qam256_table2), imag(qam256_table2), 'x'); save mod_table.mat table table2 = zeros(1,length(table)*2); @@ -33,7 +136,10 @@ fd = fopen("nr_mod_table.h","w"); fprintf(fd,"#define NR_MOD_TABLE_SIZE_SHORT %d\n", length(table)*2); fprintf(fd,"#define NR_MOD_TABLE_BPSK_OFFSET %d\n", 1); fprintf(fd,"#define NR_MOD_TABLE_QPSK_OFFSET %d\n", 3); +fprintf(fd,"#define NR_MOD_TABLE_QAM16_OFFSET %d\n", 7); +fprintf(fd,"#define NR_MOD_TABLE_QAM64_OFFSET %d\n", 23); +fprintf(fd,"#define NR_MOD_TABLE_QAM256_OFFSET %d\n", 87); fprintf(fd,"short nr_mod_table[MOD_TABLE_SIZE_SHORT] = {"); fprintf(fd,"%d,",table2(1:end-1)); fprintf(fd,"%d};\n",table2(end)); -fclose(fd); +fclose(fd); \ No newline at end of file diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c index b8197744ec..c49d11d747 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold.c +++ b/openair1/PHY/NR_REFSIG/nr_gold.c @@ -75,3 +75,31 @@ void nr_init_pdcch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid) } } + + +void nr_init_pdsch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid) +{ + + uint32_t x1, x2; + uint8_t reset; + int Nscid; + NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; + uint32_t ***pdsch_dmrs = gNB->nr_gold_pdsch_dmrs; + //x2 compute by 38.211 7.4.1.1.1 + Nscid = 0; + for (uint8_t slot=0; slotslots_per_frame; slot++) { + for (uint8_t symb=0; symbsymbols_per_slot; symb++) { + + reset = 1; + x2 = ((1<<17) * (slot*symb*slot+symb+1) * (Nid+1) *((Nid<<1)+Nscid))&(((uint32_t)1<<31)-1); + printf("x2 = %d\n",x2); + for (uint32_t n=0; n Date: Thu, 6 Sep 2018 15:41:08 +0200 Subject: [PATCH 008/117] check dmrs for pdsch --- openair1/PHY/NR_REFSIG/nr_gold.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c index c49d11d747..151d357704 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold.c +++ b/openair1/PHY/NR_REFSIG/nr_gold.c @@ -91,15 +91,12 @@ void nr_init_pdsch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid) for (uint8_t symb=0; symbsymbols_per_slot; symb++) { reset = 1; - x2 = ((1<<17) * (slot*symb*slot+symb+1) * (Nid+1) *((Nid<<1)+Nscid))&(((uint32_t)1<<31)-1); - printf("x2 = %d\n",x2); + x2 = ((1<<17) * (slot*symb*slot+symb+1) * ((Nid<<1)+1) +((Nid<<1)+Nscid))&(((uint32_t)1<<31)-1); for (uint32_t n=0; n Date: Thu, 6 Sep 2018 18:31:55 +0200 Subject: [PATCH 009/117] Time alloc assertions/ Inline resource alloc params functions --- cmake_targets/CMakeLists.txt | 2 + .../nfapi/public_inc/nfapi_nr_interface.h | 14 ++- openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 7 ++ openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c | 111 ++++++++++++++++-- 4 files changed, 123 insertions(+), 11 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 9bc2436267..06e121608b 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1292,6 +1292,8 @@ set(PHY_SRC_UE ${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_TRANSPORT/nr_dlsch.c + ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dlsch_tools.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold.c ${OPENAIR1_DIR}/PHY/TOOLS/file_output.c ${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c 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 5b687e46e6..7351bfb89a 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h @@ -171,9 +171,9 @@ typedef struct { } nfapi_nr_rach_config_t; typedef struct { - nfapi_uint16_tlv_t dmrs_TypeA_Position; ///// Position of (first) DL DM-RS - nfapi_uint16_tlv_t TimeDomainResourceAllocation_k0; ///// L1 parameter 'K0' - nfapi_uint16_tlv_t TimeDomainResourceAllocation_mappingType; ///// L1 parameter 'Mapping-type' + nfapi_uint16_tlv_t dmrs_typeA_position; ///// Position of (first) DL DM-RS + nfapi_uint16_tlv_t time_domain_alloc_k0; ///// L1 parameter 'K0' + nfapi_uint16_tlv_t time_domain_alloc_mapping_type; ///// L1 parameter 'Mapping-type' } nfapi_nr_pdsch_config_t; typedef struct { @@ -309,9 +309,15 @@ typedef enum { typedef enum { NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A=0, NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_B, - NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_C + NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_C, + NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_ALLOC_LIST } nfapi_nr_pdsch_time_domain_alloc_type_e; +typedef enum { + NFAPI_NR_PDSCH_MAPPING_TYPE_A=0, + NFAPI_NR_PDSCH_MAPPING_TYPE_B +} nfapi_nr_pdsch_mapping_type_e; + // P7 Sub Structures typedef struct { diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index 1125a33c1a..def83c047b 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -33,3 +33,10 @@ #include "PHY/defs_gNB.h" +void nr_get_time_domain_allocation_type(nfapi_nr_config_request_t config, + NR_gNB_DCI_ALLOC_t dci_alloc, + NR_gNB_DLSCH_t* dlsch); + +void nr_check_time_alloc(uint8_t S, uint8_t L, nfapi_nr_config_request_t config); + +uint8_t nr_get_S(uint8_t row_idx, uint8_t CP, uint8_t time_alloc_type, uint8_t dmrs_mapping_type); diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c index 0e143db019..90d023b541 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c @@ -32,21 +32,35 @@ #include "nr_dlsch.h" +uint8_t nr_pdsch_default_time_alloc_A_S_nCP[23] = {2,3,2,3,2,3,2,3,2,3,9,10,4,6,5,5,9,12,1,1,2,4,8}; +uint8_t nr_pdsch_default_time_alloc_A_L_nCP[23] = {12,11,10,9,9,8,7,6,5,4,4,4,4,4,7,2,2,2,13,6,4,7,4}; +uint8_t nr_pdsch_default_time_alloc_A_S_eCP[23] = {2,3,2,3,2,3,2,3,2,3,6,8,4,6,5,5,9,10,1,1,2,4,8}; +uint8_t nr_pdsch_default_time_alloc_A_L_eCP[23] = {6,5,10,9,9,8,7,6,5,4,4,2,4,4,6,2,2,2,11,6,4,6,4}; +uint8_t nr_pdsch_default_time_alloc_B_S[16] = {2,4,6,8,10,2,4,2,4,6,8,10,2,2,3,2}; +uint8_t nr_pdsch_default_time_alloc_B_L[16] = {2,2,2,2,2,2,2,4,4,4,4,4,7,12,11,4}; +uint8_t nr_pdsch_default_time_alloc_C_S[15] = {2,4,6,8,10,2,4,6,8,10,2,2,3,0,2}; +uint8_t nr_pdsch_default_time_alloc_C_L[15] = {2,2,2,2,2,4,4,4,4,4,7,12,11,6,6}; + void nr_get_time_domain_allocation_type(nfapi_nr_config_request_t config, NR_gNB_DCI_ALLOC_t dci_alloc, NR_gNB_DLSCH_t* dlsch) { - nfapi_nr_ssb_and_cset_mux_pattern_type_e mux_pattern = dci_alloc.mux_pattern; + nfapi_nr_ssb_and_cset_mux_pattern_type_e mux_pattern = dci_alloc.pdcch_params.mux_pattern; - switch(dci_alloc.rnti_type) { + switch(dci_alloc.pdcch_params.rnti_type) { case NFAPI_NR_RNTI_SI: AssertFatal(dci_alloc.pdcch_params.common_search_space_type == NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_0, "Invalid common search space type %d for SI RNTI, expected %d\n", dci_alloc.pdcch_params.common_search_space_type, NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_0); + + if (mux_pattern == NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1) + AssertFatal(config.subframe_config.dl_cyclic_prefix_type.value == NFAPI_CP_NORMAL, + "Invalid configuration CP extended for SI RNTI type 0 search space\n"); + dlsch->time_alloc_type = (mux_pattern == NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1)?NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A : (mux_pattern == NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE2)?NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_B : - (mux_pattern == NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE3)?NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_C; + NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_C; break; case NFAPI_NR_RNTI_RA: @@ -54,8 +68,7 @@ void nr_get_time_domain_allocation_type(nfapi_nr_config_request_t config, /*AssertFatal(dci_alloc.pdcch_params.common_search_space_type == NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_1, "Invalid common search space type %d for RNTI %d, expected %d\n",dci_alloc.pdcch_params.common_search_space_type, NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_1, dci_alloc.rnti_type);*/ - if (!dlsch->time_alloc_list_flag) - dlsch->time_alloc_type = NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A; + dlsch->time_alloc_type = (dlsch->time_alloc_list_flag) ? NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_ALLOC_LIST : NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A; break; case NFAPI_NR_RNTI_P: @@ -63,12 +76,96 @@ void nr_get_time_domain_allocation_type(nfapi_nr_config_request_t config, case NFAPI_NR_RNTI_C: case NFAPI_NR_RNTI_CS: - if () + if (dci_alloc.pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_COMMON) + dlsch->time_alloc_type = (dlsch->time_alloc_list_flag)? NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_ALLOC_LIST : NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A; + else + dlsch->time_alloc_type = NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_ALLOC_LIST; + break; - case + } +} +static inline uint16_t get_SLIV(uint8_t S, uint8_t L) { + return ( (uint16_t)(((L-1)<=7)? (14*(L-1)+S) : (14*(15-L)+(13-S))) ); +} +static inline uint8_t get_K0(uint8_t row_idx, uint8_t time_alloc_type) { + return ( (time_alloc_type == NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A)|| + (time_alloc_type == NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_C)? 0 : + ((row_idx==6)||(row_idx==7)||(row_idx==15))? 1 : 0); +} + +/*ideally combine the calculation of L in the same function once the right struct is defined*/ +uint8_t nr_get_S(uint8_t row_idx, uint8_t CP, uint8_t time_alloc_type, uint8_t dmrs_typeA_position) { + + uint8_t idx, S; + + switch(time_alloc_type) { + case NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A: + idx = (row_idx>7)? (row_idx+6) : (((row_idx-1)<<1)-1+((dmrs_typeA_position==2)?0:1)); + return ((CP==NFAPI_CP_NORMAL)?nr_pdsch_default_time_alloc_A_S_nCP[idx] : nr_pdsch_default_time_alloc_A_S_eCP[idx]); + break; + + case NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_B: + idx = (row_idx<14)? (row_idx-1) : (row_idx == 14)? row_idx-1+((dmrs_typeA_position==2)?0:1) : 15; + return (nr_pdsch_default_time_alloc_B_S[idx]); + break; + + case NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_C: + AssertFatal((row_idx!=6)&&(row_idx!=7)&&(row_idx<17), "Invalid row index %d in %s %s\n", row_idx, __FUNCTION__, __FILE__); + idx = (row_idx<6)? (row_idx-1) : (row_idx<14)? (row_idx-3) : (row_idx == 14)? row_idx-3+((dmrs_typeA_position==2)?0:1) : (row_idx-2); + break; + + default: + AssertFatal(0, "Invalid Time domain allocation type %d in %s %s\n", time_alloc_type, __FUNCTION__, __FILE__); + } +} + +void nr_check_time_alloc(uint8_t S, uint8_t L, nfapi_nr_config_request_t config) { + + switch (config.subframe_config.dl_cyclic_prefix_type.value) { + case NFAPI_CP_NORMAL: + if (config.pdsch_config.time_domain_alloc_mapping_type.value == NFAPI_NR_PDSCH_MAPPING_TYPE_A) { + AssertFatal(S<4, "Invalid value of S(%d) for mapping type A and normal CP\n", S); + + if (S==3) + AssertFatal(config.pdsch_config.dmrs_typeA_position.value == 3, "Invalid S %d for dmrs_typeA_position %d\n", + S, config.pdsch_config.dmrs_typeA_position); + + AssertFatal((L>2)&&(L<15), "Invalid L %d for mapping type A and normal CP\n", L); + + AssertFatal(((S+L)>2)&&((S+L)<15), "Invalid S+L %d for mapping type A and normal CP\n", S+L); + } + else { + AssertFatal(S<13, "Invalid value of S(%d) for mapping type B and normal CP\n", S); + + AssertFatal((L>1)&&(L<8), "Invalid L %d for mapping type B and normal CP\n", L); + + AssertFatal(((S+L)>1)&&((S+L)<15), "Invalid S+L %d for mapping type B and normal CP\n", S+L); + } + break; + + case NFAPI_CP_EXTENDED: + if (config.pdsch_config.time_domain_alloc_mapping_type.value == NFAPI_NR_PDSCH_MAPPING_TYPE_A) { + AssertFatal(S<4, "Invalid value of S(%d) for mapping type A and extended CP\n", S); + + if (S==3) + AssertFatal(config.pdsch_config.dmrs_typeA_position.value == 3, "Invalid S %d for dmrs_typeA_position %d\n", + S, config.pdsch_config.dmrs_typeA_position); + + AssertFatal((L>2)&&(L<13), "Invalid L %d for mapping type A and extended CP\n", L); + + AssertFatal(((S+L)>2)&&((S+L)<13), "Invalid S+L %d for mapping type A and extended CP\n", S+L); + } + else { + AssertFatal(S<11, "Invalid value of S(%d) for mapping type B and extended CP\n", S); + + AssertFatal((L>1)&&(L<7), "Invalid L %d for mapping type B and extended CP\n", L); + + AssertFatal(((S+L)>1)&&((S+L)<13), "Invalid S+L %d for mapping type B and extended CP\n", S+L); + } + break; } } From 5520c2ebd4c918bd755fe5714f0473e157d0b7b4 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Fri, 7 Sep 2018 13:39:33 +0200 Subject: [PATCH 010/117] DL Freq alloc type 1 --- .../nfapi/public_inc/nfapi_nr_interface.h | 5 ++ openair1/PHY/NR_TRANSPORT/nr_dci.c | 2 +- openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 6 ++- openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c | 49 ++++++++++++++++--- openair1/PHY/defs_gNB.h | 1 + openair1/PHY/defs_nr_common.h | 15 ++++++ 6 files changed, 69 insertions(+), 9 deletions(-) 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 7351bfb89a..eda587ec04 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h @@ -318,6 +318,11 @@ typedef enum { NFAPI_NR_PDSCH_MAPPING_TYPE_B } nfapi_nr_pdsch_mapping_type_e; +typedef enum { + NFAPI_NR_PDSCH_RBG_CONFIG_TYPE1=0, + NFAPI_NR_PDSCH_RBG_CONFIG_TYPE2 +} nfapi_nr_pdsch_rbg_config_type_e; + // P7 Sub Structures typedef struct { diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci.c b/openair1/PHY/NR_TRANSPORT/nr_dci.c index 4cca9e85f6..dff7e5ac8d 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dci.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dci.c @@ -20,7 +20,7 @@ */ /*! \file PHY/NR_TRANSPORT/nr_dci.c -* \brief Implements DCI encoding/decoding and PDCCH TX/RX procedures (38.212/38.213/38.214). V15.2.0 2018-06. +* \brief Implements DCI encoding and PDCCH TX procedures (38.212/38.213/38.214). V15.2.0 2018-06. * \author Guy De Souza * \date 2018 * \version 0.1 diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index def83c047b..3ba96c621e 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -39,4 +39,8 @@ void nr_get_time_domain_allocation_type(nfapi_nr_config_request_t config, void nr_check_time_alloc(uint8_t S, uint8_t L, nfapi_nr_config_request_t config); -uint8_t nr_get_S(uint8_t row_idx, uint8_t CP, uint8_t time_alloc_type, uint8_t dmrs_mapping_type); +uint8_t nr_get_S(uint8_t row_idx, uint8_t CP, uint8_t time_alloc_type, uint8_t dmrs_typeA_position); + +void nr_get_rbg_parms(NR_BWP_PARMS* bwp, uint8_t config_type); + +void nr_get_rbg_list(uint32_t bitmap, uint8_t n_rbg, uint8_t* rbg_list); diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c index 90d023b541..d075deea94 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c @@ -19,13 +19,13 @@ * 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 +/*! \file PHY/NR_TRANSPORT/nr_dlsch_tools.c +* \brief Top-level routines for decoding DLSCH transport channel from 38-214, V15.2.0 2018-06 +* \author Guy De Souza +* \date 2018 * \version 0.1 * \company Eurecom -* \email: knopp@eurecom.fr +* \email: desouza@eurecom.fr * \note * \warning */ @@ -41,6 +41,9 @@ uint8_t nr_pdsch_default_time_alloc_B_L[16] = {2,2,2,2,2,2,2,4,4,4,4,4,7,12,11,4 uint8_t nr_pdsch_default_time_alloc_C_S[15] = {2,4,6,8,10,2,4,6,8,10,2,2,3,0,2}; uint8_t nr_pdsch_default_time_alloc_C_L[15] = {2,2,2,2,2,4,4,4,4,4,7,12,11,6,6}; + + /// Time domain allocation routines + void nr_get_time_domain_allocation_type(nfapi_nr_config_request_t config, NR_gNB_DCI_ALLOC_t dci_alloc, NR_gNB_DLSCH_t* dlsch) { @@ -131,7 +134,7 @@ void nr_check_time_alloc(uint8_t S, uint8_t L, nfapi_nr_config_request_t config) if (S==3) AssertFatal(config.pdsch_config.dmrs_typeA_position.value == 3, "Invalid S %d for dmrs_typeA_position %d\n", - S, config.pdsch_config.dmrs_typeA_position); + S, config.pdsch_config.dmrs_typeA_position.value); AssertFatal((L>2)&&(L<15), "Invalid L %d for mapping type A and normal CP\n", L); @@ -152,7 +155,7 @@ void nr_check_time_alloc(uint8_t S, uint8_t L, nfapi_nr_config_request_t config) if (S==3) AssertFatal(config.pdsch_config.dmrs_typeA_position.value == 3, "Invalid S %d for dmrs_typeA_position %d\n", - S, config.pdsch_config.dmrs_typeA_position); + S, config.pdsch_config.dmrs_typeA_position.value); AssertFatal((L>2)&&(L<13), "Invalid L %d for mapping type A and extended CP\n", L); @@ -170,3 +173,35 @@ void nr_check_time_alloc(uint8_t S, uint8_t L, nfapi_nr_config_request_t config) } + /// Frequency domain allocation routines + + // DL alloc type 0 +static inline uint8_t get_RBG_size_P(uint16_t n_RB, uint8_t RBG_config) { + if (RBG_config == NFAPI_NR_PDSCH_RBG_CONFIG_TYPE1) + return ((n_RB<37)?2:(n_RB<73)?4:(n_RB<145)?8:16); + else if (RBG_config == NFAPI_NR_PDSCH_RBG_CONFIG_TYPE2) + return ((n_RB<37)?4:(n_RB<73)?8:(n_RB<145)?16:16); + else + AssertFatal(0, "Invalid RBG config type (%d)\n", RBG_config); +} + +void nr_get_rbg_parms(NR_BWP_PARMS* bwp, uint8_t config_type) { + nr_rbg_parms_t* rbg_parms = &bwp->rbg_parms; + + rbg_parms->P = get_RBG_size_P(bwp->N_RB, config_type); + rbg_parms->start_size = rbg_parms->P - bwp->location%rbg_parms->P; + rbg_parms->end_size = ((bwp->location + bwp->N_RB)%rbg_parms->P)? ((bwp->location + bwp->N_RB)%rbg_parms->P) : rbg_parms->P; + rbg_parms->N_RBG = (uint8_t)ceil( (bwp->N_RB + (bwp->location%rbg_parms->P))/rbg_parms->P); + LOG_I(PHY, "RBG parameters for BWP %d location %d N_RB %d:\n", bwp->bwp_id, bwp->location, bwp->N_RB); + LOG_I(PHY, "P %d\t start size %d\t endsize %d\t N_RBG %d\n", rbg_parms->P, rbg_parms->start_size, rbg_parms->end_size, rbg_parms->N_RBG); +} + +void nr_get_rbg_list(uint32_t bitmap, uint8_t n_rbg, uint8_t* rbg_list) { + uint8_t idx=0; + for (int i=0; i>(n_rbg-i-1))&1) + rbg_list[idx++]=i; +} + + // DL alloc type 1 + diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index eaf9a2456e..b089cfb60f 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -149,6 +149,7 @@ typedef struct { LTE_DL_eNB_HARQ_t *harq_processes[8]; nfapi_nr_pdsch_time_domain_alloc_type_e time_alloc_type; uint8_t time_alloc_list_flag; + uint8_t rbg_list[NR_MAX_NB_RBG]; //LTE remainders to be removed diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 3ff464c839..acd92e425d 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -81,6 +81,8 @@ #define NR_MAX_PDCCH_AGG_LEVEL 16 #define NR_MAX_CSET_DURATION 3 +#define NR_MAX_NB_RBG 18 + typedef enum { NR_MU_0=0, NR_MU_1, @@ -110,6 +112,17 @@ typedef enum { nr_FR2 } nr_frequency_range_e; +typedef struct { + /// Size of first RBG + uint8_t start_size; + /// Nominal size + uint8_t P; + /// Size of last RBG + uint8_t end_size; + /// Number of RBG + uint8_t N_RBG; +}nr_rbg_parms_t; + typedef struct NR_BWP_PARMS { /// BWP ID uint8_t bwp_id; @@ -123,6 +136,8 @@ typedef struct NR_BWP_PARMS { uint16_t ofdm_symbol_size; /// Cyclic prefix uint8_t cyclic_prefix; + /// RBG params + nr_rbg_parms_t rbg_parms; } NR_BWP_PARMS; typedef struct { From 6e29ff08722dd1c3ff914148c6c48eeb244cc02a Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Wed, 29 Aug 2018 02:57:42 -0700 Subject: [PATCH 011/117] patch from Milan Zivkovic (Nokia Bell Labs) --- cmake_targets/build_oai | 2 +- openair1/PHY/CODING/TESTBENCH/ldpctest.c | 773 +++++++++++++----- .../CODING/nrLDPC_decoder/nrLDPC_decoder.c | 3 + .../PHY/CODING/nrLDPC_encoder/ldpc_encoder.c | 2 +- .../PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c | 279 ++++++- .../ldpc_generate_coefficient.c | 56 +- 6 files changed, 850 insertions(+), 265 deletions(-) diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index 0daba0b235..3d0238e8ae 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -686,7 +686,7 @@ function main() { echo_info "Compiling unitary tests simulators" # TODO: fix: dlsim_tm4 pucchsim prachsim pdcchsim pbchsim mbmssim #simlist="dlsim_tm4 dlsim ulsim pucchsim prachsim pdcchsim pbchsim mbmssim" - simlist="dlsim ulsim" + simlist="dlsim ulsim polartest ldpctest" for f in $simlist ; do compilations \ lte-simulators $f \ diff --git a/openair1/PHY/CODING/TESTBENCH/ldpctest.c b/openair1/PHY/CODING/TESTBENCH/ldpctest.c index 158be941c7..49af918bd9 100644 --- a/openair1/PHY/CODING/TESTBENCH/ldpctest.c +++ b/openair1/PHY/CODING/TESTBENCH/ldpctest.c @@ -24,6 +24,7 @@ #include #include +#include "assertions.h" #include "SIMULATION/TOOLS/sim.h" #include "PHY/CODING/nrLDPC_encoder/defs.h" #include "PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.h" @@ -38,6 +39,10 @@ # endif #endif +#define NR_LDPC_PROFILER_DETAIL +#define NR_LDPC_ENABLE_PARITY_CHECK + + // 4-bit quantizer char quantize4bit(double D,double x) { @@ -53,13 +58,33 @@ char quantize4bit(double D,double x) return((char)qxd); } +char quantize8bit(double D,double x) +{ + double qxd; + //char maxlev; + qxd = floor(x/D); + + //maxlev = 1<<(B-1); + + //printf("x=%f,qxd=%f,maxlev=%d\n",x,qxd, maxlev); + + if (qxd <= -128) + qxd = -128; + else if (qxd >= 128) + qxd = 127; + + return((char)qxd); +} + char quantize(double D,double x,unsigned char B) { double qxd; - char maxlev; + short maxlev; qxd = floor(x/D); - // printf("x=%f,qxd=%f\n",x,qxd); - maxlev = 1<<(B-1); + + maxlev = 1<<(B-1);//(char)(pow(2,B-1)); + + //printf("x=%f,qxd=%f,maxlev=%d\n",x,qxd, maxlev); if (qxd <= -maxlev) qxd = -maxlev; @@ -69,45 +94,78 @@ char quantize(double D,double x,unsigned char B) return((char)qxd); } +typedef struct { +double n_iter_mean; +double n_iter_std; +int n_iter_max; +} n_iter_stats_t; + #define MAX_BLOCK_LENGTH 8448 +short lift_size[51]= {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20,22,24,26,28,30,32,36,40,44,48,52,56,60,64,72,80,88,96,104,112,120,128,144,160,176,192,208,224,240,256,288,320,352,384}; + int test_ldpc(short No_iteration, - //int nom_rate, - //int denom_rate, + int nom_rate, + int denom_rate, double SNR, unsigned char qbits, - unsigned short block_length, + short block_length, unsigned int ntrials, + int n_segments, unsigned int *errors, - unsigned int *crc_misses) + unsigned int *errors_bit, + double *errors_bit_uncoded, + unsigned int *crc_misses, + time_stats_t *time_optim, + time_stats_t *time_decoder, + n_iter_stats_t * dec_iter) { //clock initiate - time_stats_t time,time_optim,tinput,tprep,tparity,toutput; + //time_stats_t time,time_optim,tinput,tprep,tparity,toutput, time_decoder; + time_stats_t time, tinput,tprep,tparity,toutput; + double n_iter_mean = 0; + double n_iter_std = 0; + int n_iter_max = 0; + unsigned int segment_bler = 0; + + double sigma; + sigma = 1.0/sqrt(2*SNR); + opp_enabled=1; cpu_freq_GHz = get_cpu_freq_GHz(); //short test_input[block_length]; unsigned char *test_input[MAX_NUM_DLSCH_SEGMENTS]={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};; //short *c; //padded codeword - unsigned char *estimated_output; + unsigned char *estimated_output[MAX_NUM_DLSCH_SEGMENTS]; + unsigned char *estimated_output_bit[MAX_NUM_DLSCH_SEGMENTS]; + unsigned char *test_input_bit; unsigned char *channel_input[MAX_NUM_DLSCH_SEGMENTS]; + unsigned char *channel_output_uncoded[MAX_NUM_DLSCH_SEGMENTS]; unsigned char *channel_input_optim[MAX_NUM_DLSCH_SEGMENTS]; double *channel_output; - double *modulated_input; - char *channel_output_fixed; + double *modulated_input[MAX_NUM_DLSCH_SEGMENTS]; + char *channel_output_fixed[MAX_NUM_DLSCH_SEGMENTS]; unsigned int i,j,trial=0; - short BG,Zc,Kb; - //short nrows,ncols; - //int no_punctured_columns,removed_bit; + short BG,Zc,Kb,nrows;//,ncols; + int no_punctured_columns,removed_bit; int i1; + int R_ind = 0; //Table of possible lifting sizes - short lift_size[51]= {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20,22,24,26,28,30,32,36,40,44,48,52,56,60,64,72,80,88,96,104,112,120,128,144,160,176,192,208,224,240,256,288,320,352,384}; - int n_segments=8; - int N; //length encoded block +//short lift_size[51]= {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20,22,24,26,28,30,32,36,40,44,48,52,56,60,64,72,80,88,96,104,112,120,128,144,160,176,192,208,224,240,256,288,320,352,384}; + //int n_segments=1; + int code_rate_vec[8] = {15, 13, 25, 12, 23, 34, 56, 89}; + //double code_rate_actual_vec[8] = {0.2, 0.33333, 0.4, 0.5, 0.66667, 0.73333, 0.81481, 0.88}; t_nrLDPC_dec_params decParams; - int n_iter; + + t_nrLDPC_time_stats decoder_profiler; + t_nrLDPC_time_stats* p_decoder_profiler =&decoder_profiler ; + + int32_t n_iter = 0;; *errors=0; + *errors_bit=0; + *errors_bit_uncoded=0; *crc_misses=0; // generate input block @@ -115,37 +173,450 @@ int test_ldpc(short No_iteration, test_input[j]=(unsigned char *)malloc16(sizeof(unsigned char) * block_length/8); channel_input[j] = (unsigned char *)malloc16(sizeof(unsigned char) * 68*384); channel_input_optim[j] = (unsigned char *)malloc16(sizeof(unsigned char) * 68*384); + channel_output_uncoded[j] = (unsigned char *)malloc16(sizeof(unsigned char) * 68*384); + estimated_output[j] = (unsigned char*) malloc16(sizeof(unsigned char) * block_length); + estimated_output_bit[j] = (unsigned char*) malloc16(sizeof(unsigned char) * block_length); + modulated_input[j] = (double *)malloc16(sizeof(double) * 68*384); + channel_output_fixed[j] = (char *)malloc16(sizeof( char) * 68*384); } - modulated_input = (double *)malloc(sizeof(double) * 68*384); - channel_output = (double *)malloc(sizeof(double) * 68*384); - channel_output_fixed = (char *)malloc16(sizeof(char) * 68*384); - estimated_output = (unsigned char*) malloc16(sizeof(unsigned char) * block_length); - - memset(channel_output_fixed,0,sizeof(char) * 68*384); + //modulated_input = (double *)malloc(sizeof(double) * 68*384); + //channel_output = (double *)malloc(sizeof(double) * 68*384); + //channel_output_fixed = (char *)malloc16(sizeof(char) * 68*384); + //modulated_input = (double *)calloc(68*384, sizeof(double)); + channel_output = (double *)calloc(68*384, sizeof(double)); + //channel_output_fixed = (double *)calloc(68*384, sizeof(double)); + //channel_output_fixed = (unsigned char*)calloc(68*384, sizeof(unsigned char*)); + //estimated_output = (unsigned char*) malloc16(sizeof(unsigned char) * block_length);///8); + //estimated_output_bit = (unsigned char*) malloc16(sizeof(unsigned char) * block_length); + test_input_bit = (unsigned char*) malloc16(sizeof(unsigned char) * block_length); reset_meas(&time); - reset_meas(&time_optim); + reset_meas(time_optim); + reset_meas(time_decoder); reset_meas(&tinput); reset_meas(&tprep); reset_meas(&tparity); reset_meas(&toutput); + //Reset Decoder profiles + reset_meas(&decoder_profiler.llr2llrProcBuf); + reset_meas(&decoder_profiler.llr2CnProcBuf); + reset_meas(&decoder_profiler.cnProc); + reset_meas(&decoder_profiler.cnProcPc); + reset_meas(&decoder_profiler.bnProc); + reset_meas(&decoder_profiler.bnProcPc); + reset_meas(&decoder_profiler.cn2bnProcBuf); + reset_meas(&decoder_profiler.bn2cnProcBuf); + reset_meas(&decoder_profiler.llrRes2llrOut); + reset_meas(&decoder_profiler.llr2bit); + //reset_meas(&decoder_profiler.total); for (j=0;j3840) && (block_length <= MAX_BLOCK_LENGTH)) + if (block_length>3840) + { + BG=1; + Kb = 22; + nrows=46; //parity check bits + //ncols=22; //info bits + } + else if (block_length<=3840) + { + BG=2; + nrows=42; //parity check bits + //ncols=10; // info bits + + if (block_length>640) + Kb = 10; + else if (block_length>560) + Kb = 9; + else if (block_length>192) + Kb = 8; + else + Kb = 6; + } + + if (nom_rate == 1) + if (denom_rate == 5) + if (BG == 2) + R_ind = 0; + else + printf("Not supported"); + else if (denom_rate == 3) + R_ind = 1; + else if (denom_rate == 2) + //R_ind = 3; + printf("Not supported"); + else + printf("Not supported"); + + else if (nom_rate == 2) + if (denom_rate == 5) + //R_ind = 2; + printf("Not supported"); + else if (denom_rate == 3) + R_ind = 4; + else + printf("Not supported"); + + else if ((nom_rate == 22) && (denom_rate == 30)) + //R_ind = 5; + printf("Not supported"); + else if ((nom_rate == 22) && (denom_rate == 27)) + //R_ind = 6; + printf("Not supported"); + else if ((nom_rate == 22) && (denom_rate == 25)) + if (BG == 1) + R_ind = 7; + else + printf("Not supported"); + else + printf("Not supported"); + + //find minimum value in all sets of lifting size + Zc=0; + + for (i1=0; i1 < 51; i1++) + { + if (lift_size[i1] >= (double) block_length/Kb) + { + Zc = lift_size[i1]; + //printf("%d\n",Zc); + break; + } + } + + printf("ldpc_test: codeword_length %d, n_segments %d, block_length %d, BG %d, Zc %d, Kb %d\n",n_segments *block_length, n_segments, block_length,BG, Zc, Kb); + no_punctured_columns=(int)((nrows-2)*Zc+block_length-block_length*(1/((float)nom_rate/(float)denom_rate)))/Zc; + // printf("puncture:%d\n",no_punctured_columns); + removed_bit=(nrows-no_punctured_columns-2) * Zc+block_length-(int)(block_length/((float)nom_rate/(float)denom_rate)); + if (ntrials==0) + ldpc_encoder_orig(test_input[0],channel_input[0], block_length, BG, 1); + + for (trial=0; trial < ntrials; trial++) + { + segment_bler = 0; + //// encoder + start_meas(&time); + for(j=0;j>3; i++) + { + //printf("block_length>>3: %d \n",block_length>>3); + /// printf("i: %d \n",i); + ///printf("estimated_output[%d]: %d \n",i,estimated_output[i]); + ///printf("test_input[0][%d]: %d \n",i,test_input[0][i]); + if (estimated_output[j][i] != test_input[j][i]) + { + + + //////printf("error pos %d (%d, %d)\n\n",i,estimated_output[i],test_input[0][i]); + segment_bler = segment_bler + 1; + break; + } + } + + for (i=0; i>(i&7); + test_input_bit[i] = (test_input[j][i/8]&(1<<(i&7)))>>(i&7); // Further correct for multiple segments + if (estimated_output_bit[j][i] != test_input_bit[i]) + { + *errors_bit = (*errors_bit) + 1; + } + } + + //if (*errors == 1000) + //break; + + n_iter_mean = n_iter_mean + n_iter; + n_iter_std = n_iter_std + pow(n_iter-1,2); + + if ( n_iter > n_iter_max ) + n_iter_max = n_iter; + + } // end segments + + if (segment_bler != 0) + *errors = (*errors) + 1; + + } + /*else if (trial==0) + printf("decoder is not supported\n");*/ + } + + + dec_iter->n_iter_mean = n_iter_mean/(double)ntrials/(double)n_segments - 1; + dec_iter->n_iter_std = sqrt(n_iter_std/(double)ntrials/(double)n_segments - pow(n_iter_mean/(double)ntrials/(double)n_segments - 1,2)); + dec_iter->n_iter_max = n_iter_max -1; + + *errors_bit_uncoded = *errors_bit_uncoded / (double)((Kb+nrows-no_punctured_columns-2) * Zc-removed_bit); + + for(j=0;j 1280, 2401 -> 2560 + + short No_iteration=5; + int n_segments=1; + //double rate=0.333; + int nom_rate=1; + int denom_rate=3; + double SNR0=-2.0,SNR,SNR_lin; + unsigned char qbits=8; + unsigned int decoded_errors[10000]; // initiate the size of matrix equivalent to size of SNR + int c,i=0, i1 = 0; + + int n_trials = 1; + double SNR_step = 0.1; + + randominit(0); + int test_uncoded= 0; + + time_stats_t time_optim[10], time_decoder[10]; + n_iter_stats_t dec_iter[3]; + + + + short BG,Zc,Kb; + + while ((c = getopt (argc, argv, "q:r:s:S:l:n:d:i:t:u:h")) != -1) + switch (c) + { + case 'q': + qbits = atoi(optarg); + break; + + case 'r': + nom_rate = atoi(optarg); + break; + + case 'd': + denom_rate = atoi(optarg); + break; + + case 'l': + block_length = atoi(optarg); + break; + + case 'n': + n_trials = atoi(optarg); + break; + + case 's': + SNR0 = atof(optarg); + break; + + case 'S': + n_segments = atof(optarg); + break; + + case 't': + SNR_step = atof(optarg); + break; + + case 'i': + No_iteration = atoi(optarg); + break; + + case 'u': + test_uncoded = atoi(optarg); + break; + + case 'h': + default: + printf("CURRENTLY SUPPORTED CODE RATES: \n"); + printf("BG1 (blocklength > 3840): 1/3, 2/3, 22/25 (8/9) \n"); + printf("BG2 (blocklength <= 3840): 1/5, 1/3, 2/3 \n\n"); + printf("-h This message\n"); + printf("-q Quantization bits, Default: 8\n"); + printf("-r Nominator rate, (1, 2, 22), Default: 1\n"); + printf("-d Denominator rate, (3, 5, 25), Default: 1\n"); + printf("-l Block length (l > 3840 -> BG1, rest BG2 ), Default: 8448\n"); + printf("-n Number of simulation trials, Default: 1\n"); + //printf("-M MCS2 for TB 2\n"); + printf("-s SNR per information bit (EbNo) in dB, Default: -2\n"); + printf("-S Number of segments (Maximum: 8), Default: 1\n"); + printf("-t SNR simulation step, Default: 0.1\n"); + printf("-i Max decoder iterations, Default: 5\n"); + printf("-u Set SNR per coded bit, Default: 0\n"); + exit(1); + break; + } + cpu_freq_GHz = get_cpu_freq_GHz(); + //printf("the decoder supports BG2, Kb=10, Z=128 & 256\n"); + //printf(" range of blocklength: 1201 -> 1280, 2401 -> 2560\n"); + printf("block length %d: \n", block_length); + printf("n_trials %d: \n", n_trials); + printf("SNR0 %f: \n", SNR0); + + + + + //for (block_length=8;block_length<=MAX_BLOCK_LENGTH;block_length+=8) + + + //determine number of bits in codeword + if (block_length>3840) { BG=1; Kb = 22; //nrows=46; //parity check bits //ncols=22; //info bits } - else if (block_length<=3840) + else if (block_length<=3840) { BG=2; //nrows=42; //parity check bits @@ -159,14 +630,11 @@ int test_ldpc(short No_iteration, Kb = 8; else Kb = 6; - } - else { - printf("block_length %d not supported\n",block_length); - exit(-1); - } - + } + //find minimum value in all sets of lifting size Zc=0; + for (i1=0; i1 < 51; i1++) { if (lift_size[i1] >= (double) block_length/Kb) @@ -177,192 +645,87 @@ int test_ldpc(short No_iteration, } } - if (BG==1) - N=66*Zc; - else if (BG==2) - N=50*Zc; + char fname[200]; + sprintf(fname,"../../../openair1/PHY/CODING/TESTBENCH/ldpctest_BG_%d_Zc_%d_rate_%d-%d_block_length_%d_maxit_%d.txt",BG,Zc,nom_rate,denom_rate,block_length, No_iteration); + FILE *fd=fopen(fname,"w"); + AssertFatal(fd!=NULL,"cannot open %s\n",fname); - printf("ldpc_test: block_length %d, BG %d, Zc %d, Kb %d, N %d\n",block_length,BG, Zc, Kb, N); - //no_punctured_columns=(int)((nrows-2)*Zc+block_length-block_length*(1/((float)nom_rate/(float)denom_rate)))/Zc; - // printf("puncture:%d\n",no_punctured_columns); - //removed_bit=(nrows-no_punctured_columns-2) * Zc+block_length-(int)(block_length/((float)nom_rate/(float)denom_rate)); - if (ntrials==0) - ldpc_encoder_orig(test_input[0],channel_input[0], block_length, BG, 1); - - for (trial=0; trial < ntrials; trial++) + fprintf(fd,"SNR BLER BER UNCODED_BER ENCODER_MEAN ENCODER_STD ENCODER_MAX DECODER_TIME_MEAN DECODER_TIME_STD DECODER_TIME_MAX DECODER_ITER_MEAN DECODER_ITER_STD DECODER_ITER_MAX\n"); + + for (SNR=SNR0;SNR1.0) - channel_output_fixed[i]=127; - else if (channel_output[i]<-1.0) - channel_output_fixed[i]=-128; - else - channel_output_fixed[i] = (char) ((channel_output[i]*128)<0?(channel_output[i]*128-0.5):(channel_output[i]*128+0.5)); //fixed point 9-7 - //printf("llr[%d]=%d (%f)\n",i,channel_output_fixed[i],channel_output[i]); - } - - /* - the LDPC decoder supports several rates and the input has to be adapted accordingly (by padding with zeros to the next lower supported rate). Moreover, the first 2*Z LLRs are zero (since they are punctured and not transmitted) then you have the LLRs corresponding to the systematic bits. After that come the filler bits, the encoder uses 0 for the filler bits hence for the decoder you need to put 127 (max LLR for bit 0) at their place. Then come the LLRs corresponding to the punctured bits followed by zeros to pad for the supported decoder rate. - */ - for (i=0;i<2*Zc;i++) - channel_output_fixed[i] = 0; - - decParams.BG=BG; - decParams.Z=Zc; - decParams.R=13; - decParams.numMaxIter=6; - decParams.outMode = nrLDPC_outMode_BIT; - - // decode the sequence - // decoder supports BG2, Z=128 & 256 - //estimated_output=ldpc_decoder(channel_output_fixed, block_length, No_iteration, (double)((float)nom_rate/(float)denom_rate)); - - n_iter = nrLDPC_decoder(&decParams, (int8_t*) channel_output_fixed, (int8_t*) estimated_output, NULL); - - //for (i=(Kb+nrows) * Zc-5;i<(Kb+nrows) * Zc;i++) - // printf("esimated_output[%d]=%d\n",i,esimated_output[i]); - - //count errors - for (i=0; i>3; i++) - { - if (estimated_output[i] != test_input[0][i]) - { - printf("error pos %d (%d, %d)\n",i,estimated_output[i],test_input[0][i]); - *errors = (*errors) + 1; - break; - } - } - - } - - for(j=0;j 1280, 2401 -> 2560 - short No_iteration=25; - //double rate=0.333; - //int nom_rate=1; - //int denom_rate=3; - double SNR0=-2.0,SNR,SNR_lin; - unsigned char qbits=4; - unsigned int decoded_errors[100]; // initiate the size of matrix equivalent to size of SNR - int c,i=0; - - int n_trials = 1; - - randominit(0); - - while ((c = getopt (argc, argv, "q:s:l:n:h")) != -1) - switch (c) - { - case 'q': - qbits = atoi(optarg); - break; - - case 'l': - block_length = atoi(optarg); - break; - - case 'n': - n_trials = atoi(optarg); - break; - - case 's': - SNR0 = atoi(optarg); - break; - - default: - case 'h': - printf("usage ldpctest -h -l blocklength -n n_trials -s SNR\n"); - exit(0); - } - - //printf("the decoder supports BG2, Kb=10, Z=128 & 256\n"); - //printf(" range of blocklength: 1201 -> 1280, 2401 -> 2560\n"); - //printf("rate: %d/%d\n",nom_rate,denom_rate); - printf("block length %d: \n", block_length); - printf("n_trials %d: \n", n_trials); - printf("SNR0 %f: \n", SNR0); - - //for (block_length=8;block_length<=MAX_BLOCK_LENGTH;block_length+=8) - for (SNR=SNR0;SNRn_iter_mean); + printf("SNR %f, Std iterations: %f\n",SNR, dec_iter->n_iter_std); + printf("SNR %f, Max iterations: %d\n",SNR, dec_iter->n_iter_max); + printf("\n"); + printf("Encoding time mean: %15.3f us\n",(double)time_optim->diff/time_optim->trials/1000.0/cpu_freq_GHz); + printf("Encoding time std: %15.3f us\n",sqrt((double)time_optim->diff_square/time_optim->trials/pow(1000,2)/pow(cpu_freq_GHz,2)-pow((double)time_optim->diff/time_optim->trials/1000.0/cpu_freq_GHz,2))); + printf("Encoding time max: %15.3f us\n",(double)time_optim->max/1000.0/cpu_freq_GHz); + printf("\n"); + printf("Decoding time mean: %15.3f us\n",(double)time_decoder->diff/time_decoder->trials/1000.0/cpu_freq_GHz); + printf("Decoding time std: %15.3f us\n",sqrt((double)time_decoder->diff_square/time_decoder->trials/pow(1000,2)/pow(cpu_freq_GHz,2)-pow((double)time_decoder->diff/time_decoder->trials/1000.0/cpu_freq_GHz,2))); + printf("Decoding time max: %15.3f us\n",(double)time_decoder->max/1000.0/cpu_freq_GHz); + + fprintf(fd,"%f %f %f %f %f %f %f %f %f %f %f %f %d \n", + SNR, + (double)decoded_errors[i]/(double)n_trials , + (double)errors_bit/(double)n_trials/(double)block_length/(double)n_segments , + errors_bit_uncoded/(double)n_trials/(double)n_segments , + (double)time_optim->diff/time_optim->trials/1000.0/cpu_freq_GHz, + sqrt((double)time_optim->diff_square/time_optim->trials/pow(1000,2)/pow(cpu_freq_GHz,2)-pow((double)time_optim->diff/time_optim->trials/1000.0/cpu_freq_GHz,2)), + (double)time_optim->max/1000.0/cpu_freq_GHz, + (double)time_decoder->diff/time_decoder->trials/1000.0/cpu_freq_GHz, + sqrt((double)time_decoder->diff_square/time_decoder->trials/pow(1000,2)/pow(cpu_freq_GHz,2)-pow((double)time_decoder->diff/time_decoder->trials/1000.0/cpu_freq_GHz,2)), + (double)time_decoder->max/1000.0/cpu_freq_GHz, + dec_iter->n_iter_mean, + dec_iter->n_iter_std, + dec_iter->n_iter_max + ); + + if (decoded_errors[i] == 0) + break; i=i+1; + + } + fclose(fd); return(0); } + + + + + + + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c index 53966befff..2758ae35c0 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c @@ -38,6 +38,9 @@ #include "nrLDPC_cnProc.h" #include "nrLDPC_bnProc.h" +#define NR_LDPC_ENABLE_PARITY_CHECK +#define NR_LDPC_PROFILER_DETAIL + #ifdef NR_LDPC_DEBUG_MODE #include "nrLDPC_tools/nrLDPC_debug.h" #endif diff --git a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder.c b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder.c index b97b780333..a225730845 100644 --- a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder.c +++ b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder.c @@ -68,7 +68,7 @@ int encode_parity_check_part_orig(unsigned char *c,unsigned char *d, short BG,sh printf("problem with BG\n"); return(-1); } - + no_punctured_columns=(int)((nrows-2)*Zc+block_length-block_length*3)/Zc; diff --git a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c index 037c19f88e..8ba6928966 100644 --- a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c +++ b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c @@ -201,7 +201,7 @@ void encode_parity_check_part_optim(uint8_t *c,uint8_t *d, short BG,short Zc,sho int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,short block_length,short BG,time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput) { - short Kb,Zc,nrows,ncols; + short Zc,Kb,nrows,ncols; int i,i1; int no_punctured_columns,removed_bit; @@ -211,26 +211,31 @@ int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,sh int simd_size; //determine number of bits in codeword - if (BG==1) - { - Kb = 22; - nrows=46; //parity check bits - ncols=22; //info bits - } - else if (BG==2) - { - nrows=42; //parity check bits - ncols=10; // info bits - - if (block_length>640) - Kb = 10; - else if (block_length>560) - Kb = 9; - else if (block_length>192) - Kb = 8; - else - Kb = 6; - } + //determine number of bits in codeword + //if (block_length>3840) + if (BG==1) + { + //BG=1; + Kb = 22; + nrows=46; //parity check bits + ncols=22; //info bits + } + //else if (block_length<=3840) + else if (BG==2) + { + //BG=2; + nrows=42; //parity check bits + ncols=10; // info bits + + if (block_length>640) + Kb = 10; + else if (block_length>560) + Kb = 9; + else if (block_length>192) + Kb = 8; + else + Kb = 6; + } //find minimum value in all sets of lifting size Zc=0; @@ -316,7 +321,7 @@ int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,sh int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_input,short block_length,short BG,int n_segments,time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput) { - short Kb,Zc,nrows,ncols; + short Zc,Kb,nrows,ncols; int i,i1,j; int no_punctured_columns,removed_bit; //Table of possible lifting sizes @@ -343,14 +348,18 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i AssertFatal(n_segments>0&&n_segments<=8,"0 < n_segments %d <= 8\n",n_segments); //determine number of bits in codeword + //if (block_length>3840) if (BG==1) { + //BG=1; Kb = 22; nrows=46; //parity check bits ncols=22; //info bits } - else if (BG==2) + //else if (block_length<=3840) + else if (BG==2) { + //BG=2; nrows=42; //parity check bits ncols=10; // info bits @@ -362,7 +371,7 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i Kb = 8; else Kb = 6; - } + } //find minimum value in all sets of lifting size Zc=0; @@ -481,12 +490,12 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i // if (((block_length-(2*Zc))&31)>0) l1++; for (i=0;i0) l2++; for (i1=0;i1>j)&1; for (i=0;i<((nrows-no_punctured_columns) * Zc-removed_bit);i++) - for (j=0; j>j)&1; } @@ -508,3 +517,217 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i stop_meas(toutput); return 0; } + +int ldpc_encoder_optim_8seg_multi(unsigned char **test_input,unsigned char **channel_input,short block_length,int nom_rate,int denom_rate,int n_segments,unsigned int macro_num, time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput) +{ + + short BG,Zc,Kb,nrows,ncols; + int i,i1,j; + int no_punctured_columns,removed_bit; + //Table of possible lifting sizes + short lift_size[51]= {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20,22,24,26,28,30,32,36,40,44,48,52,56,60,64,72,80,88,96,104,112,120,128,144,160,176,192,208,224,240,256,288,320,352,384}; + char temp; + int simd_size; + int macro_segment, macro_segment_end; + + + macro_segment = 8*macro_num; + macro_segment_end = (n_segments > 8*(macro_num+1)) ? 8*(macro_num+1) : n_segments; + ///printf("macro_segment: %d\n", macro_segment); + ///printf("macro_segment_end: %d\n", macro_segment_end ); + +#ifdef __AVX2__ + __m256i shufmask = _mm256_set_epi64x(0x0303030303030303, 0x0202020202020202,0x0101010101010101, 0x0000000000000000); + __m256i andmask = _mm256_set1_epi64x(0x8040201008040201); // every 8 bits -> 8 bytes, pattern repeats. + __m256i zero256 = _mm256_setzero_si256(); + __m256i masks[8]; + register __m256i c256; + masks[0] = _mm256_set1_epi8(0x1); + masks[1] = _mm256_set1_epi8(0x2); + masks[2] = _mm256_set1_epi8(0x4); + masks[3] = _mm256_set1_epi8(0x8); + masks[4] = _mm256_set1_epi8(0x10); + masks[5] = _mm256_set1_epi8(0x20); + masks[6] = _mm256_set1_epi8(0x40); + masks[7] = _mm256_set1_epi8(0x80); +#endif + + ///AssertFatal(n_segments>0&&n_segments<=8,"0 < n_segments %d <= 8\n",n_segments); + + //determine number of bits in codeword + if (block_length>3840) + { + BG=1; + Kb = 22; + nrows=46; //parity check bits + ncols=22; //info bits + } + else if (block_length<=3840) + { + BG=2; + nrows=42; //parity check bits + ncols=10; // info bits + + if (block_length>640) + Kb = 10; + else if (block_length>560) + Kb = 9; + else if (block_length>192) + Kb = 8; + else + Kb = 6; + } + + //find minimum value in all sets of lifting size + Zc=0; + for (i1=0; i1 < 51; i1++) + { + if (lift_size[i1] >= (double) block_length/Kb) + { + Zc = lift_size[i1]; + //printf("%d\n",Zc); + break; + } + } + +#ifdef DEBUG_LDPC + LOG_D(PHY,"ldpc_encoder_optim_8seg: BG %d, Zc %d, Kb %d, block_length %d, segments %d\n",BG,Zc,Kb,block_length,n_segments); + LOG_D(PHY,"ldpc_encoder_optim_8seg: PDU (seg 0) %x %x %x %x\n",test_input[0][0],test_input[0][1],test_input[0][2],test_input[0][3]); +#endif + + AssertFatal(Zc>0,"no valid Zc found for block length %d\n",block_length); + + if ((Zc&31) > 0) simd_size = 16; + else simd_size = 32; + + unsigned char c[22*Zc] __attribute__((aligned(32))); //padded input, unpacked, max size + unsigned char d[46*Zc] __attribute__((aligned(32))); //coded parity part output, unpacked, max size + + unsigned char c_extension[2*22*Zc*simd_size] __attribute__((aligned(32))); //double size matrix of c + + // calculate number of punctured bits + no_punctured_columns=(int)((nrows-2)*Zc+block_length-block_length*3)/Zc; + removed_bit=(nrows-no_punctured_columns-2) * Zc+block_length-(int)(block_length*3); + // printf("%d\n",no_punctured_columns); + // printf("%d\n",removed_bit); + // unpack input + memset(c,0,sizeof(unsigned char) * ncols * Zc); + memset(d,0,sizeof(unsigned char) * nrows * Zc); + + start_meas(tinput); +#if 0 + for (i=0; i>(i&7); + //printf("c(%d,%d)=%d\n",j,i,temp); + c[i] |= (temp << (j-macro_segment)); + } + } +#else +#ifdef __AVX2__ + for (i=0; i>5; i++) { + c256 = _mm256_and_si256(_mm256_cmpeq_epi8(_mm256_andnot_si256(_mm256_shuffle_epi8(_mm256_set1_epi32(((uint32_t*)test_input[macro_segment])[i]), shufmask),andmask),zero256),masks[0]); + //for (j=1; j>5)<<5;i>(i&7); + //printf("c(%d,%d)=%d\n",j,i,temp); + c[i] |= (temp << (j-macro_segment)); + } + } +#else + AssertFatal(1==0,"Need AVX2 for this\n"); +#endif +#endif + + stop_meas(tinput); + + if ((BG==1 && Zc>176) || (BG==2 && Zc>64)) { + // extend matrix + start_meas(tprep); + for (i1=0; i1 < ncols; i1++) + { + memcpy(&c_extension[2*i1*Zc], &c[i1*Zc], Zc*sizeof(unsigned char)); + memcpy(&c_extension[(2*i1+1)*Zc], &c[i1*Zc], Zc*sizeof(unsigned char)); + } + for (i1=1;i1>5; + uint32_t l2 = ((nrows-no_punctured_columns) * Zc-removed_bit)>>5; + __m256i *c256p = (__m256i *)&c[2*Zc]; + __m256i *d256p = (__m256i *)&d[0]; + // if (((block_length-(2*Zc))&31)>0) l1++; + + for (i=0;i0) l2++; + + for (i1=0;i1>(j-macro_segment))&1; + for (i=0;i<((nrows-no_punctured_columns) * Zc-removed_bit);i++) + //for (j=0; j>(j-macro_segment))&1; + } + +#else + AssertFatal(1==0,"Need AVX2 for now\n"); +#endif + + stop_meas(toutput); + return 0; +} + diff --git a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_generate_coefficient.c b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_generate_coefficient.c index 93edc734de..07335b2cfb 100644 --- a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_generate_coefficient.c +++ b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_generate_coefficient.c @@ -361,7 +361,7 @@ short *choose_generator_matrix(short BG,short Zc) return Gen_shift_values; } -int ldpc_encoder_orig(unsigned char *test_input,unsigned char *channel_input,short block_length,short BG,unsigned char gen_code) +int ldpc_encoder_orig(unsigned char *test_input,unsigned char *channel_input,short block_length, short BG,unsigned char gen_code) { unsigned char c[22*384]; //padded input, unpacked, max size unsigned char d[68*384]; //coded output, unpacked, max size @@ -378,26 +378,30 @@ int ldpc_encoder_orig(unsigned char *test_input,unsigned char *channel_input,sho int indlist2[1000]; //determine number of bits in codeword - if (BG==1) - { - Kb = 22; - nrows=46; //parity check bits - ncols=22; //info bits - } - else if (BG==2) - { - nrows=42; //parity check bits - ncols=10; // info bits + //if (block_length>3840) + if (BG==1) + { + //BG=1; + Kb = 22; + nrows=46; //parity check bits + ncols=22; //info bits + } + //else if (block_length<=3840) + else if (BG==2) + { + //BG=2; + nrows=42; //parity check bits + ncols=10; // info bits - if (block_length>640) - Kb = 10; - else if (block_length>560) - Kb = 9; - else if (block_length>192) - Kb = 8; - else - Kb = 6; - } + if (block_length>640) + Kb = 10; + else if (block_length>560) + Kb = 9; + else if (block_length>192) + Kb = 8; + else + Kb = 6; + } //find minimum value in all sets of lifting size Zc=0; @@ -415,8 +419,6 @@ int ldpc_encoder_orig(unsigned char *test_input,unsigned char *channel_input,sho return(-1); } - int K = ncols*Zc; - Gen_shift_values=choose_generator_matrix(BG,Zc); if (Gen_shift_values==NULL) { printf("ldpc_encoder_orig: could not find generator matrix\n"); @@ -438,15 +440,9 @@ int ldpc_encoder_orig(unsigned char *test_input,unsigned char *channel_input,sho } no_punctured_columns=(int)((nrows-2)*Zc+block_length-block_length*3)/Zc; - //nrows - no_punctured_columns = 2 +2*block_length/Zc removed_bit=(nrows-no_punctured_columns-2) * Zc+block_length-(block_length*3); - // ((nrows-no_punctured_columns) * Zc-removed_bit) = - // 2Zc + 2*block_length //printf("%d\n",no_punctured_columns); //printf("%d\n",removed_bit); - //printf("%d\n",nrows-no_punctured_columns); - //printf("%d\n",((nrows-no_punctured_columns) * Zc-removed_bit)); - // unpack input memset(c,0,sizeof(unsigned char) * ncols * Zc); memset(d,0,sizeof(unsigned char) * nrows * Zc); @@ -614,8 +610,8 @@ int ldpc_encoder_orig(unsigned char *test_input,unsigned char *channel_input,sho } // information part and puncture columns - memcpy(&channel_input[0], &c[2*Zc], (block_length-2*Zc)*sizeof(unsigned char)); //systematic bits - memcpy(&channel_input[block_length-2*Zc], &d[0], ((nrows-no_punctured_columns) * Zc-removed_bit)*sizeof(unsigned char)); //systematic bits 2Zc + 2*block_length + memcpy(&channel_input[0], &c[2*Zc], (block_length-2*Zc)*sizeof(unsigned char)); + memcpy(&channel_input[block_length-2*Zc], &d[0], ((nrows-no_punctured_columns) * Zc-removed_bit)*sizeof(unsigned char)); //memcpy(channel_input,c,Kb*Zc*sizeof(unsigned char)); return 0; } From 3feb84ca79c7d62df778fe3e093793909bccd611 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Mon, 10 Sep 2018 10:54:23 +0200 Subject: [PATCH 012/117] DL freq type 1 --- openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c index d075deea94..989394bcad 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c @@ -205,3 +205,9 @@ void nr_get_rbg_list(uint32_t bitmap, uint8_t n_rbg, uint8_t* rbg_list) { // DL alloc type 1 +static inline uint16_t get_RIV(uint16_t rb_start, uint16_t L, uint16_t N_RB) { + if ((L-1)<=(N_RB>>1)) + return (N_RB*(L-1)+rb_start); + else + return (N_RB*(N_RB-L+1) + (N_RB-1-rb_start)); +} From 5905e61ca46b2fbfd4cf7185527c1d69bfc81b8c Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Thu, 13 Sep 2018 08:47:09 +0200 Subject: [PATCH 013/117] nr adding rate matching interleaving --- cmake_targets/CMakeLists.txt | 1 + openair1/PHY/CODING/coding_defs.h | 1 + openair1/PHY/CODING/nr_rate_matching.c | 244 +++++++++++++++++++++++++ openair1/PHY/NR_REFSIG/nr_dmrs_rx.c | 4 +- 4 files changed, 248 insertions(+), 2 deletions(-) create mode 100644 openair1/PHY/CODING/nr_rate_matching.c diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 06e121608b..981d5fb08c 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1179,6 +1179,7 @@ set(PHY_SRC_COMMON ${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/nr_rate_matching.c ${OPENAIR1_DIR}/PHY/CODING/ccoding_byte.c ${OPENAIR1_DIR}/PHY/CODING/ccoding_byte_lte.c ${OPENAIR1_DIR}/PHY/CODING/3gpplte_sse.c diff --git a/openair1/PHY/CODING/coding_defs.h b/openair1/PHY/CODING/coding_defs.h index 001f17dad7..a08462c03d 100644 --- a/openair1/PHY/CODING/coding_defs.h +++ b/openair1/PHY/CODING/coding_defs.h @@ -40,6 +40,7 @@ #define MAX_TURBO_ITERATIONS max_turbo_iterations #define LTE_NULL 2 +#define NR_NULL 2 /** @addtogroup _PHY_CODING_BLOCKS_ * @{ diff --git a/openair1/PHY/CODING/nr_rate_matching.c b/openair1/PHY/CODING/nr_rate_matching.c new file mode 100644 index 0000000000..591de90f86 --- /dev/null +++ b/openair1/PHY/CODING/nr_rate_matching.c @@ -0,0 +1,244 @@ +/* + * 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_rate_matching.c + purpose: Procedures for rate matching/interleaving for NR LDPC + author: hongzhi.wang@tcl.com +*/ + +#include "PHY/defs_gNB.h" +#include "PHY/defs_nr_UE.h" + +//#define RM_DEBUG 1 + +uint8_t index_k0[2][4] = {{0,17,33,56},{0,13,25,43}}; + + +void nr_interleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f) +{ + uint32_t EQm; + + EQm = E/Qm; + memset(f,0,E*sizeof(uint8_t)); + + for (int j = 0; j< EQm; j++){ + for (int i = 0; i< Qm; i++){ + f[(i+j*Qm)] = e[(i*EQm + j)]; + } + } + +} + + +void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f) +{ + + uint32_t EQm; + + EQm = E/Qm; + memset(f,0,E*sizeof(uint8_t)); + + for (int j = 0; j< EQm; j++){ + for (int i = 0; i< Qm; i++){ + e[(i*EQm + j)] = f[(i+j*Qm)]; + } + } +} + + +uint32_t nr_rate_matching_ldpc(uint8_t Ilbrm, + uint32_t Tbslbrm, + uint8_t BG, + uint16_t Z, + uint32_t G, + uint8_t *w, + uint8_t *e, + uint8_t C, + uint8_t rvidx, + uint8_t Qm, + uint8_t Nl, + uint8_t r) +{ + uint8_t Cprime; + uint32_t Ncb,E,ind,k,Nref,N; + uint8_t *e2; + + AssertFatal(Nl>0,"Nl is 0\n"); + AssertFatal(Qm>0,"Qm is 0\n"); + + //Bit selection + N = (BG==1)?(66*Z):(50*Z); + + if (Ilbrm == 0) + Ncb = N; + else { + Nref = 3*Tbslbrm/(2*C); //R_LBRM = 2/3 + Ncb = min(N, Nref); + } + +#ifdef RM_DEBUG + printf("nr_rate_matching: Ncb %d, rvidx %d, G %d, Qm %d, Nl%d, r %d\n",Ncb,rvidx, G, Qm,Nl,r); +#endif + + Cprime = C; //assume CBGTI not present + + printf("comp r %d\n", Cprime - ((G/(Nl*Qm))%Cprime) - 1); + + if (r <= Cprime - ((G/(Nl*Qm))%Cprime) - 1) + E = Nl*Qm*(G/(Nl*Qm*Cprime)); + else + E = Nl*Qm*((G/(Nl*Qm*Cprime))+1); + + ind = (index_k0[BG-1][rvidx]*Ncb/N)*Z; + +#ifdef RM_DEBUG + printf("nr_rate_matching: E %d, k0 %d \n",E,ind); +#endif + + e2 = e; + + k=0; + + for (; (ind0,"Nl is 0\n"); + AssertFatal(Qm>0,"Qm is 0\n"); + + //Bit selection + N = (BG==1)?(66*Z):(50*Z); + + if (Ilbrm == 0) + Ncb = N; + else { + Nref = (3*Tbslbrm/(2*C)); //R_LBRM = 2/3 + Ncb = min(N, Nref); + } + + Cprime = C; //assume CBGTI not present + + if (r <= Cprime - ((G/(Nl*Qm))%Cprime) - 1) + E = Nl*Qm*(G/(Nl*Qm*Cprime)); + else + E = Nl*Qm*((G/(Nl*Qm*Cprime))+1); + + ind = (index_k0[BG-1][rvidx]*Ncb/N)*Z; + +#ifdef RM_DEBUG + printf("nr_rate_matching_ldpc_rx: Clear %d, E %d, Ncb %d,rvidx %d, G %d, Qm %d, Nl%d, r %d\n",clear,E,Ncb,rvidx, G, Qm,Nl,r); +#endif + + if (clear==1) + memset(w,0,Ncb*sizeof(int16_t)); + + soft_input2 = soft_input; + k=0; + + for (; (ind Date: Thu, 13 Sep 2018 08:55:27 +0200 Subject: [PATCH 014/117] nr minor fix ldpc interleaving --- openair1/PHY/CODING/nr_rate_matching.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/openair1/PHY/CODING/nr_rate_matching.c b/openair1/PHY/CODING/nr_rate_matching.c index 591de90f86..502fda3fa5 100644 --- a/openair1/PHY/CODING/nr_rate_matching.c +++ b/openair1/PHY/CODING/nr_rate_matching.c @@ -54,7 +54,7 @@ void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f) uint32_t EQm; EQm = E/Qm; - memset(f,0,E*sizeof(uint8_t)); + memset(e,0,E*sizeof(uint8_t)); for (int j = 0; j< EQm; j++){ for (int i = 0; i< Qm; i++){ @@ -100,8 +100,6 @@ uint32_t nr_rate_matching_ldpc(uint8_t Ilbrm, Cprime = C; //assume CBGTI not present - printf("comp r %d\n", Cprime - ((G/(Nl*Qm))%Cprime) - 1); - if (r <= Cprime - ((G/(Nl*Qm))%Cprime) - 1) E = Nl*Qm*(G/(Nl*Qm*Cprime)); else From d651fe9c5d145f3eadd5c063b1c220eb59150b23 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Thu, 13 Sep 2018 09:17:53 +0200 Subject: [PATCH 015/117] nr adding ratematching interleaving in header file --- openair1/PHY/CODING/coding_defs.h | 33 +++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/openair1/PHY/CODING/coding_defs.h b/openair1/PHY/CODING/coding_defs.h index a08462c03d..ba29dda60d 100644 --- a/openair1/PHY/CODING/coding_defs.h +++ b/openair1/PHY/CODING/coding_defs.h @@ -447,4 +447,37 @@ uint32_t nr_compute_tbs(uint8_t mcs, uint16_t length_dmrs, uint8_t Nl); +void nr_interleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f); + +void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f); + +uint32_t nr_rate_matching_ldpc(uint8_t Ilbrm, + uint32_t Tbslbrm, + uint8_t BG, + uint16_t Z, + uint32_t G, + uint8_t *w, + uint8_t *e, + uint8_t C, + uint8_t rvidx, + uint8_t Qm, + uint8_t Nl, + uint8_t r); + +int nr_rate_matching_ldpc_rx(uint8_t Ilbrm, + uint32_t Tbslbrm, + uint8_t BG, + uint16_t Z, + uint32_t G, + int16_t *w, + int16_t *soft_input, + uint8_t C, + uint8_t rvidx, + uint8_t clear, + uint8_t Qm, + uint8_t Nl, + uint8_t r, + uint32_t *E_out); + + #endif From 4ab303abb0a76346c16b5ebe139ca9d46b4719b1 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Thu, 13 Sep 2018 12:22:45 +0200 Subject: [PATCH 016/117] nr ue adding dlsch_modulation --- cmake_targets/CMakeLists.txt | 1 + .../NR_UE_TRANSPORT/nr_dlsch_demodulation.c | 2532 +++++++++++++++++ .../NR_UE_TRANSPORT/nr_transport_proto_ue.h | 51 +- openair1/PHY/phy_extern_nr_ue.h | 4 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 24 +- 5 files changed, 2565 insertions(+), 47 deletions(-) create mode 100644 openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 981d5fb08c..0207457f8d 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1324,6 +1324,7 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dmrs_nr.c ${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/nr_dlsch_demodulation.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/ ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_nr.c diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c new file mode 100644 index 0000000000..5186d0ef24 --- /dev/null +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c @@ -0,0 +1,2532 @@ +/* + * 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.0 (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 38-211, V15.2 2018-06 + * \author H.Wang + * \date 2018 + * \version 0.1 + * \company Eurecom + * \note + * \warning + */ +#include "PHY/defs_nr_UE.h" +#include "PHY/phy_extern_nr_ue.h" +#include "nr_transport_proto_ue.h" +//#include "SCHED/defs.h" +//#include "PHY/defs.h" +//#include "extern.h" +#include "PHY/sse_intrin.h" +#include "T.h" + +#ifndef USER_MODE +#define NOCYGWIN_STATIC static +#else +#define NOCYGWIN_STATIC +#endif + +/* 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 + + + +// [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 + +/* +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 nr_rx_pdsch(PHY_VARS_NR_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 nr_tti_rx, + unsigned char symbol, + unsigned char first_symbol_flag, + RX_type_t rx_type, + unsigned char i_mod, + unsigned char harq_pid) +{ + + NR_UE_COMMON *common_vars = &ue->common_vars; + NR_UE_PDSCH **pdsch_vars; + NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + PHY_NR_MEASUREMENTS *measurements = &ue->measurements; + NR_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; + NR_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; + + //to be updated higher layer + unsigned short start_rb = 0; + unsigned short nb_pdsch_rb = 106; + + 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[nr_tti_rx]]; + dlsch = ue->dlsch[ue->current_thread_id[nr_tti_rx]][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,nr_tti_rx,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 nr_tti_rx %d: no active DLSCH\n",ue->proc.proc_rxtx[0].frame_rx,nr_tti_rx); + 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 nr_tti_rx %d: Unknown PDSCH format %d\n",ue->proc.proc_rxtx[0].frame_rx,nr_tti_rx,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 0 + 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[nr_tti_rx]][slot]); +#endif + nb_rb = dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].rxdataF, + common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].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, + nr_tti_rx, + 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[nr_tti_rx]].rxdataF, + common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].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, + nr_tti_rx, + 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[nr_tti_rx]].rxdataF, + common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].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, + nr_tti_rx, + ue->high_speed_flag, + frame_parms, + dlsch0_harq->mimo_mode); + } + } else + +#endif + if (beamforming_mode==0) { //else if nb_antennas_ports_eNB==1 && beamforming_mode == 0 + nb_rb = nr_dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].rxdataF, + common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].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, + start_rb, + nb_pdsch_rb, + nr_tti_rx, + 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[nr_tti_rx]].rxdataF, + common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].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, + nr_tti_rx, + 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[nr_tti_rx]].rxdataF, + common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].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, + nr_tti_rx, + 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[nr_tti_rx]].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, + nr_tti_rx, + 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[nr_tti_rx]][slot]); +#if DISABLE_LOG_X + printf("[AbsSFN %d.%d] Slot%d Symbol %d Flag %d type %d: Pilot/Data extraction %5.2f \n",frame,nr_tti_rx,slot, + symbol,ue->high_speed_flag,type,symbol,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][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,nr_tti_rx,slot,symbol, + ue->high_speed_flag,type,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0)); +#endif +#endif + +#if UE_TIMING_TRACE + start_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]); +#endif + aatx = frame_parms->nb_antenna_ports_eNB; + aarx = frame_parms->nb_antennas_rx; + + nr_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 + { + nr_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[nr_tti_rx]][slot]); +#if DISABLE_LOG_X + printf("[AbsSFN %d.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,nr_tti_rx,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0)); +#else + LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,nr_tti_rx,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0)); +#endif +#endif + +#if UE_TIMING_TRACE + start_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][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 + + nr_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,nr_tti_rx, 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(0), T_INT(frame%1024), T_INT(nr_tti_rx), + 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[nr_tti_rx]][slot]); +#if DISABLE_LOG_X + printf("[AbsSFN %d.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f \n",frame,nr_tti_rx,slot,symbol,first_symbol_flag,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][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,nr_tti_rx,slot,symbol,first_symbol_flag,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0)); +#endif +#endif + + +#if UE_TIMING_TRACE + start_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][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)) { + nr_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); + }*/ + } + +#if 0 + 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 + + nr_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 + } +#endif + +#if UE_TIMING_TRACE + stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][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,nr_tti_rx,slot,symbol,pdsch_vars[eNB_id]->log2_maxh,proc->channel_level,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][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,nr_tti_rx,slot,symbol,pdsch_vars[eNB_id]->log2_maxh,proc->channel_level,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0)); +#endif +#endif +// MRC +#if UE_TIMING_TRACE + start_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]); +#endif + +#if 0 + 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); + } +#endif + + // 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[nr_tti_rx]][slot]); +#if DISABLE_LOG_X + printf("[AbsSFN %d.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,nr_tti_rx,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0)); +#else + LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,nr_tti_rx,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0)); +#endif +#endif + +#if UE_TIMING_TRACE + start_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][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 %x @LLR Buff(symb) %x\n", + proc->frame_rx, proc->subframe_rx,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);*/ + + 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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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,nr_tti_rx,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[nr_tti_rx]][slot]); +#if DISABLE_LOG_X + printf("[AbsSFN %d.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,nr_tti_rx,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0)); +#else + LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,nr_tti_rx,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0)); +#endif +#endif +// Please keep it: useful for debugging +#if 0 + if( (symbol == 13) && (nr_tti_rx==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[nr_tti_rx]].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[nr_tti_rx]].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[nr_tti_rx]].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[nr_tti_rx]].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[nr_tti_rx]].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[nr_tti_rx]].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 + +#if T_TRACER + T(T_UE_PHY_PDSCH_IQ, T_INT(eNB_id), T_INT(ue->Mod_id), T_INT(frame%1024), + T_INT(nr_tti_rx), 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)); +#endif + return(0); + +} + +//============================================================================================== +// Pre-processing for LLR computation +//============================================================================================== + +void nr_dlsch_channel_compensation(int **rxdataF_ext, + int **dl_ch_estimates_ext, + int **dl_ch_mag, + int **dl_ch_magb, + int **rxdataF_comp, + int **rho, + NR_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_NR_MEASUREMENTS *measurements) +{ + +#if defined(__i386) || defined(__x86_64) + + unsigned short rb; + unsigned char aatx,aarx,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; + + + //if (frame_parms->mode1_flag==1) // 10 out of 12 so don't reduce size + if (symbol == 2){ + 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 +} + + +void nr_dlsch_scale_channel(int **dl_ch_estimates_ext, + NR_DL_FRAME_PARMS *frame_parms, + NR_UE_DLSCH_t **dlsch_ue, + uint8_t symbol, + unsigned short nb_rb) +{ + +#if defined(__x86_64__)||defined(__i386__) + + short rb, ch_amp; + unsigned char aatx,aarx,pilots=0,symbol_mod; + __m128i *dl_ch128, ch_amp128; + + 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; + } + + // 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>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*nb_rb*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==2) //assume start symbol 2 + nre=6; + 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 +} + +//============================================================================================== +// Extraction functions +//============================================================================================== + +unsigned short nr_dlsch_extract_rbs_single(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 short start_rb, + unsigned short nb_pdsch_rb, + unsigned char nr_tti_rx, + uint32_t high_speed_flag, + NR_DL_FRAME_PARMS *frame_parms) { + + + + unsigned short k,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,j=0,poffset=0; + + 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->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][(symbol*(frame_parms->ofdm_symbol_size))]; + else + dl_ch0 = &dl_ch_estimates[aarx][0]; + + dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*(nb_pdsch_rb*12)]; + + rxF_ext = &rxdataF_ext[aarx][symbol*(nb_pdsch_rb*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=start_rb;rb=frame_parms->ofdm_symbol_size) { + rxF = &rxdataF[aarx][(symbol*(frame_parms->ofdm_symbol_size))]; + k=k-(frame_parms->ofdm_symbol_size); + } + + //*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]; + dl_ch0_ext[i]=dl_ch0[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&1)!=frame_parms->nushift){ + 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+=6; + rxF_ext+=6; + } + + dl_ch0+=12; + rxF+=12; + k+=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_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 ((nr_tti_rx==0) && + (l>=(nsymb>>1)) && + (l<((nsymb>>1) + 4))) { + rb_alloc_ind = 0; + } + + //SSS + if (((nr_tti_rx==0)||(nr_tti_rx==5)) && (l==sss_symb) ) { + rb_alloc_ind = 0; + } + + if (frame_parms->frame_type == FDD) { + //PSS + if (((nr_tti_rx==0)||(nr_tti_rx==5)) && (l==pss_symb) ) { + rb_alloc_ind = 0; + } + } + + //PSS + if ((frame_parms->frame_type == TDD) && + (nr_tti_rx==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 ((nr_tti_rx==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 ((nr_tti_rx==0) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) + skip_half=1; + else if ((nr_tti_rx==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) + skip_half=2; + + //SSS + if (((nr_tti_rx==0)||(nr_tti_rx==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 (((nr_tti_rx==0)||(nr_tti_rx==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==sss_symb)) + skip_half=1; + else if (((nr_tti_rx==0)||(nr_tti_rx==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb)) + skip_half=2; + if (frame_parms->frame_type == FDD) { + //PSS + if (((nr_tti_rx==0)||(nr_tti_rx==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 (((nr_tti_rx==0)||(nr_tti_rx==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb)) + skip_half=1; + else if (((nr_tti_rx==0)||(nr_tti_rx==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb)) + skip_half=2; + } + + if ((frame_parms->frame_type == TDD) && + + (nr_tti_rx==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); +} + +//============================================================================================== + +#ifdef USER_MODE + + +void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t nr_tti_rx,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[nr_tti_rx]][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[nr_tti_rx]][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[nr_tti_rx]][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[nr_tti_rx]][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[nr_tti_rx]][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[nr_tti_rx]][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[nr_tti_rx]][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[nr_tti_rx]][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[nr_tti_rx]][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[nr_tti_rx]][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[nr_tti_rx]][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[nr_tti_rx]][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[nr_tti_rx]][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[nr_tti_rx]][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[nr_tti_rx]][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[nr_tti_rx]][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); +} +#endif + +#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/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h index c5a947269a..5a7a3a74f5 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h @@ -708,7 +708,7 @@ void dlsch_detection_mrc_TM34(NR_DL_FRAME_PARMS *frame_parms, @param high_speed_flag @param frame_parms Pointer to frame descriptor */ -uint16_t dlsch_extract_rbs_single(int32_t **rxdataF, +/*uint16_t nr_dlsch_extract_rbs_single(int32_t **rxdataF, int32_t **dl_ch_estimates, int32_t **rxdataF_ext, int32_t **dl_ch_estimates_ext, @@ -718,7 +718,21 @@ uint16_t dlsch_extract_rbs_single(int32_t **rxdataF, uint8_t symbol, uint8_t subframe, uint32_t high_speed_flag, - NR_DL_FRAME_PARMS *frame_parms); + NR_DL_FRAME_PARMS *frame_parms);*/ + +unsigned short nr_dlsch_extract_rbs_single(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 short start_rb, + unsigned short nb_pdsch_rb, + unsigned char nr_tti_rx, + uint32_t high_speed_flag, + NR_DL_FRAME_PARMS *frame_parms); /** \fn dlsch_extract_rbs_dual(int32_t **rxdataF, int32_t **dl_ch_estimates, @@ -953,7 +967,7 @@ void dlsch_channel_level_TM7(int32_t **dl_bf_ch_estimates_ext, uint8_t pilots_flag, uint16_t nb_rb); -void dlsch_scale_channel(int32_t **dl_ch_estimates_ext, +void nr_dlsch_scale_channel(int32_t **dl_ch_estimates_ext, NR_DL_FRAME_PARMS *frame_parms, NR_UE_DLSCH_t **dlsch_ue, uint8_t symbol_mod, @@ -1385,37 +1399,6 @@ uint32_t ulsch_encoding(uint8_t *a, uint8_t control_only_flag, uint8_t Nbundled); - - - -/* \brief This routine demodulates the PHICH and updates PUSCH/ULSCH parameters. - @param phy_vars_ue Pointer to UE variables - @param proc Pointer to RXN_TXNp4 proc - @param subframe Subframe of received PDCCH/PHICH - @param eNB_id Index of eNB -*/ - -void rx_phich(PHY_VARS_NR_UE *phy_vars_ue, - UE_nr_rxtx_proc_t *proc, - uint8_t subframe, - uint8_t eNB_id); - - -/** \brief This routine provides the relationship between a PHICH TXOp and its corresponding PUSCH subframe (Table 8.3.-1 from 36.213). - @param frame_parms Pointer to DL frame configuration parameters - @param subframe Subframe of received/transmitted PHICH - @returns subframe of PUSCH transmission -*/ -uint8_t phich_subframe2_pusch_subframe(NR_DL_FRAME_PARMS *frame_parms,uint8_t subframe); - -/** \brief This routine provides the relationship between a PHICH TXOp and its corresponding PUSCH frame (Table 8.3.-1 from 36.213). - @param frame_parms Pointer to DL frame configuration parameters - @param frame Frame of received/transmitted PHICH - @param subframe Subframe of received/transmitted PHICH - @returns frame of PUSCH transmission -*/ -int phich_frame2_pusch_frame(NR_DL_FRAME_PARMS *frame_parms, int frame, int subframe); - void print_CQI(void *o,UCI_format_t uci_format,uint8_t eNB_id,int N_RB_DL); void fill_CQI(NR_UE_ULSCH_t *ulsch,PHY_NR_MEASUREMENTS *meas,uint8_t eNB_id, uint8_t harq_pid,int N_RB_DL, rnti_t rnti, uint8_t trans_mode,double sinr_eff); diff --git a/openair1/PHY/phy_extern_nr_ue.h b/openair1/PHY/phy_extern_nr_ue.h index 253c5b7fb9..4636f7739a 100644 --- a/openair1/PHY/phy_extern_nr_ue.h +++ b/openair1/PHY/phy_extern_nr_ue.h @@ -32,7 +32,9 @@ extern char fmageren_name2[512]; extern unsigned int RX_DMA_BUFFER[4][NB_ANTENNAS_RX]; extern unsigned int TX_DMA_BUFFER[4][NB_ANTENNAS_TX]; -#include "PHY/LTE_TRANSPORT/transport_extern.h" +//#include "PHY/LTE_TRANSPORT/transport_extern.h" + +extern short conjugate[8],conjugate2[8]; extern int number_of_cards; diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 9669dca16c..48c3e5812e 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -4018,7 +4018,7 @@ void copy_harq_proc_struct(NR_DL_UE_HARQ_t *harq_processes_dest, NR_DL_UE_HARQ_t memcpy(harq_ack_dest, current_harq_ack, sizeof(nr_harq_status_t)); }*/ -void ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_id, PDSCH_t pdsch, NR_UE_DLSCH_t *dlsch0, NR_UE_DLSCH_t *dlsch1, int s0, int s1, int abstraction_flag) { +void nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_id, PDSCH_t pdsch, NR_UE_DLSCH_t *dlsch0, NR_UE_DLSCH_t *dlsch1, int s0, int s1, int abstraction_flag) { int nr_tti_rx = proc->nr_tti_rx; int m; @@ -4078,7 +4078,7 @@ void ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_id start_meas(&ue->dlsch_llr_stats_parallelization[ue->current_thread_id[nr_tti_rx]][slot]); #endif // process DLSCH received in first slot - rx_pdsch(ue, + nr_rx_pdsch(ue, pdsch, eNB_id, eNB_id_i, @@ -5597,7 +5597,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN #endif #endif -#if 0 +//#if 0 LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx); //to update from pdsch config nr_gold_pdsch(ue,0,0, 1); @@ -5616,7 +5616,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN // do procedures for C-RNTI if (ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active == 1) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN); - ue_pdsch_procedures(ue, + nr_ue_pdsch_procedures(ue, proc, eNB_id, PDSCH, @@ -5633,7 +5633,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN // do procedures for SI-RNTI if ((ue->dlsch_SI[eNB_id]) && (ue->dlsch_SI[eNB_id]->active == 1)) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI, VCD_FUNCTION_IN); - ue_pdsch_procedures(ue, + nr_ue_pdsch_procedures(ue, proc, eNB_id, SI_PDSCH, @@ -5648,7 +5648,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN // do procedures for SI-RNTI if ((ue->dlsch_p[eNB_id]) && (ue->dlsch_p[eNB_id]->active == 1)) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P, VCD_FUNCTION_IN); - ue_pdsch_procedures(ue, + nr_ue_pdsch_procedures(ue, proc, eNB_id, P_PDSCH, @@ -5663,7 +5663,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN // do procedures for RA-RNTI if ((ue->dlsch_ra[eNB_id]) && (ue->dlsch_ra[eNB_id]->active == 1)) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA, VCD_FUNCTION_IN); - ue_pdsch_procedures(ue, + nr_ue_pdsch_procedures(ue, proc, eNB_id, RA_PDSCH, @@ -5740,7 +5740,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN #if UE_TIMING_TRACE start_meas(&ue->pdsch_procedures_stat[ue->current_thread_id[nr_tti_rx]]); #endif - ue_pdsch_procedures(ue, + nr_ue_pdsch_procedures(ue, proc, eNB_id, PDSCH, @@ -5805,7 +5805,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN // do procedures for SI-RNTI if ((ue->dlsch_SI[eNB_id]) && (ue->dlsch_SI[eNB_id]->active == 1)) { - ue_pdsch_procedures(ue, + nr_ue_pdsch_procedures(ue, proc, eNB_id, SI_PDSCH, @@ -5829,7 +5829,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN // do procedures for P-RNTI if ((ue->dlsch_p[eNB_id]) && (ue->dlsch_p[eNB_id]->active == 1)) { - ue_pdsch_procedures(ue, + nr_ue_pdsch_procedures(ue, proc, eNB_id, P_PDSCH, @@ -5852,7 +5852,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN } // do procedures for RA-RNTI if ((ue->dlsch_ra[eNB_id]) && (ue->dlsch_ra[eNB_id]->active == 1)) { - ue_pdsch_procedures(ue, + nr_ue_pdsch_procedures(ue, proc, eNB_id, RA_PDSCH, @@ -5936,7 +5936,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN #endif #endif -#endif //pdsch +//#endif //pdsch LOG_D(PHY," ****** end RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, nr_tti_rx); return (0); From d6f3297f5575c4d205688a6fce33b60738b01d60 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Thu, 13 Sep 2018 17:12:25 +0200 Subject: [PATCH 017/117] nr ue adding dlsch_decoding --- cmake_targets/CMakeLists.txt | 17 +- openair1/PHY/CODING/coding_defs.h | 3 + openair1/PHY/INIT/nr_init_ue.c | 20 +- .../NR_TRANSPORT/nr_transport_common_proto.h | 3 + .../PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 3046 +++++++++++++++++ .../NR_UE_TRANSPORT/nr_dlsch_demodulation.c | 2 +- .../NR_UE_TRANSPORT/nr_transport_proto_ue.h | 6 +- .../PHY/NR_UE_TRANSPORT/nr_transport_ue.h | 6 +- openair1/PHY/phy_vars_nr_ue.h | 6 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 72 +- targets/RT/USER/nr-uesoftmodem.c | 2 +- targets/RT/USER/nr-uesoftmodem.h | 6 +- 12 files changed, 3122 insertions(+), 67 deletions(-) create mode 100644 openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 0207457f8d..b65feb35c9 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1325,6 +1325,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/nr_dlsch_demodulation.c + ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/ ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_nr.c @@ -1586,26 +1587,26 @@ set ( NR_LTE_UE_REUSE_SRC ${OPENAIR1_DIR}/SCHED/phy_procedures_lte_common.c #${OPENAIR1_DIR}/SCHED_UE/phy_procedures_lte_ue.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/lte_mcs.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pmch_common.c + #${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pmch_common.c - ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_dl_cell_spec.c - ${OPENAIR1_DIR}/PHY/CODING/lte_segmentation.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/prach_common.c + #${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_dl_cell_spec.c + #${OPENAIR1_DIR}/PHY/CODING/lte_segmentation.c + #${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/prach_common.c # ${OPENAIR1_DIR}/PHY/INIT/lte_init_ue.c ${OPENAIR1_DIR}/PHY/CODING/crc_byte.c ${OPENAIR1_DIR}/PHY/CODING/viterbi_lte.c ${OPENAIR1_DIR}/PHY/CODING/viterbi.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/phich_common.c + #${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/phich_common.c ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci_tools_common.c - ${OPENAIR1_DIR}/PHY/CODING/lte_rate_matching.c + #${OPENAIR1_DIR}/PHY/CODING/lte_rate_matching.c ${OPENAIR1_DIR}/PHY/CODING/ccoding_byte_lte.c ${OPENAIR1_DIR}/PHY/CODING/ccoding_byte.c ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_gold.c ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_est_freq_offset.c ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ue_measurements.c - ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c + #${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c #${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c ) @@ -2391,7 +2392,7 @@ add_executable(nr-uesoftmodem target_link_libraries (nr-uesoftmodem -Wl,--start-group - RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_NR_UE_LIB PHY_NR_UE PHY_RU LFDS NR_L2_UE NR_LTE_UE_REUSE_LIB + RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_NR_UE_LIB PHY_COMMON PHY_NR_UE PHY_RU LFDS NR_L2_UE NR_LTE_UE_REUSE_LIB ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 -Wl,--end-group z dl) diff --git a/openair1/PHY/CODING/coding_defs.h b/openair1/PHY/CODING/coding_defs.h index ba29dda60d..1d7145e5cd 100644 --- a/openair1/PHY/CODING/coding_defs.h +++ b/openair1/PHY/CODING/coding_defs.h @@ -39,6 +39,9 @@ #define MAX_TURBO_ITERATIONS_MBSFN 8 #define MAX_TURBO_ITERATIONS max_turbo_iterations +#define MAX_LDPC_ITERATIONS 4 +#define MAX_LDPC_ITERATIONS_MBSFN 4 + #define LTE_NULL 2 #define NR_NULL 2 diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index d102b1f8f9..52fc4473a8 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -32,7 +32,7 @@ #include #include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h" #include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h" -#include "PHY/LTE_REFSIG/lte_refsig.h" +//#include "PHY/LTE_REFSIG/lte_refsig.h" #include "PHY/CODING/nrPolar_tools/nr_polar_pbch_defs.h" //uint8_t dmrs1_tab_ue[8] = {0,2,3,4,6,8,9,10}; @@ -905,33 +905,33 @@ 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; for (i=0; idlsch[k][i][j] = new_ue_dlsch(1,NUMBER_OF_HARQ_PID_MAX,NSOFT,MAX_TURBO_ITERATIONS,ue->frame_parms.N_RB_DL, abstraction_flag))!=NULL,"Can't get ue dlsch structures\n"); + AssertFatal((ue->dlsch[k][i][j] = new_nr_ue_dlsch(1,NUMBER_OF_HARQ_PID_MAX,NSOFT,MAX_LDPC_ITERATIONS,ue->frame_parms.N_RB_DL, abstraction_flag))!=NULL,"Can't get ue dlsch structures\n"); LOG_D(PHY,"dlsch[%d][%d][%d] => %p\n",k,i,j,ue->dlsch[i][j]); } } - AssertFatal((ue->ulsch[i] = new_ue_ulsch(ue->frame_parms.N_RB_UL, abstraction_flag))!=NULL,"Can't get ue ulsch structures\n"); + //AssertFatal((ue->ulsch[i] = new_ue_ulsch(ue->frame_parms.N_RB_UL, abstraction_flag))!=NULL,"Can't get ue ulsch structures\n"); - ue->dlsch_SI[i] = new_ue_dlsch(1,1,NSOFT,MAX_TURBO_ITERATIONS,ue->frame_parms.N_RB_DL, abstraction_flag); - ue->dlsch_ra[i] = new_ue_dlsch(1,1,NSOFT,MAX_TURBO_ITERATIONS,ue->frame_parms.N_RB_DL, abstraction_flag); + ue->dlsch_SI[i] = new_nr_ue_dlsch(1,1,NSOFT,MAX_LDPC_ITERATIONS,ue->frame_parms.N_RB_DL, abstraction_flag); + ue->dlsch_ra[i] = new_nr_ue_dlsch(1,1,NSOFT,MAX_LDPC_ITERATIONS,ue->frame_parms.N_RB_DL, 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); + ue->dlsch_MCH[0] = new_nr_ue_dlsch(1,NUMBER_OF_HARQ_PID_MAX,NSOFT,MAX_LDPC_ITERATIONS_MBSFN,ue->frame_parms.N_RB_DL,0); -}*/ +} void phy_init_nr_top(PHY_VARS_NR_UE *ue) { diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h index b014748bca..69d8aedf51 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h +++ b/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h @@ -33,6 +33,9 @@ #ifndef __NR_TRANSPORT_COMMON_PROTO__H__ #define __NR_TRANSPORT_COMMON_PROTO__H__ +#define MAX_NUM_NR_DLSCH_SEGMENTS 30 +#define MAX_NUM_NR_ULSCH_SEGMENTS MAX_NUM_NR_DLSCH_SEGMENTS + // Functions below implement minor procedures from 38-214 /** \brief Computes Q based on I_MCS PDSCH and when 'MCS-Table-PDSCH' is set to "256QAM". Implements Table 5.1.3.1-2 from 38.214. diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c new file mode 100644 index 0000000000..245f7dcaad --- /dev/null +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -0,0 +1,3046 @@ +/* + * 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.0 (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/NR_UE_TRANSPORT/nr_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 "PHY/defs_nr_UE.h" +#include "PHY/phy_extern_nr_ue.h" +#include "PHY/CODING/coding_extern.h" +#include "PHY/CODING/coding_defs.h" +#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h" +//#include "SCHED/extern.h" +#include "SIMULATION/TOOLS/sim.h" +#include "targets/RT/USER/nr-uesoftmodem.h" +#include "PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.h" +#include "PHY/CODING/nrLDPC_decoder/nrLDPC_types.h" +//#define DEBUG_DLSCH_DECODING + +#define OAI_LDPC_MAX_NUM_LLR 27000//26112 // NR_LDPC_NCOL_BG1*NR_LDPC_ZMAX + +static int8_t llrProcBuf[OAI_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32))); + +static uint64_t nb_total_decod =0; +static uint64_t nb_error_decod =0; + +//extern double cpuf; + +void free_nr_ue_dlsch(NR_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+1056); + dlsch->harq_processes[i]->c[r] = NULL; + } + + for (r=0; rharq_processes[i]->d[r]) { + free16(dlsch->harq_processes[i]->d[r],((3*8*8448)+12+96)*sizeof(short)); + dlsch->harq_processes[i]->d[r] = NULL; + } + + free16(dlsch->harq_processes[i],sizeof(NR_DL_UE_HARQ_t)); + dlsch->harq_processes[i] = NULL; + } + } + + free16(dlsch,sizeof(NR_UE_DLSCH_t)); + dlsch = NULL; + } +} + +NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t max_ldpc_iterations,uint8_t N_RB_DL, uint8_t abstraction_flag) +{ + + NR_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 = (NR_UE_DLSCH_t *)malloc16(sizeof(NR_UE_DLSCH_t)); + + if (dlsch) { + memset(dlsch,0,sizeof(NR_UE_DLSCH_t)); + dlsch->Kmimo = Kmimo; + dlsch->Mdlharq = Mdlharq; + dlsch->Nsoft = Nsoft; + dlsch->max_ldpc_iterations = max_ldpc_iterations; + + for (i=0; iharq_processes[i] = (NR_DL_UE_HARQ_t *)malloc16(sizeof(NR_DL_UE_HARQ_t)); + + if (dlsch->harq_processes[i]) { + memset(dlsch->harq_processes[i],0,sizeof(NR_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+ 1056); + + if (dlsch->harq_processes[i]->c[r]) + memset(dlsch->harq_processes[i]->c[r],0,((r==0)?8:0) + 3+ 1056); + else + exit_flag=2; + + dlsch->harq_processes[i]->d[r] = (short*)malloc16(((3*8*8448)+12+96)*sizeof(short)); + + if (dlsch->harq_processes[i]->d[r]) + memset(dlsch->harq_processes[i]->d[r],0,((3*8*8448)+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(NR_DL_UE_HARQ_t), exit_flag); + free_nr_ue_dlsch(dlsch); + + return(NULL); +} + +uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, + short *dlsch_llr, + NR_DL_FRAME_PARMS *frame_parms, + NR_UE_DLSCH_t *dlsch, + NR_DL_UE_HARQ_t *harq_process, + uint32_t frame, + uint8_t nr_tti_rx, + 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; + int32_t no_iteration_ldpc; + // uint8_t dummy_channel_output[(3*8*block_length)+12]; + short dummy_w[MAX_NUM_DLSCH_SEGMENTS][3*(8448+64)]; + uint32_t r,r_offset=0,Kr,Kr_bytes,err_flag=0, Kr_int; + uint8_t crc_type; + t_nrLDPC_dec_params decParams; + t_nrLDPC_dec_params* p_decParams = &decParams; + t_nrLDPC_time_stats procTime; + t_nrLDPC_time_stats* p_procTime =&procTime ; + int16_t z [68*384]; + int8_t l [68*384]; + //__m128i l; + int16_t inv_d [68*384]; + int16_t *p_invd =&inv_d; + uint8_t kb, kc; + uint8_t Ilbrm = 0; + uint32_t Tbslbrm = 950984; //to compute tbs + uint16_t nb_prb = 106; //to update + + uint32_t i,j; + uint32_t k; + + __m128i *pv = (__m128i*)&z; + __m128i *pl = (__m128i*)&l; + + if (!dlsch_llr) { + printf("dlsch_decoding.c: NULL dlsch_llr pointer\n"); + return(dlsch->max_ldpc_iterations); + } + + if (!harq_process) { + printf("dlsch_decoding.c: NULL harq_process pointer\n"); + return(dlsch->max_ldpc_iterations); + } + + if (!frame_parms) { + printf("dlsch_decoding.c: NULL frame_parms pointer\n"); + return(dlsch->max_ldpc_iterations); + } + + if (nr_tti_rx> (10*frame_parms->ttis_per_subframe-1)) { + printf("dlsch_decoding.c: Illegal subframe index %d\n",nr_tti_rx); + return(dlsch->max_ldpc_iterations); + } + + if (harq_process->harq_ack.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, nr_tti_rx, harq_process->harq_ack.ack); + } + + // 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_ldpc_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_ldpc_iterations); + } + */ + + harq_process->trials[harq_process->round]++; + + A = harq_process->TBS; + ret = dlsch->max_ldpc_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; + nr_segmentation(NULL, + NULL, + harq_process->B, + &harq_process->C, + &harq_process->Kplus, + &harq_process->Kminus, + &harq_process->Z, + &harq_process->F); + p_decParams->Z = harq_process->Z; + //printf("dlsch decoding nr segmentation Z %d\n", p_decParams->Z); + //if (!frame%100) + //printf("Kplus %d C %d Z %d nl %d \n", harq_process->Kplus, harq_process->C, p_decParams->Z, harq_process->Nl); + + } + + kb = harq_process->Kplus/harq_process->Z; + if ( kb==22){ + p_decParams->BG = 1; + p_decParams->R = 13; + kc = 68; + } + else{ + p_decParams->BG = 2; + p_decParams->R = 13; + kc = 52; + } + + p_decParams->numMaxIter = 2; + Kr = p_decParams->Z*kb; + p_decParams->outMode= 0; + + + 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_ldpc_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; + + Kr = harq_process->Kplus; + Kr_bytes = Kr>>3; + + Tbslbrm = nr_compute_tbs(harq_process->mcs,nb_prb,frame_parms->symbols_per_slot,0,0, harq_process->Nl); + + for (r=0; rC; r++) { + + Kr = harq_process->Kplus; + +#if UE_TIMING_TRACE + start_meas(dlsch_rate_unmatching_stats); +#endif + +#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 + + if (nr_rate_matching_ldpc_rx(Ilbrm, + Tbslbrm, + p_decParams->BG, + p_decParams->Z, + G, + harq_process->w[r], + dlsch_llr+r_offset, + harq_process->C, + 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_ldpc_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 + nr_deinterleaving_ldpc(E, + harq_process->Qm, + &harq_process->d[r], + 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; + + 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_ldpc_iterations); +*/ + +#if UE_TIMING_TRACE + start_meas(dlsch_turbo_decoding_stats); +#endif + + //LOG_E(PHY,"AbsSubframe %d.%d Start turbo segment %d/%d A %d ",frame%1024,nr_tti_rx,r,harq_process->C-1, A); + + //printf("harq process dr iteration %d\n", p_decParams->numMaxIter); + //66*p_decParams->Z + + //if (A < 1000){ + for (int cnt =0; cnt < (kc-2)*p_decParams->Z; cnt++){ + inv_d[cnt] = (-1)*harq_process->d[r][96+cnt]; + } + //} + + /*for (int cnt =0; cnt < 8; cnt++){ + printf("dr %d inv_d %d \n", harq_process->d[r][96+cnt], inv_d[cnt]); + } + + printf(" \n");*/ + + /*printf("end dr \n"); + for (int cnt =(50*p_decParams->Z-16) ; cnt < 50*p_decParams->Z; cnt++){ + printf("%d ", harq_process->d[r][96+cnt]); + } + printf(" \n");*/ + + memset(pv,0,2*p_decParams->Z*sizeof(int16_t)); + //memset(pl,0,2*p_decParams->Z*sizeof(int8_t)); + + + for (i=2*p_decParams->Z/8, j = 0; i < (kc*p_decParams->Z/8+1); i++, j++) + { + pv[i]= _mm_loadu_si128((__m128i*)(&inv_d[8*j])); + } + + for (i=0, j=0; j < (kc*p_decParams->Z/16); i+=2, j++) + { + + pl[j] = _mm_packs_epi16(pv[i],pv[i+1]); + + } + + no_iteration_ldpc = nrLDPC_decoder(p_decParams, + (int8_t*)&pl[0], + llrProcBuf, + p_procTime); + /* + if (check_crc(llrProcBuf,Kr,crc_type)) { + printf("CRC OK\n"); + ret = 2; + } + else { + printf("CRC NOK\n"); + ret = 1+dlsch->max_ldpc_iterations; + } + */ + + nb_total_decod++; + if (no_iteration_ldpc > 10){ + nb_error_decod++; + ret = 1+dlsch->max_ldpc_iterations; + } + else { + ret=2; + } + if (!nb_total_decod%10000){ + printf("Error number of iteration LPDC %d %ld/%ld \n", no_iteration_ldpc, nb_error_decod,nb_total_decod);fflush(stdout); + } + + //else + //printf("OK number of iteration LPDC %d\n", no_iteration_ldpc); + + for (int m=0; m < Kr>>3; m ++) + { + harq_process->c[r][m]= (uint8_t) llrProcBuf[m]; + } + +#ifdef DEBUG_DLSCH_DECODING + printf("output decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]); + printf("no_iterations_ldpc %d (ret %d)\n",no_iteration_ldpc,ret); + write_output("dec_output.m","dec0",harq_process->c[0],Kr_bytes,1,4); +#endif + + +#if UE_TIMING_TRACE + stop_meas(dlsch_turbo_decoding_stats); +#endif + } + + /*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));*/ + + + if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break; + LOG_W(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_tti_rx,r,harq_process->C-1); + err_flag = 1; + } + } + + int32_t frame_rx_prev = frame; + int32_t tti_rx_prev = nr_tti_rx - 1; + if (tti_rx_prev < 0) { + frame_rx_prev--; + tti_rx_prev += 10*frame_parms->ttis_per_subframe; + } + 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, nr_tti_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round); +#endif + harq_process->harq_ack.ack = 0; + harq_process->harq_ack.harq_id = harq_pid; + harq_process->harq_ack.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 nr_tti_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n", + phy_vars_ue->Mod_id,nr_tti_rx,harq_pid,harq_process->status,harq_process->round,dlsch->Mdlharq,harq_process->TBS); + } + + return((1+dlsch->max_ldpc_iterations)); + } else { +#if UE_DEBUG_TRACE + LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for nr_tti_rx %d TBS %d mcs %d nb_rb %d harq_process->round %d\n", + phy_vars_ue->Mod_id,nr_tti_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb, harq_process->round); +#endif + + harq_process->status = SCH_IDLE; + harq_process->round = 0; + harq_process->harq_ack.ack = 1; + harq_process->harq_ack.harq_id = harq_pid; + harq_process->harq_ack.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 nr_tti_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,nr_tti_rx,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++) { + + 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); +} + +#ifdef UE_DLSCH_PARALLELISATION +uint32_t dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue, + UE_rxtx_proc_t *proc, + int eNB_id, + short *dlsch_llr, + NR_DL_FRAME_PARMS *frame_parms, + NR_UE_DLSCH_t *dlsch, + NR_DL_UE_HARQ_t *harq_process, + uint32_t frame, + uint8_t nr_tti_rx, + 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*(8448+64)]; + uint32_t r,r_offset=0,Kr,Kr_bytes,err_flag=0,Kr_int,kb,kc; + uint8_t crc_type; + //UE_rxtx_proc_t *proc = &phy_vars_ue->proc; + int32_t no_iteration_ldpc; + int Cby2; + /*uint8_t C; + uint8_t Qm; + uint8_t Nl; + uint8_t r_thread; + uint32_t Er, Gp,GpmodC;*/ + t_nrLDPC_dec_params decParams; + t_nrLDPC_dec_params* p_decParams = &decParams; + t_nrLDPC_time_stats procTime; + t_nrLDPC_time_stats* p_procTime =&procTime ; + int16_t z [68*384]; + int8_t l [68*384]; + //__m128i l; + int16_t inv_d [68*384]; + int16_t *p_invd =&inv_d; + + uint32_t i,j; + uint32_t k; + + __m128i *pv = (__m128i*)&z; + __m128i *pl = (__m128i*)&l; + + +#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 + uint8_t (*tc)(int16_t *y, + 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 *); + + + + + if (!dlsch_llr) { + printf("dlsch_decoding.c: NULL dlsch_llr pointer\n"); + return(dlsch->max_ldpc_iterations); + } + + if (!harq_process) { + printf("dlsch_decoding.c: NULL harq_process pointer\n"); + return(dlsch->max_ldpc_iterations); + } + + if (!frame_parms) { + printf("dlsch_decoding.c: NULL frame_parms pointer\n"); + return(dlsch->max_ldpc_iterations); + } + + if (nr_tti_rx> (10*frame_parms->ttis_per_subframe-1)) { + printf("dlsch_decoding.c: Illegal subframe index %d\n",nr_tti_rx); + return(dlsch->max_ldpc_iterations); + } + + if (dlsch->harq_ack[nr_tti_rx].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, nr_tti_rx, dlsch->harq_ack[nr_tti_rx].ack); + } + + if (llr8_flag == 0) { + //#ifdef __AVX2__ +#if 0 + tc_2cw = phy_threegpplte_turbo_decoder16avx2; +#endif + tc = phy_threegpplte_turbo_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 = phy_threegpplte_turbo_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_ldpc_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_ldpc_iterations); + } + */ + + + harq_process->trials[harq_process->round]++; + + A = harq_process->TBS; //2072 for QPSK 1/3 + + ret = dlsch->max_ldpc_iterations; + + + G = harq_process->G; + + proc->decoder_main_available = 1; + proc->decoder_thread_available = 0; + proc->decoder_thread_available1 = 0; + //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; + #ifdef TD_DECODING + 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 + nr_segmentation(NULL, + NULL, + harq_process->B, + &harq_process->C, + &harq_process->Kplus, + &harq_process->Kminus, + &harq_process->Z, + &harq_process->F); + p_decParams->Z = harq_process->Z; + #endif + + } + + kb = harq_process->Kplus/harq_process->Z; + if ( kb==22){ + p_decParams->BG = 1; + p_decParams->R = 89; + kc = 68; + } + else{ + p_decParams->BG = 2; + p_decParams->R = 13; + kc = 52; + } + + p_decParams->numMaxIter = 2; + Kr = p_decParams->Z*kb; + p_decParams->outMode= 0; + + /* + else { + printf("dlsch_decoding.c: Ndi>0 not checked yet!!\n"); + return(max_ldpc_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_ldpc_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; +if (harq_process->C>1) { // wakeup worker if more than 1 segment + if (pthread_mutex_lock(&proc->mutex_dlsch_td) != 0) { + LOG_E( PHY, "[SCHED][UE %d][Slot0] error locking mutex for UE dlsch td\n",phy_vars_ue->Mod_id ); + exit_fun("nothing to add"); + } + + /*Qm= harq_process->Qm; + Nl=harq_process->Nl; + r_thread = harq_process->C/2-1; + C= harq_process->C; + + Gp = G/Nl/Qm; + GpmodC = Gp%C; + + + + if (r_thread < (C-(GpmodC))) + Er = Nl*Qm * (Gp/C); + else + Er = Nl*Qm * ((GpmodC==0?0:1) + (Gp/C)); + printf("mthread Er %d\n", Er); + + printf("mthread instance_cnt_dlsch_td %d\n", proc->instance_cnt_dlsch_td);*/ + + proc->instance_cnt_dlsch_td++; + proc->eNB_id = eNB_id; + proc->harq_pid = harq_pid; + proc->llr8_flag = llr8_flag; + //proc->r[0] = 1; + + if (proc->instance_cnt_dlsch_td == 0) + { + LOG_D(PHY,"unblock dlsch td processing thread blocked on instance_cnt_dlsch_td : %d \n", proc->instance_cnt_dlsch_td ); + if (pthread_cond_signal(&proc->cond_dlsch_td) != 0) { + LOG_E( PHY, "[SCHED][UE %d][Slot0] ERROR pthread_cond_signal for UE dlsch td\n", phy_vars_ue->Mod_id); + exit_fun("nothing to add"); + } + if (pthread_mutex_unlock(&proc->mutex_dlsch_td) != 0) { + LOG_E( PHY, "[SCHED][UE %d][Slot0] error unlocking mutex for UE dlsch td \n",phy_vars_ue->Mod_id ); + exit_fun("nothing to add"); + } + + } else + { + LOG_E( PHY, "[SCHED][UE %d] UE dlsch td thread busy (IC %d)!!\n", phy_vars_ue->Mod_id, proc->instance_cnt_dlsch_td); + if (proc->instance_cnt_dlsch_td > 4) + exit_fun("instance_cnt_dlsch_td > 4"); + } + //AssertFatal(pthread_cond_signal(&proc->cond_slot1_dl_processing) ==0 ,""); + AssertFatal(pthread_mutex_unlock(&proc->mutex_dlsch_td) ==0,""); + + if (harq_process->C>2) { + if (pthread_mutex_lock(&proc->mutex_dlsch_td1) != 0) { + LOG_E( PHY, "[SCHED][UE %d][Slot0] error locking mutex for UE dlsch td\n",phy_vars_ue->Mod_id ); + exit_fun("nothing to add"); + } + + proc->instance_cnt_dlsch_td1++; + proc->eNB_id = eNB_id; + proc->harq_pid = harq_pid; + proc->llr8_flag = llr8_flag; + // proc->Er = Er; + + if (proc->instance_cnt_dlsch_td1 == 0) + { + LOG_D(PHY,"unblock slot1 dl processing thread blocked on instance_cnt_dlsch_td : %d \n", proc->instance_cnt_dlsch_td1 ); + if (pthread_cond_signal(&proc->cond_dlsch_td1) != 0) { + LOG_E( PHY, "[SCHED][UE %d][Slot0] ERROR pthread_cond_signal for UE dlsch td\n", phy_vars_ue->Mod_id); + exit_fun("nothing to add"); + } + if (pthread_mutex_unlock(&proc->mutex_dlsch_td1) != 0) { + LOG_E( PHY, "[SCHED][UE %d][Slot0] error unlocking mutex for UE dlsch td \n",phy_vars_ue->Mod_id ); + exit_fun("nothing to add"); + } + + } else + { + LOG_E( PHY, "[SCHED][UE %d] UE dlsch td thread 1 busy (IC %d)!!\n", phy_vars_ue->Mod_id, proc->instance_cnt_dlsch_td1); + if (proc->instance_cnt_dlsch_td1 > 4) + exit_fun("instance_cnt_dlsch_td1 > 4"); + } + + AssertFatal(pthread_mutex_unlock(&proc->mutex_dlsch_td1) ==0,""); + + } + /* + if (pthread_mutex_timedlock(&proc->mutex_td,&wait) != 0) { + printf("[eNB] ERROR pthread_mutex_lock for TD thread (IC %d)\n", proc->instance_cnt_td); + exit_fun( "error locking mutex_fep" ); + return -1; + } + + if (proc->instance_cnt_td==0) { + printf("[UE] TD thread busy\n"); + exit_fun("TD thread busy"); + pthread_mutex_unlock( &proc->mutex_td ); + return -1; + } + + ++proc->instance_cnt_td; + + proc->tdp.UE = phy_vars_ue; + proc->tdp.eNB_id = eNB_id; + proc->tdp.harq_pid = harq_pid; + proc->tdp.llr8_flag = llr8_flag; + + printf("----- 2thread llr flag %d tdp flag %d\n",llr8_flag, proc->tdp.llr8_flag); + + + // wakeup worker to do second half segments + if (pthread_cond_signal(&proc->cond_td) != 0) { + printf("[UE] ERROR pthread_cond_signal for td thread exit\n"); + exit_fun( "ERROR pthread_cond_signal" ); + return (1+dlsch->last_iteration_cnt); + } + + pthread_mutex_unlock( &proc->mutex_td );*/ + + + Cby2 = 1; //harq_process->C/2; + //proc->decoder_main_available = 1; + } + else { + Cby2 = 1; + } + + for (r=0; rCminus) + Kr = harq_process->Kminus; + else + Kr = harq_process->Kplus; +#else + Kr = harq_process->Kplus; +#endif + + Kr_bytes = Kr>>3; + + //workaround for nr ldpc using lte interleaving + if (dlsch->harq_processes[harq_pid]->C >= 2) + Kr_int = G/(3*dlsch->harq_processes[harq_pid]->C); + else + Kr_int = Kr; + + 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_ldpc_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*(8448+64)*sizeof(short)); + harq_process->RTC[r] = generate_dummy_w(Kr_int, + (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_ldpc_iterations); + } else + { +#if UE_TIMING_TRACE + stop_meas(dlsch_rate_unmatching_stats); +#endif + } + r_offset += E; + //printf("main thread r_offset %d\n",r_offset); + + /* + 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_ldpc_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,"mthread AbsSubframe %d.%d Start turbo segment %d/%d \n",frame%1024,nr_tti_rx,r,harq_process->C-1); +#ifdef TD_DECODING + ret = tc + (&harq_process->d[r][96], + harq_process->c[r], + Kr, + f1f2mat_old[iind*2], + f1f2mat_old[(iind*2)+1], + dlsch->max_ldpc_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); + +#else + + memset(pv,0,2*p_decParams->Z*sizeof(int16_t)); + //memset(pl,0,2*p_decParams->Z*sizeof(int8_t)); + + //if (A < 1000){ + + for (i=2*p_decParams->Z/8, j = 0; i < (68*p_decParams->Z/8+1); i++, j++) + { + pv[i]= _mm_loadu_si128((__m128i*)(&inv_d[8*j])); + } + /*} + else{ + for (i=2*p_decParams->Z/8, j = 0; i < (68*p_decParams->Z/8+1); i++, j++) + { + pv[i]= _mm_loadu_si128((__m128i*)&harq_process->d[r][96+8*j]); + } + }*/ + for (i=0, j=0; j < (68*p_decParams->Z/16); i+=2, j++) + { + //printf("mm packs i %d j %d\n", i, j); + //print128_num(pv[i]); + //print128_num(pv[i+1]); + pl[j] = _mm_packs_epi16(pv[i],pv[i+1]); + //print128_num2bytes(pl[j]); + } + + no_iteration_ldpc = nrLDPC_decoder(p_decParams, + &pl[0], + llrProcBuf, + p_procTime); + + if (no_iteration_ldpc > 2) + printf("Error number of iteration LPDC %d\n", no_iteration_ldpc); + //else + //printf("OK number of iteration LPDC %d\n", no_iteration_ldpc); + + for (int m=0; m < Kr>>3; m ++) + { + harq_process->c[r][m]= (uint8_t) llrProcBuf[m]; + } + + /*for (int u=0; u < Kr>>3; u ++) + { + ullrProcBuf[u]= (uint8_t) llrProcBuf[u]; + } + + + printf("output unsigned ullrProcBuf \n"); + + for (int j=0; j < Kr>>3; j ++) + { + + printf(" %d \n", ullrProcBuf[j]); + + } + printf(" \n");*/ +#endif + //printf("output channel decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]); + + //printf("output decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]); + + +#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_ldpc_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_ldpc_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_ldpc_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_ldpc_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_ldpc_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_ldpc_iterations))) {// a Code segment is in error so break; + LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_tti_rx,r,harq_process->C-1); + err_flag = 1; + } + } + + int32_t frame_rx_prev = frame; + int32_t tti_rx_prev = nr_tti_rx - 1; + if (tti_rx_prev < 0) { + frame_rx_prev--; + tti_rx_prev += 10*frame_parms->ttis_per_subframe; + } + 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, nr_tti_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round); +#endif + dlsch->harq_ack[nr_tti_rx].ack = 0; + dlsch->harq_ack[nr_tti_rx].harq_id = harq_pid; + dlsch->harq_ack[nr_tti_rx].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 nr_tti_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n", + phy_vars_ue->Mod_id,nr_tti_rx,harq_pid,harq_process->status,harq_process->round,dlsch->Mdlharq,harq_process->TBS); + } + + return((1+dlsch->max_ldpc_iterations)); + } else { +#if UE_DEBUG_TRACE + LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for nr_tti_rx %d TBS %d mcs %d nb_rb %d\n", + phy_vars_ue->Mod_id,nr_tti_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb); +#endif + + harq_process->status = SCH_IDLE; + harq_process->round = 0; + dlsch->harq_ack[nr_tti_rx].ack = 1; + dlsch->harq_ack[nr_tti_rx].harq_id = harq_pid; + dlsch->harq_ack[nr_tti_rx].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 nr_tti_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,nr_tti_rx,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); + */ + uint32_t wait = 0; + if (harq_process->C==2){ + while((proc->decoder_thread_available == 0) ) + { + usleep(1); + wait++; + } + } + else if ((harq_process->C==3) ){ + while((proc->decoder_thread_available == 0) || (proc->decoder_thread_available1 == 0)) + { + usleep(1); + wait++; + } + } + + proc->decoder_main_available = 0; + + 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; + //proc->decoder_thread_available = 0; + //proc->decoder_main_available = 0; + + //wait for worker to finish + //wait_on_busy_condition(&proc->mutex_td,&proc->cond_td,&proc->instance_cnt_dlsch td,"dlsch td thread"); + + //return( (ret>proc->tdp.ret) ? ret : proc->tdp.ret ); + + return(ret); +} +#endif + +#ifdef UE_DLSCH_PARALLELISATION +#define FIFO_PRIORITY 39 +uint32_t dlsch_decoding_2thread0(void *arg) +{ + static __thread int UE_dlsch_td_retval; + struct rx_tx_thread_data *rtd = arg; + UE_rxtx_proc_t *proc = rtd->proc; + PHY_VARS_NR_UE *phy_vars_ue = rtd->UE; + + int llr8_flag1; + int32_t no_iteration_ldpc; + t_nrLDPC_dec_params decParams; + t_nrLDPC_dec_params* p_decParams = &decParams; + t_nrLDPC_time_stats procTime; + t_nrLDPC_time_stats* p_procTime =&procTime ; + int16_t z [68*384]; + int8_t l [68*384]; + //__m128i l; + int16_t inv_d [68*384]; + int16_t *p_invd =&inv_d; + + uint32_t i,j; + uint32_t k; + + __m128i *pv = (__m128i*)&z; + __m128i *pl = (__m128i*)&l; + + proc->instance_cnt_dlsch_td=-1; + proc->nr_tti_rx=proc->sub_frame_start; + + proc->decoder_thread_available = 0; + + char threadname[256]; + sprintf(threadname,"UE_thread_dlsch_td_%d", proc->sub_frame_start); + + cpu_set_t cpuset; + CPU_ZERO(&cpuset); + if ( (proc->sub_frame_start+1)%RX_NB_TH == 0 && threads.dlsch_td_one != -1 ) + CPU_SET(threads.dlsch_td_one, &cpuset); + if ( (proc->sub_frame_start+1)%RX_NB_TH == 1 && threads.dlsch_td_two != -1 ) + CPU_SET(threads.dlsch_td_two, &cpuset); + if ( (proc->sub_frame_start+1)%RX_NB_TH == 2 && threads.dlsch_td_three != -1 ) + CPU_SET(threads.dlsch_td_three, &cpuset); + + + +#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*(8448+64)]; + uint32_t r,r_offset=0,Kr,Kr_bytes,err_flag=0,Kr_int; + uint8_t crc_type; + uint8_t C; + uint8_t Qm; + uint8_t Nl; + uint32_t Er, Gp,GpmodC; +#ifdef DEBUG_DLSCH_DECODING + uint16_t i; +#endif + //#ifdef __AVX2__ + + uint8_t (*tc)(int16_t *y, + 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 *); + if (llr8_flag1 == 0) { + //#ifdef __AVX2__ +#if 0 + tc_2cw = phy_threegpplte_turbo_decoder16avx2; +#endif + tc = phy_threegpplte_turbo_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 = phy_threegpplte_turbo_decoder8; + } + + init_thread(900000,1000000 , FIFO_PRIORITY-1, &cpuset, threadname); + while (!oai_exit) { + + //proc->decoder_thread_available = 1; + + if (pthread_mutex_lock(&proc->mutex_dlsch_td) != 0) { + LOG_E( PHY, "[SCHED][UE] error locking mutex for UE dlsch td\n" ); + exit_fun("nothing to add"); + } + while (proc->instance_cnt_dlsch_td < 0) { + // most of the time, the thread is waiting here + pthread_cond_wait( &proc->cond_dlsch_td, &proc->mutex_dlsch_td ); + } + if (pthread_mutex_unlock(&proc->mutex_dlsch_td) != 0) { + LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE dlsch_td \n" ); + exit_fun("nothing to add"); + } + + uint32_t wait = 0; + while(proc->decoder_main_available == 0) + { + usleep(1); + wait++; + } + + //proc->decoder_thread_available = 0; + //PHY_VARS_NR_UE *phy_vars_ue = tdp->UE; + int eNB_id = proc->eNB_id; + int harq_pid = proc->harq_pid; + llr8_flag1 = proc->llr8_flag; + //r_offset = proc->Er; + //UE_rxtx_proc_t *proc = tdp->proc; + int frame = proc->frame_rx; + int subframe = proc->nr_tti_rx; + NR_UE_DLSCH_t *dlsch = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]; + NR_DL_UE_HARQ_t *harq_process = dlsch->harq_processes[harq_pid]; + short *dlsch_llr = phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[0]; + //printf("2thread0 llr flag %d tdp flag %d\n",llr8_flag1, tdp->llr8_flag); + + // 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_ldpc_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_ldpc_iterations); + } + */ + + + + harq_process->trials[harq_process->round]++; + + A = harq_process->TBS; //2072 for QPSK 1/3 + + ret = dlsch->max_ldpc_iterations; + + + G = harq_process->G; + //get_G(frame_parms,nb_rb,dlsch->rb_alloc,mod_order,num_pdcch_symbols,phy_vars_ue->frame,subframe); + + if (harq_process->round == 0) { + // This is a new packet, so compute quantities regarding segmentation + harq_process->B = A+24; + #ifdef TD_DECODING + 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 + nr_segmentation(NULL, + NULL, + harq_process->B, + &harq_process->C, + &harq_process->Kplus, + &harq_process->Kminus, + &harq_process->Z, + &harq_process->F); + p_decParams->Z = harq_process->Z; + #endif + + } + + // p_decParams->Z = 128; + p_decParams->BG = 1; + p_decParams->R = 89; + p_decParams->numMaxIter = 2; + Kr = p_decParams->Z*22; + p_decParams->outMode= 0; + + /* + else { + printf("dlsch_decoding.c: Ndi>0 not checked yet!!\n"); + return(max_ldpc_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_ldpc_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; + + Qm= harq_process->Qm; + Nl=harq_process->Nl; + //r_thread = harq_process->C/2-1; + C= harq_process->C; + + Gp = G/Nl/Qm; + GpmodC = Gp%C; + + + + if ((C/2-1) < (C-(GpmodC))) + r_offset = Nl*Qm * (Gp/C); + else + r_offset = Nl*Qm * ((GpmodC==0?0:1) + (Gp/C)); + + // printf("thread0 r_offset %d\n",r_offset); + + //for (r=(harq_process->C/2); rC; r++) { + r=1; //(harq_process->C/2); + + // Get Turbo interleaver parameters +#ifdef TD_DECODING + if (rCminus) + Kr = harq_process->Kminus; + else + Kr = harq_process->Kplus; +#else + Kr = harq_process->Kplus; +#endif + + Kr_bytes = Kr>>3; + + //workaround for nr ldpc using lte interleaving + if (dlsch->harq_processes[harq_pid]->C >= 2) + Kr_int = G/(3*dlsch->harq_processes[harq_pid]->C); + else + Kr_int = Kr; + + 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_ldpc_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*(8448+64)*sizeof(short)); + harq_process->RTC[r] = generate_dummy_w(Kr_int, + (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_ldpc_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_ldpc_iterations); +*/ + if (llr8_flag1) { + 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); +#ifdef TD_DECODING + ret = tc + (&harq_process->d[r][96], + harq_process->c[r], + Kr, + f1f2mat_old[iind*2], + f1f2mat_old[(iind*2)+1], + dlsch->max_ldpc_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); + + +#else + + memset(pv,0,2*p_decParams->Z*sizeof(int16_t)); + //memset(pl,0,2*p_decParams->Z*sizeof(int8_t)); + + //if (A < 1000){ + + for (i=2*p_decParams->Z/8, j = 0; i < (68*p_decParams->Z/8+1); i++, j++) + { + pv[i]= _mm_loadu_si128((__m128i*)(&inv_d[8*j])); + } + /*} + else{ + for (i=2*p_decParams->Z/8, j = 0; i < (68*p_decParams->Z/8+1); i++, j++) + { + pv[i]= _mm_loadu_si128((__m128i*)&harq_process->d[r][96+8*j]); + } + }*/ + for (i=0, j=0; j < (68*p_decParams->Z/16); i+=2, j++) + { + //printf("mm packs i %d j %d\n", i, j); + //print128_num(pv[i]); + //print128_num(pv[i+1]); + pl[j] = _mm_packs_epi16(pv[i],pv[i+1]); + //print128_num2bytes(pl[j]); + } + + no_iteration_ldpc = nrLDPC_decoder(p_decParams, + &pl[0], + llrProcBuf, + p_procTime); + + if (no_iteration_ldpc > 2) + printf("Error number of iteration LPDC %d\n", no_iteration_ldpc); + //else + //printf("OK number of iteration LPDC %d\n", no_iteration_ldpc); + + for (int m=0; m < Kr>>3; m ++) + { + harq_process->c[r][m]= (uint8_t) llrProcBuf[m]; + } + + /*for (int u=0; u < Kr>>3; u ++) + { + ullrProcBuf[u]= (uint8_t) llrProcBuf[u]; + } + + + printf("output unsigned ullrProcBuf \n"); + + for (int j=0; j < Kr>>3; j ++) + { + + printf(" %d \n", ullrProcBuf[j]); + + } + printf(" \n");*/ +#endif + +#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_ldpc_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_ldpc_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_ldpc_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_ldpc_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_ldpc_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_ldpc_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 0 + if (err_flag == 1) { +//#if UE_DEBUG_TRACE + LOG_I(PHY,"[UE %d] THREAD 0 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_ldpc_iterations)); + } else { +#if UE_DEBUG_TRACE + LOG_I(PHY,"[UE %d] THREAD 0 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); + } +#endif + + proc->decoder_thread_available = 1; + //proc->decoder_main_available = 0; + + if (pthread_mutex_lock(&proc->mutex_dlsch_td) != 0) { + LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RXTX\n" ); + exit_fun("noting to add"); + } + proc->instance_cnt_dlsch_td--; + if (pthread_mutex_unlock(&proc->mutex_dlsch_td) != 0) { + LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE td1\n" ); + exit_fun("noting to add"); + } + } + + // thread finished + free(arg); + return &UE_dlsch_td_retval; +} +#endif + +#ifdef UE_DLSCH_PARALLELISATION +#define FIFO_PRIORITY 39 +uint32_t dlsch_decoding_2thread1(void *arg) +{ + static __thread int UE_dlsch_td_retval1; + struct rx_tx_thread_data *rtd = arg; + UE_rxtx_proc_t *proc = rtd->proc; + PHY_VARS_NR_UE *phy_vars_ue = rtd->UE; + + int llr8_flag1; + int32_t no_iteration_ldpc; + t_nrLDPC_dec_params decParams; + t_nrLDPC_dec_params* p_decParams = &decParams; + t_nrLDPC_time_stats procTime; + t_nrLDPC_time_stats* p_procTime =&procTime ; + int16_t z [68*384]; + int8_t l [68*384]; + //__m128i l; + int16_t inv_d [68*384]; + int16_t *p_invd =&inv_d; + + uint32_t i,j; + uint32_t k; + + __m128i *pv = (__m128i*)&z; + __m128i *pl = (__m128i*)&l; + + proc->instance_cnt_dlsch_td1=-1; + proc->nr_tti_rx=proc->sub_frame_start; + + printf("start thread 1\n"); + proc->decoder_thread_available1 = 0; + + char threadname[256]; + sprintf(threadname,"UE_thread_dlsch_td1_%d", proc->sub_frame_start); + + cpu_set_t cpuset; + CPU_ZERO(&cpuset); + if ( (proc->sub_frame_start+1)%RX_NB_TH == 0 && threads.dlsch_td_one != -1 ) + CPU_SET(threads.dlsch_td_one, &cpuset); + if ( (proc->sub_frame_start+1)%RX_NB_TH == 1 && threads.dlsch_td_two != -1 ) + CPU_SET(threads.dlsch_td_two, &cpuset); + if ( (proc->sub_frame_start+1)%RX_NB_TH == 2 && threads.dlsch_td_three != -1 ) + CPU_SET(threads.dlsch_td_three, &cpuset); + + + +#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*(8448+64)]; + uint32_t r,r_offset=0,Kr,Kr_bytes,err_flag=0,Kr_int; + uint8_t crc_type; + uint8_t C; + uint8_t Qm; + uint8_t Nl; + uint32_t Er, Gp,GpmodC; +#ifdef DEBUG_DLSCH_DECODING + uint16_t i; +#endif + //#ifdef __AVX2__ + + uint8_t (*tc)(int16_t *y, + 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 *); + if (llr8_flag1 == 0) { + //#ifdef __AVX2__ +#if 0 + tc_2cw = phy_threegpplte_turbo_decoder16avx2; +#endif + tc = phy_threegpplte_turbo_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 = phy_threegpplte_turbo_decoder8; + } + + init_thread(900000,1000000 , FIFO_PRIORITY-1, &cpuset, threadname); + printf("2thread1 oai_exit %d\n", oai_exit); + while (!oai_exit) { + if (pthread_mutex_lock(&proc->mutex_dlsch_td1) != 0) { + LOG_E( PHY, "[SCHED][UE] error locking mutex for UE dlsch td\n" ); + exit_fun("nothing to add"); + } + while (proc->instance_cnt_dlsch_td1 < 0) { + // most of the time, the thread is waiting here + pthread_cond_wait( &proc->cond_dlsch_td1, &proc->mutex_dlsch_td1 ); + } + if (pthread_mutex_unlock(&proc->mutex_dlsch_td1) != 0) { + LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE dlsch_td \n" ); + exit_fun("nothing to add"); + } + + //printf("2thread1 main available %d\n", proc->decoder_main_available); + + uint32_t wait = 0; + while(proc->decoder_main_available == 0) + { + usleep(1); + wait++; + } + + //proc->decoder_thread_available1 = 0; + + //PHY_VARS_NR_UE *phy_vars_ue = tdp->UE; + int eNB_id = proc->eNB_id; + int harq_pid = proc->harq_pid; + llr8_flag1 = proc->llr8_flag; + //r_offset = proc->Er; + //UE_rxtx_proc_t *proc = tdp->proc; + int frame = proc->frame_rx; + int subframe = proc->nr_tti_rx; + NR_UE_DLSCH_t *dlsch = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]; + NR_DL_UE_HARQ_t *harq_process = dlsch->harq_processes[harq_pid]; + short *dlsch_llr = phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[0]; + //printf("2thread0 llr flag %d tdp flag %d\n",llr8_flag1, tdp->llr8_flag); + //printf("2thread1 nr_tti_tx %d subframe %d SF thread id %d r_offset %d\n", proc->nr_tti_rx, subframe, phy_vars_ue->current_thread_id[subframe], r_offset); + + // 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_ldpc_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_ldpc_iterations); + } + */ + + + + harq_process->trials[harq_process->round]++; + + A = harq_process->TBS; //2072 for QPSK 1/3 + + ret = dlsch->max_ldpc_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, A %d harq_pid %d G %d\n",A, harq_pid,harq_process->G); + + if (harq_process->round == 0) { + // This is a new packet, so compute quantities regarding segmentation + harq_process->B = A+24; +#ifdef TD_DECODING + 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 + nr_segmentation(NULL, + NULL, + harq_process->B, + &harq_process->C, + &harq_process->Kplus, + &harq_process->Kminus, + &harq_process->Z, + &harq_process->F); + p_decParams->Z = harq_process->Z; + + #endif + + } + + // p_decParams->Z = 128; + p_decParams->BG = 1; + p_decParams->R = 89; + p_decParams->numMaxIter = 2; + Kr = p_decParams->Z*22; + p_decParams->outMode= 0; + /* + else { + printf("dlsch_decoding.c: Ndi>0 not checked yet!!\n"); + return(max_ldpc_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_ldpc_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; + + Qm= harq_process->Qm; + Nl=harq_process->Nl; + //r_thread = harq_process->C/2-1; + C= harq_process->C; + + Gp = G/Nl/Qm; + GpmodC = Gp%C; + + + + if ((C/2-1) < (C-(GpmodC))) + r_offset = Nl*Qm * (Gp/C); + else + r_offset = Nl*Qm * ((GpmodC==0?0:1) + (Gp/C)); + + //printf("sub thread r_offset %d\n", r_offset); + + //for (r=(harq_process->C/2); rC; r++) { + r=2; //(harq_process->C/2); + r_offset = r*r_offset; + //printf("thread1 r=%d r_offset %d \n",r, r_offset); + + + // Get Turbo interleaver parameters +#ifdef TD_DECODING + if (rCminus) + Kr = harq_process->Kminus; + else + Kr = harq_process->Kplus; +#else + Kr = harq_process->Kplus; +#endif + + Kr_bytes = Kr>>3; + + //workaround for nr ldpc using lte interleaving + if (dlsch->harq_processes[harq_pid]->C >= 2) + Kr_int = G/(3*dlsch->harq_processes[harq_pid]->C); + else + Kr_int = Kr; + + 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_ldpc_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*(8448+64)*sizeof(short)); + harq_process->RTC[r] = generate_dummy_w(Kr_int, + (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_ldpc_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_ldpc_iterations); +*/ + if (llr8_flag1) { + 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); +#ifdef TD_DECODING + ret = tc + (&harq_process->d[r][96], + harq_process->c[r], + Kr, + f1f2mat_old[iind*2], + f1f2mat_old[(iind*2)+1], + dlsch->max_ldpc_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); + +#else + + memset(pv,0,2*p_decParams->Z*sizeof(int16_t)); + //memset(pl,0,2*p_decParams->Z*sizeof(int8_t)); + + + for (i=2*p_decParams->Z/8, j = 0; i < (68*p_decParams->Z/8+1); i++, j++) + { + pv[i]= _mm_loadu_si128((__m128i*)(&inv_d[8*j])); + } + + for (i=0, j=0; j < (68*p_decParams->Z/16); i+=2, j++) + { + //printf("mm packs i %d j %d\n", i, j); + //print128_num(pv[i]); + //print128_num(pv[i+1]); + pl[j] = _mm_packs_epi16(pv[i],pv[i+1]); + //print128_num2bytes(pl[j]); + } + + no_iteration_ldpc = nrLDPC_decoder(p_decParams, + &pl[0], + llrProcBuf, + p_procTime); + + if (no_iteration_ldpc > 2) + printf("Error number of iteration LPDC %d\n", no_iteration_ldpc); + //else + // printf("OK number of iteration LPDC %d\n", no_iteration_ldpc); + + for (int m=0; m < Kr>>3; m ++) + { + harq_process->c[r][m]= (uint8_t) llrProcBuf[m]; + } + + /*for (int u=0; u < Kr>>3; u ++) + { + ullrProcBuf[u]= (uint8_t) llrProcBuf[u]; + } + + + printf("output unsigned ullrProcBuf \n"); + + for (int j=0; j < Kr>>3; j ++) + { + + printf(" %d \n", ullrProcBuf[j]); + + } + printf(" \n");*/ +#endif + //printf("output channel decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]); + + //printf("output decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]); + +#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_ldpc_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_ldpc_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_ldpc_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_ldpc_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_ldpc_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_ldpc_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 0 + if (err_flag == 1) { +//#if UE_DEBUG_TRACE + LOG_I(PHY,"[UE %d] THREAD 0 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_ldpc_iterations)); + } else { +#if UE_DEBUG_TRACE + LOG_I(PHY,"[UE %d] THREAD 0 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); + } +#endif + + proc->decoder_thread_available1 = 1; + //proc->decoder_main_available = 0; + + //printf("2thread1 proc->instance_cnt_dlsch_td1 %d\n", proc->instance_cnt_dlsch_td1); + + if (pthread_mutex_lock(&proc->mutex_dlsch_td1) != 0) { + LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RXTX\n" ); + exit_fun("noting to add"); + } + proc->instance_cnt_dlsch_td1--; + if (pthread_mutex_unlock(&proc->mutex_dlsch_td1) != 0) { + LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE td1\n" ); + exit_fun("noting to add"); + } + //printf("end 2thread1 proc->instance_cnt_dlsch_td1 %d\n", proc->instance_cnt_dlsch_td1); + } + + //printf("after 2thread1 after oai exit proc->instance_cnt_dlsch_td %d\n", proc->instance_cnt_dlsch_td1); + // thread finished + free(arg); + return &UE_dlsch_td_retval1; +} +#endif + diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c index 5186d0ef24..4bcd8400aa 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c @@ -47,7 +47,7 @@ * set as command line argument, see lte-softmodem.c * default value: 0 */ -//int16_t dlsch_demod_shift = 0; +int16_t nr_dlsch_demod_shift = 0; //int16_t interf_unaw_shift = 13; //#define DEBUG_HARQ diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h index 5a7a3a74f5..865658e941 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h @@ -46,7 +46,7 @@ \brief This function frees memory allocated for a particular DLSCH at UE @param dlsch Pointer to DLSCH to be removed */ -void free_ue_dlsch(NR_UE_DLSCH_t *dlsch); +void free_nr_ue_dlsch(NR_UE_DLSCH_t *dlsch); /** \fn new_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t abstraction_flag) \brief This function allocates structures for a particular DLSCH at UE @@ -57,7 +57,7 @@ void free_ue_dlsch(NR_UE_DLSCH_t *dlsch); @params N_RB_DL total number of resource blocks (determine the operating BW) @param abstraction_flag Flag to indicate abstracted interface */ -NR_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); +NR_UE_DLSCH_t *new_nr_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); void free_ue_ulsch(NR_UE_ULSCH_t *ulsch); @@ -1025,7 +1025,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_NR_UE *phy_vars_ue, @param rx_type. rx_type=RX_IC_single_stream will enable interference cancellation of a second stream when decoding the first stream. In case of TM1, 2, 5, and this can cancel interference from a neighbouring cell given by eNB_id_i. In case of TM5, eNB_id_i should be set to n_connected_eNB to perform multi-user interference cancellation. In case of TM3, eNB_id_i should be set to eNB_id to perform co-channel interference cancellation; this option should be used together with an interference cancellation step [...]. In case of TM3, if rx_type=RX_IC_dual_stream, both streams will be decoded by applying the IC single stream receiver twice. @param i_mod Modulation order of the interfering stream */ -int32_t rx_pdsch(PHY_VARS_NR_UE *phy_vars_ue, +int32_t nr_rx_pdsch(PHY_VARS_NR_UE *phy_vars_ue, PDSCH_t type, uint8_t eNB_id, uint8_t eNB_id_i, diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h index ade1e88eb9..25f21000e6 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h @@ -274,6 +274,8 @@ typedef struct { uint32_t Kplus; /// Number of "Filler" bits (for definition see 36-212 V8.6 2009-03, p.10) uint32_t F; + /// LDPC lifting factor + uint32_t Z; /// Number of MIMO layers (streams) (for definition see 36-212 V8.6 2009-03, p.17) uint8_t Nl; /// current delta_pucch @@ -348,8 +350,8 @@ typedef struct { uint8_t Kmimo; /// Nsoft parameter related to UE Category uint32_t Nsoft; - /// Maximum number of Turbo iterations - uint8_t max_turbo_iterations; + /// Maximum number of LDPC iterations + uint8_t max_ldpc_iterations; /// number of iterations used in last turbo decoding uint8_t last_iteration_cnt; /// accumulated tx power adjustment for PUCCH diff --git a/openair1/PHY/phy_vars_nr_ue.h b/openair1/PHY/phy_vars_nr_ue.h index 37e985c5fa..aa6c347498 100644 --- a/openair1/PHY/phy_vars_nr_ue.h +++ b/openair1/PHY/phy_vars_nr_ue.h @@ -19,8 +19,8 @@ * contact@openairinterface.org */ -#ifndef __PHY_VARS_NR_H__ -#define __PHY_VARS_NR_H__ +#ifndef __PHY_VARS_NR_UE_H__ +#define __PHY_VARS_NR_UE_H__ #include "PHY/types.h" #include "PHY/defs_nr_UE.h" @@ -146,5 +146,5 @@ int16_t unscrambling_lut[65536*16] __attribute__((aligned(32))); /// lookup table for scrambling in TX uint8_t scrambling_lut[65536*16] __attribute__((aligned(32))); -uint8_t max_turbo_iterations=4; +uint8_t max_ldpc_iterations=4; #endif /*__PHY_VARS_H__ */ diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 48c3e5812e..3885ee93e6 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -3920,7 +3920,7 @@ void ue_pmch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc,int eNB_id,i else ue->dlsch_mtch_trials[sync_area][0]++; - if (ret == (1+ue->dlsch_MCH[0]->max_turbo_iterations)) { + if (ret == (1+ue->dlsch_MCH[0]->max_ldpc_iterations)) { if (mcch_active == 1) ue->dlsch_mcch_errors[sync_area][0]++; else @@ -3932,7 +3932,7 @@ void ue_pmch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc,int eNB_id,i ue->dlsch_mcch_errors[sync_area][0], ue->dlsch_mtch_errors[sync_area][0], ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3, - ue->dlsch_MCH[0]->max_turbo_iterations, + ue->dlsch_MCH[0]->max_ldpc_iterations, ue->dlsch_MCH[0]->harq_processes[0]->G); dump_mch(ue,0,ue->dlsch_MCH[0]->harq_processes[0]->G,nr_tti_rx); #ifdef DEBUG_DLSCH @@ -4198,8 +4198,9 @@ void process_rar(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_id, runmod } } +#endif -void ue_dlsch_procedures(PHY_VARS_NR_UE *ue, +void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_id, PDSCH_t pdsch, @@ -4280,7 +4281,7 @@ void ue_dlsch_procedures(PHY_VARS_NR_UE *ue, if (abstraction_flag == 0) { - // start turbo decode for CW 0 + // start ldpc decode for CW 0 dlsch0->harq_processes[harq_pid]->G = get_G(&ue->frame_parms, dlsch0->harq_processes[harq_pid]->nb_rb, dlsch0->harq_processes[harq_pid]->rb_alloc_even, @@ -4293,26 +4294,26 @@ void ue_dlsch_procedures(PHY_VARS_NR_UE *ue, #if UE_TIMING_TRACE start_meas(&ue->dlsch_unscrambling_stats); #endif - dlsch_unscrambling(&ue->frame_parms, + /*dlsch_unscrambling(&ue->frame_parms, 0, dlsch0, dlsch0->harq_processes[harq_pid]->G, pdsch_vars->llr[0], 0, - nr_tti_rx<<1); + nr_tti_rx<<1);*/ #if UE_TIMING_TRACE stop_meas(&ue->dlsch_unscrambling_stats); #endif #if 0 - LOG_I(PHY," ------ start turbo decoder for AbsSubframe %d.%d / %d ------ \n", frame_rx, nr_tti_rx, harq_pid); - LOG_I(PHY,"start turbo decode for CW 0 for AbsSubframe %d.%d / %d --> nb_rb %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch0->harq_processes[harq_pid]->nb_rb); - LOG_I(PHY,"start turbo decode for CW 0 for AbsSubframe %d.%d / %d --> rb_alloc_even %x \n", frame_rx, nr_tti_rx, harq_pid, dlsch0->harq_processes[harq_pid]->rb_alloc_even); - LOG_I(PHY,"start turbo decode for CW 0 for AbsSubframe %d.%d / %d --> Qm %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch0->harq_processes[harq_pid]->Qm); - LOG_I(PHY,"start turbo decode for CW 0 for AbsSubframe %d.%d / %d --> Nl %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch0->harq_processes[harq_pid]->Nl); - LOG_I(PHY,"start turbo decode for CW 0 for AbsSubframe %d.%d / %d --> G %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch0->harq_processes[harq_pid]->G); - LOG_I(PHY,"start turbo decode for CW 0 for AbsSubframe %d.%d / %d --> Kmimo %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch0->Kmimo); - LOG_I(PHY,"start turbo decode for CW 0 for AbsSubframe %d.%d / %d --> Pdcch Sym %d \n", frame_rx, nr_tti_rx, harq_pid, ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->num_pdcch_symbols); + LOG_I(PHY," ------ start ldpc decoder for AbsSubframe %d.%d / %d ------ \n", frame_rx, nr_tti_rx, harq_pid); + LOG_I(PHY,"start ldpc decode for CW 0 for AbsSubframe %d.%d / %d --> nb_rb %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch0->harq_processes[harq_pid]->nb_rb); + LOG_I(PHY,"start ldpc decode for CW 0 for AbsSubframe %d.%d / %d --> rb_alloc_even %x \n", frame_rx, nr_tti_rx, harq_pid, dlsch0->harq_processes[harq_pid]->rb_alloc_even); + LOG_I(PHY,"start ldpc decode for CW 0 for AbsSubframe %d.%d / %d --> Qm %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch0->harq_processes[harq_pid]->Qm); + LOG_I(PHY,"start ldpc decode for CW 0 for AbsSubframe %d.%d / %d --> Nl %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch0->harq_processes[harq_pid]->Nl); + LOG_I(PHY,"start ldpc decode for CW 0 for AbsSubframe %d.%d / %d --> G %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch0->harq_processes[harq_pid]->G); + LOG_I(PHY,"start ldpc decode for CW 0 for AbsSubframe %d.%d / %d --> Kmimo %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch0->Kmimo); + LOG_I(PHY,"start ldpc decode for CW 0 for AbsSubframe %d.%d / %d --> Pdcch Sym %d \n", frame_rx, nr_tti_rx, harq_pid, ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->num_pdcch_symbols); #endif #if UE_TIMING_TRACE @@ -4331,7 +4332,7 @@ void ue_dlsch_procedures(PHY_VARS_NR_UE *ue, pdsch==PDSCH?1:0, dlsch0->harq_processes[harq_pid]->TBS>256?1:0); #else - ret = dlsch_decoding(ue, + ret = nr_dlsch_decoding(ue, pdsch_vars->llr[0], &ue->frame_parms, dlsch0, @@ -4361,7 +4362,7 @@ void ue_dlsch_procedures(PHY_VARS_NR_UE *ue, #endif if(is_cw1_active) { - // start turbo decode for CW 1 + // start ldpc decode for CW 1 dlsch1->harq_processes[harq_pid]->G = get_G(&ue->frame_parms, dlsch1->harq_processes[harq_pid]->nb_rb, dlsch1->harq_processes[harq_pid]->rb_alloc_even, @@ -4374,25 +4375,25 @@ void ue_dlsch_procedures(PHY_VARS_NR_UE *ue, #if UE_TIMING_TRACE start_meas(&ue->dlsch_unscrambling_stats); #endif - dlsch_unscrambling(&ue->frame_parms, + /*dlsch_unscrambling(&ue->frame_parms, 0, dlsch1, dlsch1->harq_processes[harq_pid]->G, pdsch_vars->llr[1], 1, - nr_tti_rx<<1); + nr_tti_rx<<1);*/ #if UE_TIMING_TRACE stop_meas(&ue->dlsch_unscrambling_stats); #endif #if 0 - LOG_I(PHY,"start turbo decode for CW 1 for AbsSubframe %d.%d / %d --> nb_rb %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch1->harq_processes[harq_pid]->nb_rb); - LOG_I(PHY,"start turbo decode for CW 1 for AbsSubframe %d.%d / %d --> rb_alloc_even %x \n", frame_rx, nr_tti_rx, harq_pid, dlsch1->harq_processes[harq_pid]->rb_alloc_even); - LOG_I(PHY,"start turbo decode for CW 1 for AbsSubframe %d.%d / %d --> Qm %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch1->harq_processes[harq_pid]->Qm); - LOG_I(PHY,"start turbo decode for CW 1 for AbsSubframe %d.%d / %d --> Nl %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch1->harq_processes[harq_pid]->Nl); - LOG_I(PHY,"start turbo decode for CW 1 for AbsSubframe %d.%d / %d --> G %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch1->harq_processes[harq_pid]->G); - LOG_I(PHY,"start turbo decode for CW 1 for AbsSubframe %d.%d / %d --> Kmimo %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch1->Kmimo); - LOG_I(PHY,"start turbo decode for CW 1 for AbsSubframe %d.%d / %d --> Pdcch Sym %d \n", frame_rx, nr_tti_rx, harq_pid, ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->num_pdcch_symbols); + LOG_I(PHY,"start ldpc decode for CW 1 for AbsSubframe %d.%d / %d --> nb_rb %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch1->harq_processes[harq_pid]->nb_rb); + LOG_I(PHY,"start ldpc decode for CW 1 for AbsSubframe %d.%d / %d --> rb_alloc_even %x \n", frame_rx, nr_tti_rx, harq_pid, dlsch1->harq_processes[harq_pid]->rb_alloc_even); + LOG_I(PHY,"start ldpc decode for CW 1 for AbsSubframe %d.%d / %d --> Qm %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch1->harq_processes[harq_pid]->Qm); + LOG_I(PHY,"start ldpc decode for CW 1 for AbsSubframe %d.%d / %d --> Nl %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch1->harq_processes[harq_pid]->Nl); + LOG_I(PHY,"start ldpc decode for CW 1 for AbsSubframe %d.%d / %d --> G %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch1->harq_processes[harq_pid]->G); + LOG_I(PHY,"start ldpc decode for CW 1 for AbsSubframe %d.%d / %d --> Kmimo %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch1->Kmimo); + LOG_I(PHY,"start ldpc decode for CW 1 for AbsSubframe %d.%d / %d --> Pdcch Sym %d \n", frame_rx, nr_tti_rx, harq_pid, ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->num_pdcch_symbols); #endif #if UE_TIMING_TRACE @@ -4412,7 +4413,7 @@ void ue_dlsch_procedures(PHY_VARS_NR_UE *ue, dlsch1->harq_processes[harq_pid]->TBS>256?1:0); #else - ret1 = dlsch_decoding(ue, + ret1 = nr_dlsch_decoding(ue, pdsch_vars->llr[1], &ue->frame_parms, dlsch1, @@ -4430,21 +4431,21 @@ void ue_dlsch_procedures(PHY_VARS_NR_UE *ue, #if DISABLE_LOG_X printf(" --> Unscrambling for CW1 %5.3f\n", (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0)); - printf("AbsSubframe %d.%d --> Turbo Decoding for CW1 %5.3f\n", + printf("AbsSubframe %d.%d --> ldpc Decoding for CW1 %5.3f\n", frame_rx%1024, nr_tti_rx,(ue->dlsch_decoding_stats[ue->current_thread_id[nr_tti_rx]].p_time)/(cpuf*1000.0)); #else LOG_D(PHY, " --> Unscrambling for CW1 %5.3f\n", (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0)); - LOG_D(PHY, "AbsSubframe %d.%d --> Turbo Decoding for CW1 %5.3f\n", + LOG_D(PHY, "AbsSubframe %d.%d --> ldpc Decoding for CW1 %5.3f\n", frame_rx%1024, nr_tti_rx,(ue->dlsch_decoding_stats[ue->current_thread_id[nr_tti_rx]].p_time)/(cpuf*1000.0)); #endif #endif - LOG_I(PHY,"AbsSubframe %d.%d --> Turbo Decoding for CW1 %5.3f\n", + LOG_I(PHY,"AbsSubframe %d.%d --> ldpc Decoding for CW1 %5.3f\n", frame_rx%1024, nr_tti_rx,(ue->dlsch_decoding_stats[ue->current_thread_id[nr_tti_rx]].p_time)/(cpuf*1000.0)); } - LOG_D(PHY," ------ end turbo decoder for AbsSubframe %d.%d ------ \n", frame_rx, nr_tti_rx); + LOG_D(PHY," ------ end ldpc decoder for AbsSubframe %d.%d ------ \n", frame_rx, nr_tti_rx); } else { @@ -4458,7 +4459,7 @@ void ue_dlsch_procedures(PHY_VARS_NR_UE *ue, } // Check CRC for CW 0 - if (ret == (1+dlsch0->max_turbo_iterations)) { + if (ret == (1+dlsch0->max_ldpc_iterations)) { *dlsch_errors=*dlsch_errors+1; if(dlsch0->rnti != 0xffff) @@ -4526,7 +4527,7 @@ void ue_dlsch_procedures(PHY_VARS_NR_UE *ue, break; case RA_PDSCH: if (ue->mac_enabled == 1) - process_rar(ue,proc,eNB_id,mode,abstraction_flag); + //process_rar(ue,proc,eNB_id,mode,abstraction_flag); break; case PDSCH1: LOG_E(PHY,"Shouldn't have PDSCH1 yet, come back later\n"); @@ -4539,14 +4540,14 @@ void ue_dlsch_procedures(PHY_VARS_NR_UE *ue, } ue->total_TBS[eNB_id] = ue->total_TBS[eNB_id] + - dlsch0->harq_processes[dlsch0->current_harq_pid]->TBS; + dlsch0->harq_processes[dlsch0->current_harq_pid]->TBS; ue->total_received_bits[eNB_id] = ue->total_TBS[eNB_id] + - dlsch0->harq_processes[dlsch0->current_harq_pid]->TBS; + dlsch0->harq_processes[dlsch0->current_harq_pid]->TBS; } // Check CRC for CW 1 if(is_cw1_active) { - if (ret1 == (1+dlsch0->max_turbo_iterations)) { + if (ret1 == (1+dlsch0->max_ldpc_iterations)) { LOG_I(PHY,"[UE %d][PDSCH %x/%d] Frame %d nr_tti_rx %d DLSCH CW1 in error (rv %d,mcs %d,TBS %d)\n", ue->Mod_id,dlsch0->rnti, harq_pid,frame_rx,nr_tti_rx, @@ -4612,7 +4613,6 @@ void ue_dlsch_procedures(PHY_VARS_NR_UE *ue, } -#endif /*! * \brief This is the UE synchronize thread. diff --git a/targets/RT/USER/nr-uesoftmodem.c b/targets/RT/USER/nr-uesoftmodem.c index 149ec92ec3..b22e4aa5d1 100644 --- a/targets/RT/USER/nr-uesoftmodem.c +++ b/targets/RT/USER/nr-uesoftmodem.c @@ -541,7 +541,7 @@ void *l2l1_task(void *arg) { } #endif -extern int16_t dlsch_demod_shift; +extern int16_t nr_dlsch_demod_shift; static void get_options (int argc, char **argv) { int CC_id; diff --git a/targets/RT/USER/nr-uesoftmodem.h b/targets/RT/USER/nr-uesoftmodem.h index 9b85ed401d..608a033dd5 100644 --- a/targets/RT/USER/nr-uesoftmodem.h +++ b/targets/RT/USER/nr-uesoftmodem.h @@ -132,9 +132,9 @@ {"ue-nb-ant-rx", CONFIG_HLP_UENANTR, 0, u8ptr:&nb_antenna_rx, defuintval:1, TYPE_UINT8, 0}, \ {"ue-nb-ant-tx", CONFIG_HLP_UENANTT, 0, u8ptr:&nb_antenna_tx, defuintval:1, TYPE_UINT8, 0}, \ {"ue-scan-carrier", CONFIG_HLP_UESCAN, PARAMFLAG_BOOL, iptr:&UE_scan_carrier, defintval:0, TYPE_INT, 0}, \ -{"ue-max-power", NULL, 0, iptr:&(tx_max_power[0]), defintval:90, TYPE_INT, 0}, \ +{"ue-max-power", NULL, 0, iptr:&(tx_max_power[0]), defintval:90, TYPE_INT, 0}, \ {"r" , CONFIG_HLP_PRB, 0, u8ptr:&(frame_parms[0]->N_RB_DL), defintval:25, TYPE_UINT8, 0}, \ -{"dlsch-demod-shift", CONFIG_HLP_DLSHIFT, 0, iptr:(int32_t *)&dlsch_demod_shift, defintval:0, TYPE_INT, 0}, \ +{"nr_dlsch-demod-shift", CONFIG_HLP_DLSHIFT, 0, iptr:(int32_t *)&nr_dlsch_demod_shift, defintval:0, TYPE_INT, 0}, \ } #define DEFAULT_DLF 2680000000 @@ -158,7 +158,7 @@ {"threadThreeSubframe", NULL, 0, iptr:&(threads.three), defintval:1, TYPE_INT, 0}, \ {"threadSlot1ProcOne", NULL, 0, iptr:&(threads.slot1_proc_one), defintval:1, TYPE_INT, 0}, \ {"threadSlot1ProcTwo", NULL, 0, iptr:&(threads.slot1_proc_two), defintval:1, TYPE_INT, 0}, \ -{"dlsch-demod-shift", CONFIG_HLP_DLSHIFT, 0, iptr:(int32_t *)&dlsch_demod_shift, defintval:0, TYPE_INT, 0}, \ +{"nr_dlsch-demod-shift", CONFIG_HLP_DLSHIFT, 0, iptr:(int32_t *)&nr_dlsch_demod_shift, defintval:0, TYPE_INT, 0}, \ {"A" , CONFIG_HLP_TADV, 0, uptr:&timing_advance, defintval:0, TYPE_UINT, 0}, \ {"C" , CONFIG_HLP_DLF, 0, uptr:&(downlink_frequency[0][0]), defuintval:2680000000, TYPE_UINT, 0}, \ {"a" , CONFIG_HLP_CHOFF, 0, iptr:&chain_offset, defintval:0, TYPE_INT, 0}, \ From 262177f4f3cc714079034f6fd855a966bca45517 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Fri, 14 Sep 2018 00:48:28 -0700 Subject: [PATCH 018/117] patch 2 from Milan Zivkovic (Nokia Bell Labs) --- openair1/PHY/CODING/TESTBENCH/ldpctest.c | 23 ++++++++++++------- openair1/PHY/CODING/nrLDPC_encoder/defs.h | 1 + .../PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c | 8 +++---- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/openair1/PHY/CODING/TESTBENCH/ldpctest.c b/openair1/PHY/CODING/TESTBENCH/ldpctest.c index 49af918bd9..d0fb170cf4 100644 --- a/openair1/PHY/CODING/TESTBENCH/ldpctest.c +++ b/openair1/PHY/CODING/TESTBENCH/ldpctest.c @@ -310,12 +310,18 @@ int test_ldpc(short No_iteration, } stop_meas(&time); - start_meas(time_optim); +/* start_meas(time_optim); ldpc_encoder_optim_8seg(test_input,channel_input_optim,block_length,BG,n_segments,&tinput,&tprep,&tparity,&toutput); - /*for(j=0;j0&&n_segments<=8,"0 < n_segments %d <= 8\n",n_segments); //determine number of bits in codeword - if (block_length>3840) + if (BG==1) { BG=1; Kb = 22; nrows=46; //parity check bits ncols=22; //info bits } - else if (block_length<=3840) + else if (BG==2) { BG=2; nrows=42; //parity check bits From e07570697e8efb0f806c075cdaf30d832b1eccad Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Fri, 14 Sep 2018 06:27:45 -0700 Subject: [PATCH 019/117] adding -O2 to build options. --- cmake_targets/CMakeLists.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index b65feb35c9..71832b43fc 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -176,8 +176,7 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath -Wl,${CMAKE_CU # these changes are related to hardcoded path to include .h files add_definitions(-DCMAKER) set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3") -#set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3 -O2") -set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3") +set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3 -O2") set(GIT_BRANCH "UNKNOWN") From 835034894cc8293476d90581a4e987a6b23e1106 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Tue, 18 Sep 2018 13:34:15 +0200 Subject: [PATCH 020/117] update nr segmentation --- openair1/PHY/CODING/coding_defs.h | 5 +- openair1/PHY/CODING/nr_rate_matching.c | 2 +- openair1/PHY/CODING/nr_segmentation.c | 105 ++++++++---------- .../NR_TRANSPORT/nr_transport_common_proto.h | 8 +- .../PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 93 +++++++--------- .../NR_UE_TRANSPORT/nr_dlsch_demodulation.c | 6 +- .../NR_UE_TRANSPORT/nr_transport_proto_ue.h | 4 +- .../PHY/NR_UE_TRANSPORT/nr_transport_ue.h | 66 ++++------- openair1/PHY/defs_gNB.h | 58 ++++------ openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 5 +- 10 files changed, 143 insertions(+), 209 deletions(-) diff --git a/openair1/PHY/CODING/coding_defs.h b/openair1/PHY/CODING/coding_defs.h index 1d7145e5cd..b767b8de18 100644 --- a/openair1/PHY/CODING/coding_defs.h +++ b/openair1/PHY/CODING/coding_defs.h @@ -438,8 +438,7 @@ 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 *K, unsigned int *Zout, unsigned int *F); @@ -452,7 +451,7 @@ uint32_t nr_compute_tbs(uint8_t mcs, void nr_interleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f); -void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f); +void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, int16_t *e,int16_t *f); uint32_t nr_rate_matching_ldpc(uint8_t Ilbrm, uint32_t Tbslbrm, diff --git a/openair1/PHY/CODING/nr_rate_matching.c b/openair1/PHY/CODING/nr_rate_matching.c index 502fda3fa5..19df32c246 100644 --- a/openair1/PHY/CODING/nr_rate_matching.c +++ b/openair1/PHY/CODING/nr_rate_matching.c @@ -48,7 +48,7 @@ void nr_interleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f) } -void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f) +void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, int16_t *e,int16_t *f) { uint32_t EQm; diff --git a/openair1/PHY/CODING/nr_segmentation.c b/openair1/PHY/CODING/nr_segmentation.c index ad2e809815..b5299c3a79 100644 --- a/openair1/PHY/CODING/nr_segmentation.c +++ b/openair1/PHY/CODING/nr_segmentation.c @@ -33,8 +33,7 @@ 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 *K, unsigned int *Zout, unsigned int *F) { @@ -59,13 +58,13 @@ int32_t nr_segmentation(unsigned char *input_buffer, } if ((*C)>MAX_NUM_DLSCH_SEGMENTS) { - LOG_E(PHY,"lte_segmentation.c: too many segments %d, B %d, L %d, Bprime %d\n",*C,B,L,Bprime); + LOG_E(PHY,"nr_segmentation.c: too many segments %d, B %d, L %d, Bprime %d\n",*C,B,L,Bprime); return(-1); } // Find K+ Bprime_by_C = Bprime/(*C); - /*if (Bprime <=192) { + if (Bprime <=192) { Kb = 6; } else if (Bprime <=560) { Kb = 8; @@ -73,9 +72,9 @@ int32_t nr_segmentation(unsigned char *input_buffer, Kb = 9; } else if (Bprime <=3840) { Kb = 10;; - } else {*/ + } else { Kb = 22; - //} + } if ((Bprime_by_C%Kb) > 0) @@ -88,97 +87,85 @@ else #endif if (Z <= 2) { - *Kplus = 2; - *Kminus = 0; + *K = 2; } else if (Z<=16) { // increase by 1 byte til here - *Kplus = Z; - *Kminus = Z-1; + *K = Z; } else if (Z <=32) { // increase by 2 bytes til here - *Kplus = (Z>>1)<<1; + *K = (Z>>1)<<1; - if (*Kplus < Z) - *Kplus = *Kplus + 2; + if (*K < Z) + *K = *K + 2; - *Kminus = (*Kplus - 2); } else if (Z <= 64) { // increase by 4 bytes til here - *Kplus = (Z>>2)<<2; + *K = (Z>>2)<<2; - if (*Kplus < Z) - *Kplus = *Kplus + 4; + if (*K < Z) + *K = *K + 4; - *Kminus = (*Kplus - 4); } else if (Z <=128 ) { // increase by 8 bytes til here - *Kplus = (Z>>3)<<3; + *K = (Z>>3)<<3; - if (*Kplus < Z) - *Kplus = *Kplus + 8; + if (*K < Z) + *K = *K + 8; #ifdef DEBUG_SEGMENTATION - printf("Z_by_C %d , Kplus2 %d\n",Z,*Kplus); + printf("Z_by_C %d , K2 %d\n",Z,*K); #endif - *Kminus = (*Kplus - 8); } else if (Z <= 256) { // increase by 4 bytes til here - *Kplus = (Z>>4)<<4; + *K = (Z>>4)<<4; - if (*Kplus < Z) - *Kplus = *Kplus + 16; + if (*K < Z) + *K = *K + 16; - *Kminus = (*Kplus - 16); } else if (Z <= 384) { // increase by 4 bytes til here - *Kplus = (Z>>5)<<5; + *K = (Z>>5)<<5; - if (*Kplus < Z) - *Kplus = *Kplus + 32; + if (*K < Z) + *K = *K + 32; - *Kminus = (*Kplus - 32); } else { //msg("nr_segmentation.c: Illegal codeword size !!!\n"); return(-1); } - *Zout = *Kplus; - *Kplus = *Kplus*Kb; - *Kminus = *Kminus*Kb; + *Zout = *K; + *K = *K*Kb; - - - *F = ((*C)*(*Kplus) - (Bprime)); + *F = ((*K) - Bprime_by_C); #ifdef DEBUG_SEGMENTATION - printf("final nr seg output Z %d Kplus %d F %d \n", *Zout, *Kplus, *F); - printf("C %d, Kplus %d, Kminus %d, Bprime_bytes %d, Bprime %d, F %d\n",*C,*Kplus,*Kminus,Bprime>>3,Bprime,*F); + printf("final nr seg output Z %d K %d F %d \n", *Zout, *K, *F); + printf("C %d, K %d, Bprime_bytes %d, Bprime %d, F %d\n",*C,*K,Bprime>>3,Bprime,*F); #endif if ((input_buffer) && (output_buffers)) { - for (k=0; k<*F>>3; k++) { - output_buffers[0][k] = 0; - } - s=0; for (r=0; r<*C; r++) { - //if (r<(B%(*C))) - Kprime = *Kplus; - //else - // Kprime = *Kminus; + Kprime = Bprime_by_C; while (k<((Kprime - L)>>3)) { output_buffers[r][k] = input_buffer[s]; - // printf("encoding segment %d : byte %d (%d) => %d\n",r,k,Kr>>3,input_buffer[s]); + //printf("encoding segment %d : byte %d (%d) => %d\n",r,k,(Kprime-L)>>3,input_buffer[s]); k++; s++; } - /* - if (*C > 1) { // add CRC - crc = crc24b(output_buffers[r],Kprime-24)>>8; - output_buffers[r][(Kprime-24)>>3] = ((uint8_t*)&crc)[2]; - output_buffers[r][1+((Kprime-24)>>3)] = ((uint8_t*)&crc)[1]; - output_buffers[r][2+((Kprime-24)>>3)] = ((uint8_t*)&crc)[0]; + if (*F>0) + for (k=Kprime>>3; k<(*K)>>3; k++) { + output_buffers[r][k] = NR_NULL; + //printf("r %d filler bits [%d] = %d Kprime %d \n", r,k, output_buffers[r][k], Kprime); } - */ + + if (*C > 1) { // add CRC + crc = crc24b(output_buffers[r],Kprime-L)>>8; + output_buffers[r][(Kprime-L)>>3] = ((uint8_t*)&crc)[2]; + output_buffers[r][1+((Kprime-L)>>3)] = ((uint8_t*)&crc)[1]; + output_buffers[r][2+((Kprime-L)>>3)] = ((uint8_t*)&crc)[0]; + } + k=0; } } @@ -192,12 +179,12 @@ else main() { - unsigned int Kplus,Kminus,C,F,Bbytes; + unsigned int K,C,F,Bbytes, Zout; for (Bbytes=5; Bbytes<8; Bbytes++) { - nr_segmentation(0,0,Bbytes<<3,&C,&Kplus,&Kminus, &F); - printf("Bbytes %d : C %d, Kplus %d, Kminus %d, F %d\n", - Bbytes, C, Kplus, Kminus, F); + nr_segmentation(0,0,Bbytes<<3,&C,&K,&Zout, &F); + printf("Bbytes %d : C %d, K %d, F %d\n", + Bbytes, C, K, F); } } #endif diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h index 69d8aedf51..3c318874ac 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h +++ b/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h @@ -33,9 +33,15 @@ #ifndef __NR_TRANSPORT_COMMON_PROTO__H__ #define __NR_TRANSPORT_COMMON_PROTO__H__ -#define MAX_NUM_NR_DLSCH_SEGMENTS 30 +#define MAX_NUM_NR_DLSCH_SEGMENTS 32 #define MAX_NUM_NR_ULSCH_SEGMENTS MAX_NUM_NR_DLSCH_SEGMENTS +#define MAX_NR_DLSCH_PAYLOAD_BYTES (MAX_NUM_NR_DLSCH_SEGMENTS*1056) +#define MAX_NR_ULSCH_PAYLOAD_BYTES (MAX_NUM_NR_DLSCH_SEGMENTS*1056) + +#define MAX_NUM_NR_CHANNEL_BITS (14*273*12*6) // 14 symbols, 273 RB +#define MAX_NUM_NR_RE (14*273*12) + // Functions below implement minor procedures from 38-214 /** \brief Computes Q based on I_MCS PDSCH and when 'MCS-Table-PDSCH' is set to "256QAM". Implements Table 5.1.3.1-2 from 38.214. diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index 245f7dcaad..ec7c01031c 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -136,17 +136,17 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint if (abstraction_flag == 0) { for (r=0; rharq_processes[i]->c[r] = (uint8_t*)malloc16(((r==0)?8:0) + 3+ 1056); + dlsch->harq_processes[i]->c[r] = (uint8_t*)malloc16(1056); if (dlsch->harq_processes[i]->c[r]) - memset(dlsch->harq_processes[i]->c[r],0,((r==0)?8:0) + 3+ 1056); + memset(dlsch->harq_processes[i]->c[r],0,1056); else exit_flag=2; - dlsch->harq_processes[i]->d[r] = (short*)malloc16(((3*8*8448)+12+96)*sizeof(short)); + dlsch->harq_processes[i]->d[r] = (short*)malloc16((3*8448)*sizeof(short)); if (dlsch->harq_processes[i]->d[r]) - memset(dlsch->harq_processes[i]->d[r],0,((3*8*8448)+12+96)*sizeof(short)); + memset(dlsch->harq_processes[i]->d[r],0,(3*8448)*sizeof(short)); else exit_flag=2; } @@ -187,9 +187,8 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, uint32_t G; uint32_t ret,offset; int32_t no_iteration_ldpc; - // uint8_t dummy_channel_output[(3*8*block_length)+12]; - short dummy_w[MAX_NUM_DLSCH_SEGMENTS][3*(8448+64)]; - uint32_t r,r_offset=0,Kr,Kr_bytes,err_flag=0, Kr_int; + //short dummy_w[MAX_NUM_DLSCH_SEGMENTS][3*(8448+64)]; + uint32_t r,r_offset=0,Kr,Kr_bytes,err_flag=0; uint8_t crc_type; t_nrLDPC_dec_params decParams; t_nrLDPC_dec_params* p_decParams = &decParams; @@ -199,14 +198,14 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, int8_t l [68*384]; //__m128i l; int16_t inv_d [68*384]; - int16_t *p_invd =&inv_d; +// int16_t *p_invd =&inv_d; uint8_t kb, kc; uint8_t Ilbrm = 0; uint32_t Tbslbrm = 950984; //to compute tbs uint16_t nb_prb = 106; //to update uint32_t i,j; - uint32_t k; +// uint32_t k; __m128i *pv = (__m128i*)&z; __m128i *pl = (__m128i*)&l; @@ -269,18 +268,17 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, NULL, harq_process->B, &harq_process->C, - &harq_process->Kplus, - &harq_process->Kminus, - &harq_process->Z, + &harq_process->K, + &harq_process->Z, &harq_process->F); - p_decParams->Z = harq_process->Z; + p_decParams->Z = harq_process->Z; //printf("dlsch decoding nr segmentation Z %d\n", p_decParams->Z); //if (!frame%100) - //printf("Kplus %d C %d Z %d nl %d \n", harq_process->Kplus, harq_process->C, p_decParams->Z, harq_process->Nl); + //printf("K %d C %d Z %d nl %d \n", harq_process->K, harq_process->C, p_decParams->Z, harq_process->Nl); } - kb = harq_process->Kplus/harq_process->Z; + kb = harq_process->K/harq_process->Z; if ( kb==22){ p_decParams->BG = 1; p_decParams->R = 13; @@ -303,15 +301,8 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, 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: + case 106: bw_scaling =2; break; @@ -320,25 +311,23 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, 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); + if (harq_process->C > MAX_NUM_NR_DLSCH_SEGMENTS/bw_scaling) { + LOG_E(PHY,"Illegal harq_process->C %d > %d\n",harq_process->C,MAX_NUM_NR_DLSCH_SEGMENTS/bw_scaling); return((1+dlsch->max_ldpc_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); + printf("Segmentation: C %d, Cminus %d, Kminus %d, K %d\n",harq_process->C,harq_process->Cminus,harq_process->Kminus,harq_process->K); #endif opp_enabled=1; - Kr = harq_process->Kplus; + Kr = harq_process->K; Kr_bytes = Kr>>3; Tbslbrm = nr_compute_tbs(harq_process->mcs,nb_prb,frame_parms->symbols_per_slot,0,0, harq_process->Nl); for (r=0; rC; r++) { - Kr = harq_process->Kplus; - #if UE_TIMING_TRACE start_meas(dlsch_rate_unmatching_stats); #endif @@ -400,16 +389,16 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, 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); + write_output("decoder_in.m","dec",&harq_process->d[0][0],(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");*/ + printf("%d : %d\n",i,harq_process->d[r][i]); + printf("\n"); #endif @@ -440,7 +429,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, //if (A < 1000){ for (int cnt =0; cnt < (kc-2)*p_decParams->Z; cnt++){ - inv_d[cnt] = (-1)*harq_process->d[r][96+cnt]; + inv_d[cnt] = (-1)*harq_process->d[r][cnt]; } //} @@ -589,6 +578,8 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, // Reassembly of Transport block here offset = 0; + Kr = harq_process->K; + Kr_bytes = Kr>>3; /* printf("harq_pid %d\n",harq_pid); @@ -597,27 +588,21 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, */ for (r=0; rC; r++) { - 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, + 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)); - } + 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)); + +#ifdef DEBUG_DLSCH_DECODING + printf("Segment %d : Kr= %d bytes\n",r,Kr_bytes); + printf("copied %d bytes to b sequence (harq_pid %d)\n", + (Kr_bytes - (harq_process->F>>3)-((harq_process->C>1)?3:0)),harq_pid); + printf("b[0] = %x,c[%d] = %x\n", + harq_process->b[offset], + harq_process->F>>3, + harq_process->c[r]); +#endif + } dlsch->last_iteration_cnt = ret; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c index 4bcd8400aa..ccbee1feee 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c @@ -105,8 +105,8 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, NR_UE_DLSCH_t **dlsch; int avg[4]; - int avg_0[2]; - int avg_1[2]; +// int avg_0[2]; +// int avg_1[2]; #if UE_TIMING_TRACE uint8_t slot = 0; @@ -115,7 +115,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, unsigned char aatx,aarx; unsigned short nb_rb = 0, round; - int avgs = 0, rb; + int avgs = 0;// rb; NR_DL_UE_HARQ_t *dlsch0_harq,*dlsch1_harq = 0; uint8_t beamforming_mode; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h index 865658e941..b274f822a3 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h @@ -816,7 +816,7 @@ uint16_t dlsch_extract_rbs_TM7(int32_t **rxdataF, @param output_shift Rescaling for compensated output (should be energy-normalizing) @param phy_measurements Pointer to UE PHY measurements */ -void dlsch_channel_compensation(int32_t **rxdataF_ext, +void nr_dlsch_channel_compensation(int32_t **rxdataF_ext, int32_t **dl_ch_estimates_ext, int32_t **dl_ch_mag, int32_t **dl_ch_magb, @@ -937,7 +937,7 @@ void dlsch_channel_compensation_TM34(NR_DL_FRAME_PARMS *frame_parms, @param pilots_flag Flag to indicate pilots in symbol @param nb_rb Number of allocated RBs */ -void dlsch_channel_level(int32_t **dl_ch_estimates_ext, +void nr_dlsch_channel_level(int32_t **dl_ch_estimates_ext, NR_DL_FRAME_PARMS *frame_parms, int32_t *avg, uint8_t pilots_flag, diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h index 25f21000e6..eccde44c22 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h @@ -34,10 +34,7 @@ #include #include "PHY/impl_defs_top.h" //#include "PHY/defs_nr_UE.h" -//#include "../LTE_TRANSPORT/dci.h" -//#include "../LTE_TRANSPORT/mdci.h" -//#include "../LTE_TRANSPORT/uci_common.h" -//#include "../LTE_TRANSPORT/transport_common.h" +#include "../NR_TRANSPORT/nr_transport_common_proto.h" #ifndef STANDALONE_COMPILE #include "UTIL/LISTS/list.h" #endif @@ -105,39 +102,31 @@ typedef struct { uint8_t *b; /// Pointers to transport block segments uint8_t *c[MAX_NUM_ULSCH_SEGMENTS]; - /// RTC values for each segment (for definition see 36-212 V8.6 2009-03, p.15) - uint32_t RTC[MAX_NUM_ULSCH_SEGMENTS]; /// Index of current HARQ round for this ULSCH uint8_t round; /// MCS format of this ULSCH uint8_t mcs; /// Redundancy-version of the current sub-frame uint8_t rvidx; - /// Turbo-code outputs (36-212 V8.6 2009-03, p.12 - uint8_t d[MAX_NUM_ULSCH_SEGMENTS][(96+3+(3*6144))]; - /// Sub-block interleaver outputs (36-212 V8.6 2009-03, p.16-17) - uint8_t w[MAX_NUM_ULSCH_SEGMENTS][3*6144]; - /// Number of code segments (for definition see 36-212 V8.6 2009-03, p.9) + /// LDPC-code outputs + uint8_t d[MAX_NUM_ULSCH_SEGMENTS][3*8448]; + /// Interleaver outputs + uint8_t w[MAX_NUM_ULSCH_SEGMENTS][3*8448]; + /// Number of code segments uint32_t C; - /// Number of "small" code segments (for definition see 36-212 V8.6 2009-03, p.10) - uint32_t Cminus; - /// Number of "large" code segments (for definition see 36-212 V8.6 2009-03, p.10) - uint32_t Cplus; - /// Number of bits in "small" code segments (<6144) (for definition see 36-212 V8.6 2009-03, p.10) - uint32_t Kminus; - /// Number of bits in "large" code segments (<6144) (for definition see 36-212 V8.6 2009-03, p.10) - uint32_t Kplus; + /// Number of bits in code segments + uint32_t K; /// Total number of bits across all segments uint32_t sumKr; - /// Number of "Filler" bits (for definition see 36-212 V8.6 2009-03, p.10) + /// Number of "Filler" bits uint32_t F; - /// Msc_initial, Initial number of subcarriers for ULSCH (36-212, v8.6 2009-03, p.26-27) + /// Msc_initial, Initial number of subcarriers for ULSCH uint16_t Msc_initial; - /// Nsymb_initial, Initial number of symbols for ULSCH (36-212, v8.6 2009-03, p.26-27) + /// Nsymb_initial, Initial number of symbols for ULSCH uint8_t Nsymb_initial; - /// n_DMRS for cyclic shift of DMRS (36.213 Table 9.1.2-2) + /// n_DMRS for cyclic shift of DMRS uint8_t n_DMRS; - /// n_DMRS2 for cyclic shift of DMRS (36.211 Table 5.5.1.1.-1) + /// n_DMRS2 for cyclic shift of DMRS uint8_t n_DMRS2; /// Flag to indicate that this is a control only ULSCH (i.e. no MAC SDU) uint8_t control_only; @@ -243,9 +232,7 @@ typedef struct { /// Pointer to the payload uint8_t *b; /// Pointers to transport block segments - uint8_t *c[MAX_NUM_DLSCH_SEGMENTS]; - /// RTC values for each segment (for definition see 36-212 V8.6 2009-03, p.15) - uint32_t RTC[MAX_NUM_DLSCH_SEGMENTS]; + uint8_t *c[MAX_NUM_NR_DLSCH_SEGMENTS]; /// Index of current HARQ round for this DLSCH uint8_t round; /// MCS format for this DLSCH @@ -257,26 +244,20 @@ typedef struct { /// MIMO mode for this DLSCH MIMO_mode_t mimo_mode; /// soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15) - int16_t w[MAX_NUM_DLSCH_SEGMENTS][3*(6144+64)]; + int16_t w[MAX_NUM_NR_DLSCH_SEGMENTS][3*8448]; /// for abstraction soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15) - double w_abs[MAX_NUM_DLSCH_SEGMENTS][3*(6144+64)]; + double w_abs[MAX_NUM_NR_DLSCH_SEGMENTS][3*8448]; /// soft bits for each received segment ("d"-sequence)(for definition see 36-212 V8.6 2009-03, p.15) - int16_t *d[MAX_NUM_DLSCH_SEGMENTS]; - /// Number of code segments (for definition see 36-212 V8.6 2009-03, p.9) + int16_t *d[MAX_NUM_NR_DLSCH_SEGMENTS]; + /// Number of code segments uint32_t C; - /// Number of "small" code segments (for definition see 36-212 V8.6 2009-03, p.10) - uint32_t Cminus; - /// Number of "large" code segments (for definition see 36-212 V8.6 2009-03, p.10) - uint32_t Cplus; - /// Number of bits in "small" code segments (<6144) (for definition see 36-212 V8.6 2009-03, p.10) - uint32_t Kminus; - /// Number of bits in "large" code segments (<6144) (for definition see 36-212 V8.6 2009-03, p.10) - uint32_t Kplus; - /// Number of "Filler" bits (for definition see 36-212 V8.6 2009-03, p.10) + /// Number of bits in code segments + uint32_t K; + /// Number of "Filler" bits uint32_t F; /// LDPC lifting factor uint32_t Z; - /// Number of MIMO layers (streams) (for definition see 36-212 V8.6 2009-03, p.17) + /// Number of MIMO layers (streams) uint8_t Nl; /// current delta_pucch int8_t delta_PUCCH; @@ -333,8 +314,6 @@ typedef struct { uint32_t cqi_alloc2; /// saved subband PMI allocation from last PUSCH/PUCCH report uint16_t pmi_alloc; -//#if defined(UPGRADE_RAT_NR) -#if 1 /// Pointers to up to HARQ processes NR_DL_UE_HARQ_t *harq_processes[NR_MAX_DLSCH_HARQ_PROCESSES]; // DL number of harq processes @@ -343,7 +322,6 @@ typedef struct { uint8_t Number_MCS_HARQ_DL_DCI; /* spatial bundling of PUCCH */ uint8_t HARQ_ACK_spatial_bundling_PUCCH; -#endif /// Maximum number of HARQ processes(for definition see 36-212 V8.6 2009-03, p.17 uint8_t Mdlharq; /// MIMO transmission mode indicator for this sub-frame (for definition see 36-212 V8.6 2009-03, p.17) diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index b089cfb60f..49f4d94305 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -37,7 +37,7 @@ #include "defs_nr_common.h" #include "CODING/nrPolar_tools/nr_polar_pbch_defs.h" #include "openair2/NR_PHY_INTERFACE/NR_IF_Module.h" - +#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h" typedef struct { uint8_t pbch_a[NR_POLAR_PBCH_PAYLOAD_BITS>>3]; @@ -66,7 +66,7 @@ typedef struct { typedef struct { -/* /// Status Flag indicating for this DLSCH (idle,active,disabled) + /// Status Flag indicating for this DLSCH (idle,active,disabled) //SCH_status_t status; /// Transport block size uint32_t TBS; @@ -77,9 +77,7 @@ typedef struct { /// Pointer to the payload uint8_t *b; /// Pointers to transport block segments - uint8_t *c[MAX_NUM_DLSCH_SEGMENTS]; - /// RTC values for each segment (for definition see 36-212 V8.6 2009-03, p.15) - uint32_t RTC[MAX_NUM_DLSCH_SEGMENTS]; + uint8_t *c[MAX_NUM_NR_DLSCH_SEGMENTS]; /// Frame where current HARQ round was sent uint32_t frame; /// Subframe where current HARQ round was sent @@ -114,49 +112,41 @@ typedef struct { uint8_t dl_power_off; /// start symbold of pdsch uint8_t pdsch_start; - /// Concatenated "e"-sequences (for definition see 36-212 V8.6 2009-03, p.17-18) - uint8_t e[MAX_NUM_CHANNEL_BITS] __attribute__((aligned(32))); - /// Turbo-code outputs (36-212 V8.6 2009-03, p.12 - uint8_t *d[MAX_NUM_DLSCH_SEGMENTS];//[(96+3+(3*6144))]; - /// Sub-block interleaver outputs (36-212 V8.6 2009-03, p.16-17) - uint8_t w[MAX_NUM_DLSCH_SEGMENTS][3*6144]; - /// Number of code segments (for definition see 36-212 V8.6 2009-03, p.9) + /// Concatenated sequences + uint8_t e[MAX_NUM_NR_CHANNEL_BITS] __attribute__((aligned(32))); + /// LDPC-code outputs + uint8_t *d[MAX_NUM_NR_DLSCH_SEGMENTS]; + /// Interleaver outputs + uint8_t f[MAX_NUM_NR_CHANNEL_BITS] __attribute__((aligned(32))); + /// Number of code segments uint32_t C; - /// Number of "small" code segments (for definition see 36-212 V8.6 2009-03, p.10) - uint32_t Cminus; - /// Number of "large" code segments (for definition see 36-212 V8.6 2009-03, p.10) - uint32_t Cplus; - /// Number of bits in "small" code segments (<6144) (for definition see 36-212 V8.6 2009-03, p.10) - uint32_t Kminus; - /// Number of bits in "large" code segments (<6144) (for definition see 36-212 V8.6 2009-03, p.10) - uint32_t Kplus; - /// Number of "Filler" bits (for definition see 36-212 V8.6 2009-03, p.10) + /// Number of bits in "small" code segments + uint32_t K; + /// Number of "Filler" bits uint32_t F; - /// Number of MIMO layers (streams) (for definition see 36-212 V8.6 2009-03, p.17, TM3-4) + /// Number of MIMO layers (streams) uint8_t Nl; /// Number of layers for this PDSCH transmission (TM8-10) uint8_t Nlayers; /// First layer for this PSCH transmission uint8_t first_layer; /// codeword this transport block is mapped to - uint8_t codeword;*/ + uint8_t codeword; } NR_DL_gNB_HARQ_t; typedef struct { /// Pointers to 8 HARQ processes for the DLSCH - LTE_DL_eNB_HARQ_t *harq_processes[8]; + NR_DL_gNB_HARQ_t *harq_processes[8]; nfapi_nr_pdsch_time_domain_alloc_type_e time_alloc_type; uint8_t time_alloc_list_flag; uint8_t rbg_list[NR_MAX_NB_RBG]; - -//LTE remainders to be removed -/* /// TX buffers for UE-spec transmission (antenna ports 5 or 7..14, prior to precoding) + /// TX buffers for UE-spec transmission (antenna ports 5 or 7..14, prior to precoding) int32_t *txdataF[8]; /// beamforming weights for UE-spec transmission (antenna ports 5 or 7..14), for each codeword, maximum 4 layers? - int32_t **ue_spec_bf_weights[4]; + int32_t **ue_spec_bf_weights[4]; /// dl channel estimates (estimated from ul channel estimates) int32_t **calib_dl_ch_estimates; /// Allocated RNTI (0 means DLSCH_t is not currently used) @@ -175,16 +165,15 @@ typedef struct { uint8_t ra_window_size; /// First-round error threshold for fine-grain rate adaptation uint8_t error_threshold; - /// Number of soft channel bits uint32_t G; /// Codebook index for this dlsch (0,1,2,3) uint8_t codebook_index; - /// Maximum number of HARQ processes (for definition see 36-212 V8.6 2009-03, p.17) + /// Maximum number of HARQ processes uint8_t Mdlharq; /// Maximum number of HARQ rounds uint8_t Mlimit; - /// MIMO transmission mode indicator for this sub-frame (for definition see 36-212 V8.6 2009-03, p.17) + /// MIMO transmission mode indicator for this sub-frame uint8_t Kmimo; /// Nsoft parameter related to UE Category uint32_t Nsoft; @@ -192,13 +181,6 @@ typedef struct { int16_t sqrt_rho_a; /// amplitude of PDSCH (compared to RS) in symbols containing pilots int16_t sqrt_rho_b; -#ifdef Rel14 - /// indicator that this DLSCH corresponds to SIB1-BR, needed for c_init for scrambling - uint8_t sib1_br_flag; - /// initial absolute subframe (see 36.211 Section 6.3.1), needed for c_init for scrambling - uint16_t i0; - CEmode_t CEmode; -#endif*/ } NR_gNB_DLSCH_t; diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 3885ee93e6..93cea42bce 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -3980,13 +3980,10 @@ void copy_harq_proc_struct(NR_DL_UE_HARQ_t *harq_processes_dest, NR_DL_UE_HARQ_t { harq_processes_dest->B = current_harq_processes->B ; harq_processes_dest->C = current_harq_processes->C ; - harq_processes_dest->Cminus = current_harq_processes->Cminus ; - harq_processes_dest->Cplus = current_harq_processes->Cplus ; harq_processes_dest->DCINdi = current_harq_processes->DCINdi ; harq_processes_dest->F = current_harq_processes->F ; harq_processes_dest->G = current_harq_processes->G ; - harq_processes_dest->Kminus = current_harq_processes->Kminus ; - harq_processes_dest->Kplus = current_harq_processes->Kplus ; + harq_processes_dest->K = current_harq_processes->K ; harq_processes_dest->Nl = current_harq_processes->Nl ; harq_processes_dest->Qm = current_harq_processes->Qm ; harq_processes_dest->TBS = current_harq_processes->TBS ; From 23dbc2ad3db3ae70ea4de8a3cbd9c235b8dd841b Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Wed, 19 Sep 2018 14:04:09 +0200 Subject: [PATCH 021/117] nr adding filler bits and dlsch coding --- openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 413 ++++++++++++++++++ .../PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 14 +- 2 files changed, 422 insertions(+), 5 deletions(-) create mode 100644 openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c new file mode 100644 index 0000000000..819b3af823 --- /dev/null +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -0,0 +1,413 @@ +/* + * 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.0 (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_coding.c +* \brief Top-level routines for implementing LDPC-coded (DLSCH) transport channels from 38-212, 15.2 +* \author H.Wang +* \date 2018 +* \version 0.1 +* \company Eurecom +* \email: +* \note +* \warning +*/ + +#include "PHY/defs_gNB.h" +#include "PHY/phy_extern.h" +#include "PHY/CODING/coding_extern.h" +#include "PHY/CODING/coding_defs.h" +#include "PHY/CODING/lte_interleaver_inline.h" +#include "PHY/NR_TRANSPORT/nr_transport.h" +#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h" +#include "SCHED_NR/sched_nr.h" +#include "defs.h" +#include "UTIL/LOG/vcd_signal_dumper.h" +#include "UTIL/LOG/log.h" +#include + +//#define DEBUG_DLSCH_CODING +//#define DEBUG_DLSCH_FREE 1 + +void free_gNB_dlsch(NR_gNB_DLSCH_t *dlsch) +{ + int i; + int r; + + if (dlsch) { +#ifdef DEBUG_DLSCH_FREE + printf("Freeing dlsch %p\n",dlsch); +#endif + + for (i=0; iMdlharq; i++) { +#ifdef DEBUG_DLSCH_FREE + printf("Freeing dlsch process %d\n",i); +#endif + + if (dlsch->harq_processes[i]) { +#ifdef DEBUG_DLSCH_FREE + printf("Freeing dlsch process %d (%p)\n",i,dlsch->harq_processes[i]); +#endif + + if (dlsch->harq_processes[i]->b) { + free16(dlsch->harq_processes[i]->b,MAX_DLSCH_PAYLOAD_BYTES); + dlsch->harq_processes[i]->b = NULL; +#ifdef DEBUG_DLSCH_FREE + printf("Freeing dlsch process %d b (%p)\n",i,dlsch->harq_processes[i]->b); +#endif + } + +#ifdef DEBUG_DLSCH_FREE + printf("Freeing dlsch process %d c (%p)\n",i,dlsch->harq_processes[i]->c); +#endif + + for (r=0; rharq_processes[i]->c[r]); +#endif + + if (dlsch->harq_processes[i]->c[r]) { + free16(dlsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+1056); + dlsch->harq_processes[i]->c[r] = NULL; + } + if (dlsch->harq_processes[i]->d[r]) { + free16(dlsch->harq_processes[i]->d[r],(96+12+3+(3*8448))); + dlsch->harq_processes[i]->d[r] = NULL; + } + + } + free16(dlsch->harq_processes[i],sizeof(NR_DL_gNB_HARQ_t)); + dlsch->harq_processes[i] = NULL; + } + } + + free16(dlsch,sizeof(NR_gNB_DLSCH_t)); + dlsch = NULL; + } + +} + +NR_gNB_DLSCH_t *new_gNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_t Nsoft,unsigned char N_RB_DL, uint8_t abstraction_flag, NR_DL_FRAME_PARMS* frame_parms) +{ + + NR_gNB_DLSCH_t *dlsch; + unsigned char exit_flag = 0,i,j,r,aa,layer; + int re; + unsigned char bw_scaling =1; + + switch (N_RB_DL) { + + case 106: + bw_scaling =2; + break; + + default: + bw_scaling =1; + break; + } + + dlsch = (NR_gNB_DLSCH_t *)malloc16(sizeof(NR_gNB_DLSCH_t)); + + if (dlsch) { + bzero(dlsch,sizeof(NR_gNB_DLSCH_t)); + dlsch->Kmimo = Kmimo; + dlsch->Mdlharq = Mdlharq; + dlsch->Mlimit = 4; + dlsch->Nsoft = Nsoft; + + for (layer=0; layer<4; layer++) { + dlsch->ue_spec_bf_weights[layer] = (int32_t**)malloc16(frame_parms->nb_antennas_tx*sizeof(int32_t*)); + + for (aa=0; aanb_antennas_tx; aa++) { + dlsch->ue_spec_bf_weights[layer][aa] = (int32_t *)malloc16(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t)); + for (re=0;reue_spec_bf_weights[layer][aa][re] = 0x00007fff; + } + } + } + + dlsch->calib_dl_ch_estimates = (int32_t**)malloc16(frame_parms->nb_antennas_tx*sizeof(int32_t*)); + for (aa=0; aanb_antennas_tx; aa++) { + dlsch->calib_dl_ch_estimates[aa] = (int32_t *)malloc16(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t)); + + } + + for (i=0; i<10; i++) + dlsch->harq_ids[i] = Mdlharq; + + for (i=0; iharq_processes[i] = (NR_DL_gNB_HARQ_t *)malloc16(sizeof(NR_DL_gNB_HARQ_t)); + LOG_T(PHY, "Required mem size %d (bw scaling %d), dlsch->harq_processes[%d] %p\n", + MAX_NR_ULSCH_PAYLOAD_BYTES/bw_scaling,bw_scaling, i,dlsch->harq_processes[i]); + + if (dlsch->harq_processes[i]) { + bzero(dlsch->harq_processes[i],sizeof(NR_DL_gNB_HARQ_t)); + // dlsch->harq_processes[i]->first_tx=1; + dlsch->harq_processes[i]->b = (unsigned char*)malloc16(MAX_NR_ULSCH_PAYLOAD_BYTES/bw_scaling); + + if (dlsch->harq_processes[i]->b) { + bzero(dlsch->harq_processes[i]->b,MAX_NR_ULSCH_PAYLOAD_BYTES/bw_scaling); + } else { + printf("Can't get b\n"); + exit_flag=1; + } + + if (abstraction_flag==0) { + for (r=0; rharq_processes[i]->c[r] = (uint8_t*)malloc16(8448); + dlsch->harq_processes[i]->d[r] = (uint8_t*)malloc16(3*8448); + if (dlsch->harq_processes[i]->c[r]) { + bzero(dlsch->harq_processes[i]->c[r],8448); + } else { + printf("Can't get c\n"); + exit_flag=2; + } + if (dlsch->harq_processes[i]->d[r]) { + bzero(dlsch->harq_processes[i]->d[r],(3*8448)); + } else { + printf("Can't get d\n"); + exit_flag=2; + } + } + } + } else { + printf("Can't get harq_p %d\n",i); + exit_flag=3; + } + } + + if (exit_flag==0) { + for (i=0; iharq_processes[i]->round=0; + } + + return(dlsch); + } + } + + LOG_D(PHY,"new_gNB_dlsch exit flag %d, size of %ld\n", + exit_flag, sizeof(NR_gNB_DLSCH_t)); + free_gNB_dlsch(dlsch); + return(NULL); + + +} + +void clean_gNB_dlsch(NR_gNB_DLSCH_t *dlsch) +{ + + unsigned char Mdlharq; + unsigned char i,j,r; + + if (dlsch) { + Mdlharq = dlsch->Mdlharq; + dlsch->rnti = 0; + dlsch->active = 0; + + for (i=0; i<10; i++) + dlsch->harq_ids[i] = Mdlharq; + + for (i=0; iharq_processes[i]) { + // dlsch->harq_processes[i]->Ndi = 0; + dlsch->harq_processes[i]->status = 0; + dlsch->harq_processes[i]->round = 0; + + for (j=0; j<96; j++) + for (r=0; rharq_processes[i]->d[r]) + dlsch->harq_processes[i]->d[r][j] = NR_NULL; + + } + } + } +} + +int dlsch_encoding(PHY_VARS_gNB *gNB, + unsigned char *a, + uint8_t num_pdcch_symbols, + NR_gNB_DLSCH_t *dlsch, + int frame, + uint8_t subframe, + time_stats_t *rm_stats, + time_stats_t *te_stats, + time_stats_t *i_stats) +{ + + unsigned int G; + unsigned int crc=1; + unsigned short iind; + + NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms; + unsigned char harq_pid = dlsch->current_harq_pid; + unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb; + unsigned int A, Z; + unsigned *pz = &Z; + unsigned char mod_order; + unsigned int Kr=0,Kr_bytes,r,r_offset=0,Kr_int=0; + unsigned short m=dlsch->harq_processes[harq_pid]->mcs; + uint8_t beamforming_mode=0; + uint8_t *d_tmp[MAX_NUM_DLSCH_SEGMENTS]; + double rate = 0.33; + uint8_t kb,BG; + uint32_t E; + uint8_t Ilbrm = 0; + uint32_t Tbslbrm = 950984; //to compute tbs + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN); + + A = dlsch->harq_processes[harq_pid]->TBS; + //printf("Encoder: A: %d frame.subframe %d.%d \n",A, frame,subframe); + mod_order = get_nr_Qm(dlsch->harq_processes[harq_pid]->mcs); + + G = get_G(frame_parms,nb_rb,dlsch->harq_processes[harq_pid]->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe,beamforming_mode); + + // if (dlsch->harq_processes[harq_pid]->Ndi == 1) { // this is a new packet + if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet +#ifdef DEBUG_DLSCH_CODING + printf("encoding thinks this is a new packet \n"); +#endif + /* + int i; + printf("dlsch (tx): \n"); + for (i=0;i<(A>>3);i++) + printf("%02x.",a[i]); + printf("\n"); + */ + // Add 24-bit crc (polynomial A) to payload + crc = crc24a(a, + A)>>8; + a[A>>3] = ((uint8_t*)&crc)[2]; + a[1+(A>>3)] = ((uint8_t*)&crc)[1]; + a[2+(A>>3)] = ((uint8_t*)&crc)[0]; + //printf("CRC %x (A %d)\n",crc,A); + + dlsch->harq_processes[harq_pid]->B = A+24; + // dlsch->harq_processes[harq_pid]->b = a; + memcpy(dlsch->harq_processes[harq_pid]->b,a,(A/8)+4); + + nr_segmentation(dlsch->harq_processes[harq_pid]->b, + dlsch->harq_processes[harq_pid]->c, + dlsch->harq_processes[harq_pid]->B, + &dlsch->harq_processes[harq_pid]->C, + &dlsch->harq_processes[harq_pid]->K, + pz, + &dlsch->harq_processes[harq_pid]->F); + + kb = dlsch->harq_processes[harq_pid]->K/(*pz); + if ( kb==22){ + BG = 1; + } + else{ + BG = 2; + } + + //printf("Encoder: B %d F %d \n",dlsch->harq_processes[harq_pid]->B, dlsch->harq_processes[harq_pid]->F); + + Kr = dlsch->harq_processes[harq_pid]->K; + Kr_bytes = Kr>>3; + + start_meas(te_stats); + for (r=0; rharq_processes[harq_pid]->C; r++) { + d_tmp[r] = &dlsch->harq_processes[harq_pid]->d[r][0]; +#ifdef DEBUG_DLSCH_CODING + printf("start ldpc encoder segment %d/%d\n",r,dlsch->harq_processes[harq_pid]->C); + printf("input %d %d %d %d %d \n", dlsch->harq_processes[harq_pid]->c[r][0], dlsch->harq_processes[harq_pid]->c[r][1], dlsch->harq_processes[harq_pid]->c[r][2],dlsch->harq_processes[harq_pid]->c[r][3], dlsch->harq_processes[harq_pid]->c[r][4]); + /*for (int cnt =0 ; cnt < 22*(*pz); cnt ++){ + printf("%d ", dlsch->harq_processes[harq_pid]->c[r][cnt]); + }*/ + +#endif + //ldpc_encoder_orig((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],&dlsch->harq_processes[harq_pid]->d[r][96],Kr,1,3,0); + //ldpc_encoder((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],&dlsch->harq_processes[harq_pid]->d[r][96],Kr,1,3); + //ldpc_encoder_optim((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],(unsigned char*)&dlsch->harq_processes[harq_pid]->d[r][96],Kr,1,3,NULL,NULL,NULL,NULL); + } + + ldpc_encoder_optim_8seg(dlsch->harq_processes[harq_pid]->c,d_tmp,Kr,1,3,dlsch->harq_processes[harq_pid]->C,NULL,NULL,NULL,NULL); + stop_meas(te_stats); + /*printf("end ldpc encoder -- output\n"); + + + printf("output %d %d %d %d %d \n", dlsch->harq_processes[harq_pid]->d[r][0], dlsch->harq_processes[harq_pid]->d[r][1], dlsch->harq_processes[harq_pid]->d[r][2],dlsch->harq_processes[harq_pid]->d[r][3], dlsch->harq_processes[harq_pid]->d[r][4]); + for (int cnt =0 ; cnt < 66*(*pz); cnt ++){ + printf("%d \n", dlsch->harq_processes[harq_pid]->d[r][cnt]); + } + printf("\n");*/ + +#ifdef DEBUG_DLSCH_CODING + write_output("enc_input0.m","enc_in0",&dlsch->harq_processes[harq_pid]->c[0][0],Kr_bytes,1,4); + write_output("enc_output0.m","enc0",&dlsch->harq_processes[harq_pid]->d[0][0],(3*8*Kr_bytes)+12,1,4); +#endif + + } + + for (r=0; rharq_processes[harq_pid]->C; r++) { +#ifdef DEBUG_DLSCH_CODING + printf("Rate Matching, Code segment %d (coded bits (G) %d,unpunctured/repeated bits per code segment %d,mod_order %d, nb_rb %d)...\n", + r, + G, + Kr*3, + mod_order,nb_rb); +#endif + + start_meas(rm_stats); +#ifdef DEBUG_DLSCH_CODING + printf("rvidx in encoding = %d\n", dlsch->harq_processes[harq_pid]->rvidx); +#endif + + r_offset += nr_rate_matching_ldpc(Ilbrm, + Tbslbrm, + BG, + *pz, + G, + dlsch->harq_processes[harq_pid]->d[r], + dlsch->harq_processes[harq_pid]->e+r_offset, + dlsch->harq_processes[harq_pid]->C, + dlsch->harq_processes[harq_pid]->rvidx, + mod_order, + dlsch->harq_processes[harq_pid]->Nl, + r); + + + stop_meas(rm_stats); + + if (r==0) E=r_offset; + + start_meas(i_stats); + nr_interleaving_ldpc(E, + &dlsch->harq_processes[harq_pid]->Qm, + dlsch->harq_processes[harq_pid]->e+r_offset, + dlsch->harq_processes[harq_pid]->f+r_offset); + stop_meas(i_stats); + +#ifdef DEBUG_DLSCH_CODING + + if (r==dlsch->harq_processes[harq_pid]->C-1) + write_output("enc_output.m","enc",dlsch->harq_processes[harq_pid]->f,r_offset,1,4); + +#endif + } + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT); + + return(0); +} diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index ec7c01031c..2632260ef5 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -382,7 +382,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, #endif nr_deinterleaving_ldpc(E, harq_process->Qm, - &harq_process->d[r], + harq_process->d[r], harq_process->w[r]); #if UE_TIMING_TRACE @@ -445,16 +445,20 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, } printf(" \n");*/ - memset(pv,0,2*p_decParams->Z*sizeof(int16_t)); + memset(pv,0,harq_process->K*sizeof(int16_t)); //memset(pl,0,2*p_decParams->Z*sizeof(int8_t)); - - for (i=2*p_decParams->Z/8, j = 0; i < (kc*p_decParams->Z/8+1); i++, j++) + for (i=((2*p_decParams->Z)>>3), j = 0; i < (Kr_bytes-(harq_process->F>>3)); i++, j++) { pv[i]= _mm_loadu_si128((__m128i*)(&inv_d[8*j])); } + + for (i=Kr_bytes, j = (Kr_bytes-(harq_process->F>>3)); i < ((kc*p_decParams->Z)>>3); i++, j++) + { + pv[i]= _mm_loadu_si128((__m128i*)(&inv_d[8*j])); + } - for (i=0, j=0; j < (kc*p_decParams->Z/16); i+=2, j++) + for (i=0, j=0; j < ((kc*p_decParams->Z)>>4); i+=2, j++) { pl[j] = _mm_packs_epi16(pv[i],pv[i+1]); From c35ab1a239f8830e053543a6751341f9a5593cd5 Mon Sep 17 00:00:00 2001 From: ISIP CS/NCTU Date: Thu, 20 Sep 2018 14:36:49 +0200 Subject: [PATCH 022/117] add 1_0 rnti and test pdu bit --- openair1/PHY/NR_TRANSPORT/nr_dci_tools.c | 365 +++++++++++++++++- .../LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c | 28 +- 2 files changed, 389 insertions(+), 4 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c b/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c index aafafb6d7d..ebc9c96970 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c @@ -121,7 +121,8 @@ void nr_fill_dci_and_dlsch(PHY_VARS_gNB *gNB, nfapi_nr_config_request_t *cfg = &gNB->gNB_config; uint16_t N_RB = fp->initial_bwp_dl.N_RB; - uint8_t fsize=0, pos=0, cand_idx=0; + uint16_t N_RB_UL = fp->initial_bwp_ul.N_RB; + uint8_t fsize=0, pos=0, pos2=0,cand_idx=0; /// Payload generation switch(params_rel15->dci_format) { @@ -131,6 +132,7 @@ void nr_fill_dci_and_dlsch(PHY_VARS_gNB *gNB, case NFAPI_NR_RNTI_RA: // Freq domain assignment fsize = (int)ceil( log2( (N_RB*(N_RB+1))>>1 ) ); + printf("fsize = %d\n",fsize); for (int i=0; ifrequency_domain_assignment>>(fsize-i-1))&1)<tb_scaling>>(1-i))&1)<format_indicator&1)<> fsize = 16) + fsize = (int)ceil( log2( (N_RB*(N_RB+1))>>1 ) ); + for (int i=0; ifrequency_domain_assignment>>(fsize-i-1))&1)<frequency_domain_assignment+1)&1 ==0) //fsize are all 1 38.212 p86 + { + printf("***************************\n"); + + // ra_preamble_index 6bit + for (int i=0; i<6; i++) + *dci_pdu |= ((pdu_rel15->ra_preamble_index>>(5-i-1))&1)<ul_sul_indicator&1)<ss_pbch_index>>(5-i))&1)<prach_mask_index>>(3-i))&1)<31) + *(dci_pdu+1) |= ((pdu_rel15->prach_mask_index>>(3-i))&1)<prach_mask_index>>(3-i))&1)<time_domain_assignment>>(3-i))&1)<vrb_to_prb_mapping&1)<mcs>>(4-i))&1)<ndi&1)<rv>>(1-i))&1)<harq_pid>>(3-i))&1)<31) + *(dci_pdu+1) |= ((pdu_rel15->harq_pid>>(3-i))&1)<harq_pid>>(3-i))&1)<31) + *(dci_pdu+1) |= ((pdu_rel15->dai>>(1-i))&1)<dai>>(1-i))&1)<31) + *(dci_pdu+1) |= ((pdu_rel15->tpc>>(1-i))&1)<tpc>>(1-i))&1)<31) + *(dci_pdu+1) |= ((pdu_rel15->pucch_resource_indicator>>(2-i))&1)<pucch_resource_indicator>>(2-i))&1)<31) + *(dci_pdu+1) |= ((pdu_rel15->pdsch_to_harq_feedback_timing_indicator>>(2-i))&1)<pdsch_to_harq_feedback_timing_indicator>>(2-i))&1)<short_messages_indicator>>(1-i))&1)<short_messages>>(7-i))&1)<>1 ) ); + for (int i=0; ifrequency_domain_assignment>>(fsize-i-1))&1)<time_domain_assignment>>(3-i))&1)<vrb_to_prb_mapping&1)<mcs>>(4-i))&1)<31) + *(dci_pdu+1) |= ((pdu_rel15->mcs>>(4-i))&1)<mcs>>(4-i))&1)<31) + *(dci_pdu+1) |= ((pdu_rel15->tb_scaling>>(1-i))&1)<tb_scaling>>(1-i))&1)<>1 ) ); + for (int i=0; ifrequency_domain_assignment>>(fsize-i-1))&1)<time_domain_assignment>>(3-i))&1)<vrb_to_prb_mapping&1)<mcs>>(4-i))&1)<rv>>(1-i))&1)<format_indicator&1)<>1 ) ); + for (int i=0; ifrequency_domain_assignment>>(fsize-i-1))&1)<time_domain_assignment>>(3-i))&1)<vrb_to_prb_mapping&1)<mcs>>(4-i))&1)<ndi&1)<rv>>(1-i))&1)<harq_pid>>(3-i))&1)<31) + *(dci_pdu+1) |= ((pdu_rel15->harq_pid>>(3-i))&1)<harq_pid>>(3-i))&1)<31) + *(dci_pdu+1) |= ((pdu_rel15->dai>>(1-i))&1)<dai>>(1-i))&1)<31) + *(dci_pdu+1) |= ((pdu_rel15->tpc>>(1-i))&1)<tpc>>(1-i))&1)<31) + *(dci_pdu+1) |= ((pdu_rel15->pucch_resource_indicator>>(2-i))&1)<pucch_resource_indicator>>(2-i))&1)<31) + *(dci_pdu+1) |= ((pdu_rel15->pdsch_to_harq_feedback_timing_indicator>>(2-i))&1)<pdsch_to_harq_feedback_timing_indicator>>(2-i))&1)<rnti_type) + { + case NFAPI_NR_RNTI_C: + // indicating a DL DCI format 1bit + *dci_pdu |= (pdu_rel15->format_indicator&1)<>1 ) ); + for (int i=0; ifrequency_domain_assignment>>(fsize-i-1))&1)<time_domain_assignment>>(3-i))&1)<frequency_hopping_flag&1)<mcs>>(4-i))&1)<ndi&1)<rv>>(1-i))&1)<harq_pid>>(3-i))&1)<31) + *(dci_pdu+1) |= ((pdu_rel15->harq_pid>>(3-i))&1)<harq_pid>>(3-i))&1)<31) + *(dci_pdu+1) |= ((pdu_rel15->tpc>>(1-i))&1)<tpc>>(1-i))&1)<padding&1)<pucch_config.pucch_GroupHopping.value) + { + if (pos>31) + *(dci_pdu+1) |= (pdu_rel15->ul_sul_indicator&1)<ul_sul_indicator&1)<format_indicator&1)<>1 ) ); + for (int i=0; ifrequency_domain_assignment>>(fsize-i-1))&1)<time_domain_assignment>>(3-i))&1)<frequency_hopping_flag&1)<mcs>>(4-i))&1)<ndi&1)<rv>>(1-i))&1)<harq_pid>>(3-i))&1)<31) + *(dci_pdu+1) |= ((pdu_rel15->harq_pid>>(3-i))&1)<harq_pid>>(3-i))&1)<31) + *(dci_pdu+1) |= ((pdu_rel15->tpc>>(1-i))&1)<tpc>>(1-i))&1)<padding&1)<pucch_config.pucch_GroupHopping.value) + { + if (pos>31) + *(dci_pdu+1) |= (pdu_rel15->ul_sul_indicator&1)<ul_sul_indicator&1)<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]); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c index 2a59863977..4a5054b52a 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c @@ -71,10 +71,32 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, memcpy((void*)params_rel15, (void*)&gNB->pdcch_type0_params, sizeof(nfapi_nr_dl_config_pdcch_parameters_rel15_t)); pdu_rel15->frequency_domain_assignment = 5; - pdu_rel15->time_domain_assignment = 2; - pdu_rel15->vrb_to_prb_mapping = 0; + pdu_rel15->time_domain_assignment = 3; + pdu_rel15->vrb_to_prb_mapping = 1; pdu_rel15->mcs = 12; pdu_rel15->tb_scaling = 1; + + pdu_rel15->ra_preamble_index = 25; + pdu_rel15->format_indicator = 1; + pdu_rel15->ul_sul_indicator = 1; + + pdu_rel15->ss_pbch_index = 21; + pdu_rel15->prach_mask_index = 3; + pdu_rel15->ndi = 1; + pdu_rel15->rv = 2; + pdu_rel15->harq_pid = 7; + pdu_rel15->dai = 2; + pdu_rel15->tpc = 2; + pdu_rel15->pucch_resource_indicator = 7; + pdu_rel15->pdsch_to_harq_feedback_timing_indicator = 7; + + + pdu_rel15->tb_scaling = 1; + pdu_rel15->tb_scaling = 1; + pdu_rel15->tb_scaling = 1; + pdu_rel15->tb_scaling = 1; + + LOG_I(MAC, "[gNB scheduler phytest] DCI type 1 payload: freq_alloc %d, time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d\n", pdu_rel15->frequency_domain_assignment, pdu_rel15->time_domain_assignment, @@ -83,7 +105,7 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, pdu_rel15->tb_scaling); params_rel15->rnti = 0x03; - params_rel15->rnti_type = NFAPI_NR_RNTI_RA; + params_rel15->rnti_type = NFAPI_NR_RNTI_C; params_rel15->dci_format = NFAPI_NR_DL_DCI_FORMAT_1_0; //params_rel15->aggregation_level = 1; LOG_I(MAC, "DCI type 1 params: rmsi_pdcch_config %d, rnti %d, rnti_type %d, dci_format %d\n \ From 0613a01f8dd837bff153d7b82a7c8d85e3ac5ebb Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 25 Sep 2018 03:41:04 -0700 Subject: [PATCH 023/117] WIP: mostly debug messages --- openair1/PHY/NR_TRANSPORT/nr_pss.c | 6 +++--- openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c | 6 ++++-- openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c | 15 +++++++++++---- openair1/PHY/NR_UE_TRANSPORT/pss_nr.c | 14 ++------------ openair1/PHY/phy_extern_nr_ue.h | 2 +- openair1/SIMULATION/NR_PHY/pbchsim.c | 8 ++++++++ targets/RT/USER/nr-ru.c | 4 ++-- 7 files changed, 31 insertions(+), 24 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_pss.c b/openair1/PHY/NR_TRANSPORT/nr_pss.c index 3c4f296cd6..1f653038a6 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_pss.c +++ b/openair1/PHY/NR_TRANSPORT/nr_pss.c @@ -22,7 +22,7 @@ #include "PHY/NR_TRANSPORT/nr_transport.h" -//#define NR_PSS_DEBUG +#define NR_PSS_DEBUG int nr_generate_pss( int16_t *d_pss, int32_t **txdataF, @@ -52,7 +52,7 @@ int nr_generate_pss( int16_t *d_pss, } #ifdef NR_PSS_DEBUG - write_output("d_pss.m", "d_pss", (void*)d_pss, NR_PSS_LENGTH, 1, 1); + write_output("d_pss.m", "d_pss", (void*)d_pss, NR_PSS_LENGTH, 1, 0); #endif /// Resource mapping @@ -75,7 +75,7 @@ int nr_generate_pss( int16_t *d_pss, } #ifdef NR_PSS_DEBUG - write_output("pss_0.m", "pss_0", (void*)txdataF[0][2*l*frame_parms->ofdm_symbol_size], frame_parms->ofdm_symbol_size, 1, 1); + write_output("pss_0.m", "pss_0", (void*)&txdataF[0][2*l*frame_parms->ofdm_symbol_size], frame_parms->ofdm_symbol_size, 1, 1); #endif return 0; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c index 0937fa6036..7acc0d082d 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c @@ -197,13 +197,15 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode) * sync_pos SS/PBCH block */ cnt++; - if (cnt >100){ - cnt =0; + if (1){ + cnt =0; /* process pss search on received buffer */ sync_pos = pss_synchro_nr(ue, NO_RATE_CHANGE); sync_pos_slot = (frame_parms->samples_per_tti>>1) - 3*(frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples); + sync_pos = sync_pos_slot+frame_parms->nb_prefix_samples; + if (sync_pos >= frame_parms->nb_prefix_samples) sync_pos2 = sync_pos - frame_parms->nb_prefix_samples; else diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c index dd25d4639b..7efadfb9fd 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c @@ -35,7 +35,7 @@ #include "PHY/sse_intrin.h" //#include "SIMULATION/TOOLS/sim.h" -//#define DEBUG_PBCH 1 +#define DEBUG_PBCH 1 //#define DEBUG_PBCH_ENCODING #ifdef OPENAIR2 @@ -247,6 +247,9 @@ void nr_pbch_channel_compensation(int **rxdataF_ext, uint8_t output_shift) { + short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1}; + short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1}; + uint16_t rb,nb_rb=20; uint8_t aatx,aarx; #if defined(__x86_64__) || defined(__i386__) @@ -552,8 +555,10 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, for (symbol=5; symbol<8; symbol++) { +#ifdef DEBUG_PBCH //printf("address dataf %p",nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].rxdataF); - //write_output("rxdataF0_pbch.m","rxF0pbch",nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].rxdataF,frame_parms->ofdm_symbol_size*4,2,1); + write_output("rxdataF0_pbch.m","rxF0pbch",nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].rxdataF,frame_parms->ofdm_symbol_size*4,2,1); +#endif nr_pbch_extract(nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].rxdataF, nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].dl_ch_estimates[eNB_id], @@ -583,8 +588,10 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, symbol, log2_maxh); // log2_maxh+I0_shift - //write_output("rxdataF_comp.m","rxFcomp",nr_ue_pbch_vars->rxdataF_comp,180,2,1); - +#ifdef DEBUG_PBCH + write_output("rxdataF_comp.m","rxFcomp",nr_ue_pbch_vars->rxdataF_comp,180,2,1); +#endif + /*if (frame_parms->nb_antennas_rx > 1) pbch_detection_mrc(frame_parms, nr_ue_pbch_vars->rxdataF_comp, diff --git a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c index 32f906c1d9..969fe1b1e5 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c @@ -57,6 +57,8 @@ * *********************************************************************/ +#define DBG_PSS_NR + void *get_idft(int ofdm_symbol_size) { void (*idft)(int16_t *,int16_t *, int); @@ -791,18 +793,6 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain /* Correlation computation is based on a a dot product which is realized thank to SIMS extensions */ for (n=0; n < length; n+=4) { -#ifdef RTAI_ENABLED - - // This is necessary since the sync takes a long time and it seems to block all other threads thus screwing up RTAI. If we pause it for a little while during its execution we give RTAI a chance to catch up with its other tasks. - if ((n%frame_parms->samples_per_subframe == 0) && (n>0) && (openair_daq_vars.sync_state==0)) { -#ifdef DEBUG_PHY - msg("[SYNC TIME] pausing for 1000ns, n=%d\n",n); -#endif - rt_sleep(nano2count(1000)); - } - -#endif - for (int pss_index = 0; pss_index < NUMBER_PSS_SEQUENCE; pss_index++) { pss_corr_ue[pss_index][n] = 0; /* clean correlation for position n */ diff --git a/openair1/PHY/phy_extern_nr_ue.h b/openair1/PHY/phy_extern_nr_ue.h index 253c5b7fb9..2fa9ef511e 100644 --- a/openair1/PHY/phy_extern_nr_ue.h +++ b/openair1/PHY/phy_extern_nr_ue.h @@ -32,7 +32,7 @@ extern char fmageren_name2[512]; extern unsigned int RX_DMA_BUFFER[4][NB_ANTENNAS_RX]; extern unsigned int TX_DMA_BUFFER[4][NB_ANTENNAS_TX]; -#include "PHY/LTE_TRANSPORT/transport_extern.h" +//#include "PHY/LTE_TRANSPORT/transport_extern.h" extern int number_of_cards; diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index 4b90dce15c..1d91510304 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -117,6 +117,8 @@ int main(int argc, char **argv) int frame_length_complex_samples_no_prefix; NR_DL_FRAME_PARMS *frame_parms; nfapi_nr_config_request_t *gNB_config; + + int ret; cpuf = get_cpu_freq_GHz(); @@ -309,6 +311,9 @@ int main(int argc, char **argv) } } + if (snr1set==0) + snr1 = snr0+10; + gNB2UE = new_channel_desc_scm(n_tx, n_rx, channel_model, @@ -443,6 +448,9 @@ int main(int argc, char **argv) if (gNB->frame_parms.nb_antennas_tx>1) LOG_M("rxsig1.m","rxs1", UE->common_vars.rxdata[1],frame_length_complex_samples,1,1); } + + ret = nr_initial_sync(UE, normal_txrx); + printf("nr_initial_sync1 returns %d\n",ret); } //noise trials diff --git a/targets/RT/USER/nr-ru.c b/targets/RT/USER/nr-ru.c index f0b7a766af..8cacda5880 100644 --- a/targets/RT/USER/nr-ru.c +++ b/targets/RT/USER/nr-ru.c @@ -806,10 +806,10 @@ void tx_rf(RU_t *ru) { for (i=0; inb_tx; i++) txp[i] = (void*)&ru->common.txdata[i][(proc->subframe_tx*fp->samples_per_subframe)-sf_extension]; - /*if (proc->subframe_tx == 0){ + if (proc->subframe_tx == 0){ write_output("txdataF_frame.m","txdataF_frame",&ru->common.txdataF_BF[i],fp->samples_per_subframe_wCP, 1, 1); write_output("txdata_frame.m","txdata_frame",&ru->common.txdata[i],fp->samples_per_subframe, 1, 1); - }*/ + } VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx-ru->openair0_cfg.tx_sample_advance)&0xffffffff ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); From e99f23d01db812d8e1b69aef3922d12edd54cb3f Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Wed, 26 Sep 2018 08:56:50 +0200 Subject: [PATCH 024/117] ue adding dlsch deinterleaver --- .../NR_UE_TRANSPORT/nr_dlsch_demodulation.c | 70 ++++++++++++++++--- .../NR_UE_TRANSPORT/nr_transport_proto_ue.h | 27 ++++--- 2 files changed, 78 insertions(+), 19 deletions(-) diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c index ccbee1feee..de155a86ed 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c @@ -856,13 +856,18 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, // -> // compute @pointer where llrs should filled for this ofdm-symbol int8_t *pllr_symbol_cw0; int8_t *pllr_symbol_cw1; + int8_t *pllr_symbol_cw0_deint; + int8_t *pllr_symbol_cw1_deint; uint32_t llr_offset_symbol; + uint32_t nb_rb_pdsch = 106; + uint16_t bundle_L = 2; 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_deint = (int8_t*)pdsch_vars[eNB_id]->llr[0]; + pllr_symbol_cw1_deint = (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 %x @LLR Buff(symb) %x\n", proc->frame_rx, proc->subframe_rx,symbol, nb_rb,dlsch0_harq->Qm, @@ -1198,6 +1203,8 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, } } + nr_dlsch_deinterleaving(symbol,bundle_L,(int16_t*)pllr_symbol_cw0,(int16_t*)pllr_symbol_cw0_deint, nb_rb_pdsch); + #if UE_TIMING_TRACE stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]); #if DISABLE_LOG_X @@ -1256,6 +1263,51 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, } +void nr_dlsch_deinterleaving(uint8_t symbol, + uint16_t L, + uint16_t *llr, + uint16_t *llr_deint, + uint32_t nb_rb_pdsch) +{ + + uint32_t bundle_idx, N_bundle, R, C, r,c; + int32_t m,k; + uint8_t nb_re; + + R=2; + N_bundle = nb_rb_pdsch/L; + C=N_bundle/R; + + uint32_t *bundle_deint = malloc(N_bundle*sizeof(uint32_t)); + + printf("N_bundle %d L %d nb_rb_pdsch %d\n",N_bundle, L,nb_rb_pdsch); + + if (symbol==2) + nb_re = 6; + else + nb_re = 12; + + + AssertFatal(llr!=NULL,"nr_dlsch_deinterleaving: FATAL llr is Null\n"); + + + for (c =0; c< C; c++){ + for (r=0; rnb_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]; + dl_ch128 = (__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*nb_rb*12]; + dl_ch_mag128 = (__m128i *)&dl_ch_mag[(aatx<<1)+aarx][symbol*nb_rb*12]; + dl_ch_mag128b = (__m128i *)&dl_ch_magb[(aatx<<1)+aarx][symbol*nb_rb*12]; + rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*nb_rb*12]; + rxdataF_comp128 = (__m128i *)&rxdataF_comp[(aatx<<1)+aarx][symbol*nb_rb*12]; for (rb=0; rbrx_correlation[0][aarx] = signal_energy(&rho[aarx][symbol*frame_parms->N_RB_DL*12],rb*12); + measurements->rx_correlation[0][aarx] = signal_energy(&rho[aarx][symbol*nb_rb*12],rb*12); } } } @@ -1945,7 +1997,7 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF, unsigned char symbol_mod,pilots=0,j=0,poffset=0; 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; + pilots = (symbol==2) ? 1 : 0; //to updated from config l=symbol; nsymb = (frame_parms->Ncp==NORMAL) ? 14:12; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h index b274f822a3..6048dff163 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h @@ -830,6 +830,12 @@ void nr_dlsch_channel_compensation(int32_t **rxdataF_ext, uint8_t output_shift, PHY_NR_MEASUREMENTS *phy_measurements); +void nr_dlsch_deinterleaving(uint8_t symbol, + uint16_t L, + uint16_t *llr, + uint16_t *llr_deint, + uint32_t nb_rb_pdsch); + void dlsch_dual_stream_correlation(NR_DL_FRAME_PARMS *frame_parms, unsigned char symbol, unsigned short nb_rb, @@ -991,16 +997,17 @@ void nr_dlsch_scale_channel(int32_t **dl_ch_estimates_ext, @param llr8_flag If 1, indicate that the 8-bit turbo decoder should be used @returns 0 on success, 1 on unsuccessful decoding */ -uint32_t dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, - int16_t *dlsch_llr, - NR_DL_FRAME_PARMS *lte_frame_parms, - NR_UE_DLSCH_t *dlsch, - NR_DL_UE_HARQ_t *harq_process, - uint32_t frame, - uint8_t subframe, - uint8_t harq_pid, - uint8_t is_crnti, - uint8_t llr8_flag); + +uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, + short *dlsch_llr, + NR_DL_FRAME_PARMS *frame_parms, + NR_UE_DLSCH_t *dlsch, + NR_DL_UE_HARQ_t *harq_process, + uint32_t frame, + uint8_t nr_tti_rx, + uint8_t harq_pid, + uint8_t is_crnti, + uint8_t llr8_flag); uint32_t dlsch_decoding_emul(PHY_VARS_NR_UE *phy_vars_ue, From 4a6e8b7281c5b78c9f5f1f60bbcab4b225515f50 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Wed, 26 Sep 2018 11:33:00 +0200 Subject: [PATCH 025/117] PRB bundling --- .../nfapi/public_inc/nfapi_nr_interface.h | 11 ++++++++ openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 2 ++ openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 2 ++ openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c | 25 ++++++++++++++++++- openair1/PHY/defs_nr_common.h | 13 ++++++++++ openair1/SCHED_NR/nr_ru_procedures.c | 5 ++-- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 6 ++--- 7 files changed, 56 insertions(+), 8 deletions(-) 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 eda587ec04..938cac8fd6 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h @@ -323,6 +323,17 @@ typedef enum { NFAPI_NR_PDSCH_RBG_CONFIG_TYPE2 } nfapi_nr_pdsch_rbg_config_type_e; +typedef enum { + NFAPI_NR_PRG_GRANULARITY_2=2, + NFAPI_NR_PRG_GRANULARITY_4=4, + NFAPI_NR_PRG_GRANULARITY_WIDEBAND +} nfapi_nr_prg_granularity_e; + +typedef enum { + NFAPI_NR_PRB_BUNDLING_TYPE_STATIC=0, + NFAPI_NR_PRB_BUNDLING_TYPE_DYNAMIC +} nfapi_nr_prb_bundling_type_e; + // P7 Sub Structures typedef struct { diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 5171527d87..62b65e8521 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -29,3 +29,5 @@ * \note * \warning */ + + diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index 3ba96c621e..71ba0a189e 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -44,3 +44,5 @@ uint8_t nr_get_S(uint8_t row_idx, uint8_t CP, uint8_t time_alloc_type, uint8_t d void nr_get_rbg_parms(NR_BWP_PARMS* bwp, uint8_t config_type); void nr_get_rbg_list(uint32_t bitmap, uint8_t n_rbg, uint8_t* rbg_list); + +void nr_get_PRG_parms(NR_BWP_PARMS* bwp, NR_gNB_DCI_ALLOC_t dci_alloc, uint8_t prb_bundling_type); diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c index 989394bcad..e1f7799f76 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c @@ -191,7 +191,7 @@ void nr_get_rbg_parms(NR_BWP_PARMS* bwp, uint8_t config_type) { rbg_parms->P = get_RBG_size_P(bwp->N_RB, config_type); rbg_parms->start_size = rbg_parms->P - bwp->location%rbg_parms->P; rbg_parms->end_size = ((bwp->location + bwp->N_RB)%rbg_parms->P)? ((bwp->location + bwp->N_RB)%rbg_parms->P) : rbg_parms->P; - rbg_parms->N_RBG = (uint8_t)ceil( (bwp->N_RB + (bwp->location%rbg_parms->P))/rbg_parms->P); + rbg_parms->N_RBG = (uint8_t)ceil( (bwp->N_RB + (bwp->location%rbg_parms->P))/(float)rbg_parms->P); LOG_I(PHY, "RBG parameters for BWP %d location %d N_RB %d:\n", bwp->bwp_id, bwp->location, bwp->N_RB); LOG_I(PHY, "P %d\t start size %d\t endsize %d\t N_RBG %d\n", rbg_parms->P, rbg_parms->start_size, rbg_parms->end_size, rbg_parms->N_RBG); } @@ -211,3 +211,26 @@ static inline uint16_t get_RIV(uint16_t rb_start, uint16_t L, uint16_t N_RB) { else return (N_RB*(N_RB-L+1) + (N_RB-1-rb_start)); } + + /// PRB bundling routines + +// Precoding granularity +static inline uint8_t nr_get_P_prime(uint8_t rnti_type, uint8_t dci_format, uint8_t prb_bundling_type) { + if (dci_format == NFAPI_NR_DL_DCI_FORMAT_1_0) + return (NFAPI_NR_PRG_GRANULARITY_2); + else // NFAPI_NR_DL_DCI_FORMAT_1_1 + return ((prb_bundling_type)?0:2);// incomplete for 1_1 +} + +void nr_get_PRG_parms(NR_BWP_PARMS* bwp, NR_gNB_DCI_ALLOC_t dci_alloc, uint8_t prb_bundling_type) { + nr_prg_parms_t* prg_parms = &bwp->prg_parms; + + prg_parms->P_prime = nr_get_P_prime(dci_alloc.pdcch_params.rnti_type, dci_alloc.pdcch_params.dci_format, prb_bundling_type); + prg_parms->start_size = prg_parms->P_prime - bwp->location%prg_parms->P_prime; + prg_parms->end_size = (bwp->location + bwp->N_RB)%prg_parms->P_prime; + if (!prg_parms->end_size) + prg_parms->end_size = prg_parms->P_prime; + prg_parms->N_PRG = ceil((float)bwp->N_RB/prg_parms->P_prime); + LOG_I(PHY, "PRG parameters for BWP %d location %d N_RB %d:\n", bwp->bwp_id, bwp->location, bwp->N_RB); + LOG_I(PHY, "P_prime %d\t start size %d\t endsize %d\t N_PRG %d\n", prg_parms->P_prime, prg_parms->start_size, prg_parms->end_size, prg_parms->N_PRG); +} diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index acd92e425d..eee22a455a 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -123,6 +123,17 @@ typedef struct { uint8_t N_RBG; }nr_rbg_parms_t; +typedef struct { + /// Size of first PRG + uint8_t start_size; + /// Nominal size + uint8_t P_prime; + /// Size of last PRG + uint8_t end_size; + /// Number of PRG + uint8_t N_PRG; +} nr_prg_parms_t; + typedef struct NR_BWP_PARMS { /// BWP ID uint8_t bwp_id; @@ -138,6 +149,8 @@ typedef struct NR_BWP_PARMS { uint8_t cyclic_prefix; /// RBG params nr_rbg_parms_t rbg_parms; + /// PRG params + nr_prg_parms_t prg_parms; } NR_BWP_PARMS; typedef struct { diff --git a/openair1/SCHED_NR/nr_ru_procedures.c b/openair1/SCHED_NR/nr_ru_procedures.c index 52b651fc25..e65f522ed3 100644 --- a/openair1/SCHED_NR/nr_ru_procedures.c +++ b/openair1/SCHED_NR/nr_ru_procedures.c @@ -100,9 +100,8 @@ void nr_feptx_ofdm_2thread(RU_t *ru) { // this copy should be done in the precoding thread (currently inactive) for (int aa=0;aanb_tx;aa++) - memcpy((void*)ru->common.txdataF_BF[aa], - (void*)&ru->gNB_list[0]->common_vars.txdataF[aa][subframe*fp->samples_per_subframe_wCP], - fp->samples_per_subframe_wCP*sizeof(int32_t)); + memcpy((void*)ru->common.txdataF_BF[aa], + (void*)ru->gNB_list[0]->common_vars.txdataF[aa],fp->samples_per_subframe_wCP*sizeof(int32_t)); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM , 1 ); diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 2ce9c7ef61..43e2d5c019 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -170,10 +170,8 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, if (do_meas==1) start_meas(&gNB->phy_proc_tx); // clear the transmit data array for the current subframe - for (aa=0; aarf_config.tx_antenna_ports.value; aa++) { - memset(&gNB->common_vars.txdataF[aa][subframe*fp->samples_per_subframe_wCP], - 0,fp->samples_per_subframe_wCP*sizeof(int32_t)); - } + for (aa=0; aarf_config.tx_antenna_ports.value; aa++) + memset(&gNB->common_vars.txdataF[aa],0,fp->samples_per_subframe_wCP*sizeof(int32_t)); if (nfapi_mode == 0 || nfapi_mode == 1) { nr_common_signal_procedures(gNB,frame, subframe); From 6a62072c98317a7bee73819e5925e8cd70d6fe9b Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Wed, 26 Sep 2018 11:45:06 +0200 Subject: [PATCH 026/117] nr ue update filler bits --- openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index 2632260ef5..9e732f63d1 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -188,7 +188,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, uint32_t ret,offset; int32_t no_iteration_ldpc; //short dummy_w[MAX_NUM_DLSCH_SEGMENTS][3*(8448+64)]; - uint32_t r,r_offset=0,Kr,Kr_bytes,err_flag=0; + uint32_t r,r_offset=0,Kr,Kr_bytes,K_bytes_F,err_flag=0; uint8_t crc_type; t_nrLDPC_dec_params decParams; t_nrLDPC_dec_params* p_decParams = &decParams; @@ -324,6 +324,8 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, Kr = harq_process->K; Kr_bytes = Kr>>3; + K_bytes_F = Kr_bytes-(harq_process->F>>3); + Tbslbrm = nr_compute_tbs(harq_process->mcs,nb_prb,frame_parms->symbols_per_slot,0,0, harq_process->Nl); for (r=0; rC; r++) { @@ -445,15 +447,16 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, } printf(" \n");*/ - memset(pv,0,harq_process->K*sizeof(int16_t)); + memset(pv,0,2*harq_process->Z*sizeof(int16_t)); //memset(pl,0,2*p_decParams->Z*sizeof(int8_t)); + memset((pv+K_bytes_F),127,harq_process->F*sizeof(int16_t)); - for (i=((2*p_decParams->Z)>>3), j = 0; i < (Kr_bytes-(harq_process->F>>3)); i++, j++) + for (i=((2*p_decParams->Z)>>3), j = 0; i < K_bytes_F; i++, j++) { pv[i]= _mm_loadu_si128((__m128i*)(&inv_d[8*j])); } - for (i=Kr_bytes, j = (Kr_bytes-(harq_process->F>>3)); i < ((kc*p_decParams->Z)>>3); i++, j++) + for (i=Kr_bytes, j = K_bytes_F; i < ((kc*p_decParams->Z)>>3); i++, j++) { pv[i]= _mm_loadu_si128((__m128i*)(&inv_d[8*j])); } From fc53139f669c52de6c2a107753eb1cf9cd9899be Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Thu, 27 Sep 2018 12:39:02 +0200 Subject: [PATCH 027/117] MOdulation order and code rate --- cmake_targets/CMakeLists.txt | 1 + openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 4 ++ openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c | 81 ++++++++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 71832b43fc..33f005e51a 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1294,6 +1294,7 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dci_tools.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dlsch.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dlsch_tools.c + ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_tbs_tools.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold.c ${OPENAIR1_DIR}/PHY/TOOLS/file_output.c ${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index 71ba0a189e..418af34b39 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -46,3 +46,7 @@ void nr_get_rbg_parms(NR_BWP_PARMS* bwp, uint8_t config_type); void nr_get_rbg_list(uint32_t bitmap, uint8_t n_rbg, uint8_t* rbg_list); void nr_get_PRG_parms(NR_BWP_PARMS* bwp, NR_gNB_DCI_ALLOC_t dci_alloc, uint8_t prb_bundling_type); + +uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx); + +uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx); diff --git a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c new file mode 100644 index 0000000000..84afa0d325 --- /dev/null +++ b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c @@ -0,0 +1,81 @@ +/* + * 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.0 (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_coding.c +* \brief Top-level routines for implementing LDPC-coded (DLSCH) transport channels from 38-212, 15.2 +* \author H.Wang +* \date 2018 +* \version 0.1 +* \company Eurecom +* \email: +* \note +* \warning +*/ + +#include "nr_dlsch.h" + +/// Target code rate tables indexed by Imcs +uint16_t nr_target_code_rate_table1[29] = {120, 157, 193, 251, 308, 379, 449, 526, 602, 679, 340, 378, 434, 490, 553, \ + 616, 658, 438, 466, 517, 567, 616, 666, 719, 772, 822, 873, 910, 948}; + // The -1 values correspond to non integer factors which are handled differently for indexes 20(682.5) and 26(916.5) +uint16_t nr_target_code_rate_table2[28] = {120, 193, 308, 449, 602, 378, 434, 490, 553, 616, 658, 466, 517, 567, \ + 616, 666, 719, 772, 822, 873, -1, 711, 754, 797, 841, 885, -1, 948}; +uint16_t nr_target_code_rate_table3[29] = {30, 40, 50, 64, 78, 99, 120, 157, 193, 251, 308, 379, 449, 526, 602, 340, \ + 378, 434, 490, 553, 616, 438, 466, 517, 567, 616, 666, 719, 772}; + + +uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx) { + switch(table_idx) { + case 1: + return (((Imcs<10)||(Imcs==29))?2:((Imcs<17)||(Imcs==30))?4:((Imcs<29)||(Imcs==31))?6:-1); + break; + + case 2: + return (((Imcs<5)||(Imcs==28))?2:((Imcs<11)||(Imcs==29))?4:((Imcs<20)||(Imcs==30))?6:((Imcs<28)||(Imcs==31))?8:-1); + break; + + case 3: + return (((Imcs<15)||(Imcs==29))?2:((Imcs<21)||(Imcs==30))?4:((Imcs<29)||(Imcs==31))?6:-1); + break; + + default: + AssertFatal(0, "Invalid MCS table index %d (expected in range [1,3])\n", table_idx); + } +} + +uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx) { + switch(table_idx) { + case 1: + return (nr_target_code_rate_table1[Imcs]<<10); + break; + + case 2: + return ((Imcs==20)?0xaaa00 : (Imcs==26)?0xe5200 : nr_target_code_rate_table3[Imcs]<<10); + break; + + case 3: + return (nr_target_code_rate_table3[Imcs]<<10); + break; + + default: + AssertFatal(0, "Invalid MCS table index %d (expected in range [1,3])\n", table_idx); + } +} From fae74fb8d4ec90c5c0eaf96a5a169fefbefcf2c8 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Tue, 2 Oct 2018 09:24:28 +0200 Subject: [PATCH 028/117] add dlsch llr computation --- cmake_targets/CMakeLists.txt | 1 + .../NR_UE_TRANSPORT/nr_dlsch_demodulation.c | 68 +- .../nr_dlsch_llr_computation.c | 8641 +++++++++++++++++ .../NR_UE_TRANSPORT/nr_transport_proto_ue.h | 45 +- 4 files changed, 8693 insertions(+), 62 deletions(-) create mode 100644 openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 33f005e51a..8ed49c2f0c 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1326,6 +1326,7 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_pbch.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c + ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/ ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_nr.c diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c index de155a86ed..2851b27906 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c @@ -114,7 +114,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, unsigned char aatx,aarx; - unsigned short nb_rb = 0, round; + unsigned short nb_rb = 0, nb_re =0, round; int avgs = 0;// rb; NR_DL_UE_HARQ_t *dlsch0_harq,*dlsch1_harq = 0; @@ -839,6 +839,9 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, //i_mod should have been passed as a parameter } + nb_re= (symbol==2)? (nb_rb*6):(nb_rb*12); + pdsch_vars[eNB_id]->llr_offset[symbol] = nb_re*dlsch0_harq->Qm * 2; + #if UE_TIMING_TRACE stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]); #if DISABLE_LOG_X @@ -879,29 +882,27 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, switch (dlsch0_harq->Qm) { case 2 : if ((rx_type==rx_standard) || (codeword_TB1 == -1)) { - dlsch_qpsk_llr(frame_parms, + nr_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,nr_tti_rx,symbol), beamforming_mode); } else if (codeword_TB0 == -1){ - dlsch_qpsk_llr(frame_parms, + nr_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,nr_tti_rx,symbol), beamforming_mode); } else if (rx_type >= rx_IC_single_stream) { if (dlsch1_harq->Qm == 2) { - dlsch_qpsk_qpsk_llr(frame_parms, + nr_dlsch_qpsk_qpsk_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, rxdataF_comp_ptr, pdsch_vars[eNB_id]->dl_ch_rho2_ext, @@ -910,7 +911,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr128); if (rx_type==rx_IC_dual_stream) { - dlsch_qpsk_qpsk_llr(frame_parms, + nr_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], @@ -921,7 +922,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, } } else if (dlsch1_harq->Qm == 4) { - dlsch_qpsk_16qam_llr(frame_parms, + nr_dlsch_qpsk_16qam_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, rxdataF_comp_ptr,//i dl_ch_mag_ptr,//i @@ -931,7 +932,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr128); if (rx_type==rx_IC_dual_stream) { - dlsch_16qam_qpsk_llr(frame_parms, + nr_dlsch_16qam_qpsk_llr(frame_parms, rxdataF_comp_ptr, pdsch_vars[eNB_id]->rxdataF_comp0,//i dl_ch_mag_ptr, @@ -943,7 +944,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, } } else { - dlsch_qpsk_64qam_llr(frame_parms, + nr_dlsch_qpsk_64qam_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, rxdataF_comp_ptr,//i dl_ch_mag_ptr,//i @@ -953,7 +954,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr128); if (rx_type==rx_IC_dual_stream) { - dlsch_64qam_qpsk_llr(frame_parms, + nr_dlsch_64qam_qpsk_llr(frame_parms, rxdataF_comp_ptr, pdsch_vars[eNB_id]->rxdataF_comp0,//i dl_ch_mag_ptr, @@ -968,27 +969,25 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, break; case 4 : if ((rx_type==rx_standard ) || (codeword_TB1 == -1)) { - dlsch_16qam_llr(frame_parms, + nr_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,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr128, beamforming_mode); } else if (codeword_TB0 == -1){ - dlsch_16qam_llr(frame_parms, + nr_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,nr_tti_rx,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, + nr_dlsch_16qam_qpsk_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, rxdataF_comp_ptr,//i pdsch_vars[eNB_id]->dl_ch_mag0, @@ -998,7 +997,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr128); if (rx_type==rx_IC_dual_stream) { - dlsch_qpsk_16qam_llr(frame_parms, + nr_dlsch_qpsk_16qam_llr(frame_parms, rxdataF_comp_ptr, pdsch_vars[eNB_id]->rxdataF_comp0,//i pdsch_vars[eNB_id]->dl_ch_mag0,//i @@ -1010,7 +1009,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, } } else if (dlsch1_harq->Qm == 4) { - dlsch_16qam_16qam_llr(frame_parms, + nr_dlsch_16qam_16qam_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, rxdataF_comp_ptr,//i pdsch_vars[eNB_id]->dl_ch_mag0, @@ -1021,7 +1020,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr128); if (rx_type==rx_IC_dual_stream) { - dlsch_16qam_16qam_llr(frame_parms, + nr_dlsch_16qam_16qam_llr(frame_parms, rxdataF_comp_ptr, pdsch_vars[eNB_id]->rxdataF_comp0,//i dl_ch_mag_ptr, @@ -1034,7 +1033,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, } } else { - dlsch_16qam_64qam_llr(frame_parms, + nr_dlsch_16qam_64qam_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, rxdataF_comp_ptr,//i pdsch_vars[eNB_id]->dl_ch_mag0, @@ -1045,7 +1044,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr128); if (rx_type==rx_IC_dual_stream) { - dlsch_64qam_16qam_llr(frame_parms, + nr_dlsch_64qam_16qam_llr(frame_parms, rxdataF_comp_ptr, pdsch_vars[eNB_id]->rxdataF_comp0, dl_ch_mag_ptr, @@ -1061,29 +1060,27 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, break; case 6 : if ((rx_type==rx_standard) || (codeword_TB1 == -1)) { - dlsch_64qam_llr(frame_parms, + nr_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,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr_offset[symbol], beamforming_mode); } else if (codeword_TB0 == -1){ - dlsch_64qam_llr(frame_parms, + nr_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,nr_tti_rx,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, + nr_dlsch_64qam_qpsk_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, rxdataF_comp_ptr,//i pdsch_vars[eNB_id]->dl_ch_mag0, @@ -1093,7 +1090,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr128); if (rx_type==rx_IC_dual_stream) { - dlsch_qpsk_64qam_llr(frame_parms, + nr_dlsch_qpsk_64qam_llr(frame_parms, rxdataF_comp_ptr, pdsch_vars[eNB_id]->rxdataF_comp0,//i pdsch_vars[eNB_id]->dl_ch_mag0, @@ -1105,7 +1102,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, } } else if (dlsch1_harq->Qm == 4) { - dlsch_64qam_16qam_llr(frame_parms, + nr_dlsch_64qam_16qam_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, rxdataF_comp_ptr,//i pdsch_vars[eNB_id]->dl_ch_mag0, @@ -1116,7 +1113,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr128); if (rx_type==rx_IC_dual_stream) { - dlsch_16qam_64qam_llr(frame_parms, + nr_dlsch_16qam_64qam_llr(frame_parms, rxdataF_comp_ptr, pdsch_vars[eNB_id]->rxdataF_comp0,//i dl_ch_mag_ptr, @@ -1129,7 +1126,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, } } else { - dlsch_64qam_64qam_llr(frame_parms, + nr_dlsch_64qam_64qam_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, rxdataF_comp_ptr,//i pdsch_vars[eNB_id]->dl_ch_mag0, @@ -1140,7 +1137,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr_offset[symbol]); if (rx_type==rx_IC_dual_stream) { - dlsch_64qam_64qam_llr(frame_parms, + nr_dlsch_64qam_64qam_llr(frame_parms, rxdataF_comp_ptr, pdsch_vars[eNB_id]->rxdataF_comp0,//i dl_ch_mag_ptr, @@ -1163,35 +1160,32 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, switch (get_Qm(dlsch1_harq->mcs)) { case 2 : if (rx_type==rx_standard) { - dlsch_qpsk_llr(frame_parms, + nr_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,nr_tti_rx,symbol), beamforming_mode); } break; case 4: if (rx_type==rx_standard) { - dlsch_16qam_llr(frame_parms, + nr_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,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr128, beamforming_mode); } break; case 6 : if (rx_type==rx_standard) { - dlsch_64qam_llr(frame_parms, + nr_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,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr_offset[symbol], beamforming_mode); } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c new file mode 100644 index 0000000000..9c8ad75d92 --- /dev/null +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c @@ -0,0 +1,8641 @@ +/* + * 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/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c + * \brief Top-level routines for LLR computation of the PDSCH physical channel + * \author H. WANG + * \date 2018 + * \version 0.1 + * \company Eurecom + * \email: + * \note + * \warning + */ + +#include "PHY/defs_nr_UE.h" +#include "PHY/phy_extern_nr_ue.h" +#include "nr_transport_proto_ue.h" +#include "PHY/TOOLS/tools_defs.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 nr_dlsch_qpsk_llr(NR_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, + uint8_t beamforming_mode) +{ + + uint32_t *rxF = (uint32_t*)&rxdataF_comp[0][((int32_t)symbol*nb_rb*12)]; + uint32_t *llr32; + int i,len; + + llr32 = (uint32_t*)dlsch_llr; + if (!llr32) { + LOG_E(PHY,"nr_dlsch_qpsk_llr: llr is null, symbol %d, llr32=%p\n",symbol, llr32); + return(-1); + } + + if (symbol ==2) //to update from config + len = nb_rb*6; + else + len = nb_rb*12; + /* + LOG_I(PHY,"dlsch_qpsk_llr: [symb %d / Length %d]: @LLR Buff %x, @LLR Buff(symb) %x \n", + symbol, + len, + dlsch_llr, + llr32); + */ + for (i=0; i>=2; // length in quad words (4 REs) + // printf("len>>=2=%d\n", len); + len+=(len_mod4==0 ? 0 : 1); + // printf("len+=%d\n", len); + for (i=0; iN_RB_DL*12)]; + 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 ==2) //to update from config + len = nb_rb*6; + else + len = nb_rb*12; + +// printf("nr_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,"nr_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,"nr_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("nr_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 nr_dlsch_qpsk_16qam_llr(NR_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,"nr_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 nr_dlsch_qpsk_64qam_llr(NR_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,"nr_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 nr_dlsch_16qam_qpsk_llr(NR_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,"nr_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 nr_dlsch_16qam_16qam_llr(NR_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,"nr_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 nr_dlsch_16qam_64qam_llr(NR_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,"nr_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 nr_dlsch_64qam_qpsk_llr(NR_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,"nr_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 nr_dlsch_64qam_16qam_llr(NR_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,"nr_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 nr_dlsch_64qam_64qam_llr(NR_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,"nr_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("nr_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,"nr_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/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h index 6048dff163..b16e5a97de 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h @@ -106,7 +106,7 @@ void qpsk_qpsk(int16_t *stream0_in, @param nb_rb number of RBs for this allocation @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS @param llr128p pointer to pointer to symbol in dlsch_llr*/ -int32_t dlsch_qpsk_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, +int32_t nr_dlsch_qpsk_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp, int32_t **rxdataF_comp_i, int32_t **rho_i, @@ -142,7 +142,7 @@ void qpsk_qam16(int16_t *stream0_in, @param nb_rb number of RBs for this allocation @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS @param llr128p pointer to pointer to symbol in dlsch_llr*/ -int32_t dlsch_qpsk_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, +int32_t nr_dlsch_qpsk_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp, int32_t **rxdataF_comp_i, int **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10}) @@ -154,6 +154,7 @@ int32_t dlsch_qpsk_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, uint16_t pbch_pss_sss_adj, int16_t **llr128p); + /** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream QPSK/64QAM reception. @param stream0_in Input from channel compensated (MR combined) stream 0 @param stream1_in Input from channel compensated (MR combined) stream 1 @@ -179,7 +180,7 @@ void qpsk_qam64(int16_t *stream0_in, @param nb_rb number of RBs for this allocation @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS @param llr128p pointer to pointer to symbol in dlsch_llr*/ -int32_t dlsch_qpsk_64qam_llr(NR_DL_FRAME_PARMS *frame_parms, +int32_t nr_dlsch_qpsk_64qam_llr(NR_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp, int32_t **rxdataF_comp_i, int **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10}) @@ -217,7 +218,7 @@ void qam16_qpsk(short *stream0_in, @param nb_rb number of RBs for this allocation @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS @param llr16p pointer to pointer to symbol in dlsch_llr*/ -int dlsch_16qam_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, +int nr_dlsch_16qam_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, int **rxdataF_comp, int **rxdataF_comp_i, int **dl_ch_mag, //|h_0|^2*(2/sqrt{10}) @@ -258,7 +259,7 @@ void qam16_qam16(short *stream0_in, @param nb_rb number of RBs for this allocation @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS @param llr16p pointer to pointer to symbol in dlsch_llr*/ -int dlsch_16qam_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, +int nr_dlsch_16qam_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, int **rxdataF_comp, int **rxdataF_comp_i, int **dl_ch_mag, //|h_0|^2*(2/sqrt{10}) @@ -300,7 +301,7 @@ void qam16_qam64(short *stream0_in, @param nb_rb number of RBs for this allocation @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS @param llr16p pointer to pointer to symbol in dlsch_llr*/ -int dlsch_16qam_64qam_llr(NR_DL_FRAME_PARMS *frame_parms, +int nr_dlsch_16qam_64qam_llr(NR_DL_FRAME_PARMS *frame_parms, int **rxdataF_comp, int **rxdataF_comp_i, int **dl_ch_mag, //|h_0|^2*(2/sqrt{10}) @@ -480,15 +481,13 @@ int dlsch_64qam_64qam_llr(NR_DL_FRAME_PARMS *frame_parms, @param llr128p pointer to pointer to symbol in dlsch_llr @param beamforming_mode beamforming mode */ -int32_t dlsch_qpsk_llr(NR_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_adj, - //int16_t **llr128p, - uint8_t beamforming_mode); +int32_t nr_dlsch_qpsk_llr(NR_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, + uint8_t beamforming_mode); /** \brief This function generates log-likelihood ratios (decoder input) for single-stream 16QAM received waveforms @@ -504,7 +503,7 @@ int32_t dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, @param beamforming_mode beamforming mode */ -int32_t dlsch_qpsk_llr_SIC(NR_DL_FRAME_PARMS *frame_parms, +int32_t nr_dlsch_qpsk_llr_SIC(NR_DL_FRAME_PARMS *frame_parms, int **rxdataF_comp, int32_t **sic_buffer, int **rho_i, @@ -515,15 +514,14 @@ int32_t dlsch_qpsk_llr_SIC(NR_DL_FRAME_PARMS *frame_parms, uint16_t mod_order_0, uint32_t rb_alloc); -void dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, +void nr_dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp, int16_t *dlsch_llr, int32_t **dl_ch_mag, uint8_t symbol, uint8_t first_symbol_flag, uint16_t nb_rb, - uint16_t pbch_pss_sss_adjust, - int16_t **llr128p, + int16_t **llr32p, uint8_t beamforming_mode); /** \brief This function generates log-likelihood ratios (decoder input) for single-stream 16QAM received waveforms @@ -538,7 +536,7 @@ void dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, @param pbch_pss_sss_adjust PBCH/PSS/SSS RE adjustment (in REs) @param beamforming_mode beamforming mode */ -void dlsch_16qam_llr_SIC (NR_DL_FRAME_PARMS *frame_parms, +void nr_dlsch_16qam_llr_SIC (NR_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp, int32_t **sic_buffer, //Q15 int32_t **rho_i, @@ -563,8 +561,7 @@ void dlsch_64qam_llr_SIC(NR_DL_FRAME_PARMS *frame_parms, uint16_t mod_order_0, uint32_t rb_alloc); - -void dlsch_64qam_llr(NR_DL_FRAME_PARMS *frame_parms, +void nr_dlsch_64qam_llr(NR_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp, int16_t *dlsch_llr, int32_t **dl_ch_mag, @@ -572,8 +569,6 @@ void dlsch_64qam_llr(NR_DL_FRAME_PARMS *frame_parms, uint8_t symbol, uint8_t first_symbol_flag, uint16_t nb_rb, - uint16_t pbch_pss_sss_adjust, - //int16_t **llr_save, uint32_t llr_offset, uint8_t beamforming_mode); @@ -1044,7 +1039,7 @@ int32_t nr_rx_pdsch(PHY_VARS_NR_UE *phy_vars_ue, uint8_t i_mod, uint8_t harq_pid); -int32_t rx_pdcch(PHY_VARS_NR_UE *ue, +int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue, uint32_t frame, uint8_t subframe, uint8_t eNB_id, From eba2c60c7f6bf2d7c9b58b62ed63508f974afdee Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Wed, 3 Oct 2018 02:19:08 -0700 Subject: [PATCH 029/117] fixing merge --- openair1/PHY/CODING/TESTBENCH/polartest.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openair1/PHY/CODING/TESTBENCH/polartest.c b/openair1/PHY/CODING/TESTBENCH/polartest.c index 46914225c4..e7423b533e 100644 --- a/openair1/PHY/CODING/TESTBENCH/polartest.c +++ b/openair1/PHY/CODING/TESTBENCH/polartest.c @@ -118,9 +118,9 @@ int main(int argc, char *argv[]) { } 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); - uint32_t testInput[4], encoderOutput[4]; + uint8_t *testInput = malloc(sizeof(uint8_t) * testLength); //generate randomly + uint8_t *encoderOutput = malloc(sizeof(uint8_t) * coderLength); + //uint32_t testInput[4], encoderOutput[4]; memset(testInput,0,sizeof(testInput)); memset(encoderOutput,0,sizeof(encoderOutput)); From fac57fd7d7af14299eb1aa97c4586573e65437dc Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Thu, 4 Oct 2018 09:33:45 +0200 Subject: [PATCH 030/117] update dlsch coding and decoding --- cmake_targets/CMakeLists.txt | 2 + openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 5 +++ openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 41 +++++++++++-------- openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c | 6 +++ .../PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 18 +++++--- 5 files changed, 50 insertions(+), 22 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 8ed49c2f0c..e7dd97d132 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1294,6 +1294,7 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dci_tools.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dlsch.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dlsch_tools.c + ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dlsch_coding.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_tbs_tools.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold.c ${OPENAIR1_DIR}/PHY/TOOLS/file_output.c @@ -1327,6 +1328,7 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c + ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_tbs_tools.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/ ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_nr.c diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index 418af34b39..7bd89d6171 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -50,3 +50,8 @@ void nr_get_PRG_parms(NR_BWP_PARMS* bwp, NR_gNB_DCI_ALLOC_t dci_alloc, uint8_t p uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx); uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx); + +/** \brief Computes available bits G. + @param nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs */ +uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs); + diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index 819b3af823..b2dfe2403d 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -37,6 +37,7 @@ #include "PHY/CODING/lte_interleaver_inline.h" #include "PHY/NR_TRANSPORT/nr_transport.h" #include "PHY/NR_TRANSPORT/nr_transport_common_proto.h" +#include "PHY/NR_TRANSPORT/nr_dlsch.h" #include "SCHED_NR/sched_nr.h" #include "defs.h" #include "UTIL/LOG/vcd_signal_dumper.h" @@ -85,11 +86,11 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t *dlsch) #endif if (dlsch->harq_processes[i]->c[r]) { - free16(dlsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+1056); + free16(dlsch->harq_processes[i]->c[r],1056); dlsch->harq_processes[i]->c[r] = NULL; } if (dlsch->harq_processes[i]->d[r]) { - free16(dlsch->harq_processes[i]->d[r],(96+12+3+(3*8448))); + free16(dlsch->harq_processes[i]->d[r],3*8448); dlsch->harq_processes[i]->d[r] = NULL; } @@ -109,7 +110,7 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_t { NR_gNB_DLSCH_t *dlsch; - unsigned char exit_flag = 0,i,j,r,aa,layer; + unsigned char exit_flag = 0,i,r,aa,layer; int re; unsigned char bw_scaling =1; @@ -229,7 +230,7 @@ void clean_gNB_dlsch(NR_gNB_DLSCH_t *dlsch) for (i=0; iharq_processes[i]) { // dlsch->harq_processes[i]->Ndi = 0; - dlsch->harq_processes[i]->status = 0; + //dlsch->harq_processes[i]->status = 0; dlsch->harq_processes[i]->round = 0; for (j=0; j<96; j++) @@ -242,7 +243,7 @@ void clean_gNB_dlsch(NR_gNB_DLSCH_t *dlsch) } } -int dlsch_encoding(PHY_VARS_gNB *gNB, +int nr_dlsch_encoding(PHY_VARS_gNB *gNB, unsigned char *a, uint8_t num_pdcch_symbols, NR_gNB_DLSCH_t *dlsch, @@ -255,31 +256,39 @@ int dlsch_encoding(PHY_VARS_gNB *gNB, unsigned int G; unsigned int crc=1; - unsigned short iind; NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms; - unsigned char harq_pid = dlsch->current_harq_pid; + unsigned char harq_pid = dlsch->harq_ids[subframe]; unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb; unsigned int A, Z; unsigned *pz = &Z; unsigned char mod_order; - unsigned int Kr=0,Kr_bytes,r,r_offset=0,Kr_int=0; - unsigned short m=dlsch->harq_processes[harq_pid]->mcs; - uint8_t beamforming_mode=0; + unsigned int Kr=0,r,r_offset=0;//Kr_bytes + //unsigned short m=dlsch->harq_processes[harq_pid]->mcs; + //uint8_t beamforming_mode=0; uint8_t *d_tmp[MAX_NUM_DLSCH_SEGMENTS]; - double rate = 0.33; - uint8_t kb,BG; + //double rate = 0.33; + uint8_t kb,BG=1; uint32_t E; uint8_t Ilbrm = 0; - uint32_t Tbslbrm = 950984; //to compute tbs + uint32_t Tbslbrm = 950984; //max tbs + uint16_t nb_symb_sch =2; + uint8_t nb_re_dmrs = 6; + uint16_t length_dmrs = 1; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN); + dlsch->harq_processes[harq_pid]->TBS= nr_compute_tbs(dlsch->harq_processes[harq_pid]->mcs, + nb_rb,nb_symb_sch,nb_re_dmrs,length_dmrs, + dlsch->harq_processes[harq_pid]->Nl); + A = dlsch->harq_processes[harq_pid]->TBS; //printf("Encoder: A: %d frame.subframe %d.%d \n",A, frame,subframe); mod_order = get_nr_Qm(dlsch->harq_processes[harq_pid]->mcs); - G = get_G(frame_parms,nb_rb,dlsch->harq_processes[harq_pid]->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe,beamforming_mode); + G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs); + + Tbslbrm = nr_compute_tbs(28,nb_rb,frame_parms->symbols_per_slot,0,0, dlsch->harq_processes[harq_pid]->Nl); // if (dlsch->harq_processes[harq_pid]->Ndi == 1) { // this is a new packet if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet @@ -324,7 +333,7 @@ int dlsch_encoding(PHY_VARS_gNB *gNB, //printf("Encoder: B %d F %d \n",dlsch->harq_processes[harq_pid]->B, dlsch->harq_processes[harq_pid]->F); Kr = dlsch->harq_processes[harq_pid]->K; - Kr_bytes = Kr>>3; + //Kr_bytes = Kr>>3; start_meas(te_stats); for (r=0; rharq_processes[harq_pid]->C; r++) { @@ -394,7 +403,7 @@ int dlsch_encoding(PHY_VARS_gNB *gNB, start_meas(i_stats); nr_interleaving_ldpc(E, - &dlsch->harq_processes[harq_pid]->Qm, + dlsch->harq_processes[harq_pid]->Qm, dlsch->harq_processes[harq_pid]->e+r_offset, dlsch->harq_processes[harq_pid]->f+r_offset); stop_meas(i_stats); diff --git a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c index 84afa0d325..6c6c44ff35 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c @@ -79,3 +79,9 @@ uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx) { AssertFatal(0, "Invalid MCS table index %d (expected in range [1,3])\n", table_idx); } } + +uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs) { + uint32_t G; + G = ((12*nb_symb_sch)-(nb_re_dmrs*length_dmrs))*nb_rb; + return(G); +} diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index 9e732f63d1..924e207009 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -35,6 +35,7 @@ #include "PHY/CODING/coding_extern.h" #include "PHY/CODING/coding_defs.h" #include "PHY/NR_TRANSPORT/nr_transport_common_proto.h" +#include "PHY/NR_TRANSPORT/nr_dlsch.h" //#include "SCHED/extern.h" #include "SIMULATION/TOOLS/sim.h" #include "targets/RT/USER/nr-uesoftmodem.h" @@ -65,13 +66,13 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t *dlsch) } for (r=0; rharq_processes[i]->c[r],((r==0)?8:0) + 3+1056); + free16(dlsch->harq_processes[i]->c[r],1056); dlsch->harq_processes[i]->c[r] = NULL; } for (r=0; rharq_processes[i]->d[r]) { - free16(dlsch->harq_processes[i]->d[r],((3*8*8448)+12+96)*sizeof(short)); + free16(dlsch->harq_processes[i]->d[r],(3*8448)*sizeof(short)); dlsch->harq_processes[i]->d[r] = NULL; } @@ -201,8 +202,11 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, // int16_t *p_invd =&inv_d; uint8_t kb, kc; uint8_t Ilbrm = 0; - uint32_t Tbslbrm = 950984; //to compute tbs - uint16_t nb_prb = 106; //to update + uint32_t Tbslbrm = 950984; + uint16_t nb_rb = 106; //to update + uint16_t nb_symb_sch = 2; + uint8_t nb_re_dmrs = 6; + uint16_t length_dmrs = 1; uint32_t i,j; // uint32_t k; @@ -252,10 +256,12 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, harq_process->trials[harq_process->round]++; + harq_process->TBS = nr_compute_tbs(harq_process->mcs,nb_rb,nb_symb_sch,nb_re_dmrs,length_dmrs, harq_process->Nl); + A = harq_process->TBS; ret = dlsch->max_ldpc_iterations; - + harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs); G = harq_process->G; //get_G(frame_parms,nb_rb,dlsch->rb_alloc,mod_order,num_pdcch_symbols,phy_vars_ue->frame,subframe); @@ -326,7 +332,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, K_bytes_F = Kr_bytes-(harq_process->F>>3); - Tbslbrm = nr_compute_tbs(harq_process->mcs,nb_prb,frame_parms->symbols_per_slot,0,0, harq_process->Nl); + Tbslbrm = nr_compute_tbs(28,nb_rb,frame_parms->symbols_per_slot,0,0, harq_process->Nl); for (r=0; rC; r++) { From 6fc37985b95e469fb855aab65854ddd089da2b42 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Thu, 4 Oct 2018 09:55:55 +0200 Subject: [PATCH 031/117] update dlsch available bits --- openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 2 +- openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 2 +- openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c | 4 ++-- openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index 7bd89d6171..bba325ff08 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -53,5 +53,5 @@ uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx); /** \brief Computes available bits G. @param nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs */ -uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs); +uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs,uint8_t Qm); diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index b2dfe2403d..ab075edddc 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -286,7 +286,7 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB, //printf("Encoder: A: %d frame.subframe %d.%d \n",A, frame,subframe); mod_order = get_nr_Qm(dlsch->harq_processes[harq_pid]->mcs); - G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs); + G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs,mod_order); Tbslbrm = nr_compute_tbs(28,nb_rb,frame_parms->symbols_per_slot,0,0, dlsch->harq_processes[harq_pid]->Nl); diff --git a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c index 6c6c44ff35..14b06d56ce 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c @@ -80,8 +80,8 @@ uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx) { } } -uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs) { +uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs, uint8_t Qm) { uint32_t G; - G = ((12*nb_symb_sch)-(nb_re_dmrs*length_dmrs))*nb_rb; + G = ((12*nb_symb_sch)-(nb_re_dmrs*length_dmrs))*nb_rb*Qm; return(G); } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index 924e207009..e1906011a9 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -261,7 +261,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, A = harq_process->TBS; ret = dlsch->max_ldpc_iterations; - harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs); + harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, harq_process->Qm); G = harq_process->G; //get_G(frame_parms,nb_rb,dlsch->rb_alloc,mod_order,num_pdcch_symbols,phy_vars_ue->frame,subframe); From bc5cb28d03c6eed5ed405d1dbf5de2cef5b13513 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Fri, 5 Oct 2018 05:11:04 -0700 Subject: [PATCH 032/117] fixing nr_mod_table --- openair1/PHY/NR_REFSIG/nr_dmrs_rx.c | 1 - openair1/PHY/NR_REFSIG/nr_gen_mod_table.m | 6 +++--- openair1/PHY/NR_REFSIG/nr_mod_table.h | 6 ++++++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c index 597a47bf5a..2ee6614c5e 100644 --- a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c +++ b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c @@ -41,7 +41,6 @@ #include "refsig_defs_ue.h" #include "PHY/defs_nr_UE.h" -#include "nr_mod_table.h" #include "log.h" /*Table 7.4.1.1.2-1/2 from 38.211 */ diff --git a/openair1/PHY/NR_REFSIG/nr_gen_mod_table.m b/openair1/PHY/NR_REFSIG/nr_gen_mod_table.m index 60cf6d34e8..f873e08f8b 100644 --- a/openair1/PHY/NR_REFSIG/nr_gen_mod_table.m +++ b/openair1/PHY/NR_REFSIG/nr_gen_mod_table.m @@ -125,7 +125,7 @@ end end table = [ 0; bpsk_table(:); qpsk_table(:);qam16_table2(:); qam64_table2(:);qam256_table2(:) ]; -scatter (real(qam256_table2), imag(qam256_table2), 'x'); +%scatter (real(qam256_table2), imag(qam256_table2), 'x'); save mod_table.mat table table2 = zeros(1,length(table)*2); @@ -139,7 +139,7 @@ fprintf(fd,"#define NR_MOD_TABLE_QPSK_OFFSET %d\n", 3); fprintf(fd,"#define NR_MOD_TABLE_QAM16_OFFSET %d\n", 7); fprintf(fd,"#define NR_MOD_TABLE_QAM64_OFFSET %d\n", 23); fprintf(fd,"#define NR_MOD_TABLE_QAM256_OFFSET %d\n", 87); -fprintf(fd,"short nr_mod_table[MOD_TABLE_SIZE_SHORT] = {"); +fprintf(fd,"short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT] = {"); fprintf(fd,"%d,",table2(1:end-1)); fprintf(fd,"%d};\n",table2(end)); -fclose(fd); \ No newline at end of file +fclose(fd); diff --git a/openair1/PHY/NR_REFSIG/nr_mod_table.h b/openair1/PHY/NR_REFSIG/nr_mod_table.h index 97abc5844c..3f3117c0f8 100644 --- a/openair1/PHY/NR_REFSIG/nr_mod_table.h +++ b/openair1/PHY/NR_REFSIG/nr_mod_table.h @@ -1 +1,7 @@ +#define NR_MOD_TABLE_SIZE_SHORT 686 +#define NR_MOD_TABLE_BPSK_OFFSET 1 +#define NR_MOD_TABLE_QPSK_OFFSET 3 +#define NR_MOD_TABLE_QAM16_OFFSET 7 +#define NR_MOD_TABLE_QAM64_OFFSET 23 +#define NR_MOD_TABLE_QAM256_OFFSET 87 short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT] = {0,0,23170,23170,-23170,-23170,23170,23170,23170,-23170,-23170,23170,-23170,-23170,10362,10362,10362,31086,31086,10362,31086,31086,10362,-10362,10362,-31086,31086,-10362,31086,-31086,-10362,10362,-10362,31086,-31086,10362,-31086,31086,-10362,-10362,-10362,-31086,-31086,-10362,-31086,-31086,15169,15169,15169,5057,5057,15169,5057,5057,15169,25281,15169,35393,5057,25281,5057,35393,25281,15169,25281,5057,35393,15169,35393,5057,25281,25281,25281,35393,35393,25281,35393,35393,15169,-15169,15169,-5057,5057,-15169,5057,-5057,15169,-25281,15169,-35393,5057,-25281,5057,-35393,25281,-15169,25281,-5057,35393,-15169,35393,-5057,25281,-25281,25281,-35393,35393,-25281,35393,-35393,-15169,15169,-15169,5057,-5057,15169,-5057,5057,-15169,25281,-15169,35393,-5057,25281,-5057,35393,-25281,15169,-25281,5057,-35393,15169,-35393,5057,-25281,25281,-25281,35393,-35393,25281,-35393,35393,-15169,-15169,-15169,-5057,-5057,-15169,-5057,-5057,-15169,-25281,-15169,-35393,-5057,-25281,-5057,-35393,-25281,-15169,-25281,-5057,-35393,-15169,-35393,-5057,-25281,-25281,-25281,-35393,-35393,-25281,-35393,-35393,12566,12566,12566,17592,17592,12566,17592,17592,12566,7540,12566,2514,17592,7540,17592,2514,7540,12566,7540,17592,2514,12566,2514,17592,7540,7540,7540,2514,2514,7540,2514,2514,12566,27644,12566,22618,17592,27644,17592,22618,12566,32670,12566,37696,17592,32670,17592,37696,7540,27644,7540,22618,2514,27644,2514,22618,7540,32670,7540,37696,2514,32670,2514,37696,27644,12566,27644,17592,22618,12566,22618,17592,27644,7540,27644,2514,22618,7540,22618,2514,32670,12566,32670,17592,37696,12566,37696,17592,32670,7540,32670,2514,37696,7540,37696,2514,27644,27644,27644,22618,22618,27644,22618,22618,27644,32670,27644,37696,22618,32670,22618,37696,32670,27644,32670,22618,37696,27644,37696,22618,32670,32670,32670,37696,37696,32670,37696,37696,12566,-12566,12566,-17592,17592,-12566,17592,-17592,12566,-7540,12566,-2514,17592,-7540,17592,-2514,7540,-12566,7540,-17592,2514,-12566,2514,-17592,7540,-7540,7540,-2514,2514,-7540,2514,-2514,12566,-27644,12566,-22618,17592,-27644,17592,-22618,12566,-32670,12566,-37696,17592,-32670,17592,-37696,7540,-27644,7540,-22618,2514,-27644,2514,-22618,7540,-32670,7540,-37696,2514,-32670,2514,-37696,27644,-12566,27644,-17592,22618,-12566,22618,-17592,27644,-7540,27644,-2514,22618,-7540,22618,-2514,32670,-12566,32670,-17592,37696,-12566,37696,-17592,32670,-7540,32670,-2514,37696,-7540,37696,-2514,27644,-27644,27644,-22618,22618,-27644,22618,-22618,27644,-32670,27644,-37696,22618,-32670,22618,-37696,32670,-27644,32670,-22618,37696,-27644,37696,-22618,32670,-32670,32670,-37696,37696,-32670,37696,-37696,-12566,12566,-12566,17592,-17592,12566,-17592,17592,-12566,7540,-12566,2514,-17592,7540,-17592,2514,-7540,12566,-7540,17592,-2514,12566,-2514,17592,-7540,7540,-7540,2514,-2514,7540,-2514,2514,-12566,27644,-12566,22618,-17592,27644,-17592,22618,-12566,32670,-12566,37696,-17592,32670,-17592,37696,-7540,27644,-7540,22618,-2514,27644,-2514,22618,-7540,32670,-7540,37696,-2514,32670,-2514,37696,-27644,12566,-27644,17592,-22618,12566,-22618,17592,-27644,7540,-27644,2514,-22618,7540,-22618,2514,-32670,12566,-32670,17592,-37696,12566,-37696,17592,-32670,7540,-32670,2514,-37696,7540,-37696,2514,-27644,27644,-27644,22618,-22618,27644,-22618,22618,-27644,32670,-27644,37696,-22618,32670,-22618,37696,-32670,27644,-32670,22618,-37696,27644,-37696,22618,-32670,32670,-32670,37696,-37696,32670,-37696,37696,-12566,-12566,-12566,-17592,-17592,-12566,-17592,-17592,-12566,-7540,-12566,-2514,-17592,-7540,-17592,-2514,-7540,-12566,-7540,-17592,-2514,-12566,-2514,-17592,-7540,-7540,-7540,-2514,-2514,-7540,-2514,-2514,-12566,-27644,-12566,-22618,-17592,-27644,-17592,-22618,-12566,-32670,-12566,-37696,-17592,-32670,-17592,-37696,-7540,-27644,-7540,-22618,-2514,-27644,-2514,-22618,-7540,-32670,-7540,-37696,-2514,-32670,-2514,-37696,-27644,-12566,-27644,-17592,-22618,-12566,-22618,-17592,-27644,-7540,-27644,-2514,-22618,-7540,-22618,-2514,-32670,-12566,-32670,-17592,-37696,-12566,-37696,-17592,-32670,-7540,-32670,-2514,-37696,-7540,-37696,-2514,-27644,-27644,-27644,-22618,-22618,-27644,-22618,-22618,-27644,-32670,-27644,-37696,-22618,-32670,-22618,-37696,-32670,-27644,-32670,-22618,-37696,-27644,-37696,-22618,-32670,-32670,-32670,-37696,-37696,-32670,-37696,-37696}; From 64ae2d5de7bfe721b47b3a8749a228f6ec012220 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Wed, 10 Oct 2018 09:12:06 +0200 Subject: [PATCH 033/117] update pdsch dmrs --- openair1/PHY/NR_REFSIG/nr_dmrs_rx.c | 132 +++++------------------- openair1/PHY/NR_REFSIG/nr_gold_ue.c | 2 +- openair1/PHY/NR_REFSIG/refsig_defs_ue.h | 9 +- 3 files changed, 31 insertions(+), 112 deletions(-) diff --git a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c index 2ee6614c5e..435598c9d2 100644 --- a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c +++ b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c @@ -30,7 +30,6 @@ * \warning */ -//#define DEBUG_DL_DMRS //#define NR_PBCH_DMRS_LENGTH_DWORD 5 //#define NR_PBCH_DMRS_LENGTH 144 @@ -50,101 +49,27 @@ int wf2[12][2] = {{1,1},{1,-1},{1,1},{1,-1},{1,1},{1,-1},{1,1},{1,1},{1,1},{1,-1 int wt2[12][2] = {{1,1},{1,1},{1,1},{1,1},{1,1},{1,1},{1,-1},{1,-1},{1,-1},{1,-1},{1,-1},{1,-1}}; -short nr_rx_mod_table[14] = {0,0,23170,-23170,-23170,23170,23170,-23170,23170,23170,-23170,-23170,-23170,23170}; +short nr_rx_mod_table[14] = {0,0,23170,-23170,-23170,23170,23170,-23170,23170,23170,-23170,-23170,-23170,23170}; +short nr_rx_nmod_table[14] = {0,0,-23170,23170,23170,-23170,-23170,23170,-23170,-23170,23170,23170,23170,-23170}; -/*int nr_pdcch_dmrs_rx(PHY_VARS_NR_UE *ue, - uint8_t eNB_offset, - unsigned int Ns, - unsigned int nr_gold_pdcch[7][20][3][10], - int32_t *output, - unsigned short p, - int length_dmrs, - unsigned short nb_rb_coreset) -{ - int32_t qpsk[4],n; - int w,ind,l,ind_dword,ind_qpsk_symb,kp,k; - short pamp; - pamp = ONE_OVER_SQRT2_Q15; - - // This includes complex conjugate for channel estimation - ((short *)&qpsk[0])[0] = pamp; - ((short *)&qpsk[0])[1] = -pamp; - ((short *)&qpsk[1])[0] = -pamp; - ((short *)&qpsk[1])[1] = -pamp; - ((short *)&qpsk[2])[0] = pamp; - ((short *)&qpsk[2])[1] = pamp; - ((short *)&qpsk[3])[0] = -pamp; - ((short *)&qpsk[3])[1] = pamp; - - if (p==2000) { - for (n=0; n>4; - ind_qpsk_symb = ind&0xf; - - output[k] = qpsk[(nr_gold_pdcch[eNB_offset][Ns][l][ind_dword]>>(2*ind_qpsk_symb))&3]; - -#ifdef DEBUG_DL_DMRS - LOG_I(PHY,"Ns %d, p %d, ind_dword %d, ind_qpsk_symbol %d\n", - Ns,p,idx_dword,idx_qpsk_symb); - LOG_I(PHY,"index = %d\n",(nr_gold_pdsch[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); -#endif - - k++; - } - } - } - } else { - LOG_E(PHY,"Illegal PDCCH DMRS port %d\n",p); - } - - return(0); -}*/ int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue, - uint8_t eNB_offset, unsigned int Ns, - unsigned int nr_gold_pdsch[2][20][2][21], + unsigned int *nr_gold_pdsch, int32_t *output, - unsigned short p, - int length_dmrs, - unsigned short nb_rb_pdsch) + unsigned char p, + unsigned char lp, + unsigned short nb_pdsch_rb) { - int32_t qpsk[4],nqpsk[4],*qpsk_p, n; - int w,mprime,ind,l,ind_dword,ind_qpsk_symb,kp,lp, config_type, k; - short pamp; + int8_t w,config_type; + short *mod_table; + unsigned char idx=0; typedef int array_of_w[2]; array_of_w *wf; array_of_w *wt; - config_type = 1; - printf("dmrs config type %d port %d\n", config_type, p); - - // Compute the correct pilot amplitude, sqrt_rho_b = Q3.13 - pamp = ONE_OVER_SQRT2_Q15; - - // This includes complex conjugate for channel estimation - ((short *)&qpsk[0])[0] = pamp; - ((short *)&qpsk[0])[1] = -pamp; - ((short *)&qpsk[1])[0] = -pamp; - ((short *)&qpsk[1])[1] = -pamp; - ((short *)&qpsk[2])[0] = pamp; - ((short *)&qpsk[2])[1] = pamp; - ((short *)&qpsk[3])[0] = -pamp; - ((short *)&qpsk[3])[1] = pamp; - - ((short *)&nqpsk[0])[0] = -pamp; - ((short *)&nqpsk[0])[1] = pamp; - ((short *)&nqpsk[1])[0] = pamp; - ((short *)&nqpsk[1])[1] = pamp; - ((short *)&nqpsk[2])[0] = -pamp; - ((short *)&nqpsk[2])[1] = -pamp; - ((short *)&nqpsk[3])[0] = pamp; - ((short *)&nqpsk[3])[1] = -pamp; + config_type = 0; //to be updated by higher layer wf = (config_type==0) ? wf1 : wf2; wt = (config_type==0) ? wt1 : wt2; @@ -153,31 +78,26 @@ int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue, LOG_E(PHY,"Bad PDSCH DMRS config type %d\n", config_type); if ((p>=1000) && (p<((config_type==0) ? 1008 : 1012))) { + if (ue->frame_parms.Ncp == NORMAL) { - // r_n from 38.211 7.4.1.1 - for (n=0; n>4; - ind_qpsk_symb = ind&0xf; + w = (wf[p-1000][i&1])*(wt[p-1000][lp]); + mod_table = (w==1) ? nr_rx_mod_table : nr_rx_nmod_table; - output[k] = qpsk_p[(nr_gold_pdsch[0][Ns][lp][ind_dword]>>(2*ind_qpsk_symb))&3]; - - -#ifdef DEBUG_DL_DMRS - LOG_I(PHY,"Ns %d, p %d, ind_dword %d, ind_qpsk_symbol %d\n", - Ns,p,idx_dword,idx_qpsk_symb); - LOG_I(PHY,"index = %d\n",(nr_gold_pdsch[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); + idx = ((((nr_gold_pdsch[(i<<1)>>5])>>((i<<1)&0x1f))&1)<<1) ^ (((nr_gold_pdsch[((i<<1)+1)>>5])>>(((i<<1)+1)&0x1f))&1); + ((int16_t*)output)[i<<1] = mod_table[(NR_MOD_TABLE_QPSK_OFFSET + idx)<<1]; + ((int16_t*)output)[(i<<1)+1] = mod_table[((NR_MOD_TABLE_QPSK_OFFSET + idx)<<1) + 1]; +#ifdef DEBUG_PDSCH + printf("nr_pdsch_dmrs_rx dmrs config type %d port %d nb_pdsch_rb %d\n", config_type, p, nb_pdsch_rb); + printf("wf[%d] = %d wt[%d]= %d\n", i&1, wf[p-1000][i&1], lp, wt[p-1000][lp]); + printf("i %d idx %d pdsch gold %u b0-b1 %d-%d mod_dmrs %d %d\n", i, idx, nr_gold_pdsch[(i<<1)>>5], (((nr_gold_pdsch[(i<<1)>>5])>>((i<<1)&0x1f))&1), + (((nr_gold_pdsch[((i<<1)+1)>>5])>>(((i<<1)+1)&0x1f))&1), ((int16_t*)output)[i<<1], ((int16_t*)output)[(i<<1)+1]); #endif - - k++; - } - } - } + } + } else { + LOG_E(PHY,"extended cp not supported for PDSCH DMRS yet\n"); + } } else { LOG_E(PHY,"Illegal p %d PDSCH DMRS port\n",p); } diff --git a/openair1/PHY/NR_REFSIG/nr_gold_ue.c b/openair1/PHY/NR_REFSIG/nr_gold_ue.c index 59e14a1e76..c856d43df3 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold_ue.c +++ b/openair1/PHY/NR_REFSIG/nr_gold_ue.c @@ -143,7 +143,7 @@ void nr_gold_pdsch(PHY_VARS_NR_UE* ue,unsigned short lbar,unsigned short *n_idDM //printf("x1 : %x, x2 : %x\n",x1,x2); } - for (n=0; n<14; n++) { + for (n=0; n<52; n++) { x1 = (x1>>1) ^ (x1>>4); x1 = x1 ^ (x1<<31) ^ (x1<<28); x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4); diff --git a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h index 0da7bb154f..d54f69b87e 100644 --- a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h +++ b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h @@ -43,13 +43,12 @@ int nr_pdcch_dmrs_rx(PHY_VARS_NR_UE *ue, unsigned short nb_rb_corset); int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue, - uint8_t eNB_offset, unsigned int Ns, - unsigned int nr_gold_pdsch[2][20][2][21], + unsigned int *nr_gold_pdsch, int32_t *output, - unsigned short p, - int length_dmrs, - unsigned short nb_rb_pdsch); + unsigned char p, + unsigned char lp, + unsigned short nb_pdsch_rb); void nr_gold_pbch(PHY_VARS_NR_UE* ue); From c5e94d9bc3135f4566bfe5d7c7a78cbaa387068a Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Wed, 10 Oct 2018 03:16:24 -0700 Subject: [PATCH 034/117] small fix after merge --- openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index ab075edddc..d9a424121d 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -40,8 +40,8 @@ #include "PHY/NR_TRANSPORT/nr_dlsch.h" #include "SCHED_NR/sched_nr.h" #include "defs.h" -#include "UTIL/LOG/vcd_signal_dumper.h" -#include "UTIL/LOG/log.h" +#include "common/utils/LOG/vcd_signal_dumper.h" +#include "common/utils/LOG/log.h" #include //#define DEBUG_DLSCH_CODING From 077905a66e0d5ef54bf56cc87e7ed3a0644fa10c Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Thu, 11 Oct 2018 01:14:19 -0700 Subject: [PATCH 035/117] undoing previous changes that should not have been committed --- cmake_targets/CMakeLists.txt | 58 ++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 05def09799..b361f6389b 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -323,14 +323,14 @@ endif (${RRC_ASN1_VERSION} STREQUAL "Rel8") add_definitions(-DRRC_VERSION=${RRC_VERSION}) set (RRC_FULL_DIR ${asn1_generated_dir}/RRC_${RRC_ASN1_VERSION}) message("calling asn1c -pdu=all -fcompound-names -gen-PER -no-gen-OER -no-gen-example -D ${RRC_FULL_DIR} ${RRC_GRAMMAR}") -#execute_process(COMMAND mkdir -p ${RRC_FULL_DIR} -# COMMAND env asn1c -pdu=all -fcompound-names -gen-PER -no-gen-OER -no-gen-example -D ${RRC_FULL_DIR} ${RRC_GRAMMAR} -# RESULT_VARIABLE ret -# OUTPUT_QUIET -# ERROR_QUIET) -#if (NOT ${ret} STREQUAL 0) -# message(FATAL_ERROR "${ret}: error") -#endif (NOT ${ret} STREQUAL 0) +execute_process(COMMAND mkdir -p ${RRC_FULL_DIR} + COMMAND env asn1c -pdu=all -fcompound-names -gen-PER -no-gen-OER -no-gen-example -D ${RRC_FULL_DIR} ${RRC_GRAMMAR} + RESULT_VARIABLE ret + OUTPUT_QUIET + ERROR_QUIET) +if (NOT ${ret} STREQUAL 0) + message(FATAL_ERROR "${ret}: error") +endif (NOT ${ret} STREQUAL 0) file(GLOB rrc_source ${RRC_FULL_DIR}/*.c) file(GLOB rrc_h ${RRC_FULL_DIR}/*.h) @@ -364,11 +364,11 @@ add_definitions(-DNR_RRC_VERSION=${NR_RRC_VERSION}) set (NR_RRC_FULL_DIR ${asn1_generated_dir}/${NR_RRC_ASN1_VERSION}) message("calling ASN1C_PREFIX=NR_ asn1c -pdu=all -fcompound-names -findirect-choice -gen-PER -no-gen-OER -no-gen-example -D ${NR_RRC_FULL_DIR} ${NR_RRC_GRAMMAR}") -#execute_process(COMMAND mkdir -p ${NR_RRC_FULL_DIR} -# COMMAND env "ASN1C_PREFIX=NR_" asn1c -fcompound-names -findirect-choice -gen-PER -no-gen-OER -no-gen-example -D ${NR_RRC_FULL_DIR} ${NR_RRC_GRAMMAR} -# RESULT_VARIABLE ret -# OUTPUT_QUIET -# ERROR_QUIET) +execute_process(COMMAND mkdir -p ${NR_RRC_FULL_DIR} + COMMAND env "ASN1C_PREFIX=NR_" asn1c -fcompound-names -findirect-choice -gen-PER -no-gen-OER -no-gen-example -D ${NR_RRC_FULL_DIR} ${NR_RRC_GRAMMAR} + RESULT_VARIABLE ret + OUTPUT_QUIET + ERROR_QUIET) #if (NOT ${ret} STREQUAL 0) # message(FATAL_ERROR "${ret}: error") @@ -428,14 +428,14 @@ add_definitions(-DS1AP_VERSION=${S1AP_VERSION}) set(S1AP_ASN_DIR ${S1AP_DIR}/MESSAGES/ASN1/${S1AP_RELEASE}) set(S1AP_C_DIR ${asn1_generated_dir}/S1AP_${S1AP_RELEASE}) message("calling ASN1C_PREFIX=S1AP_ asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${S1AP_C_DIR} ${S1AP_ASN_DIR}/${S1AP_ASN_FILES}") -#execute_process(COMMAND mkdir -p ${S1AP_C_DIR} -# COMMAND env "ASN1C_PREFIX=S1AP_" asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${S1AP_C_DIR} ${S1AP_ASN_DIR}/${S1AP_ASN_FILES} -# RESULT_VARIABLE ret -# OUTPUT_QUIET -# ERROR_QUIET) -#if (NOT ${ret} STREQUAL 0) -# message(FATAL_ERROR "${ret}: error") -#endif (NOT ${ret} STREQUAL 0) +execute_process(COMMAND mkdir -p ${S1AP_C_DIR} + COMMAND env "ASN1C_PREFIX=S1AP_" asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${S1AP_C_DIR} ${S1AP_ASN_DIR}/${S1AP_ASN_FILES} + RESULT_VARIABLE ret + OUTPUT_QUIET + ERROR_QUIET) +if (NOT ${ret} STREQUAL 0) + message(FATAL_ERROR "${ret}: error") +endif (NOT ${ret} STREQUAL 0) file(GLOB S1AP_source ${S1AP_C_DIR}/*.c) file(GLOB s1ap_h ${S1AP_C_DIR}/*.h) @@ -497,14 +497,14 @@ add_definitions(-DX2AP_VERSION=${X2AP_VERSION}) set(X2AP_ASN_DIR ${X2AP_DIR}/MESSAGES/ASN1/${X2AP_RELEASE}) set(X2AP_C_DIR ${asn1_generated_dir}/X2AP_${X2AP_RELEASE}) message("calling ASN1C_PREFIX=X2AP_ asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${X2AP_C_DIR} ${X2AP_ASN_DIR}/${X2AP_ASN_FILES}") -#execute_process(COMMAND mkdir -p ${X2AP_C_DIR} -# COMMAND env "ASN1C_PREFIX=X2AP_" asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${X2AP_C_DIR} ${X2AP_ASN_DIR}/${X2AP_ASN_FILES} -# RESULT_VARIABLE ret -# OUTPUT_QUIET -# ERROR_QUIET) -#if (NOT ${ret} STREQUAL 0) -# message(FATAL_ERROR "${ret}: error") -#endif (NOT ${ret} STREQUAL 0) +execute_process(COMMAND mkdir -p ${X2AP_C_DIR} + COMMAND env "ASN1C_PREFIX=X2AP_" asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${X2AP_C_DIR} ${X2AP_ASN_DIR}/${X2AP_ASN_FILES} + RESULT_VARIABLE ret + OUTPUT_QUIET + ERROR_QUIET) +if (NOT ${ret} STREQUAL 0) + message(FATAL_ERROR "${ret}: error") +endif (NOT ${ret} STREQUAL 0) file(GLOB X2AP_source ${X2AP_C_DIR}/*.c) file(GLOB x2ap_h ${X2AP_C_DIR}/*.h) From 434c9b98f5ed3867f649b802219f7783b61d38fa Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Thu, 11 Oct 2018 15:09:38 +0200 Subject: [PATCH 036/117] DLSCH support functions/ physical channel up to layer mapping --- cmake_targets/CMakeLists.txt | 4 +- .../nfapi/public_inc/nfapi_nr_interface.h | 61 ++++++-- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 130 ++++++++++++++++++ openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 19 +++ openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c | 22 ++- openair1/PHY/defs_nr_common.h | 5 +- targets/RT/USER/nr-softmodem.c | 24 +++- 7 files changed, 244 insertions(+), 21 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 33f005e51a..79424435da 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1293,8 +1293,8 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dci.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dci_tools.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dlsch.c - ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dlsch_tools.c - ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_tbs_tools.c + #${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dlsch_tools.c + #${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_tbs_tools.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold.c ${OPENAIR1_DIR}/PHY/TOOLS/file_output.c ${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c 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 938cac8fd6..a0da42fcdc 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h @@ -156,6 +156,21 @@ typedef struct { #define NFAPI_NR_SCH_CONFIG_SS_PBCH_BLOCK_POWER 0x5023 #define NFAPI_NR_SCH_CONFIG_N_SSB_CRB 0x5024 +typedef struct { + nfapi_uint16_tlv_t data_scrambling_id; + nfapi_uint16_tlv_t mcs_table; + nfapi_uint16_tlv_t aggregation_factor; + nfapi_uint16_tlv_t prb_bundling_type; + nfapi_uint16_tlv_t rbg_size; + nfapi_uint16_tlv_t resource_allocation_config; + nfapi_uint16_tlv_t vrb_to_prb_interleaver; + nfapi_uint16_tlv_t code_block_groug_transmission; + nfapi_uint16_tlv_t x_overhead; + nfapi_uint16_tlv_t max_dci_codewords; + +} nfapi_nr_pdsch_config_t; +#define NFAPI_NR_PDSCH_CONFIG_TAG + typedef struct { nfapi_uint16_tlv_t prach_RootSequenceIndex; ///// L1 parameter 'PRACHRootSequenceIndex' @@ -170,12 +185,6 @@ typedef struct { nfapi_uint16_tlv_t preambleReceivedTargetPower; } nfapi_nr_rach_config_t; -typedef struct { - nfapi_uint16_tlv_t dmrs_typeA_position; ///// Position of (first) DL DM-RS - nfapi_uint16_tlv_t time_domain_alloc_k0; ///// L1 parameter 'K0' - nfapi_uint16_tlv_t time_domain_alloc_mapping_type; ///// L1 parameter 'Mapping-type' -} nfapi_nr_pdsch_config_t; - typedef struct { nfapi_uint16_tlv_t groupHoppingEnabledTransformPrecoding; ///// L1 parameter 'Group-hopping-enabled-Transform-precoding' nfapi_uint16_tlv_t msg3_DeltaPreamble; ///// L1 parameter 'Delta-preamble-msg3' @@ -229,8 +238,8 @@ typedef struct { nfapi_nr_subframe_config_t subframe_config; nfapi_nr_rf_config_t rf_config; nfapi_nr_sch_config_t sch_config; + nfapi_nr_pdsch_config_t dlsch_config; nfapi_nr_rach_config_t rach_config; - nfapi_nr_pdsch_config_t pdsch_config; nfapi_nr_pusch_config_t pusch_config; nfapi_nr_pucch_config_t pucch_config; nfapi_nr_tdd_ul_dl_config_t tdd_ul_dl_config; @@ -472,14 +481,36 @@ typedef struct { typedef struct { - 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_tl_t tl; + uint16_t length; + uint8_t pdu_index; + uint16_t rnti; + uint8_t resource_allocation_type; + uint8_t virtual_resource_block_assignment_flag; + uint32_t resource_block_coding; + uint8_t modulation; + uint8_t redundancy_version; + uint8_t transport_blocks; + uint8_t transport_block_to_codeword_swap_flag; + uint8_t transmission_scheme; + uint8_t number_of_layers; + uint8_t number_of_subbands; + uint8_t codebook_index[NFAPI_MAX_NUM_SUBBANDS]; + uint8_t ue_category_capacity; + uint8_t pa; + uint8_t delta_power_offset_index; + uint8_t ngap; + uint8_t nprb; + uint8_t transmission_mode; + uint8_t num_bf_prb_per_subband; + uint8_t num_bf_vector; + nfapi_bf_vector_t bf_vector[NFAPI_MAX_BF_VECTORS]; }nfapi_nr_dl_config_dlsch_pdu_rel15_t; +#define NFAPI_NR_DL_CONFIG_REQUEST_DLSCH_PDU_REL15_TAG + +typedef struct { + nfapi_nr_dl_config_dlsch_pdu_rel15_t dlsch_pdu_rel15; +} nfapi_nr_dl_config_dlsch_pdu; typedef struct { nfapi_tl_t tl; @@ -512,7 +543,7 @@ typedef struct { union { 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_dlsch_pdu dlsch_pdu; 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; diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 62b65e8521..9fc9dd10d1 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -30,4 +30,134 @@ * \warning */ +#include "nr_dlsch.h" +#include "nr_dci.h" +void nr_pdsch_codeword_scrambling(uint32_t *in, + uint8_t size, + uint8_t q, + uint32_t Nid, + uint32_t n_RNTI, + uint32_t* out) { + + uint8_t reset; + uint32_t x1, x2, s=0; + + reset = 1; + x2 = (n_RNTI<<15) + (q<<14) + Nid; + + for (int i=0; i>i)&1) ^ ((s>>i)&1); + } + +} + +void nr_pdsch_codeword_modulation(uint32_t *in, + uint8_t Qm, + uint32_t length, + uint16_t *out) { + + uint16_t offset = (Qm==2)? NR_MOD_TABLE_QPSK_OFFSET : (Qm==4)? NR_MOD_TABLE_QAM16_OFFSET : \ + (Qm==6)? NR_MOD_TABLE_QAM64_OFFSET: (Qm==8)? NR_MOD_TABLE_QAM256_OFFSET : 0; + AssertFatal(offset, "Invalid modulation order %d\n", Qm); + + for (int i=0; i>b_idx)&1)<<(Qm-j); + } + + out[i<<1] = nr_mod_table[(offset+idx)<<1]; + out[(i<<1)+1] = nr_mod_table[((offset+idx)<<1)+1]; + } +} + +void nr_pdsch_layer_mapping(uint16_t **mod_symbs, + uint8_t n_codewords, + uint8_t n_layers, + uint16_t *n_symbs, + uint16_t **tx_layers) { + + switch (n_layers) { + + case 1: + memcpy((void*)tx_layers[0], (void*)mod_symbs[0], (n_symbs[0]<<1)*sizeof(uint16_t)); + break; + + case 2: + case 3: + case 4: + for (int i=0; i>1; i++) + for (int l=0; l<2; l++) { + tx_layers[l][i<<1] = mod_symbs[0][((i<<1)+l)<<1]; + tx_layers[l][(i<<1)+1] = mod_symbs[0][(((i<<1)+l)<<1)+1]; + } + for (int i=0; i>2; i++) + for (int l=0; l<3; l++) { + tx_layers[l][i<<1] = mod_symbs[q][((i<<2)+l)<<1]; + tx_layers[l][(i<<1)+1] = mod_symbs[q][(((i<<2)+l)<<1)+1]; + } + break; + + default: + AsserFatal(0, "Invalid number of layers %d\n", n_layers); + } +} + +uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, + NR_gNB_DCI_ALLOC_t dci_alloc, + int32_t** txdataF, + int16_t amp, + NR_DL_FRAME_PARMS frame_parms, + nfapi_nr_config_request_t config) { + + + return 0; +} diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index 418af34b39..1728d1723a 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -32,6 +32,7 @@ #include "PHY/defs_gNB.h" +extern short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT]; void nr_get_time_domain_allocation_type(nfapi_nr_config_request_t config, NR_gNB_DCI_ALLOC_t dci_alloc, @@ -50,3 +51,21 @@ void nr_get_PRG_parms(NR_BWP_PARMS* bwp, NR_gNB_DCI_ALLOC_t dci_alloc, uint8_t p uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx); uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx); + +void nr_pdsch_codeword_scrambling(uint32_t *in, + uint8_t size, + uint8_t q, + uint32_t Nid, + uint32_t n_RNTI, + uint32_t* out); + +void nr_pdsch_codeword_modulation(uint32_t *in, + uint8_t Qm, + uint32_t length, + uint16_t *out); + +void nr_pdsch_layer_mapping(uint16_t **mod_symbs, + uint8_t n_codewords, + uint8_t n_layers, + uint16_t *n_symbs, + uint16_t **tx_layers); diff --git a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c index 84afa0d325..6282f7853e 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c @@ -40,7 +40,10 @@ uint16_t nr_target_code_rate_table2[28] = {120, 193, 308, 449, 602, 378, 434, 49 616, 666, 719, 772, 822, 873, -1, 711, 754, 797, 841, 885, -1, 948}; uint16_t nr_target_code_rate_table3[29] = {30, 40, 50, 64, 78, 99, 120, 157, 193, 251, 308, 379, 449, 526, 602, 340, \ 378, 434, 490, 553, 616, 438, 466, 517, 567, 616, 666, 719, 772}; - +uint16_t nr_tbs_table[93] = {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}; uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx) { switch(table_idx) { @@ -68,7 +71,7 @@ uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx) { break; case 2: - return ((Imcs==20)?0xaaa00 : (Imcs==26)?0xe5200 : nr_target_code_rate_table3[Imcs]<<10); + return ((Imcs==20)?0xaaa00 : (Imcs==26)?0xe5200 : nr_target_code_rate_table2[Imcs]<<10); break; case 3: @@ -79,3 +82,18 @@ uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx) { AssertFatal(0, "Invalid MCS table index %d (expected in range [1,3])\n", table_idx); } } + +static inline uint8_t is_codeword_disabled(uint8_t format, uint8_t Imcs, uint8_t rv) { + return ((format==NFAPI_NR_DL_DCI_FORMAT_1_1)&&(Imcs==26)&&(rv==1)); +} + +/*uint16_t nr_get_tbs(NR_gNB_DCI_ALLOC_t dci_alloc, nfapi_nr_config_request_t config) { + + uint8_t rnti_type = dci_alloc.pdcch_params.rnti_type; + uint8_t N_PRB_oh = ((rnti_type==NFAPI_NR_RNTI_SI)||(rnti_type==NFAPI_NR_RNTI_RA)||(rnti_type==NFAPI_NR_RNTI_P))? 0 : \ + (config.pdsch_config.); + uint16_t N_prime_RE = NR_NB_SC_PER_RB*N_sh_symb - N_PRB_DMRS - N_PRB_oh; + LOG_I(MAC, "N_prime_RE %d for %d symbols %d DMRS per PRB and %d overhead\n", N_prime_RE, N_sh_symb, N_PRB_DMRS, N_PRB_oh); + + +}*/ diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index eee22a455a..3f125e9d93 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -52,9 +52,12 @@ #define ONE_OVER_SQRT2_Q15 23170 #define ONE_OVER_TWO_Q15 16384 -#define NR_MOD_TABLE_SIZE_SHORT 14 +#define NR_MOD_TABLE_SIZE_SHORT 686 #define NR_MOD_TABLE_BPSK_OFFSET 1 #define NR_MOD_TABLE_QPSK_OFFSET 3 +#define NR_MOD_TABLE_QAM16_OFFSET 7 +#define NR_MOD_TABLE_QAM64_OFFSET 23 +#define NR_MOD_TABLE_QAM256_OFFSET 87 #define NR_PSS_LENGTH 127 #define NR_SSS_LENGTH 127 diff --git a/targets/RT/USER/nr-softmodem.c b/targets/RT/USER/nr-softmodem.c index 57d5c30d15..fd97473147 100644 --- a/targets/RT/USER/nr-softmodem.c +++ b/targets/RT/USER/nr-softmodem.c @@ -94,7 +94,29 @@ unsigned short config_frames[4] = {2,9,11,13}; // current status is that every UE has a DL scope for a SINGLE eNB (gnb_id=0) // at eNB 0, an UL scope for every UE -short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT] = {0,0,23170,23170,-23170,-23170,23170,23170,23170,-23170,-23170,23170,-23170,-23170}; +short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT] = {0,0,23170,23170,-23170,-23170,23170,23170,23170,-23170,-23170,23170,-23170,-23170,10362,10362,10362,31086,31086,10362,31086,31086,10362,-10362\ + ,10362,-31086,31086,-10362,31086,-31086,-10362,10362,-10362,31086,-31086,10362,-31086,31086,-10362,-10362,-10362,-31086,-31086,-10362,-31086,-31086,15169,15169,15169,5057,5057,15169,5057\ + ,5057,15169,25281,15169,35393,5057,25281,5057,35393,25281,15169,25281,5057,35393,15169,35393,5057,25281,25281,25281,35393,35393,25281,35393,35393,15169,-15169,15169,-5057,5057,-15169,5057\ + ,-5057,15169,-25281,15169,-35393,5057,-25281,5057,-35393,25281,-15169,25281,-5057,35393,-15169,35393,-5057,25281,-25281,25281,-35393,35393,-25281,35393,-35393,-15169,15169,-15169,5057,-5057\ + ,15169,-5057,5057,-15169,25281,-15169,35393,-5057,25281,-5057,35393,-25281,15169,-25281,5057,-35393,15169,-35393,5057,-25281,25281,-25281,35393,-35393,25281,-35393,35393,-15169,-15169,-15169\ + ,-5057,-5057,-15169,-5057,-5057,-15169,-25281,-15169,-35393,-5057,-25281,-5057,-35393,-25281,-15169,-25281,-5057,-35393,-15169,-35393,-5057,-25281,-25281,-25281,-35393,-35393,-25281,-35393\ + ,-35393,12566,12566,12566,17592,17592,12566,17592,17592,12566,7540,12566,2514,17592,7540,17592,2514,7540,12566,7540,17592,2514,12566,2514,17592,7540,7540,7540,2514,2514,7540,2514,2514,12566\ + ,27644,12566,22618,17592,27644,17592,22618,12566,32670,12566,37696,17592,32670,17592,37696,7540,27644,7540,22618,2514,27644,2514,22618,7540,32670,7540,37696,2514,32670,2514,37696,27644,12566\ + ,27644,17592,22618,12566,22618,17592,27644,7540,27644,2514,22618,7540,22618,2514,32670,12566,32670,17592,37696,12566,37696,17592,32670,7540,32670,2514,37696,7540,37696,2514,27644,27644,27644\ + ,22618,22618,27644,22618,22618,27644,32670,27644,37696,22618,32670,22618,37696,32670,27644,32670,22618,37696,27644,37696,22618,32670,32670,32670,37696,37696,32670,37696,37696,12566,-12566\ + ,12566,-17592,17592,-12566,17592,-17592,12566,-7540,12566,-2514,17592,-7540,17592,-2514,7540,-12566,7540,-17592,2514,-12566,2514,-17592,7540,-7540,7540,-2514,2514,-7540,2514,-2514,12566,-27644\ + ,12566,-22618,17592,-27644,17592,-22618,12566,-32670,12566,-37696,17592,-32670,17592,-37696,7540,-27644,7540,-22618,2514,-27644,2514,-22618,7540,-32670,7540,-37696,2514,-32670,2514,-37696\ + ,27644,-12566,27644,-17592,22618,-12566,22618,-17592,27644,-7540,27644,-2514,22618,-7540,22618,-2514,32670,-12566,32670,-17592,37696,-12566,37696,-17592,32670,-7540,32670,-2514,37696,-7540\ + ,37696,-2514,27644,-27644,27644,-22618,22618,-27644,22618,-22618,27644,-32670,27644,-37696,22618,-32670,22618,-37696,32670,-27644,32670,-22618,37696,-27644,37696,-22618,32670,-32670,32670\ + ,-37696,37696,-32670,37696,-37696,-12566,12566,-12566,17592,-17592,12566,-17592,17592,-12566,7540,-12566,2514,-17592,7540,-17592,2514,-7540,12566,-7540,17592,-2514,12566,-2514,17592,-7540\ + ,7540,-7540,2514,-2514,7540,-2514,2514,-12566,27644,-12566,22618,-17592,27644,-17592,22618,-12566,32670,-12566,37696,-17592,32670,-17592,37696,-7540,27644,-7540,22618,-2514,27644,-2514,22618\ + ,-7540,32670,-7540,37696,-2514,32670,-2514,37696,-27644,12566,-27644,17592,-22618,12566,-22618,17592,-27644,7540,-27644,2514,-22618,7540,-22618,2514,-32670,12566,-32670,17592,-37696,12566\ + ,-37696,17592,-32670,7540,-32670,2514,-37696,7540,-37696,2514,-27644,27644,-27644,22618,-22618,27644,-22618,22618,-27644,32670,-27644,37696,-22618,32670,-22618,37696,-32670,27644,-32670,22618\ + ,-37696,27644,-37696,22618,-32670,32670,-32670,37696,-37696,32670,-37696,37696,-12566,-12566,-12566,-17592,-17592,-12566,-17592,-17592,-12566,-7540,-12566,-2514,-17592,-7540,-17592,-2514,-7540\ + ,-12566,-7540,-17592,-2514,-12566,-2514,-17592,-7540,-7540,-7540,-2514,-2514,-7540,-2514,-2514,-12566,-27644,-12566,-22618,-17592,-27644,-17592,-22618,-12566,-32670,-12566,-37696,-17592,-32670\ + ,-17592,-37696,-7540,-27644,-7540,-22618,-2514,-27644,-2514,-22618,-7540,-32670,-7540,-37696,-2514,-32670,-2514,-37696,-27644,-12566,-27644,-17592,-22618,-12566,-22618,-17592,-27644,-7540,-27644\ + ,-2514,-22618,-7540,-22618,-2514,-32670,-12566,-32670,-17592,-37696,-12566,-37696,-17592,-32670,-7540,-32670,-2514,-37696,-7540,-37696,-2514,-27644,-27644,-27644,-22618,-22618,-27644,-22618,-22618\ + ,-27644,-32670,-27644,-37696,-22618,-32670,-22618,-37696,-32670,-27644,-32670,-22618,-37696,-27644,-37696,-22618,-32670,-32670,-32670,-37696,-37696,-32670,-37696,-37696}; FD_lte_phy_scope_ue *form_ue[NUMBER_OF_UE_MAX]; FD_lte_phy_scope_enb *form_enb[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; From 291a9483123148e29374d2a9c8fc00a70bb3560c Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Fri, 12 Oct 2018 02:07:47 +0200 Subject: [PATCH 037/117] PDSCH generation start --- openair1/PHY/NR_TRANSPORT/nr_dci_tools.c | 2 ++ openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 36 +++++++++++++++++++ openair1/PHY/defs_gNB.h | 14 ++++++-- openair1/PHY/defs_nr_common.h | 1 + .../LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c | 4 +-- 5 files changed, 53 insertions(+), 4 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c b/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c index ebc9c96970..fa729704a5 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c @@ -119,6 +119,8 @@ void nr_fill_dci_and_dlsch(PHY_VARS_gNB *gNB, nfapi_nr_dl_config_dci_dl_pdu_rel15_t *pdu_rel15 = &pdu->dci_dl_pdu.dci_dl_pdu_rel15; nfapi_nr_dl_config_pdcch_parameters_rel15_t *params_rel15 = &pdu->dci_dl_pdu.pdcch_params_rel15; nfapi_nr_config_request_t *cfg = &gNB->gNB_config; + NR_gNB_DLSCH_t *dlsch = &gNB->dlsch; + NR_DL_gNB_HARQ_t **harq = dlsch->harq_processes; uint16_t N_RB = fp->initial_bwp_dl.N_RB; uint16_t N_RB_UL = fp->initial_bwp_ul.N_RB; diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 9fc9dd10d1..53f0a7791b 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -158,6 +158,42 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, NR_DL_FRAME_PARMS frame_parms, nfapi_nr_config_request_t config) { + NR_DL_gNB_HARQ_t *harq = dlsch.harq_processes[0]; + uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH]={0}; + uint16_t mod_symbs[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>1] = {0}; + uint16_t tx_layers[NR_MAX_NB_LAYERS][NR_MAX_PDSCH_ENCODED_LENGTH>>1]; + + /// CRC, coding, interleaving and rate matching + + /// scrambling + uint16_t n_RNTI = (pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)? ((pdcch_params.scrambling_id)?pdcch_params.rnti:0) : 0; + uint16_t Nid = (pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)? pdcch_params.scrambling_id : config.sch_config.physical_cell_id.value; + for (int q=0; qn_codewords; q++) + nr_pdsch_codeword_scrambling(harq->f, + harq->TBS, + q, + Nid, + n_RNTI, + scrambled_output[q]); + + /// Modulation + for (int q=0; qn_codewords; q++) + nr_pdsch_codeword_modulation(scrambled_output[q], + harq->Qm, + harq->TBS, + mod_symbs[q]); + + /// Layer mapping + nr_pdsch_layer_mapping(mod_symbs, + harq->n_codewords, + harq->Nl, + n_symbs, + tx_layers); + + /// Antenna port mapping -- Not yet necessary + + /// Resource mapping + return 0; } diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 49f4d94305..05a6b267b7 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -132,16 +132,26 @@ typedef struct { uint8_t first_layer; /// codeword this transport block is mapped to uint8_t codeword; + /// Number of codewords + uint8_t n_codewords; } NR_DL_gNB_HARQ_t; typedef struct { - /// Pointers to 8 HARQ processes for the DLSCH - NR_DL_gNB_HARQ_t *harq_processes[8]; + /// Pointers to 16 HARQ processes for the DLSCH + NR_DL_gNB_HARQ_t *harq_processes[16]; nfapi_nr_pdsch_time_domain_alloc_type_e time_alloc_type; uint8_t time_alloc_list_flag; uint8_t rbg_list[NR_MAX_NB_RBG]; + /// Time domain allocation + uint8_t S; + uint8_t L; + /// Freq domain allocation + uint16_t rb_start; + uint16_t n_rb; + /// BWP index + uint8_t bwp_idx; /// TX buffers for UE-spec transmission (antenna ports 5 or 7..14, prior to precoding) int32_t *txdataF[8]; diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 3f125e9d93..b7fabb1a27 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -85,6 +85,7 @@ #define NR_MAX_CSET_DURATION 3 #define NR_MAX_NB_RBG 18 +#define NR_MAX_NB_LAYERS 8 typedef enum { NR_MU_0=0, diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c index 4a5054b52a..f2c9ee8661 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c @@ -70,8 +70,8 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, cfg->rf_config.dl_channel_bandwidth.value); memcpy((void*)params_rel15, (void*)&gNB->pdcch_type0_params, sizeof(nfapi_nr_dl_config_pdcch_parameters_rel15_t)); - pdu_rel15->frequency_domain_assignment = 5; - pdu_rel15->time_domain_assignment = 3; + pdu_rel15->frequency_domain_assignment = get_RIV(0, 40, 106); + pdu_rel15->time_domain_assignment = get_SLIV(8, 14); pdu_rel15->vrb_to_prb_mapping = 1; pdu_rel15->mcs = 12; pdu_rel15->tb_scaling = 1; From 4e4850191e2877aa18137b477fae6c8584f0f47a Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Fri, 19 Oct 2018 17:09:44 +0200 Subject: [PATCH 038/117] temp commit/ not compiling --- cmake_targets/CMakeLists.txt | 4 +- .../nfapi/public_inc/nfapi_nr_interface.h | 40 ++++++- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 102 ++++++++++++++++-- openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 12 ++- openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c | 35 +++--- openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c | 99 +++++++++++++++++ openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h | 44 ++++++++ openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c | 69 +++++++++++- openair1/PHY/defs_gNB.h | 19 +--- openair1/PHY/defs_nr_common.h | 10 ++ .../LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c | 18 ++-- 11 files changed, 389 insertions(+), 63 deletions(-) create mode 100644 openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c create mode 100644 openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 79424435da..33f005e51a 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1293,8 +1293,8 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dci.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dci_tools.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dlsch.c - #${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dlsch_tools.c - #${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_tbs_tools.c + ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dlsch_tools.c + ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_tbs_tools.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold.c ${OPENAIR1_DIR}/PHY/TOOLS/file_output.c ${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c 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 a0da42fcdc..a3faead178 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h @@ -158,11 +158,17 @@ typedef struct { typedef struct { nfapi_uint16_tlv_t data_scrambling_id; + nfapi_uint16_tlv_t dmrs_typeA_position; + nfapi_uint16_tlv_t dmrs_additional_position; + nfapi_uint16_tlv_t dmrs_type; + nfapi_uint16_tlv_t dmrs_max_length; + nfapi_uint16_tlv_t mapping_type; + nfapi_uint16_tlv_t resource_allocation; + nfapi_uint16_tlv_t time_allocation_list; nfapi_uint16_tlv_t mcs_table; nfapi_uint16_tlv_t aggregation_factor; nfapi_uint16_tlv_t prb_bundling_type; nfapi_uint16_tlv_t rbg_size; - nfapi_uint16_tlv_t resource_allocation_config; nfapi_uint16_tlv_t vrb_to_prb_interleaver; nfapi_uint16_tlv_t code_block_groug_transmission; nfapi_uint16_tlv_t x_overhead; @@ -238,7 +244,7 @@ typedef struct { nfapi_nr_subframe_config_t subframe_config; nfapi_nr_rf_config_t rf_config; nfapi_nr_sch_config_t sch_config; - nfapi_nr_pdsch_config_t dlsch_config; + nfapi_nr_pdsch_config_t pdsch_config; nfapi_nr_rach_config_t rach_config; nfapi_nr_pusch_config_t pusch_config; nfapi_nr_pucch_config_t pucch_config; @@ -343,6 +349,16 @@ typedef enum { NFAPI_NR_PRB_BUNDLING_TYPE_DYNAMIC } nfapi_nr_prb_bundling_type_e; +typedef enum { + NFAPI_NR_MCS_TABLE_QAM64_LOW_SE=0, + NFAPI_NR_MCS_TABLE_QAM256 +} nfapi_nr_pdsch_mcs_table_e; + +typedef enum { + NFAPI_NR_DMRS_TYPE1=0, + NFAPI_NR_DMRS_TYPE2 +} nfapi_nr_dmrs_type_e; + // P7 Sub Structures typedef struct { @@ -485,13 +501,28 @@ typedef struct { uint16_t length; uint8_t pdu_index; uint16_t rnti; - uint8_t resource_allocation_type; + uint8_t time_allocation_type; + uint8_t freq_allocation_type; + uint8_t start_prb; + uint8_t n_prb; + uint8_t S; + uint8_t L; + uint8_t Imcs; + uint8_t n_codewords; + uint8_t n_layers; + /*uint8_t R; + uint8_t Qm; + uint16_t TBS; + uint8_t nb_layers;*/ + uint8_t time_alloc_list_flag; + uint8_t time_alloc_list; + uint8_t rbg_list; uint8_t virtual_resource_block_assignment_flag; uint32_t resource_block_coding; uint8_t modulation; uint8_t redundancy_version; uint8_t transport_blocks; - uint8_t transport_block_to_codeword_swap_flag; + //uint8_t transport_block_to_codeword_swap_flag; uint8_t transmission_scheme; uint8_t number_of_layers; uint8_t number_of_subbands; @@ -500,7 +531,6 @@ typedef struct { uint8_t pa; uint8_t delta_power_offset_index; uint8_t ngap; - uint8_t nprb; uint8_t transmission_mode; uint8_t num_bf_prb_per_subband; uint8_t num_bf_vector; diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 53f0a7791b..c38486aec0 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -33,6 +33,8 @@ #include "nr_dlsch.h" #include "nr_dci.h" +#define DEBUG_DLSCH + void nr_pdsch_codeword_scrambling(uint32_t *in, uint8_t size, uint8_t q, @@ -56,6 +58,31 @@ void nr_pdsch_codeword_scrambling(uint32_t *in, } +void nr_modulation(uint32_t *in, + uint16_t length, + nr_mod_t modulation_type, + int16_t *out) { + + uint16_t offset; + uint16_t order; + order = mod_order[modulation_type]; + offset = mod_offset[modulation_type]; + + for (int i=0; i>b_idx)&1)<<(order-j-1); + } + + out[i<<1] = nr_mod_table[(offset+idx)<<1]; + out[(i<<1)+1] = nr_mod_table[((offset+idx)<<1)+1]; + } +} + void nr_pdsch_codeword_modulation(uint32_t *in, uint8_t Qm, uint32_t length, @@ -72,7 +99,7 @@ void nr_pdsch_codeword_modulation(uint32_t *in, b_idx = (i*Qm+j)&0x1f; if (i && (!b_idx)) in++; - idx ^= (((*in)>>b_idx)&1)<<(Qm-j); + idx ^= (((*in)>>b_idx)&1)<<(Qm-j-1); } out[i<<1] = nr_mod_table[(offset+idx)<<1]; @@ -153,22 +180,29 @@ void nr_pdsch_layer_mapping(uint16_t **mod_symbs, uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, NR_gNB_DCI_ALLOC_t dci_alloc, + uint32_t *pdsch_dmrs, int32_t** txdataF, int16_t amp, NR_DL_FRAME_PARMS frame_parms, nfapi_nr_config_request_t config) { - NR_DL_gNB_HARQ_t *harq = dlsch.harq_processes[0]; + NR_DL_gNB_HARQ_t *harq = dlsch.harq_processes[dci_alloc.harq_pid]; + nfapi_nr_dl_config_dlsch_pdu_rel15_t *rel15 = &harq->dlsch_pdu.dlsch_pdu_rel15; + nfapi_nr_dl_config_pdcch_parameters_rel15_t pdcch_params = dci_alloc.pdcch_params; uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH]={0}; uint16_t mod_symbs[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>1] = {0}; uint16_t tx_layers[NR_MAX_NB_LAYERS][NR_MAX_PDSCH_ENCODED_LENGTH>>1]; + uint16_t n_symbs[NR_MAX_NB_CODEWORDS] = {0}; + int8_t Wf[2], Wt[2], l0[2], delta; /// CRC, coding, interleaving and rate matching /// scrambling - uint16_t n_RNTI = (pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)? ((pdcch_params.scrambling_id)?pdcch_params.rnti:0) : 0; - uint16_t Nid = (pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)? pdcch_params.scrambling_id : config.sch_config.physical_cell_id.value; - for (int q=0; qn_codewords; q++) + uint16_t n_RNTI = (pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)? \ + ((pdcch_params.scrambling_id)?pdcch_params.rnti:0) : 0; + uint16_t Nid = (pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)? \ + pdcch_params.scrambling_id : config.sch_config.physical_cell_id.value; + for (int q=0; qnb_codewords; q++) nr_pdsch_codeword_scrambling(harq->f, harq->TBS, q, @@ -177,7 +211,7 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, scrambled_output[q]); /// Modulation - for (int q=0; qn_codewords; q++) + for (int q=0; qnb_codewords; q++) nr_pdsch_codeword_modulation(scrambled_output[q], harq->Qm, harq->TBS, @@ -185,15 +219,61 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, /// Layer mapping nr_pdsch_layer_mapping(mod_symbs, - harq->n_codewords, - harq->Nl, + rel15->nb_codewords, + rel15->nb_layers, n_symbs, tx_layers); - /// Antenna port mapping -- Not yet necessary + /// Antenna port mapping + //to be moved to init phase potentially, for now tx_layers 1-8 are mapped on antenna ports 1000-1007 + + /// DMRS QPSK modulation + uint16_t n_dmrs = rel15->n_prb<<1; + uint16_t mod_dmrs[n_dmrs<<1] = {0}; + uint8_t dmrs_type = config.pdsch_config.dmrs_type.value; + nr_modulation(pdsch_dmrs, n_dmrs, QPSK, mod_dmrs); /// Resource mapping - - + AssertFatal(harq->Nl<=config.rf_config.tx_antenna_ports.value, "Not enough Tx antennas (%d) for %d layers\n",\ + config.rf_config.tx_antenna_ports.value, harq->Nl); + + // Non interleaved VRB to PRB mapping + uint8_t start_sc = frame_parms.first_carrier_offset + rel15->start_prb*NR_NB_SC_PER_RB +\ + ((pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_COMMON) && (pdcch_params.dci_format == NFAPI_NR_DL_DCI_FORMAT_1_0))?\ + (((int)floor(frame_parms.ssb_start_subcarrier/NR_NB_SC_PER_RB) + pdcch_params.rb_offset)*NR_NB_SC_PER_RB) : 0; + + for (int ap=0; apnb_layers; ap++) { + + // DMRS params for this ap + Wt = get_Wt(ap, dmrs_type); + Wf = get_Wf(ap, dmrs_type); + l0 = get_l0(0, config.pdsch_config.dmrs_typeA_position.value); + delta = get_delta(ap, dmrs_type); + uint8_t k_prime=0, n=0, dmrs_idx=0; + uint16_t m = 0; + + for (int l=rel15->S; lL; l++) + for (int k=start_sc; kn_prb*NR_NB_SC_PER_RB; k++) { + if (k >= frame_parms.ofdm_symbol_size) + k -= frame_parms.ofdm_symbol_size; + + if ((l==l0) && (k == ((dmrs_type)? (6*n+k_prime+delta):((n<<2)+(k_prime<<1)+delta)))) { + ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (Wt*Wf*amp*mod_dmrs[dmrs_idx<<1]) >> 15; + ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (Wt*Wf*amp*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15; + mod_dmrs++; + n++; + k_prime = (++k_prime)&1; + } + + ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (amp * tx_layers[ap][m<<1]) >> 15; + ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15; + m++; + } + } + +#ifdef DEBUG_DLSCH + write_output("txdataF_dlsch.m", "txdataF_dlsch", txdataF[0], frame_parms.samples_per_frame_wCP>>1, 1, 1); +#endif + return 0; } diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index 1728d1723a..a8ecba0582 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -35,11 +35,15 @@ extern short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT]; void nr_get_time_domain_allocation_type(nfapi_nr_config_request_t config, - NR_gNB_DCI_ALLOC_t dci_alloc, - NR_gNB_DLSCH_t* dlsch); + nfapi_nr_dl_config_dci_dl_pdu dci_pdu, + nfapi_nr_dl_config_dlsch_pdu *dlsch_pdu); void nr_check_time_alloc(uint8_t S, uint8_t L, nfapi_nr_config_request_t config); +uint16_t get_RIV(uint16_t rb_start, uint16_t L, uint16_t N_RB); + +uint16_t get_SLIV(uint8_t S, uint8_t L); + uint8_t nr_get_S(uint8_t row_idx, uint8_t CP, uint8_t time_alloc_type, uint8_t dmrs_typeA_position); void nr_get_rbg_parms(NR_BWP_PARMS* bwp, uint8_t config_type); @@ -52,6 +56,10 @@ uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx); uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx); +void nr_get_tbs(nfapi_nr_dl_config_dlsch_pdu *dlsch_pdu, + nfapi_nr_dl_config_dci_dl_pdu dci_pdu, + nfapi_nr_config_request_t config); + void nr_pdsch_codeword_scrambling(uint32_t *in, uint8_t size, uint8_t q, diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c index e1f7799f76..bf57c94645 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c @@ -45,23 +45,26 @@ uint8_t nr_pdsch_default_time_alloc_C_L[15] = {2,2,2,2,2,4,4,4,4,4,7,12,11,6,6}; /// Time domain allocation routines void nr_get_time_domain_allocation_type(nfapi_nr_config_request_t config, - NR_gNB_DCI_ALLOC_t dci_alloc, - NR_gNB_DLSCH_t* dlsch) { + nfapi_nr_dl_config_dci_dl_pdu dci_pdu, + nfapi_nr_dl_config_dlsch_pdu *dlsch_pdu) { - nfapi_nr_ssb_and_cset_mux_pattern_type_e mux_pattern = dci_alloc.pdcch_params.mux_pattern; + nfapi_nr_dl_config_pdcch_parameters_rel15_t params_rel15 = dci_pdu.pdcch_params_rel15; + uint8_t *alloc_type = &dlsch_pdu->dlsch_pdu_rel15.time_allocation_type; + uint8_t mux_pattern = params_rel15.mux_pattern; + uint8_t alloc_list_flag = dlsch_pdu->dlsch_pdu_rel15.time_alloc_list_flag; - switch(dci_alloc.pdcch_params.rnti_type) { + switch(params_rel15.rnti_type) { case NFAPI_NR_RNTI_SI: - AssertFatal(dci_alloc.pdcch_params.common_search_space_type == NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_0, + AssertFatal(params_rel15.common_search_space_type == NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_0, "Invalid common search space type %d for SI RNTI, expected %d\n", - dci_alloc.pdcch_params.common_search_space_type, NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_0); + params_rel15.common_search_space_type, NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_0); if (mux_pattern == NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1) AssertFatal(config.subframe_config.dl_cyclic_prefix_type.value == NFAPI_CP_NORMAL, "Invalid configuration CP extended for SI RNTI type 0 search space\n"); - dlsch->time_alloc_type = (mux_pattern == NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1)?NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A : + *alloc_type = (mux_pattern == NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1)?NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A : (mux_pattern == NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE2)?NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_B : NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_C; break; @@ -71,7 +74,7 @@ void nr_get_time_domain_allocation_type(nfapi_nr_config_request_t config, /*AssertFatal(dci_alloc.pdcch_params.common_search_space_type == NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_1, "Invalid common search space type %d for RNTI %d, expected %d\n",dci_alloc.pdcch_params.common_search_space_type, NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_1, dci_alloc.rnti_type);*/ - dlsch->time_alloc_type = (dlsch->time_alloc_list_flag) ? NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_ALLOC_LIST : NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A; + *alloc_type = (alloc_list_flag) ? NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_ALLOC_LIST : NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A; break; case NFAPI_NR_RNTI_P: @@ -79,17 +82,17 @@ void nr_get_time_domain_allocation_type(nfapi_nr_config_request_t config, case NFAPI_NR_RNTI_C: case NFAPI_NR_RNTI_CS: - if (dci_alloc.pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_COMMON) - dlsch->time_alloc_type = (dlsch->time_alloc_list_flag)? NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_ALLOC_LIST : NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A; + if (params_rel15.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_COMMON) + *alloc_type = (alloc_list_flag)? NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_ALLOC_LIST : NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A; else - dlsch->time_alloc_type = NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_ALLOC_LIST; + *alloc_type = NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_ALLOC_LIST; break; } } -static inline uint16_t get_SLIV(uint8_t S, uint8_t L) { +uint16_t get_SLIV(uint8_t S, uint8_t L) { return ( (uint16_t)(((L-1)<=7)? (14*(L-1)+S) : (14*(15-L)+(13-S))) ); } @@ -129,11 +132,11 @@ void nr_check_time_alloc(uint8_t S, uint8_t L, nfapi_nr_config_request_t config) switch (config.subframe_config.dl_cyclic_prefix_type.value) { case NFAPI_CP_NORMAL: - if (config.pdsch_config.time_domain_alloc_mapping_type.value == NFAPI_NR_PDSCH_MAPPING_TYPE_A) { + if (config.pdsch_config.mapping_type.value == NFAPI_NR_PDSCH_MAPPING_TYPE_A) { AssertFatal(S<4, "Invalid value of S(%d) for mapping type A and normal CP\n", S); if (S==3) - AssertFatal(config.pdsch_config.dmrs_typeA_position.value == 3, "Invalid S %d for dmrs_typeA_position %d\n", + AssertFatal(config.pdsch_config.mapping_type.value == 3, "Invalid S %d for dmrs_typeA_position %d\n", S, config.pdsch_config.dmrs_typeA_position.value); AssertFatal((L>2)&&(L<15), "Invalid L %d for mapping type A and normal CP\n", L); @@ -150,7 +153,7 @@ void nr_check_time_alloc(uint8_t S, uint8_t L, nfapi_nr_config_request_t config) break; case NFAPI_CP_EXTENDED: - if (config.pdsch_config.time_domain_alloc_mapping_type.value == NFAPI_NR_PDSCH_MAPPING_TYPE_A) { + if (config.pdsch_config.mapping_type.value == NFAPI_NR_PDSCH_MAPPING_TYPE_A) { AssertFatal(S<4, "Invalid value of S(%d) for mapping type A and extended CP\n", S); if (S==3) @@ -205,7 +208,7 @@ void nr_get_rbg_list(uint32_t bitmap, uint8_t n_rbg, uint8_t* rbg_list) { // DL alloc type 1 -static inline uint16_t get_RIV(uint16_t rb_start, uint16_t L, uint16_t N_RB) { +uint16_t get_RIV(uint16_t rb_start, uint16_t L, uint16_t N_RB) { if ((L-1)<=(N_RB>>1)) return (N_RB*(L-1)+rb_start); else diff --git a/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c new file mode 100644 index 0000000000..b016e4d008 --- /dev/null +++ b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c @@ -0,0 +1,99 @@ +/* + * 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/NR_TRANSPORT/nr_sch_dmrs.c +* \brief +* \author +* \date +* \version +* \company Eurecom +* \email: +* \note +* \warning +*/ + +#include "nr_sch_dmrs.h" + + + + +/*Table 7.4.1.1.2-1 and 7.4.1.1.2-2 38211 Columns: ap - CDM group - Delta - Wf(0) - Wf(1) - Wt(0) - Wt(1)*/ +int8_t pdsch_dmrs_1[8][7] = {{0,0,0,1,1,1,1}, + {1,0,0,1,-1,1,1}, + {2,1,1,1,1,,1,1}, + {3,1,1,1,-1,1,1}, + {4,0,0,1,1,1,-1}, + {5,0,0,1,-1,1,-1}, + {6,1,1,1,1,1,-1}, + {7,1,1,1,-1,1,-1}}; + +int8_t pdsch_dmrs_2[12][7] = {{0,0,0,1,1,1,1}, + {1,0,0,1,-1,1,1}, + {2,1,2,1,1,1,1}, + {3,1,2,1,-1,1,1}, + {4,2,4,1,1,1,1}, + {5,2,4,1,-1,1,1}, + {6,0,0,1,1,1,-1}, + {7,0,0,1,-1,1,-1}, + {8,1,2,1,1,1,-1}, + {9,1,2,1,-1,1,-1}, + {10,2,4,1,1,1,-1}, + {11,2,4,1,-1,1,-1}}; + +static inline void *get_l_prime(uint8_t n_symbs) { + uint8_t *l_prime; + for (int i=0; idlsch_pdu.dlsch_pdu_rel15; + nfapi_nr_dl_config_pdcch_parameters_rel15_t params_rel15 = dci_pdu.pdcch_params_rel15; + NR_DL_gNB_HARQ_t *harq = dlsch->harq_processes[dlsch_rel15->harq_pid]; + uint8_t rnti_type = params_rel15.rnti_type; + uint8_t dci_format = params_rel15.dci_format; + uint8_t ss_type = params_rel15.search_space_type; uint8_t N_PRB_oh = ((rnti_type==NFAPI_NR_RNTI_SI)||(rnti_type==NFAPI_NR_RNTI_RA)||(rnti_type==NFAPI_NR_RNTI_P))? 0 : \ - (config.pdsch_config.); + (config.pdsch_config.x_overhead.value); + uint8_t mcs_table = config.pdsch_config.mcs_table.value; + uint8_t N_sh_symb = dlsch_rel15->L; + uint8_t Imcs = dlsch_rel15->Imcs; uint16_t N_prime_RE = NR_NB_SC_PER_RB*N_sh_symb - N_PRB_DMRS - N_PRB_oh; LOG_I(MAC, "N_prime_RE %d for %d symbols %d DMRS per PRB and %d overhead\n", N_prime_RE, N_sh_symb, N_PRB_DMRS, N_PRB_oh); - -}*/ + uint16_t N_RE, N_info, N_info_prime; + uint8_t table_idx, R, Qm, n; + float tmp, C; // temporary N_info_prime in float to avoid back and forth casting to int + + N_RE = min(156, N_RE)*dlsch_rel15->n_prb; + if ((mcs_table == NFAPI_NR_MCS_TABLE_QAM256) && (dci_format == NFAPI_NR_DL_DCI_FORMAT_1_1) && ((rnti_type==NFAPI_NR_RNTI_C)||(rnti_type==NFAPI_NR_RNTI_CS))) + table_idx = 2; + else if ((mcs_table == NFAPI_NR_MCS_TABLE_QAM64_LOW_SE) && (rnti_type!=NFAPI_NR_RNTI_new) && (rnti_type==NFAPI_NR_RNTI_C) && (ss_type==NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)) + table_idx = 3; + else if (rnti_type==NFAPI_NR_RNTI_new) + table_idx = 3; + else if ((mcs_table == NFAPI_NR_MCS_TABLE_QAM256) && (rnti_type==NFAPI_NR_RNTI_CS) && (dci_format == NFAPI_NR_DL_DCI_FORMAT_1_1)) + table_idx = 2; // Condition mcs_table not configured in sps_config necessary here but not yet implemented + /*else if((mcs_table == NFAPI_NR_MCS_TABLE_QAM64_LOW_SE) && (rnti_type==NFAPI_NR_RNTI_CS)) + * table_idx = 3; + * Note: the commented block refers to the case where the mcs_table is from sps_config*/ + else + table_idx = 1; + + R = nr_get_code_rate(Imcs, table_idx); + Qm = nr_get_Qm(Imcs, table_idx); + N_info = N_RE*R*Qm*harq->Nl; + + if (N_info <= 3824) { + n = max(3, (uint8_t)(floor(log2(N_info)-6))); + N_info_prime = max(24, (N_info>>n)<= N_info_prime) { + harq->TBS = nr_tbs_table[i]; + break; + } + } + else { + n = (uint8_t)floor(log2(N_info)-24) - 5; + tmp = max(3840, ((uint16_t)round(((float)N_info-24)/(1<TBS = ((uint16_t)(C*ceil((tmp+24)/(8*C))))<<3; + } + else { + if (tmp>8424) { + C = ceil((tmp+24)/8424); + harq->TBS = ((uint16_t)(C*ceil((tmp+24)/(8*C))))<<3; + } + else + harq->TBS = ((uint16_t)ceil((tmp+24)/8) - 24)<<3; + } + } +} diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 05a6b267b7..f62756bc68 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -51,6 +51,8 @@ typedef struct { uint16_t size; /// Aggregation level uint8_t L; + /// HARQ PID + uint8_t harq_pid; /// PDCCH parameters nfapi_nr_dl_config_pdcch_parameters_rel15_t pdcch_params; /// CCE list @@ -66,8 +68,8 @@ typedef struct { typedef struct { - /// Status Flag indicating for this DLSCH (idle,active,disabled) - //SCH_status_t status; + /// Nfapi DLSCH PDU + nfapi_nr_dl_config_dlsch_pdu dlsch_pdu; /// Transport block size uint32_t TBS; /// pointer to pdu from MAC interface (this is "a" in 36.212) @@ -133,7 +135,6 @@ typedef struct { /// codeword this transport block is mapped to uint8_t codeword; /// Number of codewords - uint8_t n_codewords; } NR_DL_gNB_HARQ_t; @@ -141,18 +142,6 @@ typedef struct { /// Pointers to 16 HARQ processes for the DLSCH NR_DL_gNB_HARQ_t *harq_processes[16]; - nfapi_nr_pdsch_time_domain_alloc_type_e time_alloc_type; - uint8_t time_alloc_list_flag; - uint8_t rbg_list[NR_MAX_NB_RBG]; - /// Time domain allocation - uint8_t S; - uint8_t L; - /// Freq domain allocation - uint16_t rb_start; - uint16_t n_rb; - /// BWP index - uint8_t bwp_idx; - /// TX buffers for UE-spec transmission (antenna ports 5 or 7..14, prior to precoding) int32_t *txdataF[8]; /// beamforming weights for UE-spec transmission (antenna ports 5 or 7..14), for each codeword, maximum 4 layers? diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index b7fabb1a27..53e3a14d62 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -86,6 +86,8 @@ #define NR_MAX_NB_RBG 18 #define NR_MAX_NB_LAYERS 8 +#define NR_MAX_NB_CODEWORDS 2 +#define NR_MAX_PDSCH_ENCODED_LENGTH 1000 //random typedef enum { NR_MU_0=0, @@ -116,6 +118,14 @@ typedef enum { nr_FR2 } nr_frequency_range_e; +typedef enum { + BPSK=0, + QPSK, + QAM16, + QAM64, + QAM256 +}nr_mod_t; + typedef struct { /// Size of first RBG uint8_t start_size; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c index f2c9ee8661..6758b4f019 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c @@ -30,11 +30,13 @@ #include "nr_mac_gNB.h" #include "SCHED_NR/sched_nr.h" +#include "PHY/NR_TRANSPORT/nr_dlsch.h" +#include "PHY/NR_TRANSPORT/nr_dci.h" extern RAN_CONTEXT_t RC; /*Scheduling of DLSCH with associated DCI in common search space - * current version has only a DCI for type 1 PDCCH for RA-RNTI*/ + * current version has only a DCI for type 1 PDCCH for C_RNTI*/ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) @@ -63,6 +65,12 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, nfapi_nr_dl_config_dci_dl_pdu_rel15_t *pdu_rel15 = &dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel15; nfapi_nr_dl_config_pdcch_parameters_rel15_t *params_rel15 = &dl_config_pdu->dci_dl_pdu.pdcch_params_rel15; + nfapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_pdu_rel15 = &dl_config_pdu->dlsch_pdu.dlsch_pdu_rel15; + + dlsch_pdu_rel15->start_prb = 0; + dlsch_pdu_rel15->n_prb = 40; + dlsch_pdu_rel15->S = 8; + dlsch_pdu_rel15->L = 6; nr_configure_css_dci_from_mib(&gNB->pdcch_type0_params, kHz30, kHz30, nr_FR1, 0, 0, @@ -70,8 +78,8 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, cfg->rf_config.dl_channel_bandwidth.value); memcpy((void*)params_rel15, (void*)&gNB->pdcch_type0_params, sizeof(nfapi_nr_dl_config_pdcch_parameters_rel15_t)); - pdu_rel15->frequency_domain_assignment = get_RIV(0, 40, 106); - pdu_rel15->time_domain_assignment = get_SLIV(8, 14); + pdu_rel15->frequency_domain_assignment = get_RIV(dlsch_pdu_rel15->start_prb, dlsch_pdu_rel15->n_prb, cfg->rf_config.dl_channel_bandwidth.value); + pdu_rel15->time_domain_assignment = get_SLIV(dlsch_pdu_rel15->S, dlsch_pdu_rel15->L); pdu_rel15->vrb_to_prb_mapping = 1; pdu_rel15->mcs = 12; pdu_rel15->tb_scaling = 1; @@ -92,10 +100,6 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, pdu_rel15->tb_scaling = 1; - pdu_rel15->tb_scaling = 1; - pdu_rel15->tb_scaling = 1; - pdu_rel15->tb_scaling = 1; - LOG_I(MAC, "[gNB scheduler phytest] DCI type 1 payload: freq_alloc %d, time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d\n", pdu_rel15->frequency_domain_assignment, From 8765bd9ab10296fc2aedbab3e1a80722ea9ae8ec Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Mon, 22 Oct 2018 16:39:59 +0200 Subject: [PATCH 039/117] adding nr_dlschsim for dlsch coding/decoding --- cmake_targets/CMakeLists.txt | 9 +- openair1/PHY/CODING/nr_compute_tbs.c | 56 +- openair1/PHY/CODING/nr_rate_matching.c | 3 +- openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 12 +- openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 74 +- openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c | 4 +- .../PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 72 +- .../NR_UE_TRANSPORT/nr_transport_proto_ue.h | 1 + openair1/PHY/NR_UE_TRANSPORT/pss_nr.c | 2 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 4 +- openair1/SIMULATION/NR_PHY/dlschsim.c | 668 ++++++++++++++++++ targets/RT/USER/nr-gnb.c | 30 +- targets/RT/USER/nr-ue.c | 2 +- 13 files changed, 809 insertions(+), 128 deletions(-) create mode 100644 openair1/SIMULATION/NR_PHY/dlschsim.c diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index b361f6389b..1f5109e49e 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -2534,8 +2534,13 @@ target_link_libraries(polartest SIMU PHY PHY_NR PHY_COMMON m ${ATLAS_LIBRARIES}) add_executable(ldpctest ${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/ldpctest.c) target_link_libraries(ldpctest SIMU PHY PHY_NR m ${ATLAS_LIBRARIES}) -add_executable(nr_pbchsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/pbchsim.c ) -target_link_libraries(nr_pbchsim -Wl,--start-group UTIL SIMU PHY PHY_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB ${CONFIG_LIBRARIES} -Wl,--end-group m pthread dl ${ATLAS_LIBRARIES}) +add_executable(nr_pbchsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/pbchsim.c + ${CONFIG_SOURCES}) +target_link_libraries(nr_pbchsim -Wl,--start-group UTIL SIMU PHY PHY_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB ${CONFIG_LIBRARIES} -Wl,--end-group m pthread dl rt ${CONFIG_LIBRARIES} ${ATLAS_LIBRARIES}) + +add_executable(nr_dlschsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlschsim.c + ${CONFIG_SOURCES}) +target_link_libraries(nr_dlschsim -Wl,--start-group UTIL SIMU PHY PHY_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB ${CONFIG_LIBRARIES} -Wl,--end-group m pthread dl rt ${CONFIG_LIBRARIES} ${ATLAS_LIBRARIES}) foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim syncsim) diff --git a/openair1/PHY/CODING/nr_compute_tbs.c b/openair1/PHY/CODING/nr_compute_tbs.c index ddb82fed04..c9165e3867 100644 --- a/openair1/PHY/CODING/nr_compute_tbs.c +++ b/openair1/PHY/CODING/nr_compute_tbs.c @@ -28,35 +28,8 @@ #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}}; +uint16_t Mcsindextable1[29][2] = {{2,120},{2,157},{2,193},{2,251},{2,308},{2,379},{2,449},{2,526},{2,602},{2,679},{4,340},{4,378},{4,434},{4,490},{4,553},{4,616}, + {4,658},{6,438},{6,466},{6,517},{6,567},{6,616},{6,666},{6,719},{6,772},{6,822},{6,873}, {6,910}, {6,948}}; //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}; @@ -67,8 +40,9 @@ uint32_t nr_compute_tbs(uint8_t mcs, 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; + uint16_t nbp_re, nb_re, nb_dmrs_prb, nb_rb_oh,Qm,R; + uint32_t nr_tbs=0; + double Ninfo,Np_info,n,C; nb_rb_oh = 0; //set to 0 if not configured by higher layer Qm = Mcsindextable1[mcs][0]; @@ -80,17 +54,17 @@ uint32_t nr_compute_tbs(uint8_t mcs, nb_re = min(156, nbp_re) * nb_rb; // Intermediate number of information bits - Ninfo = (nb_re * R * Qm * Nl)/1024; + Ninfo = (double)((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))); + Np_info = max(24, pow(2,n) * floor(Ninfo/pow(2,n))); for (int i=0; i= Np_info){ + if ((double)Tbstable_nr[i] >= Np_info){ nr_tbs = Tbstable_nr[i]; break; } @@ -98,19 +72,21 @@ uint32_t nr_compute_tbs(uint8_t mcs, } else { n = floor(log2(Ninfo-24)) - 5; - Np_info = max(3840, pow(n,2) * round((Ninfo - 24)/pow(n,2))); + Np_info = max(3840, pow(2,n) * round((Ninfo - 24)/pow(2,n))); - if (R <= 1024/4) { + if (R <= 256) { //1/4 C = ceil( (Np_info + 24)/3816 ); - nr_tbs = 8 * C * ceil( (Np_info + 24)/(8*C) ) - 24; + nr_tbs = (uint32_t)(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; + nr_tbs = (uint32_t)(8 * C * ceil( (Np_info + 24)/(8*C) ) - 24); + } + else { + nr_tbs = (uint32_t)(8 * ceil( (Np_info + 24)/8 ) - 24); + //printf("n %f Np_info %f pow %f ceil %f \n",n, Np_info,pow(2,6),ceil( (Np_info + 24)/8 )); } - else - nr_tbs = 8 * ceil( (Np_info + 24)/8 ) - 24; } diff --git a/openair1/PHY/CODING/nr_rate_matching.c b/openair1/PHY/CODING/nr_rate_matching.c index 19df32c246..245f3b9b75 100644 --- a/openair1/PHY/CODING/nr_rate_matching.c +++ b/openair1/PHY/CODING/nr_rate_matching.c @@ -54,7 +54,6 @@ void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, int16_t *e,int16_t *f) uint32_t EQm; EQm = E/Qm; - memset(e,0,E*sizeof(uint8_t)); for (int j = 0; j< EQm; j++){ for (int i = 0; i< Qm; i++){ @@ -108,7 +107,7 @@ uint32_t nr_rate_matching_ldpc(uint8_t Ilbrm, ind = (index_k0[BG-1][rvidx]*Ncb/N)*Z; #ifdef RM_DEBUG - printf("nr_rate_matching: E %d, k0 %d \n",E,ind); + printf("nr_rate_matching: E %d, k0 %d Cprime %d modcprime %d\n",E,ind, Cprime,((G/(Nl*Qm))%Cprime)); #endif e2 = e; diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index bba325ff08..a19900a8ba 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -53,5 +53,15 @@ uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx); /** \brief Computes available bits G. @param nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs */ -uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs,uint8_t Qm); +uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs,uint8_t Qm, uint8_t Nl); + +int nr_dlsch_encoding(PHY_VARS_gNB *gNB, + unsigned char *a, + uint16_t nb_symb_sch, + NR_gNB_DLSCH_t *dlsch, + int frame, + uint8_t subframe, + time_stats_t *rm_stats, + time_stats_t *te_stats, + time_stats_t *i_stats); diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index d9a424121d..c2f51388bd 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -162,10 +162,10 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_t if (dlsch->harq_processes[i]) { bzero(dlsch->harq_processes[i],sizeof(NR_DL_gNB_HARQ_t)); // dlsch->harq_processes[i]->first_tx=1; - dlsch->harq_processes[i]->b = (unsigned char*)malloc16(MAX_NR_ULSCH_PAYLOAD_BYTES/bw_scaling); + dlsch->harq_processes[i]->b = (unsigned char*)malloc16(MAX_NR_DLSCH_PAYLOAD_BYTES/bw_scaling); if (dlsch->harq_processes[i]->b) { - bzero(dlsch->harq_processes[i]->b,MAX_NR_ULSCH_PAYLOAD_BYTES/bw_scaling); + bzero(dlsch->harq_processes[i]->b,MAX_NR_DLSCH_PAYLOAD_BYTES/bw_scaling); } else { printf("Can't get b\n"); exit_flag=1; @@ -245,7 +245,7 @@ void clean_gNB_dlsch(NR_gNB_DLSCH_t *dlsch) int nr_dlsch_encoding(PHY_VARS_gNB *gNB, unsigned char *a, - uint8_t num_pdcch_symbols, + uint16_t nb_symb_sch, NR_gNB_DLSCH_t *dlsch, int frame, uint8_t subframe, @@ -272,9 +272,10 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB, uint32_t E; uint8_t Ilbrm = 0; uint32_t Tbslbrm = 950984; //max tbs - uint16_t nb_symb_sch =2; + //uint16_t nb_symb_sch =12; uint8_t nb_re_dmrs = 6; uint16_t length_dmrs = 1; + uint8_t *channel_input[MAX_NUM_DLSCH_SEGMENTS]; //unsigned char VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN); @@ -284,9 +285,10 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB, A = dlsch->harq_processes[harq_pid]->TBS; //printf("Encoder: A: %d frame.subframe %d.%d \n",A, frame,subframe); - mod_order = get_nr_Qm(dlsch->harq_processes[harq_pid]->mcs); + mod_order = nr_get_Qm(dlsch->harq_processes[harq_pid]->mcs,1); - G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs,mod_order); + G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs,mod_order,dlsch->harq_processes[harq_pid]->Nl); + printf("dlsch coding A %d G %d mod_order %d\n", A,G, mod_order); Tbslbrm = nr_compute_tbs(28,nb_rb,frame_parms->symbols_per_slot,0,0, dlsch->harq_processes[harq_pid]->Nl); @@ -303,12 +305,12 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB, printf("\n"); */ // Add 24-bit crc (polynomial A) to payload - crc = crc24a(a, - A)>>8; + crc = crc24a(a,A)>>8; a[A>>3] = ((uint8_t*)&crc)[2]; a[1+(A>>3)] = ((uint8_t*)&crc)[1]; a[2+(A>>3)] = ((uint8_t*)&crc)[0]; //printf("CRC %x (A %d)\n",crc,A); + //printf("a0 %d a1 %d a2 %d\n", a[A>>3], a[1+(A>>3)], a[2+(A>>3)]); dlsch->harq_processes[harq_pid]->B = A+24; // dlsch->harq_processes[harq_pid]->b = a; @@ -330,37 +332,44 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB, BG = 2; } - //printf("Encoder: B %d F %d \n",dlsch->harq_processes[harq_pid]->B, dlsch->harq_processes[harq_pid]->F); - Kr = dlsch->harq_processes[harq_pid]->K; //Kr_bytes = Kr>>3; start_meas(te_stats); for (r=0; rharq_processes[harq_pid]->C; r++) { d_tmp[r] = &dlsch->harq_processes[harq_pid]->d[r][0]; + channel_input[r] = &dlsch->harq_processes[harq_pid]->d[r][0]; #ifdef DEBUG_DLSCH_CODING + printf("Encoder: B %d F %d \n",dlsch->harq_processes[harq_pid]->B, dlsch->harq_processes[harq_pid]->F); printf("start ldpc encoder segment %d/%d\n",r,dlsch->harq_processes[harq_pid]->C); printf("input %d %d %d %d %d \n", dlsch->harq_processes[harq_pid]->c[r][0], dlsch->harq_processes[harq_pid]->c[r][1], dlsch->harq_processes[harq_pid]->c[r][2],dlsch->harq_processes[harq_pid]->c[r][3], dlsch->harq_processes[harq_pid]->c[r][4]); - /*for (int cnt =0 ; cnt < 22*(*pz); cnt ++){ + for (int cnt =0 ; cnt < 22*(*pz)/8; cnt ++){ printf("%d ", dlsch->harq_processes[harq_pid]->c[r][cnt]); - }*/ + } + printf("\n"); #endif - //ldpc_encoder_orig((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],&dlsch->harq_processes[harq_pid]->d[r][96],Kr,1,3,0); - //ldpc_encoder((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],&dlsch->harq_processes[harq_pid]->d[r][96],Kr,1,3); - //ldpc_encoder_optim((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],(unsigned char*)&dlsch->harq_processes[harq_pid]->d[r][96],Kr,1,3,NULL,NULL,NULL,NULL); + //&dlsch->harq_processes[harq_pid]->d[r][0] //channel_input[r] + //ldpc_encoder_orig((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],&dlsch->harq_processes[harq_pid]->d[r][0],Kr,1,3,0); + ldpc_encoder_orig((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],dlsch->harq_processes[harq_pid]->d[r],Kr,BG,0); + //ldpc_encoder((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],&dlsch->harq_processes[harq_pid]->d[r][0],Kr,1,3); + //ldpc_encoder_optim((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],(unsigned char*)&dlsch->harq_processes[harq_pid]->d[r][0],Kr,1,3,NULL,NULL,NULL,NULL); } - ldpc_encoder_optim_8seg(dlsch->harq_processes[harq_pid]->c,d_tmp,Kr,1,3,dlsch->harq_processes[harq_pid]->C,NULL,NULL,NULL,NULL); + //for (int i=0;i<68*384;i++) + // printf("channel_input[%d]=%d\n",i,channel_input[i]); + + + + /*printf("output %d %d %d %d %d \n", dlsch->harq_processes[harq_pid]->d[0][0], dlsch->harq_processes[harq_pid]->d[0][1], dlsch->harq_processes[harq_pid]->d[r][2],dlsch->harq_processes[harq_pid]->d[0][3], dlsch->harq_processes[harq_pid]->d[0][4]); + for (int cnt =0 ; cnt < 66*(*pz); cnt ++){ + printf("%d \n", dlsch->harq_processes[harq_pid]->d[0][cnt]); + } + printf("\n");*/ + + //ldpc_encoder_optim_8seg(dlsch->harq_processes[harq_pid]->c,d_tmp,Kr,1,3,dlsch->harq_processes[harq_pid]->C,NULL,NULL,NULL,NULL); stop_meas(te_stats); - /*printf("end ldpc encoder -- output\n"); - - - printf("output %d %d %d %d %d \n", dlsch->harq_processes[harq_pid]->d[r][0], dlsch->harq_processes[harq_pid]->d[r][1], dlsch->harq_processes[harq_pid]->d[r][2],dlsch->harq_processes[harq_pid]->d[r][3], dlsch->harq_processes[harq_pid]->d[r][4]); - for (int cnt =0 ; cnt < 66*(*pz); cnt ++){ - printf("%d \n", dlsch->harq_processes[harq_pid]->d[r][cnt]); - } - printf("\n");*/ + //printf("end ldpc encoder -- output\n"); #ifdef DEBUG_DLSCH_CODING write_output("enc_input0.m","enc_in0",&dlsch->harq_processes[harq_pid]->c[0][0],Kr_bytes,1,4); @@ -383,7 +392,7 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB, printf("rvidx in encoding = %d\n", dlsch->harq_processes[harq_pid]->rvidx); #endif - r_offset += nr_rate_matching_ldpc(Ilbrm, + E = nr_rate_matching_ldpc(Ilbrm, Tbslbrm, BG, *pz, @@ -396,18 +405,25 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB, dlsch->harq_processes[harq_pid]->Nl, r); - +#ifdef DEBUG_DLSCH_CODING + for (int i =0; i<16; i++) + printf("output ratematching e[%d]= %d r_offset %d\n", i,dlsch->harq_processes[harq_pid]->e[i], r_offset); +#endif stop_meas(rm_stats); - if (r==0) E=r_offset; - start_meas(i_stats); nr_interleaving_ldpc(E, - dlsch->harq_processes[harq_pid]->Qm, + mod_order, dlsch->harq_processes[harq_pid]->e+r_offset, dlsch->harq_processes[harq_pid]->f+r_offset); stop_meas(i_stats); + r_offset += E; +#ifdef DEBUG_DLSCH_CODING + for (int i =0; i<16; i++) + printf("output interleaving f[%d]= %d r_offset %d\n", i,dlsch->harq_processes[harq_pid]->f[i+r*r_offset], r_offset); +#endif + #ifdef DEBUG_DLSCH_CODING if (r==dlsch->harq_processes[harq_pid]->C-1) diff --git a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c index 14b06d56ce..dcb3fe1571 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c @@ -80,8 +80,8 @@ uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx) { } } -uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs, uint8_t Qm) { +uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs, uint8_t Qm, uint8_t Nl) { uint32_t G; - G = ((12*nb_symb_sch)-(nb_re_dmrs*length_dmrs))*nb_rb*Qm; + G = ((12*nb_symb_sch)-(nb_re_dmrs*length_dmrs))*nb_rb*Qm*Nl; return(G); } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index e1906011a9..1bd7f6af95 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -173,6 +173,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, NR_UE_DLSCH_t *dlsch, NR_DL_UE_HARQ_t *harq_process, uint32_t frame, + uint16_t nb_symb_sch, uint8_t nr_tti_rx, uint8_t harq_pid, uint8_t is_crnti, @@ -189,7 +190,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, uint32_t ret,offset; int32_t no_iteration_ldpc; //short dummy_w[MAX_NUM_DLSCH_SEGMENTS][3*(8448+64)]; - uint32_t r,r_offset=0,Kr,Kr_bytes,K_bytes_F,err_flag=0; + uint32_t r,r_offset=0,Kr=8424,Kr_bytes,K_bytes_F,err_flag=0; uint8_t crc_type; t_nrLDPC_dec_params decParams; t_nrLDPC_dec_params* p_decParams = &decParams; @@ -203,8 +204,8 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, uint8_t kb, kc; uint8_t Ilbrm = 0; uint32_t Tbslbrm = 950984; - uint16_t nb_rb = 106; //to update - uint16_t nb_symb_sch = 2; + uint16_t nb_rb = 30; //to update + //uint16_t nb_symb_sch = 12; uint8_t nb_re_dmrs = 6; uint16_t length_dmrs = 1; @@ -214,6 +215,8 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, __m128i *pv = (__m128i*)&z; __m128i *pl = (__m128i*)&l; + //NR_DL_UE_HARQ_t *harq_process = dlsch->harq_processes[0]; + if (!dlsch_llr) { printf("dlsch_decoding.c: NULL dlsch_llr pointer\n"); return(dlsch->max_ldpc_iterations); @@ -229,15 +232,15 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, return(dlsch->max_ldpc_iterations); } - if (nr_tti_rx> (10*frame_parms->ttis_per_subframe-1)) { + /*if (nr_tti_rx> (10*frame_parms->ttis_per_subframe-1)) { printf("dlsch_decoding.c: Illegal subframe index %d\n",nr_tti_rx); return(dlsch->max_ldpc_iterations); - } + }*/ - if (harq_process->harq_ack.ack != 2) { + /*if (harq_process->harq_ack.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, nr_tti_rx, harq_process->harq_ack.ack); - } + }*/ // nb_rb = dlsch->nb_rb; @@ -254,6 +257,8 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, } */ + nb_rb = harq_process->nb_rb; + harq_process->trials[harq_process->round]++; harq_process->TBS = nr_compute_tbs(harq_process->mcs,nb_rb,nb_symb_sch,nb_re_dmrs,length_dmrs, harq_process->Nl); @@ -261,11 +266,10 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, A = harq_process->TBS; ret = dlsch->max_ldpc_iterations; - harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, harq_process->Qm); + harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, harq_process->Qm,harq_process->Nl); 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); + //printf("DLSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_symb_sch %d \n",harq_pid,A,G, harq_process->mcs, harq_process->Nl, nb_symb_sch); if (harq_process->round == 0) { // This is a new packet, so compute quantities regarding segmentation @@ -278,10 +282,12 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, &harq_process->Z, &harq_process->F); p_decParams->Z = harq_process->Z; - //printf("dlsch decoding nr segmentation Z %d\n", p_decParams->Z); - //if (!frame%100) - //printf("K %d C %d Z %d nl %d \n", harq_process->K, harq_process->C, p_decParams->Z, harq_process->Nl); +#ifdef DEBUG_DLSCH_DECODING + printf("dlsch decoding nr segmentation Z %d\n", p_decParams->Z); + if (!frame%100) + printf("K %d C %d Z %d nl %d \n", harq_process->K, harq_process->C, p_decParams->Z, harq_process->Nl); +#endif } kb = harq_process->K/harq_process->Z; @@ -322,7 +328,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, return((1+dlsch->max_ldpc_iterations)); } #ifdef DEBUG_DLSCH_DECODING - printf("Segmentation: C %d, Cminus %d, Kminus %d, K %d\n",harq_process->C,harq_process->Cminus,harq_process->Kminus,harq_process->K); + printf("Segmentation: C %d, K %d\n",harq_process->C,harq_process->K); #endif opp_enabled=1; @@ -336,6 +342,8 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, for (r=0; rC; r++) { + printf("start rx segment %d\n",r); + #if UE_TIMING_TRACE start_meas(dlsch_rate_unmatching_stats); #endif @@ -380,11 +388,9 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, } r_offset += E; - /* - printf("Subblock deinterleaving, d %p w %p\n", - harq_process->d[r], - harq_process->w); - */ + //for (int i =0; i<16; i++) + // printf("rx output ratematching w[%d]= %d r_offset %d\n", i,harq_process->w[r][i], r_offset); + #if UE_TIMING_TRACE start_meas(dlsch_deinterleaving_stats); #endif @@ -393,6 +399,9 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, harq_process->d[r], harq_process->w[r]); + //for (int i =0; i<16; i++) + // printf("rx output interleaving d[%d]= %d r_offset %d\n", i,harq_process->d[r][i], r_offset); + #if UE_TIMING_TRACE stop_meas(dlsch_deinterleaving_stats); #endif @@ -433,23 +442,20 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, //LOG_E(PHY,"AbsSubframe %d.%d Start turbo segment %d/%d A %d ",frame%1024,nr_tti_rx,r,harq_process->C-1, A); //printf("harq process dr iteration %d\n", p_decParams->numMaxIter); - //66*p_decParams->Z - //if (A < 1000){ for (int cnt =0; cnt < (kc-2)*p_decParams->Z; cnt++){ - inv_d[cnt] = (-1)*harq_process->d[r][cnt]; + inv_d[cnt] = (1)*harq_process->d[r][cnt]; } - //} - /*for (int cnt =0; cnt < 8; cnt++){ - printf("dr %d inv_d %d \n", harq_process->d[r][96+cnt], inv_d[cnt]); + /*for (int cnt =0; cnt < 16; cnt++){ + printf("dr %d inv_d %d \n", harq_process->d[r][cnt], inv_d[cnt]); } - printf(" \n");*/ + printf(" \n"); - /*printf("end dr \n"); + printf("end dr \n"); for (int cnt =(50*p_decParams->Z-16) ; cnt < 50*p_decParams->Z; cnt++){ - printf("%d ", harq_process->d[r][96+cnt]); + printf("%d ", harq_process->d[r][cnt]); } printf(" \n");*/ @@ -457,12 +463,12 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, //memset(pl,0,2*p_decParams->Z*sizeof(int8_t)); memset((pv+K_bytes_F),127,harq_process->F*sizeof(int16_t)); - for (i=((2*p_decParams->Z)>>3), j = 0; i < K_bytes_F; i++, j++) + for (i=((2*p_decParams->Z)>>3), j = 0; i < K_bytes_F+((2*p_decParams->Z)>>3); i++, j++) { pv[i]= _mm_loadu_si128((__m128i*)(&inv_d[8*j])); } - for (i=Kr_bytes, j = K_bytes_F; i < ((kc*p_decParams->Z)>>3); i++, j++) + for (i=Kr_bytes+((2*p_decParams->Z)>>3),j=Kr_bytes; i < ((kc*p_decParams->Z)>>3); i++, j++) { pv[i]= _mm_loadu_si128((__m128i*)(&inv_d[8*j])); } @@ -497,9 +503,9 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, else { ret=2; } - if (!nb_total_decod%10000){ + //if (!nb_total_decod%10000){ printf("Error number of iteration LPDC %d %ld/%ld \n", no_iteration_ldpc, nb_error_decod,nb_total_decod);fflush(stdout); - } + //} //else //printf("OK number of iteration LPDC %d\n", no_iteration_ldpc); @@ -512,7 +518,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, #ifdef DEBUG_DLSCH_DECODING printf("output decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]); printf("no_iterations_ldpc %d (ret %d)\n",no_iteration_ldpc,ret); - write_output("dec_output.m","dec0",harq_process->c[0],Kr_bytes,1,4); + //write_output("dec_output.m","dec0",harq_process->c[0],Kr_bytes,1,4); #endif diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h index b16e5a97de..ec86a5c470 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h @@ -999,6 +999,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, NR_UE_DLSCH_t *dlsch, NR_DL_UE_HARQ_t *harq_process, uint32_t frame, + uint16_t nb_symb_sch, uint8_t nr_tti_rx, uint8_t harq_pid, uint8_t is_crnti, diff --git a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c index 969fe1b1e5..174eadf95b 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c @@ -57,7 +57,7 @@ * *********************************************************************/ -#define DBG_PSS_NR +//#define DBG_PSS_NR void *get_idft(int ofdm_symbol_size) { diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 2a6911106d..2f63b9843f 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -5761,7 +5761,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN stop_meas(&ue->pdsch_procedures_stat[ue->current_thread_id[nr_tti_rx]]); start_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[nr_tti_rx]]); #endif - /*ue_dlsch_procedures(ue, + nr_ue_dlsch_procedures(ue, proc, eNB_id, PDSCH, @@ -5769,7 +5769,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][1], &ue->dlsch_errors[eNB_id], mode, - abstraction_flag);*/ + abstraction_flag); #if UE_TIMING_TRACE stop_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[nr_tti_rx]]); #if DISABLE_LOG_X diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c new file mode 100644 index 0000000000..e435d87de7 --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/dlschsim.c @@ -0,0 +1,668 @@ +/* + * 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 +#include +#include +#include +#include + +#include "SIMULATION/TOOLS/sim.h" +#include "SIMULATION/RF/rf.h" +#include "PHY/types.h" +#include "PHY/defs_nr_common.h" +#include "PHY/defs_nr_UE.h" +#include "PHY/defs_gNB.h" +#include "PHY/NR_TRANSPORT/nr_dlsch.h" + +#include "PHY/INIT/phy_init.h" +#include "SCHED_NR/sched_nr.h" + +#include "PHY/MODULATION/modulation_common.h" +#include "common/config/config_load_configmodule.h" +#include "common/utils/LOG/log.h" +#include "UTIL/LISTS/list.h" +#include "common/ran_context.h" + +PHY_VARS_gNB *gNB; +PHY_VARS_NR_UE *UE; +RAN_CONTEXT_t RC; + + +double cpuf; + +// dummy functions +int nfapi_mode=0; +int oai_nfapi_hi_dci0_req(nfapi_hi_dci0_request_t *hi_dci0_req) { return(0);} +int oai_nfapi_tx_req(nfapi_tx_request_t *tx_req) { return(0); } + +int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req) { return(0); } + +int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req) { return(0); } + +int oai_nfapi_nr_dl_config_req(nfapi_nr_dl_config_request_t *dl_config_req) {return(0);} + +uint32_t from_earfcn(int eutra_bandP,uint32_t dl_earfcn) {return(0);} +int32_t get_uldl_offset(int eutra_bandP) {return(0);} + +NR_IF_Module_t *NR_IF_Module_init(int Mod_id){return(NULL);} + +void exit_fun(const char *s) { exit(-1); } +//extern void init_eNB_afterRU(void); + +// needed for some functions +PHY_VARS_NR_UE * PHY_vars_UE_g[1][1]={NULL}; +uint16_t n_rnti=0x1234; + +char quantize(double D,double x,unsigned char B) +{ + double qxd; + short maxlev; + qxd = floor(x/D); + + maxlev = 1<<(B-1);//(char)(pow(2,B-1)); + + //printf("x=%f,qxd=%f,maxlev=%d\n",x,qxd, maxlev); + + if (qxd <= -maxlev) + qxd = -maxlev; + else if (qxd >= maxlev) + qxd = maxlev-1; + + return((char)qxd); +} + +int main(int argc, char **argv) +{ + + char c; + + int i,j,l,aa; + double sigma2, sigma2_dB=10,SNR,SNR_lin,snr0=-2.0,snr1=2.0; + double snr_step = 0.1; + uint8_t snr1set=0; + int **txdata; + double **s_re,**s_im,**r_re,**r_im; + double iqim = 0.0; + unsigned char pbch_pdu[6]; + // int sync_pos, sync_pos_slot; + // FILE *rx_frame_file; + FILE *output_fd = NULL; + uint8_t write_output_file=0; + //int result; + int freq_offset; + // int subframe_offset; + // char fname[40], vname[40]; + int trial,n_trials=1,n_errors,n_errors2,n_alamouti; + uint8_t transmission_mode = 1,n_tx=1,n_rx=1; + uint16_t Nid_cell=0; + + channel_desc_t *gNB2UE; + uint32_t nsymb,tx_lev,tx_lev1 = 0,tx_lev2 = 0; + uint8_t extended_prefix_flag=0; + int8_t interf1=-21,interf2=-21; + + FILE *input_fd=NULL,*pbch_file_fd=NULL; + char input_val_str[50],input_val_str2[50]; + + uint8_t frame_mod4,num_pdcch_symbols = 0; + uint16_t NB_RB=25; + + SCM_t channel_model=AWGN;//Rayleigh1_anticorr; + + double pbch_sinr; + int pbch_tx_ant; + uint8_t N_RB_DL=106,mu=1; + + unsigned char frame_type = 0; + unsigned char pbch_phase = 0; + + int frame=0,subframe=0; + int frame_length_complex_samples; + int frame_length_complex_samples_no_prefix; + NR_DL_FRAME_PARMS *frame_parms; + nfapi_nr_config_request_t *gNB_config; + + uint8_t Kmimo; + uint32_t Nsoft; + double sigma; + unsigned char qbits=8; + + int ret; + + cpuf = get_cpu_freq_GHz(); + + if ( load_configmodule(argc,argv) == 0) { + exit_fun("[SOFTMODEM] Error, configuration module init failed\n"); + } + + logInit(); + randominit(0); + + while ((c = getopt (argc, argv, "f:hA:pf:g:i:j:n:s:S:t:x:y:z:N:F:GR:dP:")) != -1) { + switch (c) { + case 'f': + write_output_file=1; + output_fd = fopen(optarg,"w"); + + if (output_fd==NULL) { + printf("Error opening %s\n",optarg); + exit(-1); + } + + break; + + case 'd': + frame_type = 1; + break; + + case 'g': + switch((char)*optarg) { + case 'A': + channel_model=SCM_A; + break; + + case 'B': + channel_model=SCM_B; + break; + + case 'C': + channel_model=SCM_C; + break; + + case 'D': + channel_model=SCM_D; + break; + + case 'E': + channel_model=EPA; + break; + + case 'F': + channel_model=EVA; + break; + + case 'G': + channel_model=ETU; + break; + + default: + msg("Unsupported channel model!\n"); + exit(-1); + } + + break; + + case 'i': + interf1=atoi(optarg); + break; + + case 'j': + interf2=atoi(optarg); + break; + + case 'n': + n_trials = atoi(optarg); + break; + + case 's': + snr0 = atof(optarg); + msg("Setting SNR0 to %f\n",snr0); + break; + + case 'S': + snr1 = atof(optarg); + snr1set=1; + msg("Setting SNR1 to %f\n",snr1); + break; + + /* + case 't': + Td= atof(optarg); + break; + */ + case 'p': + extended_prefix_flag=1; + break; + + /* + case 'r': + ricean_factor = pow(10,-.1*atof(optarg)); + if (ricean_factor>1) { + printf("Ricean factor must be between 0 and 1\n"); + exit(-1); + } + break; + */ + case 'x': + transmission_mode=atoi(optarg); + + if ((transmission_mode!=1) && + (transmission_mode!=2) && + (transmission_mode!=6)) { + msg("Unsupported transmission mode %d\n",transmission_mode); + exit(-1); + } + + break; + + case 'y': + n_tx=atoi(optarg); + + if ((n_tx==0) || (n_tx>2)) { + msg("Unsupported number of tx antennas %d\n",n_tx); + exit(-1); + } + + break; + + case 'z': + n_rx=atoi(optarg); + + if ((n_rx==0) || (n_rx>2)) { + msg("Unsupported number of rx antennas %d\n",n_rx); + exit(-1); + } + + break; + + case 'N': + Nid_cell = atoi(optarg); + break; + + case 'R': + N_RB_DL = atoi(optarg); + break; + + case 'F': + input_fd = fopen(optarg,"r"); + + if (input_fd==NULL) { + printf("Problem with filename %s\n",optarg); + exit(-1); + } + + break; + + case 'P': + pbch_phase = atoi(optarg); + + if (pbch_phase>3) + printf("Illegal PBCH phase (0-3) got %d\n",pbch_phase); + + break; + + default: + case 'h': + printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n", + argv[0]); + printf("-h This message\n"); + printf("-p Use extended prefix mode\n"); + printf("-d Use TDD\n"); + printf("-n Number of frames to simulate\n"); + printf("-s Starting SNR, runs from SNR0 to SNR0 + 5 dB. If n_frames is 1 then just SNR is simulated\n"); + printf("-S Ending SNR, runs from SNR0 to SNR1\n"); + printf("-t Delay spread for multipath channel\n"); + printf("-g [A,B,C,D,E,F,G] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models (ignores delay spread and Ricean factor)\n"); + printf("-x Transmission mode (1,2,6 for the moment)\n"); + printf("-y Number of TX antennas used in eNB\n"); + printf("-z Number of RX antennas used in UE\n"); + printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n"); + printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n"); + printf("-N Nid_cell\n"); + printf("-R N_RB_DL\n"); + printf("-O oversampling factor (1,2,4,8,16)\n"); + printf("-A Interpolation_filname Run with Abstraction to generate Scatter plot using interpolation polynomial in file\n"); + // printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n"); + printf("-f Output filename (.txt format) for Pe/SNR results\n"); + printf("-F Input filename (.txt format) for RX conformance testing\n"); + exit (-1); + break; + } + } + + if (snr1set==0) + snr1 = snr0+10; + + gNB2UE = new_channel_desc_scm(n_tx, + n_rx, + channel_model, + 61.44e6, //N_RB2sampling_rate(N_RB_DL), + 40e6, //N_RB2channel_bandwidth(N_RB_DL), + 0, + 0, + 0); + + if (gNB2UE==NULL) { + msg("Problem generating channel model. Exiting.\n"); + exit(-1); + } + + RC.gNB = (PHY_VARS_gNB***) malloc(sizeof(PHY_VARS_gNB **)); + RC.gNB[0] = (PHY_VARS_gNB**) malloc(sizeof(PHY_VARS_gNB *)); + RC.gNB[0][0] = malloc(sizeof(PHY_VARS_gNB)); + gNB = RC.gNB[0][0]; + gNB_config = &gNB->gNB_config; + frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH) + frame_parms->nb_antennas_tx = n_tx; + frame_parms->nb_antennas_rx = n_rx; + frame_parms->N_RB_DL = N_RB_DL; + + crcTableInit(); + nr_phy_config_request_sim(gNB); + phy_init_nr_gNB(gNB,0,0); + //init_eNB_afterRU(); + + frame_length_complex_samples = frame_parms->samples_per_subframe; + frame_length_complex_samples_no_prefix = frame_parms->samples_per_subframe_wCP; + + s_re = malloc(2*sizeof(double*)); + s_im = malloc(2*sizeof(double*)); + r_re = malloc(2*sizeof(double*)); + r_im = malloc(2*sizeof(double*)); + txdata = malloc(2*sizeof(int*)); + + for (i=0; i<2; i++) { + + s_re[i] = malloc(frame_length_complex_samples*sizeof(double)); + bzero(s_re[i],frame_length_complex_samples*sizeof(double)); + s_im[i] = malloc(frame_length_complex_samples*sizeof(double)); + bzero(s_im[i],frame_length_complex_samples*sizeof(double)); + + r_re[i] = malloc(frame_length_complex_samples*sizeof(double)); + bzero(r_re[i],frame_length_complex_samples*sizeof(double)); + r_im[i] = malloc(frame_length_complex_samples*sizeof(double)); + bzero(r_im[i],frame_length_complex_samples*sizeof(double)); + + txdata[i] = malloc(frame_length_complex_samples*sizeof(int)); + bzero(r_re[i],frame_length_complex_samples*sizeof(int)); + + } + + if (pbch_file_fd!=NULL) { + load_pbch_desc(pbch_file_fd); + } + + for (int k=0; k<2; k++) { + // Create transport channel structures for 2 transport blocks (MIMO) + for (i=0; i<2; i++) { + gNB->dlsch[k][i] = new_gNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0,&gNB->frame_parms); + + if (!gNB->dlsch[k][i]) { + printf("Can't get eNB dlsch structures\n"); + exit(-1); + } + + gNB->dlsch[k][i]->rnti = n_rnti+k; + } + } + + + //configure UE + UE = malloc(sizeof(PHY_VARS_NR_UE)); + memcpy(&UE->frame_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS)); + //phy_init_nr_top(frame_parms); + if (init_nr_ue_signal(UE, 1, 0) != 0) + { + printf("Error at UE NR initialisation\n"); + exit(-1); + } + //nr_init_frame_parms_ue(&UE->frame_parms); + //init_nr_ue_transport(UE, 0); + for (int sf = 0; sf < 2; sf++) { + for (i=0; i<2; i++) { + UE->dlsch[sf][0][i] = new_nr_ue_dlsch(Kmimo,8,Nsoft,5,N_RB_DL,0); + + if (!UE->dlsch[sf][0][i]) { + printf("Can't get ue dlsch structures\n"); + exit(-1); + } + + UE->dlsch[sf][0][i]->rnti = n_rnti; + } + } + + UE->dlsch_SI[0] = new_nr_ue_dlsch(1,1,Nsoft,5,N_RB_DL,0); + UE->dlsch_ra[0] = new_nr_ue_dlsch(1,1,Nsoft,5,N_RB_DL,0); + + + NR_gNB_DLSCH_t *dlsch = gNB->dlsch[0][0]; + time_stats_t *rm_stats; + time_stats_t *te_stats; + time_stats_t *i_stats; + uint8_t is_crnti; + uint8_t llr8_flag; + unsigned char harq_pid = 0; //dlsch->harq_ids[subframe]; + unsigned int TBS = 8424; + unsigned int available_bits; + uint16_t nb_symb_sch =10; + uint8_t nb_re_dmrs = 6; + uint16_t length_dmrs = 1; + unsigned char mod_order; + uint16_t nb_rb = 106; + uint8_t Imcs=22; + uint8_t Nl=1; + uint8_t rvidx = 0; + + dlsch->harq_ids[subframe]= 0; + dlsch->harq_processes[0]->nb_rb = nb_rb; + dlsch->harq_processes[0]->mcs = Imcs; + dlsch->harq_processes[0]->Nl = Nl; + dlsch->harq_processes[0]->rvidx = rvidx; + + printf("dlschsim harqid %d nb_rb %d, mscs %d\n",dlsch->harq_ids[subframe], + dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->mcs,dlsch->harq_processes[0]->Nl); + + mod_order = nr_get_Qm(dlsch->harq_processes[0]->mcs,1); + available_bits = nr_get_G(dlsch->harq_processes[0]->nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs,mod_order,Nl); + TBS= nr_compute_tbs(Imcs,nb_rb,nb_symb_sch,nb_re_dmrs,length_dmrs,Nl); + printf("available bits %d TBS %d mod_order %d\n",available_bits, TBS, mod_order); + + double *modulated_input = malloc16(sizeof(double) * 16*68*384); + short *channel_output_fixed = malloc16(sizeof( short) *16* 68*384); + short *channel_output_uncoded = malloc16(sizeof(unsigned short) *16* 68*384); + double errors_bit_uncoded=0; + unsigned char *estimated_output; + unsigned char *estimated_output_bit; + unsigned char *test_input_bit; + unsigned int errors_bit =0; + + test_input_bit = (unsigned char*) malloc16(sizeof(unsigned char) * 16*68*384); + estimated_output = (unsigned char*) malloc16(sizeof(unsigned char) * 16*68*384); + estimated_output_bit = (unsigned char*) malloc16(sizeof(unsigned char) * 16*68*384); + + NR_UE_DLSCH_t *dlsch0_ue = UE->dlsch[UE->current_thread_id[subframe]][0][0]; + NR_DL_UE_HARQ_t *harq_process = dlsch0_ue->harq_processes[harq_pid]; + harq_process->mcs = Imcs; + harq_process->Nl = Nl; + harq_process->nb_rb = nb_rb; + harq_process->Qm = mod_order; + harq_process->rvidx = rvidx; + printf("harq process ue mcs = %d Qm = %d\n", harq_process->mcs, harq_process->Qm); + + unsigned char *test_input; + test_input=(unsigned char *)malloc16(sizeof(unsigned char) * TBS/8); + for (i=0; ib; + + //for (int i=0; i0x%08x\n",crc24c(test_input, 32)); + + // generate signal + if (input_fd==NULL) { + nr_dlsch_encoding(gNB, + test_input, + nb_symb_sch, + dlsch, + frame, + subframe, + rm_stats, + te_stats, + i_stats); + + } + + for (SNR=snr0;SNRharq_processes[0]->f[i]); + if (dlsch->harq_processes[0]->f[i]==0) + modulated_input[i]=1.0;///sqrt(2); //QPSK + else + modulated_input[i]=-1.0;///sqrt(2); + + //if (i<16) printf("modulated_input[%d] = %d\n",i,modulated_input[i]); + + //SNR =10; + SNR_lin = pow(10,SNR/10.0); + sigma = 1.0/sqrt(2*SNR_lin); + channel_output_fixed[i] = (short)quantize(sigma/4.0/4.0,modulated_input[i] + sigma*gaussdouble(0.0,1.0),qbits); + //channel_output_fixed[i] = (char)quantize8bit(sigma/4.0,(2.0*modulated_input[i]) - 1.0 + sigma*gaussdouble(0.0,1.0)); + //printf("llr[%d]=%d\n",i,channel_output_fixed[i]); + //printf("channel_output_fixed[%d]: %d\n",i,channel_output_fixed[i]); + + + //channel_output_fixed[i] = (char)quantize(1,channel_output_fixed[i],qbits); + + //if (i<16) printf("channel_output_fixed[%d] = %d\n",i,channel_output_fixed[i]); + + //Uncoded BER + if (channel_output_fixed[i]<0) + channel_output_uncoded[i]=1; //QPSK demod + else + channel_output_uncoded[i]=0; + + if (channel_output_uncoded[i] != dlsch->harq_processes[harq_pid]->f[i]) + errors_bit_uncoded = errors_bit_uncoded + 1; + + } + + printf("errors bits uncoded %f\n", errors_bit_uncoded); + + + #ifdef DEBUG_CODER + printf("\n"); + exit(-1); + #endif + + nr_dlsch_decoding(UE, + channel_output_fixed, + &UE->frame_parms, + dlsch0_ue, + dlsch0_ue->harq_processes[0], + frame, + nb_symb_sch, + harq_pid, + is_crnti, + llr8_flag); + + //count errors + for (i=0; i>(i&7); + test_input_bit[i] = (test_input[i/8]&(1<<(i&7)))>>(i&7); // Further correct for multiple segments + if (estimated_output_bit[i] != test_input_bit[i]) + { + errors_bit = (errors_bit) + 1; + //printf("estimated bits error occurs @%d ",i); + } + } + + printf("\n errors_bit %d \n", errors_bit); + + printf("SNR %f, BER %f \n",SNR,(float)errors_bit/(float)n_trials/(float)TBS); + } + /*LOG_M("txsigF0.m","txsF0", gNB->common_vars.txdataF[0],frame_length_complex_samples_no_prefix,1,1); + if (gNB->frame_parms.nb_antennas_tx>1) + LOG_M("txsigF1.m","txsF1", gNB->common_vars.txdataF[1],frame_length_complex_samples_no_prefix,1,1);*/ + + //TODO: loop over slots + /*for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { + if (gNB_config->subframe_config.dl_cyclic_prefix_type.value == 1) { + PHY_ofdm_mod(gNB->common_vars.txdataF[aa], + txdata[aa], + frame_parms->ofdm_symbol_size, + 12, + frame_parms->nb_prefix_samples, + CYCLIC_PREFIX); + } else { + nr_normal_prefix_mod(gNB->common_vars.txdataF[aa], + txdata[aa], + 14, + frame_parms); + } + } + + LOG_M("txsig0.m","txs0", txdata[0],frame_length_complex_samples,1,1); + if (gNB->frame_parms.nb_antennas_tx>1) + LOG_M("txsig1.m","txs1", txdata[1],frame_length_complex_samples,1,1); + + + for (i=0; inb_antennas_tx; aa++) { + r_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]); + r_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]); + } + }*/ + + + for (i=0; i<2; i++) { + printf("gNB %d\n",i); + free_gNB_dlsch(gNB->dlsch[0][i]); + printf("UE %d\n",i); + free_nr_ue_dlsch(UE->dlsch[UE->current_thread_id[subframe]][0][i]); + } + + for (i=0; i<2; i++) { + free(s_re[i]); + free(s_im[i]); + free(r_re[i]); + free(r_im[i]); + free(txdata[i]); + } + + free(s_re); + free(s_im); + free(r_re); + free(r_im); + free(txdata); + + if (write_output_file) + fclose(output_fd); + + return(n_errors); + +} + + + diff --git a/targets/RT/USER/nr-gnb.c b/targets/RT/USER/nr-gnb.c index 154e2687b1..51f2f2c177 100644 --- a/targets/RT/USER/nr-gnb.c +++ b/targets/RT/USER/nr-gnb.c @@ -726,7 +726,7 @@ void print_opp_meas(void) { print_meas(&softmodem_stats_rx_sf,"[gNB][total_phy_proc_rx]",NULL,NULL); } } -/* + void free_transport(PHY_VARS_gNB *gNB) { int i; @@ -736,20 +736,20 @@ void free_transport(PHY_VARS_gNB *gNB) LOG_I(PHY, "Freeing Transport Channel Buffers for DLSCH, UE %d\n",i); for (j=0; j<2; j++) free_gNB_dlsch(gNB->dlsch[i][j]); - LOG_I(PHY, "Freeing Transport Channel Buffer for ULSCH, UE %d\n",i); - free_gNB_ulsch(gNB->ulsch[1+i]); + //LOG_I(PHY, "Freeing Transport Channel Buffer for ULSCH, UE %d\n",i); + //free_gNB_ulsch(gNB->ulsch[1+i]); } - free_gNB_ulsch(gNB->ulsch[0]); -}*/ + //free_gNB_ulsch(gNB->ulsch[0]); +} -/* -void init_transport(PHY_VARS_gNB *gNB) { + +void init_nr_transport(PHY_VARS_gNB *gNB) { int i; int j; NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; - LOG_I(PHY, "Initialise transport\n"); + LOG_I(PHY, "Initialise nr transport\n"); for (i=0; iulsch[1+i] = new_gNB_ulsch(MAX_TURBO_ITERATIONS,fp->N_RB_UL, 0); + //LOG_I(PHY,"Allocating Transport Channel Buffer for ULSCH, UE %d\n",i); + //gNB->ulsch[1+i] = new_gNB_ulsch(MAX_TURBO_ITERATIONS,fp->N_RB_UL, 0); if (!gNB->ulsch[1+i]) { LOG_E(PHY,"Can't get gNB ulsch structures\n"); @@ -774,10 +774,10 @@ void init_transport(PHY_VARS_gNB *gNB) { // this is the transmission mode for the signalling channels // this will be overwritten with the real transmission mode by the RRC once the UE is connected - gNB->transmission_mode[i] = fp->nb_antenna_ports_gNB==1 ? 1 : 2; + //gNB->transmission_mode[i] = fp->nb_antenna_ports_gNB==1 ? 1 : 2; } // ULSCH for RA - gNB->ulsch[0] = new_gNB_ulsch(MAX_TURBO_ITERATIONS, fp->N_RB_UL, 0); + //gNB->ulsch[0] = new_gNB_ulsch(MAX_TURBO_ITERATIONS, fp->N_RB_UL, 0); if (!gNB->ulsch[0]) { LOG_E(PHY,"Can't get gNB ulsch structures\n"); @@ -804,9 +804,9 @@ void init_transport(PHY_VARS_gNB *gNB) { gNB->check_for_SUMIMO_transmissions = 0; - fp->pucch_config_common.deltaPUCCH_Shift = 1; + //fp->pucch_config_common.deltaPUCCH_Shift = 1; -} */ +} /// eNB kept in function name for nffapi calls, TO FIX void init_eNB_afterRU(void) { @@ -883,7 +883,7 @@ void init_eNB_afterRU(void) { "inst %d, CC_id %d : nb_antennas_rx %d\n",inst,CC_id,gNB->gNB_config.rf_config.tx_antenna_ports.value); LOG_I(PHY,"inst %d, CC_id %d : nb_antennas_rx %d\n",inst,CC_id,gNB->gNB_config.rf_config.tx_antenna_ports.value); /// Transport init necessary for NR synchro - //init_transport(gNB); + init_nr_transport(gNB); //init_precoding_weights(RC.gNB[inst][CC_id]); } init_gNB_proc(inst); diff --git a/targets/RT/USER/nr-ue.c b/targets/RT/USER/nr-ue.c index 23effe052c..2f1fd1037e 100644 --- a/targets/RT/USER/nr-ue.c +++ b/targets/RT/USER/nr-ue.c @@ -219,7 +219,7 @@ PHY_VARS_NR_UE* init_nr_ue_vars(NR_DL_FRAME_PARMS *frame_parms, // initialize all signal buffers init_nr_ue_signal(ue,1,abstraction_flag); // intialize transport - //init_nr_ue_transport(ue,abstraction_flag); + init_nr_ue_transport(ue,abstraction_flag); return(ue); } From 79c8d9322807d5c38c5a2f81bdb4d1a331a67af7 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Tue, 23 Oct 2018 12:14:40 +0200 Subject: [PATCH 040/117] ceil/round macros- TBS calculation corrections --- .../nfapi/public_inc/nfapi_nr_interface.h | 4 +- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 28 +++--- openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 7 +- openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c | 12 +-- openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h | 6 +- openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c | 87 ++++++++++--------- openair1/PHY/defs_common.h | 4 + openair1/PHY/defs_nr_common.h | 10 +-- 8 files changed, 84 insertions(+), 74 deletions(-) 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 a3faead178..f9154eee69 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h @@ -508,8 +508,8 @@ typedef struct { uint8_t S; uint8_t L; uint8_t Imcs; - uint8_t n_codewords; - uint8_t n_layers; + uint8_t nb_codewords; + uint8_t nb_layers; /*uint8_t R; uint8_t Qm; uint16_t TBS; diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index c38486aec0..77886beb1b 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -35,6 +35,9 @@ #define DEBUG_DLSCH +uint8_t mod_order[5] = {1, 2, 4, 6, 8}; +uint16_t mod_offset[5] = {1,3,7,23,87}; + void nr_pdsch_codeword_scrambling(uint32_t *in, uint8_t size, uint8_t q, @@ -189,11 +192,11 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, NR_DL_gNB_HARQ_t *harq = dlsch.harq_processes[dci_alloc.harq_pid]; nfapi_nr_dl_config_dlsch_pdu_rel15_t *rel15 = &harq->dlsch_pdu.dlsch_pdu_rel15; nfapi_nr_dl_config_pdcch_parameters_rel15_t pdcch_params = dci_alloc.pdcch_params; - uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH]={0}; - uint16_t mod_symbs[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>1] = {0}; + uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH]; + int16_t mod_symbs[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>1]; uint16_t tx_layers[NR_MAX_NB_LAYERS][NR_MAX_PDSCH_ENCODED_LENGTH>>1]; - uint16_t n_symbs[NR_MAX_NB_CODEWORDS] = {0}; - int8_t Wf[2], Wt[2], l0[2], delta; + uint16_t n_symbs[NR_MAX_NB_CODEWORDS]; + int8_t Wf[2], Wt[2], l0, delta; /// CRC, coding, interleaving and rate matching @@ -229,9 +232,9 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, /// DMRS QPSK modulation uint16_t n_dmrs = rel15->n_prb<<1; - uint16_t mod_dmrs[n_dmrs<<1] = {0}; + int16_t mod_dmrs[n_dmrs<<1]; uint8_t dmrs_type = config.pdsch_config.dmrs_type.value; - nr_modulation(pdsch_dmrs, n_dmrs, QPSK, mod_dmrs); + nr_modulation(pdsch_dmrs, n_dmrs, MOD_QPSK, mod_dmrs); /// Resource mapping AssertFatal(harq->Nl<=config.rf_config.tx_antenna_ports.value, "Not enough Tx antennas (%d) for %d layers\n",\ @@ -245,8 +248,8 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, for (int ap=0; apnb_layers; ap++) { // DMRS params for this ap - Wt = get_Wt(ap, dmrs_type); - Wf = get_Wf(ap, dmrs_type); + get_Wt(Wt, ap, dmrs_type); + get_Wf(Wf, ap, dmrs_type); l0 = get_l0(0, config.pdsch_config.dmrs_typeA_position.value); delta = get_delta(ap, dmrs_type); uint8_t k_prime=0, n=0, dmrs_idx=0; @@ -258,11 +261,12 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, k -= frame_parms.ofdm_symbol_size; if ((l==l0) && (k == ((dmrs_type)? (6*n+k_prime+delta):((n<<2)+(k_prime<<1)+delta)))) { - ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (Wt*Wf*amp*mod_dmrs[dmrs_idx<<1]) >> 15; - ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (Wt*Wf*amp*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15; - mod_dmrs++; + ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (Wt[k_prime]*Wf[k_prime]*amp*mod_dmrs[dmrs_idx<<1]) >> 15; + ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (Wt[k_prime]*Wf[k_prime]*amp*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15; + dmrs_idx++; n++; - k_prime = (++k_prime)&1; + k_prime++; + k_prime&=1; } ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (amp * tx_layers[ap][m<<1]) >> 15; diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index a8ecba0582..cd3640619d 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -56,9 +56,10 @@ uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx); uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx); -void nr_get_tbs(nfapi_nr_dl_config_dlsch_pdu *dlsch_pdu, - nfapi_nr_dl_config_dci_dl_pdu dci_pdu, - nfapi_nr_config_request_t config); +void nr_get_tbs(NR_gNB_DLSCH_t *dlsch, + nfapi_nr_dl_config_dci_dl_pdu dci_pdu, + nfapi_nr_config_request_t config, + uint8_t harq_pid); void nr_pdsch_codeword_scrambling(uint32_t *in, uint8_t size, diff --git a/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c index b016e4d008..df4f9716fb 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c @@ -33,8 +33,6 @@ #include "nr_sch_dmrs.h" - - /*Table 7.4.1.1.2-1 and 7.4.1.1.2-2 38211 Columns: ap - CDM group - Delta - Wf(0) - Wf(1) - Wt(0) - Wt(1)*/ int8_t pdsch_dmrs_1[8][7] = {{0,0,0,1,1,1,1}, {1,0,0,1,-1,1,1}, @@ -76,24 +74,20 @@ static inline void *get_antenna_ports(uint8_t n_symbs, uint8_t config) { return ap; } -int8_t *get_Wt(uint8_t ap, uint8_t config) { - int8_t *Wt; +void get_Wt(int8_t *Wt, uint8_t ap, uint8_t config) { for (int i=0; i<2; i++) *(Wt+i)=(config==NFAPI_NR_DMRS_TYPE1)?(pdsch_dmrs_1[ap][3+i]):(pdsch_dmrs_2[ap][3+i]); - return Wt; } -int8_t *get_Wf(uint8_t ap, uint8_t config) { - int8_t *Wf; +void *get_Wf(int8_t *Wf, uint8_t ap, uint8_t config) { for (int i=0; i<2; i++) *(Wf+i)=(config==NFAPI_NR_DMRS_TYPE1)?(pdsch_dmrs_1[ap][5+i]):(pdsch_dmrs_2[ap][5+i]); - return Wf; } uint8_t get_delta(uint8_t ap, uint8_t config) { return ((config==NFAPI_NR_DMRS_TYPE1)?(pdsch_dmrs_1[ap][2]):(pdsch_dmrs_2[ap][2])); } -uint8_t *get_l0(uint8_t config, uint8_t dmrs_typeA_position) { +uint8_t get_l0(uint8_t config, uint8_t dmrs_typeA_position) { return ((config==NFAPI_NR_DMRS_TYPE1)?dmrs_typeA_position:0); } diff --git a/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h index daec8324b0..d2dc88a407 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h +++ b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h @@ -35,10 +35,10 @@ #define NR_PDSCH_DMRS_ANTENNA_PORT0 1000 #define NR_PDSCH_DMRS_NB_ANTENNA_PORTS 12 -int8_t *get_Wt(uint8_t ap, uint8_t config); +void get_Wt(int8_t *Wt, uint8_t ap, uint8_t config); -int8_t *get_Wf(uint8_t ap, uint8_t config); +void get_Wf(int8_t *Wf, uint8_t ap, uint8_t config); uint8_t get_delta(uint8_t ap, uint8_t config); -uint8_t *get_l0(uint8_t config, uint8_t dmrs_typeA_position); +uint8_t get_l0(uint8_t config, uint8_t dmrs_typeA_position); diff --git a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c index d8b8c10c2b..48709c9dc8 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c @@ -35,9 +35,9 @@ /// Target code rate tables indexed by Imcs uint16_t nr_target_code_rate_table1[29] = {120, 157, 193, 251, 308, 379, 449, 526, 602, 679, 340, 378, 434, 490, 553, \ 616, 658, 438, 466, 517, 567, 616, 666, 719, 772, 822, 873, 910, 948}; - // The -1 values correspond to non integer factors which are handled differently for indexes 20(682.5) and 26(916.5) + // Imcs values 20 and 26 have been multiplied by 2 to avoid the floating point uint16_t nr_target_code_rate_table2[28] = {120, 193, 308, 449, 602, 378, 434, 490, 553, 616, 658, 466, 517, 567, \ - 616, 666, 719, 772, 822, 873, -1, 711, 754, 797, 841, 885, -1, 948}; + 616, 666, 719, 772, 822, 873, 1365, 711, 754, 797, 841, 885, 1833, 948}; uint16_t nr_target_code_rate_table3[29] = {30, 40, 50, 64, 78, 99, 120, 157, 193, 251, 308, 379, 449, 526, 602, 340, \ 378, 434, 490, 553, 616, 438, 466, 517, 567, 616, 666, 719, 772}; uint16_t nr_tbs_table[93] = {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, \ @@ -67,15 +67,15 @@ uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx) { uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx) { switch(table_idx) { case 1: - return (nr_target_code_rate_table1[Imcs]<<10); + return (nr_target_code_rate_table1[Imcs]); break; case 2: - return ((Imcs==20)?0xaaa00 : (Imcs==26)?0xe5200 : nr_target_code_rate_table2[Imcs]<<10); + return (nr_target_code_rate_table2[Imcs]); break; case 3: - return (nr_target_code_rate_table3[Imcs]<<10); + return (nr_target_code_rate_table3[Imcs]); break; default: @@ -87,72 +87,79 @@ static inline uint8_t is_codeword_disabled(uint8_t format, uint8_t Imcs, uint8_t return ((format==NFAPI_NR_DL_DCI_FORMAT_1_1)&&(Imcs==26)&&(rv==1)); } +static inline uint8_t get_table_idx(uint8_t mcs_table, uint8_t dci_format, uint8_t rnti_type, uint8_t ss_type) { + if ((mcs_table == NFAPI_NR_MCS_TABLE_QAM256) && (dci_format == NFAPI_NR_DL_DCI_FORMAT_1_1) && ((rnti_type==NFAPI_NR_RNTI_C)||(rnti_type==NFAPI_NR_RNTI_CS))) + return 2; + else if ((mcs_table == NFAPI_NR_MCS_TABLE_QAM64_LOW_SE) && (rnti_type!=NFAPI_NR_RNTI_new) && (rnti_type==NFAPI_NR_RNTI_C) && (ss_type==NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)) + return 3; + else if (rnti_type==NFAPI_NR_RNTI_new) + return 3; + else if ((mcs_table == NFAPI_NR_MCS_TABLE_QAM256) && (rnti_type==NFAPI_NR_RNTI_CS) && (dci_format == NFAPI_NR_DL_DCI_FORMAT_1_1)) + return 2; // Condition mcs_table not configured in sps_config necessary here but not yet implemented + /*else if((mcs_table == NFAPI_NR_MCS_TABLE_QAM64_LOW_SE) && (rnti_type==NFAPI_NR_RNTI_CS)) + * table_idx = 3; + * Note: the commented block refers to the case where the mcs_table is from sps_config*/ + else + return 1; +} + void nr_get_tbs(NR_gNB_DLSCH_t *dlsch, nfapi_nr_dl_config_dci_dl_pdu dci_pdu, - nfapi_nr_config_request_t config) { -uint8_t N_PRB_DMRS=2; // tmp hardcoding + nfapi_nr_config_request_t config, + uint8_t harq_pid) { - nfapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_rel15 = &dlsch->dlsch_pdu.dlsch_pdu_rel15; nfapi_nr_dl_config_pdcch_parameters_rel15_t params_rel15 = dci_pdu.pdcch_params_rel15; - NR_DL_gNB_HARQ_t *harq = dlsch->harq_processes[dlsch_rel15->harq_pid]; + NR_DL_gNB_HARQ_t *harq = dlsch->harq_processes[harq_pid]; + nfapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_rel15 = &harq->dlsch_pdu.dlsch_pdu_rel15; uint8_t rnti_type = params_rel15.rnti_type; uint8_t dci_format = params_rel15.dci_format; uint8_t ss_type = params_rel15.search_space_type; uint8_t N_PRB_oh = ((rnti_type==NFAPI_NR_RNTI_SI)||(rnti_type==NFAPI_NR_RNTI_RA)||(rnti_type==NFAPI_NR_RNTI_P))? 0 : \ (config.pdsch_config.x_overhead.value); + uint8_t N_PRB_DMRS = (config.pdsch_config.dmrs_type.value == NFAPI_NR_DMRS_TYPE1)?4:6; //This only works for antenna port 1000 uint8_t mcs_table = config.pdsch_config.mcs_table.value; uint8_t N_sh_symb = dlsch_rel15->L; uint8_t Imcs = dlsch_rel15->Imcs; uint16_t N_prime_RE = NR_NB_SC_PER_RB*N_sh_symb - N_PRB_DMRS - N_PRB_oh; LOG_I(MAC, "N_prime_RE %d for %d symbols %d DMRS per PRB and %d overhead\n", N_prime_RE, N_sh_symb, N_PRB_DMRS, N_PRB_oh); - uint16_t N_RE, N_info, N_info_prime; - uint8_t table_idx, R, Qm, n; - float tmp, C; // temporary N_info_prime in float to avoid back and forth casting to int + uint16_t N_RE, Ninfo, Ninfo_prime, C; + uint8_t table_idx, R, Qm, n, scale; + table_idx = get_table_idx(mcs_table, dci_format, rnti_type, ss_type); + scale = 10 + (((table_idx==2)&&((Imcs==20)||(Imcs==26)))?1:0); + N_RE = min(156, N_RE)*dlsch_rel15->n_prb; - if ((mcs_table == NFAPI_NR_MCS_TABLE_QAM256) && (dci_format == NFAPI_NR_DL_DCI_FORMAT_1_1) && ((rnti_type==NFAPI_NR_RNTI_C)||(rnti_type==NFAPI_NR_RNTI_CS))) - table_idx = 2; - else if ((mcs_table == NFAPI_NR_MCS_TABLE_QAM64_LOW_SE) && (rnti_type!=NFAPI_NR_RNTI_new) && (rnti_type==NFAPI_NR_RNTI_C) && (ss_type==NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)) - table_idx = 3; - else if (rnti_type==NFAPI_NR_RNTI_new) - table_idx = 3; - else if ((mcs_table == NFAPI_NR_MCS_TABLE_QAM256) && (rnti_type==NFAPI_NR_RNTI_CS) && (dci_format == NFAPI_NR_DL_DCI_FORMAT_1_1)) - table_idx = 2; // Condition mcs_table not configured in sps_config necessary here but not yet implemented - /*else if((mcs_table == NFAPI_NR_MCS_TABLE_QAM64_LOW_SE) && (rnti_type==NFAPI_NR_RNTI_CS)) - * table_idx = 3; - * Note: the commented block refers to the case where the mcs_table is from sps_config*/ - else - table_idx = 1; - R = nr_get_code_rate(Imcs, table_idx); Qm = nr_get_Qm(Imcs, table_idx); - N_info = N_RE*R*Qm*harq->Nl; + Ninfo = (N_RE*R*Qm*harq->Nl)>>scale; - if (N_info <= 3824) { - n = max(3, (uint8_t)(floor(log2(N_info)-6))); - N_info_prime = max(24, (N_info>>n)<>n)<= N_info_prime) { + if (nr_tbs_table[i] >= Ninfo_prime) { harq->TBS = nr_tbs_table[i]; break; } } else { - n = (uint8_t)floor(log2(N_info)-24) - 5; - tmp = max(3840, ((uint16_t)round(((float)N_info-24)/(1<TBS = ((uint16_t)(C*ceil((tmp+24)/(8*C))))<<3; + if (R<256) { + C = CEILIDIV((Ninfo_prime+24),3816); + harq->TBS = (C*CEILIDIV((Ninfo_prime+24),(C<<3)))<<3; } else { - if (tmp>8424) { - C = ceil((tmp+24)/8424); - harq->TBS = ((uint16_t)(C*ceil((tmp+24)/(8*C))))<<3; + if (Ninfo_prime>8424) { + C = CEILIDIV((Ninfo_prime+24),8424); + harq->TBS = (C*CEILIDIV((Ninfo_prime+24),(C<<3)))<<3; } else - harq->TBS = ((uint16_t)ceil((tmp+24)/8) - 24)<<3; + harq->TBS = (CEILIDIV((Ninfo_prime+24),8) - 24)<<3; } } + LOG_I(MAC, "TBS %d : N_RE %d N_PRB_DMRS %d N_sh_symb %d N_PRB_oh %d Ninfo %d Ninfo_prime %d R %d Qm %d table %d scale %d\n", + harq->TBS, N_RE, N_PRB_DMRS, N_sh_symb, N_PRB_oh, Ninfo, Ninfo_prime, R, Qm, table_idx, scale); } diff --git a/openair1/PHY/defs_common.h b/openair1/PHY/defs_common.h index fe8bf7b402..8435dd6e8c 100644 --- a/openair1/PHY/defs_common.h +++ b/openair1/PHY/defs_common.h @@ -102,6 +102,10 @@ #ifdef OCP_FRAMEWORK #include "enums.h" #else + +#define CEILIDIV(a,b) ((a+b-1)/b) +#define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1)) + typedef enum {TDD=1,FDD=0} lte_frame_type_t; typedef enum {EXTENDED=1,NORMAL=0} lte_prefix_type_t; diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 53e3a14d62..848a9a4258 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -119,11 +119,11 @@ typedef enum { } nr_frequency_range_e; typedef enum { - BPSK=0, - QPSK, - QAM16, - QAM64, - QAM256 + MOD_BPSK=0, + MOD_QPSK, + MOD_QAM16, + MOD_QAM64, + MOD_QAM256 }nr_mod_t; typedef struct { From 6de60def68fff81a6518a008c58689cb6fccb65a Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Thu, 25 Oct 2018 10:54:08 +0200 Subject: [PATCH 041/117] L2 interface changes --- cmake_targets/CMakeLists.txt | 1 + .../nfapi/public_inc/nfapi_nr_interface.h | 18 +++---- openair1/PHY/NR_TRANSPORT/nr_dci.h | 3 +- openair1/PHY/NR_TRANSPORT/nr_dci_tools.c | 15 ++++-- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 15 +++--- openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 15 +++--- openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 49 ++++++++----------- openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c | 18 +++---- openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h | 4 ++ openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c | 25 ++++++---- openair1/PHY/defs_gNB.h | 37 -------------- openair1/SCHED_NR/fapi_nr_l1.c | 2 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c | 30 ++++++------ 13 files changed, 100 insertions(+), 132 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 1f5109e49e..a263db793c 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1300,6 +1300,7 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dlsch_tools.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dlsch_coding.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_tbs_tools.c + ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_sch_dmrs.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold.c ${OPENAIR1_DIR}/PHY/TOOLS/file_output.c ${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c 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 bd3076c68b..3d39fbb10a 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h @@ -554,26 +554,24 @@ typedef struct { uint8_t freq_allocation_type; uint8_t start_prb; uint8_t n_prb; - uint8_t S; - uint8_t L; - uint8_t Imcs; + uint8_t start_symbol; + uint8_t nb_symbols; + uint8_t mcs_idx; uint8_t nb_codewords; uint8_t nb_layers; - /*uint8_t R; - uint8_t Qm; - uint16_t TBS; - uint8_t nb_layers;*/ + uint16_t coding_rate; + uint8_t modulation; + uint8_t modulation_order; + uint16_t transport_block_size; + uint8_t nb_re_dmrs; uint8_t time_alloc_list_flag; uint8_t time_alloc_list; uint8_t rbg_list; uint8_t virtual_resource_block_assignment_flag; uint32_t resource_block_coding; - uint8_t modulation; uint8_t redundancy_version; uint8_t transport_blocks; - //uint8_t transport_block_to_codeword_swap_flag; uint8_t transmission_scheme; - uint8_t number_of_layers; uint8_t number_of_subbands; uint8_t codebook_index[NFAPI_MAX_NUM_SUBBANDS]; uint8_t ue_category_capacity; diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci.h b/openair1/PHY/NR_TRANSPORT/nr_dci.h index f7c885b499..572aee653c 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dci.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dci.h @@ -51,7 +51,8 @@ void nr_fill_dci_and_dlsch(PHY_VARS_gNB *gNB, int subframe, gNB_rxtx_proc_t *proc, NR_gNB_DCI_ALLOC_t *dci_alloc, - nfapi_nr_dl_config_request_pdu_t *pdu); + nfapi_nr_dl_config_dci_dl_pdu *pdu, + nfapi_nr_dl_config_dlsch_pdu *dlsch_pdu); void nr_fill_cce_list(NR_gNB_DCI_ALLOC_t* dci_alloc, uint16_t n_shift, uint8_t m); diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c b/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c index fa729704a5..f346ebf051 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c @@ -31,6 +31,7 @@ */ #include "nr_dci.h" +#include "nr_dlsch.h" void nr_fill_cce_list(NR_gNB_DCI_ALLOC_t* dci_alloc, uint16_t n_shift, uint8_t m) { @@ -110,14 +111,15 @@ void nr_fill_dci_and_dlsch(PHY_VARS_gNB *gNB, int subframe, gNB_rxtx_proc_t *proc, NR_gNB_DCI_ALLOC_t *dci_alloc, - nfapi_nr_dl_config_request_pdu_t *pdu) + nfapi_nr_dl_config_dci_dl_pdu *pdcch_pdu, + nfapi_nr_dl_config_dlsch_pdu *dlsch_pdu) { NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; uint8_t n_shift; uint32_t *dci_pdu = dci_alloc->dci_pdu; memset((void*)dci_pdu,0,4*sizeof(uint32_t)); - nfapi_nr_dl_config_dci_dl_pdu_rel15_t *pdu_rel15 = &pdu->dci_dl_pdu.dci_dl_pdu_rel15; - nfapi_nr_dl_config_pdcch_parameters_rel15_t *params_rel15 = &pdu->dci_dl_pdu.pdcch_params_rel15; + nfapi_nr_dl_config_dci_dl_pdu_rel15_t *pdu_rel15 = &pdcch_pdu->dci_dl_pdu_rel15; + nfapi_nr_dl_config_pdcch_parameters_rel15_t *params_rel15 = &pdcch_pdu->pdcch_params_rel15; nfapi_nr_config_request_t *cfg = &gNB->gNB_config; NR_gNB_DLSCH_t *dlsch = &gNB->dlsch; NR_DL_gNB_HARQ_t **harq = dlsch->harq_processes; @@ -532,4 +534,11 @@ void nr_fill_dci_and_dlsch(PHY_VARS_gNB *gNB, nr_fill_cce_list(dci_alloc, n_shift, cand_idx); LOG_I(PHY, "DCI type %d payload (size %d) generated on candidate %d\n", dci_alloc->pdcch_params.dci_format, dci_alloc->size, cand_idx); + /// DLSCH struct + memcpy((void*)&dlsch->harq_processes[dci_alloc->harq_pid]->dlsch_pdu, (void*)dlsch_pdu, sizeof(nfapi_nr_dl_config_dlsch_pdu)); + nfapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_rel15 = &dlsch_pdu->dlsch_pdu_rel15; + nr_get_tbs(dlsch, *pdcch_pdu, *cfg, dci_alloc->harq_pid); + dlsch_rel15->nb_layers =1; + dlsch_rel15->nb_codewords = 1; + } diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 77886beb1b..56e100b04f 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -32,6 +32,7 @@ #include "nr_dlsch.h" #include "nr_dci.h" +#include "nr_sch_dmrs.h" #define DEBUG_DLSCH @@ -207,7 +208,7 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, pdcch_params.scrambling_id : config.sch_config.physical_cell_id.value; for (int q=0; qnb_codewords; q++) nr_pdsch_codeword_scrambling(harq->f, - harq->TBS, + rel15->transport_block_size, q, Nid, n_RNTI, @@ -216,8 +217,8 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, /// Modulation for (int q=0; qnb_codewords; q++) nr_pdsch_codeword_modulation(scrambled_output[q], - harq->Qm, - harq->TBS, + rel15->modulation_order, + rel15->transport_block_size, mod_symbs[q]); /// Layer mapping @@ -231,14 +232,14 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, //to be moved to init phase potentially, for now tx_layers 1-8 are mapped on antenna ports 1000-1007 /// DMRS QPSK modulation - uint16_t n_dmrs = rel15->n_prb<<1; + uint16_t n_dmrs = rel15->n_prb*rel15->nb_re_dmrs; int16_t mod_dmrs[n_dmrs<<1]; uint8_t dmrs_type = config.pdsch_config.dmrs_type.value; nr_modulation(pdsch_dmrs, n_dmrs, MOD_QPSK, mod_dmrs); /// Resource mapping - AssertFatal(harq->Nl<=config.rf_config.tx_antenna_ports.value, "Not enough Tx antennas (%d) for %d layers\n",\ - config.rf_config.tx_antenna_ports.value, harq->Nl); + AssertFatal(rel15->nb_layers<=config.rf_config.tx_antenna_ports.value, "Not enough Tx antennas (%d) for %d layers\n",\ + config.rf_config.tx_antenna_ports.value, rel15->nb_layers); // Non interleaved VRB to PRB mapping uint8_t start_sc = frame_parms.first_carrier_offset + rel15->start_prb*NR_NB_SC_PER_RB +\ @@ -255,7 +256,7 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, uint8_t k_prime=0, n=0, dmrs_idx=0; uint16_t m = 0; - for (int l=rel15->S; lL; l++) + for (int l=rel15->start_symbol; lnb_symbols; l++) for (int k=start_sc; kn_prb*NR_NB_SC_PER_RB; k++) { if (k >= frame_parms.ofdm_symbol_size) k -= frame_parms.ofdm_symbol_size; diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index ff84be68e0..a08a393ab7 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -84,12 +84,11 @@ void nr_pdsch_layer_mapping(uint16_t **mod_symbs, uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs,uint8_t Qm, uint8_t Nl); int nr_dlsch_encoding(PHY_VARS_gNB *gNB, - unsigned char *a, - uint16_t nb_symb_sch, - NR_gNB_DLSCH_t *dlsch, - int frame, - uint8_t subframe, - time_stats_t *rm_stats, - time_stats_t *te_stats, - time_stats_t *i_stats); + unsigned char *a, + NR_gNB_DLSCH_t *dlsch, + uint16_t frame, + uint8_t subframe, + time_stats_t *rm_stats, + time_stats_t *te_stats, + time_stats_t *i_stats); diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index c2f51388bd..70ea39a792 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -244,53 +244,46 @@ void clean_gNB_dlsch(NR_gNB_DLSCH_t *dlsch) } int nr_dlsch_encoding(PHY_VARS_gNB *gNB, - unsigned char *a, - uint16_t nb_symb_sch, - NR_gNB_DLSCH_t *dlsch, - int frame, - uint8_t subframe, - time_stats_t *rm_stats, - time_stats_t *te_stats, - time_stats_t *i_stats) + unsigned char *a, + NR_gNB_DLSCH_t *dlsch, + uint16_t frame, + uint8_t subframe, + time_stats_t *rm_stats, + time_stats_t *te_stats, + time_stats_t *i_stats) { unsigned int G; unsigned int crc=1; NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms; - unsigned char harq_pid = dlsch->harq_ids[subframe]; - unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb; - unsigned int A, Z; - unsigned *pz = &Z; - unsigned char mod_order; - unsigned int Kr=0,r,r_offset=0;//Kr_bytes - //unsigned short m=dlsch->harq_processes[harq_pid]->mcs; - //uint8_t beamforming_mode=0; + uint8_t harq_pid = dlsch->harq_ids[subframe]; + nfapi_nr_dl_config_dlsch_pdu_rel15_t rel15 = dlsch->harq_processes[harq_pid]->dlsch_pdu.dlsch_pdu_rel15; + uint16_t nb_rb = rel15.n_prb; + uint8_t nb_symb_sch = rel15.nb_symbols; + uint16_t A, Z; + uint16_t *pz = &Z; + uint8_t mod_order = rel15.modulation_order; + uint16_t Kr=0,r,r_offset=0;//Kr_bytes uint8_t *d_tmp[MAX_NUM_DLSCH_SEGMENTS]; //double rate = 0.33; uint8_t kb,BG=1; uint32_t E; uint8_t Ilbrm = 0; uint32_t Tbslbrm = 950984; //max tbs - //uint16_t nb_symb_sch =12; - uint8_t nb_re_dmrs = 6; + uint8_t nb_re_dmrs = rel15.nb_re_dmrs; uint16_t length_dmrs = 1; uint8_t *channel_input[MAX_NUM_DLSCH_SEGMENTS]; //unsigned char VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN); - dlsch->harq_processes[harq_pid]->TBS= nr_compute_tbs(dlsch->harq_processes[harq_pid]->mcs, - nb_rb,nb_symb_sch,nb_re_dmrs,length_dmrs, - dlsch->harq_processes[harq_pid]->Nl); - - A = dlsch->harq_processes[harq_pid]->TBS; + A = rel15.transport_block_size; //printf("Encoder: A: %d frame.subframe %d.%d \n",A, frame,subframe); - mod_order = nr_get_Qm(dlsch->harq_processes[harq_pid]->mcs,1); - G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs,mod_order,dlsch->harq_processes[harq_pid]->Nl); + G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs,mod_order,rel15.nb_layers); printf("dlsch coding A %d G %d mod_order %d\n", A,G, mod_order); - Tbslbrm = nr_compute_tbs(28,nb_rb,frame_parms->symbols_per_slot,0,0, dlsch->harq_processes[harq_pid]->Nl); + Tbslbrm = nr_compute_tbs(28,nb_rb,frame_parms->symbols_per_slot,0,0, rel15.nb_layers); // if (dlsch->harq_processes[harq_pid]->Ndi == 1) { // this is a new packet if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet @@ -400,9 +393,9 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB, dlsch->harq_processes[harq_pid]->d[r], dlsch->harq_processes[harq_pid]->e+r_offset, dlsch->harq_processes[harq_pid]->C, - dlsch->harq_processes[harq_pid]->rvidx, + rel15.redundancy_version, mod_order, - dlsch->harq_processes[harq_pid]->Nl, + rel15.nb_layers, r); #ifdef DEBUG_DLSCH_CODING diff --git a/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c index df4f9716fb..4ec1083cfc 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c @@ -36,7 +36,7 @@ /*Table 7.4.1.1.2-1 and 7.4.1.1.2-2 38211 Columns: ap - CDM group - Delta - Wf(0) - Wf(1) - Wt(0) - Wt(1)*/ int8_t pdsch_dmrs_1[8][7] = {{0,0,0,1,1,1,1}, {1,0,0,1,-1,1,1}, - {2,1,1,1,1,,1,1}, + {2,1,1,1,1,1,1}, {3,1,1,1,-1,1,1}, {4,0,0,1,1,1,-1}, {5,0,0,1,-1,1,-1}, @@ -56,22 +56,18 @@ int8_t pdsch_dmrs_2[12][7] = {{0,0,0,1,1,1,1}, {10,2,4,1,1,1,-1}, {11,2,4,1,-1,1,-1}}; -static inline void *get_l_prime(uint8_t n_symbs) { - uint8_t *l_prime; - for (int i=0; iL; - uint8_t Imcs = dlsch_rel15->Imcs; + uint8_t N_sh_symb = dlsch_rel15->nb_symbols; + uint8_t Imcs = dlsch_rel15->mcs_idx; uint16_t N_prime_RE = NR_NB_SC_PER_RB*N_sh_symb - N_PRB_DMRS - N_PRB_oh; LOG_I(MAC, "N_prime_RE %d for %d symbols %d DMRS per PRB and %d overhead\n", N_prime_RE, N_sh_symb, N_PRB_DMRS, N_PRB_oh); - uint16_t N_RE, Ninfo, Ninfo_prime, C; + uint16_t N_RE, Ninfo, Ninfo_prime, C, TBS; uint8_t table_idx, R, Qm, n, scale; table_idx = get_table_idx(mcs_table, dci_format, rnti_type, ss_type); @@ -132,14 +132,14 @@ void nr_get_tbs(NR_gNB_DLSCH_t *dlsch, N_RE = min(156, N_RE)*dlsch_rel15->n_prb; R = nr_get_code_rate(Imcs, table_idx); Qm = nr_get_Qm(Imcs, table_idx); - Ninfo = (N_RE*R*Qm*harq->Nl)>>scale; + Ninfo = (N_RE*R*Qm*dlsch_rel15->nb_layers)>>scale; if (Ninfo <= 3824) { n = max(3, (log2(Ninfo)-6)); Ninfo_prime = max(24, (Ninfo>>n)<= Ninfo_prime) { - harq->TBS = nr_tbs_table[i]; + TBS = nr_tbs_table[i]; break; } } @@ -149,24 +149,29 @@ void nr_get_tbs(NR_gNB_DLSCH_t *dlsch, if (R<256) { C = CEILIDIV((Ninfo_prime+24),3816); - harq->TBS = (C*CEILIDIV((Ninfo_prime+24),(C<<3)))<<3; + TBS = (C*CEILIDIV((Ninfo_prime+24),(C<<3)))<<3; } else { if (Ninfo_prime>8424) { C = CEILIDIV((Ninfo_prime+24),8424); - harq->TBS = (C*CEILIDIV((Ninfo_prime+24),(C<<3)))<<3; + TBS = (C*CEILIDIV((Ninfo_prime+24),(C<<3)))<<3; } else - harq->TBS = (CEILIDIV((Ninfo_prime+24),8) - 24)<<3; + TBS = (CEILIDIV((Ninfo_prime+24),8) - 24)<<3; } } LOG_I(MAC, "TBS %d : N_RE %d N_PRB_DMRS %d N_sh_symb %d N_PRB_oh %d Ninfo %d Ninfo_prime %d R %d Qm %d table %d scale %d\n", - harq->TBS, N_RE, N_PRB_DMRS, N_sh_symb, N_PRB_oh, Ninfo, Ninfo_prime, R, Qm, table_idx, scale); + TBS, N_RE, N_PRB_DMRS, N_sh_symb, N_PRB_oh, Ninfo, Ninfo_prime, R, Qm, table_idx, scale); + + dlsch_rel15->coding_rate = R; + dlsch_rel15->modulation_order = Qm; + dlsch_rel15->transport_block_size = TBS; + dlsch_rel15->nb_re_dmrs = N_PRB_DMRS; } uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs, uint8_t Qm, uint8_t Nl) { uint32_t G; - G = ((12*nb_symb_sch)-(nb_re_dmrs*length_dmrs))*nb_rb*Qm*Nl; + G = ((NR_NB_SC_PER_RB*nb_symb_sch)-(nb_re_dmrs*length_dmrs))*nb_rb*Qm*Nl; return(G); } diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index f62756bc68..da9d4443f9 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -70,8 +70,6 @@ typedef struct { typedef struct { /// Nfapi DLSCH PDU nfapi_nr_dl_config_dlsch_pdu dlsch_pdu; - /// Transport block size - uint32_t TBS; /// pointer to pdu from MAC interface (this is "a" in 36.212) uint8_t *pdu; /// The payload + CRC size in bits, "B" from 36-212 @@ -86,34 +84,8 @@ typedef struct { uint32_t subframe; /// Index of current HARQ round for this DLSCH uint8_t round; - /// Modulation order - uint8_t Qm; - /// MCS - uint8_t mcs; - /// Redundancy-version of the current sub-frame - uint8_t rvidx; /// MIMO mode for this DLSCH MIMO_mode_t mimo_mode; - /// Current RB allocation - uint32_t rb_alloc[4]; - /// distributed/localized flag - vrb_t vrb_type; - /// Current subband PMI allocation - uint16_t pmi_alloc; - /// Current subband RI allocation - uint32_t ri_alloc; - /// Current subband CQI1 allocation - uint32_t cqi_alloc1; - /// Current subband CQI2 allocation - uint32_t cqi_alloc2; - /// Current Number of RBs - uint16_t nb_rb; - /// Current NDI - uint8_t ndi; - /// downlink power offset field - uint8_t dl_power_off; - /// start symbold of pdsch - uint8_t pdsch_start; /// Concatenated sequences uint8_t e[MAX_NUM_NR_CHANNEL_BITS] __attribute__((aligned(32))); /// LDPC-code outputs @@ -126,15 +98,6 @@ typedef struct { uint32_t K; /// Number of "Filler" bits uint32_t F; - /// Number of MIMO layers (streams) - uint8_t Nl; - /// Number of layers for this PDSCH transmission (TM8-10) - uint8_t Nlayers; - /// First layer for this PSCH transmission - uint8_t first_layer; - /// codeword this transport block is mapped to - uint8_t codeword; - /// Number of codewords } NR_DL_gNB_HARQ_t; diff --git a/openair1/SCHED_NR/fapi_nr_l1.c b/openair1/SCHED_NR/fapi_nr_l1.c index e6fda71d39..1bf6286013 100644 --- a/openair1/SCHED_NR/fapi_nr_l1.c +++ b/openair1/SCHED_NR/fapi_nr_l1.c @@ -65,7 +65,7 @@ void handle_nfapi_nr_dci_dl_pdu(PHY_VARS_gNB *gNB, LOG_D(PHY,"Frame %d, Subframe %d: DCI processing - populating pdcch_vars->dci_alloc[%d] proc:subframe_tx:%d idx:%d pdcch_vars->num_dci:%d\n",frame,subframe, pdcch_vars->num_dci, proc->subframe_tx, idx, pdcch_vars->num_dci); // copy dci configuration into gNB structure - nr_fill_dci_and_dlsch(gNB,frame,subframe,proc,&pdcch_vars->dci_alloc[pdcch_vars->num_dci],dl_config_pdu); + nr_fill_dci_and_dlsch(gNB,frame,subframe,proc,&pdcch_vars->dci_alloc[pdcch_vars->num_dci],&dl_config_pdu->dci_dl_pdu, &dl_config_pdu->dlsch_pdu); LOG_D(PHY,"Frame %d, Subframe %d: DCI processing - populated pdcch_vars->dci_alloc[%d] proc:subframe_tx:%d idx:%d pdcch_vars->num_dci:%d\n",proc->frame_tx,proc->subframe_tx, pdcch_vars->num_dci, proc->subframe_tx, idx, pdcch_vars->num_dci); } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c index e562106d13..331a7fc5ce 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c @@ -49,6 +49,7 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, nfapi_nr_dl_config_request_pdu_t *dl_config_pdu; nfapi_tx_request_pdu_t *TX_req; uint16_t sfn_sf = frameP << 4 | subframeP; + uint16_t rnti = 0x1234; for (CC_id=0; CC_idstart_prb = 0; dlsch_pdu_rel15->n_prb = 40; - dlsch_pdu_rel15->S = 8; - dlsch_pdu_rel15->L = 6; + dlsch_pdu_rel15->start_symbol = 8; + dlsch_pdu_rel15->nb_symbols = 6; + dlsch_pdu_rel15->rnti = rnti; nr_configure_css_dci_from_mib(&gNB->pdcch_type0_params, kHz30, kHz30, nr_FR1, 0, 0, @@ -79,36 +81,31 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, memcpy((void*)params_rel15, (void*)&gNB->pdcch_type0_params, sizeof(nfapi_nr_dl_config_pdcch_parameters_rel15_t)); pdu_rel15->frequency_domain_assignment = get_RIV(dlsch_pdu_rel15->start_prb, dlsch_pdu_rel15->n_prb, cfg->rf_config.dl_carrier_bandwidth.value); - pdu_rel15->time_domain_assignment = get_SLIV(dlsch_pdu_rel15->S, dlsch_pdu_rel15->L); + pdu_rel15->time_domain_assignment = get_SLIV(dlsch_pdu_rel15->start_symbol, dlsch_pdu_rel15->nb_symbols); pdu_rel15->vrb_to_prb_mapping = 1; pdu_rel15->mcs = 12; pdu_rel15->tb_scaling = 1; pdu_rel15->ra_preamble_index = 25; pdu_rel15->format_indicator = 1; - pdu_rel15->ul_sul_indicator = 1; - - pdu_rel15->ss_pbch_index = 21; - pdu_rel15->prach_mask_index = 3; pdu_rel15->ndi = 1; - pdu_rel15->rv = 2; - pdu_rel15->harq_pid = 7; + pdu_rel15->rv = 0; + pdu_rel15->harq_pid = 0; pdu_rel15->dai = 2; pdu_rel15->tpc = 2; pdu_rel15->pucch_resource_indicator = 7; pdu_rel15->pdsch_to_harq_feedback_timing_indicator = 7; - - - pdu_rel15->tb_scaling = 1; - LOG_I(MAC, "[gNB scheduler phytest] DCI type 1 payload: freq_alloc %d, time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d\n", + LOG_I(MAC, "[gNB scheduler phytest] DCI type 1 payload: freq_alloc %d, time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d ndi %d rv %d\n", pdu_rel15->frequency_domain_assignment, pdu_rel15->time_domain_assignment, pdu_rel15->vrb_to_prb_mapping, pdu_rel15->mcs, - pdu_rel15->tb_scaling); + pdu_rel15->tb_scaling, + pdu_rel15->ndi, + pdu_rel15->rv); - params_rel15->rnti = 0x03; + params_rel15->rnti = rnti; params_rel15->rnti_type = NFAPI_NR_RNTI_C; params_rel15->dci_format = NFAPI_NR_DL_DCI_FORMAT_1_0; //params_rel15->aggregation_level = 1; @@ -129,7 +126,8 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, params_rel15->sfn_mod2, params_rel15->first_slot); dl_req->number_dci++; - dl_req->number_pdu++; + dl_req->number_pdsch_rnti++; + dl_req->number_pdu+=2; TX_req = &nr_mac->TX_req[CC_id].tx_request_body.tx_pdu_list[nr_mac->TX_req[CC_id].tx_request_body.number_of_pdus]; TX_req->pdu_length = 6; From 64b361aa4aea72fa40b3c7d71c47e33ea1ff5e6e Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Thu, 25 Oct 2018 14:18:10 +0200 Subject: [PATCH 042/117] Minor fixes --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 10 +++++---- openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 19 ++++++++++------ openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 25 ++++++++------------- openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c | 6 ++--- openair1/PHY/defs_gNB.h | 1 + openair1/SCHED_NR/phy_procedures_nr_gNB.c | 14 ++++++++++-- targets/RT/USER/nr-gnb.c | 6 ++--- 7 files changed, 46 insertions(+), 35 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 56e100b04f..3b68e7a15f 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -178,15 +178,16 @@ void nr_pdsch_layer_mapping(uint16_t **mod_symbs, break; default: - AsserFatal(0, "Invalid number of layers %d\n", n_layers); + AssertFatal(0, "Invalid number of layers %d\n", n_layers); } } uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, NR_gNB_DCI_ALLOC_t dci_alloc, - uint32_t *pdsch_dmrs, + uint32_t **pdsch_dmrs, int32_t** txdataF, int16_t amp, + uint8_t subframe, NR_DL_FRAME_PARMS frame_parms, nfapi_nr_config_request_t config) { @@ -200,6 +201,7 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, int8_t Wf[2], Wt[2], l0, delta; /// CRC, coding, interleaving and rate matching + nr_dlsch_encoding(0, subframe, &dlsch, &frame_parms); /// scrambling uint16_t n_RNTI = (pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)? \ @@ -235,7 +237,8 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, uint16_t n_dmrs = rel15->n_prb*rel15->nb_re_dmrs; int16_t mod_dmrs[n_dmrs<<1]; uint8_t dmrs_type = config.pdsch_config.dmrs_type.value; - nr_modulation(pdsch_dmrs, n_dmrs, MOD_QPSK, mod_dmrs); + l0 = get_l0(dmrs_type, config.pdsch_config.dmrs_typeA_position.value); + nr_modulation(pdsch_dmrs[l0], n_dmrs, MOD_QPSK, mod_dmrs); /// Resource mapping AssertFatal(rel15->nb_layers<=config.rf_config.tx_antenna_ports.value, "Not enough Tx antennas (%d) for %d layers\n",\ @@ -251,7 +254,6 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, // DMRS params for this ap get_Wt(Wt, ap, dmrs_type); get_Wf(Wf, ap, dmrs_type); - l0 = get_l0(0, config.pdsch_config.dmrs_typeA_position.value); delta = get_delta(ap, dmrs_type); uint8_t k_prime=0, n=0, dmrs_idx=0; uint16_t m = 0; diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index a08a393ab7..503475ccae 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -79,16 +79,21 @@ void nr_pdsch_layer_mapping(uint16_t **mod_symbs, uint16_t *n_symbs, uint16_t **tx_layers); +uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, + NR_gNB_DCI_ALLOC_t dci_alloc, + uint32_t **pdsch_dmrs, + int32_t** txdataF, + int16_t amp, + uint8_t subframe, + NR_DL_FRAME_PARMS frame_parms, + nfapi_nr_config_request_t config); + /** \brief Computes available bits G. @param nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs */ uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs,uint8_t Qm, uint8_t Nl); -int nr_dlsch_encoding(PHY_VARS_gNB *gNB, - unsigned char *a, - NR_gNB_DLSCH_t *dlsch, - uint16_t frame, +int nr_dlsch_encoding(unsigned char *a, uint8_t subframe, - time_stats_t *rm_stats, - time_stats_t *te_stats, - time_stats_t *i_stats); + NR_gNB_DLSCH_t *dlsch, + NR_DL_FRAME_PARMS* frame_parms); diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index 70ea39a792..8e09e24521 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -243,20 +243,15 @@ void clean_gNB_dlsch(NR_gNB_DLSCH_t *dlsch) } } -int nr_dlsch_encoding(PHY_VARS_gNB *gNB, - unsigned char *a, - NR_gNB_DLSCH_t *dlsch, - uint16_t frame, +int nr_dlsch_encoding(unsigned char *a, uint8_t subframe, - time_stats_t *rm_stats, - time_stats_t *te_stats, - time_stats_t *i_stats) + NR_gNB_DLSCH_t *dlsch, + NR_DL_FRAME_PARMS* frame_parms) { unsigned int G; unsigned int crc=1; - NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms; uint8_t harq_pid = dlsch->harq_ids[subframe]; nfapi_nr_dl_config_dlsch_pdu_rel15_t rel15 = dlsch->harq_processes[harq_pid]->dlsch_pdu.dlsch_pdu_rel15; uint16_t nb_rb = rel15.n_prb; @@ -266,7 +261,6 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB, uint8_t mod_order = rel15.modulation_order; uint16_t Kr=0,r,r_offset=0;//Kr_bytes uint8_t *d_tmp[MAX_NUM_DLSCH_SEGMENTS]; - //double rate = 0.33; uint8_t kb,BG=1; uint32_t E; uint8_t Ilbrm = 0; @@ -278,7 +272,6 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN); A = rel15.transport_block_size; - //printf("Encoder: A: %d frame.subframe %d.%d \n",A, frame,subframe); G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs,mod_order,rel15.nb_layers); printf("dlsch coding A %d G %d mod_order %d\n", A,G, mod_order); @@ -328,7 +321,7 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB, Kr = dlsch->harq_processes[harq_pid]->K; //Kr_bytes = Kr>>3; - start_meas(te_stats); + //start_meas(te_stats); for (r=0; rharq_processes[harq_pid]->C; r++) { d_tmp[r] = &dlsch->harq_processes[harq_pid]->d[r][0]; channel_input[r] = &dlsch->harq_processes[harq_pid]->d[r][0]; @@ -361,7 +354,7 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB, printf("\n");*/ //ldpc_encoder_optim_8seg(dlsch->harq_processes[harq_pid]->c,d_tmp,Kr,1,3,dlsch->harq_processes[harq_pid]->C,NULL,NULL,NULL,NULL); - stop_meas(te_stats); + //stop_meas(te_stats); //printf("end ldpc encoder -- output\n"); #ifdef DEBUG_DLSCH_CODING @@ -380,7 +373,7 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB, mod_order,nb_rb); #endif - start_meas(rm_stats); + //start_meas(rm_stats); #ifdef DEBUG_DLSCH_CODING printf("rvidx in encoding = %d\n", dlsch->harq_processes[harq_pid]->rvidx); #endif @@ -402,14 +395,14 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB, for (int i =0; i<16; i++) printf("output ratematching e[%d]= %d r_offset %d\n", i,dlsch->harq_processes[harq_pid]->e[i], r_offset); #endif - stop_meas(rm_stats); + //stop_meas(rm_stats); - start_meas(i_stats); + //start_meas(i_stats); nr_interleaving_ldpc(E, mod_order, dlsch->harq_processes[harq_pid]->e+r_offset, dlsch->harq_processes[harq_pid]->f+r_offset); - stop_meas(i_stats); + //stop_meas(i_stats); r_offset += E; #ifdef DEBUG_DLSCH_CODING diff --git a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c index dca51575e8..0a814800d2 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c @@ -120,8 +120,8 @@ void nr_get_tbs(NR_gNB_DLSCH_t *dlsch, uint8_t mcs_table = config.pdsch_config.mcs_table.value; uint8_t N_sh_symb = dlsch_rel15->nb_symbols; uint8_t Imcs = dlsch_rel15->mcs_idx; - uint16_t N_prime_RE = NR_NB_SC_PER_RB*N_sh_symb - N_PRB_DMRS - N_PRB_oh; - LOG_I(MAC, "N_prime_RE %d for %d symbols %d DMRS per PRB and %d overhead\n", N_prime_RE, N_sh_symb, N_PRB_DMRS, N_PRB_oh); + uint16_t N_RE_prime = NR_NB_SC_PER_RB*N_sh_symb - N_PRB_DMRS - N_PRB_oh; + LOG_I(MAC, "N_RE_prime %d for %d symbols %d DMRS per PRB and %d overhead\n", N_RE_prime, N_sh_symb, N_PRB_DMRS, N_PRB_oh); uint16_t N_RE, Ninfo, Ninfo_prime, C, TBS; uint8_t table_idx, R, Qm, n, scale; @@ -129,7 +129,7 @@ void nr_get_tbs(NR_gNB_DLSCH_t *dlsch, table_idx = get_table_idx(mcs_table, dci_format, rnti_type, ss_type); scale = 10 + (((table_idx==2)&&((Imcs==20)||(Imcs==26)))?1:0); - N_RE = min(156, N_RE)*dlsch_rel15->n_prb; + N_RE = min(156, N_RE_prime)*dlsch_rel15->n_prb; R = nr_get_code_rate(Imcs, table_idx); Qm = nr_get_Qm(Imcs, table_idx); Ninfo = (N_RE*R*Qm*dlsch_rel15->nb_layers)>>scale; diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index da9d4443f9..e810b7c339 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -63,6 +63,7 @@ typedef struct { typedef struct { uint8_t num_dci; + uint8_t num_pdsch_rnti; NR_gNB_DCI_ALLOC_t dci_alloc[256]; } NR_gNB_PDCCH; diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index a5a111c26d..e3a8d243f7 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -157,7 +157,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, int aa; int frame=proc->frame_tx; int subframe=proc->subframe_tx; - uint8_t num_dci=0; + uint8_t num_dci=0, num_pdsch_rnti; NR_DL_FRAME_PARMS *fp=&gNB->frame_parms; nfapi_nr_config_request_t *cfg = &gNB->gNB_config; @@ -181,18 +181,28 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, } num_dci = gNB->pdcch_vars.num_dci; + num_pdsch_rnti = gNB->pdcch_vars.num_pdsch_rnti; if (num_dci) { LOG_I(PHY, "[gNB %d] Frame %d subframe %d \ Calling nr_generate_dci_top (number of DCI %d)\n", gNB->Mod_id, frame, subframe, num_dci); uint8_t slot_idx = gNB->pdcch_vars.dci_alloc[0].pdcch_params.first_slot; - if (nfapi_mode == 0 || nfapi_mode == 1) + if (nfapi_mode == 0 || nfapi_mode == 1){ nr_generate_dci_top(gNB->pdcch_vars, gNB->nrPolar_params, gNB->nr_gold_pdcch_dmrs[slot_idx], gNB->common_vars.txdataF, AMP, *fp, *cfg); + if (num_pdsch_rnti) { + LOG_I(PHY, "PDSCH generation started (%d)\n", num_pdsch_rnti); + nr_generate_pdsch(gNB->dlsch, + gNB->pdcch_vars, + gNB->nr_gold_pdsch_dmrs[slot_idx], + gNB->common_vars.txdataF, + AMP, subframe, *fp, *cfg); + } + } } } diff --git a/targets/RT/USER/nr-gnb.c b/targets/RT/USER/nr-gnb.c index 51f2f2c177..43dcae01e6 100644 --- a/targets/RT/USER/nr-gnb.c +++ b/targets/RT/USER/nr-gnb.c @@ -759,7 +759,7 @@ void init_nr_transport(PHY_VARS_gNB *gNB) { LOG_E(PHY,"Can't get gNB dlsch structures for UE %d \n", i); exit(-1); } else { - gNB->dlsch[i][j]->rnti=0; + gNB->dlsch[i][j]->rnti=0x1234; LOG_D(PHY,"dlsch[%d][%d] => %p rnti:%d\n",i,j,gNB->dlsch[i][j], gNB->dlsch[i][j]->rnti); } } @@ -767,10 +767,10 @@ void init_nr_transport(PHY_VARS_gNB *gNB) { //LOG_I(PHY,"Allocating Transport Channel Buffer for ULSCH, UE %d\n",i); //gNB->ulsch[1+i] = new_gNB_ulsch(MAX_TURBO_ITERATIONS,fp->N_RB_UL, 0); - if (!gNB->ulsch[1+i]) { + /*if (!gNB->ulsch[1+i]) { LOG_E(PHY,"Can't get gNB ulsch structures\n"); exit(-1); - } + }*/ // this is the transmission mode for the signalling channels // this will be overwritten with the real transmission mode by the RRC once the UE is connected From b0b5068e1d23973d9183a16db933c2b0a40043f6 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Thu, 25 Oct 2018 14:29:08 +0200 Subject: [PATCH 043/117] ULSCH struct assertion --- targets/RT/USER/nr-gnb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/targets/RT/USER/nr-gnb.c b/targets/RT/USER/nr-gnb.c index 43dcae01e6..b9a21b80ff 100644 --- a/targets/RT/USER/nr-gnb.c +++ b/targets/RT/USER/nr-gnb.c @@ -779,10 +779,10 @@ void init_nr_transport(PHY_VARS_gNB *gNB) { // ULSCH for RA //gNB->ulsch[0] = new_gNB_ulsch(MAX_TURBO_ITERATIONS, fp->N_RB_UL, 0); - if (!gNB->ulsch[0]) { + /*if (!gNB->ulsch[0]) { LOG_E(PHY,"Can't get gNB ulsch structures\n"); exit(-1); - } + }*/ gNB->dlsch_SI = new_gNB_dlsch(1,8,NSOFT,fp->N_RB_DL, 0, fp); LOG_D(PHY,"gNB %d.%d : SI %p\n",gNB->Mod_id,gNB->CC_id,gNB->dlsch_SI); gNB->dlsch_ra = new_gNB_dlsch(1,8,NSOFT,fp->N_RB_DL, 0, fp); From 952ccec17d94875182804c0f1afc02993fcf0c9f Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Thu, 25 Oct 2018 19:55:48 +0200 Subject: [PATCH 044/117] scheduler corrections --- openair1/PHY/NR_TRANSPORT/nr_dci_tools.c | 8 +--- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 6 +-- openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 7 ++-- openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c | 8 ++-- openair1/SCHED_NR/fapi_nr_l1.c | 11 ++++-- openair1/SCHED_NR/fapi_nr_l1.h | 3 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c | 38 ++++++++++++++----- 7 files changed, 49 insertions(+), 32 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c b/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c index f346ebf051..ed82872113 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c @@ -62,7 +62,7 @@ void nr_fill_cce_list(NR_gNB_DCI_ALLOC_t* dci_alloc, uint16_t n_shift, uint8_t m AssertFatal(cond==0, "CCE to REG interleaving: Invalid configuration leading to non integer C\n"); C = N_reg/(bsize*R); - tmp = L * (( Y + (uint16_t)(floor((m*N_cce)/(L*M_s_max))) + n_CI ) % ((uint16_t)floor(N_cce/L))); + tmp = L * (( Y + (m*N_cce)/(L*M_s_max) + n_CI ) % (N_cce/L)); LOG_I(PHY, "CCE list generation for candidate %d: bundle size %d ilv size %d tmp %d\n", m, bsize, R, tmp); for (uint8_t cce_idx=0; cce_idxfrequency_domain_assignment>>(fsize-i-1))&1)<frequency_domain_assignment+1)&1 ==0) //fsize are all 1 38.212 p86 { printf("***************************\n"); @@ -536,9 +534,5 @@ void nr_fill_dci_and_dlsch(PHY_VARS_gNB *gNB, /// DLSCH struct memcpy((void*)&dlsch->harq_processes[dci_alloc->harq_pid]->dlsch_pdu, (void*)dlsch_pdu, sizeof(nfapi_nr_dl_config_dlsch_pdu)); - nfapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_rel15 = &dlsch_pdu->dlsch_pdu_rel15; - nr_get_tbs(dlsch, *pdcch_pdu, *cfg, dci_alloc->harq_pid); - dlsch_rel15->nb_layers =1; - dlsch_rel15->nb_codewords = 1; } diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 3b68e7a15f..7ab4456df9 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -39,7 +39,7 @@ uint8_t mod_order[5] = {1, 2, 4, 6, 8}; uint16_t mod_offset[5] = {1,3,7,23,87}; -void nr_pdsch_codeword_scrambling(uint32_t *in, +void nr_pdsch_codeword_scrambling(uint8_t *in, uint8_t size, uint8_t q, uint32_t Nid, @@ -57,7 +57,7 @@ void nr_pdsch_codeword_scrambling(uint32_t *in, s = lte_gold_generic(&x1, &x2, reset); reset = 0; } - *out ^= (((*in)>>i)&1) ^ ((s>>i)&1); + *out ^= ((in[i])&1) ^ ((s>>i)&1); } } @@ -201,7 +201,7 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, int8_t Wf[2], Wt[2], l0, delta; /// CRC, coding, interleaving and rate matching - nr_dlsch_encoding(0, subframe, &dlsch, &frame_parms); + nr_dlsch_encoding(harq->pdu, subframe, &dlsch, &frame_parms); /// scrambling uint16_t n_RNTI = (pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)? \ diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index 503475ccae..0067bf1703 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -56,12 +56,11 @@ uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx); uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx); -void nr_get_tbs(NR_gNB_DLSCH_t *dlsch, +void nr_get_tbs(nfapi_nr_dl_config_dlsch_pdu *dlsch_pdu, nfapi_nr_dl_config_dci_dl_pdu dci_pdu, - nfapi_nr_config_request_t config, - uint8_t harq_pid); + nfapi_nr_config_request_t config); -void nr_pdsch_codeword_scrambling(uint32_t *in, +void nr_pdsch_codeword_scrambling(uint8_t *in, uint8_t size, uint8_t q, uint32_t Nid, diff --git a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c index 0a814800d2..bffb9bb026 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c @@ -103,14 +103,12 @@ static inline uint8_t get_table_idx(uint8_t mcs_table, uint8_t dci_format, uint8 return 1; } -void nr_get_tbs(NR_gNB_DLSCH_t *dlsch, +void nr_get_tbs(nfapi_nr_dl_config_dlsch_pdu *dlsch_pdu, nfapi_nr_dl_config_dci_dl_pdu dci_pdu, - nfapi_nr_config_request_t config, - uint8_t harq_pid) { + nfapi_nr_config_request_t config) { nfapi_nr_dl_config_pdcch_parameters_rel15_t params_rel15 = dci_pdu.pdcch_params_rel15; - NR_DL_gNB_HARQ_t *harq = dlsch->harq_processes[harq_pid]; - nfapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_rel15 = &harq->dlsch_pdu.dlsch_pdu_rel15; + nfapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_rel15 = &dlsch_pdu->dlsch_pdu_rel15; uint8_t rnti_type = params_rel15.rnti_type; uint8_t dci_format = params_rel15.dci_format; uint8_t ss_type = params_rel15.search_space_type; diff --git a/openair1/SCHED_NR/fapi_nr_l1.c b/openair1/SCHED_NR/fapi_nr_l1.c index 1bf6286013..c985784067 100644 --- a/openair1/SCHED_NR/fapi_nr_l1.c +++ b/openair1/SCHED_NR/fapi_nr_l1.c @@ -57,7 +57,8 @@ void handle_nr_nfapi_bch_pdu(PHY_VARS_gNB *gNB, void handle_nfapi_nr_dci_dl_pdu(PHY_VARS_gNB *gNB, int frame, int subframe, gNB_rxtx_proc_t *proc, - nfapi_nr_dl_config_request_pdu_t *dl_config_pdu) + nfapi_nr_dl_config_request_pdu_t *dl_config_pdu, + nfapi_nr_dl_config_request_pdu_t *dl_config_dlsch_pdu) { int idx = subframe&1; NR_gNB_PDCCH *pdcch_vars = &gNB->pdcch_vars; @@ -65,7 +66,7 @@ void handle_nfapi_nr_dci_dl_pdu(PHY_VARS_gNB *gNB, LOG_D(PHY,"Frame %d, Subframe %d: DCI processing - populating pdcch_vars->dci_alloc[%d] proc:subframe_tx:%d idx:%d pdcch_vars->num_dci:%d\n",frame,subframe, pdcch_vars->num_dci, proc->subframe_tx, idx, pdcch_vars->num_dci); // copy dci configuration into gNB structure - nr_fill_dci_and_dlsch(gNB,frame,subframe,proc,&pdcch_vars->dci_alloc[pdcch_vars->num_dci],&dl_config_pdu->dci_dl_pdu, &dl_config_pdu->dlsch_pdu); + nr_fill_dci_and_dlsch(gNB,frame,subframe,proc,&pdcch_vars->dci_alloc[pdcch_vars->num_dci],&dl_config_pdu->dci_dl_pdu, &dl_config_dlsch_pdu->dlsch_pdu); LOG_D(PHY,"Frame %d, Subframe %d: DCI processing - populated pdcch_vars->dci_alloc[%d] proc:subframe_tx:%d idx:%d pdcch_vars->num_dci:%d\n",proc->frame_tx,proc->subframe_tx, pdcch_vars->num_dci, proc->subframe_tx, idx, pdcch_vars->num_dci); } @@ -92,6 +93,7 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){ uint8_t number_dl_pdu = DL_req->dl_config_request_body.number_pdu; nfapi_nr_dl_config_request_pdu_t *dl_config_pdu; + nfapi_nr_dl_config_request_pdu_t *dl_config_dlsch_pdu; int i; @@ -122,11 +124,14 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){ break; case NFAPI_NR_DL_CONFIG_DCI_DL_PDU_TYPE: + dl_config_dlsch_pdu = &DL_req->dl_config_request_body.dl_config_pdu_list[++i]; handle_nfapi_nr_dci_dl_pdu(gNB, frame, subframe, proc, - dl_config_pdu); + dl_config_pdu, + dl_config_dlsch_pdu); gNB->pdcch_vars.num_dci++; + gNB->pdcch_vars.num_pdsch_rnti++; do_oai=1; break; } diff --git a/openair1/SCHED_NR/fapi_nr_l1.h b/openair1/SCHED_NR/fapi_nr_l1.h index 2dd47ad806..f4c7208ee6 100644 --- a/openair1/SCHED_NR/fapi_nr_l1.h +++ b/openair1/SCHED_NR/fapi_nr_l1.h @@ -42,4 +42,5 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO); void handle_nfapi_nr_dci_dl_pdu(PHY_VARS_gNB *gNB, int frame, int subframe, gNB_rxtx_proc_t *proc, - nfapi_nr_dl_config_request_pdu_t *dl_config_pdu); + nfapi_nr_dl_config_request_pdu_t *dl_config_pdu, + nfapi_nr_dl_config_request_pdu_t *dl_config_dlsch_pdu); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c index 331a7fc5ce..365801482b 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c @@ -46,7 +46,8 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, gNB_MAC_INST *nr_mac = RC.nrmac[module_idP]; //NR_COMMON_channels_t *cc = nr_mac->common_channels; nfapi_nr_dl_config_request_body_t *dl_req; - nfapi_nr_dl_config_request_pdu_t *dl_config_pdu; + nfapi_nr_dl_config_request_pdu_t *dl_config_dci_pdu; + nfapi_nr_dl_config_request_pdu_t *dl_config_dlsch_pdu; nfapi_tx_request_pdu_t *TX_req; uint16_t sfn_sf = frameP << 4 | subframeP; uint16_t rnti = 0x1234; @@ -59,20 +60,27 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; dl_req = &nr_mac->DL_req[CC_id].dl_config_request_body; - dl_config_pdu = &dl_req->dl_config_pdu_list[dl_req->number_pdu]; - memset((void*)dl_config_pdu,0,sizeof(nfapi_nr_dl_config_request_pdu_t)); - dl_config_pdu->pdu_type = NFAPI_NR_DL_CONFIG_DCI_DL_PDU_TYPE; - dl_config_pdu->pdu_size = (uint8_t)(2+sizeof(nfapi_nr_dl_config_dci_dl_pdu)); + dl_config_dci_pdu = &dl_req->dl_config_pdu_list[dl_req->number_pdu]; + memset((void*)dl_config_dci_pdu,0,sizeof(nfapi_nr_dl_config_request_pdu_t)); + dl_config_dci_pdu->pdu_type = NFAPI_NR_DL_CONFIG_DCI_DL_PDU_TYPE; + dl_config_dci_pdu->pdu_size = (uint8_t)(2+sizeof(nfapi_nr_dl_config_dci_dl_pdu)); - nfapi_nr_dl_config_dci_dl_pdu_rel15_t *pdu_rel15 = &dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel15; - nfapi_nr_dl_config_pdcch_parameters_rel15_t *params_rel15 = &dl_config_pdu->dci_dl_pdu.pdcch_params_rel15; - nfapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_pdu_rel15 = &dl_config_pdu->dlsch_pdu.dlsch_pdu_rel15; + dl_config_dlsch_pdu = &dl_req->dl_config_pdu_list[dl_req->number_pdu+1]; + memset((void*)dl_config_dlsch_pdu,0,sizeof(nfapi_nr_dl_config_request_pdu_t)); + dl_config_dlsch_pdu->pdu_type = NFAPI_NR_DL_CONFIG_DLSCH_PDU_TYPE; + dl_config_dlsch_pdu->pdu_size = (uint8_t)(2+sizeof(nfapi_nr_dl_config_dlsch_pdu)); + + nfapi_nr_dl_config_dci_dl_pdu_rel15_t *pdu_rel15 = &dl_config_dci_pdu->dci_dl_pdu.dci_dl_pdu_rel15; + nfapi_nr_dl_config_pdcch_parameters_rel15_t *params_rel15 = &dl_config_dci_pdu->dci_dl_pdu.pdcch_params_rel15; + nfapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_pdu_rel15 = &dl_config_dlsch_pdu->dlsch_pdu.dlsch_pdu_rel15; dlsch_pdu_rel15->start_prb = 0; dlsch_pdu_rel15->n_prb = 40; dlsch_pdu_rel15->start_symbol = 8; dlsch_pdu_rel15->nb_symbols = 6; dlsch_pdu_rel15->rnti = rnti; + dlsch_pdu_rel15->nb_layers =1; + dlsch_pdu_rel15->nb_codewords = 1; nr_configure_css_dci_from_mib(&gNB->pdcch_type0_params, kHz30, kHz30, nr_FR1, 0, 0, @@ -125,6 +133,9 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, params_rel15->nb_slots, params_rel15->sfn_mod2, params_rel15->first_slot); + nr_get_tbs(&dl_config_dlsch_pdu->dlsch_pdu, dl_config_dci_pdu->dci_dl_pdu, *cfg); + //LOG_I(MAC, "DLSCH PDU: ") + dl_req->number_dci++; dl_req->number_pdsch_rnti++; dl_req->number_pdu+=2; @@ -134,7 +145,16 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, TX_req->pdu_index = nr_mac->pdu_index[CC_id]++; TX_req->num_segments = 1; TX_req->segments[0].segment_length = 8; - //TX_req->segments[0].segment_data = (uint8_t*)pdu_rel15; + nr_mac->TX_req[CC_id].tx_request_body.number_of_pdus++; + nr_mac->TX_req[CC_id].sfn_sf = sfn_sf; + nr_mac->TX_req[CC_id].tx_request_body.tl.tag = NFAPI_TX_REQUEST_BODY_TAG; + nr_mac->TX_req[CC_id].header.message_id = NFAPI_TX_REQUEST; + + TX_req = &nr_mac->TX_req[CC_id].tx_request_body.tx_pdu_list[nr_mac->TX_req[CC_id].tx_request_body.number_of_pdus+1]; + TX_req->pdu_length = dlsch_pdu_rel15->transport_block_size; + TX_req->pdu_index = nr_mac->pdu_index[CC_id]++; + TX_req->num_segments = 1; + TX_req->segments[0].segment_length = 8; nr_mac->TX_req[CC_id].tx_request_body.number_of_pdus++; nr_mac->TX_req[CC_id].sfn_sf = sfn_sf; nr_mac->TX_req[CC_id].tx_request_body.tl.tag = NFAPI_TX_REQUEST_BODY_TAG; From 541e43d94ef7353229484e1477f37df97b49d05f Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Fri, 26 Oct 2018 04:52:12 +0200 Subject: [PATCH 045/117] transport init fix --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 2 +- openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 2 +- openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c | 2 +- targets/RT/USER/nr-gnb.c | 5 +++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 7ab4456df9..7849a533d9 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -237,7 +237,7 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, uint16_t n_dmrs = rel15->n_prb*rel15->nb_re_dmrs; int16_t mod_dmrs[n_dmrs<<1]; uint8_t dmrs_type = config.pdsch_config.dmrs_type.value; - l0 = get_l0(dmrs_type, config.pdsch_config.dmrs_typeA_position.value); + l0 = get_l0(dmrs_type, 2);//config.pdsch_config.dmrs_typeA_position.value); nr_modulation(pdsch_dmrs[l0], n_dmrs, MOD_QPSK, mod_dmrs); /// Resource mapping diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index 8e09e24521..f87d19c0f3 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -152,7 +152,7 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_t } for (i=0; i<10; i++) - dlsch->harq_ids[i] = Mdlharq; + dlsch->harq_ids[i] = i; for (i=0; iharq_processes[i] = (NR_DL_gNB_HARQ_t *)malloc16(sizeof(NR_DL_gNB_HARQ_t)); diff --git a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c index bffb9bb026..5e897421ee 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c @@ -114,7 +114,7 @@ void nr_get_tbs(nfapi_nr_dl_config_dlsch_pdu *dlsch_pdu, uint8_t ss_type = params_rel15.search_space_type; uint8_t N_PRB_oh = ((rnti_type==NFAPI_NR_RNTI_SI)||(rnti_type==NFAPI_NR_RNTI_RA)||(rnti_type==NFAPI_NR_RNTI_P))? 0 : \ (config.pdsch_config.x_overhead.value); - uint8_t N_PRB_DMRS = (config.pdsch_config.dmrs_type.value == NFAPI_NR_DMRS_TYPE1)?4:6; //This only works for antenna port 1000 + uint8_t N_PRB_DMRS = (config.pdsch_config.dmrs_type.value == NFAPI_NR_DMRS_TYPE1)?6:4; //This only works for antenna port 1000 uint8_t mcs_table = config.pdsch_config.mcs_table.value; uint8_t N_sh_symb = dlsch_rel15->nb_symbols; uint8_t Imcs = dlsch_rel15->mcs_idx; diff --git a/targets/RT/USER/nr-gnb.c b/targets/RT/USER/nr-gnb.c index b9a21b80ff..4e2f1909b0 100644 --- a/targets/RT/USER/nr-gnb.c +++ b/targets/RT/USER/nr-gnb.c @@ -748,18 +748,19 @@ void init_nr_transport(PHY_VARS_gNB *gNB) { int i; int j; NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; + nfapi_nr_config_request_t *cfg = &gNB->gNB_config; LOG_I(PHY, "Initialise nr transport\n"); for (i=0; idlsch[i][j] = new_gNB_dlsch(1,8,NSOFT,fp->N_RB_DL,0,fp); + gNB->dlsch[i][j] = new_gNB_dlsch(1,16,NSOFT,cfg->rf_config.dl_carrier_bandwidth.value,0,fp); if (!gNB->dlsch[i][j]) { LOG_E(PHY,"Can't get gNB dlsch structures for UE %d \n", i); exit(-1); } else { - gNB->dlsch[i][j]->rnti=0x1234; + gNB->dlsch[i][j]->rnti=0; LOG_D(PHY,"dlsch[%d][%d] => %p rnti:%d\n",i,j,gNB->dlsch[i][j], gNB->dlsch[i][j]->rnti); } } From d0b86ede3c88911bb3db7c01e9a7964329d1a471 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Fri, 26 Oct 2018 05:42:45 +0200 Subject: [PATCH 046/117] dlsch struct fix --- openair1/PHY/NR_TRANSPORT/nr_dci_tools.c | 2 +- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c b/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c index ed82872113..3e3c28d3ae 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c @@ -121,7 +121,7 @@ void nr_fill_dci_and_dlsch(PHY_VARS_gNB *gNB, nfapi_nr_dl_config_dci_dl_pdu_rel15_t *pdu_rel15 = &pdcch_pdu->dci_dl_pdu_rel15; nfapi_nr_dl_config_pdcch_parameters_rel15_t *params_rel15 = &pdcch_pdu->pdcch_params_rel15; nfapi_nr_config_request_t *cfg = &gNB->gNB_config; - NR_gNB_DLSCH_t *dlsch = &gNB->dlsch; + NR_gNB_DLSCH_t *dlsch = &gNB->dlsch[0][0]; NR_DL_gNB_HARQ_t **harq = dlsch->harq_processes; uint16_t N_RB = fp->initial_bwp_dl.N_RB; diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index e3a8d243f7..95657dc808 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -196,7 +196,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, AMP, *fp, *cfg); if (num_pdsch_rnti) { LOG_I(PHY, "PDSCH generation started (%d)\n", num_pdsch_rnti); - nr_generate_pdsch(gNB->dlsch, + nr_generate_pdsch(*gNB->dlsch[0][0], gNB->pdcch_vars, gNB->nr_gold_pdsch_dmrs[slot_idx], gNB->common_vars.txdataF, From ddccc3d2806d9a5094a3e4d6e40afa97c29b884c Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Fri, 26 Oct 2018 10:45:29 +0200 Subject: [PATCH 047/117] minor fix --- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 95657dc808..bc7d2bb1be 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -196,7 +196,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, AMP, *fp, *cfg); if (num_pdsch_rnti) { LOG_I(PHY, "PDSCH generation started (%d)\n", num_pdsch_rnti); - nr_generate_pdsch(*gNB->dlsch[0][0], + nr_generate_pdsch(*(gNB->dlsch[0][0]), gNB->pdcch_vars, gNB->nr_gold_pdsch_dmrs[slot_idx], gNB->common_vars.txdataF, From ff853139783677ea6d6c2d45a6b30a99625e9b8b Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Fri, 26 Oct 2018 16:33:09 +0200 Subject: [PATCH 048/117] Transport init --- openair1/PHY/INIT/nr_init.c | 3 +++ openair1/PHY/NR_TRANSPORT/nr_dci_tools.c | 2 +- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 2 +- targets/RT/USER/nr-gnb.c | 2 -- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index eccb10f7b4..4f16190158 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -38,6 +38,7 @@ extern uint32_t from_earfcn(int eutra_bandP,uint32_t dl_earfcn); extern int32_t get_uldl_offset(int eutra_bandP); +extern void init_nr_transport(PHY_VARS_gNB *gNB); int l1_north_init_gNB() { @@ -152,6 +153,8 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, } nr_init_pdsch_dmrs(gNB, cfg->sch_config.physical_cell_id.value); + /// Transport init necessary for NR synchro + init_nr_transport(gNB); /* lte_gold(fp,gNB->lte_gold_table,fp->Nid_cell); diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c b/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c index 3e3c28d3ae..fd8f8a826b 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c @@ -533,6 +533,6 @@ void nr_fill_dci_and_dlsch(PHY_VARS_gNB *gNB, LOG_I(PHY, "DCI type %d payload (size %d) generated on candidate %d\n", dci_alloc->pdcch_params.dci_format, dci_alloc->size, cand_idx); /// DLSCH struct - memcpy((void*)&dlsch->harq_processes[dci_alloc->harq_pid]->dlsch_pdu, (void*)dlsch_pdu, sizeof(nfapi_nr_dl_config_dlsch_pdu)); + memcpy((void*)&harq[dci_alloc->harq_pid]->dlsch_pdu, (void*)dlsch_pdu, sizeof(nfapi_nr_dl_config_dlsch_pdu)); } diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index bc7d2bb1be..95657dc808 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -196,7 +196,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, AMP, *fp, *cfg); if (num_pdsch_rnti) { LOG_I(PHY, "PDSCH generation started (%d)\n", num_pdsch_rnti); - nr_generate_pdsch(*(gNB->dlsch[0][0]), + nr_generate_pdsch(*gNB->dlsch[0][0], gNB->pdcch_vars, gNB->nr_gold_pdsch_dmrs[slot_idx], gNB->common_vars.txdataF, diff --git a/targets/RT/USER/nr-gnb.c b/targets/RT/USER/nr-gnb.c index 4e2f1909b0..327639656a 100644 --- a/targets/RT/USER/nr-gnb.c +++ b/targets/RT/USER/nr-gnb.c @@ -883,8 +883,6 @@ void init_eNB_afterRU(void) { AssertFatal(gNB->gNB_config.rf_config.tx_antenna_ports.value >0, "inst %d, CC_id %d : nb_antennas_rx %d\n",inst,CC_id,gNB->gNB_config.rf_config.tx_antenna_ports.value); LOG_I(PHY,"inst %d, CC_id %d : nb_antennas_rx %d\n",inst,CC_id,gNB->gNB_config.rf_config.tx_antenna_ports.value); -/// Transport init necessary for NR synchro - init_nr_transport(gNB); //init_precoding_weights(RC.gNB[inst][CC_id]); } init_gNB_proc(inst); From 2733425f566e42938f412b105ce64d28d6cac8bc Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Sun, 28 Oct 2018 14:22:16 +0100 Subject: [PATCH 049/117] HARQ PDU malloc --- openair1/PHY/NR_TRANSPORT/nr_dci_tools.c | 2 +- openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c b/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c index fd8f8a826b..1c7f4642fb 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c @@ -121,7 +121,7 @@ void nr_fill_dci_and_dlsch(PHY_VARS_gNB *gNB, nfapi_nr_dl_config_dci_dl_pdu_rel15_t *pdu_rel15 = &pdcch_pdu->dci_dl_pdu_rel15; nfapi_nr_dl_config_pdcch_parameters_rel15_t *params_rel15 = &pdcch_pdu->pdcch_params_rel15; nfapi_nr_config_request_t *cfg = &gNB->gNB_config; - NR_gNB_DLSCH_t *dlsch = &gNB->dlsch[0][0]; + NR_gNB_DLSCH_t *dlsch = gNB->dlsch[0][0]; NR_DL_gNB_HARQ_t **harq = dlsch->harq_processes; uint16_t N_RB = fp->initial_bwp_dl.N_RB; diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index f87d19c0f3..2de2b724fd 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -154,6 +154,7 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_t for (i=0; i<10; i++) dlsch->harq_ids[i] = i; + for (i=0; iharq_processes[i] = (NR_DL_gNB_HARQ_t *)malloc16(sizeof(NR_DL_gNB_HARQ_t)); LOG_T(PHY, "Required mem size %d (bw scaling %d), dlsch->harq_processes[%d] %p\n", @@ -163,6 +164,13 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_t bzero(dlsch->harq_processes[i],sizeof(NR_DL_gNB_HARQ_t)); // dlsch->harq_processes[i]->first_tx=1; dlsch->harq_processes[i]->b = (unsigned char*)malloc16(MAX_NR_DLSCH_PAYLOAD_BYTES/bw_scaling); + dlsch->harq_processes[i]->pdu = (uint8_t*)malloc16(MAX_NR_DLSCH_PAYLOAD_BYTES/bw_scaling); + if (dlsch->harq_processes[i]->pdu) { + bzero(dlsch->harq_processes[i]->pdu,MAX_NR_DLSCH_PAYLOAD_BYTES/bw_scaling); + } else { + printf("Can't allocate PDU\n"); + exit_flag=1; + } if (dlsch->harq_processes[i]->b) { bzero(dlsch->harq_processes[i]->b,MAX_NR_DLSCH_PAYLOAD_BYTES/bw_scaling); From 1c2c853b8ec95e4d1e6a68e267018fb1745ec38c Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Mon, 29 Oct 2018 12:21:32 +0100 Subject: [PATCH 050/117] DCI alloc fix --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 2 +- openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 2 +- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 7849a533d9..6087e92b37 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -34,7 +34,7 @@ #include "nr_dci.h" #include "nr_sch_dmrs.h" -#define DEBUG_DLSCH +//#define DEBUG_DLSCH uint8_t mod_order[5] = {1, 2, 4, 6, 8}; uint16_t mod_offset[5] = {1,3,7,23,87}; diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index 2de2b724fd..9d1d7bfa90 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -152,7 +152,7 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_t } for (i=0; i<10; i++) - dlsch->harq_ids[i] = i; + dlsch->harq_ids[i] = 0; for (i=0; idlsch[0][0], - gNB->pdcch_vars, + gNB->pdcch_vars.dci_alloc[0], gNB->nr_gold_pdsch_dmrs[slot_idx], gNB->common_vars.txdataF, AMP, subframe, *fp, *cfg); From 8596ae69e82c0684f3f63fbf513bed0f52a77d58 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Mon, 29 Oct 2018 12:22:40 +0100 Subject: [PATCH 051/117] Subframe 0 Tx --- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index f0cde5634b..a4720ebe74 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -183,7 +183,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, num_dci = gNB->pdcch_vars.num_dci; num_pdsch_rnti = gNB->pdcch_vars.num_pdsch_rnti; - if (num_dci) { + if (num_dci && (subframe==0)) { LOG_I(PHY, "[gNB %d] Frame %d subframe %d \ Calling nr_generate_dci_top (number of DCI %d)\n", gNB->Mod_id, frame, subframe, num_dci); From fe0ae01419ddc7f99dab805757b543602d3f502a Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Mon, 29 Oct 2018 12:25:43 +0100 Subject: [PATCH 052/117] Write to file removals --- targets/RT/USER/nr-ru.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/targets/RT/USER/nr-ru.c b/targets/RT/USER/nr-ru.c index 802fe3fdfc..89e811761f 100644 --- a/targets/RT/USER/nr-ru.c +++ b/targets/RT/USER/nr-ru.c @@ -806,10 +806,10 @@ void tx_rf(RU_t *ru) { for (i=0; inb_tx; i++) txp[i] = (void*)&ru->common.txdata[i][(proc->subframe_tx*fp->samples_per_subframe)-sf_extension]; - if (proc->subframe_tx == 0){ + /*if (proc->subframe_tx == 0){ write_output("txdataF_frame.m","txdataF_frame",&ru->common.txdataF_BF[i],fp->samples_per_subframe_wCP, 1, 1); write_output("txdata_frame.m","txdata_frame",&ru->common.txdata[i],fp->samples_per_subframe, 1, 1); - } + }*/ VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx-ru->openair0_cfg.tx_sample_advance)&0xffffffff ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); From 8855ca03d371cfe4d1e212dc98bda9905b49afbf Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Mon, 29 Oct 2018 14:36:12 +0100 Subject: [PATCH 053/117] new scheduling params --- nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h | 1 + openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) 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 3d39fbb10a..e7cd720e80 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h @@ -557,6 +557,7 @@ typedef struct { uint8_t start_symbol; uint8_t nb_symbols; uint8_t mcs_idx; + uint8_t ndi; uint8_t nb_codewords; uint8_t nb_layers; uint16_t coding_rate; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c index 365801482b..308e261a7a 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c @@ -75,12 +75,15 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, nfapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_pdu_rel15 = &dl_config_dlsch_pdu->dlsch_pdu.dlsch_pdu_rel15; dlsch_pdu_rel15->start_prb = 0; - dlsch_pdu_rel15->n_prb = 40; + dlsch_pdu_rel15->n_prb = 106; dlsch_pdu_rel15->start_symbol = 8; dlsch_pdu_rel15->nb_symbols = 6; dlsch_pdu_rel15->rnti = rnti; dlsch_pdu_rel15->nb_layers =1; dlsch_pdu_rel15->nb_codewords = 1; + dlsch_pdu_rel15->mcs_idx = 26; + dlsch_pdu_rel15->ndi = 1; + dlsch_pdu_rel15->redundancy_version = 0; nr_configure_css_dci_from_mib(&gNB->pdcch_type0_params, kHz30, kHz30, nr_FR1, 0, 0, @@ -91,7 +94,7 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, pdu_rel15->frequency_domain_assignment = get_RIV(dlsch_pdu_rel15->start_prb, dlsch_pdu_rel15->n_prb, cfg->rf_config.dl_carrier_bandwidth.value); pdu_rel15->time_domain_assignment = get_SLIV(dlsch_pdu_rel15->start_symbol, dlsch_pdu_rel15->nb_symbols); pdu_rel15->vrb_to_prb_mapping = 1; - pdu_rel15->mcs = 12; + pdu_rel15->mcs = 26; pdu_rel15->tb_scaling = 1; pdu_rel15->ra_preamble_index = 25; From afd348169839af3f35724f5fe64f8a776b38bee3 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Mon, 29 Oct 2018 15:58:10 +0100 Subject: [PATCH 054/117] Debug info --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 30 +++++++++++++++++++----- openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c | 4 ++-- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 6087e92b37..91aacad07d 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -34,7 +34,7 @@ #include "nr_dci.h" #include "nr_sch_dmrs.h" -//#define DEBUG_DLSCH +#define DEBUG_DLSCH uint8_t mod_order[5] = {1, 2, 4, 6, 8}; uint16_t mod_offset[5] = {1,3,7,23,87}; @@ -197,8 +197,10 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH]; int16_t mod_symbs[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>1]; uint16_t tx_layers[NR_MAX_NB_LAYERS][NR_MAX_PDSCH_ENCODED_LENGTH>>1]; - uint16_t n_symbs[NR_MAX_NB_CODEWORDS]; + uint16_t n_symbs; int8_t Wf[2], Wt[2], l0, delta; + uint16_t TBS = rel15->transport_block_size; + uint8_t Qm = rel15->modulation_order; /// CRC, coding, interleaving and rate matching nr_dlsch_encoding(harq->pdu, subframe, &dlsch, &frame_parms); @@ -210,18 +212,34 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, pdcch_params.scrambling_id : config.sch_config.physical_cell_id.value; for (int q=0; qnb_codewords; q++) nr_pdsch_codeword_scrambling(harq->f, - rel15->transport_block_size, + TBS, q, Nid, n_RNTI, scrambled_output[q]); +#ifdef DEBUG_DLSCH +printf("PDSCH Scrambling(TBS %d): before \t after \n", TBS); +for (int i=0; if[i], scrambled_output[0][i]); +} +#endif + /// Modulation + n_symbs = TBS/Qm; for (int q=0; qnb_codewords; q++) nr_pdsch_codeword_modulation(scrambled_output[q], - rel15->modulation_order, - rel15->transport_block_size, + Qm, + TBS, mod_symbs[q]); +#ifdef DEBUG_DLSCH +printf("PDSCH Modulation: Qm %d()\n", Qm, n_symbs); +for (int i=0; i>1, 1, 1); + write_output("txdataF_dlsch.m", "txdataF_dlsch", txdataF[0], frame_parms.samples_per_subframe_wCP>>1, 1, 1); #endif return 0; diff --git a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c index 5e897421ee..0e74b8d5ac 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c @@ -121,8 +121,8 @@ void nr_get_tbs(nfapi_nr_dl_config_dlsch_pdu *dlsch_pdu, uint16_t N_RE_prime = NR_NB_SC_PER_RB*N_sh_symb - N_PRB_DMRS - N_PRB_oh; LOG_I(MAC, "N_RE_prime %d for %d symbols %d DMRS per PRB and %d overhead\n", N_RE_prime, N_sh_symb, N_PRB_DMRS, N_PRB_oh); - uint16_t N_RE, Ninfo, Ninfo_prime, C, TBS; - uint8_t table_idx, R, Qm, n, scale; + uint16_t N_RE, Ninfo, Ninfo_prime, C, TBS, R; + uint8_t table_idx, Qm, n, scale; table_idx = get_table_idx(mcs_table, dci_format, rnti_type, ss_type); scale = 10 + (((table_idx==2)&&((Imcs==20)||(Imcs==26)))?1:0); From 25e9f02e8c0e31ad796144252b875ee718ce7682 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Mon, 29 Oct 2018 16:13:19 +0100 Subject: [PATCH 055/117] n_symbs update --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 10 ++++++---- openair1/PHY/defs_nr_common.h | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 91aacad07d..a011b9a118 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -114,13 +114,13 @@ void nr_pdsch_codeword_modulation(uint32_t *in, void nr_pdsch_layer_mapping(uint16_t **mod_symbs, uint8_t n_codewords, uint8_t n_layers, - uint16_t *n_symbs, + uint16_t n_symbs, uint16_t **tx_layers) { switch (n_layers) { case 1: - memcpy((void*)tx_layers[0], (void*)mod_symbs[0], (n_symbs[0]<<1)*sizeof(uint16_t)); + memcpy((void*)tx_layers[0], (void*)mod_symbs[0], (n_symbs<<1)*sizeof(uint16_t)); break; case 2: @@ -234,10 +234,12 @@ for (int i=0; i Date: Mon, 29 Oct 2018 16:17:56 +0100 Subject: [PATCH 056/117] nsymbs 2 --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 14 +++++++------- openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index a011b9a118..44ef5691c7 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -126,7 +126,7 @@ void nr_pdsch_layer_mapping(uint16_t **mod_symbs, case 2: case 3: case 4: - for (int i=0; i>1; i++) + for (int i=0; i>1; i++) for (int l=0; l<2; l++) { tx_layers[l][i<<1] = mod_symbs[0][((i<<1)+l)<<1]; tx_layers[l][(i<<1)+1] = mod_symbs[0][(((i<<1)+l)<<1)+1]; } - for (int i=0; i>2; i++) + for (int i=0; i>2; i++) for (int l=0; l<3; l++) { tx_layers[l][i<<1] = mod_symbs[q][((i<<2)+l)<<1]; tx_layers[l][(i<<1)+1] = mod_symbs[q][(((i<<2)+l)<<1)+1]; diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index 0067bf1703..a732ca9524 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -75,7 +75,7 @@ void nr_pdsch_codeword_modulation(uint32_t *in, void nr_pdsch_layer_mapping(uint16_t **mod_symbs, uint8_t n_codewords, uint8_t n_layers, - uint16_t *n_symbs, + uint16_t n_symbs, uint16_t **tx_layers); uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, From 5e3fb991e206f9a343deef06179e25067f1c4ab1 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Mon, 29 Oct 2018 18:42:27 +0100 Subject: [PATCH 057/117] type fix --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 24 +++++++++++------------- openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 7 +++---- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 44ef5691c7..50928a7140 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -90,7 +90,7 @@ void nr_modulation(uint32_t *in, void nr_pdsch_codeword_modulation(uint32_t *in, uint8_t Qm, uint32_t length, - uint16_t *out) { + int16_t *out) { uint16_t offset = (Qm==2)? NR_MOD_TABLE_QPSK_OFFSET : (Qm==4)? NR_MOD_TABLE_QAM16_OFFSET : \ (Qm==6)? NR_MOD_TABLE_QAM64_OFFSET: (Qm==8)? NR_MOD_TABLE_QAM256_OFFSET : 0; @@ -111,16 +111,15 @@ void nr_pdsch_codeword_modulation(uint32_t *in, } } -void nr_pdsch_layer_mapping(uint16_t **mod_symbs, - uint8_t n_codewords, +void nr_pdsch_layer_mapping(int16_t **mod_symbs, uint8_t n_layers, uint16_t n_symbs, - uint16_t **tx_layers) { + int16_t **tx_layers) { switch (n_layers) { case 1: - memcpy((void*)tx_layers[0], (void*)mod_symbs[0], (n_symbs<<1)*sizeof(uint16_t)); + memcpy((void*)tx_layers[0], (void*)mod_symbs[0], (n_symbs<<1)*sizeof(int16_t)); break; case 2: @@ -196,7 +195,7 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, nfapi_nr_dl_config_pdcch_parameters_rel15_t pdcch_params = dci_alloc.pdcch_params; uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH]; int16_t mod_symbs[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>1]; - uint16_t tx_layers[NR_MAX_NB_LAYERS][NR_MAX_PDSCH_ENCODED_LENGTH>>1]; + int16_t tx_layers[NR_MAX_NB_LAYERS][NR_MAX_PDSCH_ENCODED_LENGTH>>1]; uint16_t n_symbs; int8_t Wf[2], Wt[2], l0, delta; uint16_t TBS = rel15->transport_block_size; @@ -218,10 +217,10 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, n_RNTI, scrambled_output[q]); #ifdef DEBUG_DLSCH -printf("PDSCH Scrambling(TBS %d): before \t after \n", TBS); -for (int i=0; if[i], scrambled_output[0][i]); -} +//printf("PDSCH Scrambling(TBS %d): before \t after \n", TBS); +//for (int i=0; if[i], scrambled_output[0][i]); +//} #endif @@ -245,7 +244,6 @@ for (int i=0; inb_codewords, rel15->nb_layers, n_symbs, tx_layers); @@ -284,8 +282,8 @@ for (int i=0; i> 15; - ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (Wt[k_prime]*Wf[k_prime]*amp*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15; + ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (Wt[k_prime]*Wf[k_prime]*amp/2*mod_dmrs[dmrs_idx<<1]) >> 15; + ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (Wt[k_prime]*Wf[k_prime]*amp/2*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15; dmrs_idx++; n++; k_prime++; diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index a732ca9524..375d2d0fef 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -70,13 +70,12 @@ void nr_pdsch_codeword_scrambling(uint8_t *in, void nr_pdsch_codeword_modulation(uint32_t *in, uint8_t Qm, uint32_t length, - uint16_t *out); + int16_t *out); -void nr_pdsch_layer_mapping(uint16_t **mod_symbs, - uint8_t n_codewords, +void nr_pdsch_layer_mapping(int16_t **mod_symbs, uint8_t n_layers, uint16_t n_symbs, - uint16_t **tx_layers); + int16_t **tx_layers); uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, NR_gNB_DCI_ALLOC_t dci_alloc, From e7ff833751c8e514f42b0cef836c3e4167e09b66 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Tue, 30 Oct 2018 09:39:42 +0100 Subject: [PATCH 058/117] Missing cast --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 8 ++++---- openair1/PHY/NR_TRANSPORT/nr_pss.c | 2 +- openair1/PHY/TOOLS/tools_defs.h | 4 ++++ openair1/PHY/defs_common.h | 5 ++--- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 50928a7140..b5eb5de358 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -193,7 +193,7 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, NR_DL_gNB_HARQ_t *harq = dlsch.harq_processes[dci_alloc.harq_pid]; nfapi_nr_dl_config_dlsch_pdu_rel15_t *rel15 = &harq->dlsch_pdu.dlsch_pdu_rel15; nfapi_nr_dl_config_pdcch_parameters_rel15_t pdcch_params = dci_alloc.pdcch_params; - uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH]; + uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>5]; int16_t mod_symbs[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>1]; int16_t tx_layers[NR_MAX_NB_LAYERS][NR_MAX_PDSCH_ENCODED_LENGTH>>1]; uint16_t n_symbs; @@ -232,7 +232,7 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, TBS, mod_symbs[q]); #ifdef DEBUG_DLSCH -printf("PDSCH Modulation: Qm %d()\n", Qm, n_symbs); +printf("PDSCH Modulation: Qm %d(%d)\n", Qm, n_symbs); for (int i=0; inb_layers, n_symbs, - tx_layers); + (int16_t**)tx_layers); /// Antenna port mapping //to be moved to init phase potentially, for now tx_layers 1-8 are mapped on antenna ports 1000-1007 diff --git a/openair1/PHY/NR_TRANSPORT/nr_pss.c b/openair1/PHY/NR_TRANSPORT/nr_pss.c index 1f653038a6..84d4e0909d 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_pss.c +++ b/openair1/PHY/NR_TRANSPORT/nr_pss.c @@ -22,7 +22,7 @@ #include "PHY/NR_TRANSPORT/nr_transport.h" -#define NR_PSS_DEBUG +//#define NR_PSS_DEBUG int nr_generate_pss( int16_t *d_pss, int32_t **txdataF, diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h index fd68a53c1d..51295857d3 100644 --- a/openair1/PHY/TOOLS/tools_defs.h +++ b/openair1/PHY/TOOLS/tools_defs.h @@ -32,6 +32,8 @@ #include #include "PHY/sse_intrin.h" +#define CEILIDIV(a,b) ((a+b-1)/b) +#define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1)) struct complex { double x; @@ -405,4 +407,6 @@ void idft8192(int16_t *x,int16_t *y,int scale); double interp(double x, double *xs, double *ys, int count); +int write_output(const char *fname,const char *vname,void *data,int length,int dec,char format); + #endif //__PHY_TOOLS_DEFS__H__ diff --git a/openair1/PHY/defs_common.h b/openair1/PHY/defs_common.h index 743b40f9d8..f033f99e1e 100644 --- a/openair1/PHY/defs_common.h +++ b/openair1/PHY/defs_common.h @@ -65,6 +65,8 @@ #include +#include "TOOLS/tools_defs.h" + #include "targets/COMMON/openairinterface5g_limits.h" #include "types.h" @@ -101,9 +103,6 @@ #include "enums.h" #else -#define CEILIDIV(a,b) ((a+b-1)/b) -#define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1)) - typedef enum {TDD=1,FDD=0} lte_frame_type_t; typedef enum {EXTENDED=1,NORMAL=0} lte_prefix_type_t; From 9a45167bd28f9b023551f0ba9fe2fe03494f9d7c Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Tue, 30 Oct 2018 10:42:31 +0100 Subject: [PATCH 059/117] New mallocs for dlsch struct --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 8 +++--- openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 27 +++++++++++++++------ openair1/PHY/defs_gNB.h | 6 +++-- openair1/PHY/defs_nr_common.h | 1 + openair1/SIMULATION/NR_PHY/dlschsim.c | 2 +- targets/RT/USER/nr-gnb.c | 8 +++--- 6 files changed, 33 insertions(+), 19 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index b5eb5de358..92321f7744 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -194,8 +194,8 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, nfapi_nr_dl_config_dlsch_pdu_rel15_t *rel15 = &harq->dlsch_pdu.dlsch_pdu_rel15; nfapi_nr_dl_config_pdcch_parameters_rel15_t pdcch_params = dci_alloc.pdcch_params; uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>5]; - int16_t mod_symbs[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>1]; - int16_t tx_layers[NR_MAX_NB_LAYERS][NR_MAX_PDSCH_ENCODED_LENGTH>>1]; + int16_t **mod_symbs = (int16_t**)dlsch.mod_symbs; + int16_t **tx_layers = (int16_t**)dlsch.txdataF; uint16_t n_symbs; int8_t Wf[2], Wt[2], l0, delta; uint16_t TBS = rel15->transport_block_size; @@ -243,10 +243,10 @@ for (int i=0; inb_layers, n_symbs, - (int16_t**)tx_layers); + tx_layers); /// Antenna port mapping //to be moved to init phase potentially, for now tx_layers 1-8 are mapped on antenna ports 1000-1007 diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index 9d1d7bfa90..b964ff5f4d 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -106,15 +106,21 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t *dlsch) } -NR_gNB_DLSCH_t *new_gNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_t Nsoft,unsigned char N_RB_DL, uint8_t abstraction_flag, NR_DL_FRAME_PARMS* frame_parms) +NR_gNB_DLSCH_t *new_gNB_dlsch(unsigned char Kmimo, + unsigned char Mdlharq, + uint32_t Nsoft, + uint8_t abstraction_flag, + NR_DL_FRAME_PARMS *frame_parms, + nfapi_nr_config_request_t *config) { NR_gNB_DLSCH_t *dlsch; unsigned char exit_flag = 0,i,r,aa,layer; int re; unsigned char bw_scaling =1; + uint16_t N_RB = config->rf_config.dl_carrier_bandwidth.value; - switch (N_RB_DL) { + switch (N_RB) { case 106: bw_scaling =2; @@ -134,19 +140,24 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_t dlsch->Mlimit = 4; dlsch->Nsoft = Nsoft; - for (layer=0; layer<4; layer++) { - dlsch->ue_spec_bf_weights[layer] = (int32_t**)malloc16(frame_parms->nb_antennas_tx*sizeof(int32_t*)); + for (layer=0; layerue_spec_bf_weights[layer] = (int32_t**)malloc16(config->rf_config.tx_antenna_ports.value*sizeof(int32_t*)); - for (aa=0; aanb_antennas_tx; aa++) { + for (aa=0; aarf_config.tx_antenna_ports.value; aa++) { dlsch->ue_spec_bf_weights[layer][aa] = (int32_t *)malloc16(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t)); for (re=0;reue_spec_bf_weights[layer][aa][re] = 0x00007fff; } } + + dlsch->txdataF[layer] = (int32_t *)malloc16((NR_MAX_PDSCH_ENCODED_LENGTH>>1)*sizeof(int32_t*)); } - dlsch->calib_dl_ch_estimates = (int32_t**)malloc16(frame_parms->nb_antennas_tx*sizeof(int32_t*)); - for (aa=0; aanb_antennas_tx; aa++) { + for (int q=0; qmod_symbs[q] = (int32_t *)malloc16((NR_MAX_PDSCH_ENCODED_LENGTH>>1)*sizeof(int32_t*)); + + dlsch->calib_dl_ch_estimates = (int32_t**)malloc16(config->rf_config.tx_antenna_ports.value*sizeof(int32_t*)); + for (aa=0; aarf_config.tx_antenna_ports.value; aa++) { dlsch->calib_dl_ch_estimates[aa] = (int32_t *)malloc16(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t)); } @@ -158,7 +169,7 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_t for (i=0; iharq_processes[i] = (NR_DL_gNB_HARQ_t *)malloc16(sizeof(NR_DL_gNB_HARQ_t)); LOG_T(PHY, "Required mem size %d (bw scaling %d), dlsch->harq_processes[%d] %p\n", - MAX_NR_ULSCH_PAYLOAD_BYTES/bw_scaling,bw_scaling, i,dlsch->harq_processes[i]); + MAX_NR_DLSCH_PAYLOAD_BYTES/bw_scaling,bw_scaling, i,dlsch->harq_processes[i]); if (dlsch->harq_processes[i]) { bzero(dlsch->harq_processes[i],sizeof(NR_DL_gNB_HARQ_t)); diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index e810b7c339..58ea02d943 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -105,9 +105,11 @@ typedef struct { typedef struct { /// Pointers to 16 HARQ processes for the DLSCH - NR_DL_gNB_HARQ_t *harq_processes[16]; + NR_DL_gNB_HARQ_t *harq_processes[NR_MAX_NB_HARQ_PROCESSES]; /// TX buffers for UE-spec transmission (antenna ports 5 or 7..14, prior to precoding) - int32_t *txdataF[8]; + int32_t *txdataF[NR_MAX_NB_LAYERS]; + /// Modulated symbols buffer + int32_t *mod_symbs[NR_MAX_NB_CODEWORDS]; /// beamforming weights for UE-spec transmission (antenna ports 5 or 7..14), for each codeword, maximum 4 layers? int32_t **ue_spec_bf_weights[4]; /// dl channel estimates (estimated from ul channel estimates) diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 675e893e16..0c6a9f5acf 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -88,6 +88,7 @@ #define NR_MAX_NB_RBG 18 #define NR_MAX_NB_LAYERS 8 #define NR_MAX_NB_CODEWORDS 2 +#define NR_MAX_NB_HARQ_PROCESSES 16 #define NR_MAX_PDSCH_ENCODED_LENGTH 950984 typedef enum { diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c index e435d87de7..d597910be2 100644 --- a/openair1/SIMULATION/NR_PHY/dlschsim.c +++ b/openair1/SIMULATION/NR_PHY/dlschsim.c @@ -405,7 +405,7 @@ int main(int argc, char **argv) for (int k=0; k<2; k++) { // Create transport channel structures for 2 transport blocks (MIMO) for (i=0; i<2; i++) { - gNB->dlsch[k][i] = new_gNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0,&gNB->frame_parms); + gNB->dlsch[k][i] = new_gNB_dlsch(Kmimo,8,Nsoft,0,frame_parms,gNB_config); if (!gNB->dlsch[k][i]) { printf("Can't get eNB dlsch structures\n"); diff --git a/targets/RT/USER/nr-gnb.c b/targets/RT/USER/nr-gnb.c index 327639656a..c6b3c826b5 100644 --- a/targets/RT/USER/nr-gnb.c +++ b/targets/RT/USER/nr-gnb.c @@ -755,7 +755,7 @@ void init_nr_transport(PHY_VARS_gNB *gNB) { for (i=0; idlsch[i][j] = new_gNB_dlsch(1,16,NSOFT,cfg->rf_config.dl_carrier_bandwidth.value,0,fp); + gNB->dlsch[i][j] = new_gNB_dlsch(1,16,NSOFT,cfg->rf_config.dl_carrier_bandwidth.value,0,cfg); if (!gNB->dlsch[i][j]) { LOG_E(PHY,"Can't get gNB dlsch structures for UE %d \n", i); exit(-1); @@ -784,11 +784,11 @@ void init_nr_transport(PHY_VARS_gNB *gNB) { LOG_E(PHY,"Can't get gNB ulsch structures\n"); exit(-1); }*/ - gNB->dlsch_SI = new_gNB_dlsch(1,8,NSOFT,fp->N_RB_DL, 0, fp); + gNB->dlsch_SI = new_gNB_dlsch(1,8,NSOFT, 0, fp, cfg); LOG_D(PHY,"gNB %d.%d : SI %p\n",gNB->Mod_id,gNB->CC_id,gNB->dlsch_SI); - gNB->dlsch_ra = new_gNB_dlsch(1,8,NSOFT,fp->N_RB_DL, 0, fp); + gNB->dlsch_ra = new_gNB_dlsch(1,8,NSOFT, 0, fp, cfg); LOG_D(PHY,"gNB %d.%d : RA %p\n",gNB->Mod_id,gNB->CC_id,gNB->dlsch_ra); - gNB->dlsch_MCH = new_gNB_dlsch(1,8,NSOFT,fp->N_RB_DL, 0, fp); + gNB->dlsch_MCH = new_gNB_dlsch(1,8,NSOFT, 0, fp, cfg); LOG_D(PHY,"gNB %d.%d : MCH %p\n",gNB->Mod_id,gNB->CC_id,gNB->dlsch_MCH); From fbca3fa6756c9c7be2b69d9792797f96f41ad501 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Tue, 30 Oct 2018 11:09:13 +0100 Subject: [PATCH 060/117] NR transport init fix --- targets/RT/USER/nr-gnb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/RT/USER/nr-gnb.c b/targets/RT/USER/nr-gnb.c index c6b3c826b5..96c4671f9c 100644 --- a/targets/RT/USER/nr-gnb.c +++ b/targets/RT/USER/nr-gnb.c @@ -755,7 +755,7 @@ void init_nr_transport(PHY_VARS_gNB *gNB) { for (i=0; idlsch[i][j] = new_gNB_dlsch(1,16,NSOFT,cfg->rf_config.dl_carrier_bandwidth.value,0,cfg); + gNB->dlsch[i][j] = new_gNB_dlsch(1,16,NSOFT,0,fp,cfg); if (!gNB->dlsch[i][j]) { LOG_E(PHY,"Can't get gNB dlsch structures for UE %d \n", i); exit(-1); From a81ec384663d96bd772f4f24ff369331c7594f07 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Tue, 30 Oct 2018 12:00:18 +0100 Subject: [PATCH 061/117] Debug info --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 62 ++++++++++++++++++++++++---- 1 file changed, 54 insertions(+), 8 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 92321f7744..c6b270bc4f 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -35,6 +35,7 @@ #include "nr_sch_dmrs.h" #define DEBUG_DLSCH +#define DEBUG_DLSCH_MAPPING uint8_t mod_order[5] = {1, 2, 4, 6, 8}; uint16_t mod_offset[5] = {1,3,7,23,87}; @@ -203,6 +204,20 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, /// CRC, coding, interleaving and rate matching nr_dlsch_encoding(harq->pdu, subframe, &dlsch, &frame_parms); +#ifdef DEBUG_DLSCH +printf("PDSCH encoding:\nPayload:\n"); +for (int i=0; i>4; i++) { + for (int j=0; j<16; j++) + printf("0x%02x\t", harq->pdu[(i<<4)+j]); + printf("\n"); +} +printf("\nEncoded payload:\n"); +for (int i=0; i>4; i++) { + for (int j=0; j<16; j++) + printf("0x%02x\t", harq->f[(i<<4)+j]); + printf("\n"); +} +#endif /// scrambling uint16_t n_RNTI = (pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)? \ @@ -217,12 +232,13 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, n_RNTI, scrambled_output[q]); #ifdef DEBUG_DLSCH -//printf("PDSCH Scrambling(TBS %d): before \t after \n", TBS); -//for (int i=0; if[i], scrambled_output[0][i]); -//} +printf("PDSCH scrambling:\n"); +for (int i=0; i>7; i++) { + for (int j=0; j<8; j++) + printf("0x%08x\t", scrambled_output[0][(i<<3)+j]); + printf("\n"); +} #endif - /// Modulation n_symbs = TBS/Qm; @@ -233,9 +249,9 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, mod_symbs[q]); #ifdef DEBUG_DLSCH printf("PDSCH Modulation: Qm %d(%d)\n", Qm, n_symbs); -for (int i=0; i>3; i++) { + for (int j=0; j<8; j++) { + printf("%d %d\t", mod_symbs[0][((i<<3)+j)<<1], mod_symbs[0][(((i<<3)+j)<<1)+1]); } printf("\n"); } @@ -247,6 +263,16 @@ for (int i=0; inb_layers, n_symbs, tx_layers); +#ifdef DEBUG_DLSCH +printf("Layer mapping (%d layers):\n", rel15->nb_layers); +for (int l=0; lnb_layers; l++) + for (int i=0; i>3; i++) { + for (int j=0; j<8; j++) { + printf("%d %d\t", tx_layers[l][((i<<3)+j)<<1], tx_layers[l][(((i<<3)+j)<<1)+1]); + } + printf("\n"); + } +#endif /// Antenna port mapping //to be moved to init phase potentially, for now tx_layers 1-8 are mapped on antenna ports 1000-1007 @@ -257,6 +283,15 @@ for (int i=0; i>3; i++) { + for (int j=0; j<8; j++) { + printf("%d %d\t", mod_dmrs[((i<<3)+j)<<1], mod_dmrs[(((i<<3)+j)<<1)+1]); + } + printf("\n"); +} +#endif /// Resource mapping AssertFatal(rel15->nb_layers<=config.rf_config.tx_antenna_ports.value, "Not enough Tx antennas (%d) for %d layers\n",\ @@ -273,6 +308,9 @@ for (int i=0; i> 15; ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (Wt[k_prime]*Wf[k_prime]*amp/2*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15; +#ifdef DEBUG_DLSCH_MAPPING +printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d", +dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1], ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1]); +#endif dmrs_idx++; n++; k_prime++; @@ -292,6 +334,10 @@ for (int i=0; i> 15; ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15; +#ifdef DEBUG_DLSCH_MAPPING +printf("m %d\t l %d \t k %d \t txdataF: %d %d", +m, l, k, ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1], ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1]); +#endif m++; } } From a5d187885fd5ddd9f072ceed74da05cf5a3f7c8e Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Tue, 30 Oct 2018 12:08:32 +0100 Subject: [PATCH 062/117] mapping fix --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index c6b270bc4f..648a0c86c0 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -34,7 +34,7 @@ #include "nr_dci.h" #include "nr_sch_dmrs.h" -#define DEBUG_DLSCH +//#define DEBUG_DLSCH #define DEBUG_DLSCH_MAPPING uint8_t mod_order[5] = {1, 2, 4, 6, 8}; @@ -314,7 +314,7 @@ printf("DMRS params for ap %d: Wt %d %d \t Wf %d %d\n", ap, Wt[0], Wt[1], Wf[0], uint8_t k_prime=0, n=0, dmrs_idx=0; uint16_t m = 0; - for (int l=rel15->start_symbol; lnb_symbols; l++) + for (int l=rel15->start_symbol; lstart_symbol+rel15->nb_symbols; l++) for (int k=start_sc; kn_prb*NR_NB_SC_PER_RB; k++) { if (k >= frame_parms.ofdm_symbol_size) k -= frame_parms.ofdm_symbol_size; From 065b24e507db0bb5bac8262ac87798198e1d20e3 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Tue, 30 Oct 2018 14:46:39 +0100 Subject: [PATCH 063/117] Scheduling subframe change --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 6 +++--- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 2 +- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 648a0c86c0..d12021a929 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -198,7 +198,7 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, int16_t **mod_symbs = (int16_t**)dlsch.mod_symbs; int16_t **tx_layers = (int16_t**)dlsch.txdataF; uint16_t n_symbs; - int8_t Wf[2], Wt[2], l0, delta; + int8_t Wf[2], Wt[2], l0, l_prime, delta; uint16_t TBS = rel15->transport_block_size; uint8_t Qm = rel15->modulation_order; @@ -323,7 +323,7 @@ printf("DMRS params for ap %d: Wt %d %d \t Wf %d %d\n", ap, Wt[0], Wt[1], Wf[0], ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (Wt[k_prime]*Wf[k_prime]*amp/2*mod_dmrs[dmrs_idx<<1]) >> 15; ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (Wt[k_prime]*Wf[k_prime]*amp/2*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15; #ifdef DEBUG_DLSCH_MAPPING -printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d", +printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n", dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1], ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1]); #endif dmrs_idx++; @@ -335,7 +335,7 @@ dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_s ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (amp * tx_layers[ap][m<<1]) >> 15; ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15; #ifdef DEBUG_DLSCH_MAPPING -printf("m %d\t l %d \t k %d \t txdataF: %d %d", +printf("m %d\t l %d \t k %d \t txdataF: %d %d\n", m, l, k, ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1], ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1]); #endif m++; diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index a4720ebe74..aaf8c3e1ff 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -183,7 +183,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, num_dci = gNB->pdcch_vars.num_dci; num_pdsch_rnti = gNB->pdcch_vars.num_pdsch_rnti; - if (num_dci && (subframe==0)) { + if (num_dci && (subframe==1)) { LOG_I(PHY, "[gNB %d] Frame %d subframe %d \ Calling nr_generate_dci_top (number of DCI %d)\n", gNB->Mod_id, frame, subframe, num_dci); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c index c78f52280b..8217b96393 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c @@ -419,7 +419,8 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, } // Phytest scheduling/ option not activated because of pending bug - nr_schedule_css_dlsch_phytest(module_idP, frameP, subframeP); + if (subframeP==1) + nr_schedule_css_dlsch_phytest(module_idP, frameP, subframeP); /* From 3a072ba378a6eaf24f0d368d55b1d64ab2c27de7 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Tue, 30 Oct 2018 16:52:29 +0100 Subject: [PATCH 064/117] Number of mod symbols addition in fapi --- .../nfapi/public_inc/nfapi_nr_interface.h | 3 ++- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 27 ++++++++++--------- openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c | 5 +++- .../LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c | 4 +-- 4 files changed, 22 insertions(+), 17 deletions(-) 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 e7cd720e80..a3b59d5e7f 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h @@ -508,7 +508,7 @@ typedef struct{ typedef struct { nfapi_tl_t tl; - uint8_t rnti; + uint16_t rnti; uint8_t rnti_type; uint8_t dci_format; uint8_t config_type; @@ -550,6 +550,7 @@ typedef struct { uint16_t length; uint8_t pdu_index; uint16_t rnti; + uint16_t nb_mod_symbols; uint8_t time_allocation_type; uint8_t freq_allocation_type; uint8_t start_prb; diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index d12021a929..47eb25c21f 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -197,10 +197,11 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>5]; int16_t **mod_symbs = (int16_t**)dlsch.mod_symbs; int16_t **tx_layers = (int16_t**)dlsch.txdataF; - uint16_t n_symbs; - int8_t Wf[2], Wt[2], l0, l_prime, delta; + int8_t Wf[2], Wt[2], l0, l_prime[2], delta; uint16_t TBS = rel15->transport_block_size; + uint16_t nb_symbols = rel15->nb_mod_symbols; uint8_t Qm = rel15->modulation_order; + uint16_t encoded_length = nb_symbols*Qm; /// CRC, coding, interleaving and rate matching nr_dlsch_encoding(harq->pdu, subframe, &dlsch, &frame_parms); @@ -212,7 +213,7 @@ for (int i=0; i>4; i++) { printf("\n"); } printf("\nEncoded payload:\n"); -for (int i=0; i>4; i++) { +for (int i=0; i>4; i++) { for (int j=0; j<16; j++) printf("0x%02x\t", harq->f[(i<<4)+j]); printf("\n"); @@ -226,14 +227,14 @@ for (int i=0; i>4; i++) { pdcch_params.scrambling_id : config.sch_config.physical_cell_id.value; for (int q=0; qnb_codewords; q++) nr_pdsch_codeword_scrambling(harq->f, - TBS, + encoded_length, q, Nid, n_RNTI, scrambled_output[q]); #ifdef DEBUG_DLSCH printf("PDSCH scrambling:\n"); -for (int i=0; i>7; i++) { +for (int i=0; i>7; i++) { for (int j=0; j<8; j++) printf("0x%08x\t", scrambled_output[0][(i<<3)+j]); printf("\n"); @@ -241,15 +242,14 @@ for (int i=0; i>7; i++) { #endif /// Modulation - n_symbs = TBS/Qm; for (int q=0; qnb_codewords; q++) nr_pdsch_codeword_modulation(scrambled_output[q], Qm, - TBS, + encoded_length, mod_symbs[q]); #ifdef DEBUG_DLSCH printf("PDSCH Modulation: Qm %d(%d)\n", Qm, n_symbs); -for (int i=0; i>3; i++) { +for (int i=0; i>3; i++) { for (int j=0; j<8; j++) { printf("%d %d\t", mod_symbs[0][((i<<3)+j)<<1], mod_symbs[0][(((i<<3)+j)<<1)+1]); } @@ -261,12 +261,12 @@ for (int i=0; i>3; i++) { /// Layer mapping nr_pdsch_layer_mapping(mod_symbs, rel15->nb_layers, - n_symbs, + nb_symbols, tx_layers); #ifdef DEBUG_DLSCH printf("Layer mapping (%d layers):\n", rel15->nb_layers); for (int l=0; lnb_layers; l++) - for (int i=0; i>3; i++) { + for (int i=0; i<(nb_symbs/rel15->nb_layers)>>3; i++) { for (int j=0; j<8; j++) { printf("%d %d\t", tx_layers[l][((i<<3)+j)<<1], tx_layers[l][(((i<<3)+j)<<1)+1]); } @@ -308,6 +308,7 @@ for (int i=0; i>3; i++) { get_Wt(Wt, ap, dmrs_type); get_Wf(Wf, ap, dmrs_type); delta = get_delta(ap, dmrs_type); + l_prime[0] = 0; // single symbol ap 0 #ifdef DEBUG_DLSCH_MAPPING printf("DMRS params for ap %d: Wt %d %d \t Wf %d %d\n", ap, Wt[0], Wt[1], Wf[0], Wf[1]); #endif @@ -319,9 +320,9 @@ printf("DMRS params for ap %d: Wt %d %d \t Wf %d %d\n", ap, Wt[0], Wt[1], Wf[0], if (k >= frame_parms.ofdm_symbol_size) k -= frame_parms.ofdm_symbol_size; - if ((l==l0) && (k == ((dmrs_type)? (6*n+k_prime+delta):((n<<2)+(k_prime<<1)+delta)))) { - ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (Wt[k_prime]*Wf[k_prime]*amp/2*mod_dmrs[dmrs_idx<<1]) >> 15; - ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (Wt[k_prime]*Wf[k_prime]*amp/2*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15; + if ((l==(l0+l_prime[0])) && (k == ((dmrs_type)? (6*n+k_prime+delta):((n<<2)+(k_prime<<1)+delta)))) { + ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*amp/2*mod_dmrs[dmrs_idx<<1]) >> 15; + ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*amp/2*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15; #ifdef DEBUG_DLSCH_MAPPING printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n", dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1], ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1]); diff --git a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c index 0e74b8d5ac..71f1922b48 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c @@ -107,6 +107,8 @@ void nr_get_tbs(nfapi_nr_dl_config_dlsch_pdu *dlsch_pdu, nfapi_nr_dl_config_dci_dl_pdu dci_pdu, nfapi_nr_config_request_t config) { + LOG_I(MAC, "TBS calculation\n"); + nfapi_nr_dl_config_pdcch_parameters_rel15_t params_rel15 = dci_pdu.pdcch_params_rel15; nfapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_rel15 = &dlsch_pdu->dlsch_pdu_rel15; uint8_t rnti_type = params_rel15.rnti_type; @@ -125,7 +127,7 @@ void nr_get_tbs(nfapi_nr_dl_config_dlsch_pdu *dlsch_pdu, uint8_t table_idx, Qm, n, scale; table_idx = get_table_idx(mcs_table, dci_format, rnti_type, ss_type); - scale = 10 + (((table_idx==2)&&((Imcs==20)||(Imcs==26)))?1:0); + scale = ((table_idx==2)&&((Imcs==20)||(Imcs==26)))?11:10; N_RE = min(156, N_RE_prime)*dlsch_rel15->n_prb; R = nr_get_code_rate(Imcs, table_idx); @@ -165,6 +167,7 @@ void nr_get_tbs(nfapi_nr_dl_config_dlsch_pdu *dlsch_pdu, dlsch_rel15->modulation_order = Qm; dlsch_rel15->transport_block_size = TBS; dlsch_rel15->nb_re_dmrs = N_PRB_DMRS; + dlsch_rel15->nb_mod_symbols = N_RE_prime*dlsch_rel15->n_prb*dlsch_rel15->nb_codewords; } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c index 308e261a7a..a82130024f 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c @@ -76,8 +76,8 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, dlsch_pdu_rel15->start_prb = 0; dlsch_pdu_rel15->n_prb = 106; - dlsch_pdu_rel15->start_symbol = 8; - dlsch_pdu_rel15->nb_symbols = 6; + dlsch_pdu_rel15->start_symbol = 2; + dlsch_pdu_rel15->nb_symbols = 8; dlsch_pdu_rel15->rnti = rnti; dlsch_pdu_rel15->nb_layers =1; dlsch_pdu_rel15->nb_codewords = 1; From a66a1cf77291839170e2e372669f92646779558a Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Tue, 30 Oct 2018 17:14:57 +0100 Subject: [PATCH 065/117] Write to file debug --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 47eb25c21f..ec1d2db2ee 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -35,7 +35,8 @@ #include "nr_sch_dmrs.h" //#define DEBUG_DLSCH -#define DEBUG_DLSCH_MAPPING +//#define DEBUG_DLSCH_MAPPING +#define DEBUG_FILE_OUTPUT uint8_t mod_order[5] = {1, 2, 4, 6, 8}; uint16_t mod_offset[5] = {1,3,7,23,87}; @@ -300,7 +301,7 @@ for (int i=0; i>3; i++) { // Non interleaved VRB to PRB mapping uint8_t start_sc = frame_parms.first_carrier_offset + rel15->start_prb*NR_NB_SC_PER_RB +\ ((pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_COMMON) && (pdcch_params.dci_format == NFAPI_NR_DL_DCI_FORMAT_1_0))?\ - (((int)floor(frame_parms.ssb_start_subcarrier/NR_NB_SC_PER_RB) + pdcch_params.rb_offset)*NR_NB_SC_PER_RB) : 0; + ((frame_parms.ssb_start_subcarrier/NR_NB_SC_PER_RB + pdcch_params.rb_offset)*NR_NB_SC_PER_RB) : 0; for (int ap=0; apnb_layers; ap++) { @@ -310,7 +311,7 @@ for (int i=0; i>3; i++) { delta = get_delta(ap, dmrs_type); l_prime[0] = 0; // single symbol ap 0 #ifdef DEBUG_DLSCH_MAPPING -printf("DMRS params for ap %d: Wt %d %d \t Wf %d %d\n", ap, Wt[0], Wt[1], Wf[0], Wf[1]); +printf("DMRS params for ap %d: Wt %d %d \t Wf %d %d \t delta %d \t l_prime %d \t l0 %d\n", ap, Wt[0], Wt[1], Wf[0], Wf[1], delta, l_prime[0], l0); #endif uint8_t k_prime=0, n=0, dmrs_idx=0; uint16_t m = 0; @@ -321,8 +322,8 @@ printf("DMRS params for ap %d: Wt %d %d \t Wf %d %d\n", ap, Wt[0], Wt[1], Wf[0], k -= frame_parms.ofdm_symbol_size; if ((l==(l0+l_prime[0])) && (k == ((dmrs_type)? (6*n+k_prime+delta):((n<<2)+(k_prime<<1)+delta)))) { - ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*amp/2*mod_dmrs[dmrs_idx<<1]) >> 15; - ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*amp/2*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15; + ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*(amp>>1)*mod_dmrs[dmrs_idx<<1]) >> 15; + ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*(amp>>1)*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15; #ifdef DEBUG_DLSCH_MAPPING printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n", dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1], ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1]); @@ -343,8 +344,8 @@ m, l, k, ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1], ((int } } -#ifdef DEBUG_DLSCH - write_output("txdataF_dlsch.m", "txdataF_dlsch", txdataF[0], frame_parms.samples_per_subframe_wCP>>1, 1, 1); +#ifdef DEBUG_FILE_OUTPUT + write_output("txdataF_dlsch.m", "txdataF_dlsch", &txdataF[0][28*frame_parms.ofdm_symbol_size], frame_parms.samples_per_subframe_wCP>>1, 1, 1); #endif return 0; From f18e6e42abf1f8c329c25993023c1cbbb270866e Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Tue, 30 Oct 2018 18:17:53 +0100 Subject: [PATCH 066/117] Payload fixing --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index ec1d2db2ee..f75b34a616 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -205,6 +205,7 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, uint16_t encoded_length = nb_symbols*Qm; /// CRC, coding, interleaving and rate matching + memset((void*)harq->pdu, 1, (TBS>>3)*sizeof(uint8_t)); nr_dlsch_encoding(harq->pdu, subframe, &dlsch, &frame_parms); #ifdef DEBUG_DLSCH printf("PDSCH encoding:\nPayload:\n"); @@ -279,13 +280,13 @@ for (int l=0; lnb_layers; l++) //to be moved to init phase potentially, for now tx_layers 1-8 are mapped on antenna ports 1000-1007 /// DMRS QPSK modulation - uint16_t n_dmrs = rel15->n_prb*rel15->nb_re_dmrs; + uint16_t n_dmrs = (rel15->n_prb*rel15->nb_re_dmrs)<<1; int16_t mod_dmrs[n_dmrs<<1]; uint8_t dmrs_type = config.pdsch_config.dmrs_type.value; l0 = get_l0(dmrs_type, 2);//config.pdsch_config.dmrs_typeA_position.value); nr_modulation(pdsch_dmrs[l0], n_dmrs, MOD_QPSK, mod_dmrs); #ifdef DEBUG_DLSCH -printf("DMRS modulation (single symbol %d, %d symbols):\n", l0, n_dmrs); +printf("DMRS modulation (single symbol %d, %d symbols, type %d):\n", l0, n_dmrs, dmrs_type); for (int i=0; i>3; i++) { for (int j=0; j<8; j++) { printf("%d %d\t", mod_dmrs[((i<<3)+j)<<1], mod_dmrs[(((i<<3)+j)<<1)+1]); @@ -334,18 +335,21 @@ dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_s k_prime&=1; } - ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (amp * tx_layers[ap][m<<1]) >> 15; - ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15; + else { + + ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (amp * tx_layers[ap][m<<1]) >> 15; + ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15; #ifdef DEBUG_DLSCH_MAPPING printf("m %d\t l %d \t k %d \t txdataF: %d %d\n", m, l, k, ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1], ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1]); #endif - m++; + m++; + } } } #ifdef DEBUG_FILE_OUTPUT - write_output("txdataF_dlsch.m", "txdataF_dlsch", &txdataF[0][28*frame_parms.ofdm_symbol_size], frame_parms.samples_per_subframe_wCP>>1, 1, 1); + write_output("txdataF_dlsch.m", "txdataF_dlsch", txdataF[0], frame_parms.samples_per_subframe_wCP>>1, 1, 1); #endif return 0; From 588a01d5acac81ea112a0b7579854909ddb02f03 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Wed, 31 Oct 2018 11:05:50 +0100 Subject: [PATCH 067/117] DMRS idx fix --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 20 ++++++++++++++----- .../LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c | 8 ++++---- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index f75b34a616..d0b9056570 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -36,7 +36,7 @@ //#define DEBUG_DLSCH //#define DEBUG_DLSCH_MAPPING -#define DEBUG_FILE_OUTPUT +//#define DEBUG_FILE_OUTPUT uint8_t mod_order[5] = {1, 2, 4, 6, 8}; uint16_t mod_offset[5] = {1,3,7,23,87}; @@ -183,6 +183,11 @@ void nr_pdsch_layer_mapping(int16_t **mod_symbs, } } +static inline uint16_t get_pdsch_dmrs_idx(uint8_t n, uint8_t k_prime, uint8_t delta, uint8_t dmrs_type) { + uint16_t dmrs_idx = (dmrs_type)? (6*n+k_prime+delta):((n<<2)+(k_prime<<1)+delta); + return dmrs_idx; +} + uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, NR_gNB_DCI_ALLOC_t dci_alloc, uint32_t **pdsch_dmrs, @@ -304,6 +309,10 @@ for (int i=0; i>3; i++) { ((pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_COMMON) && (pdcch_params.dci_format == NFAPI_NR_DL_DCI_FORMAT_1_0))?\ ((frame_parms.ssb_start_subcarrier/NR_NB_SC_PER_RB + pdcch_params.rb_offset)*NR_NB_SC_PER_RB) : 0; +#ifdef DEBUG_DLSCH_MAPPING +printf("PDSCH resource mapping started (start SC %d\tstart symbol %d\tN_PRB %d\tnb_symbols %d)\n", start_sc, rel15->start_symbol, rel15->n_prb, rel15->nb_symbols); +#endif + for (int ap=0; apnb_layers; ap++) { // DMRS params for this ap @@ -311,8 +320,9 @@ for (int i=0; i>3; i++) { get_Wf(Wf, ap, dmrs_type); delta = get_delta(ap, dmrs_type); l_prime[0] = 0; // single symbol ap 0 + uint8_t dmrs_symbol = l0+l_prime[0]; #ifdef DEBUG_DLSCH_MAPPING -printf("DMRS params for ap %d: Wt %d %d \t Wf %d %d \t delta %d \t l_prime %d \t l0 %d\n", ap, Wt[0], Wt[1], Wf[0], Wf[1], delta, l_prime[0], l0); +printf("DMRS params for ap %d: Wt %d %d \t Wf %d %d \t delta %d \t l_prime %d \t l0 %d\tDMRS symbol %d\n", ap, Wt[0], Wt[1], Wf[0], Wf[1], delta, l_prime[0], l0, dmrs_symbol); #endif uint8_t k_prime=0, n=0, dmrs_idx=0; uint16_t m = 0; @@ -322,9 +332,9 @@ printf("DMRS params for ap %d: Wt %d %d \t Wf %d %d \t delta %d \t l_prime %d \t if (k >= frame_parms.ofdm_symbol_size) k -= frame_parms.ofdm_symbol_size; - if ((l==(l0+l_prime[0])) && (k == ((dmrs_type)? (6*n+k_prime+delta):((n<<2)+(k_prime<<1)+delta)))) { - ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*(amp>>1)*mod_dmrs[dmrs_idx<<1]) >> 15; - ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*(amp>>1)*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15; + if ((l == dmrs_symbol) && (k == (start_sc+get_pdsch_dmrs_idx(n, k_prime, delta, dmrs_type)))) { + ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[dmrs_idx<<1]) >> 15; + ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15; #ifdef DEBUG_DLSCH_MAPPING printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n", dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1], ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1]); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c index a82130024f..569a460c65 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c @@ -75,13 +75,13 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, nfapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_pdu_rel15 = &dl_config_dlsch_pdu->dlsch_pdu.dlsch_pdu_rel15; dlsch_pdu_rel15->start_prb = 0; - dlsch_pdu_rel15->n_prb = 106; + dlsch_pdu_rel15->n_prb = 50; dlsch_pdu_rel15->start_symbol = 2; - dlsch_pdu_rel15->nb_symbols = 8; + dlsch_pdu_rel15->nb_symbols = 4; dlsch_pdu_rel15->rnti = rnti; dlsch_pdu_rel15->nb_layers =1; dlsch_pdu_rel15->nb_codewords = 1; - dlsch_pdu_rel15->mcs_idx = 26; + dlsch_pdu_rel15->mcs_idx = 9; dlsch_pdu_rel15->ndi = 1; dlsch_pdu_rel15->redundancy_version = 0; @@ -94,7 +94,7 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, pdu_rel15->frequency_domain_assignment = get_RIV(dlsch_pdu_rel15->start_prb, dlsch_pdu_rel15->n_prb, cfg->rf_config.dl_carrier_bandwidth.value); pdu_rel15->time_domain_assignment = get_SLIV(dlsch_pdu_rel15->start_symbol, dlsch_pdu_rel15->nb_symbols); pdu_rel15->vrb_to_prb_mapping = 1; - pdu_rel15->mcs = 26; + pdu_rel15->mcs = 9; pdu_rel15->tb_scaling = 1; pdu_rel15->ra_preamble_index = 25; From 25094740fb3bb388b07920e93aa19068b2c5df9a Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Mon, 5 Nov 2018 15:19:02 +0100 Subject: [PATCH 068/117] DMRS mapping fix --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index d0b9056570..491ef199e8 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -340,9 +340,9 @@ printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n", dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1], ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1]); #endif dmrs_idx++; - n++; k_prime++; k_prime&=1; + n+=(k_prime)?0:1; } else { From 5a98bcd5299e1e68e6b7047a3101137b801feb61 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Mon, 5 Nov 2018 16:38:13 +0100 Subject: [PATCH 069/117] type fix --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 491ef199e8..1e00d844e3 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -324,8 +324,8 @@ printf("PDSCH resource mapping started (start SC %d\tstart symbol %d\tN_PRB %d\t #ifdef DEBUG_DLSCH_MAPPING printf("DMRS params for ap %d: Wt %d %d \t Wf %d %d \t delta %d \t l_prime %d \t l0 %d\tDMRS symbol %d\n", ap, Wt[0], Wt[1], Wf[0], Wf[1], delta, l_prime[0], l0, dmrs_symbol); #endif - uint8_t k_prime=0, n=0, dmrs_idx=0; - uint16_t m = 0; + uint8_t k_prime=0; + uint16_t m=0, n=0, dmrs_idx=0;; for (int l=rel15->start_symbol; lstart_symbol+rel15->nb_symbols; l++) for (int k=start_sc; kn_prb*NR_NB_SC_PER_RB; k++) { From 63b8be329687761044496a47a43a070d2fe9f29f Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Tue, 6 Nov 2018 15:38:04 +0100 Subject: [PATCH 070/117] DMRS sequence generation --- openair1/PHY/INIT/nr_init.c | 12 ++++++++---- openair1/PHY/NR_REFSIG/nr_gold.c | 22 ++++++++++++---------- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 4 ++-- openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 2 +- openair1/PHY/defs_gNB.h | 2 +- openair1/PHY/defs_nr_common.h | 4 ++-- 6 files changed, 26 insertions(+), 20 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 6765d8b865..307935068f 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -147,14 +147,18 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, //PDSCH DMRS init - gNB->nr_gold_pdsch_dmrs = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t**)); - uint32_t ***pdsch_dmrs = gNB->nr_gold_pdsch_dmrs; + gNB->nr_gold_pdsch_dmrs = (uint32_t ****)malloc16(fp->slots_per_frame*sizeof(uint32_t***)); + uint32_t ****pdsch_dmrs = gNB->nr_gold_pdsch_dmrs; for (int slot=0; slotslots_per_frame; slot++) { - pdsch_dmrs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t*)); + pdsch_dmrs[slot] = (uint32_t ***)malloc16(fp->symbols_per_slot*sizeof(uint32_t**)); AssertFatal(pdsch_dmrs[slot]!=NULL, "NR init: pdsch_dmrs for slot %d - malloc failed\n", slot); for (int symb=0; symbsymbols_per_slot; symb++){ - pdsch_dmrs[slot][symb] = (uint32_t *)malloc16(NR_MAX_PDSCH_DMRS_INIT_LENGTH_DWORD*sizeof(uint32_t)); + pdsch_dmrs[slot][symb] = (uint32_t **)malloc16(NR_MAX_NB_CODEWORDS*sizeof(uint32_t*)); AssertFatal(pdsch_dmrs[slot][symb]!=NULL, "NR init: pdsch_dmrs for slot %d symbol %d - malloc failed\n", slot, symb); + for (int q=0; qsymbols_per_slot; symb++) { reset = 1; - x2 = ((1<<17) * (14*slot+symb+1) * ((Nid<<1)+1) + (Nid<<1))&(((uint32_t)1<<31)-1); + x2 = ((1<<17) * (14*slot+symb+1) * ((Nid<<1)+1) + (Nid<<1)); for (uint32_t n=0; nframe_parms; - uint32_t ***pdsch_dmrs = gNB->nr_gold_pdsch_dmrs; - //x2 compute by 38.211 7.4.1.1.1 - Nscid = 0; + uint32_t ****pdsch_dmrs = gNB->nr_gold_pdsch_dmrs; + + uint16_t N_n_scid[NR_MAX_NB_CODEWORDS]={Nid, Nid}; // Not correct, appropriate scrambling IDs have to be updated to support DCI 1_1 + uint8_t n_scid=0; // again works only for 1_0 for (uint8_t slot=0; slotslots_per_frame; slot++) { for (uint8_t symb=0; symbsymbols_per_slot; symb++) { + for (uint8_t q=0; qsymbols_per_slot*slot+symb+1) * ((N_n_scid[n_scid]<<1)+1) +((N_n_scid[n_scid]<<1)+n_scid)); + for (uint32_t n=0; nnb_layers; l++) int16_t mod_dmrs[n_dmrs<<1]; uint8_t dmrs_type = config.pdsch_config.dmrs_type.value; l0 = get_l0(dmrs_type, 2);//config.pdsch_config.dmrs_typeA_position.value); - nr_modulation(pdsch_dmrs[l0], n_dmrs, MOD_QPSK, mod_dmrs); + nr_modulation(pdsch_dmrs[l0][0], n_dmrs, MOD_QPSK, mod_dmrs); // currently only codeword 0 is modulated #ifdef DEBUG_DLSCH printf("DMRS modulation (single symbol %d, %d symbols, type %d):\n", l0, n_dmrs, dmrs_type); for (int i=0; i>3; i++) { diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index 375d2d0fef..95af0fa9f5 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -79,7 +79,7 @@ void nr_pdsch_layer_mapping(int16_t **mod_symbs, uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch, NR_gNB_DCI_ALLOC_t dci_alloc, - uint32_t **pdsch_dmrs, + uint32_t ***pdsch_dmrs, int32_t** txdataF, int16_t amp, uint8_t subframe, diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 2b859256ed..dac25651b3 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -405,7 +405,7 @@ typedef struct PHY_VARS_gNB_s { uint32_t ***nr_gold_pdcch_dmrs; /// PDSCH DMRS sequence - uint32_t ***nr_gold_pdsch_dmrs; + uint32_t ****nr_gold_pdsch_dmrs; /// Indicator set to 0 after first SR uint8_t first_sr[NUMBER_OF_UE_MAX]; diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 17e0267712..742c3fa3c0 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -73,8 +73,8 @@ /*used for the resource mapping*/ #define NR_MAX_PDCCH_DMRS_LENGTH 576 // 16(L)*2(QPSK)*3(3 DMRS symbs per REG)*6(REG per CCE) -#define NR_MAX_PDSCH_DMRS_LENGTH 1100 //275*2(k)*2(QPSK) -#define NR_MAX_PDSCH_DMRS_INIT_LENGTH_DWORD 35 // ceil(NR_MAX_PDSCH_DMRS_LENGTH/32) +#define NR_MAX_PDSCH_DMRS_LENGTH 3300 //275*6(k)*2(QPSK) +#define NR_MAX_PDSCH_DMRS_INIT_LENGTH_DWORD 104 // ceil(NR_MAX_PDSCH_DMRS_LENGTH/32) #define NR_MAX_DCI_PAYLOAD_SIZE 64 #define NR_MAX_DCI_SIZE 1728 //16(L)*2(QPSK)*9(12 RE per REG - 3(DMRS))*6(REG per CCE) From 568a9b29ad6e0ce11566daf969aee7c428cfcd9d Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Tue, 6 Nov 2018 15:53:02 +0100 Subject: [PATCH 071/117] adding dlsch unscrambling --- openair1/PHY/MODULATION/slot_fep_nr.c | 35 ++++----- .../nr_dl_channel_estimation.c | 14 ++-- .../PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 23 ++++++ .../NR_UE_TRANSPORT/nr_transport_proto_ue.h | 6 ++ openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 75 ++++++++++--------- openair1/SIMULATION/NR_PHY/dlschsim.c | 8 +- 6 files changed, 97 insertions(+), 64 deletions(-) diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c index f1f2a94b93..de00d2b4bb 100644 --- a/openair1/PHY/MODULATION/slot_fep_nr.c +++ b/openair1/PHY/MODULATION/slot_fep_nr.c @@ -44,7 +44,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, unsigned char symbol = l;//+((7-frame_parms->Ncp)*(Ns&1)); ///symbol within sub-frame unsigned int nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples); unsigned int nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples0); - unsigned int subframe_offset;//,subframe_offset_F; + //unsigned int subframe_offset;//,subframe_offset_F; unsigned int slot_offset; //int i; unsigned int frame_length_samples = frame_parms->samples_per_subframe * 10; @@ -52,13 +52,8 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, //NR_UE_PDCCH *pdcch_vars = ue->pdcch_vars[ue->current_thread_id[Ns>>1]][0]; uint16_t coreset_start_subcarrier = frame_parms->first_carrier_offset+516; uint16_t nb_rb_coreset = 24; - uint16_t bwp_start_subcarrier = frame_parms->first_carrier_offset; - uint16_t nb_rb_pdsch = 100; - - /*LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id]; - unsigned char harq_pid = dlsch_ue[0]->current_harq_pid; - LTE_DL_UE_HARQ_t *dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid]; - int uespec_pilot[9][1200];*/ + uint16_t bwp_start_subcarrier = frame_parms->first_carrier_offset+516; + uint16_t nb_rb_pdsch = 50; void (*dft)(int16_t *,int16_t *, int); int tmp_dft_in[8192] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs @@ -102,11 +97,9 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, } if (no_prefix) { - subframe_offset = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_tti * (Ns>>1); - slot_offset = frame_parms->ofdm_symbol_size * (frame_parms->symbols_per_tti>>1) * (Ns%2); + slot_offset = frame_parms->ofdm_symbol_size * (frame_parms->symbols_per_slot) * (Ns); } else { - subframe_offset = frame_parms->samples_per_tti * (Ns>>1); - slot_offset = (frame_parms->samples_per_tti>>1) * (Ns%2); + slot_offset = (frame_parms->samples_per_subframe/frame_parms->slots_per_subframe) * (Ns); } /*if (l<0 || l>=7-frame_parms->Ncp) { @@ -122,9 +115,9 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, for (aa=0; aanb_antennas_rx; aa++) { - memset(&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int)); + memset(&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int)); - rx_offset = sample_offset + slot_offset + nb_prefix_samples0 + subframe_offset - SOFFSET; + rx_offset = sample_offset + slot_offset + nb_prefix_samples0 - SOFFSET; // Align with 256 bit // rx_offset = rx_offset&0xfffffff8; @@ -140,14 +133,14 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, (void *)&common_vars->rxdata[aa][rx_offset % frame_length_samples], frame_parms->ofdm_symbol_size*sizeof(int)); dft((int16_t *)tmp_dft_in, - (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); + (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); } else { // use dft input from RX buffer directly #if UE_TIMING_TRACE start_meas(&ue->rx_dft_stats); #endif dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples], - (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); + (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); #if UE_TIMING_TRACE stop_meas(&ue->rx_dft_stats); #endif @@ -158,8 +151,8 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, #ifdef DEBUG_FEP // if (ue->frame <100) - LOG_I(PHY,"slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, subframe_offset %d, sample_offset %d,rx_offset %d, frame_length_samples %d\n", ue->proc.proc_rxtx[(Ns>>1)&1].frame_rx,Ns, symbol, - nb_prefix_samples,nb_prefix_samples0,slot_offset,subframe_offset,sample_offset,rx_offset,frame_length_samples); + LOG_I(PHY,"slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, sample_offset %d,rx_offset %d, frame_length_samples %d\n", ue->proc.proc_rxtx[(Ns>>1)&1].frame_rx,Ns, symbol, + nb_prefix_samples,nb_prefix_samples0,slot_offset,sample_offset,rx_offset,frame_length_samples); #endif if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size)) @@ -175,11 +168,11 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, (void *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples], frame_parms->ofdm_symbol_size*sizeof(int)); dft((int16_t *)tmp_dft_in, - (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); + (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); } else { // use dft input from RX buffer directly dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples], - (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); + (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); } #if UE_TIMING_TRACE stop_meas(&ue->rx_dft_stats); @@ -190,7 +183,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, #ifdef DEBUG_FEP // if (ue->frame <100) - printf("slot_fep: frame %d: symbol %d rx_offset %d\n", ue->proc.proc_rxtx[(Ns>>1)&1].frame_rx, symbol,rx_offset); + printf("slot_fep: frame %d: symbol %d rx_offset %d\n", ue->proc.proc_rxtx[(Ns)&1].frame_rx, symbol,rx_offset); #endif } diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index 5755355381..050478b0b0 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -48,9 +48,9 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, //uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1]; - uint8_t nushift,ssb_index=0, n_hf=0; - int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[eNB_offset]; - int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF; + uint8_t nushift, ssb_index=0, n_hf=0; + int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].dl_ch_estimates[eNB_offset]; + int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF; nushift = ue->frame_parms.Nid_cell%4; ue->frame_parms.nushift = nushift; @@ -271,8 +271,8 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, //uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1]; uint8_t nushift; - int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[eNB_offset]; - int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF; + int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].dl_ch_estimates[eNB_offset]; + int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF; nushift = 1; ue->frame_parms.nushift = nushift; @@ -448,8 +448,8 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, //uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1]; uint8_t nushift; - int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[eNB_offset]; - int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF; + int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].dl_ch_estimates[eNB_offset]; + int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF; nushift = (p>>1)&1; ue->frame_parms.nushift = nushift; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index 1bd7f6af95..3422c779d3 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -167,6 +167,29 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint return(NULL); } +void nr_dlsch_unscrambling(int16_t* llr, + uint8_t size, + uint8_t q, + uint32_t Nid, + uint32_t n_RNTI) { + + uint8_t reset; + uint32_t x1, x2, s=0; + + reset = 1; + x2 = (n_RNTI<<15) + (q<<14) + Nid; + + for (int i=0; i>(i&0x1f))&1)==1) + llr[i] = -llr[i]; + } + +} + uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, short *dlsch_llr, NR_DL_FRAME_PARMS *frame_parms, diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h index 8d6a1addbb..7e6a3722d7 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h @@ -1005,6 +1005,12 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, uint8_t is_crnti, uint8_t llr8_flag); +void nr_dlsch_unscrambling(int16_t* llr, + uint8_t size, + uint8_t q, + uint32_t Nid, + uint32_t n_RNTI); + uint32_t dlsch_decoding_emul(PHY_VARS_NR_UE *phy_vars_ue, uint8_t subframe, diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 54b97b047a..8c107d085e 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -4251,6 +4251,9 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, NR_UE_PDSCH *pdsch_vars; uint8_t is_cw0_active = 0; uint8_t is_cw1_active = 0; + uint8_t nb_re_dmrs = 6; + uint16_t length_dmrs = 1; + uint16_t nb_symb_sch = 4; if (dlsch0==NULL) AssertFatal(0,"dlsch0 should be defined at this level \n"); @@ -4315,25 +4318,22 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, if (abstraction_flag == 0) { // start ldpc decode for CW 0 - dlsch0->harq_processes[harq_pid]->G = get_G(&ue->frame_parms, - dlsch0->harq_processes[harq_pid]->nb_rb, - dlsch0->harq_processes[harq_pid]->rb_alloc_even, - dlsch0->harq_processes[harq_pid]->Qm, - dlsch0->harq_processes[harq_pid]->Nl, - ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->num_pdcch_symbols, - frame_rx, - nr_tti_rx, - ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id]); + dlsch0->harq_processes[harq_pid]->G = nr_get_G(dlsch0->harq_processes[harq_pid]->nb_rb, + nb_symb_sch, + nb_re_dmrs, + length_dmrs, + dlsch0->harq_processes[harq_pid]->Qm, + dlsch0->harq_processes[harq_pid]->Nl); #if UE_TIMING_TRACE start_meas(&ue->dlsch_unscrambling_stats); #endif - /*dlsch_unscrambling(&ue->frame_parms, - 0, - dlsch0, - dlsch0->harq_processes[harq_pid]->G, - pdsch_vars->llr[0], - 0, - nr_tti_rx<<1);*/ + nr_dlsch_unscrambling(pdsch_vars->llr[0], + dlsch0->harq_processes[harq_pid]->G, + 0, + ue->frame_parms.Nid_cell, + dlsch0->rnti); + + #if UE_TIMING_TRACE stop_meas(&ue->dlsch_unscrambling_stats); #endif @@ -4371,6 +4371,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, dlsch0, dlsch0->harq_processes[harq_pid], frame_rx, + nb_symb_sch, nr_tti_rx, harq_pid, pdsch==PDSCH?1:0,//proc->decoder_switch, @@ -4396,25 +4397,20 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, if(is_cw1_active) { // start ldpc decode for CW 1 - dlsch1->harq_processes[harq_pid]->G = get_G(&ue->frame_parms, - dlsch1->harq_processes[harq_pid]->nb_rb, - dlsch1->harq_processes[harq_pid]->rb_alloc_even, - dlsch1->harq_processes[harq_pid]->Qm, - dlsch1->harq_processes[harq_pid]->Nl, - ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->num_pdcch_symbols, - frame_rx, - nr_tti_rx, - ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id]); + dlsch1->harq_processes[harq_pid]->G = nr_get_G(dlsch1->harq_processes[harq_pid]->nb_rb, + nb_symb_sch, + nb_re_dmrs, + length_dmrs, + dlsch1->harq_processes[harq_pid]->Qm, + dlsch1->harq_processes[harq_pid]->Nl); #if UE_TIMING_TRACE start_meas(&ue->dlsch_unscrambling_stats); #endif - /*dlsch_unscrambling(&ue->frame_parms, - 0, - dlsch1, - dlsch1->harq_processes[harq_pid]->G, - pdsch_vars->llr[1], - 1, - nr_tti_rx<<1);*/ + nr_dlsch_unscrambling(pdsch_vars->llr[1], + dlsch1->harq_processes[harq_pid]->G, + 0, + ue->frame_parms.Nid_cell, + dlsch1->rnti); #if UE_TIMING_TRACE stop_meas(&ue->dlsch_unscrambling_stats); #endif @@ -4452,6 +4448,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, dlsch1, dlsch1->harq_processes[harq_pid], frame_rx, + nb_symb_sch, nr_tti_rx, harq_pid, pdsch==PDSCH?1:0,//proc->decoder_switch, @@ -5634,16 +5631,26 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN //#if 0 LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx); //to update from pdsch config - nr_gold_pdsch(ue,0,0, 1); + nr_gold_pdsch(ue,2,0, 1); + + int nb_prefix_samples0 = ue->frame_parms.nb_prefix_samples0; + ue->frame_parms.nb_prefix_samples0 = ue->frame_parms.nb_prefix_samples; nr_slot_fep(ue, 2, //to be updated from higher layer - (nr_tti_rx<<1), + nr_tti_rx, 0, 0, 0, NR_PDSCH_EST); + //put back nb_prefix_samples0 + ue->frame_parms.nb_prefix_samples0 = nb_prefix_samples0; + + //set active for testing, to be removed + if (nr_tti_rx==1) + ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active = 1; + #if UE_TIMING_TRACE start_meas(&ue->generic_stat); #endif diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c index d597910be2..4c9920e1f4 100644 --- a/openair1/SIMULATION/NR_PHY/dlschsim.c +++ b/openair1/SIMULATION/NR_PHY/dlschsim.c @@ -527,6 +527,8 @@ int main(int argc, char **argv) for (SNR=snr0;SNR10) printf("errors bits uncoded %f\n", errors_bit_uncoded); @@ -597,8 +600,9 @@ int main(int argc, char **argv) //printf("estimated bits error occurs @%d ",i); } } - - printf("\n errors_bit %d \n", errors_bit); +//if (errors_bit>10) + printf("\n errors_bit %d (trial %d)\n", errors_bit,trial); + } printf("SNR %f, BER %f \n",SNR,(float)errors_bit/(float)n_trials/(float)TBS); } From 14b98a093a4f60fc709db930a0f2fdb1731475e7 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Tue, 6 Nov 2018 15:57:21 +0100 Subject: [PATCH 072/117] Phytest scheduler log --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c index f64d1688b7..22446190cf 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c @@ -137,7 +137,13 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, params_rel15->sfn_mod2, params_rel15->first_slot); nr_get_tbs(&dl_config_dlsch_pdu->dlsch_pdu, dl_config_dci_pdu->dci_dl_pdu, *cfg); - //LOG_I(MAC, "DLSCH PDU: ") + LOG_I(MAC, "DLSCH PDU: start PRB %d n_PRB %d start symbol %d nb_symbols %d nb_layers %d nb_codewords %d mcs %d\n", + dlsch_pdu_rel15->start_prb, + dlsch_pdu_rel15->n_prb, + dlsch_pdu_rel15->start_symbol, + dlsch_pdu_rel15->nb_symbols, + dlsch_pdu_rel15->nb_codewords, + dlsch_pdu_rel15->nb_layers); dl_req->number_dci++; dl_req->number_pdsch_rnti++; From 0f8bc0ecb22bb4202626cb77f0248103fc0d8e27 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Tue, 6 Nov 2018 16:11:53 +0100 Subject: [PATCH 073/117] Print bug fix --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 10a5ae53dc..b2e49e100c 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -255,7 +255,7 @@ for (int i=0; i>7; i++) { encoded_length, mod_symbs[q]); #ifdef DEBUG_DLSCH -printf("PDSCH Modulation: Qm %d(%d)\n", Qm, n_symbs); +printf("PDSCH Modulation: Qm %d(%d)\n", Qm, nb_symbols); for (int i=0; i>3; i++) { for (int j=0; j<8; j++) { printf("%d %d\t", mod_symbs[0][((i<<3)+j)<<1], mod_symbs[0][(((i<<3)+j)<<1)+1]); @@ -273,7 +273,7 @@ for (int i=0; i>3; i++) { #ifdef DEBUG_DLSCH printf("Layer mapping (%d layers):\n", rel15->nb_layers); for (int l=0; lnb_layers; l++) - for (int i=0; i<(nb_symbs/rel15->nb_layers)>>3; i++) { + for (int i=0; i<(nb_symbols/rel15->nb_layers)>>3; i++) { for (int j=0; j<8; j++) { printf("%d %d\t", tx_layers[l][((i<<3)+j)<<1], tx_layers[l][(((i<<3)+j)<<1)+1]); } From 8f45c7027383d3aaaae6702a52a2fd8422863f32 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Thu, 8 Nov 2018 12:01:54 +0100 Subject: [PATCH 074/117] DMRS seq slot idx --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 4 ++-- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index b2e49e100c..03b0f61f88 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -290,7 +290,7 @@ for (int l=0; lnb_layers; l++) uint8_t dmrs_type = config.pdsch_config.dmrs_type.value; l0 = get_l0(dmrs_type, 2);//config.pdsch_config.dmrs_typeA_position.value); nr_modulation(pdsch_dmrs[l0][0], n_dmrs, MOD_QPSK, mod_dmrs); // currently only codeword 0 is modulated -#ifdef DEBUG_DLSCH +//#ifdef DEBUG_DLSCH printf("DMRS modulation (single symbol %d, %d symbols, type %d):\n", l0, n_dmrs, dmrs_type); for (int i=0; i>3; i++) { for (int j=0; j<8; j++) { @@ -298,7 +298,7 @@ for (int i=0; i>3; i++) { } printf("\n"); } -#endif +//#endif /// Resource mapping AssertFatal(rel15->nb_layers<=config.rf_config.tx_antenna_ports.value, "Not enough Tx antennas (%d) for %d layers\n",\ diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index cee2d48592..9a4791e912 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -188,7 +188,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, LOG_I(PHY, "[gNB %d] Frame %d subframe %d \ Calling nr_generate_dci_top (number of DCI %d)\n", gNB->Mod_id, frame, subframe, num_dci); - uint8_t slot_idx = gNB->pdcch_vars.dci_alloc[0].pdcch_params.first_slot; + uint8_t slot_idx = gNB->pdcch_vars.dci_alloc[0].pdcch_params.first_slot + subframe*fp->slots_per_subframe; if (nfapi_mode == 0 || nfapi_mode == 1){ nr_generate_dci_top(gNB->pdcch_vars, From 6d760fe41dcefb2baf17a567c34e5daabb07c60c Mon Sep 17 00:00:00 2001 From: hongzhi wang Date: Thu, 8 Nov 2018 16:22:52 +0100 Subject: [PATCH 075/117] fix nr ue pdsch --- openair1/PHY/MODULATION/slot_fep_nr.c | 1 + openair1/PHY/NR_REFSIG/nr_dmrs_rx.c | 2 +- openair1/PHY/NR_REFSIG/nr_gold_ue.c | 5 + openair1/PHY/NR_REFSIG/refsig_defs_ue.h | 2 +- openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h | 8 +- .../nr_dl_channel_estimation.c | 110 +++++++++++------- openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h | 1 + openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c | 2 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 23 ++-- targets/ARCH/COMMON/common_lib.h | 3 + targets/RT/USER/nr-ue.c | 11 +- targets/RT/USER/nr-uesoftmodem.c | 2 + 12 files changed, 114 insertions(+), 56 deletions(-) diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c index de00d2b4bb..876da0af1f 100644 --- a/openair1/PHY/MODULATION/slot_fep_nr.c +++ b/openair1/PHY/MODULATION/slot_fep_nr.c @@ -261,6 +261,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, #endif nr_pdsch_channel_estimation(ue,eNB_id,0, Ns, + 0, l, symbol, bwp_start_subcarrier, diff --git a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c index 793c6f85bf..2dae7ab6b5 100644 --- a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c +++ b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c @@ -51,7 +51,7 @@ int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue, unsigned int Ns, unsigned int *nr_gold_pdsch, int32_t *output, - unsigned char p, + unsigned short p, unsigned char lp, unsigned short nb_pdsch_rb) { diff --git a/openair1/PHY/NR_REFSIG/nr_gold_ue.c b/openair1/PHY/NR_REFSIG/nr_gold_ue.c index c856d43df3..c03c1e6904 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold_ue.c +++ b/openair1/PHY/NR_REFSIG/nr_gold_ue.c @@ -123,6 +123,8 @@ void nr_gold_pdsch(PHY_VARS_NR_UE* ue,unsigned short lbar,unsigned short *n_idDM nid = n_idDMRS[nscid]; else nid = ue->frame_parms.Nid_cell; + + //printf("gold pdsch nid %d lbar %d\n",nid,lbar); for (ns=0; ns<20; ns++) { @@ -130,6 +132,8 @@ void nr_gold_pdsch(PHY_VARS_NR_UE* ue,unsigned short lbar,unsigned short *n_idDM x2tmp0 = ((14*ns+(lbar+l)+1)*((nid<<1)+1))<<17; x2 = (x2tmp0+(nid<<1)+nscid)%(1<<31); //cinit + + //printf("ns %d gold pdsch x2 %d\n",ns,x2); x1 = 1+ (1<<31); x2=x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31); @@ -149,6 +153,7 @@ void nr_gold_pdsch(PHY_VARS_NR_UE* ue,unsigned short lbar,unsigned short *n_idDM x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4); x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28); ue->nr_gold_pdsch[nscid][ns][l][n] = x1^x2; + // if ((ns==2)&&(l==0)) //printf("n=%d : c %x\n",n,x1^x2); } diff --git a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h index 905d95e541..a47e65d0b0 100644 --- a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h +++ b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h @@ -46,7 +46,7 @@ int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue, unsigned int Ns, unsigned int *nr_gold_pdsch, int32_t *output, - unsigned char p, + unsigned short p, unsigned char lp, unsigned short nb_pdsch_rb); diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h index 52356a9438..f94b18fb27 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h +++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h @@ -90,7 +90,7 @@ short filt8_l0[8] = { 16384,8192,0,0,0,0,0,0}; short filt8_mr0[8] = { -0,8192,16384,8192,0,-8192,0,0}; +0,0,0,8192,16384,8192,0,-8192}; short filt8_r0[8] = { 0,8192,16384,24576,0,0,0,0}; @@ -98,6 +98,9 @@ short filt8_r0[8] = { short filt8_m0[8] = { 0,8192,16384,8192,0,0,0,0}; +short filt8_mm0[8]= { +0,0,0,8192,16384,8192,0,0}; + short filt8_l1[8] = { 24576,16384,0,0,0,0,0,0}; @@ -109,3 +112,6 @@ short filt8_r1[8] = { short filt8_m1[8] = { 0,0,8192,16384,8192,0,0,0}; + +short filt8_mm1[8]= { +0,0,0,0,8192,16384,8192,0}; diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index 050478b0b0..c540da5a4e 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -432,22 +432,24 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, uint8_t eNB_id, uint8_t eNB_offset, unsigned char Ns, - unsigned char p, + unsigned short p, unsigned char l, unsigned char symbol, unsigned short bwp_start_subcarrier, unsigned short nb_rb_pdsch) { - int pilot[2][200] __attribute__((aligned(16))); + int pilot[1320] __attribute__((aligned(16))); unsigned char aarx; unsigned short k; unsigned int pilot_cnt; - int16_t ch[2],*pil,*rxF,*dl_ch,*fl,*fm,*fr,*fml,*fmr; + int16_t ch[2],*pil,*rxF,*dl_ch,*fl,*fm,*fr,*fml,*fmr,*fmm; int ch_offset,symbol_offset; //uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1]; uint8_t nushift; + //int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].dl_ch_estimates[eNB_offset]; + //int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF; int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].dl_ch_estimates[eNB_offset]; int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF; @@ -463,16 +465,17 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, k = bwp_start_subcarrier; -#ifdef DEBUG_CH - printf("PBCH Channel Estimation : ThreadId %d, eNB_offset %d cell_id %d ch_offset %d, OFDM size %d, Ncp=%d, l=%d, Ns=%d, k=%d symbol %d\n",ue->current_thread_id[Ns>>1], eNB_offset,Nid_cell,ch_offset,ue->frame_parms.ofdm_symbol_size, +//#ifdef DEBUG_CH + printf("PDSCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, symbol_offset %d OFDM size %d, Ncp=%d, l=%d, Ns=%d, k=%d symbol %d\n",ue->current_thread_id[Ns>>1], eNB_offset,ch_offset,symbol_offset,ue->frame_parms.ofdm_symbol_size, ue->frame_parms.Ncp,l,Ns,k, symbol); -#endif +//#endif switch (nushift) { case 0: fl = filt8_l0; fm = filt8_m0; fr = filt8_r0; + fmm = filt8_mm0; fml = filt8_m0; fmr = filt8_mr0; break; @@ -481,6 +484,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, fl = filt8_l1; fm = filt8_m1; fr = filt8_r1; + fmm = filt8_mm1; fml = filt8_ml1; fmr = filt8_m1; break; @@ -493,34 +497,34 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, // generate pilot - nr_pdsch_dmrs_rx(ue,Ns,ue->nr_gold_pdsch[eNB_offset][Ns][symbol], &pilot[p][0],1000,1,nb_rb_pdsch); + nr_pdsch_dmrs_rx(ue,Ns,ue->nr_gold_pdsch[eNB_offset][Ns][0], &pilot[0],1000,0,nb_rb_pdsch); for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { - pil = (int16_t *)&pilot[p][0]; + pil = (int16_t *)&pilot[0]; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+nushift)]; - dl_ch = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][ch_offset]; + dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset]; memset(dl_ch,0,4*(ue->frame_parms.ofdm_symbol_size)); if (ue->high_speed_flag==0) // multiply previous channel estimate by ch_est_alpha multadd_complex_vector_real_scalar(dl_ch-(ue->frame_parms.ofdm_symbol_size<<1), ue->ch_est_alpha,dl_ch-(ue->frame_parms.ofdm_symbol_size<<1), 1,ue->frame_parms.ofdm_symbol_size); -#ifdef DEBUG_CH - printf("ch est pilot addr %p RB_DL %d\n",&pilot[p][0], ue->frame_parms.N_RB_DL); +//#ifdef DEBUG_CH + printf("ch est pilot addr %p RB_DL %d\n",&pilot[0], ue->frame_parms.N_RB_DL); printf("k %d, first_carrier %d\n",k,ue->frame_parms.first_carrier_offset); - printf("rxF addr %p\n", rxF); + printf("rxF addr %p p %d\n", rxF,p); printf("dl_ch addr %p\n",dl_ch); -#endif - if ((ue->frame_parms.N_RB_DL&1)==0) { +//#endif + //if ((ue->frame_parms.N_RB_DL&1)==0) { // Treat first 2 pilots specially (left edge) ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -#ifdef DEBUG_CH +//#ifdef DEBUG_CH printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])); printf("pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); -#endif +//#endif multadd_real_vector_complex_scalar(fl, ch, dl_ch, @@ -532,21 +536,35 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -#ifdef DEBUG_CH +//#ifdef DEBUG_CH printf("pilot 1 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); -#endif +//#endif multadd_real_vector_complex_scalar(fml, ch, dl_ch, 8); pil+=2; rxF+=4; - dl_ch+=4; + printf("dl_ch addr %p\n",dl_ch); + + ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); + ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); +//#ifdef DEBUG_CH + printf("pilot 2 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); +//#endif + multadd_real_vector_complex_scalar(fmm, + ch, + dl_ch, + 8); + pil+=2; + rxF+=4; + dl_ch+=8; k+=4; + printf("dl_ch addr %p\n",dl_ch); - for (pilot_cnt=2; pilot_cnt<(6*(nb_rb_pdsch-1)+4); pilot_cnt+=2) { - if ((pilot_cnt%6)==0) - dl_ch+=4; + for (pilot_cnt=3; pilot_cnt<6*(nb_rb_pdsch-1); pilot_cnt+=3) { + //if ((pilot_cnt%6)==0) + //dl_ch+=4; if (k >= ue->frame_parms.ofdm_symbol_size){ k-=ue->frame_parms.ofdm_symbol_size; @@ -554,9 +572,9 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -#ifdef DEBUG_CH +//#ifdef DEBUG_CH printf("pilot %d : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); -#endif +//#endif multadd_real_vector_complex_scalar(fm, ch, dl_ch, @@ -564,55 +582,67 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, pil+=2; rxF+=4; - dl_ch+=4; - + ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -#ifdef DEBUG_CH +//#ifdef DEBUG_CH printf("pilot %d : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); -#endif - multadd_real_vector_complex_scalar(fm, +//#endif + multadd_real_vector_complex_scalar(fmm, ch, dl_ch, 8); pil+=2; rxF+=4; - dl_ch+=4; + dl_ch+=8; k+=4; } // Treat first 2 pilots specially (right edge) + ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); + ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); +//#ifdef DEBUG_CH + printf("pilot %d : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+2,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); +//#endif + multadd_real_vector_complex_scalar(fmm, + ch, + dl_ch, + 8); + pil+=2; + rxF+=4; + ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -#ifdef DEBUG_CH +//#ifdef DEBUG_CH printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])); printf("pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); -#endif +//#endif multadd_real_vector_complex_scalar(fmr, ch, dl_ch, 8); pil+=2; rxF+=4; + dl_ch+=8; + k+=4; + //for (int i= 0; i<8; i++) //printf("dl_ch addr %p %d\n", dl_ch+i, *(dl_ch+i)); - ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); - ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); + //ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); + //ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); #ifdef DEBUG_CH printf("pilot 1 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); #endif multadd_real_vector_complex_scalar(fr, ch, dl_ch, - 8); - pil+=2; - rxF+=4; - dl_ch+=4; - k+=4; + 4); + //pil+=2; + //rxF+=4; - } + //} } diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h index 25d6755723..aaaf63e753 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h @@ -62,6 +62,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, uint8_t eNB_id, uint8_t eNB_offset, unsigned char Ns, + unsigned short p, unsigned char l, unsigned char symbol, unsigned short bwp_start_subcarrier, diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c index fd686cf0c5..bac082f2d6 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c @@ -35,7 +35,7 @@ #include "PHY/sse_intrin.h" #include "PHY/LTE_REFSIG/lte_refsig.h" -#define DEBUG_PBCH 1 +//#define DEBUG_PBCH 1 //#define DEBUG_PBCH_ENCODING #ifdef OPENAIR2 diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 8c107d085e..5c8e482e2f 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -5568,8 +5568,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN nr_slot_fep(ue, l, nr_tti_rx, + ue->ssb_offset, 0, - 1, 1, NR_PDCCH_EST); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT); @@ -5630,26 +5630,29 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN #endif //#if 0 LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx); + //set active for testing, to be removed + //if (nr_tti_rx==2){ //to update from pdsch config nr_gold_pdsch(ue,2,0, 1); + int nb_prefix_samples0 = ue->frame_parms.nb_prefix_samples0; ue->frame_parms.nb_prefix_samples0 = ue->frame_parms.nb_prefix_samples; nr_slot_fep(ue, 2, //to be updated from higher layer nr_tti_rx, + ue->ssb_offset, 0, - 0, - 0, + 1, NR_PDSCH_EST); //put back nb_prefix_samples0 ue->frame_parms.nb_prefix_samples0 = nb_prefix_samples0; - - //set active for testing, to be removed - if (nr_tti_rx==1) + + ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active = 1; + //} #if UE_TIMING_TRACE start_meas(&ue->generic_stat); @@ -5726,13 +5729,13 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN start_meas(&ue->ofdm_demod_stats); #endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN); - nr_slot_fep(ue, + /*nr_slot_fep(ue, l, 1+(nr_tti_rx<<1), 0, 0, 0, - NR_PDSCH_EST); + NR_PDSCH_EST);*/ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT); #if UE_TIMING_TRACE stop_meas(&ue->ofdm_demod_stats); @@ -5747,13 +5750,13 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN int next_nr_tti_rx = (1+nr_tti_rx)%10; if (nr_subframe_select(&ue->frame_parms,next_nr_tti_rx) != SF_UL) { - nr_slot_fep(ue, + /*nr_slot_fep(ue, 0, (next_nr_tti_rx<<1), 0, 0, 0, - NR_PDSCH_EST); + NR_PDSCH_EST);*/ } } // not an S-subframe #if UE_TIMING_TRACE diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index ae5f4d91d9..aa2bc01a72 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -204,7 +204,10 @@ typedef struct { //! clock source clock_source_t clock_source; //! Manual SDR IP address +//#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) +#ifndef OAI_ADRV9371_ZC706 char *sdr_addrs; +#endif //! Auto calibration flag int autocal[4]; //! rf devices work with x bits iqs when oai have its own iq format diff --git a/targets/RT/USER/nr-ue.c b/targets/RT/USER/nr-ue.c index 0fd27f58e3..2f9c7c6b0a 100644 --- a/targets/RT/USER/nr-ue.c +++ b/targets/RT/USER/nr-ue.c @@ -824,6 +824,7 @@ void *UE_thread(void *arg) { int i; char threadname[128]; int th_id; + unsigned char nb_sf_init=10; UE->proc.proc_rxtx[0].counter_decoder = 0; UE->proc.proc_rxtx[1].counter_decoder = 0; UE->proc.proc_rxtx[2].counter_decoder = 0; @@ -865,6 +866,12 @@ void *UE_thread(void *arg) { printf("ue sync not ready\n"); usleep(500*1000); } +#endif + +#ifndef OAI_ADRV9371_ZC706 +nb_sf_init = 10; +#else +nb_sf_init=5; #endif if (instance_cnt_synch < 0) { // we can invoke the synch // grab 10 ms of signal and wakeup synch thread @@ -872,11 +879,11 @@ void *UE_thread(void *arg) { rxp[i] = (void*)&UE->common_vars.rxdata[i][0]; if (UE->mode != loop_through_memory) - AssertFatal( UE->frame_parms.samples_per_subframe*10 == + AssertFatal( UE->frame_parms.samples_per_subframe*nb_sf_init == UE->rfdevice.trx_read_func(&UE->rfdevice, ×tamp, rxp, - UE->frame_parms.samples_per_subframe*10, + UE->frame_parms.samples_per_subframe*nb_sf_init, UE->frame_parms.nb_antennas_rx), "error reading samples"); AssertFatal ( 0== pthread_mutex_lock(&UE->proc.mutex_synch), ""); diff --git a/targets/RT/USER/nr-uesoftmodem.c b/targets/RT/USER/nr-uesoftmodem.c index 69e04023bb..10c6f87cdc 100644 --- a/targets/RT/USER/nr-uesoftmodem.c +++ b/targets/RT/USER/nr-uesoftmodem.c @@ -782,7 +782,9 @@ void init_openair0() { openair0_cfg[card].rx_freq[i]); } +#ifndef OAI_ADRV9371_ZC706 if (usrp_args) openair0_cfg[card].sdr_addrs = usrp_args; +#endif if (usrp_clksrc) { if (strcmp(usrp_clksrc, "internal") == 0) { openair0_cfg[card].clock_source = internal; From 0e9443880ef90243833bf40f76d522803c5dfec5 Mon Sep 17 00:00:00 2001 From: hongzhi wang Date: Fri, 9 Nov 2018 09:58:36 +0100 Subject: [PATCH 076/117] changes for pdsch test --- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 711f3df68b..bd3e5e8cfc 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -5591,10 +5591,10 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN //printf(">>> at phy_procedures_nrUE_RX, nr_ue_pdcch_procedures init, dlsch->active=%d\n", // ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active); - if (nr_ue_pdcch_procedures(eNB_id,ue,proc,abstraction_flag) == -1) { + /*if (nr_ue_pdcch_procedures(eNB_id,ue,proc,abstraction_flag) == -1) { LOG_E(PHY,"[UE %d] Frame %d, nr_tti_rx %d: Error in pdcch procedures\n",ue->Mod_id,frame_rx,nr_tti_rx); return(-1); - } + }*/ //for (int m=0;m<1000;m++) printf("%d",m); //printf("\n>>> at phy_procedures_nrUE_RX, nr_ue_pdcch_procedures end, dlsch->active=%d\n", // ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active); @@ -5654,7 +5654,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN //#if 0 LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx); //set active for testing, to be removed - //if (nr_tti_rx==2){ + if (nr_tti_rx==2){ //to update from pdsch config nr_gold_pdsch(ue,2,0, 1); @@ -5665,7 +5665,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN nr_slot_fep(ue, 2, //to be updated from higher layer nr_tti_rx, - ue->ssb_offset, + 0, 0, 1, NR_PDSCH_EST); @@ -5675,7 +5675,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active = 1; - //} + } #if UE_TIMING_TRACE start_meas(&ue->generic_stat); From 93641258134800adaee942e3b6f57a11de27ae74 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Fri, 9 Nov 2018 18:56:19 +0100 Subject: [PATCH 077/117] Freq shift correction/Various cleanups --- openair1/PHY/NR_TRANSPORT/nr_dci.c | 4 -- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 65 ++++++++++--------- openair1/PHY/NR_TRANSPORT/nr_pbch.c | 6 -- .../LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c | 3 +- targets/RT/USER/nr-ru.c | 9 +-- 5 files changed, 39 insertions(+), 48 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci.c b/openair1/PHY/NR_TRANSPORT/nr_dci.c index 2428853c6c..bc1ed5896c 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dci.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dci.c @@ -331,9 +331,5 @@ printf("\n"); } } -#ifdef DEBUG_DCI - write_output("txdataF_dci.m", "txdataF_dci", txdataF[0], frame_parms.samples_per_frame_wCP>>1, 1, 1); -#endif - return 0; } diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 03b0f61f88..5b08983de9 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -19,13 +19,13 @@ * 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 +/*! \file PHY/NR_TRANSPORT/dlsch_decoding.c +* \brief Top-level routines for transmission of the PDSCH 38211 v 15.2.0 +* \author Guy De Souza +* \date 2018 * \version 0.1 * \company Eurecom -* \email: knopp@eurecom.fr +* \email: desouza@eurecom.fr * \note * \warning */ @@ -36,7 +36,6 @@ //#define DEBUG_DLSCH //#define DEBUG_DLSCH_MAPPING -//#define DEBUG_FILE_OUTPUT uint8_t mod_order[5] = {1, 2, 4, 6, 8}; uint16_t mod_offset[5] = {1,3,7,23,87}; @@ -290,7 +289,7 @@ for (int l=0; lnb_layers; l++) uint8_t dmrs_type = config.pdsch_config.dmrs_type.value; l0 = get_l0(dmrs_type, 2);//config.pdsch_config.dmrs_typeA_position.value); nr_modulation(pdsch_dmrs[l0][0], n_dmrs, MOD_QPSK, mod_dmrs); // currently only codeword 0 is modulated -//#ifdef DEBUG_DLSCH +#ifdef DEBUG_DLSCH printf("DMRS modulation (single symbol %d, %d symbols, type %d):\n", l0, n_dmrs, dmrs_type); for (int i=0; i>3; i++) { for (int j=0; j<8; j++) { @@ -298,19 +297,23 @@ for (int i=0; i>3; i++) { } printf("\n"); } -//#endif +#endif /// Resource mapping AssertFatal(rel15->nb_layers<=config.rf_config.tx_antenna_ports.value, "Not enough Tx antennas (%d) for %d layers\n",\ config.rf_config.tx_antenna_ports.value, rel15->nb_layers); // Non interleaved VRB to PRB mapping - uint8_t start_sc = frame_parms.first_carrier_offset + rel15->start_prb*NR_NB_SC_PER_RB +\ - ((pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_COMMON) && (pdcch_params.dci_format == NFAPI_NR_DL_DCI_FORMAT_1_0))?\ - ((frame_parms.ssb_start_subcarrier/NR_NB_SC_PER_RB + pdcch_params.rb_offset)*NR_NB_SC_PER_RB) : 0; + uint16_t start_sc = frame_parms.first_carrier_offset + frame_parms.ssb_start_subcarrier; + if (start_sc >= frame_parms.ofdm_symbol_size) + start_sc -= frame_parms.ofdm_symbol_size; + /*rel15->start_prb*NR_NB_SC_PER_RB +*/ + //((pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_COMMON) && (pdcch_params.dci_format == NFAPI_NR_DL_DCI_FORMAT_1_0))?\ + // ((frame_parms.ssb_start_subcarrier/NR_NB_SC_PER_RB + pdcch_params.rb_offset)*NR_NB_SC_PER_RB) : 0; #ifdef DEBUG_DLSCH_MAPPING -printf("PDSCH resource mapping started (start SC %d\tstart symbol %d\tN_PRB %d\tnb_symbols %d)\n", start_sc, rel15->start_symbol, rel15->n_prb, rel15->nb_symbols); +printf("PDSCH resource mapping started (start SC %d\tstart symbol %d\tN_PRB %d\tnb_symbols %d)\n", +start_sc, rel15->start_symbol, rel15->n_prb, rel15->nb_symbols); #endif for (int ap=0; apnb_layers; ap++) { @@ -322,22 +325,24 @@ printf("PDSCH resource mapping started (start SC %d\tstart symbol %d\tN_PRB %d\t l_prime[0] = 0; // single symbol ap 0 uint8_t dmrs_symbol = l0+l_prime[0]; #ifdef DEBUG_DLSCH_MAPPING -printf("DMRS params for ap %d: Wt %d %d \t Wf %d %d \t delta %d \t l_prime %d \t l0 %d\tDMRS symbol %d\n", ap, Wt[0], Wt[1], Wf[0], Wf[1], delta, l_prime[0], l0, dmrs_symbol); +printf("DMRS params for ap %d: Wt %d %d \t Wf %d %d \t delta %d \t l_prime %d \t l0 %d\tDMRS symbol %d\n", +ap, Wt[0], Wt[1], Wf[0], Wf[1], delta, l_prime[0], l0, dmrs_symbol); #endif uint8_t k_prime=0; - uint16_t m=0, n=0, dmrs_idx=0;; + uint16_t m=0, n=0, dmrs_idx=0, k=0; - for (int l=rel15->start_symbol; lstart_symbol+rel15->nb_symbols; l++) - for (int k=start_sc; kn_prb*NR_NB_SC_PER_RB; k++) { - if (k >= frame_parms.ofdm_symbol_size) - k -= frame_parms.ofdm_symbol_size; - - if ((l == dmrs_symbol) && (k == (start_sc+get_pdsch_dmrs_idx(n, k_prime, delta, dmrs_type)))) { - ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[dmrs_idx<<1]) >> 15; - ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15; + for (int l=rel15->start_symbol; lstart_symbol+rel15->nb_symbols; l++) { + k = start_sc; + for (int i=0; in_prb*NR_NB_SC_PER_RB; i++) { +// Note the dmrs index modulo 2048 only works for that symbol size -- to be fixed soon +// Also the different amplitudes are for debug purposes and temporary + if ((l == dmrs_symbol) && (k == ((start_sc+get_pdsch_dmrs_idx(n, k_prime, delta, dmrs_type))&((1<<11)-1)))) { + ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*(amp>>1)*mod_dmrs[dmrs_idx<<1]) >> 15; + ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*(amp>>1)*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15; #ifdef DEBUG_DLSCH_MAPPING printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n", -dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1], ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1]); +dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1], +((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1]); #endif dmrs_idx++; k_prime++; @@ -347,20 +352,20 @@ dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_s else { - ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (amp * tx_layers[ap][m<<1]) >> 15; - ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15; + ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1] = ((amp<<1) * tx_layers[ap][m<<1]) >> 15; + ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = ((amp<<1) * tx_layers[ap][(m<<1) + 1]) >> 15; #ifdef DEBUG_DLSCH_MAPPING printf("m %d\t l %d \t k %d \t txdataF: %d %d\n", -m, l, k, ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1], ((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1]); +m, l, k, ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1], +((int16_t*)txdataF[ap])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1]); #endif m++; } + if (++k >= frame_parms.ofdm_symbol_size) + k -= frame_parms.ofdm_symbol_size; } + } } -#ifdef DEBUG_FILE_OUTPUT - write_output("txdataF_dlsch.m", "txdataF_dlsch", txdataF[0], frame_parms.samples_per_subframe_wCP>>1, 1, 1); -#endif - return 0; } diff --git a/openair1/PHY/NR_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_TRANSPORT/nr_pbch.c index 7c6dfe975a..5bd2dbe290 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_pbch.c @@ -432,11 +432,5 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch, } - -#ifdef DEBUG_PBCH - write_output("txdataF_pbch.m", "txdataF_pbch", txdataF[0], frame_parms->samples_per_frame_wCP>>1, 1, 1); -#endif - - return 0; } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c index 22446190cf..8a00b2434c 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c @@ -142,8 +142,9 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, dlsch_pdu_rel15->n_prb, dlsch_pdu_rel15->start_symbol, dlsch_pdu_rel15->nb_symbols, + dlsch_pdu_rel15->nb_layers, dlsch_pdu_rel15->nb_codewords, - dlsch_pdu_rel15->nb_layers); + dlsch_pdu_rel15->mcs_idx); dl_req->number_dci++; dl_req->number_pdsch_rnti++; diff --git a/targets/RT/USER/nr-ru.c b/targets/RT/USER/nr-ru.c index 9d74f6b361..3909b7bfe9 100644 --- a/targets/RT/USER/nr-ru.c +++ b/targets/RT/USER/nr-ru.c @@ -819,7 +819,7 @@ void tx_rf(RU_t *ru) { if ((SF_type == SF_DL) || (SF_type == SF_S)) { - + int siglen=fp->samples_per_subframe,flags=1; /* if (SF_type == SF_S) { @@ -844,12 +844,7 @@ void tx_rf(RU_t *ru) { for (i=0; inb_tx; i++) txp[i] = (void*)&ru->common.txdata[i][(proc->subframe_tx*fp->samples_per_subframe)-sf_extension]; -/* - if (proc->subframe_tx == 0){ - write_output("txdataF_frame.m","txdataF_frame",&ru->common.txdataF_BF[i],fp->samples_per_subframe_wCP, 1, 1); - write_output("txdata_frame.m","txdata_frame",&ru->common.txdata[i],fp->samples_per_subframe, 1, 1); - } -*/ + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx-ru->openair0_cfg.tx_sample_advance)&0xffffffff ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); // prepare tx buffer pointers From 67bf363d6063488ed521b5f99e9dce82899b334f Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Mon, 12 Nov 2018 21:56:51 +0100 Subject: [PATCH 078/117] making nr_pbchsim compile again --- openair1/PHY/INIT/nr_init.c | 67 ++++++++++++++++++++++- openair1/PHY/INIT/phy_init.h | 1 + openair1/SIMULATION/NR_PHY/pbchsim.c | 1 + targets/RT/USER/nr-gnb.c | 81 ---------------------------- 4 files changed, 68 insertions(+), 82 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 17029ff2a8..d41289f7dc 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -38,7 +38,6 @@ extern uint32_t from_earfcn(int eutra_bandP,uint32_t dl_earfcn); extern int32_t get_uldl_offset(int eutra_bandP); -extern void init_nr_transport(PHY_VARS_gNB *gNB); int l1_north_init_gNB() { @@ -480,3 +479,69 @@ void nr_phy_config_request(NR_PHY_Config_t *phy_config) } + +void init_nr_transport(PHY_VARS_gNB *gNB) { + + int i; + int j; + NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; + nfapi_nr_config_request_t *cfg = &gNB->gNB_config; + + LOG_I(PHY, "Initialise nr transport\n"); + + for (i=0; idlsch[i][j] = new_gNB_dlsch(1,16,NSOFT,0,fp,cfg); + if (!gNB->dlsch[i][j]) { + LOG_E(PHY,"Can't get gNB dlsch structures for UE %d \n", i); + exit(-1); + } else { + gNB->dlsch[i][j]->rnti=0; + LOG_D(PHY,"dlsch[%d][%d] => %p rnti:%d\n",i,j,gNB->dlsch[i][j], gNB->dlsch[i][j]->rnti); + } + } + + //LOG_I(PHY,"Allocating Transport Channel Buffer for ULSCH, UE %d\n",i); + //gNB->ulsch[1+i] = new_gNB_ulsch(MAX_TURBO_ITERATIONS,fp->N_RB_UL, 0); + + /*if (!gNB->ulsch[1+i]) { + LOG_E(PHY,"Can't get gNB ulsch structures\n"); + exit(-1); + }*/ + + // this is the transmission mode for the signalling channels + // this will be overwritten with the real transmission mode by the RRC once the UE is connected + //gNB->transmission_mode[i] = fp->nb_antenna_ports_gNB==1 ? 1 : 2; + } + // ULSCH for RA + //gNB->ulsch[0] = new_gNB_ulsch(MAX_TURBO_ITERATIONS, fp->N_RB_UL, 0); + + /*if (!gNB->ulsch[0]) { + LOG_E(PHY,"Can't get gNB ulsch structures\n"); + exit(-1); + }*/ + gNB->dlsch_SI = new_gNB_dlsch(1,8,NSOFT, 0, fp, cfg); + LOG_D(PHY,"gNB %d.%d : SI %p\n",gNB->Mod_id,gNB->CC_id,gNB->dlsch_SI); + gNB->dlsch_ra = new_gNB_dlsch(1,8,NSOFT, 0, fp, cfg); + LOG_D(PHY,"gNB %d.%d : RA %p\n",gNB->Mod_id,gNB->CC_id,gNB->dlsch_ra); + gNB->dlsch_MCH = new_gNB_dlsch(1,8,NSOFT, 0, fp, cfg); + LOG_D(PHY,"gNB %d.%d : MCH %p\n",gNB->Mod_id,gNB->CC_id,gNB->dlsch_MCH); + + + gNB->rx_total_gain_dB=130; + + for(i=0; imu_mimo_mode[i].dl_pow_off = 2; + + gNB->check_for_total_transmissions = 0; + + gNB->check_for_MUMIMO_transmissions = 0; + + gNB->FULL_MUMIMO_transmissions = 0; + + gNB->check_for_SUMIMO_transmissions = 0; + + //fp->pucch_config_common.deltaPUCCH_Shift = 1; + +} diff --git a/openair1/PHY/INIT/phy_init.h b/openair1/PHY/INIT/phy_init.h index 8e579c69be..fdb7fab1b7 100644 --- a/openair1/PHY/INIT/phy_init.h +++ b/openair1/PHY/INIT/phy_init.h @@ -385,6 +385,7 @@ void nr_phy_config_request(NR_PHY_Config_t *gNB); void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,int N_RB_DL,int N_RB_UL,int mu); void phy_free_nr_gNB(PHY_VARS_gNB *gNB); int l1_north_init_gNB(void); +void init_nr_transport(PHY_VARS_gNB *gNB); void init_dfts(void); diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index 7bd56ef8e5..73315b8a09 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -37,6 +37,7 @@ #include "PHY/defs_nr_UE.h" #include "PHY/defs_gNB.h" #include "PHY/NR_REFSIG/refsig_defs_ue.h" +#include "PHY/NR_REFSIG/nr_mod_table.h" #include "PHY/MODULATION/modulation_eNB.h" #include "PHY/MODULATION/modulation_UE.h" #include "PHY/INIT/phy_init.h" diff --git a/targets/RT/USER/nr-gnb.c b/targets/RT/USER/nr-gnb.c index 77fe5c8c33..2ec01d521f 100644 --- a/targets/RT/USER/nr-gnb.c +++ b/targets/RT/USER/nr-gnb.c @@ -725,87 +725,6 @@ void print_opp_meas(void) { } } -void free_transport(PHY_VARS_gNB *gNB) -{ - int i; - int j; - - for (i=0; idlsch[i][j]); - - //LOG_I(PHY, "Freeing Transport Channel Buffer for ULSCH, UE %d\n",i); - //free_gNB_ulsch(gNB->ulsch[1+i]); - } - //free_gNB_ulsch(gNB->ulsch[0]); -} - - -void init_nr_transport(PHY_VARS_gNB *gNB) { - - int i; - int j; - NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; - nfapi_nr_config_request_t *cfg = &gNB->gNB_config; - - LOG_I(PHY, "Initialise nr transport\n"); - - for (i=0; idlsch[i][j] = new_gNB_dlsch(1,16,NSOFT,0,fp,cfg); - if (!gNB->dlsch[i][j]) { - LOG_E(PHY,"Can't get gNB dlsch structures for UE %d \n", i); - exit(-1); - } else { - gNB->dlsch[i][j]->rnti=0; - LOG_D(PHY,"dlsch[%d][%d] => %p rnti:%d\n",i,j,gNB->dlsch[i][j], gNB->dlsch[i][j]->rnti); - } - } - - //LOG_I(PHY,"Allocating Transport Channel Buffer for ULSCH, UE %d\n",i); - //gNB->ulsch[1+i] = new_gNB_ulsch(MAX_TURBO_ITERATIONS,fp->N_RB_UL, 0); - - /*if (!gNB->ulsch[1+i]) { - LOG_E(PHY,"Can't get gNB ulsch structures\n"); - exit(-1); - }*/ - - // this is the transmission mode for the signalling channels - // this will be overwritten with the real transmission mode by the RRC once the UE is connected - //gNB->transmission_mode[i] = fp->nb_antenna_ports_gNB==1 ? 1 : 2; - } - // ULSCH for RA - //gNB->ulsch[0] = new_gNB_ulsch(MAX_TURBO_ITERATIONS, fp->N_RB_UL, 0); - - /*if (!gNB->ulsch[0]) { - LOG_E(PHY,"Can't get gNB ulsch structures\n"); - exit(-1); - }*/ - gNB->dlsch_SI = new_gNB_dlsch(1,8,NSOFT, 0, fp, cfg); - LOG_D(PHY,"gNB %d.%d : SI %p\n",gNB->Mod_id,gNB->CC_id,gNB->dlsch_SI); - gNB->dlsch_ra = new_gNB_dlsch(1,8,NSOFT, 0, fp, cfg); - LOG_D(PHY,"gNB %d.%d : RA %p\n",gNB->Mod_id,gNB->CC_id,gNB->dlsch_ra); - gNB->dlsch_MCH = new_gNB_dlsch(1,8,NSOFT, 0, fp, cfg); - LOG_D(PHY,"gNB %d.%d : MCH %p\n",gNB->Mod_id,gNB->CC_id,gNB->dlsch_MCH); - - - gNB->rx_total_gain_dB=130; - - for(i=0; imu_mimo_mode[i].dl_pow_off = 2; - - gNB->check_for_total_transmissions = 0; - - gNB->check_for_MUMIMO_transmissions = 0; - - gNB->FULL_MUMIMO_transmissions = 0; - - gNB->check_for_SUMIMO_transmissions = 0; - - //fp->pucch_config_common.deltaPUCCH_Shift = 1; - -} /// eNB kept in function name for nffapi calls, TO FIX void init_eNB_afterRU(void) { From 60ae0c15a280bbca31a597fb6604d4285222aaf8 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 13 Nov 2018 09:25:13 +0100 Subject: [PATCH 079/117] replacing absolute with relative path to save results of ldpctest --- openair1/PHY/CODING/TESTBENCH/ldpctest.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/CODING/TESTBENCH/ldpctest.c b/openair1/PHY/CODING/TESTBENCH/ldpctest.c index d0fb170cf4..1c9269629c 100644 --- a/openair1/PHY/CODING/TESTBENCH/ldpctest.c +++ b/openair1/PHY/CODING/TESTBENCH/ldpctest.c @@ -653,7 +653,7 @@ int main(int argc, char *argv[]) } char fname[200]; - sprintf(fname,"../../../openair1/PHY/CODING/TESTBENCH/ldpctest_BG_%d_Zc_%d_rate_%d-%d_block_length_%d_maxit_%d.txt",BG,Zc,nom_rate,denom_rate,block_length, No_iteration); + sprintf(fname,"ldpctest_BG_%d_Zc_%d_rate_%d-%d_block_length_%d_maxit_%d.txt",BG,Zc,nom_rate,denom_rate,block_length, No_iteration); FILE *fd=fopen(fname,"w"); AssertFatal(fd!=NULL,"cannot open %s\n",fname); From 5f22cfb3601f05163168b70eedff4ac201c9d2ce Mon Sep 17 00:00:00 2001 From: hongzhi wang Date: Tue, 13 Nov 2018 18:04:56 +0100 Subject: [PATCH 080/117] nr ue pdsch bug fix --- openair1/PHY/CODING/nr_compute_tbs.c | 4 +- openair1/PHY/MODULATION/slot_fep_nr.c | 9 +- .../nr_dl_channel_estimation.c | 127 ++--- .../PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 2 +- .../NR_UE_TRANSPORT/nr_dlsch_demodulation.c | 499 +++--------------- .../nr_dlsch_llr_computation.c | 2 +- .../PHY/NR_UE_TRANSPORT/nr_initial_sync.c | 13 +- .../NR_UE_TRANSPORT/nr_transport_proto_ue.h | 8 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 38 +- 9 files changed, 185 insertions(+), 517 deletions(-) diff --git a/openair1/PHY/CODING/nr_compute_tbs.c b/openair1/PHY/CODING/nr_compute_tbs.c index c9165e3867..e1c15d4a86 100644 --- a/openair1/PHY/CODING/nr_compute_tbs.c +++ b/openair1/PHY/CODING/nr_compute_tbs.c @@ -56,7 +56,7 @@ uint32_t nr_compute_tbs(uint8_t mcs, // Intermediate number of information bits Ninfo = (double)((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); + //printf("Ninfo %lf nbp_re %d nb_re %d mcs %d Qm %d, R %d\n", Ninfo, nbp_re, nb_re,mcs, Qm, R); if (Ninfo <=3824) { @@ -85,7 +85,7 @@ uint32_t nr_compute_tbs(uint8_t mcs, } else { nr_tbs = (uint32_t)(8 * ceil( (Np_info + 24)/8 ) - 24); - //printf("n %f Np_info %f pow %f ceil %f \n",n, Np_info,pow(2,6),ceil( (Np_info + 24)/8 )); + //printf("n %lf Np_info %f pow %f ceil %f \n",n, Np_info,pow(2,6),ceil( (Np_info + 24)/8 )); } } diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c index 876da0af1f..609e217471 100644 --- a/openair1/PHY/MODULATION/slot_fep_nr.c +++ b/openair1/PHY/MODULATION/slot_fep_nr.c @@ -54,6 +54,8 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, uint16_t nb_rb_coreset = 24; uint16_t bwp_start_subcarrier = frame_parms->first_carrier_offset+516; uint16_t nb_rb_pdsch = 50; + uint8_t p=0; + uint8_t l0 = 2; void (*dft)(int16_t *,int16_t *, int); int tmp_dft_in[8192] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs @@ -259,13 +261,18 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, #if UE_TIMING_TRACE start_meas(&ue->dlsch_channel_estimation_stats); #endif + + ue->frame_parms.nushift = (p>>1)&1;; + + if (symbol ==l0) nr_pdsch_channel_estimation(ue,eNB_id,0, Ns, - 0, + p, l, symbol, bwp_start_subcarrier, nb_rb_pdsch); + #if UE_TIMING_TRACE stop_meas(&ue->dlsch_channel_estimation_stats); #endif diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index c540da5a4e..ac60cef628 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -28,7 +28,7 @@ #include "PHY/NR_REFSIG/refsig_defs_ue.h" #include "filt16a_32.h" #include "T.h" -//#define DEBUG_CH +//#define DEBUG_PDSCH int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, @@ -286,7 +286,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, k = coreset_start_subcarrier; -#ifdef DEBUG_CH +#ifdef DEBUG_PDCCH printf("PDCCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, OFDM size %d, Ncp=%d, l=%d, Ns=%d, k=%d symbol %d\n",ue->current_thread_id[Ns>>1], eNB_offset,ch_offset,ue->frame_parms.ofdm_symbol_size, ue->frame_parms.Ncp,l,Ns,k, symbol); #endif @@ -309,18 +309,18 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, multadd_complex_vector_real_scalar(dl_ch-(ue->frame_parms.ofdm_symbol_size<<1), ue->ch_est_alpha,dl_ch-(ue->frame_parms.ofdm_symbol_size<<1), 1,ue->frame_parms.ofdm_symbol_size); - //#ifdef DEBUG_CH +#ifdef DEBUG_PDCCH printf("pdcch ch est pilot addr %p RB_DL %d\n",&pilot[0], ue->frame_parms.N_RB_DL); printf("k %d, first_carrier %d\n",k,ue->frame_parms.first_carrier_offset); printf("rxF addr %p\n", rxF); - printf("dl_ch addr %p\n",dl_ch); - //#endif + printf("dl_ch addr %p nushift %d\n",dl_ch,nushift); +#endif if ((ue->frame_parms.N_RB_DL&1)==0) { // Treat first 2 pilots specially (left edge) ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -#ifdef DEBUG_CH +#ifdef DEBUG_PDCCH printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])); printf("pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif @@ -335,7 +335,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -#ifdef DEBUG_CH +#ifdef DEBUG_PDCCH printf("pilot 1 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); #endif multadd_real_vector_complex_scalar(fm, @@ -348,7 +348,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -#ifdef DEBUG_CH +#ifdef DEBUG_PDCCH printf("pilot 2 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); #endif @@ -357,7 +357,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, dl_ch, 16); -#ifdef DEBUG_CH +#ifdef DEBUG_PDCCH for (int m =0; m<12; m++) printf("data : dl_ch -> (%d,%d)\n",dl_ch[0+2*m],dl_ch[1+2*m]); #endif @@ -376,7 +376,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -#ifdef DEBUG_CH +#ifdef DEBUG_PDCCH printf("pilot %d : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); #endif multadd_real_vector_complex_scalar(fl, @@ -392,7 +392,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -#ifdef DEBUG_CH +#ifdef DEBUG_PDCCH printf("pilot %d : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); #endif multadd_real_vector_complex_scalar(fm, @@ -405,7 +405,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -#ifdef DEBUG_CH +#ifdef DEBUG_PDCCH printf("pilot 1 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); #endif @@ -448,8 +448,6 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, //uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1]; uint8_t nushift; - //int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].dl_ch_estimates[eNB_offset]; - //int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF; int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].dl_ch_estimates[eNB_offset]; int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF; @@ -464,6 +462,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, symbol_offset = ue->frame_parms.ofdm_symbol_size*symbol; k = bwp_start_subcarrier; + int re_offset = k; //#ifdef DEBUG_CH printf("PDSCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, symbol_offset %d OFDM size %d, Ncp=%d, l=%d, Ns=%d, k=%d symbol %d\n",ue->current_thread_id[Ns>>1], eNB_offset,ch_offset,symbol_offset,ue->frame_parms.ofdm_symbol_size, @@ -510,138 +509,142 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, multadd_complex_vector_real_scalar(dl_ch-(ue->frame_parms.ofdm_symbol_size<<1), ue->ch_est_alpha,dl_ch-(ue->frame_parms.ofdm_symbol_size<<1), 1,ue->frame_parms.ofdm_symbol_size); -//#ifdef DEBUG_CH +#ifdef DEBUG_PDSCH printf("ch est pilot addr %p RB_DL %d\n",&pilot[0], ue->frame_parms.N_RB_DL); printf("k %d, first_carrier %d\n",k,ue->frame_parms.first_carrier_offset); printf("rxF addr %p p %d\n", rxF,p); - printf("dl_ch addr %p\n",dl_ch); -//#endif + printf("dl_ch addr %p nushift %d\n",dl_ch,nushift); +#endif //if ((ue->frame_parms.N_RB_DL&1)==0) { // Treat first 2 pilots specially (left edge) ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -//#ifdef DEBUG_CH +#ifdef DEBUG_PDSCH printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])); printf("pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); -//#endif + printf("data 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[2],rxF[3],&rxF[2],ch[0],ch[1],pil[0],pil[1]); +#endif multadd_real_vector_complex_scalar(fl, ch, dl_ch, 8); pil+=2; - rxF+=4; + re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; //for (int i= 0; i<8; i++) //printf("dl_ch addr %p %d\n", dl_ch+i, *(dl_ch+i)); ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -//#ifdef DEBUG_CH +#ifdef DEBUG_PDSCH printf("pilot 1 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); -//#endif +#endif multadd_real_vector_complex_scalar(fml, ch, dl_ch, 8); pil+=2; - rxF+=4; + re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; printf("dl_ch addr %p\n",dl_ch); ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -//#ifdef DEBUG_CH +#ifdef DEBUG_PDSCH printf("pilot 2 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); -//#endif +#endif multadd_real_vector_complex_scalar(fmm, ch, dl_ch, 8); + + //for (int i= 0; i<16; i++) + //printf("dl_ch addr %p %d\n", dl_ch+i, *(dl_ch+i)); + pil+=2; - rxF+=4; + re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; dl_ch+=8; - k+=4; - printf("dl_ch addr %p\n",dl_ch); - for (pilot_cnt=3; pilot_cnt<6*(nb_rb_pdsch-1); pilot_cnt+=3) { + for (pilot_cnt=3; pilot_cnt<(6*nb_rb_pdsch-3); pilot_cnt+=2) { //if ((pilot_cnt%6)==0) //dl_ch+=4; - - if (k >= ue->frame_parms.ofdm_symbol_size){ - k-=ue->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+nushift)];} + //printf("re_offset %d\n",re_offset); ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -//#ifdef DEBUG_CH +#ifdef DEBUG_PDSCH printf("pilot %d : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); -//#endif +#endif multadd_real_vector_complex_scalar(fm, ch, dl_ch, 8); pil+=2; - rxF+=4; + re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -//#ifdef DEBUG_CH +#ifdef DEBUG_PDSCH printf("pilot %d : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); -//#endif +#endif multadd_real_vector_complex_scalar(fmm, ch, dl_ch, 8); pil+=2; - rxF+=4; + re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; dl_ch+=8; - k+=4; } - + // Treat first 2 pilots specially (right edge) ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -//#ifdef DEBUG_CH - printf("pilot %d : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+2,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); -//#endif - multadd_real_vector_complex_scalar(fmm, +#ifdef DEBUG_PDSCH + printf("pilot %d : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); +#endif + multadd_real_vector_complex_scalar(fm, ch, dl_ch, 8); + + //for (int i= 0; i<8; i++) + //printf("dl_ch addr %p %d\n", dl_ch+i, *(dl_ch+i)); + pil+=2; - rxF+=4; + re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -//#ifdef DEBUG_CH +#ifdef DEBUG_PDSCH printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])); - printf("pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); -//#endif + printf("pilot %d: rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif multadd_real_vector_complex_scalar(fmr, ch, dl_ch, 8); + pil+=2; - rxF+=4; + re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; dl_ch+=8; - k+=4; - //for (int i= 0; i<8; i++) - //printf("dl_ch addr %p %d\n", dl_ch+i, *(dl_ch+i)); - - //ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); - //ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -#ifdef DEBUG_CH - printf("pilot 1 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); + ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); + ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); +#ifdef DEBUG_PDSCH + printf("pilot %d: rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+2,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); #endif multadd_real_vector_complex_scalar(fr, ch, dl_ch, - 4); - //pil+=2; - //rxF+=4; - + 8); //} } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index 3422c779d3..f0a2fc9104 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -292,7 +292,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, harq_process->Qm,harq_process->Nl); G = harq_process->G; - //printf("DLSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_symb_sch %d \n",harq_pid,A,G, harq_process->mcs, harq_process->Nl, nb_symb_sch); + printf("DLSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_symb_sch %d \n",harq_pid,A,G, harq_process->mcs, harq_process->Nl, nb_symb_sch); if (harq_process->round == 0) { // This is a new packet, so compute quantities regarding segmentation diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c index 2dae4b6169..41db2b0d89 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c @@ -128,8 +128,14 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, //to be updated higher layer unsigned short start_rb = 0; - unsigned short nb_pdsch_rb = 106; - + unsigned short nb_rb_pdsch = 50; + int8_t *pllr_symbol_cw0; + int8_t *pllr_symbol_cw1; + int8_t *pllr_symbol_cw0_deint; + int8_t *pllr_symbol_cw1_deint; + uint32_t llr_offset_symbol; + uint16_t bundle_L = 2; + switch (type) { case SI_PDSCH: pdsch_vars = &ue->pdsch_vars_SI[eNB_id]; @@ -148,7 +154,17 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, case PDSCH: pdsch_vars = ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]]; dlsch = ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id]; - //printf("status TB0 = %d, status TB1 = %d \n", dlsch[0]->harq_processes[harq_pid]->status, dlsch[1]->harq_processes[harq_pid]->status); + + + //set active for testing -> to be removed + dlsch[0]->harq_processes[harq_pid]->status = ACTIVE; + dlsch[0]->harq_processes[harq_pid]->Qm = 2; + dlsch[0]->harq_processes[harq_pid]->mcs = 9; + dlsch[0]->harq_processes[harq_pid]->Nl=1; + dlsch[0]->harq_processes[harq_pid]->nb_rb = nb_rb_pdsch; + frame_parms->nushift = 0; + + 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,nr_tti_rx,symbol,harq_pid, dlsch[0]->harq_processes[harq_pid]->status, @@ -322,6 +338,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, #endif if (beamforming_mode==0) { //else if nb_antennas_ports_eNB==1 && beamforming_mode == 0 + printf("start nr dlsch extract nr_tti_rx %d thread id %d \n", nr_tti_rx, ue->current_thread_id[nr_tti_rx]); nb_rb = nr_dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].rxdataF, common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].dl_ch_estimates[eNB_id], pdsch_vars[eNB_id]->rxdataF_ext, @@ -331,7 +348,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, rballoc, symbol, start_rb, - nb_pdsch_rb, + nb_rb_pdsch, nr_tti_rx, ue->high_speed_flag, frame_parms); @@ -516,14 +533,14 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, 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", +//#ifdef UE_DEBUG_TRACE + LOG_I(PHY,"[DLSCH] AbsSubframe %d.%d log2_maxh = %d [log2_maxh0 %d log2_maxh1 %d] (%d,%d)\n", frame%1024,nr_tti_rx, 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 +//#endif //wait until pdcch is decoded //proc->channel_level = 1; @@ -761,9 +778,9 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, #if UE_TIMING_TRACE stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][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,nr_tti_rx,slot,symbol,pdsch_vars[eNB_id]->log2_maxh,proc->channel_level,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0)); + printf("[AbsSFN %d.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n",frame,nr_tti_rx,slot,symbol,pdsch_vars[eNB_id]->log2_maxh,proc->channel_level,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][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,nr_tti_rx,slot,symbol,pdsch_vars[eNB_id]->log2_maxh,proc->channel_level,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0)); + LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n",frame,nr_tti_rx,slot,symbol,pdsch_vars[eNB_id]->log2_maxh,proc->channel_level,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0)); #endif #endif // MRC @@ -826,7 +843,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, } #endif - // printf("LLR"); + printf("start compute LLR\n"); if ((dlsch0_harq->mimo_mode == LARGE_CDD) || ((dlsch0_harq->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) && (dlsch0_harq->mimo_mode <=DUALSTREAM_PUSCH_PRECODING))) { @@ -840,7 +857,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, } nb_re= (symbol==2)? (nb_rb*6):(nb_rb*12); - pdsch_vars[eNB_id]->llr_offset[symbol] = nb_re*dlsch0_harq->Qm * 2; + pdsch_vars[eNB_id]->llr_offset[symbol] = nb_re*dlsch0_harq->Qm; #if UE_TIMING_TRACE stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]); @@ -857,27 +874,31 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, //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; - int8_t *pllr_symbol_cw0_deint; - int8_t *pllr_symbol_cw1_deint; - uint32_t llr_offset_symbol; - uint32_t nb_rb_pdsch = 106; - uint16_t bundle_L = 2; + llr_offset_symbol = pdsch_vars[eNB_id]->llr_offset[symbol]; - pllr_symbol_cw0_deint = (int8_t*)pdsch_vars[eNB_id]->llr[0]; - pllr_symbol_cw1_deint = (int8_t*)pdsch_vars[eNB_id]->llr[1]; + //pllr_symbol_cw0_deint = (int8_t*)pdsch_vars[eNB_id]->llr[0]; + //pllr_symbol_cw1_deint = (int8_t*)pdsch_vars[eNB_id]->llr[1]; + 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 %x @LLR Buff(symb) %x\n", - proc->frame_rx, proc->subframe_rx,symbol, + /*LOG_I(PHY,"compute LLRs [symbol %d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %x @LLR Buff(symb) %x\n", + 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);*/ + pllr_symbol_cw0);*/ + + printf("compute LLRs [symbol %d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %p @LLR Buff(symb) %p\n", + symbol, + nb_rb,dlsch0_harq->Qm, + 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 : @@ -889,6 +910,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, first_symbol_flag, nb_rb, beamforming_mode); + printf("end llr symol %d\n",symbol); } else if (codeword_TB0 == -1){ @@ -1197,7 +1219,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, } } - nr_dlsch_deinterleaving(symbol,bundle_L,(int16_t*)pllr_symbol_cw0,(int16_t*)pllr_symbol_cw0_deint, nb_rb_pdsch); + //nr_dlsch_deinterleaving(symbol,bundle_L,(int16_t*)pllr_symbol_cw0,(int16_t*)pllr_symbol_cw0_deint, nb_rb_pdsch); #if UE_TIMING_TRACE stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]); @@ -1261,7 +1283,7 @@ void nr_dlsch_deinterleaving(uint8_t symbol, uint16_t L, uint16_t *llr, uint16_t *llr_deint, - uint32_t nb_rb_pdsch) + uint16_t nb_rb_pdsch) { uint32_t bundle_idx, N_bundle, R, C, r,c; @@ -1329,8 +1351,6 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext, __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b; - - //if (frame_parms->mode1_flag==1) // 10 out of 12 so don't reduce size if (symbol == 2){ pilots=1; } @@ -1846,7 +1866,7 @@ void nr_dlsch_channel_level(int **dl_ch_estimates_ext, #if defined(__x86_64__)||defined(__i386__) short rb; - unsigned char aatx,aarx,nre=12,symbol_mod; + unsigned char aatx,aarx,nre=12; __m128i *dl_ch128, avg128D; if (symbol==2) //assume start symbol 2 @@ -1876,14 +1896,14 @@ void nr_dlsch_channel_level(int **dl_ch_estimates_ext, //avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128[0],_mm_srai_epi16(_mm_mulhi_epi16(dl_ch128[0], coeff128),15))); //avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128[1],_mm_srai_epi16(_mm_mulhi_epi16(dl_ch128[1], coeff128),15))); - if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) { + /*if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) { dl_ch128+=2; } - else { + 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]); @@ -1975,53 +1995,53 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF, unsigned int *rb_alloc, unsigned char symbol, unsigned short start_rb, - unsigned short nb_pdsch_rb, + unsigned short nb_rb_pdsch, unsigned char nr_tti_rx, uint32_t high_speed_flag, NR_DL_FRAME_PARMS *frame_parms) { - unsigned short k,rb,nb_rb=0; - unsigned char rb_alloc_ind; - unsigned char i,aarx,l,nsymb,skip_half=0,sss_symb,pss_symb=0; + unsigned short k,rb; + unsigned char i,aarx,l; //,nsymb,sss_symb,pss_symb=0; int *dl_ch0,*dl_ch0_ext,*rxF,*rxF_ext; - unsigned char symbol_mod,pilots=0,j=0,poffset=0; + unsigned char pilots=0,j=0; - symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; + //symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; pilots = (symbol==2) ? 1 : 0; //to updated from config l=symbol; - nsymb = (frame_parms->Ncp==NORMAL) ? 14:12; + //nsymb = (frame_parms->Ncp==NORMAL) ? 14:12; + k = frame_parms->first_carrier_offset + 516; //0 - if (frame_parms->frame_type == TDD) { // TDD + /* 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][(symbol*(frame_parms->ofdm_symbol_size))]; + dl_ch0 = &dl_ch_estimates[aarx][(2*(frame_parms->ofdm_symbol_size))]; else dl_ch0 = &dl_ch_estimates[aarx][0]; - dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*(nb_pdsch_rb*12)]; + dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*(nb_rb_pdsch*12)]; - rxF_ext = &rxdataF_ext[aarx][symbol*(nb_pdsch_rb*12)]; - rxF = &rxdataF[aarx][(frame_parms->first_carrier_offset + (symbol*(frame_parms->ofdm_symbol_size)))]; + rxF_ext = &rxdataF_ext[aarx][symbol*(nb_rb_pdsch*12)]; + rxF = &rxdataF[aarx][(k+(symbol*(frame_parms->ofdm_symbol_size)))]; + + printf("extract single addr %p pilots %d symbol %d, l %d RB_DL %d nushift %d k %d\n", rxF, pilots, symbol, l, frame_parms->N_RB_DL,frame_parms->nushift,k); - if ((frame_parms->N_RB_DL&1) == 0) // even number of RBs + //if ((frame_parms->N_RB_DL&1) == 0){ // even number of RBs - for (rb=start_rb;rb=frame_parms->ofdm_symbol_size) { @@ -2042,8 +2062,11 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF, for (i=0; i<12; i++) { rxF_ext[i]=rxF[i]; dl_ch0_ext[i]=dl_ch0[i]; - /*printf("%d : (%d,%d)\n",(rxF+i-&rxdataF[aarx][( (symbol*(frame_parms->ofdm_symbol_size)))]), - ((short*)&rxF[i])[0],((short*)&rxF[i])[1]);*/ + printf("rb %ld %p: (%d,%d)\n",(rxF+i-&rxdataF[aarx][( (symbol*(frame_parms->ofdm_symbol_size)))]),rxF, + ((short*)&rxF[i])[0],((short*)&rxF[i])[1]); + printf("rb %ld %p: dl_ch (%d,%d)\n",(rxF+i-&rxdataF[aarx][( (symbol*(frame_parms->ofdm_symbol_size)))]),rxF, + ((short*)&dl_ch0[i])[0],((short*)&dl_ch0[i])[1]); + printf("re count %d\n",rb*12+i); } dl_ch0_ext+=12; @@ -2054,9 +2077,11 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF, for (i=0; i<12; i++) { if ((i&1)!=frame_parms->nushift){ 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]; - + printf("extract rb %d, re %d => rxF (%d,%d) rxF ext (%d,%d) addr %p\n",rb,i,*(short *)&rxF[i],*(1+(short*)&rxF[i]),*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]),rxF_ext); + dl_ch0_ext[j]=dl_ch0[i]; + printf("rb %ld %p: dl_ch (%d,%d)\n",(rxF+i-&rxdataF[aarx][( (symbol*(frame_parms->ofdm_symbol_size)))]),rxF, + ((short*)&dl_ch0[i])[0],((short*)&dl_ch0[i])[1]); + j++; } } @@ -2068,376 +2093,10 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF, rxF+=12; k+=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_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 ((nr_tti_rx==0) && - (l>=(nsymb>>1)) && - (l<((nsymb>>1) + 4))) { - rb_alloc_ind = 0; - } - - //SSS - if (((nr_tti_rx==0)||(nr_tti_rx==5)) && (l==sss_symb) ) { - rb_alloc_ind = 0; - } - - if (frame_parms->frame_type == FDD) { - //PSS - if (((nr_tti_rx==0)||(nr_tti_rx==5)) && (l==pss_symb) ) { - rb_alloc_ind = 0; - } - } - - //PSS - if ((frame_parms->frame_type == TDD) && - (nr_tti_rx==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 ((nr_tti_rx==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 ((nr_tti_rx==0) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) - skip_half=1; - else if ((nr_tti_rx==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) - skip_half=2; - - //SSS - if (((nr_tti_rx==0)||(nr_tti_rx==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 (((nr_tti_rx==0)||(nr_tti_rx==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==sss_symb)) - skip_half=1; - else if (((nr_tti_rx==0)||(nr_tti_rx==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb)) - skip_half=2; - if (frame_parms->frame_type == FDD) { - //PSS - if (((nr_tti_rx==0)||(nr_tti_rx==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 (((nr_tti_rx==0)||(nr_tti_rx==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb)) - skip_half=1; - else if (((nr_tti_rx==0)||(nr_tti_rx==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb)) - skip_half=2; - } - - if ((frame_parms->frame_type == TDD) && - - (nr_tti_rx==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); + return(nb_rb_pdsch/frame_parms->nb_antennas_rx); } //============================================================================================== diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c index 9c8ad75d92..c66ad79b91 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c @@ -660,7 +660,7 @@ int nr_dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, */ for (i=0; isamples_per_subframe/fp->slots_per_subframe) - 10*(fp->ofdm_symbol_size + fp->nb_prefix_samples); - if (sync_pos >= fp->nb_prefix_samples) - ue->ssb_offset = sync_pos - fp->nb_prefix_samples; - else - ue->ssb_offset = sync_pos + (fp->samples_per_subframe * 10) - fp->nb_prefix_samples; + if (sync_pos >= fp->nb_prefix_samples){ + ue->ssb_offset = sync_pos - fp->nb_prefix_samples;} + else{ + ue->ssb_offset = sync_pos + (fp->samples_per_subframe * 10) - fp->nb_prefix_samples;} + + ue->rx_offset = ue->ssb_offset - sync_pos_slot; //write_output("rxdata1.m","rxd1",ue->common_vars.rxdata[0],10*fp->samples_per_subframe,1,1); #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"[UE%d] Initial sync : Estimated PSS position %d, Nid2 %d\n", ue->Mod_id, sync_pos,ue->common_vars.eNb_id); - LOG_I(PHY,"sync_pos %d ssb_offset %d\n",sync_pos,ue->ssb_offset); + LOG_I(PHY,"sync_pos %d ssb_offset %d sync_pos_slot %d \n",sync_pos,ue->ssb_offset,sync_pos_slot); #endif /* check that SSS/PBCH block is continuous inside the received buffer */ diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h index 7e6a3722d7..279f9fb17a 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h @@ -340,7 +340,7 @@ void qam64_qpsk(short *stream0_in, @param nb_rb number of RBs for this allocation @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS @param llr16p pointer to pointer to symbol in dlsch_llr*/ -int dlsch_64qam_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, +int nr_dlsch_64qam_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, int **rxdataF_comp, int **rxdataF_comp_i, int **dl_ch_mag, @@ -397,7 +397,7 @@ void qam64_qam16_avx2(short *stream0_in, @param nb_rb number of RBs for this allocation @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS @param llr16p pointer to pointer to symbol in dlsch_llr*/ -int dlsch_64qam_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, +int nr_dlsch_64qam_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, int **rxdataF_comp, int **rxdataF_comp_i, int **dl_ch_mag, @@ -455,7 +455,7 @@ void qam64_qam64_avx2(int32_t *stream0_in, @param nb_rb number of RBs for this allocation @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS @param llr16p pointer to pointer to symbol in dlsch_llr*/ -int dlsch_64qam_64qam_llr(NR_DL_FRAME_PARMS *frame_parms, +int nr_dlsch_64qam_64qam_llr(NR_DL_FRAME_PARMS *frame_parms, int **rxdataF_comp, int **rxdataF_comp_i, int **dl_ch_mag, @@ -829,7 +829,7 @@ void nr_dlsch_deinterleaving(uint8_t symbol, uint16_t L, uint16_t *llr, uint16_t *llr_deint, - uint32_t nb_rb_pdsch); + uint16_t nb_rb_pdsch); void dlsch_dual_stream_correlation(NR_DL_FRAME_PARMS *frame_parms, unsigned char symbol, diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index bd3e5e8cfc..b3f5dd90e2 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -4264,8 +4264,8 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, if(dlsch1) is_cw1_active = dlsch1->harq_processes[harq_pid]->status; - LOG_D(PHY,"AbsSubframe %d.%d Start Turbo Decoder for CW0 [harq_pid %d] ? %d \n", frame_rx%1024, nr_tti_rx, harq_pid, is_cw0_active); - LOG_D(PHY,"AbsSubframe %d.%d Start Turbo Decoder for CW1 [harq_pid %d] ? %d \n", frame_rx%1024, nr_tti_rx, harq_pid, is_cw1_active); + LOG_D(PHY,"AbsSubframe %d.%d Start LDPC Decoder for CW0 [harq_pid %d] ? %d \n", frame_rx%1024, nr_tti_rx, harq_pid, is_cw0_active); + LOG_D(PHY,"AbsSubframe %d.%d Start LDPC Decoder for CW1 [harq_pid %d] ? %d \n", frame_rx%1024, nr_tti_rx, harq_pid, is_cw1_active); if(is_cw0_active && is_cw1_active) { @@ -5557,7 +5557,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN #endif //nr_gold_pdcch(ue,0, 2); - + if (nr_tti_rx==2) for (int l=0; l<2; l++) { if (abstraction_flag == 0) { #if UE_TIMING_TRACE @@ -5653,28 +5653,21 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN #endif //#if 0 LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx); - //set active for testing, to be removed + if (nr_tti_rx==2){ //to update from pdsch config nr_gold_pdsch(ue,2,0, 1); - - int nb_prefix_samples0 = ue->frame_parms.nb_prefix_samples0; - ue->frame_parms.nb_prefix_samples0 = ue->frame_parms.nb_prefix_samples; - + for (int m=2;m<6 ; m++) nr_slot_fep(ue, - 2, //to be updated from higher layer + m, //to be updated from higher layer nr_tti_rx, 0, 0, 1, NR_PDSCH_EST); - - //put back nb_prefix_samples0 - ue->frame_parms.nb_prefix_samples0 = nb_prefix_samples0; - - - ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active = 1; + //set active for testing, to be removed + ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active = 1; } #if UE_TIMING_TRACE @@ -5689,8 +5682,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN PDSCH, ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0], NULL, - ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->num_pdcch_symbols, - ue->frame_parms.symbols_per_tti>>1, + 2, //ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->num_pdcch_symbols, + 5, //ue->frame_parms.symbols_per_tti>>1, abstraction_flag); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_OUT); @@ -5741,7 +5734,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN abstraction_flag); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA, VCD_FUNCTION_OUT); } - +//#if 0 LOG_D(PHY," ------ slot 1 Processing: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx); LOG_D(PHY," ------ --> FFT/ChannelEst/PDCCH slot 1: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx); @@ -5792,7 +5785,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN #endif - LOG_D(PHY," ------ end FFT/ChannelEst/PDCCH slot 1: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx); + //LOG_D(PHY," ------ end FFT/ChannelEst/PDCCH slot 1: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx); /*if ( (nr_tti_rx == 0) && (ue->decode_MIB == 1)) { @@ -5807,7 +5800,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN #if UE_TIMING_TRACE start_meas(&ue->pdsch_procedures_stat[ue->current_thread_id[nr_tti_rx]]); #endif - nr_ue_pdsch_procedures(ue, + /*nr_ue_pdsch_procedures(ue, proc, eNB_id, PDSCH, @@ -5817,11 +5810,14 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN ue->frame_parms.symbols_per_tti-1, abstraction_flag); LOG_D(PHY," ------ end PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx); - LOG_D(PHY," ------ --> PDSCH Turbo Decoder slot 0/1: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx); + LOG_D(PHY," ------ --> PDSCH Turbo Decoder slot 0/1: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx);*/ #if UE_TIMING_TRACE stop_meas(&ue->pdsch_procedures_stat[ue->current_thread_id[nr_tti_rx]]); start_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[nr_tti_rx]]); #endif + +//#endif //slot 1 + nr_ue_dlsch_procedures(ue, proc, eNB_id, From 1197c561d49865accd90723dbe8ff3c3f430665a Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Wed, 14 Nov 2018 10:40:43 +0100 Subject: [PATCH 081/117] Payload emulation/scrambling update --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 21 +++++++++++---------- openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 2 ++ openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 1 + openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c | 7 +++++++ openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c | 4 ++-- openair1/PHY/defs_nr_common.h | 1 + 6 files changed, 24 insertions(+), 12 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 5b08983de9..edbf9b3cd2 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -34,7 +34,7 @@ #include "nr_dci.h" #include "nr_sch_dmrs.h" -//#define DEBUG_DLSCH +#define DEBUG_DLSCH //#define DEBUG_DLSCH_MAPPING uint8_t mod_order[5] = {1, 2, 4, 6, 8}; @@ -47,18 +47,21 @@ void nr_pdsch_codeword_scrambling(uint8_t *in, uint32_t n_RNTI, uint32_t* out) { - uint8_t reset; + uint8_t reset, b_idx; uint32_t x1, x2, s=0; reset = 1; x2 = (n_RNTI<<15) + (q<<14) + Nid; for (int i=0; i>i)&1); + *out ^= (((in[i])&1) ^ ((s>>b_idx)&1))<pdu, 1, (TBS>>3)*sizeof(uint8_t)); nr_dlsch_encoding(harq->pdu, subframe, &dlsch, &frame_parms); #ifdef DEBUG_DLSCH printf("PDSCH encoding:\nPayload:\n"); -for (int i=0; i>4; i++) { +for (int i=0; i>7; i++) { for (int j=0; j<16; j++) printf("0x%02x\t", harq->pdu[(i<<4)+j]); printf("\n"); } printf("\nEncoded payload:\n"); -for (int i=0; i>4; i++) { +for (int i=0; i>7; i++) { for (int j=0; j<16; j++) printf("0x%02x\t", harq->f[(i<<4)+j]); printf("\n"); @@ -290,8 +292,8 @@ for (int l=0; lnb_layers; l++) l0 = get_l0(dmrs_type, 2);//config.pdsch_config.dmrs_typeA_position.value); nr_modulation(pdsch_dmrs[l0][0], n_dmrs, MOD_QPSK, mod_dmrs); // currently only codeword 0 is modulated #ifdef DEBUG_DLSCH -printf("DMRS modulation (single symbol %d, %d symbols, type %d):\n", l0, n_dmrs, dmrs_type); -for (int i=0; i>3; i++) { +printf("DMRS modulation (single symbol %d, %d symbols, type %d):\n", l0, n_dmrs>>1, dmrs_type); +for (int i=0; i>4; i++) { for (int j=0; j<8; j++) { printf("%d %d\t", mod_dmrs[((i<<3)+j)<<1], mod_dmrs[(((i<<3)+j)<<1)+1]); } @@ -366,6 +368,5 @@ m, l, k, ((int16_t*)txdataF[ap])[(l*frame_parms.ofdm_symbol_size + k)<<1], } } } - return 0; } diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index 95af0fa9f5..bf7c102a64 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -95,3 +95,5 @@ int nr_dlsch_encoding(unsigned char *a, NR_gNB_DLSCH_t *dlsch, NR_DL_FRAME_PARMS* frame_parms); +void nr_emulate_dlsch_payload(uint8_t* payload, uint16_t size); + diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index b964ff5f4d..5c89a3b4b5 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -178,6 +178,7 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(unsigned char Kmimo, dlsch->harq_processes[i]->pdu = (uint8_t*)malloc16(MAX_NR_DLSCH_PAYLOAD_BYTES/bw_scaling); if (dlsch->harq_processes[i]->pdu) { bzero(dlsch->harq_processes[i]->pdu,MAX_NR_DLSCH_PAYLOAD_BYTES/bw_scaling); + nr_emulate_dlsch_payload(dlsch->harq_processes[i]->pdu, (MAX_NR_DLSCH_PAYLOAD_BYTES/bw_scaling)>>3); } else { printf("Can't allocate PDU\n"); exit_flag=1; diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c index bf57c94645..1e2a5a3dc8 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c @@ -237,3 +237,10 @@ void nr_get_PRG_parms(NR_BWP_PARMS* bwp, NR_gNB_DCI_ALLOC_t dci_alloc, uint8_t p LOG_I(PHY, "PRG parameters for BWP %d location %d N_RB %d:\n", bwp->bwp_id, bwp->location, bwp->N_RB); LOG_I(PHY, "P_prime %d\t start size %d\t endsize %d\t N_PRG %d\n", prg_parms->P_prime, prg_parms->start_size, prg_parms->end_size, prg_parms->N_PRG); } + + /// Payload emulation +void nr_emulate_dlsch_payload(uint8_t* pdu, uint16_t size) { + set_taus_seed(0); + for (int i=0; icoding_rate = R; dlsch_rel15->modulation_order = Qm; @@ -169,6 +167,8 @@ void nr_get_tbs(nfapi_nr_dl_config_dlsch_pdu *dlsch_pdu, dlsch_rel15->nb_re_dmrs = N_PRB_DMRS; dlsch_rel15->nb_mod_symbols = N_RE_prime*dlsch_rel15->n_prb*dlsch_rel15->nb_codewords; + LOG_I(MAC, "TBS %d : N_RE %d N_PRB_DMRS %d N_sh_symb %d N_PRB_oh %d Ninfo %d Ninfo_prime %d R %d Qm %d table %d scale %d nb_symbols %d\n", + TBS, N_RE, N_PRB_DMRS, N_sh_symb, N_PRB_oh, Ninfo, Ninfo_prime, R, Qm, table_idx, scale, dlsch_rel15->nb_mod_symbols); } uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs, uint8_t Qm, uint8_t Nl) { diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 742c3fa3c0..25280d18ca 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -90,6 +90,7 @@ #define NR_MAX_NB_CODEWORDS 2 #define NR_MAX_NB_HARQ_PROCESSES 16 #define NR_MAX_PDSCH_ENCODED_LENGTH 950984 +#define NR_MAX_PDSCH_TBS 3824 typedef enum { NR_MU_0=0, From 38793cbca5a006e5a38e471e52d0d17260830059 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Wed, 14 Nov 2018 12:07:49 +0100 Subject: [PATCH 082/117] scrambling size correction --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 18 +++++++++++------- openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 2 +- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index edbf9b3cd2..0e149e3908 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -34,14 +34,14 @@ #include "nr_dci.h" #include "nr_sch_dmrs.h" -#define DEBUG_DLSCH +//#define DEBUG_DLSCH //#define DEBUG_DLSCH_MAPPING uint8_t mod_order[5] = {1, 2, 4, 6, 8}; uint16_t mod_offset[5] = {1,3,7,23,87}; void nr_pdsch_codeword_scrambling(uint8_t *in, - uint8_t size, + uint16_t size, uint8_t q, uint32_t Nid, uint32_t n_RNTI, @@ -62,6 +62,7 @@ void nr_pdsch_codeword_scrambling(uint8_t *in, out++; } *out ^= (((in[i])&1) ^ ((s>>b_idx)&1))<>7; i++) { printf("\n"); } printf("\nEncoded payload:\n"); -for (int i=0; i>7; i++) { - for (int j=0; j<16; j++) - printf("0x%02x\t", harq->f[(i<<4)+j]); - printf("\n"); +for (int i=0; i>3; i++) { + for (int j=0; j<8; j++) + printf("%d", harq->f[(i<<3)+j]); + printf("\t"); } +printf("\n"); #endif /// scrambling + for (int q=0; qnb_codewords; q++) + memset((void*)scrambled_output[q], 0, (encoded_length>>5)*sizeof(uint32_t)); uint16_t n_RNTI = (pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)? \ ((pdcch_params.scrambling_id)?pdcch_params.rnti:0) : 0; uint16_t Nid = (pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)? \ @@ -242,7 +246,7 @@ for (int i=0; i>7; i++) { scrambled_output[q]); #ifdef DEBUG_DLSCH printf("PDSCH scrambling:\n"); -for (int i=0; i>7; i++) { +for (int i=0; i>8; i++) { for (int j=0; j<8; j++) printf("0x%08x\t", scrambled_output[0][(i<<3)+j]); printf("\n"); diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index bf7c102a64..745b92f5fe 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -61,7 +61,7 @@ void nr_get_tbs(nfapi_nr_dl_config_dlsch_pdu *dlsch_pdu, nfapi_nr_config_request_t config); void nr_pdsch_codeword_scrambling(uint8_t *in, - uint8_t size, + uint16_t size, uint8_t q, uint32_t Nid, uint32_t n_RNTI, From 3b102319f6fe5637217f74387f957ae167d6dde7 Mon Sep 17 00:00:00 2001 From: hongzhi wang Date: Wed, 14 Nov 2018 17:12:17 +0100 Subject: [PATCH 083/117] make nr_dlschsim compile again --- cmake_targets/CMakeLists.txt | 5 ++--- cmake_targets/build_oai | 2 +- openair1/PHY/INIT/nr_init.c | 4 ++-- openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 4 ++-- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index c4737db736..48e67e0662 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -2552,9 +2552,8 @@ target_link_libraries(polartest SIMU PHY PHY_NR PHY_COMMON m ${ATLAS_LIBRARIES}) add_executable(ldpctest ${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/ldpctest.c) target_link_libraries(ldpctest SIMU PHY PHY_NR m ${ATLAS_LIBRARIES}) -add_executable(nr_dlschsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlschsim.c - ${CONFIG_SOURCES}) -target_link_libraries(nr_dlschsim -Wl,--start-group UTIL SIMU PHY PHY_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB ${CONFIG_LIBRARIES} -Wl,--end-group m pthread dl rt ${CONFIG_LIBRARIES} ${ATLAS_LIBRARIES}) +add_executable(nr_dlschsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlschsim.c ${T_SOURCE}) +target_link_libraries(nr_dlschsim -Wl,--start-group UTIL SIMU PHY PHY_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB -Wl,--end-group m pthread ${ATLAS_LIBRARIES} ${T_LIB} dl) add_executable(nr_pbchsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/pbchsim.c ${T_SOURCE}) target_link_libraries(nr_pbchsim -Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB -Wl,--end-group m pthread ${ATLAS_LIBRARIES} ${T_LIB} dl) diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index 56f5300051..36ed67c7f2 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -692,7 +692,7 @@ function main() { echo_info "Compiling unitary tests simulators" # TODO: fix: dlsim_tm4 pucchsim prachsim pdcchsim pbchsim mbmssim #simlist="dlsim_tm4 dlsim ulsim pucchsim prachsim pdcchsim pbchsim mbmssim" - simlist="dlsim ulsim polartest ldpctest nr_pbchsim" + simlist="nr_pbchsim nr_dlschsim" for f in $simlist ; do compilations \ phy_simulators $f \ diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index d41289f7dc..6702b34ca4 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -496,10 +496,10 @@ void init_nr_transport(PHY_VARS_gNB *gNB) { if (!gNB->dlsch[i][j]) { LOG_E(PHY,"Can't get gNB dlsch structures for UE %d \n", i); exit(-1); - } else { + }/* else { gNB->dlsch[i][j]->rnti=0; LOG_D(PHY,"dlsch[%d][%d] => %p rnti:%d\n",i,j,gNB->dlsch[i][j], gNB->dlsch[i][j]->rnti); - } + }*/ } //LOG_I(PHY,"Allocating Transport Channel Buffer for ULSCH, UE %d\n",i); diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index 5c89a3b4b5..68c273ddb5 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -225,10 +225,10 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(unsigned char Kmimo, } } - LOG_D(PHY,"new_gNB_dlsch exit flag %d, size of %ld\n", + /* LOG_D(PHY,"new_gNB_dlsch exit flag %d, size of %ld\n", exit_flag, sizeof(NR_gNB_DLSCH_t)); free_gNB_dlsch(dlsch); - return(NULL); + return(NULL);*/ } From 25e9141e0a4687ccf6dbe09a66cde30a3df3847e Mon Sep 17 00:00:00 2001 From: hongzhi wang Date: Thu, 15 Nov 2018 09:22:50 +0100 Subject: [PATCH 084/117] missing changes for nr dlschsim --- cmake_targets/build_oai | 2 +- openair1/SIMULATION/NR_PHY/dlschsim.c | 143 +++++++++++++++----------- 2 files changed, 83 insertions(+), 62 deletions(-) diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index 36ed67c7f2..35defb9c77 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -692,7 +692,7 @@ function main() { echo_info "Compiling unitary tests simulators" # TODO: fix: dlsim_tm4 pucchsim prachsim pdcchsim pbchsim mbmssim #simlist="dlsim_tm4 dlsim ulsim pucchsim prachsim pdcchsim pbchsim mbmssim" - simlist="nr_pbchsim nr_dlschsim" + simlist="dlsim ulsim polartest ldpctest nr_pbchsim nr_dlschsim" for f in $simlist ; do compilations \ phy_simulators $f \ diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c index 4c9920e1f4..c96b48adc5 100644 --- a/openair1/SIMULATION/NR_PHY/dlschsim.c +++ b/openair1/SIMULATION/NR_PHY/dlschsim.c @@ -26,22 +26,31 @@ #include #include +#include "common/config/config_userapi.h" +#include "common/utils/LOG/log.h" +#include "common/ran_context.h" + #include "SIMULATION/TOOLS/sim.h" #include "SIMULATION/RF/rf.h" #include "PHY/types.h" #include "PHY/defs_nr_common.h" #include "PHY/defs_nr_UE.h" #include "PHY/defs_gNB.h" +#include "PHY/NR_REFSIG/refsig_defs_ue.h" +#include "PHY/NR_REFSIG/nr_mod_table.h" +#include "PHY/MODULATION/modulation_eNB.h" +#include "PHY/MODULATION/modulation_UE.h" +#include "PHY/INIT/phy_init.h" +#include "PHY/NR_TRANSPORT/nr_transport.h" +#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h" #include "PHY/NR_TRANSPORT/nr_dlsch.h" -#include "PHY/INIT/phy_init.h" #include "SCHED_NR/sched_nr.h" -#include "PHY/MODULATION/modulation_common.h" -#include "common/config/config_load_configmodule.h" -#include "common/utils/LOG/log.h" -#include "UTIL/LISTS/list.h" -#include "common/ran_context.h" +//#include "PHY/MODULATION/modulation_common.h" +//#include "common/config/config_load_configmodule.h" +//#include "UTIL/LISTS/list.h" +//#include "common/ran_context.h" PHY_VARS_gNB *gNB; PHY_VARS_NR_UE *UE; @@ -66,11 +75,14 @@ int32_t get_uldl_offset(int eutra_bandP) {return(0);} NR_IF_Module_t *NR_IF_Module_init(int Mod_id){return(NULL);} -void exit_fun(const char *s) { exit(-1); } -//extern void init_eNB_afterRU(void); +void exit_function(const char* file, const char* function, const int line,const char *s) { + const char * msg= s==NULL ? "no comment": s; + printf("Exiting at: %s:%d %s(), %s\n", file, line, function, msg); + exit(-1); +} // needed for some functions -PHY_VARS_NR_UE * PHY_vars_UE_g[1][1]={NULL}; +PHY_VARS_NR_UE * PHY_vars_UE_g[1][1]={{NULL}}; uint16_t n_rnti=0x1234; char quantize(double D,double x,unsigned char B) @@ -96,41 +108,31 @@ int main(int argc, char **argv) char c; - int i,j,l,aa; - double sigma2, sigma2_dB=10,SNR,SNR_lin,snr0=-2.0,snr1=2.0; + int i; //,j,l,aa; + double SNR,SNR_lin,snr0=-2.0,snr1=2.0; double snr_step = 0.1; uint8_t snr1set=0; int **txdata; double **s_re,**s_im,**r_re,**r_im; - double iqim = 0.0; - unsigned char pbch_pdu[6]; // int sync_pos, sync_pos_slot; // FILE *rx_frame_file; FILE *output_fd = NULL; uint8_t write_output_file=0; - //int result; - int freq_offset; // int subframe_offset; // char fname[40], vname[40]; - int trial,n_trials=1,n_errors,n_errors2,n_alamouti; + int trial,n_trials=1,n_errors; uint8_t transmission_mode = 1,n_tx=1,n_rx=1; uint16_t Nid_cell=0; channel_desc_t *gNB2UE; - uint32_t nsymb,tx_lev,tx_lev1 = 0,tx_lev2 = 0; uint8_t extended_prefix_flag=0; int8_t interf1=-21,interf2=-21; FILE *input_fd=NULL,*pbch_file_fd=NULL; char input_val_str[50],input_val_str2[50]; - - uint8_t frame_mod4,num_pdcch_symbols = 0; - uint16_t NB_RB=25; + //uint16_t NB_RB=25; SCM_t channel_model=AWGN;//Rayleigh1_anticorr; - - double pbch_sinr; - int pbch_tx_ant; uint8_t N_RB_DL=106,mu=1; unsigned char frame_type = 0; @@ -138,9 +140,9 @@ int main(int argc, char **argv) int frame=0,subframe=0; int frame_length_complex_samples; - int frame_length_complex_samples_no_prefix; + //int frame_length_complex_samples_no_prefix; NR_DL_FRAME_PARMS *frame_parms; - nfapi_nr_config_request_t *gNB_config; + //nfapi_nr_config_request_t *gNB_config; uint8_t Kmimo; uint32_t Nsoft; @@ -148,14 +150,19 @@ int main(int argc, char **argv) unsigned char qbits=8; int ret; - + int run_initial_sync=0; + + int loglvl=OAILOG_WARNING; + + float target_error_rate = 0.01; + cpuf = get_cpu_freq_GHz(); if ( load_configmodule(argc,argv) == 0) { exit_fun("[SOFTMODEM] Error, configuration module init failed\n"); } - logInit(); + //logInit(); randominit(0); while ((c = getopt (argc, argv, "f:hA:pf:g:i:j:n:s:S:t:x:y:z:N:F:GR:dP:")) != -1) { @@ -340,6 +347,10 @@ int main(int argc, char **argv) } } + logInit(); + set_glog(loglvl); + T_stdout = 1; + if (snr1set==0) snr1 = snr0+10; @@ -361,19 +372,19 @@ int main(int argc, char **argv) RC.gNB[0] = (PHY_VARS_gNB**) malloc(sizeof(PHY_VARS_gNB *)); RC.gNB[0][0] = malloc(sizeof(PHY_VARS_gNB)); gNB = RC.gNB[0][0]; - gNB_config = &gNB->gNB_config; + //gNB_config = &gNB->gNB_config; frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH) frame_parms->nb_antennas_tx = n_tx; frame_parms->nb_antennas_rx = n_rx; frame_parms->N_RB_DL = N_RB_DL; crcTableInit(); - nr_phy_config_request_sim(gNB); + nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu); phy_init_nr_gNB(gNB,0,0); //init_eNB_afterRU(); frame_length_complex_samples = frame_parms->samples_per_subframe; - frame_length_complex_samples_no_prefix = frame_parms->samples_per_subframe_wCP; + //frame_length_complex_samples_no_prefix = frame_parms->samples_per_subframe_wCP; s_re = malloc(2*sizeof(double*)); s_im = malloc(2*sizeof(double*)); @@ -402,7 +413,7 @@ int main(int argc, char **argv) load_pbch_desc(pbch_file_fd); } - for (int k=0; k<2; k++) { +/* for (int k=0; k<2; k++) { // Create transport channel structures for 2 transport blocks (MIMO) for (i=0; i<2; i++) { gNB->dlsch[k][i] = new_gNB_dlsch(Kmimo,8,Nsoft,0,frame_parms,gNB_config); @@ -411,12 +422,12 @@ int main(int argc, char **argv) printf("Can't get eNB dlsch structures\n"); exit(-1); } - +gNB->dlsch[k][i]->Nsoft = 10; gNB->dlsch[k][i]->rnti = n_rnti+k; } - } - - + }*/ + + //configure UE UE = malloc(sizeof(PHY_VARS_NR_UE)); memcpy(&UE->frame_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS)); @@ -444,38 +455,47 @@ int main(int argc, char **argv) UE->dlsch_SI[0] = new_nr_ue_dlsch(1,1,Nsoft,5,N_RB_DL,0); UE->dlsch_ra[0] = new_nr_ue_dlsch(1,1,Nsoft,5,N_RB_DL,0); - + unsigned char harq_pid = 0; //dlsch->harq_ids[subframe]; NR_gNB_DLSCH_t *dlsch = gNB->dlsch[0][0]; + nfapi_nr_dl_config_dlsch_pdu_rel15_t rel15 = dlsch->harq_processes[harq_pid]->dlsch_pdu.dlsch_pdu_rel15; + // dlsch->harq_processes[0]->b = (unsigned char*)malloc16(800); + // dlsch->harq_processes[i]->pdu = (uint8_t*)malloc16(MAX_NR_DLSCH_PAYLOAD_BYTES/bw_scaling); time_stats_t *rm_stats; time_stats_t *te_stats; time_stats_t *i_stats; uint8_t is_crnti; uint8_t llr8_flag; - unsigned char harq_pid = 0; //dlsch->harq_ids[subframe]; + unsigned int TBS = 8424; unsigned int available_bits; - uint16_t nb_symb_sch =10; + uint16_t nb_symb_sch =4; uint8_t nb_re_dmrs = 6; uint16_t length_dmrs = 1; unsigned char mod_order; - uint16_t nb_rb = 106; - uint8_t Imcs=22; + uint16_t nb_rb = 50; + uint8_t Imcs=9; uint8_t Nl=1; uint8_t rvidx = 0; + + dlsch->rnti =1; - dlsch->harq_ids[subframe]= 0; - dlsch->harq_processes[0]->nb_rb = nb_rb; - dlsch->harq_processes[0]->mcs = Imcs; - dlsch->harq_processes[0]->Nl = Nl; - dlsch->harq_processes[0]->rvidx = rvidx; + + /*dlsch->harq_processes[0]->mcs = Imcs; + dlsch->harq_processes[0]->rvidx = rvidx;*/ - printf("dlschsim harqid %d nb_rb %d, mscs %d\n",dlsch->harq_ids[subframe], - dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->mcs,dlsch->harq_processes[0]->Nl); + //printf("dlschsim harqid %d nb_rb %d, mscs %d\n",dlsch->harq_ids[subframe], + // dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->mcs,dlsch->harq_processes[0]->Nl); - mod_order = nr_get_Qm(dlsch->harq_processes[0]->mcs,1); - available_bits = nr_get_G(dlsch->harq_processes[0]->nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs,mod_order,Nl); + mod_order = nr_get_Qm(Imcs,1); + available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs,2,1); TBS= nr_compute_tbs(Imcs,nb_rb,nb_symb_sch,nb_re_dmrs,length_dmrs,Nl); printf("available bits %d TBS %d mod_order %d\n",available_bits, TBS, mod_order); + //dlsch->harq_ids[subframe]= 0; + rel15.n_prb = nb_rb; + rel15.nb_symbols = nb_symb_sch; + rel15.modulation_order = mod_order; + rel15.nb_layers = Nl; + rel15.nb_re_dmrs = nb_re_dmrs; double *modulated_input = malloc16(sizeof(double) * 16*68*384); short *channel_output_fixed = malloc16(sizeof( short) *16* 68*384); @@ -506,22 +526,18 @@ int main(int argc, char **argv) estimated_output = harq_process->b; - //for (int i=0; i0x%08x\n",crc24c(test_input, 32)); + //printf("crc32: [0]->0x%08x\n",crc24c(test_input, 32)); // generate signal if (input_fd==NULL) { - nr_dlsch_encoding(gNB, - test_input, - nb_symb_sch, + nr_dlsch_encoding(test_input, + subframe, dlsch, - frame, - subframe, - rm_stats, - te_stats, - i_stats); + frame_parms); + } @@ -585,9 +601,11 @@ int main(int argc, char **argv) dlsch0_ue->harq_processes[0], frame, nb_symb_sch, + subframe, harq_pid, is_crnti, llr8_flag); + //count errors for (i=0; i Date: Thu, 15 Nov 2018 11:57:19 +0100 Subject: [PATCH 085/117] nr_dlschsim update --- openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 2 ++ openair1/SIMULATION/NR_PHY/dlschsim.c | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index 68c273ddb5..d45f248023 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -341,6 +341,8 @@ int nr_dlsch_encoding(unsigned char *a, Kr = dlsch->harq_processes[harq_pid]->K; //Kr_bytes = Kr>>3; + //printf("segment Z %d kb %d k %d Kr %d BG %d\n", *pz,kb,dlsch->harq_processes[harq_pid]->K,Kr,BG); + //start_meas(te_stats); for (r=0; rharq_processes[harq_pid]->C; r++) { d_tmp[r] = &dlsch->harq_processes[harq_pid]->d[r][0]; diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c index c96b48adc5..e98d0c6ea3 100644 --- a/openair1/SIMULATION/NR_PHY/dlschsim.c +++ b/openair1/SIMULATION/NR_PHY/dlschsim.c @@ -468,7 +468,7 @@ gNB->dlsch[k][i]->Nsoft = 10; unsigned int TBS = 8424; unsigned int available_bits; - uint16_t nb_symb_sch =4; + uint16_t nb_symb_sch =8; uint8_t nb_re_dmrs = 6; uint16_t length_dmrs = 1; unsigned char mod_order; @@ -487,7 +487,7 @@ gNB->dlsch[k][i]->Nsoft = 10; // dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->mcs,dlsch->harq_processes[0]->Nl); mod_order = nr_get_Qm(Imcs,1); - available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs,2,1); + available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs,mod_order,1); TBS= nr_compute_tbs(Imcs,nb_rb,nb_symb_sch,nb_re_dmrs,length_dmrs,Nl); printf("available bits %d TBS %d mod_order %d\n",available_bits, TBS, mod_order); //dlsch->harq_ids[subframe]= 0; @@ -526,8 +526,8 @@ gNB->dlsch[k][i]->Nsoft = 10; estimated_output = harq_process->b; - for (int i=0; i0x%08x\n",crc24c(test_input, 32)); From dd55d0f6280d436c570d72bf2af28addecd6d221 Mon Sep 17 00:00:00 2001 From: hongzhi wang Date: Fri, 16 Nov 2018 10:20:11 +0100 Subject: [PATCH 086/117] pdsch unscrambling fix --- .../PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 10 +-- .../NR_UE_TRANSPORT/nr_dlsch_demodulation.c | 64 +++++++++---------- .../nr_dlsch_llr_computation.c | 2 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 2 +- 4 files changed, 40 insertions(+), 38 deletions(-) diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index f0a2fc9104..39031f20fd 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -168,7 +168,7 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint } void nr_dlsch_unscrambling(int16_t* llr, - uint8_t size, + uint32_t size, uint8_t q, uint32_t Nid, uint32_t n_RNTI) { @@ -538,11 +538,13 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, harq_process->c[r][m]= (uint8_t) llrProcBuf[m]; } -#ifdef DEBUG_DLSCH_DECODING - printf("output decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]); +//#ifdef DEBUG_DLSCH_DECODING + //printf("output decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]); + for (int k=0;k<32;k++) + printf("output decoder [%d] = 0x%02x \n", k, harq_process->c[r][k]); printf("no_iterations_ldpc %d (ret %d)\n",no_iteration_ldpc,ret); //write_output("dec_output.m","dec0",harq_process->c[0],Kr_bytes,1,4); -#endif +//#endif #if UE_TIMING_TRACE diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c index 41db2b0d89..3b8be9a38e 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c @@ -129,12 +129,13 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, //to be updated higher layer unsigned short start_rb = 0; unsigned short nb_rb_pdsch = 50; - int8_t *pllr_symbol_cw0; - int8_t *pllr_symbol_cw1; - int8_t *pllr_symbol_cw0_deint; - int8_t *pllr_symbol_cw1_deint; + int16_t *pllr_symbol_cw0; + int16_t *pllr_symbol_cw1; + int16_t *pllr_symbol_cw0_deint; + int16_t *pllr_symbol_cw1_deint; uint32_t llr_offset_symbol; uint16_t bundle_L = 2; + uint8_t l0 =2; switch (type) { case SI_PDSCH: @@ -338,7 +339,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, #endif if (beamforming_mode==0) { //else if nb_antennas_ports_eNB==1 && beamforming_mode == 0 - printf("start nr dlsch extract nr_tti_rx %d thread id %d \n", nr_tti_rx, ue->current_thread_id[nr_tti_rx]); + //printf("start nr dlsch extract nr_tti_rx %d thread id %d \n", nr_tti_rx, ue->current_thread_id[nr_tti_rx]); nb_rb = nr_dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].rxdataF, common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].dl_ch_estimates[eNB_id], pdsch_vars[eNB_id]->rxdataF_ext, @@ -843,7 +844,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, } #endif - printf("start compute LLR\n"); + //printf("start compute LLR\n"); if ((dlsch0_harq->mimo_mode == LARGE_CDD) || ((dlsch0_harq->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) && (dlsch0_harq->mimo_mode <=DUALSTREAM_PUSCH_PRECODING))) { @@ -855,10 +856,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, dl_ch_mag_ptr = pdsch_vars[eNB_id_i]->dl_ch_mag0; //i_mod should have been passed as a parameter } - - nb_re= (symbol==2)? (nb_rb*6):(nb_rb*12); - pdsch_vars[eNB_id]->llr_offset[symbol] = nb_re*dlsch0_harq->Qm; - + #if UE_TIMING_TRACE stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]); #if DISABLE_LOG_X @@ -875,15 +873,18 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, // compute LLRs // -> // compute @pointer where llrs should filled for this ofdm-symbol - llr_offset_symbol = pdsch_vars[eNB_id]->llr_offset[symbol]; + pdsch_vars[eNB_id]->llr_offset[l0-1] = 0; + llr_offset_symbol = pdsch_vars[eNB_id]->llr_offset[symbol-1]; //pllr_symbol_cw0_deint = (int8_t*)pdsch_vars[eNB_id]->llr[0]; //pllr_symbol_cw1_deint = (int8_t*)pdsch_vars[eNB_id]->llr[1]; - 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 = pdsch_vars[eNB_id]->llr[0]; + pllr_symbol_cw1 = pdsch_vars[eNB_id]->llr[1]; pllr_symbol_cw0 += llr_offset_symbol; pllr_symbol_cw1 += llr_offset_symbol; - - + + nb_re= (symbol==l0)? (nb_rb*6):(nb_rb*12); + pdsch_vars[eNB_id]->llr_offset[symbol] = nb_re*dlsch0_harq->Qm + llr_offset_symbol; + /*LOG_I(PHY,"compute LLRs [symbol %d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %x @LLR Buff(symb) %x\n", symbol, nb_rb,dlsch0_harq->Qm, @@ -892,31 +893,30 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, (int16_t*)pdsch_vars[eNB_id]->llr[0], pllr_symbol_cw0);*/ - printf("compute LLRs [symbol %d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %p @LLR Buff(symb) %p\n", + /*printf("compute LLRs [symbol %d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %p @LLR Buff(symb) %p\n", symbol, nb_rb,dlsch0_harq->Qm, 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); + pdsch_vars[eNB_id]->llr[0], + pllr_symbol_cw0);*/ switch (dlsch0_harq->Qm) { case 2 : if ((rx_type==rx_standard) || (codeword_TB1 == -1)) { nr_dlsch_qpsk_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, - (int16_t*)pllr_symbol_cw0, + pllr_symbol_cw0, symbol, first_symbol_flag, nb_rb, beamforming_mode); - printf("end llr symol %d\n",symbol); } else if (codeword_TB0 == -1){ nr_dlsch_qpsk_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, - (int16_t*)pllr_symbol_cw1, + pllr_symbol_cw1, symbol, first_symbol_flag, nb_rb, @@ -1093,7 +1093,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, } else if (codeword_TB0 == -1){ nr_dlsch_64qam_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, - (int16_t*)pllr_symbol_cw1, + pllr_symbol_cw1, pdsch_vars[eNB_id]->dl_ch_mag0, pdsch_vars[eNB_id]->dl_ch_magb0, symbol,first_symbol_flag,nb_rb, @@ -1165,7 +1165,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, 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, + pllr_symbol_cw1, symbol,first_symbol_flag,nb_rb, adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr_offset[symbol]); @@ -1184,7 +1184,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, if (rx_type==rx_standard) { nr_dlsch_qpsk_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, - (int16_t*)pllr_symbol_cw0, + pllr_symbol_cw0, symbol,first_symbol_flag,nb_rb, beamforming_mode); } @@ -1204,7 +1204,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, if (rx_type==rx_standard) { nr_dlsch_64qam_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, - (int16_t*)pllr_symbol_cw0, + pllr_symbol_cw0, pdsch_vars[eNB_id]->dl_ch_mag0, pdsch_vars[eNB_id]->dl_ch_magb0, symbol,first_symbol_flag,nb_rb, @@ -1220,7 +1220,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, } //nr_dlsch_deinterleaving(symbol,bundle_L,(int16_t*)pllr_symbol_cw0,(int16_t*)pllr_symbol_cw0_deint, nb_rb_pdsch); - + #if UE_TIMING_TRACE stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]); #if DISABLE_LOG_X @@ -2037,7 +2037,7 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF, rxF_ext = &rxdataF_ext[aarx][symbol*(nb_rb_pdsch*12)]; rxF = &rxdataF[aarx][(k+(symbol*(frame_parms->ofdm_symbol_size)))]; - printf("extract single addr %p pilots %d symbol %d, l %d RB_DL %d nushift %d k %d\n", rxF, pilots, symbol, l, frame_parms->N_RB_DL,frame_parms->nushift,k); + //printf("extract single addr %p pilots %d symbol %d, l %d RB_DL %d nushift %d k %d\n", rxF, pilots, symbol, l, frame_parms->N_RB_DL,frame_parms->nushift,k); //if ((frame_parms->N_RB_DL&1) == 0){ // even number of RBs @@ -2062,11 +2062,11 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF, for (i=0; i<12; i++) { rxF_ext[i]=rxF[i]; dl_ch0_ext[i]=dl_ch0[i]; - printf("rb %ld %p: (%d,%d)\n",(rxF+i-&rxdataF[aarx][( (symbol*(frame_parms->ofdm_symbol_size)))]),rxF, + /*printf("rb %ld %p: (%d,%d)\n",(rxF+i-&rxdataF[aarx][( (symbol*(frame_parms->ofdm_symbol_size)))]),rxF, ((short*)&rxF[i])[0],((short*)&rxF[i])[1]); printf("rb %ld %p: dl_ch (%d,%d)\n",(rxF+i-&rxdataF[aarx][( (symbol*(frame_parms->ofdm_symbol_size)))]),rxF, ((short*)&dl_ch0[i])[0],((short*)&dl_ch0[i])[1]); - printf("re count %d\n",rb*12+i); + printf("re count %d\n",rb*12+i);*/ } dl_ch0_ext+=12; @@ -2077,10 +2077,10 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF, for (i=0; i<12; i++) { if ((i&1)!=frame_parms->nushift){ rxF_ext[j]=rxF[i]; - printf("extract rb %d, re %d => rxF (%d,%d) rxF ext (%d,%d) addr %p\n",rb,i,*(short *)&rxF[i],*(1+(short*)&rxF[i]),*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]),rxF_ext); + //printf("extract rb %d, re %d => rxF (%d,%d) rxF ext (%d,%d) addr %p\n",rb,i,*(short *)&rxF[i],*(1+(short*)&rxF[i]),*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]),rxF_ext); dl_ch0_ext[j]=dl_ch0[i]; - printf("rb %ld %p: dl_ch (%d,%d)\n",(rxF+i-&rxdataF[aarx][( (symbol*(frame_parms->ofdm_symbol_size)))]),rxF, - ((short*)&dl_ch0[i])[0],((short*)&dl_ch0[i])[1]); + //printf("rb %ld %p: dl_ch (%d,%d)\n",(rxF+i-&rxdataF[aarx][( (symbol*(frame_parms->ofdm_symbol_size)))]),rxF, + //((short*)&dl_ch0[i])[0],((short*)&dl_ch0[i])[1]); j++; } } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c index c66ad79b91..9527bf10e9 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c @@ -660,7 +660,7 @@ int nr_dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, */ for (i=0; icommon_vars.common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx>>1]].rxdataF[0],ue->frame_parms.ofdm_symbol_size*2,1,1); + //write_output("rxdataF.m","rxF",ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx>>1]].rxdataF[0],ue->frame_parms.ofdm_symbol_size*2,1,1); //ue_measurement_procedures(l-1,ue,proc,eNB_id,(nr_tti_rx<<1),abstraction_flag,mode); From d7b80ffb13a0c24b1fb906106d091952701b23fe Mon Sep 17 00:00:00 2001 From: Raphael Defosseux Date: Fri, 16 Nov 2018 17:23:22 +0100 Subject: [PATCH 087/117] CI: adding NR DLSCH phy-sim test to build / report Signed-off-by: Raphael Defosseux --- ci-scripts/oai-ci-vm-tool | 4 ++-- ci-scripts/reportBuildLocally.sh | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ci-scripts/oai-ci-vm-tool b/ci-scripts/oai-ci-vm-tool index 8d3dbb4ddd..dda71d2606 100755 --- a/ci-scripts/oai-ci-vm-tool +++ b/ci-scripts/oai-ci-vm-tool @@ -252,7 +252,7 @@ case $key in VM_NAME=ci-phy-sim ARCHIVES_LOC=phy_sim LOG_PATTERN=.Rel15.txt - NB_PATTERN_FILES=6 + NB_PATTERN_FILES=7 BUILD_OPTIONS="--phy_simulators" RUN_OPTIONS="./run_exec_autotests.bash -g \"01510*\" -q -np -b" NBARGS=$[$NBARGS+256] @@ -330,7 +330,7 @@ case $key in VM_NAME=ci-phy-sim ARCHIVES_LOC=phy_sim LOG_PATTERN=.Rel15.txt - NB_PATTERN_FILES=6 + NB_PATTERN_FILES=7 BUILD_OPTIONS="--phy_simulators" RUN_OPTIONS="./run_exec_autotests.bash -g \"01510*\" -q -np -b" NBARGS=$[$NBARGS+256] diff --git a/ci-scripts/reportBuildLocally.sh b/ci-scripts/reportBuildLocally.sh index 2e78e6f6cd..d523c25baa 100755 --- a/ci-scripts/reportBuildLocally.sh +++ b/ci-scripts/reportBuildLocally.sh @@ -411,6 +411,10 @@ function report_build { then summary_table_row "PBCH Test - Release 15" ./archives/phy_sim/nr_pbchsim.Rel15.txt "Built target nr_pbchsim" ./phy_sim_row6.html fi + if [ -f ./archives/phy_sim/nr_dlschsim.Rel15.txt ] + then + summary_table_row "DLSCH Test - Release 15" ./archives/phy_sim/nr_dlschsim.Rel15.txt "Built target nr_dlschsim" ./phy_sim_row7.html + fi summary_table_footer From 8e10cd33631383f10f9f29e69ab9a972bcd2dafe Mon Sep 17 00:00:00 2001 From: hongzhi wang Date: Tue, 20 Nov 2018 10:03:13 +0100 Subject: [PATCH 088/117] adding adjust sync --- cmake_targets/CMakeLists.txt | 1 + .../nr_dl_channel_estimation.c | 50 +++++++++++++++++- openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h | 8 +++ openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 51 +++++++++++++------ 4 files changed, 93 insertions(+), 17 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 48e67e0662..7a270e5e96 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1355,6 +1355,7 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_dmrs_rx.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold_ue.c ${OPENAIR1_DIR}/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c + ${OPENAIR1_DIR}/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ue_measurements.c ${OPENAIR1_DIR}/PHY/TOOLS/file_output.c ${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index ac60cef628..7629f0e4f6 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -262,7 +262,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, unsigned short nb_rb_coreset) { int pilot[200] __attribute__((aligned(16))); - unsigned char aarx; + unsigned char aarx,p; unsigned short k; unsigned int pilot_cnt; int16_t ch[2],*pil,*rxF,*dl_ch,*fl,*fm,*fr; @@ -424,6 +424,52 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, } } + + void (*idft)(int16_t *,int16_t *, int); + + switch (ue->frame_parms.ofdm_symbol_size) { + case 128: + idft = idft128; + break; + + case 256: + idft = idft256; + break; + + case 512: + idft = idft512; + break; + + case 1024: + idft = idft1024; + break; + + case 1536: + idft = idft1536; + break; + + case 2048: + idft = idft2048; + break; + + default: + idft = idft512; + break; + } + + if( ((Ns%2) == 0) && (l == 0)) + { + // do ifft of channel estimate + for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) + for (p=0; pframe_parms.nb_antenna_ports_eNB; p++) { + if (ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].dl_ch_estimates[eNB_offset][(p<<1)+aarx]) + { + //LOG_I(PHY,"Channel Impulse Computation Slot %d ThreadId %d Symbol %d \n", Ns, ue->current_thread_id[Ns>>1], l); + idft((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].dl_ch_estimates[eNB_offset][(p<<1)+aarx][0], + (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].dl_ch_estimates_time[eNB_offset][(p<<1)+aarx],1); + } + } + } return(0); } @@ -465,7 +511,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, int re_offset = k; //#ifdef DEBUG_CH - printf("PDSCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, symbol_offset %d OFDM size %d, Ncp=%d, l=%d, Ns=%d, k=%d symbol %d\n",ue->current_thread_id[Ns>>1], eNB_offset,ch_offset,symbol_offset,ue->frame_parms.ofdm_symbol_size, + printf("PDSCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, symbol_offset %d OFDM size %d, Ncp=%d, l=%d, Ns=%d, k=%d symbol %d\n",ue->current_thread_id[Ns], eNB_offset,ch_offset,symbol_offset,ue->frame_parms.ofdm_symbol_size, ue->frame_parms.Ncp,l,Ns,k, symbol); //#endif diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h index aaaf63e753..ae4295a99b 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h @@ -67,4 +67,12 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, unsigned char symbol, unsigned short bwp_start_subcarrier, unsigned short nb_rb_pdsch); + +void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms, + PHY_VARS_NR_UE *ue, + module_id_t eNB_id, + uint8_t subframe, + unsigned char clear, + short coef); + #endif diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 7f443cdb17..75eff8b907 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -46,6 +46,7 @@ #include "SCHED_NR/extern.h" //#include //#include "targets/RT/USER/nr-softmodem.h" +#include "PHY/NR_UE_ESTIMATION/nr_estimation.h" #ifdef EMOS #include "SCHED/phy_procedures_emos.h" @@ -2643,19 +2644,25 @@ void phy_procedures_UE_S_TX(PHY_VARS_NR_UE *ue,uint8_t eNB_id,uint8_t abstractio } } -void ue_measurement_procedures( +#endif + +void nr_ue_measurement_procedures( uint16_t l, // symbol index of each slot [0..6] - PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc, uint8_t eNB_id, + PHY_VARS_NR_UE *ue, + UE_nr_rxtx_proc_t *proc, + uint8_t eNB_id, uint16_t slot, // slot index of each radio frame [0..19] - uint8_t abstraction_flag,runmode_t mode) + uint8_t abstraction_flag, + runmode_t mode) { - //LOG_I(PHY,"ue_measurement_procedures l %d Ncp %d\n",l,ue->frame_parms.Ncp); + LOG_I(PHY,"ue_measurement_procedures l %u Ncp %d\n",l,ue->frame_parms.Ncp); NR_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; int nr_tti_rx = proc->nr_tti_rx; +#if 0 VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_MEASUREMENT_PROCEDURES, VCD_FUNCTION_IN); if (l==0) { @@ -2705,12 +2712,12 @@ void ue_measurement_procedures( ue->sinr_eff = sinr_eff_cqi_calc(ue, 0, nr_tti_rx); } - +#endif // accumulate and filter timing offset estimation every nr_tti_rx (instead of every frame) if (( (slot%2) == 0) && (l==(4-frame_parms->Ncp))) { // AGC - +/* VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL, VCD_FUNCTION_IN); #ifndef OAI_USRP @@ -2724,12 +2731,14 @@ void ue_measurement_procedures( #endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL, VCD_FUNCTION_OUT); - +*/ eNB_id = 0; if (abstraction_flag == 0) { + + printf("start adjust sync l = %d slot = %d no timing %d\n",l, slot, ue->no_timing_correction); if (ue->no_timing_correction==0) - lte_adjust_synch(&ue->frame_parms, + nr_adjust_synch_ue(&ue->frame_parms, ue, eNB_id, nr_tti_rx, @@ -2742,6 +2751,7 @@ void ue_measurement_procedures( VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_MEASUREMENT_PROCEDURES, VCD_FUNCTION_OUT); } + #ifdef EMOS void phy_procedures_emos_UE_RX(PHY_VARS_NR_UE *ue,uint8_t last_slot,uint8_t eNB_id) { @@ -2830,7 +2840,7 @@ void phy_procedures_emos_UE_RX(PHY_VARS_NR_UE *ue,uint8_t last_slot,uint8_t eNB_ } #endif - +#if 0 void restart_phy(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc, uint8_t eNB_id,uint8_t abstraction_flag) { @@ -5475,6 +5485,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN int nr_tti_rx = proc->nr_tti_rx; proc->decoder_switch = 0; //int counter_decoder = 0; + + LOG_I(PHY," ****** start RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, nr_tti_rx); uint8_t next1_thread_id = ue->current_thread_id[nr_tti_rx]== (RX_NB_TH-1) ? 0:(ue->current_thread_id[nr_tti_rx]+1); uint8_t next2_thread_id = next1_thread_id== (RX_NB_TH-1) ? 0:(next1_thread_id+1); @@ -5557,8 +5569,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN #endif //nr_gold_pdcch(ue,0, 2); - if (nr_tti_rx==2) - for (int l=0; l<2; l++) { + if (nr_tti_rx==1){ + for (uint16_t l=0; l<2; l++) { if (abstraction_flag == 0) { #if UE_TIMING_TRACE start_meas(&ue->ofdm_demod_stats); @@ -5567,7 +5579,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN); nr_slot_fep(ue, l, - nr_tti_rx, + nr_tti_rx<<1, 0, 0, 1, @@ -5576,8 +5588,12 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN #if UE_TIMING_TRACE stop_meas(&ue->ofdm_demod_stats); #endif + printf("phy procedure pdcch start measurement l =%d\n",l); + nr_ue_measurement_procedures(l,ue,proc,eNB_id,(nr_tti_rx<<1),abstraction_flag,mode); } + } + } //write_output("rxdataF.m","rxF",ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx>>1]].rxdataF[0],ue->frame_parms.ofdm_symbol_size*2,1,1); @@ -5654,18 +5670,23 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN //#if 0 LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx); - if (nr_tti_rx==2){ + if (nr_tti_rx==1){ //to update from pdsch config nr_gold_pdsch(ue,2,0, 1); - for (int m=2;m<6 ; m++) + for (uint16_t m=2;m<6 ; m++){ nr_slot_fep(ue, m, //to be updated from higher layer - nr_tti_rx, + nr_tti_rx<<1, 0, 0, 1, NR_PDSCH_EST); + + printf("phy procedure pdsch start measurement\n"); + nr_ue_measurement_procedures(m,ue,proc,eNB_id,(nr_tti_rx<<1),abstraction_flag,mode); + + } //set active for testing, to be removed ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active = 1; } From 4a218386fd3d391fc72a448c03e88ee548e9417a Mon Sep 17 00:00:00 2001 From: hongzhi wang Date: Tue, 20 Nov 2018 16:10:12 +0100 Subject: [PATCH 089/117] add missing file for adjust synch --- .../PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c | 140 ++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c new file mode 100644 index 0000000000..c74a794735 --- /dev/null +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c @@ -0,0 +1,140 @@ +/* + * 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/types.h" +#include "PHY/defs_nr_UE.h" +#include "PHY/NR_UE_ESTIMATION/nr_estimation.h" +#include "PHY/impl_defs_top.h" +//#include "openair2/LAYER2/MAC/mac_proto.h" + +#include "common/utils/LOG/vcd_signal_dumper.h" + +#define DEBUG_PHY + +// Adjust location synchronization point to account for drift +// The adjustment is performed once per frame based on the +// last channel estimate of the receiver + +void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms, + PHY_VARS_NR_UE *ue, + module_id_t eNB_id, + uint8_t subframe, + unsigned char clear, + short coef) +{ + + static int max_pos_fil = 0; + static int count_max_pos_ok = 0; + static int first_time = 1; + int temp = 0, i, aa, max_val = 0, max_pos = 0; + int diff; + short Re,Im,ncoef; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_IN); + + ncoef = 32767 - coef; + +//#ifdef DEBUG_PHY + LOG_D(PHY,"AbsSubframe %d.%d: rx_offset (before) = %d\n",ue->proc.proc_rxtx[0].frame_rx%1024,subframe,ue->rx_offset); +//#endif //DEBUG_PHY + + + // we only use channel estimates from tx antenna 0 here + for (i = 0; i < frame_parms->nb_prefix_samples; i++) { + temp = 0; + + for (aa=0; aanb_antennas_rx; aa++) { + Re = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id][aa])[(i<<1)]; + Im = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id][aa])[1+(i<<1)]; + temp += (Re*Re/2) + (Im*Im/2); + } + + if (temp > max_val) { + max_pos = i; + max_val = temp; + } + } + + // filter position to reduce jitter + if (clear == 1) + max_pos_fil = max_pos; + else + max_pos_fil = ((max_pos_fil * coef) + (max_pos * ncoef)) >> 15; + + // do not filter to have proactive timing adjustment + max_pos_fil = max_pos; + + if(subframe == 1) + { + diff = max_pos_fil - (frame_parms->nb_prefix_samples>>3); + + if ( abs(diff) < SYNCH_HYST ) + ue->rx_offset = 0; + else + ue->rx_offset = diff; + + if(abs(diff)<5) + count_max_pos_ok ++; + else + count_max_pos_ok = 0; + + printf("adjust sync count_max_pos_ok = %d\n",count_max_pos_ok); + + if(count_max_pos_ok > 10 && first_time == 1) + { + first_time = 0; + ue->time_sync_cell = 1; + if (ue->mac_enabled==1) { + LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",ue->Mod_id); + //mac_resynch(); + //dl_phy_sync_success(ue->Mod_id,ue->proc.proc_rxtx[0].frame_rx,0,1);//ue->common_vars.eNb_id); + ue->UE_mode[0] = PRACH; + } + else { + ue->UE_mode[0] = PUSCH; + } + } + + if ( ue->rx_offset < 0 ) + ue->rx_offset += FRAME_LENGTH_COMPLEX_SAMPLES; + + if ( ue->rx_offset >= FRAME_LENGTH_COMPLEX_SAMPLES ) + ue->rx_offset -= FRAME_LENGTH_COMPLEX_SAMPLES; + + + + #ifdef DEBUG_PHY + LOG_I(PHY,"AbsSubframe %d.%d: ThreadId %d diff =%i rx_offset (final) = %i : clear %d,max_pos = %d,max_pos_fil = %d (peak %d) max_val %d target_pos %d \n", + ue->proc.proc_rxtx[ue->current_thread_id[subframe]].frame_rx, + subframe, + ue->current_thread_id[subframe], + diff, + ue->rx_offset, + clear, + max_pos, + max_pos_fil, + temp,max_val, + (frame_parms->nb_prefix_samples>>3)); + #endif //DEBUG_PHY + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT); + } +} From 89eb94eccea6d2511c8ebaab7281de180e95740f Mon Sep 17 00:00:00 2001 From: Hongzhi Date: Thu, 22 Nov 2018 09:28:59 +0100 Subject: [PATCH 090/117] sdr_addrs commented temporarily for ADRV9371 --- targets/RT/USER/nr-ru.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/targets/RT/USER/nr-ru.c b/targets/RT/USER/nr-ru.c index 31698232b4..1147420988 100644 --- a/targets/RT/USER/nr-ru.c +++ b/targets/RT/USER/nr-ru.c @@ -2443,9 +2443,11 @@ void RCconfig_RU(void) { RC.ru[j]->num_gNB = 0; for (i=0;inum_gNB;i++) RC.ru[j]->gNB_list[i] = RC.gNB[RUParamList.paramarray[j][RU_ENB_LIST_IDX].iptr[i]][0]; +#ifndef OAI_ADRV9371_ZC706 if (config_isparamset(RUParamList.paramarray[j], RU_SDR_ADDRS)) { RC.ru[j]->openair0_cfg.sdr_addrs = strdup(*(RUParamList.paramarray[j][RU_SDR_ADDRS].strptr)); } +#endif if (config_isparamset(RUParamList.paramarray[j], RU_SDR_CLK_SRC)) { if (strcmp(*(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr), "internal") == 0) { From f2839eaf8e545ac968d896a94286f9ae6b5dcf7b Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Thu, 22 Nov 2018 21:26:06 +0100 Subject: [PATCH 091/117] some fixes in dlschsim + nr_dlsch_decoding --- .../PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 25 +- openair1/SIMULATION/NR_PHY/dlschsim.c | 651 +++++++++--------- 2 files changed, 329 insertions(+), 347 deletions(-) diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index 39031f20fd..d6adafc54b 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -292,7 +292,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, harq_process->Qm,harq_process->Nl); G = harq_process->G; - printf("DLSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_symb_sch %d \n",harq_pid,A,G, harq_process->mcs, harq_process->Nl, nb_symb_sch); + //printf("DLSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_symb_sch %d \n",harq_pid,A,G, harq_process->mcs, harq_process->Nl, nb_symb_sch); if (harq_process->round == 0) { // This is a new packet, so compute quantities regarding segmentation @@ -325,7 +325,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, kc = 52; } - p_decParams->numMaxIter = 2; + p_decParams->numMaxIter = dlsch->max_ldpc_iterations; Kr = p_decParams->Z*kb; p_decParams->outMode= 0; @@ -365,7 +365,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, for (r=0; rC; r++) { - printf("start rx segment %d\n",r); + //printf("start rx segment %d\n",r); #if UE_TIMING_TRACE start_meas(dlsch_rate_unmatching_stats); @@ -519,13 +519,12 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, */ nb_total_decod++; - if (no_iteration_ldpc > 10){ + if (no_iteration_ldpc > dlsch->max_ldpc_iterations){ nb_error_decod++; - ret = 1+dlsch->max_ldpc_iterations; - } - else { - ret=2; } + + ret=no_iteration_ldpc; + //if (!nb_total_decod%10000){ printf("Error number of iteration LPDC %d %ld/%ld \n", no_iteration_ldpc, nb_error_decod,nb_total_decod);fflush(stdout); //} @@ -538,13 +537,13 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, harq_process->c[r][m]= (uint8_t) llrProcBuf[m]; } -//#ifdef DEBUG_DLSCH_DECODING +#ifdef DEBUG_DLSCH_DECODING //printf("output decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]); for (int k=0;k<32;k++) printf("output decoder [%d] = 0x%02x \n", k, harq_process->c[r][k]); printf("no_iterations_ldpc %d (ret %d)\n",no_iteration_ldpc,ret); //write_output("dec_output.m","dec0",harq_process->c[0],Kr_bytes,1,4); -//#endif +#endif #if UE_TIMING_TRACE @@ -1233,10 +1232,10 @@ if (harq_process->C>1) { // wakeup worker if more than 1 segment llrProcBuf, p_procTime); - if (no_iteration_ldpc > 2) - printf("Error number of iteration LPDC %d\n", no_iteration_ldpc); + //if (no_iteration_ldpc > 2) + //printf("Error number of iteration LPDC %d\n", no_iteration_ldpc); //else - //printf("OK number of iteration LPDC %d\n", no_iteration_ldpc); + //printf("OK number of iteration LPDC %d\n", no_iteration_ldpc); for (int m=0; m < Kr>>3; m ++) { diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c index e98d0c6ea3..8acbf5dc36 100644 --- a/openair1/SIMULATION/NR_PHY/dlschsim.c +++ b/openair1/SIMULATION/NR_PHY/dlschsim.c @@ -28,7 +28,7 @@ #include "common/config/config_userapi.h" #include "common/utils/LOG/log.h" -#include "common/ran_context.h" +#include "common/ran_context.h" #include "SIMULATION/TOOLS/sim.h" #include "SIMULATION/RF/rf.h" @@ -50,7 +50,7 @@ //#include "PHY/MODULATION/modulation_common.h" //#include "common/config/config_load_configmodule.h" //#include "UTIL/LISTS/list.h" -//#include "common/ran_context.h" +//#include "common/ran_context.h" PHY_VARS_gNB *gNB; PHY_VARS_NR_UE *UE; @@ -61,36 +61,50 @@ double cpuf; // dummy functions int nfapi_mode=0; -int oai_nfapi_hi_dci0_req(nfapi_hi_dci0_request_t *hi_dci0_req) { return(0);} -int oai_nfapi_tx_req(nfapi_tx_request_t *tx_req) { return(0); } +int oai_nfapi_hi_dci0_req(nfapi_hi_dci0_request_t *hi_dci0_req) { + return(0); +} +int oai_nfapi_tx_req(nfapi_tx_request_t *tx_req) { + return(0); +} -int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req) { return(0); } +int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req) { + return(0); +} -int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req) { return(0); } +int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req) { + return(0); +} -int oai_nfapi_nr_dl_config_req(nfapi_nr_dl_config_request_t *dl_config_req) {return(0);} +int oai_nfapi_nr_dl_config_req(nfapi_nr_dl_config_request_t *dl_config_req) { + return(0); +} -uint32_t from_earfcn(int eutra_bandP,uint32_t dl_earfcn) {return(0);} -int32_t get_uldl_offset(int eutra_bandP) {return(0);} +uint32_t from_earfcn(int eutra_bandP,uint32_t dl_earfcn) { + return(0); +} +int32_t get_uldl_offset(int eutra_bandP) { + return(0); +} -NR_IF_Module_t *NR_IF_Module_init(int Mod_id){return(NULL);} +NR_IF_Module_t *NR_IF_Module_init(int Mod_id) { + return(NULL); +} -void exit_function(const char* file, const char* function, const int line,const char *s) { - const char * msg= s==NULL ? "no comment": s; - printf("Exiting at: %s:%d %s(), %s\n", file, line, function, msg); - exit(-1); +void exit_function(const char *file, const char *function, const int line,const char *s) { + const char *msg= s==NULL ? "no comment": s; + printf("Exiting at: %s:%d %s(), %s\n", file, line, function, msg); + exit(-1); } // needed for some functions -PHY_VARS_NR_UE * PHY_vars_UE_g[1][1]={{NULL}}; +PHY_VARS_NR_UE *PHY_vars_UE_g[1][1]= {{NULL}}; uint16_t n_rnti=0x1234; -char quantize(double D,double x,unsigned char B) -{ +char quantize(double D,double x,unsigned char B) { double qxd; short maxlev; qxd = floor(x/D); - maxlev = 1<<(B-1);//(char)(pow(2,B-1)); //printf("x=%f,qxd=%f,maxlev=%d\n",x,qxd, maxlev); @@ -103,11 +117,8 @@ char quantize(double D,double x,unsigned char B) return((char)qxd); } -int main(int argc, char **argv) -{ - +int main(int argc, char **argv) { char c; - int i; //,j,l,aa; double SNR,SNR_lin,snr0=-2.0,snr1=2.0; double snr_step = 0.1; @@ -120,42 +131,37 @@ int main(int argc, char **argv) uint8_t write_output_file=0; // int subframe_offset; // char fname[40], vname[40]; - int trial,n_trials=1,n_errors; + int trial,n_trials=1,n_errors=0,n_false_positive=0; uint8_t transmission_mode = 1,n_tx=1,n_rx=1; uint16_t Nid_cell=0; - channel_desc_t *gNB2UE; uint8_t extended_prefix_flag=0; int8_t interf1=-21,interf2=-21; - FILE *input_fd=NULL,*pbch_file_fd=NULL; char input_val_str[50],input_val_str2[50]; //uint16_t NB_RB=25; - SCM_t channel_model=AWGN;//Rayleigh1_anticorr; uint8_t N_RB_DL=106,mu=1; - unsigned char frame_type = 0; unsigned char pbch_phase = 0; - int frame=0,subframe=0; int frame_length_complex_samples; //int frame_length_complex_samples_no_prefix; NR_DL_FRAME_PARMS *frame_parms; //nfapi_nr_config_request_t *gNB_config; - uint8_t Kmimo; uint32_t Nsoft; double sigma; unsigned char qbits=8; - int ret; int run_initial_sync=0; - int loglvl=OAILOG_WARNING; - float target_error_rate = 0.01; - + + uint16_t nb_symb_sch =12; + uint16_t nb_rb = 50; + uint8_t Imcs=9; + cpuf = get_cpu_freq_GHz(); if ( load_configmodule(argc,argv) == 0) { @@ -165,91 +171,86 @@ int main(int argc, char **argv) //logInit(); randominit(0); - while ((c = getopt (argc, argv, "f:hA:pf:g:i:j:n:s:S:t:x:y:z:N:F:GR:dP:")) != -1) { + while ((c = getopt (argc, argv, "df:hpg:i:j:n:l:m:r:s:S:y:z:N:F:R:P:")) != -1) { switch (c) { - case 'f': - write_output_file=1; - output_fd = fopen(optarg,"w"); + case 'f': + write_output_file=1; + output_fd = fopen(optarg,"w"); - if (output_fd==NULL) { - printf("Error opening %s\n",optarg); - exit(-1); - } + if (output_fd==NULL) { + printf("Error opening %s\n",optarg); + exit(-1); + } - break; - - case 'd': - frame_type = 1; - break; - - case 'g': - switch((char)*optarg) { - case 'A': - channel_model=SCM_A; break; - case 'B': - channel_model=SCM_B; + case 'd': + frame_type = 1; break; - case 'C': - channel_model=SCM_C; + case 'g': + switch((char)*optarg) { + case 'A': + channel_model=SCM_A; + break; + + case 'B': + channel_model=SCM_B; + break; + + case 'C': + channel_model=SCM_C; + break; + + case 'D': + channel_model=SCM_D; + break; + + case 'E': + channel_model=EPA; + break; + + case 'F': + channel_model=EVA; + break; + + case 'G': + channel_model=ETU; + break; + + default: + msg("Unsupported channel model!\n"); + exit(-1); + } + break; - case 'D': - channel_model=SCM_D; + case 'i': + interf1=atoi(optarg); break; - case 'E': - channel_model=EPA; + case 'j': + interf2=atoi(optarg); break; - case 'F': - channel_model=EVA; + case 'n': + n_trials = atoi(optarg); break; - case 'G': - channel_model=ETU; + case 's': + snr0 = atof(optarg); + msg("Setting SNR0 to %f\n",snr0); break; - default: - msg("Unsupported channel model!\n"); - exit(-1); - } + case 'S': + snr1 = atof(optarg); + snr1set=1; + msg("Setting SNR1 to %f\n",snr1); + break; - break; - - case 'i': - interf1=atoi(optarg); - break; - - case 'j': - interf2=atoi(optarg); - break; - - case 'n': - n_trials = atoi(optarg); - break; - - case 's': - snr0 = atof(optarg); - msg("Setting SNR0 to %f\n",snr0); - break; - - case 'S': - snr1 = atof(optarg); - snr1set=1; - msg("Setting SNR1 to %f\n",snr1); - break; - - /* - case 't': - Td= atof(optarg); - break; - */ - case 'p': - extended_prefix_flag=1; - break; + case 'p': + extended_prefix_flag=1; + break; /* case 'r': @@ -260,90 +261,91 @@ int main(int argc, char **argv) } break; */ - case 'x': - transmission_mode=atoi(optarg); + + case 'y': + n_tx=atoi(optarg); - if ((transmission_mode!=1) && - (transmission_mode!=2) && - (transmission_mode!=6)) { - msg("Unsupported transmission mode %d\n",transmission_mode); - exit(-1); - } + if ((n_tx==0) || (n_tx>2)) { + msg("Unsupported number of tx antennas %d\n",n_tx); + exit(-1); + } + break; + + case 'z': + n_rx=atoi(optarg); + + if ((n_rx==0) || (n_rx>2)) { + msg("Unsupported number of rx antennas %d\n",n_rx); + exit(-1); + } + + break; + + case 'N': + Nid_cell = atoi(optarg); + break; + + case 'R': + N_RB_DL = atoi(optarg); + break; + + case 'F': + input_fd = fopen(optarg,"r"); + + if (input_fd==NULL) { + printf("Problem with filename %s\n",optarg); + exit(-1); + } + + break; + + case 'P': + pbch_phase = atoi(optarg); + + if (pbch_phase>3) + printf("Illegal PBCH phase (0-3) got %d\n",pbch_phase); + + break; + + case 'm': + Imcs = atoi(optarg); break; - case 'y': - n_tx=atoi(optarg); - - if ((n_tx==0) || (n_tx>2)) { - msg("Unsupported number of tx antennas %d\n",n_tx); - exit(-1); - } - + case 'l': + nb_symb_sch = atoi(optarg); break; - - case 'z': - n_rx=atoi(optarg); - - if ((n_rx==0) || (n_rx>2)) { - msg("Unsupported number of rx antennas %d\n",n_rx); - exit(-1); - } - - break; - - case 'N': - Nid_cell = atoi(optarg); - break; - - case 'R': - N_RB_DL = atoi(optarg); - break; - - case 'F': - input_fd = fopen(optarg,"r"); - - if (input_fd==NULL) { - printf("Problem with filename %s\n",optarg); - exit(-1); - } - - break; - - case 'P': - pbch_phase = atoi(optarg); - - if (pbch_phase>3) - printf("Illegal PBCH phase (0-3) got %d\n",pbch_phase); - - break; - - default: - case 'h': - printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n", - argv[0]); - printf("-h This message\n"); - printf("-p Use extended prefix mode\n"); - printf("-d Use TDD\n"); - printf("-n Number of frames to simulate\n"); - printf("-s Starting SNR, runs from SNR0 to SNR0 + 5 dB. If n_frames is 1 then just SNR is simulated\n"); - printf("-S Ending SNR, runs from SNR0 to SNR1\n"); - printf("-t Delay spread for multipath channel\n"); - printf("-g [A,B,C,D,E,F,G] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models (ignores delay spread and Ricean factor)\n"); - printf("-x Transmission mode (1,2,6 for the moment)\n"); - printf("-y Number of TX antennas used in eNB\n"); - printf("-z Number of RX antennas used in UE\n"); - printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n"); - printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n"); - printf("-N Nid_cell\n"); - printf("-R N_RB_DL\n"); - printf("-O oversampling factor (1,2,4,8,16)\n"); - printf("-A Interpolation_filname Run with Abstraction to generate Scatter plot using interpolation polynomial in file\n"); - // printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n"); - printf("-f Output filename (.txt format) for Pe/SNR results\n"); - printf("-F Input filename (.txt format) for RX conformance testing\n"); - exit (-1); + + case 'r': + nb_rb = atoi(optarg); break; + + default: + case 'h': + printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n", + argv[0]); + printf("-h This message\n"); + printf("-p Use extended prefix mode\n"); + printf("-d Use TDD\n"); + printf("-n Number of frames to simulate\n"); + printf("-s Starting SNR, runs from SNR0 to SNR0 + 5 dB. If n_frames is 1 then just SNR is simulated\n"); + printf("-S Ending SNR, runs from SNR0 to SNR1\n"); + printf("-t Delay spread for multipath channel\n"); + printf("-g [A,B,C,D,E,F,G] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models (ignores delay spread and Ricean factor)\n"); + printf("-x Transmission mode (1,2,6 for the moment)\n"); + printf("-y Number of TX antennas used in eNB\n"); + printf("-z Number of RX antennas used in UE\n"); + printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n"); + printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n"); + printf("-N Nid_cell\n"); + printf("-R N_RB_DL\n"); + printf("-O oversampling factor (1,2,4,8,16)\n"); + printf("-A Interpolation_filname Run with Abstraction to generate Scatter plot using interpolation polynomial in file\n"); + // printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n"); + printf("-f Output filename (.txt format) for Pe/SNR results\n"); + printf("-F Input filename (.txt format) for RX conformance testing\n"); + exit (-1); + break; } } @@ -357,8 +359,8 @@ int main(int argc, char **argv) gNB2UE = new_channel_desc_scm(n_tx, n_rx, channel_model, - 61.44e6, //N_RB2sampling_rate(N_RB_DL), - 40e6, //N_RB2channel_bandwidth(N_RB_DL), + 61.44e6, //N_RB2sampling_rate(N_RB_DL), + 40e6, //N_RB2channel_bandwidth(N_RB_DL), 0, 0, 0); @@ -368,8 +370,8 @@ int main(int argc, char **argv) exit(-1); } - RC.gNB = (PHY_VARS_gNB***) malloc(sizeof(PHY_VARS_gNB **)); - RC.gNB[0] = (PHY_VARS_gNB**) malloc(sizeof(PHY_VARS_gNB *)); + RC.gNB = (PHY_VARS_gNB ** *) malloc(sizeof(PHY_VARS_gNB **)); + RC.gNB[0] = (PHY_VARS_gNB **) malloc(sizeof(PHY_VARS_gNB *)); RC.gNB[0][0] = malloc(sizeof(PHY_VARS_gNB)); gNB = RC.gNB[0][0]; //gNB_config = &gNB->gNB_config; @@ -377,126 +379,106 @@ int main(int argc, char **argv) frame_parms->nb_antennas_tx = n_tx; frame_parms->nb_antennas_rx = n_rx; frame_parms->N_RB_DL = N_RB_DL; - crcTableInit(); nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu); phy_init_nr_gNB(gNB,0,0); //init_eNB_afterRU(); - frame_length_complex_samples = frame_parms->samples_per_subframe; //frame_length_complex_samples_no_prefix = frame_parms->samples_per_subframe_wCP; - - s_re = malloc(2*sizeof(double*)); - s_im = malloc(2*sizeof(double*)); - r_re = malloc(2*sizeof(double*)); - r_im = malloc(2*sizeof(double*)); - txdata = malloc(2*sizeof(int*)); + s_re = malloc(2*sizeof(double *)); + s_im = malloc(2*sizeof(double *)); + r_re = malloc(2*sizeof(double *)); + r_im = malloc(2*sizeof(double *)); + txdata = malloc(2*sizeof(int *)); for (i=0; i<2; i++) { - s_re[i] = malloc(frame_length_complex_samples*sizeof(double)); bzero(s_re[i],frame_length_complex_samples*sizeof(double)); s_im[i] = malloc(frame_length_complex_samples*sizeof(double)); bzero(s_im[i],frame_length_complex_samples*sizeof(double)); - r_re[i] = malloc(frame_length_complex_samples*sizeof(double)); bzero(r_re[i],frame_length_complex_samples*sizeof(double)); r_im[i] = malloc(frame_length_complex_samples*sizeof(double)); bzero(r_im[i],frame_length_complex_samples*sizeof(double)); - txdata[i] = malloc(frame_length_complex_samples*sizeof(int)); bzero(r_re[i],frame_length_complex_samples*sizeof(int)); - } if (pbch_file_fd!=NULL) { load_pbch_desc(pbch_file_fd); } -/* for (int k=0; k<2; k++) { - // Create transport channel structures for 2 transport blocks (MIMO) - for (i=0; i<2; i++) { - gNB->dlsch[k][i] = new_gNB_dlsch(Kmimo,8,Nsoft,0,frame_parms,gNB_config); + /* for (int k=0; k<2; k++) { + // Create transport channel structures for 2 transport blocks (MIMO) + for (i=0; i<2; i++) { + gNB->dlsch[k][i] = new_gNB_dlsch(Kmimo,8,Nsoft,0,frame_parms,gNB_config); - if (!gNB->dlsch[k][i]) { - printf("Can't get eNB dlsch structures\n"); - exit(-1); + if (!gNB->dlsch[k][i]) { + printf("Can't get eNB dlsch structures\n"); + exit(-1); + } + gNB->dlsch[k][i]->Nsoft = 10; + gNB->dlsch[k][i]->rnti = n_rnti+k; } -gNB->dlsch[k][i]->Nsoft = 10; - gNB->dlsch[k][i]->rnti = n_rnti+k; - } - }*/ - - + }*/ //configure UE UE = malloc(sizeof(PHY_VARS_NR_UE)); memcpy(&UE->frame_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS)); + //phy_init_nr_top(frame_parms); - if (init_nr_ue_signal(UE, 1, 0) != 0) - { + if (init_nr_ue_signal(UE, 1, 0) != 0) { printf("Error at UE NR initialisation\n"); exit(-1); } + //nr_init_frame_parms_ue(&UE->frame_parms); //init_nr_ue_transport(UE, 0); for (int sf = 0; sf < 2; sf++) { - for (i=0; i<2; i++) { - UE->dlsch[sf][0][i] = new_nr_ue_dlsch(Kmimo,8,Nsoft,5,N_RB_DL,0); + for (i=0; i<2; i++) { + UE->dlsch[sf][0][i] = new_nr_ue_dlsch(Kmimo,8,Nsoft,5,N_RB_DL,0); - if (!UE->dlsch[sf][0][i]) { - printf("Can't get ue dlsch structures\n"); - exit(-1); - } - - UE->dlsch[sf][0][i]->rnti = n_rnti; - } + if (!UE->dlsch[sf][0][i]) { + printf("Can't get ue dlsch structures\n"); + exit(-1); } - UE->dlsch_SI[0] = new_nr_ue_dlsch(1,1,Nsoft,5,N_RB_DL,0); - UE->dlsch_ra[0] = new_nr_ue_dlsch(1,1,Nsoft,5,N_RB_DL,0); + UE->dlsch[sf][0][i]->rnti = n_rnti; + } + } + UE->dlsch_SI[0] = new_nr_ue_dlsch(1,1,Nsoft,5,N_RB_DL,0); + UE->dlsch_ra[0] = new_nr_ue_dlsch(1,1,Nsoft,5,N_RB_DL,0); unsigned char harq_pid = 0; //dlsch->harq_ids[subframe]; NR_gNB_DLSCH_t *dlsch = gNB->dlsch[0][0]; - nfapi_nr_dl_config_dlsch_pdu_rel15_t rel15 = dlsch->harq_processes[harq_pid]->dlsch_pdu.dlsch_pdu_rel15; - // dlsch->harq_processes[0]->b = (unsigned char*)malloc16(800); - // dlsch->harq_processes[i]->pdu = (uint8_t*)malloc16(MAX_NR_DLSCH_PAYLOAD_BYTES/bw_scaling); + nfapi_nr_dl_config_dlsch_pdu_rel15_t *rel15 = &dlsch->harq_processes[harq_pid]->dlsch_pdu.dlsch_pdu_rel15; time_stats_t *rm_stats; time_stats_t *te_stats; time_stats_t *i_stats; uint8_t is_crnti; uint8_t llr8_flag; - unsigned int TBS = 8424; unsigned int available_bits; - uint16_t nb_symb_sch =8; uint8_t nb_re_dmrs = 6; uint16_t length_dmrs = 1; unsigned char mod_order; - uint16_t nb_rb = 50; - uint8_t Imcs=9; uint8_t Nl=1; uint8_t rvidx = 0; - dlsch->rnti =1; - - /*dlsch->harq_processes[0]->mcs = Imcs; dlsch->harq_processes[0]->rvidx = rvidx;*/ - //printf("dlschsim harqid %d nb_rb %d, mscs %d\n",dlsch->harq_ids[subframe], - // dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->mcs,dlsch->harq_processes[0]->Nl); - + // dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->mcs,dlsch->harq_processes[0]->Nl); mod_order = nr_get_Qm(Imcs,1); available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs,mod_order,1); TBS= nr_compute_tbs(Imcs,nb_rb,nb_symb_sch,nb_re_dmrs,length_dmrs,Nl); printf("available bits %d TBS %d mod_order %d\n",available_bits, TBS, mod_order); //dlsch->harq_ids[subframe]= 0; - rel15.n_prb = nb_rb; - rel15.nb_symbols = nb_symb_sch; - rel15.modulation_order = mod_order; - rel15.nb_layers = Nl; - rel15.nb_re_dmrs = nb_re_dmrs; - + rel15->n_prb = nb_rb; + rel15->nb_symbols = nb_symb_sch; + rel15->modulation_order = mod_order; + rel15->nb_layers = Nl; + rel15->nb_re_dmrs = nb_re_dmrs; + rel15->transport_block_size = TBS; double *modulated_input = malloc16(sizeof(double) * 16*68*384); short *channel_output_fixed = malloc16(sizeof( short) *16* 68*384); short *channel_output_uncoded = malloc16(sizeof(unsigned short) *16* 68*384); @@ -505,11 +487,9 @@ gNB->dlsch[k][i]->Nsoft = 10; unsigned char *estimated_output_bit; unsigned char *test_input_bit; unsigned int errors_bit =0; - - test_input_bit = (unsigned char*) malloc16(sizeof(unsigned char) * 16*68*384); - estimated_output = (unsigned char*) malloc16(sizeof(unsigned char) * 16*68*384); - estimated_output_bit = (unsigned char*) malloc16(sizeof(unsigned char) * 16*68*384); - + test_input_bit = (unsigned char *) malloc16(sizeof(unsigned char) * 16*68*384); + estimated_output = (unsigned char *) malloc16(sizeof(unsigned char) * 16*68*384); + estimated_output_bit = (unsigned char *) malloc16(sizeof(unsigned char) * 16*68*384); NR_UE_DLSCH_t *dlsch0_ue = UE->dlsch[UE->current_thread_id[subframe]][0][0]; NR_DL_UE_HARQ_t *harq_process = dlsch0_ue->harq_processes[harq_pid]; harq_process->mcs = Imcs; @@ -518,112 +498,117 @@ gNB->dlsch[k][i]->Nsoft = 10; harq_process->Qm = mod_order; harq_process->rvidx = rvidx; printf("harq process ue mcs = %d Qm = %d\n", harq_process->mcs, harq_process->Qm); - unsigned char *test_input; test_input=(unsigned char *)malloc16(sizeof(unsigned char) * TBS/8); - for (i=0; ib; /*for (int i=0; i0x%08x\n",crc24c(test_input, 32)); // generate signal if (input_fd==NULL) { nr_dlsch_encoding(test_input, - subframe, + subframe, dlsch, frame_parms); - - } - for (SNR=snr0;SNRharq_processes[0]->f[i]); - if (dlsch->harq_processes[0]->f[i]==0) - modulated_input[i]=1.0;///sqrt(2); //QPSK - else - modulated_input[i]=-1.0;///sqrt(2); +#endif - //if (i<16) printf("modulated_input[%d] = %d\n",i,modulated_input[i]); + //if (i<16) + // printf("encoder output f[%d] = %d\n",i,dlsch->harq_processes[0]->f[i]); + if (dlsch->harq_processes[0]->f[i]==0) + modulated_input[i]=1.0;///sqrt(2); //QPSK + else + modulated_input[i]=-1.0;///sqrt(2); - //SNR =10; - SNR_lin = pow(10,SNR/10.0); - sigma = 1.0/sqrt(2*SNR_lin); - channel_output_fixed[i] = (short)quantize(sigma/4.0/4.0,modulated_input[i] + sigma*gaussdouble(0.0,1.0),qbits); - //channel_output_fixed[i] = (char)quantize8bit(sigma/4.0,(2.0*modulated_input[i]) - 1.0 + sigma*gaussdouble(0.0,1.0)); - //printf("llr[%d]=%d\n",i,channel_output_fixed[i]); - //printf("channel_output_fixed[%d]: %d\n",i,channel_output_fixed[i]); + //if (i<16) printf("modulated_input[%d] = %d\n",i,modulated_input[i]); + //SNR =10; + SNR_lin = pow(10,SNR/10.0); + sigma = 1.0/sqrt(2*SNR_lin); + channel_output_fixed[i] = (short)quantize(sigma/4.0/4.0,modulated_input[i] + sigma*gaussdouble(0.0,1.0),qbits); + //channel_output_fixed[i] = (char)quantize8bit(sigma/4.0,(2.0*modulated_input[i]) - 1.0 + sigma*gaussdouble(0.0,1.0)); + //printf("llr[%d]=%d\n",i,channel_output_fixed[i]); + //printf("channel_output_fixed[%d]: %d\n",i,channel_output_fixed[i]); + //channel_output_fixed[i] = (char)quantize(1,channel_output_fixed[i],qbits); - //channel_output_fixed[i] = (char)quantize(1,channel_output_fixed[i],qbits); + //if (i<16) printf("channel_output_fixed[%d] = %d\n",i,channel_output_fixed[i]); - //if (i<16) printf("channel_output_fixed[%d] = %d\n",i,channel_output_fixed[i]); + //Uncoded BER + if (channel_output_fixed[i]<0) + channel_output_uncoded[i]=1; //QPSK demod + else + channel_output_uncoded[i]=0; - //Uncoded BER - if (channel_output_fixed[i]<0) - channel_output_uncoded[i]=1; //QPSK demod - else - channel_output_uncoded[i]=0; + if (channel_output_uncoded[i] != dlsch->harq_processes[harq_pid]->f[i]) + errors_bit_uncoded = errors_bit_uncoded + 1; + } - if (channel_output_uncoded[i] != dlsch->harq_processes[harq_pid]->f[i]) - errors_bit_uncoded = errors_bit_uncoded + 1; + //if (errors_bit_uncoded>10) + printf("errors bits uncoded %f\n", errors_bit_uncoded); +#ifdef DEBUG_CODER + printf("\n"); + exit(-1); +#endif + ret = nr_dlsch_decoding(UE, + channel_output_fixed, + &UE->frame_parms, + dlsch0_ue, + dlsch0_ue->harq_processes[0], + frame, + nb_symb_sch, + subframe, + harq_pid, + is_crnti, + llr8_flag); - } + if (ret>dlsch0_ue->max_ldpc_iterations) + n_errors++; - //if (errors_bit_uncoded>10) - printf("errors bits uncoded %f\n", errors_bit_uncoded); + //count errors + errors_bit = 0; + for (i=0; i>(i&7); + test_input_bit[i] = (test_input[i/8]&(1<<(i&7)))>>(i&7); // Further correct for multiple segments - #ifdef DEBUG_CODER - printf("\n"); - exit(-1); - #endif + if (estimated_output_bit[i] != test_input_bit[i]) { + errors_bit++; + //printf("estimated bits error occurs @%d ",i); + } + } - nr_dlsch_decoding(UE, - channel_output_fixed, - &UE->frame_parms, - dlsch0_ue, - dlsch0_ue->harq_processes[0], - frame, - nb_symb_sch, - subframe, - harq_pid, - is_crnti, - llr8_flag); - - - //count errors - for (i=0; i>(i&7); - test_input_bit[i] = (test_input[i/8]&(1<<(i&7)))>>(i&7); // Further correct for multiple segments - if (estimated_output_bit[i] != test_input_bit[i]) - { - errors_bit = (errors_bit) + 1; - //printf("estimated bits error occurs @%d ",i); - } - } -//if (errors_bit>10) - printf("\n errors_bit %d (trial %d)\n", errors_bit,trial); - } - - printf("SNR %f, BER %f \n",SNR,(float)errors_bit/(float)n_trials/(float)TBS); + if (errors_bit>0) { + n_false_positive++; + if (n_trials == 1) + printf("\n errors_bit %d (trial %d)\n", errors_bit,trial); + } } + + printf("SNR %f, BLER %f (false positive %f)\n",SNR,(float)n_errors/(float)n_trials,(float)n_false_positive/(float)n_trials); + + if ((float)n_errors/(float)n_trials < target_error_rate) + break; + } + /*LOG_M("txsigF0.m","txsF0", gNB->common_vars.txdataF[0],frame_length_complex_samples_no_prefix,1,1); if (gNB->frame_parms.nb_antennas_tx>1) LOG_M("txsigF1.m","txsF1", gNB->common_vars.txdataF[1],frame_length_complex_samples_no_prefix,1,1);*/ @@ -632,16 +617,16 @@ gNB->dlsch[k][i]->Nsoft = 10; /*for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { if (gNB_config->subframe_config.dl_cyclic_prefix_type.value == 1) { PHY_ofdm_mod(gNB->common_vars.txdataF[aa], - txdata[aa], - frame_parms->ofdm_symbol_size, - 12, - frame_parms->nb_prefix_samples, - CYCLIC_PREFIX); + txdata[aa], + frame_parms->ofdm_symbol_size, + 12, + frame_parms->nb_prefix_samples, + CYCLIC_PREFIX); } else { nr_normal_prefix_mod(gNB->common_vars.txdataF[aa], - txdata[aa], - 14, - frame_parms); + txdata[aa], + 14, + frame_parms); } } @@ -656,14 +641,13 @@ gNB->dlsch[k][i]->Nsoft = 10; r_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]); } }*/ - for (i=0; i<2; i++) { - printf("gNB %d\n",i); - free_gNB_dlsch(gNB->dlsch[0][i]); - printf("UE %d\n",i); - free_nr_ue_dlsch(UE->dlsch[UE->current_thread_id[subframe]][0][i]); - } + printf("gNB %d\n",i); + free_gNB_dlsch(gNB->dlsch[0][i]); + printf("UE %d\n",i); + free_nr_ue_dlsch(UE->dlsch[UE->current_thread_id[subframe]][0][i]); + } for (i=0; i<2; i++) { free(s_re[i]); @@ -686,7 +670,6 @@ gNB->dlsch[k][i]->Nsoft = 10; fclose(input_fd); return(n_errors); - } From fbf0a42c9f4c5c59a127ef85b25bb6498c00bc38 Mon Sep 17 00:00:00 2001 From: Hongzhi Date: Fri, 23 Nov 2018 10:04:32 +0100 Subject: [PATCH 092/117] ue fix thread id --- openair1/PHY/MODULATION/slot_fep_nr.c | 18 +++++++-------- .../PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c | 2 +- .../nr_dl_channel_estimation.c | 22 +++++++++---------- .../PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 2 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 19 +++++++++------- .../LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c | 2 +- .../CONF/gnb.band78.tm1.106PRB.usrpx300.conf | 2 +- 7 files changed, 35 insertions(+), 32 deletions(-) diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c index 609e217471..fdbca69fd0 100644 --- a/openair1/PHY/MODULATION/slot_fep_nr.c +++ b/openair1/PHY/MODULATION/slot_fep_nr.c @@ -99,9 +99,9 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, } if (no_prefix) { - slot_offset = frame_parms->ofdm_symbol_size * (frame_parms->symbols_per_slot) * (Ns); + slot_offset = frame_parms->ofdm_symbol_size * (frame_parms->symbols_per_slot*frame_parms->slots_per_subframe) * (Ns>>1); } else { - slot_offset = (frame_parms->samples_per_subframe/frame_parms->slots_per_subframe) * (Ns); + slot_offset = (frame_parms->samples_per_subframe) * (Ns>>1); } /*if (l<0 || l>=7-frame_parms->Ncp) { @@ -117,7 +117,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, for (aa=0; aanb_antennas_rx; aa++) { - memset(&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int)); + memset(&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int)); rx_offset = sample_offset + slot_offset + nb_prefix_samples0 - SOFFSET; // Align with 256 bit @@ -135,14 +135,14 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, (void *)&common_vars->rxdata[aa][rx_offset % frame_length_samples], frame_parms->ofdm_symbol_size*sizeof(int)); dft((int16_t *)tmp_dft_in, - (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); + (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); } else { // use dft input from RX buffer directly #if UE_TIMING_TRACE start_meas(&ue->rx_dft_stats); #endif dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples], - (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); + (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); #if UE_TIMING_TRACE stop_meas(&ue->rx_dft_stats); #endif @@ -151,11 +151,11 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, rx_offset += (frame_parms->ofdm_symbol_size+nb_prefix_samples)*l;// + // (frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1); -#ifdef DEBUG_FEP +//#ifdef DEBUG_FEP // if (ue->frame <100) LOG_I(PHY,"slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, sample_offset %d,rx_offset %d, frame_length_samples %d\n", ue->proc.proc_rxtx[(Ns>>1)&1].frame_rx,Ns, symbol, nb_prefix_samples,nb_prefix_samples0,slot_offset,sample_offset,rx_offset,frame_length_samples); -#endif +//#endif if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size)) memcpy((void *)&common_vars->rxdata[aa][frame_length_samples], @@ -170,11 +170,11 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, (void *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples], frame_parms->ofdm_symbol_size*sizeof(int)); dft((int16_t *)tmp_dft_in, - (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); + (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); } else { // use dft input from RX buffer directly dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples], - (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); + (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); } #if UE_TIMING_TRACE stop_meas(&ue->rx_dft_stats); diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c index c74a794735..ecdfa9cdcf 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c @@ -96,7 +96,7 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms, else count_max_pos_ok = 0; - printf("adjust sync count_max_pos_ok = %d\n",count_max_pos_ok); + printf("adjust sync count_max_pos_ok = %d\n",count_max_pos_ok); if(count_max_pos_ok > 10 && first_time == 1) { diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index 7629f0e4f6..847eff1b3f 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -49,8 +49,8 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, //uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1]; uint8_t nushift, ssb_index=0, n_hf=0; - int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].dl_ch_estimates[eNB_offset]; - int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF; + int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[eNB_offset]; + int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF; nushift = ue->frame_parms.Nid_cell%4; ue->frame_parms.nushift = nushift; @@ -271,8 +271,8 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, //uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1]; uint8_t nushift; - int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].dl_ch_estimates[eNB_offset]; - int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF; + int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[eNB_offset]; + int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF; nushift = 1; ue->frame_parms.nushift = nushift; @@ -296,7 +296,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, fr = filt16a_r1; // generate pilot - nr_pdcch_dmrs_rx(ue,eNB_offset,Ns,ue->nr_gold_pdcch[eNB_offset][Ns][symbol], &pilot[0],2000,nb_rb_coreset); + nr_pdcch_dmrs_rx(ue,eNB_offset,Ns,ue->nr_gold_pdcch[eNB_offset][Ns>>1][symbol], &pilot[0],2000,nb_rb_coreset); for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { @@ -462,11 +462,11 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, // do ifft of channel estimate for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) for (p=0; pframe_parms.nb_antenna_ports_eNB; p++) { - if (ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].dl_ch_estimates[eNB_offset][(p<<1)+aarx]) + if (ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[eNB_offset][(p<<1)+aarx]) { - //LOG_I(PHY,"Channel Impulse Computation Slot %d ThreadId %d Symbol %d \n", Ns, ue->current_thread_id[Ns>>1], l); - idft((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].dl_ch_estimates[eNB_offset][(p<<1)+aarx][0], - (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].dl_ch_estimates_time[eNB_offset][(p<<1)+aarx],1); + LOG_I(PHY,"Channel Impulse Computation Slot %d ThreadId %d Symbol %d \n", Ns, ue->current_thread_id[Ns>>1], l); + idft((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[eNB_offset][(p<<1)+aarx][0], + (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates_time[eNB_offset][(p<<1)+aarx],1); } } } @@ -494,8 +494,8 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, //uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1]; uint8_t nushift; - int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].dl_ch_estimates[eNB_offset]; - int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF; + int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[eNB_offset]; + int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF; nushift = (p>>1)&1; ue->frame_parms.nushift = nushift; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index d6adafc54b..6d086e9a2f 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -292,7 +292,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, harq_process->Qm,harq_process->Nl); G = harq_process->G; - //printf("DLSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_symb_sch %d \n",harq_pid,A,G, harq_process->mcs, harq_process->Nl, nb_symb_sch); + printf("DLSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",harq_pid,A,G, harq_process->mcs, harq_process->Nl, nb_symb_sch,nb_rb); if (harq_process->round == 0) { // This is a new packet, so compute quantities regarding segmentation diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 75eff8b907..317f158cb0 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -2714,7 +2714,7 @@ void nr_ue_measurement_procedures( } #endif // accumulate and filter timing offset estimation every nr_tti_rx (instead of every frame) - if (( (slot%2) == 0) && (l==(4-frame_parms->Ncp))) { + if (( (slot%2) == 0) && (l==(1-frame_parms->Ncp))) { // AGC /* @@ -4261,9 +4261,10 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, NR_UE_PDSCH *pdsch_vars; uint8_t is_cw0_active = 0; uint8_t is_cw1_active = 0; + // to be updated by higher layer uint8_t nb_re_dmrs = 6; uint16_t length_dmrs = 1; - uint16_t nb_symb_sch = 4; + uint16_t nb_symb_sch = 8; if (dlsch0==NULL) AssertFatal(0,"dlsch0 should be defined at this level \n"); @@ -5483,7 +5484,9 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN int pmch_flag=0; int frame_rx = proc->frame_rx; int nr_tti_rx = proc->nr_tti_rx; - proc->decoder_switch = 0; + uint16_t nb_symb_sch = 8; // to be updated by higher layer + uint8_t nb_symb_pdcch =2; + //proc->decoder_switch = 0; //int counter_decoder = 0; LOG_I(PHY," ****** start RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, nr_tti_rx); @@ -5570,7 +5573,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN //nr_gold_pdcch(ue,0, 2); if (nr_tti_rx==1){ - for (uint16_t l=0; l<2; l++) { + for (uint16_t l=0; lofdm_demod_stats); @@ -5672,9 +5675,9 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN if (nr_tti_rx==1){ //to update from pdsch config - nr_gold_pdsch(ue,2,0, 1); + nr_gold_pdsch(ue,nb_symb_pdcch,0, 1); - for (uint16_t m=2;m<6 ; m++){ + for (uint16_t m=nb_symb_pdcch;m<=(nb_symb_sch+nb_symb_pdcch-1) ; m++){ nr_slot_fep(ue, m, //to be updated from higher layer nr_tti_rx<<1, @@ -5703,8 +5706,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN PDSCH, ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0], NULL, - 2, //ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->num_pdcch_symbols, - 5, //ue->frame_parms.symbols_per_tti>>1, + nb_symb_pdcch, //ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->num_pdcch_symbols, + (nb_symb_sch+nb_symb_pdcch-1), //ue->frame_parms.symbols_per_tti>>1, abstraction_flag); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_OUT); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c index 8a00b2434c..822dbb92f5 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c @@ -77,7 +77,7 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, dlsch_pdu_rel15->start_prb = 0; dlsch_pdu_rel15->n_prb = 50; dlsch_pdu_rel15->start_symbol = 2; - dlsch_pdu_rel15->nb_symbols = 4; + dlsch_pdu_rel15->nb_symbols = 8; dlsch_pdu_rel15->rnti = rnti; dlsch_pdu_rel15->nb_layers =1; dlsch_pdu_rel15->nb_codewords = 1; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf index 721c307f71..d62b06aaa5 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf @@ -262,7 +262,7 @@ RUs = ( THREAD_STRUCT = ( { #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" - parallel_config = "PARALLEL_RU_L1_TRX_SPLIT"; + parallel_config = "PARALLEL_SINGLE_THREAD"; #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" worker_config = "WORKER_DISABLE"; } From 5144d1f50b16cecb19c5a8975dd2da859ac17995 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Fri, 23 Nov 2018 16:44:55 +0100 Subject: [PATCH 093/117] disabling profiling for LDPC decoder as this seems to cause a segfault in ldpctest (although I am pretty sure this fixes just the symptoms and not the real cause) --- openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c index 2758ae35c0..fbdb9a3fa4 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c @@ -39,7 +39,7 @@ #include "nrLDPC_bnProc.h" #define NR_LDPC_ENABLE_PARITY_CHECK -#define NR_LDPC_PROFILER_DETAIL +//#define NR_LDPC_PROFILER_DETAIL #ifdef NR_LDPC_DEBUG_MODE #include "nrLDPC_tools/nrLDPC_debug.h" From f0c413e6aeeac841a72e94bf4eac7288d158d84a Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Mon, 26 Nov 2018 20:56:47 +0100 Subject: [PATCH 094/117] fixed some warnings + minor changes to logs --- openair1/PHY/CODING/TESTBENCH/ldpctest.c | 2 +- openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 7 ++++--- openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c | 2 +- openair1/PHY/NR_TRANSPORT/nr_transport.h | 7 +++++++ openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 9 ++++----- openair1/SIMULATION/NR_PHY/dlschsim.c | 5 +++-- 6 files changed, 20 insertions(+), 12 deletions(-) diff --git a/openair1/PHY/CODING/TESTBENCH/ldpctest.c b/openair1/PHY/CODING/TESTBENCH/ldpctest.c index 1c9269629c..14652e339c 100644 --- a/openair1/PHY/CODING/TESTBENCH/ldpctest.c +++ b/openair1/PHY/CODING/TESTBENCH/ldpctest.c @@ -161,7 +161,7 @@ int test_ldpc(short No_iteration, t_nrLDPC_time_stats decoder_profiler; t_nrLDPC_time_stats* p_decoder_profiler =&decoder_profiler ; - int32_t n_iter = 0;; + int32_t n_iter = 0; *errors=0; *errors_bit=0; diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index d45f248023..aa8b22fd6d 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -35,6 +35,7 @@ #include "PHY/CODING/coding_extern.h" #include "PHY/CODING/coding_defs.h" #include "PHY/CODING/lte_interleaver_inline.h" +#include "PHY/CODING/nrLDPC_encoder/defs.h" #include "PHY/NR_TRANSPORT/nr_transport.h" #include "PHY/NR_TRANSPORT/nr_transport_common_proto.h" #include "PHY/NR_TRANSPORT/nr_dlsch.h" @@ -225,10 +226,10 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(unsigned char Kmimo, } } - /* LOG_D(PHY,"new_gNB_dlsch exit flag %d, size of %ld\n", + LOG_D(PHY,"new_gNB_dlsch exit flag %d, size of %ld\n", exit_flag, sizeof(NR_gNB_DLSCH_t)); free_gNB_dlsch(dlsch); - return(NULL);*/ + return(NULL); } @@ -294,7 +295,7 @@ int nr_dlsch_encoding(unsigned char *a, A = rel15.transport_block_size; G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs,mod_order,rel15.nb_layers); - printf("dlsch coding A %d G %d mod_order %d\n", A,G, mod_order); + LOG_D(PHY,"dlsch coding A %d G %d mod_order %d\n", A,G, mod_order); Tbslbrm = nr_compute_tbs(28,nb_rb,frame_parms->symbols_per_slot,0,0, rel15.nb_layers); diff --git a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c index 76944c53ad..6467149dda 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c @@ -123,7 +123,7 @@ void nr_get_tbs(nfapi_nr_dl_config_dlsch_pdu *dlsch_pdu, uint16_t N_RE_prime = NR_NB_SC_PER_RB*N_sh_symb - N_PRB_DMRS - N_PRB_oh; LOG_I(MAC, "N_RE_prime %d for %d symbols %d DMRS per PRB and %d overhead\n", N_RE_prime, N_sh_symb, N_PRB_DMRS, N_PRB_oh); - uint16_t N_RE, Ninfo, Ninfo_prime, C, TBS, R; + uint16_t N_RE, Ninfo, Ninfo_prime, C, TBS=0, R; uint8_t table_idx, Qm, n, scale; table_idx = get_table_idx(mcs_table, dci_format, rnti_type, ss_type); diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport.h b/openair1/PHY/NR_TRANSPORT/nr_transport.h index a051d776bd..65d2f7a546 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_transport.h +++ b/openair1/PHY/NR_TRANSPORT/nr_transport.h @@ -104,4 +104,11 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch, */ uint8_t nr_pbch_payload_interleaver(uint8_t i); +NR_gNB_DLSCH_t *new_gNB_dlsch(unsigned char Kmimo, + unsigned char Mdlharq, + uint32_t Nsoft, + uint8_t abstraction_flag, + NR_DL_FRAME_PARMS *frame_parms, + nfapi_nr_config_request_t *config); + #endif /*__NR_TRANSPORT__H__*/ diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index 6d086e9a2f..dfee3d34d3 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -292,7 +292,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, harq_process->Qm,harq_process->Nl); G = harq_process->G; - printf("DLSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",harq_pid,A,G, harq_process->mcs, harq_process->Nl, nb_symb_sch,nb_rb); + LOG_D(PHY,"DLSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",harq_pid,A,G, harq_process->mcs, harq_process->Nl, nb_symb_sch,nb_rb); if (harq_process->round == 0) { // This is a new packet, so compute quantities regarding segmentation @@ -526,11 +526,10 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, ret=no_iteration_ldpc; //if (!nb_total_decod%10000){ - printf("Error number of iteration LPDC %d %ld/%ld \n", no_iteration_ldpc, nb_error_decod,nb_total_decod);fflush(stdout); + //printf("Error number of iteration LPDC %d %ld/%ld \n", no_iteration_ldpc, nb_error_decod,nb_total_decod);fflush(stdout); //} - //else - //printf("OK number of iteration LPDC %d\n", no_iteration_ldpc); + //printf("OK number of iteration LPDC %d\n", no_iteration_ldpc); for (int m=0; m < Kr>>3; m ++) { @@ -560,7 +559,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break; - LOG_W(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_tti_rx,r,harq_process->C-1); + LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_tti_rx,r,harq_process->C-1); err_flag = 1; } } diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c index 8acbf5dc36..565776d584 100644 --- a/openair1/SIMULATION/NR_PHY/dlschsim.c +++ b/openair1/SIMULATION/NR_PHY/dlschsim.c @@ -497,7 +497,7 @@ int main(int argc, char **argv) { harq_process->nb_rb = nb_rb; harq_process->Qm = mod_order; harq_process->rvidx = rvidx; - printf("harq process ue mcs = %d Qm = %d\n", harq_process->mcs, harq_process->Qm); + printf("harq process ue mcs = %d Qm = %d, symb %d\n", harq_process->mcs, harq_process->Qm,nb_symb_sch); unsigned char *test_input; test_input=(unsigned char *)malloc16(sizeof(unsigned char) * TBS/8); @@ -524,6 +524,7 @@ int main(int argc, char **argv) { n_false_positive = 0; for (trial=0; trial < n_trials; trial++) { + errors_bit_uncoded = 0; for (i = 0; i < available_bits; i++) { #ifdef DEBUG_CODER @@ -563,7 +564,7 @@ int main(int argc, char **argv) { } //if (errors_bit_uncoded>10) - printf("errors bits uncoded %f\n", errors_bit_uncoded); + //printf("errors bits uncoded %f\n", errors_bit_uncoded); #ifdef DEBUG_CODER printf("\n"); exit(-1); From 1fc33b3bbbc8348808fc16db8e0e1e17a3d4a6fe Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Tue, 27 Nov 2018 11:55:11 +0100 Subject: [PATCH 095/117] TBS calculation fixes --- openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c index 6467149dda..0b8ab56329 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c @@ -144,20 +144,20 @@ void nr_get_tbs(nfapi_nr_dl_config_dlsch_pdu *dlsch_pdu, } } else { - n = log2(Ninfo)-29; + n = log2(Ninfo-24)-5; Ninfo_prime = max(3840, (ROUNDIDIV((Ninfo-24),(1<8424) { C = CEILIDIV((Ninfo_prime+24),8424); - TBS = (C*CEILIDIV((Ninfo_prime+24),(C<<3)))<<3; + TBS = (C<<3)*CEILIDIV((Ninfo_prime+24),(C<<3)) - 24; } else - TBS = (CEILIDIV((Ninfo_prime+24),8) - 24)<<3; + TBS = ((CEILIDIV((Ninfo_prime+24),8))<<3) - 24; } } From 37a354a1050ccc1038b29251c4cce551cbd25575 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Tue, 27 Nov 2018 15:47:38 +0100 Subject: [PATCH 096/117] revert previous commit for ADRV9371 driver --- oaienv | 4 ++-- targets/ARCH/COMMON/common_lib.h | 2 -- targets/RT/USER/nr-ru.c | 2 -- targets/RT/USER/nr-ue.c | 10 ++-------- targets/RT/USER/nr-uesoftmodem.c | 2 -- 5 files changed, 4 insertions(+), 16 deletions(-) diff --git a/oaienv b/oaienv index 4cee684b3d..61b607c605 100644 --- a/oaienv +++ b/oaienv @@ -18,6 +18,6 @@ alias oailte='cd $OPENAIR_TARGETS/RT/USER' alias oais='cd $OPENAIR_TARGETS/SIMU/USER' alias oaiex='cd $OPENAIR_TARGETS/SIMU/EXAMPLES' -#export IIOD_REMOTE=192.168.121.32 -export IIOD_REMOTE=192.168.1.11 +export IIOD_REMOTE=192.168.121.32 +#export IIOD_REMOTE=192.168.1.11 diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index aa2bc01a72..685a628b26 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -205,9 +205,7 @@ typedef struct { clock_source_t clock_source; //! Manual SDR IP address //#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) -#ifndef OAI_ADRV9371_ZC706 char *sdr_addrs; -#endif //! Auto calibration flag int autocal[4]; //! rf devices work with x bits iqs when oai have its own iq format diff --git a/targets/RT/USER/nr-ru.c b/targets/RT/USER/nr-ru.c index 1147420988..31698232b4 100644 --- a/targets/RT/USER/nr-ru.c +++ b/targets/RT/USER/nr-ru.c @@ -2443,11 +2443,9 @@ void RCconfig_RU(void) { RC.ru[j]->num_gNB = 0; for (i=0;inum_gNB;i++) RC.ru[j]->gNB_list[i] = RC.gNB[RUParamList.paramarray[j][RU_ENB_LIST_IDX].iptr[i]][0]; -#ifndef OAI_ADRV9371_ZC706 if (config_isparamset(RUParamList.paramarray[j], RU_SDR_ADDRS)) { RC.ru[j]->openair0_cfg.sdr_addrs = strdup(*(RUParamList.paramarray[j][RU_SDR_ADDRS].strptr)); } -#endif if (config_isparamset(RUParamList.paramarray[j], RU_SDR_CLK_SRC)) { if (strcmp(*(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr), "internal") == 0) { diff --git a/targets/RT/USER/nr-ue.c b/targets/RT/USER/nr-ue.c index 559b64f452..a8d0005192 100644 --- a/targets/RT/USER/nr-ue.c +++ b/targets/RT/USER/nr-ue.c @@ -824,7 +824,6 @@ void *UE_thread(void *arg) { int i; char threadname[128]; int th_id; - unsigned char nb_sf_init=10; UE->proc.proc_rxtx[0].counter_decoder = 0; UE->proc.proc_rxtx[1].counter_decoder = 0; UE->proc.proc_rxtx[2].counter_decoder = 0; @@ -868,22 +867,17 @@ void *UE_thread(void *arg) { } #endif -#ifndef OAI_ADRV9371_ZC706 -nb_sf_init = 10; -#else -nb_sf_init=5; -#endif if (instance_cnt_synch < 0) { // we can invoke the synch // grab 10 ms of signal and wakeup synch thread for (int i=0; iframe_parms.nb_antennas_rx; i++) rxp[i] = (void*)&UE->common_vars.rxdata[i][0]; if (UE->mode != loop_through_memory) - AssertFatal( UE->frame_parms.samples_per_subframe*nb_sf_init == + AssertFatal( UE->frame_parms.samples_per_subframe*10== UE->rfdevice.trx_read_func(&UE->rfdevice, ×tamp, rxp, - UE->frame_parms.samples_per_subframe*nb_sf_init, + UE->frame_parms.samples_per_subframe*10, UE->frame_parms.nb_antennas_rx), "error reading samples"); AssertFatal ( 0== pthread_mutex_lock(&UE->proc.mutex_synch), ""); diff --git a/targets/RT/USER/nr-uesoftmodem.c b/targets/RT/USER/nr-uesoftmodem.c index 7b25a2aea2..1515e141e2 100644 --- a/targets/RT/USER/nr-uesoftmodem.c +++ b/targets/RT/USER/nr-uesoftmodem.c @@ -804,9 +804,7 @@ void init_openair0() { openair0_cfg[card].rx_freq[i]); } -#ifndef OAI_ADRV9371_ZC706 if (usrp_args) openair0_cfg[card].sdr_addrs = usrp_args; -#endif if (usrp_clksrc) { if (strcmp(usrp_clksrc, "internal") == 0) { openair0_cfg[card].clock_source = internal; From 2bfbad9275f3ca39f6470a3f78f646ba528e79e6 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Wed, 28 Nov 2018 09:36:07 +0100 Subject: [PATCH 097/117] removed some debug messages. re-activated PDCCH decoding. fixed some warinings. --- openair1/PHY/MODULATION/slot_fep_nr.c | 2 +- .../nr_dl_channel_estimation.c | 6 +- .../PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 2 +- .../NR_UE_TRANSPORT/nr_dlsch_demodulation.c | 2 +- .../NR_UE_TRANSPORT/nr_transport_proto_ue.h | 70 ++- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 1 + openair1/SCHED_NR_UE/defs.h | 5 + openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 588 +++--------------- targets/RT/USER/nr-ue.c | 34 +- targets/RT/USER/nr-uesoftmodem.c | 23 +- 10 files changed, 188 insertions(+), 545 deletions(-) diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c index fdbca69fd0..b2ecb6917e 100644 --- a/openair1/PHY/MODULATION/slot_fep_nr.c +++ b/openair1/PHY/MODULATION/slot_fep_nr.c @@ -153,7 +153,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, //#ifdef DEBUG_FEP // if (ue->frame <100) - LOG_I(PHY,"slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, sample_offset %d,rx_offset %d, frame_length_samples %d\n", ue->proc.proc_rxtx[(Ns>>1)&1].frame_rx,Ns, symbol, + LOG_D(PHY,"slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, sample_offset %d,rx_offset %d, frame_length_samples %d\n", ue->proc.proc_rxtx[(Ns>>1)&1].frame_rx,Ns, symbol, nb_prefix_samples,nb_prefix_samples0,slot_offset,sample_offset,rx_offset,frame_length_samples); //#endif diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index 847eff1b3f..da3815df14 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -510,10 +510,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, k = bwp_start_subcarrier; int re_offset = k; -//#ifdef DEBUG_CH +#ifdef DEBUG_CH printf("PDSCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, symbol_offset %d OFDM size %d, Ncp=%d, l=%d, Ns=%d, k=%d symbol %d\n",ue->current_thread_id[Ns], eNB_offset,ch_offset,symbol_offset,ue->frame_parms.ofdm_symbol_size, ue->frame_parms.Ncp,l,Ns,k, symbol); -//#endif +#endif switch (nushift) { case 0: @@ -593,7 +593,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, pil+=2; re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1); rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - printf("dl_ch addr %p\n",dl_ch); + //printf("dl_ch addr %p\n",dl_ch); ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index dfee3d34d3..bafe571d03 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -292,7 +292,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, harq_process->Qm,harq_process->Nl); G = harq_process->G; - LOG_D(PHY,"DLSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",harq_pid,A,G, harq_process->mcs, harq_process->Nl, nb_symb_sch,nb_rb); + LOG_I(PHY,"DLSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",harq_pid,A,G, harq_process->mcs, harq_process->Nl, nb_symb_sch,nb_rb); if (harq_process->round == 0) { // This is a new packet, so compute quantities regarding segmentation diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c index 3b8be9a38e..8fbdd30972 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c @@ -165,7 +165,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, dlsch[0]->harq_processes[harq_pid]->nb_rb = nb_rb_pdsch; frame_parms->nushift = 0; - printf("status TB0 = %d, status TB1 = %d \n", dlsch[0]->harq_processes[harq_pid]->status, dlsch[1]->harq_processes[harq_pid]->status); + //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,nr_tti_rx,symbol,harq_pid, dlsch[0]->harq_processes[harq_pid]->status, diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h index 279f9fb17a..591dc802bb 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h @@ -1006,11 +1006,10 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, uint8_t llr8_flag); void nr_dlsch_unscrambling(int16_t* llr, - uint8_t size, - uint8_t q, - uint32_t Nid, - uint32_t n_RNTI); - + uint32_t size, + uint8_t q, + uint32_t Nid, + uint32_t n_RNTI); uint32_t dlsch_decoding_emul(PHY_VARS_NR_UE *phy_vars_ue, uint8_t subframe, @@ -1639,5 +1638,66 @@ void nr_pdcch_unscrambling(uint16_t crnti, NR_DL_FRAME_PARMS *frame_parms, uint8 uint32_t lte_gold_generic(uint32_t *x1, uint32_t *x2, uint8_t reset); +uint8_t nr_dci_decoding_procedure(int s, + int p, + PHY_VARS_NR_UE *ue, + NR_DCI_ALLOC_t *dci_alloc, + NR_SEARCHSPACE_TYPE_t searchSpacetype, + int16_t eNB_id, + uint8_t nr_tti_rx, + uint8_t dci_fields_sizes_cnt[MAX_NR_DCI_DECODED_SLOT][NBR_NR_DCI_FIELDS][NBR_NR_FORMATS], + uint16_t n_RB_ULBWP, + uint16_t n_RB_DLBWP, + crc_scrambled_t *crc_scrambled, + format_found_t *format_found, + uint16_t crc_scrambled_values[TOTAL_NBR_SCRAMBLED_VALUES]); + +int nr_generate_ue_ul_dlsch_params_from_dci(PHY_VARS_NR_UE *ue, + uint8_t eNB_id, + int frame, + uint8_t nr_tti_rx, + uint32_t dci_pdu[4], + uint16_t rnti, + uint8_t dci_length, + NR_DCI_format_t dci_format, + NR_UE_PDCCH *pdcch_vars, + NR_UE_PDSCH *pdsch_vars, + NR_UE_DLSCH_t **dlsch, + NR_UE_ULSCH_t *ulsch, + NR_DL_FRAME_PARMS *frame_parms, + PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, + uint8_t beamforming_mode, + uint8_t dci_fields_sizes[NBR_NR_DCI_FIELDS][NBR_NR_FORMATS], + uint16_t n_RB_ULBWP, + uint16_t n_RB_DLBWP, + uint16_t crc_scrambled_values[TOTAL_NBR_SCRAMBLED_VALUES], + NR_DCI_INFO_EXTRACTED_t *nr_dci_info_extracted); + +int nr_rx_pdsch(PHY_VARS_NR_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 nr_tti_rx, + unsigned char symbol, + unsigned char first_symbol_flag, + RX_type_t rx_type, + unsigned char i_mod, + unsigned char harq_pid); + +uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs, uint8_t Qm, uint8_t Nl) ; + +uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, + short *dlsch_llr, + NR_DL_FRAME_PARMS *frame_parms, + NR_UE_DLSCH_t *dlsch, + NR_DL_UE_HARQ_t *harq_process, + uint32_t frame, + uint16_t nb_symb_sch, + uint8_t nr_tti_rx, + uint8_t harq_pid, + uint8_t is_crnti, + uint8_t llr8_flag); + /**@}*/ #endif diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 7205bf83d4..b1a41a83e3 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -206,5 +206,6 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, } } } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+offset,0); } diff --git a/openair1/SCHED_NR_UE/defs.h b/openair1/SCHED_NR_UE/defs.h index 126fccb1b2..b43753453e 100644 --- a/openair1/SCHED_NR_UE/defs.h +++ b/openair1/SCHED_NR_UE/defs.h @@ -368,6 +368,11 @@ int nr_is_srs_occasion_common(NR_DL_FRAME_PARMS *frame_parms,int frame_tx,int su void nr_compute_srs_pos(lte_frame_type_t frameType,uint16_t isrs,uint16_t *psrsPeriodicity,uint16_t *psrsOffset); +void set_tx_harq_id(NR_UE_ULSCH_t *ulsch, int harq_pid, int slot_tx); +int get_tx_harq_id(NR_UE_ULSCH_t *ulsch, int slot_tx); + + + /*@}*/ diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index c3883a99a2..21e3e94a21 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -40,7 +40,8 @@ #include "PHY/phy_extern_nr_ue.h" #include "PHY/NR_REFSIG/refsig_defs_ue.h" #include "PHY/MODULATION/modulation_UE.h" -//#include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h" +#include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h" +#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h" //#include "PHY/extern.h" #include "SCHED_NR_UE/defs.h" #include "SCHED_NR/extern.h" @@ -52,10 +53,10 @@ #include "SCHED/phy_procedures_emos.h" #endif -#define DEBUG_PHY_PROC +//#define DEBUG_PHY_PROC #define NR_PDCCH_SCHED -#define NR_PDCCH_SCHED_DEBUG +//#define NR_PDCCH_SCHED_DEBUG //#define NR_PUCCH_SCHED //#define NR_PUCCH_SCHED_DEBUG @@ -2658,7 +2659,7 @@ void nr_ue_measurement_procedures( runmode_t mode) { - LOG_I(PHY,"ue_measurement_procedures l %u Ncp %d\n",l,ue->frame_parms.Ncp); + LOG_D(PHY,"ue_measurement_procedures l %u Ncp %d\n",l,ue->frame_parms.Ncp); NR_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; @@ -2738,16 +2739,16 @@ void nr_ue_measurement_procedures( if (abstraction_flag == 0) { - printf("start adjust sync l = %d slot = %d no timing %d\n",l, slot, ue->no_timing_correction); + LOG_D(PHY,"start adjust sync l = %d slot = %d no timing %d\n",l, slot, ue->no_timing_correction); if (ue->no_timing_correction==0) - nr_adjust_synch_ue(&ue->frame_parms, - ue, - eNB_id, - nr_tti_rx, - 0, - 16384); + nr_adjust_synch_ue(&ue->frame_parms, + ue, + eNB_id, + nr_tti_rx, + 0, + 16384); } - + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_MEASUREMENT_PROCEDURES, VCD_FUNCTION_OUT); @@ -3150,32 +3151,36 @@ int nr_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t * // table dci_fields_sizes_cnt[dci_cnt-1][i][j] will then be used in function nr_extract_dci_info uint8_t dci_fields_sizes_cnt[MAX_NR_DCI_DECODED_SLOT][NBR_NR_DCI_FIELDS][NBR_NR_FORMATS] = {0}; - uint16_t tc_rnti = 1; // FIXME - uint16_t int_rnti = 1; // FIXME - uint16_t sfi_rnti = 1; // FIXME - uint16_t tpc_pusch_rnti =1; // FIXME - uint16_t tpc_pucch_rnti = 1; // FIXME - uint16_t tpc_srs_rnti = 1; // FIXME int nb_searchspace_active=0; NR_UE_PDCCH **pdcch_vars = ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]]; NR_UE_PDCCH *pdcch_vars2 = ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]; // s in TS 38.212 Subclause 10.1, for each active BWP the UE can deal with 10 different search spaces // Higher layers have updated the number of searchSpaces with are active in the current slot and this value is stored in variable nb_searchspace_total int nb_searchspace_total = pdcch_vars2->nb_search_space; + + uint16_t c_rnti=pdcch_vars[eNB_id]->crnti; + uint16_t cs_rnti,new_rnti,tc_rnti; + uint16_t p_rnti=P_RNTI; + uint16_t si_rnti=SI_RNTI; + uint16_t ra_rnti=99; + uint16_t sp_csi_rnti,sfi_rnti,int_rnti,tpc_pusch_rnti,tpc_pucch_rnti,tpc_srs_rnti; //FIXME + uint16_t crc_scrambled_values[TOTAL_NBR_SCRAMBLED_VALUES] = + {c_rnti,cs_rnti,new_rnti,tc_rnti,p_rnti,si_rnti,ra_rnti,sp_csi_rnti,sfi_rnti,int_rnti,tpc_pusch_rnti,tpc_pucch_rnti,tpc_srs_rnti}; + #ifdef NR_PDCCH_SCHED_DEBUG - printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> there is a bug in FAPI to calculate nb_searchspace_total=%d\n",nb_searchspace_total); + printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> there is a bug in FAPI to calculate nb_searchspace_total=%d\n",nb_searchspace_total); #endif if (nb_searchspace_total>1) nb_searchspace_total=1; // to be removed when fixing bug in FAPI #ifdef NR_PDCCH_SCHED_DEBUG - printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> there is a bug in FAPI to calculate nb_searchspace_total so we set it to 1...\n"); - printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> the number of searchSpaces active in the current slot(%d) is %d) \n", - nr_tti_rx,nb_searchspace_total); + printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> there is a bug in FAPI to calculate nb_searchspace_total so we set it to 1...\n"); + printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> the number of searchSpaces active in the current slot(%d) is %d) \n", + nr_tti_rx,nb_searchspace_total); #endif // p in TS 38.212 Subclause 10.1, for each active BWP the UE can deal with 3 different CORESETs (including coresetId 0 for common search space) int nb_coreset_total = NR_NBR_CORESET_ACT_BWP; unsigned int dci_cnt=0; // this table contains 56 (NBR_NR_DCI_FIELDS) elements for each dci field and format described in TS 38.212. Each element represents the size in bits for each dci field - uint8_t dci_fields_sizes[NBR_NR_DCI_FIELDS][NBR_NR_FORMATS] = {0}; + uint8_t dci_fields_sizes[NBR_NR_DCI_FIELDS][NBR_NR_FORMATS] = {{0}}; // this is the UL bandwidth part. FIXME! To be defined where this value comes from uint16_t n_RB_ULBWP = 106; // this is the DL bandwidth part. FIXME! To be defined where this value comes from @@ -3289,33 +3294,18 @@ int nr_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t * // or TPC-PUSCH-RNTI, or TPC-PUCCH-RNTI, or TPC-SRS-RNTI, or C-RNTI, or CS-RNTI(s), or SP-CSI-RNTI -#ifdef PHY_ABSTRACTION - int CC_id; - int UE_id; - uint8_t harq_pid; -#endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_IN); #if UE_TIMING_TRACE - start_meas(&ue->dlsch_rx_pdcch_stats); + start_meas(&ue->dlsch_rx_pdcch_stats); #endif - // if (nr_tti_rx != 5) - // return 0; - if (abstraction_flag == 0) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_IN); -/* rx_pdcch(ue, - proc->frame_rx, - nr_tti_rx, - eNB_id, - (ue->frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, - ue->high_speed_flag, - ue->is_secondary_ue);*/ //removed for nr_ue_pdcch_procedures - #ifdef NR_PDCCH_SCHED_DEBUG - printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Entering function nr_rx_pdcch with eNB_id=%d (nb_coreset_active=%d, (symbol_within_slot_mon&0x3FFF)=%d, searchSpaceType=%d)\n", + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_IN); +#ifdef NR_PDCCH_SCHED_DEBUG + printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Entering function nr_rx_pdcch with eNB_id=%d (nb_coreset_active=%d, (symbol_within_slot_mon&0x3FFF)=%d, searchSpaceType=%d)\n", eNB_id,nb_coreset_active,(symbol_within_slot_mon&0x3FFF), searchSpaceType); - #endif +#endif nr_rx_pdcch(ue, proc->frame_rx, nr_tti_rx, @@ -3327,173 +3317,50 @@ int nr_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t * nb_coreset_active, (symbol_within_slot_mon&0x3FFF), searchSpaceType); - #ifdef NR_PDCCH_SCHED_DEBUG +#ifdef NR_PDCCH_SCHED_DEBUG printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Ending function nr_rx_pdcch(nb_coreset_active=%d, (symbol_within_slot_mon&0x3FFF)=%d, searchSpaceType=%d)\n", nb_coreset_active,(symbol_within_slot_mon&0x3FFF), searchSpaceType); - #endif +#endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_OUT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING, VCD_FUNCTION_IN); -/* - //printf("Decode SIB frame param agregation + DCI %d %d \n",agregationLevel,dciFormat); - - //agregation level == FF means no configuration on - if(ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->agregationLevel == 0xFF || ue->decode_SIB) - { - // search all possible dcis - dci_cnt = dci_decoding_procedure(ue, - dci_alloc_rx, - (ue->UE_mode[eNB_id] < PUSCH)? 1 : 0, // if we're in PUSCH don't listen to common search space, - // later when we need paging or RA during connection, update this ... - eNB_id,nr_tti_rx); - } - else - { - // search only preconfigured dcis - // search C RNTI dci - dci_cnt = dci_CRNTI_decoding_procedure(ue, - dci_alloc_rx, - ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->dciFormat, - ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->agregationLevel, - eNB_id, - nr_tti_rx); - } -*/ //removed for nr_ue_pdcch_procedures crc_scrambled_t crc_scrambled; format_found_t format_found=255; - #ifdef NR_PDCCH_SCHED_DEBUG - if (searchSpaceType == common) { // search all possible dci's for COMMON SEARCH SPACES according to the current SEARCHSPACE configuration - printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Entering function nr_dci_decoding_procedure with eNB_id=%d (n_RB_ULBWP=%d, n_RB_DLBWP=%d, searchSpaceType=%d, nb_searchspace_active=%d, nb_coreset_active=%d) -> dci_cnt=%d\n", - eNB_id,n_RB_ULBWP,n_RB_DLBWP,searchSpaceType, - nb_searchspace_active, - nb_coreset_active, - dci_cnt); - #endif - dci_cnt += nr_dci_decoding_procedure(nb_searchspace_active, - nb_coreset_active, - ue, - dci_alloc_rx[dci_cnt], - searchSpaceType, // if we're in PUSCH don't listen to common search space, - // later when we need paging or RA during connection, update this ... - eNB_id, - nr_tti_rx, - dci_fields_sizes,dci_fields_sizes_cnt, - n_RB_ULBWP, - n_RB_DLBWP, - &crc_scrambled, - &format_found); - #ifdef NR_PDCCH_SCHED_DEBUG - printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Ending function nr_dci_decoding_procedure() -> dci_cnt=%d\n",dci_cnt); - #endif +#ifdef NR_PDCCH_SCHED_DEBUG + printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Entering function nr_dci_decoding_procedure with eNB_id=%d (n_RB_ULBWP=%d, n_RB_DLBWP=%d, searchSpaceType=%d, nb_searchspace_active=%d, nb_coreset_active=%d) -> dci_cnt=%d\n", + eNB_id,n_RB_ULBWP,n_RB_DLBWP,searchSpaceType, + nb_searchspace_active, + nb_coreset_active, + dci_cnt); + +#endif + - } - if (searchSpaceType == ue_specific){// search all possible dci's for UE-SPECIFIC SEARCH SPACES according to the current SEARCHSPACE configuration - printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Entering function nr_dci_decoding_procedure with eNB_id=%d (n_RB_ULBWP=%d, n_RB_DLBWP=%d, searchSpaceType=%d, nb_searchspace_active=%d, nb_coreset_active=%d) -> dci_cnt=%d\n", - eNB_id,n_RB_ULBWP,n_RB_DLBWP,searchSpaceType, - nb_searchspace_active, - nb_coreset_active, - dci_cnt); - - #endif - dci_cnt += nr_dci_decoding_procedure(nb_searchspace_active, - nb_coreset_active, - ue, - dci_alloc_rx[dci_cnt], - searchSpaceType, // if we're in PUSCH don't listen to common search space, - // later when we need paging or RA during connection, update this ... - eNB_id, - nr_tti_rx, - dci_fields_sizes,dci_fields_sizes_cnt, - n_RB_ULBWP, - n_RB_DLBWP, - &crc_scrambled, - &format_found); - #ifdef NR_PDCCH_SCHED_DEBUG - printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Ending function nr_dci_decoding_procedure() -> dci_cnt=%d\n",dci_cnt); - #endif - - } - - - nr_dci_decoding_procedure(nb_searchspace_active, - nb_coreset_active, - ue, - &dci_alloc_rx[dci_cnt], - searchSpaceType, - eNB_id, - nr_tti_rx, - dci_fields_sizes_cnt, - n_RB_ULBWP, - n_RB_DLBWP, - &crc_scrambled, - &format_found); - #ifdef NR_PDCCH_SCHED_DEBUG - printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Ending function nr_dci_decoding_procedure() -> dci_cnt=%d\n",dci_cnt); - #endif - + dci_cnt += nr_dci_decoding_procedure(nb_searchspace_active, + nb_coreset_active, + ue, + &dci_alloc_rx[dci_cnt], + searchSpaceType, // if we're in PUSCH don't listen to common search space, + // later when we need paging or RA during connection, update this ... + eNB_id, + nr_tti_rx, + dci_fields_sizes_cnt, + n_RB_ULBWP, + n_RB_DLBWP, + &crc_scrambled, + &format_found, + crc_scrambled_values); +#ifdef NR_PDCCH_SCHED_DEBUG + printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Ending function nr_dci_decoding_procedure() -> dci_cnt=%d\n",dci_cnt); +#endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING, VCD_FUNCTION_OUT); //LOG_D(PHY,"[UE %d][PUSCH] Frame %d nr_tti_rx %d PHICH RX\n",ue->Mod_id,frame_rx,nr_tti_rx); - /* if (is_phich_subframe(&ue->frame_parms,nr_tti_rx)) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PHICH, VCD_FUNCTION_IN); - rx_phich(ue,proc,nr_tti_rx,eNB_id); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PHICH, VCD_FUNCTION_OUT); - }*/ //removed for nr_ue_pdcch_procedures - } - - #ifdef PHY_ABSTRACTION - else { - for (i=0; iframe_parms.Nid_cell == ue->frame_parms.Nid_cell) - break; - - if (CC_id < MAX_NUM_CCs) - break; - } - - if (i==NB_eNB_INST) { - LOG_E(PHY,"[UE %d] phy_procedures_lte_ue.c: FATAL : Could not find attached eNB for DCI emulation (Nid_cell %d)!!!!\n",ue->Mod_id,ue->frame_parms.Nid_cell); - mac_xface->macphy_exit("Could not find attached eNB for DCI emulation"); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); - return(-1); - } - - LOG_D(PHY,"Calling dci_decoding_proc_emul ...\n"); - dci_cnt = dci_decoding_procedure_emul(ue->pdcch_vars[nr_tti_rx&1], - PHY_vars_eNB_g[i][CC_id]->num_ue_spec_dci[nr_tti_rx&1], - PHY_vars_eNB_g[i][CC_id]->num_common_dci[nr_tti_rx&1], - PHY_vars_eNB_g[i][CC_id]->dci_alloc[nr_tti_rx&1], - dci_alloc_rx, - eNB_id); - // printf("DCI: dci_cnt %d\n",dci_cnt); - UE_id = (uint32_t)find_ue((int16_t)ue->pdcch_vars[nr_tti_rx&1][eNB_id]->crnti,PHY_vars_eNB_g[i][CC_id]); - - if (UE_id>=0) { - // printf("Checking PHICH for UE %d (eNB %d)\n",UE_id,i); - if (is_phich_subframe(&ue->frame_parms,nr_tti_rx)) { - harq_pid = phich_subframe_to_harq_pid(&ue->frame_parms,frame_rx,nr_tti_rx); - - if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->status == ACTIVE) { - // ue->ulsch[eNB_id]->harq_processes[harq_pid]->phich_ACK=1; - ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag =0; - ue->ulsch[eNB_id]->harq_processes[harq_pid]->status = IDLE; - ue->ulsch_Msg3_active[eNB_id] = 0; - ue->ulsch[eNB_id]->harq_processes[harq_pid]->round = 0; - LOG_D(PHY,"Msg3 inactive\n"); - - } // harq_pid is ACTIVE - } // This is a PHICH nr_tti_rx - } // UE_id exists - } - - #endif - uint8_t *nCCE_current = &ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->nCCE[nr_tti_rx]; uint8_t *nCCE_dest = &ue->pdcch_vars[next1_thread_id][eNB_id]->nCCE[nr_tti_rx]; uint8_t *nCCE_dest1 = &ue->pdcch_vars[next2_thread_id][eNB_id]->nCCE[nr_tti_rx]; @@ -3521,14 +3388,6 @@ int nr_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t * /* * This is the NR part */ - uint16_t c_rnti=pdcch_vars[eNB_id]->crnti; - uint16_t cs_rnti,new_rnti,tc_rnti; - uint16_t p_rnti=P_RNTI; - uint16_t si_rnti=SI_RNTI; - uint16_t ra_rnti=99; - uint16_t sp_csi_rnti,sfi_rnti,int_rnti,tpc_pusch_rnti,tpc_pucch_rnti,tpc_srs_rnti; //FIXME - uint16_t crc_scrambled_values[TOTAL_NBR_SCRAMBLED_VALUES] = - {c_rnti,cs_rnti,new_rnti,tc_rnti,p_rnti,si_rnti,ra_rnti,sp_csi_rnti,sfi_rnti,int_rnti,tpc_pusch_rnti,tpc_pucch_rnti,tpc_srs_rnti}; if ((dci_alloc_rx[i].format == format0_0)) if ((dci_alloc_rx[i].format == format1_0) && @@ -3587,285 +3446,19 @@ int nr_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t * // TODO: check where should we send up this message. //ue->if_inst->dl_indication(&ue->dl_indication); - - /* - * This is the LTE part to be removed - - if ((ue->UE_mode[eNB_id]>PRACH) && (dci_alloc_rx[i].rnti == ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->crnti) && (dci_alloc_rx[i].format != format0)) { - - LOG_D(PHY,"[UE %d][DCI][PDSCH %x] AbsSubframe %d.%d: format %d, num_pdcch_symbols %d, nCCE %d, total CCEs %d\n", - ue->Mod_id,dci_alloc_rx[i].rnti, - frame_rx%1024,nr_tti_rx, - dci_alloc_rx[i].format, - ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->num_pdcch_symbols, - ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->nCCE[nr_tti_rx], - get_nCCE(3,&ue->frame_parms,get_mi(&ue->frame_parms,0))); - - //dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); - - if ((ue->UE_mode[eNB_id] > PRACH) && - (generate_ue_dlsch_params_from_dci(frame_rx, - nr_tti_rx, - (void *)&dci_alloc_rx[i].dci_pdu, - ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->crnti, - dci_alloc_rx[i].format, - ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id], - ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id], - ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id], - &ue->frame_parms, - ue->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI, - ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id], - ue->pdcch_vars[0%RX_NB_TH][eNB_id]->crnti_is_temporary? ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->crnti: 0)==0)) { - - // update TPC for PUCCH - if((dci_alloc_rx[i].format == format1) || - (dci_alloc_rx[i].format == format1A) || - (dci_alloc_rx[i].format == format1B) || - (dci_alloc_rx[i].format == format2) || - (dci_alloc_rx[i].format == format2A) || - (dci_alloc_rx[i].format == format2B)) - { - //ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->g_pucch += ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->harq_processes[ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->current_harq_pid]->delta_PUCCH; - int32_t delta_pucch = ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->harq_processes[ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->current_harq_pid]->delta_PUCCH; - for(int th_id=0; th_iddlsch[th_id][eNB_id][0]->g_pucch += delta_pucch; - } - LOG_D(PHY,"update TPC for PUCCH %d.%d / pid %d delta_PUCCH %d g_pucch %d %d \n",frame_rx, nr_tti_rx,ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->current_harq_pid, - delta_pucch, - ue->dlsch[0][eNB_id][0]->g_pucch, - ue->dlsch[1][eNB_id][0]->g_pucch - //ue->dlsch[2][eNB_id][0]->g_pucch - ); - } - - ue->dlsch_received[eNB_id]++; - - #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Generated UE DLSCH C_RNTI format %d\n",ue->Mod_id,dci_alloc_rx[i].format); - dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); - LOG_D(PHY,"[UE %d] *********** dlsch->active in nr_tti_rx %d=> %d\n",ue->Mod_id,nr_tti_rx,ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active); - #endif - - // we received a CRNTI, so we're in PUSCH - if (ue->UE_mode[eNB_id] != PUSCH) { - #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[UE %d] Frame %d, nr_tti_rx %d: Received DCI with CRNTI %x => Mode PUSCH\n",ue->Mod_id,frame_rx,nr_tti_rx,ue->pdcch_vars[nr_tti_rx&1][eNB_id]->crnti); - #endif - //dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); - ue->UE_mode[eNB_id] = PUSCH; - //mac_xface->macphy_exit("Connected. Exiting\n"); - } - } else { - LOG_E(PHY,"[UE %d] Frame %d, nr_tti_rx %d: Problem in DCI!\n",ue->Mod_id,frame_rx,nr_tti_rx); - dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); - } - } - - else if ((dci_alloc_rx[i].rnti == SI_RNTI) && - ((dci_alloc_rx[i].format == format1A) || (dci_alloc_rx[i].format == format1C))) { - - #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[UE %d] nr_tti_rx %d: Found rnti %x, format 1%s, dci_cnt %d\n",ue->Mod_id,nr_tti_rx,dci_alloc_rx[i].rnti,dci_alloc_rx[i].format==format1A?"A":"C",i); - #endif - - - if (generate_ue_dlsch_params_from_dci(frame_rx, - nr_tti_rx, - (void *)&dci_alloc_rx[i].dci_pdu, - SI_RNTI, - dci_alloc_rx[i].format, - ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id], - ue->pdsch_vars_SI[eNB_id], - &ue->dlsch_SI[eNB_id], - &ue->frame_parms, - ue->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI, - ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id], - 0)==0) { - - ue->dlsch_SI_received[eNB_id]++; - - - LOG_I(PHY,"[UE %d] Frame %d, nr_tti_rx %d : Generate UE DLSCH SI_RNTI format 1%s\n",ue->Mod_id,frame_rx,nr_tti_rx,dci_alloc_rx[i].format==format1A?"A":"C"); - //dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); - - } - } - - else if ((dci_alloc_rx[i].rnti == P_RNTI) && - ((dci_alloc_rx[i].format == format1A) || (dci_alloc_rx[i].format == format1C))) { - - #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[UE %d] nr_tti_rx %d: Found rnti %x, format 1%s, dci_cnt %d\n",ue->Mod_id,nr_tti_rx,dci_alloc_rx[i].rnti,dci_alloc_rx[i].format==format1A?"A":"C",i); - #endif - - - if (generate_ue_dlsch_params_from_dci(frame_rx, - nr_tti_rx, - (void *)&dci_alloc_rx[i].dci_pdu, - P_RNTI, - dci_alloc_rx[i].format, - ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id], - ue->pdsch_vars_p[eNB_id], - &ue->dlsch_SI[eNB_id], - &ue->frame_parms, - ue->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI, - ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id], - 0)==0) { - - ue->dlsch_p_received[eNB_id]++; - LOG_D(PHY,"[UE %d] Frame %d, nr_tti_rx %d : Generate UE DLSCH P_RNTI format 1%s\n",ue->Mod_id,frame_rx,nr_tti_rx,dci_alloc_rx[i].format==format1A?"A":"C"); - //dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); - - } - } - - else if ((ue->prach_resources[eNB_id]) && - (dci_alloc_rx[i].rnti == ue->prach_resources[eNB_id]->ra_RNTI) && - (dci_alloc_rx[i].format == format1A)) { - - #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d][RAPROC] nr_tti_rx %d: Found RA rnti %x, format 1A, dci_cnt %d\n",ue->Mod_id,nr_tti_rx,dci_alloc_rx[i].rnti,i); - - //if (((frame_rx%100) == 0) || (frame_rx < 20)) - //dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); - //mac_xface->macphy_exit("so far so good...\n"); - #endif - - - if (generate_ue_dlsch_params_from_dci(frame_rx, - nr_tti_rx, - (DCI1A_5MHz_TDD_1_6_t *)&dci_alloc_rx[i].dci_pdu, - ue->prach_resources[eNB_id]->ra_RNTI, - format1A, - ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id], - ue->pdsch_vars_ra[eNB_id], - &ue->dlsch_ra[eNB_id], - &ue->frame_parms, - ue->pdsch_config_dedicated, - SI_RNTI, - ue->prach_resources[eNB_id]->ra_RNTI, - P_RNTI, - ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id], - 0)==0) { - - ue->dlsch_ra_received[eNB_id]++; - - #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Generate UE DLSCH RA_RNTI format 1A, rb_alloc %x, dlsch_ra[eNB_id] %p\n", - ue->Mod_id,ue->dlsch_ra[eNB_id]->harq_processes[0]->rb_alloc_even[0],ue->dlsch_ra[eNB_id]); - #endif - } - } else if( (dci_alloc_rx[i].rnti == ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->crnti) && - (dci_alloc_rx[i].format == format0)) { - - #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d][PUSCH] Frame %d nr_tti_rx %d: Found rnti %x, format 0, dci_cnt %d\n", - ue->Mod_id,frame_rx,nr_tti_rx,dci_alloc_rx[i].rnti,i); - #endif - - ue->ulsch_no_allocation_counter[eNB_id] = 0; - //dump_dci(&ue->frame_parms,&dci_alloc_rx[i]); - - if ((ue->UE_mode[eNB_id] > PRACH) && - (generate_ue_ulsch_params_from_dci((void *)&dci_alloc_rx[i].dci_pdu, - ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->crnti, - nr_tti_rx, - format0, - ue, - proc, - SI_RNTI, - 0, - P_RNTI, - CBA_RNTI, - eNB_id, - 0)==0)) { - #if T_TRACER - NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; - uint8_t harq_pid = subframe2harq_pid(frame_parms, - pdcch_alloc2ul_frame(frame_parms,proc->frame_rx,proc->nr_tti_rx), - pdcch_alloc2ul_subframe(frame_parms,proc->nr_tti_rx)); - - T(T_UE_PHY_ULSCH_UE_DCI, T_INT(eNB_id), T_INT(proc->frame_rx%1024), T_INT(proc->nr_tti_rx), T_INT(ue->Mod_id), - T_INT(dci_alloc_rx[i].rnti), T_INT(harq_pid), - T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->mcs), - T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->round), - T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb), - T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb), - T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS)); - #endif - #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Generate UE ULSCH C_RNTI format 0 (nr_tti_rx %d)\n",ue->Mod_id,nr_tti_rx); - #endif - - } - } else if( (dci_alloc_rx[i].rnti == ue->ulsch[eNB_id]->cba_rnti[0]) && - (dci_alloc_rx[i].format == format0)) { - // UE could belong to more than one CBA group - // ue->Mod_id%ue->ulsch[eNB_id]->num_active_cba_groups] - #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d][PUSCH] Frame %d nr_tti_rx %d: Found cba rnti %x, format 0, dci_cnt %d\n", - ue->Mod_id,frame_rx,nr_tti_rx,dci_alloc_rx[i].rnti,i); - /* - if (((frame_rx%100) == 0) || (frame_rx < 20)) - dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); - - #endif - - ue->ulsch_no_allocation_counter[eNB_id] = 0; - //dump_dci(&ue->frame_parms,&dci_alloc_rx[i]); - - if ((ue->UE_mode[eNB_id] > PRACH) && - (generate_ue_ulsch_params_from_dci((void *)&dci_alloc_rx[i].dci_pdu, - ue->ulsch[eNB_id]->cba_rnti[0], - nr_tti_rx, - format0, - ue, - proc, - SI_RNTI, - 0, - P_RNTI, - CBA_RNTI, - eNB_id, - 0)==0)) { - - #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Generate UE ULSCH CBA_RNTI format 0 (nr_tti_rx %d)\n",ue->Mod_id,nr_tti_rx); - #endif - ue->ulsch[eNB_id]->num_cba_dci[(nr_tti_rx+4)%10]++; - } - } - - else { - #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] frame %d, nr_tti_rx %d: received DCI %d with RNTI=%x (C-RNTI:%x, CBA_RNTI %x) and format %d!\n",ue->Mod_id,frame_rx,nr_tti_rx,i,dci_alloc_rx[i].rnti, - ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->crnti, - ue->ulsch[eNB_id]->cba_rnti[0], - dci_alloc_rx[i].format); - - // dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); - #endif - }*/ - } // end for loop dci_cnt + #if UE_TIMING_TRACE stop_meas(&ue->dlsch_rx_pdcch_stats); #endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); -// } // end if do_pdcch_monitoring_current_slot + } // end for loop nb_searchspace_active return(0); } +#endif // NR_PDCCH_SCHED + #if 0 @@ -5587,7 +5180,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN); nr_slot_fep(ue, l, - nr_tti_rx<<1, + nr_tti_rx, 0, 0, 1, @@ -5596,12 +5189,10 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN #if UE_TIMING_TRACE stop_meas(&ue->ofdm_demod_stats); #endif - printf("phy procedure pdcch start measurement l =%d\n",l); - nr_ue_measurement_procedures(l,ue,proc,eNB_id,(nr_tti_rx<<1),abstraction_flag,mode); - } - - } - } + //printf("phy procedure pdcch start measurement l =%d\n",l); + nr_ue_measurement_procedures(l,ue,proc,eNB_id,(nr_tti_rx<<1),abstraction_flag,mode); + } + } //write_output("rxdataF.m","rxF",ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx>>1]].rxdataF[0],ue->frame_parms.ofdm_symbol_size*2,1,1); @@ -5615,10 +5206,11 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN //printf(">>> at phy_procedures_nrUE_RX, nr_ue_pdcch_procedures init, dlsch->active=%d\n", // ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active); - /*if (nr_ue_pdcch_procedures(eNB_id,ue,proc,abstraction_flag) == -1) { + if (nr_ue_pdcch_procedures(eNB_id,ue,proc,abstraction_flag) == -1) { LOG_E(PHY,"[UE %d] Frame %d, nr_tti_rx %d: Error in pdcch procedures\n",ue->Mod_id,frame_rx,nr_tti_rx); return(-1); - }*/ + } + } //for (int m=0;m<1000;m++) printf("%d",m); //printf("\n>>> at phy_procedures_nrUE_RX, nr_ue_pdcch_procedures end, dlsch->active=%d\n", // ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active); @@ -5679,24 +5271,24 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx); if (nr_tti_rx==1){ - //to update from pdsch config - nr_gold_pdsch(ue,nb_symb_pdcch,0, 1); - - for (uint16_t m=nb_symb_pdcch;m<=(nb_symb_sch+nb_symb_pdcch-1) ; m++){ - nr_slot_fep(ue, - m, //to be updated from higher layer - nr_tti_rx<<1, - 0, - 0, - 1, - NR_PDSCH_EST); - - printf("phy procedure pdsch start measurement\n"); - nr_ue_measurement_procedures(m,ue,proc,eNB_id,(nr_tti_rx<<1),abstraction_flag,mode); - - } + //to update from pdsch config + nr_gold_pdsch(ue,nb_symb_pdcch,0, 1); + + for (uint16_t m=nb_symb_pdcch;m<=(nb_symb_sch+nb_symb_pdcch-1) ; m++){ + nr_slot_fep(ue, + m, //to be updated from higher layer + nr_tti_rx<<1, + 0, + 0, + 1, + NR_PDSCH_EST); + + //printf("phy procedure pdsch start measurement\n"); + nr_ue_measurement_procedures(m,ue,proc,eNB_id,(nr_tti_rx<<1),abstraction_flag,mode); + + } //set active for testing, to be removed - ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active = 1; + ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active = 1; } #if UE_TIMING_TRACE diff --git a/targets/RT/USER/nr-ue.c b/targets/RT/USER/nr-ue.c index 559b64f452..9087daabc1 100644 --- a/targets/RT/USER/nr-ue.c +++ b/targets/RT/USER/nr-ue.c @@ -442,6 +442,8 @@ static void *UE_thread_synch(void *arg) { #endif if (nr_initial_sync( UE, UE->mode ) == 0) { + //write_output("txdata_sym.m", "txdata_sym", UE->common_vars.rxdata[0], (10*UE->frame_parms.samples_per_subframe), 1, 1); + hw_slot_offset = (UE->rx_offset<<1) / UE->frame_parms.samples_per_subframe; printf("Got synch: hw_slot_offset %d, carrier off %d Hz, rxgain %d (DL %u, UL %u), UE_scan_carrier %d\n", hw_slot_offset, @@ -594,7 +596,7 @@ static void *UE_thread_synch(void *arg) { break; } -#ifdef XFORMS +#if 0 //defined XFORMS if (do_forms) { extern FD_lte_phy_scope_ue *form_ue[NUMBER_OF_UE_MAX]; @@ -603,7 +605,7 @@ static void *UE_thread_synch(void *arg) { 0,0,7); } #endif - + AssertFatal ( 0== pthread_mutex_lock(&UE->proc.mutex_synch), ""); // indicate readiness UE->proc.instance_cnt_synch--; @@ -683,15 +685,14 @@ static void *UE_thread_rxn_txnp4(void *arg) { phy_procedures_slot_parallelization_UE_RX( UE, proc, 0, 0, 1, UE->mode, no_relay, NULL ); #else phy_procedures_nrUE_RX( UE, proc, 0, 0, 1, UE->mode, no_relay); - printf(">>> nr_ue_pdcch_procedures ended\n"); - + //printf(">>> nr_ue_pdcch_procedures ended\n"); #endif } #if UE_TIMING_TRACE start_meas(&UE->generic_stat); #endif -printf(">>> mac init\n"); + //printf(">>> mac init\n"); if (UE->mac_enabled==1) { @@ -762,7 +763,7 @@ printf(">>> mac init\n"); #if UE_TIMING_TRACE stop_meas(&UE->generic_stat); #endif -printf(">>> mac ended\n"); + //printf(">>> mac ended\n"); // Prepare the future Tx data #if 0 @@ -932,10 +933,10 @@ nb_sf_init=5; } UE->rx_offset=0; UE->time_sync_cell=0; - //UE->proc.proc_rxtx[0].frame_rx++; + UE->proc.proc_rxtx[0].frame_rx++; //UE->proc.proc_rxtx[1].frame_rx++; - for (th_id=0; th_id < RX_NB_TH; th_id++) { - UE->proc.proc_rxtx[th_id].frame_rx++; + for (th_id=1; th_id < RX_NB_TH; th_id++) { + UE->proc.proc_rxtx[th_id].frame_rx = UE->proc.proc_rxtx[0].frame_rx; } //printf("first stream frame rx %d\n",UE->proc.proc_rxtx[0].frame_rx); @@ -954,6 +955,10 @@ nb_sf_init=5; rt_sleep_ns(1000*1000); } else { + thread_idx++; + if(thread_idx>=RX_NB_TH) + thread_idx = 0; + subframe_nr++; subframe_nr %= NR_NUMBER_OF_SUBFRAMES_PER_FRAME; UE_nr_rxtx_proc_t *proc = &UE->proc.proc_rxtx[thread_idx]; @@ -974,9 +979,6 @@ nb_sf_init=5; LOG_D(PHY,"Process subframe %d thread Idx %d \n", subframe_nr, UE->current_thread_id[subframe_nr]); - thread_idx++; - if(thread_idx>=RX_NB_TH) - thread_idx = 0; if (UE->mode != loop_through_memory) { for (i=0; iframe_parms.nb_antennas_rx; i++) @@ -1045,10 +1047,10 @@ nb_sf_init=5; // operate on thread sf mod 2 AssertFatal(pthread_mutex_lock(&proc->mutex_rxtx) ==0,""); if(subframe_nr == 0) { - //UE->proc.proc_rxtx[0].frame_rx++; + UE->proc.proc_rxtx[0].frame_rx++; //UE->proc.proc_rxtx[1].frame_rx++; - for (th_id=0; th_id < RX_NB_TH; th_id++) { - UE->proc.proc_rxtx[th_id].frame_rx++; + for (th_id=1; th_id < RX_NB_TH; th_id++) { + UE->proc.proc_rxtx[th_id].frame_rx = UE->proc.proc_rxtx[0].frame_rx; } #ifdef SAIF_ENABLED if (!(proc->frame_rx%4000)) @@ -1068,7 +1070,7 @@ nb_sf_init=5; proc->nr_tti_rx=subframe_nr; proc->subframe_rx=subframe_nr; - + proc->frame_tx = proc->frame_rx; proc->nr_tti_tx= subframe_nr + DURATION_RX_TO_TX; if (proc->nr_tti_tx > NR_NUMBER_OF_SUBFRAMES_PER_FRAME) { diff --git a/targets/RT/USER/nr-uesoftmodem.c b/targets/RT/USER/nr-uesoftmodem.c index 7b25a2aea2..f7ae066a7d 100644 --- a/targets/RT/USER/nr-uesoftmodem.c +++ b/targets/RT/USER/nr-uesoftmodem.c @@ -437,13 +437,13 @@ static void *scope_thread(void *arg) { #endif - while (!oai_exit) { + while (!oai_exit) { //len = dump_ue_stats (PHY_vars_UE_g[0][0], &PHY_vars_UE_g[0][0]->proc.proc_rxtx[0],stats_buffer, 0, mode,rx_input_level_dBm); //fl_set_object_label(form_stats->stats_text, stats_buffer); fl_clear_browser(form_stats->stats_text); fl_add_browser_line(form_stats->stats_text, stats_buffer); - if (PHY_vars_UE_g[0][0]->is_synchronized == 1) + //if (PHY_vars_UE_g[0][0]->is_synchronized == 1) phy_scope_UE(form_ue[0], PHY_vars_UE_g[0][0], 0,0,7); @@ -549,7 +549,7 @@ static void get_options(void) { set_glog_onlinelog(online_log_messages); } if(config_isparamset(cmdline_logparams,CMDLINE_GLOGLEVEL_IDX)) { - set_glog(glog_level); + set_glog(glog_level); } if (start_telnetsrv) { @@ -876,23 +876,6 @@ int main( int argc, char **argv ) { T_Config_Init(); #endif - // initialize the log (see log.h for details) - set_glog(OAILOG_DEBUG); - - set_log(HW, OAILOG_DEBUG); - set_log(PHY, OAILOG_DEBUG); - set_log(MAC, OAILOG_INFO); - set_log(RLC, OAILOG_INFO); - set_log(PDCP, OAILOG_INFO); - set_log(OTG, OAILOG_INFO); - set_log(RRC, OAILOG_INFO); -#if defined(ENABLE_ITTI) - set_log(SIM, OAILOG_INFO); -# if defined(ENABLE_USE_MME) - set_log(NAS, OAILOG_INFO); -# endif -#endif - //randominit (0); set_taus_seed (0); From c6357850974099690bb9c114a6b350722d9d7a1e Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Wed, 28 Nov 2018 09:57:55 +0100 Subject: [PATCH 098/117] update dlsch decoding worker threads --- .../PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 1575 ++++------------- .../NR_UE_TRANSPORT/nr_transport_proto_ue.h | 18 + openair1/SCHED_NR_UE/defs.h | 8 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 12 +- targets/RT/USER/nr-ue.c | 6 +- 5 files changed, 376 insertions(+), 1243 deletions(-) diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index dfee3d34d3..6f7afba451 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -36,7 +36,7 @@ #include "PHY/CODING/coding_defs.h" #include "PHY/NR_TRANSPORT/nr_transport_common_proto.h" #include "PHY/NR_TRANSPORT/nr_dlsch.h" -//#include "SCHED/extern.h" +#include "SCHED_NR_UE/defs.h" #include "SIMULATION/TOOLS/sim.h" #include "targets/RT/USER/nr-uesoftmodem.h" #include "PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.h" @@ -653,14 +653,15 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, } #ifdef UE_DLSCH_PARALLELISATION -uint32_t dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue, - UE_rxtx_proc_t *proc, +uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue, + UE_nr_rxtx_proc_t *proc, int eNB_id, short *dlsch_llr, NR_DL_FRAME_PARMS *frame_parms, NR_UE_DLSCH_t *dlsch, NR_DL_UE_HARQ_t *harq_process, uint32_t frame, + uint16_t nb_symb_sch, uint8_t nr_tti_rx, uint8_t harq_pid, uint8_t is_crnti, @@ -675,10 +676,8 @@ uint32_t dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue, 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*(8448+64)]; - uint32_t r,r_offset=0,Kr,Kr_bytes,err_flag=0,Kr_int,kb,kc; + //short dummy_w[MAX_NUM_DLSCH_SEGMENTS][3*(8448+64)]; + uint32_t r,r_offset=0,Kr,Kr_bytes,err_flag=0,K_bytes_F; uint8_t crc_type; //UE_rxtx_proc_t *proc = &phy_vars_ue->proc; int32_t no_iteration_ldpc; @@ -689,66 +688,29 @@ uint32_t dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue, uint8_t r_thread; uint32_t Er, Gp,GpmodC;*/ t_nrLDPC_dec_params decParams; - t_nrLDPC_dec_params* p_decParams = &decParams; - t_nrLDPC_time_stats procTime; - t_nrLDPC_time_stats* p_procTime =&procTime ; - int16_t z [68*384]; - int8_t l [68*384]; - //__m128i l; - int16_t inv_d [68*384]; - int16_t *p_invd =&inv_d; + t_nrLDPC_dec_params* p_decParams = &decParams; + t_nrLDPC_time_stats procTime; + t_nrLDPC_time_stats* p_procTime =&procTime ; + int16_t z [68*384]; + int8_t l [68*384]; + //__m128i l; + int16_t inv_d [68*384]; + //int16_t *p_invd =&inv_d; + uint8_t kb, kc; + uint8_t Ilbrm = 0; + uint32_t Tbslbrm = 950984; + uint16_t nb_rb = 30; //to update + //uint16_t nb_symb_sch = 12; + uint8_t nb_re_dmrs = 6; + uint16_t length_dmrs = 1; - uint32_t i,j; - uint32_t k; + uint32_t i,j; + //uint32_t k; __m128i *pv = (__m128i*)&z; __m128i *pl = (__m128i*)&l; -#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 - uint8_t (*tc)(int16_t *y, - 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 *); - - - - if (!dlsch_llr) { printf("dlsch_decoding.c: NULL dlsch_llr pointer\n"); return(dlsch->max_ldpc_iterations); @@ -764,7 +726,7 @@ uint32_t dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue, return(dlsch->max_ldpc_iterations); } - if (nr_tti_rx> (10*frame_parms->ttis_per_subframe-1)) { + /* if (nr_tti_rx> (10*frame_parms->ttis_per_subframe-1)) { printf("dlsch_decoding.c: Illegal subframe index %d\n",nr_tti_rx); return(dlsch->max_ldpc_iterations); } @@ -772,24 +734,7 @@ uint32_t dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue, if (dlsch->harq_ack[nr_tti_rx].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, nr_tti_rx, dlsch->harq_ack[nr_tti_rx].ack); - } - - if (llr8_flag == 0) { - //#ifdef __AVX2__ -#if 0 - tc_2cw = phy_threegpplte_turbo_decoder16avx2; -#endif - tc = phy_threegpplte_turbo_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 = phy_threegpplte_turbo_decoder8; - } - - - // nb_rb = dlsch->nb_rb; + }*/ /* if (nb_rb > frame_parms->N_RB_DL) { @@ -804,13 +749,16 @@ uint32_t dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue, } */ - + nb_rb = harq_process->nb_rb; harq_process->trials[harq_process->round]++; + harq_process->TBS = nr_compute_tbs(harq_process->mcs,nb_rb,nb_symb_sch,nb_re_dmrs,length_dmrs, harq_process->Nl); + A = harq_process->TBS; //2072 for QPSK 1/3 ret = dlsch->max_ldpc_iterations; + harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, harq_process->Qm,harq_process->Nl); G = harq_process->G; @@ -824,32 +772,18 @@ uint32_t dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue, if (harq_process->round == 0) { // This is a new packet, so compute quantities regarding segmentation harq_process->B = A+24; - #ifdef TD_DECODING - 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 nr_segmentation(NULL, - NULL, - harq_process->B, - &harq_process->C, - &harq_process->Kplus, - &harq_process->Kminus, - &harq_process->Z, - &harq_process->F); - p_decParams->Z = harq_process->Z; - #endif + NULL, + harq_process->B, + &harq_process->C, + &harq_process->K, + &harq_process->Z, + &harq_process->F); + p_decParams->Z = harq_process->Z; } - kb = harq_process->Kplus/harq_process->Z; + kb = harq_process->K/harq_process->Z; if ( kb==22){ p_decParams->BG = 1; p_decParams->R = 89; @@ -877,15 +811,7 @@ uint32_t dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue, 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: + case 106: bw_scaling =2; break; @@ -1031,48 +957,15 @@ if (harq_process->C>1) { // wakeup worker if more than 1 segment for (r=0; rCminus) - Kr = harq_process->Kminus; - else - Kr = harq_process->Kplus; -#else - Kr = harq_process->Kplus; -#endif - + Kr = harq_process->K; Kr_bytes = Kr>>3; + K_bytes_F = Kr_bytes-(harq_process->F>>3); - //workaround for nr ldpc using lte interleaving - if (dlsch->harq_processes[harq_pid]->C >= 2) - Kr_int = G/(3*dlsch->harq_processes[harq_pid]->C); - else - Kr_int = Kr; - - 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_ldpc_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 + Tbslbrm = nr_compute_tbs(28,nb_rb,frame_parms->symbols_per_slot,0,0, harq_process->Nl); #if UE_TIMING_TRACE start_meas(dlsch_rate_unmatching_stats); #endif - memset(&dummy_w[r][0],0,3*(8448+64)*sizeof(short)); - harq_process->RTC[r] = generate_dummy_w(Kr_int, - (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", @@ -1089,21 +982,20 @@ if (harq_process->C>1) { // wakeup worker if more than 1 segment #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 (nr_rate_matching_ldpc_rx(Ilbrm, + Tbslbrm, + p_decParams->BG, + p_decParams->Z, + G, + harq_process->w[r], + dlsch_llr+r_offset, + harq_process->C, + 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 @@ -1126,24 +1018,24 @@ if (harq_process->C>1) { // wakeup worker if more than 1 segment #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]); + nr_deinterleaving_ldpc(E, + harq_process->Qm, + harq_process->d[r], + 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");*/ + for (int i=0;i<(3*8*Kr_bytes);i++) + printf("%d : %d\n",i,harq_process->d[r][i]); + printf("\n"); #endif @@ -1156,17 +1048,8 @@ if (harq_process->C>1) { // wakeup worker if more than 1 segment 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", @@ -1181,60 +1064,48 @@ if (harq_process->C>1) { // wakeup worker if more than 1 segment start_meas(dlsch_turbo_decoding_stats); #endif LOG_D(PHY,"mthread AbsSubframe %d.%d Start turbo segment %d/%d \n",frame%1024,nr_tti_rx,r,harq_process->C-1); -#ifdef TD_DECODING - ret = tc - (&harq_process->d[r][96], - harq_process->c[r], - Kr, - f1f2mat_old[iind*2], - f1f2mat_old[(iind*2)+1], - dlsch->max_ldpc_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); - -#else memset(pv,0,2*p_decParams->Z*sizeof(int16_t)); //memset(pl,0,2*p_decParams->Z*sizeof(int8_t)); + memset((pv+K_bytes_F),127,harq_process->F*sizeof(int16_t)); - //if (A < 1000){ - for (i=2*p_decParams->Z/8, j = 0; i < (68*p_decParams->Z/8+1); i++, j++) + for (i=((2*p_decParams->Z)>>3), j = 0; i < K_bytes_F+((2*p_decParams->Z)>>3); i++, j++) { pv[i]= _mm_loadu_si128((__m128i*)(&inv_d[8*j])); } - /*} - else{ - for (i=2*p_decParams->Z/8, j = 0; i < (68*p_decParams->Z/8+1); i++, j++) + + for (i=Kr_bytes+((2*p_decParams->Z)>>3),j=Kr_bytes; i < ((kc*p_decParams->Z)>>3); i++, j++) + { + pv[i]= _mm_loadu_si128((__m128i*)(&inv_d[8*j])); + } + + for (i=0, j=0; j < ((kc*p_decParams->Z)>>4); i+=2, j++) { - pv[i]= _mm_loadu_si128((__m128i*)&harq_process->d[r][96+8*j]); - } - }*/ - for (i=0, j=0; j < (68*p_decParams->Z/16); i+=2, j++) - { - //printf("mm packs i %d j %d\n", i, j); - //print128_num(pv[i]); - //print128_num(pv[i+1]); + pl[j] = _mm_packs_epi16(pv[i],pv[i+1]); - //print128_num2bytes(pl[j]); + } no_iteration_ldpc = nrLDPC_decoder(p_decParams, - &pl[0], - llrProcBuf, - p_procTime); + (int8_t*)&pl[0], + llrProcBuf, + p_procTime); + + nb_total_decod++; + if (no_iteration_ldpc > 10){ + nb_error_decod++; + ret = 1+dlsch->max_ldpc_iterations; + } + else { + ret=2; + } + //if (!nb_total_decod%10000){ + printf("Error number of iteration LPDC %d %ld/%ld \n", no_iteration_ldpc, nb_error_decod,nb_total_decod);fflush(stdout); + //} - //if (no_iteration_ldpc > 2) - //printf("Error number of iteration LPDC %d\n", no_iteration_ldpc); //else - //printf("OK number of iteration LPDC %d\n", no_iteration_ldpc); + //printf("OK number of iteration LPDC %d\n", no_iteration_ldpc); for (int m=0; m < Kr>>3; m ++) { @@ -1256,7 +1127,6 @@ if (harq_process->C>1) { // wakeup worker if more than 1 segment } printf(" \n");*/ -#endif //printf("output channel decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]); //printf("output decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]); @@ -1266,153 +1136,6 @@ if (harq_process->C>1) { // wakeup worker if more than 1 segment 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_ldpc_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_ldpc_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_ldpc_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_ldpc_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_ldpc_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_ldpc_iterations))) {// a Code segment is in error so break; @@ -1434,9 +1157,9 @@ if (harq_process->C>1) { // wakeup worker if more than 1 segment 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, nr_tti_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round); #endif - dlsch->harq_ack[nr_tti_rx].ack = 0; - dlsch->harq_ack[nr_tti_rx].harq_id = harq_pid; - dlsch->harq_ack[nr_tti_rx].send_harq_status = 1; + harq_process->harq_ack.ack = 0; + harq_process->harq_ack.harq_id = harq_pid; + harq_process->harq_ack.send_harq_status = 1; harq_process->errors[harq_process->round]++; harq_process->round++; @@ -1461,9 +1184,9 @@ if (harq_process->C>1) { // wakeup worker if more than 1 segment harq_process->status = SCH_IDLE; harq_process->round = 0; - dlsch->harq_ack[nr_tti_rx].ack = 1; - dlsch->harq_ack[nr_tti_rx].harq_id = harq_pid; - dlsch->harq_ack[nr_tti_rx].send_harq_status = 1; + harq_process->harq_ack.ack = 1; + harq_process->harq_ack.harq_id = harq_pid; + harq_process->harq_ack.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); @@ -1502,31 +1225,24 @@ if (harq_process->C>1) { // wakeup worker if more than 1 segment proc->decoder_main_available = 0; for (r=0; rC; r++) { - if (rCminus) - Kr = harq_process->Kminus; - else - Kr = harq_process->Kplus; - Kr_bytes = Kr>>3; + Kr = harq_process->K; //to check if same K in all segments + 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)); - } + memcpy(harq_process->b+offset, + harq_process->c[r], + 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)); + +#ifdef DEBUG_DLSCH_DECODING + printf("Segment %d : Kr= %d bytes\n",r,Kr_bytes); + printf("copied %d bytes to b sequence (harq_pid %d)\n", + (Kr_bytes - (harq_process->F>>3)-((harq_process->C>1)?3:0)),harq_pid); + printf("b[0] = %x,c[%d] = %x\n", + harq_process->b[offset], + harq_process->F>>3, + harq_process->c[r]); +#endif } dlsch->last_iteration_cnt = ret; @@ -1544,13 +1260,13 @@ if (harq_process->C>1) { // wakeup worker if more than 1 segment #ifdef UE_DLSCH_PARALLELISATION #define FIFO_PRIORITY 39 -uint32_t dlsch_decoding_2thread0(void *arg) +void *nr_dlsch_decoding_2thread0(void *arg) { - static __thread int UE_dlsch_td_retval; - struct rx_tx_thread_data *rtd = arg; - UE_rxtx_proc_t *proc = rtd->proc; + static __thread int UE_dlsch_td_retval; + struct nr_rxtx_thread_data *rtd = arg; + UE_nr_rxtx_proc_t *proc = rtd->proc; PHY_VARS_NR_UE *phy_vars_ue = rtd->UE; - + NR_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms; int llr8_flag1; int32_t no_iteration_ldpc; t_nrLDPC_dec_params decParams; @@ -1562,6 +1278,13 @@ uint32_t dlsch_decoding_2thread0(void *arg) //__m128i l; int16_t inv_d [68*384]; int16_t *p_invd =&inv_d; + uint8_t kb, kc; + uint8_t Ilbrm = 0; + uint32_t Tbslbrm = 950984; + uint16_t nb_rb = 30; //to update + uint16_t nb_symb_sch = 12; + uint8_t nb_re_dmrs = 6; + uint16_t length_dmrs = 1; uint32_t i,j; uint32_t k; @@ -1596,51 +1319,16 @@ uint32_t dlsch_decoding_2thread0(void *arg) 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*(8448+64)]; - uint32_t r,r_offset=0,Kr,Kr_bytes,err_flag=0,Kr_int; +// short dummy_w[MAX_NUM_DLSCH_SEGMENTS][3*(8448+64)]; + uint32_t r,r_offset=0,Kr,Kr_bytes,err_flag=0,K_bytes_F; uint8_t crc_type; - uint8_t C; - uint8_t Qm; - uint8_t Nl; - uint32_t Er, Gp,GpmodC; -#ifdef DEBUG_DLSCH_DECODING - uint16_t i; -#endif - //#ifdef __AVX2__ + uint8_t C,Cprime; + uint8_t Qm; + uint8_t Nl; + //uint32_t Er; - uint8_t (*tc)(int16_t *y, - 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 *); - if (llr8_flag1 == 0) { - //#ifdef __AVX2__ -#if 0 - tc_2cw = phy_threegpplte_turbo_decoder16avx2; -#endif - tc = phy_threegpplte_turbo_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 = phy_threegpplte_turbo_decoder8; - } - - init_thread(900000,1000000 , FIFO_PRIORITY-1, &cpuset, threadname); - while (!oai_exit) { + init_thread(900000,1000000 , FIFO_PRIORITY-1, &cpuset, threadname); + while (!oai_exit) { //proc->decoder_thread_available = 1; @@ -1658,27 +1346,25 @@ uint32_t dlsch_decoding_2thread0(void *arg) } uint32_t wait = 0; - while(proc->decoder_main_available == 0) - { - usleep(1); - wait++; - } + while(proc->decoder_main_available == 0) + { + usleep(1); + wait++; + } - //proc->decoder_thread_available = 0; + //proc->decoder_thread_available = 0; //PHY_VARS_NR_UE *phy_vars_ue = tdp->UE; - int eNB_id = proc->eNB_id; - int harq_pid = proc->harq_pid; - llr8_flag1 = proc->llr8_flag; - //r_offset = proc->Er; - //UE_rxtx_proc_t *proc = tdp->proc; - int frame = proc->frame_rx; - int subframe = proc->nr_tti_rx; - NR_UE_DLSCH_t *dlsch = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]; - NR_DL_UE_HARQ_t *harq_process = dlsch->harq_processes[harq_pid]; - short *dlsch_llr = phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[0]; - //printf("2thread0 llr flag %d tdp flag %d\n",llr8_flag1, tdp->llr8_flag); - - // nb_rb = dlsch->nb_rb; + int eNB_id = proc->eNB_id; + int harq_pid = proc->harq_pid; + llr8_flag1 = proc->llr8_flag; + //r_offset = proc->Er; + //UE_rxtx_proc_t *proc = tdp->proc; + int frame = proc->frame_rx; + int subframe = proc->nr_tti_rx; + NR_UE_DLSCH_t *dlsch = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]; + NR_DL_UE_HARQ_t *harq_process = dlsch->harq_processes[harq_pid]; + short *dlsch_llr = phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[0]; + //printf("2thread0 llr flag %d tdp flag %d\n",llr8_flag1, tdp->llr8_flag); /* if (nb_rb > frame_parms->N_RB_DL) { @@ -1693,52 +1379,49 @@ uint32_t dlsch_decoding_2thread0(void *arg) } */ - + nb_rb = harq_process->nb_rb; harq_process->trials[harq_process->round]++; + harq_process->TBS = nr_compute_tbs(harq_process->mcs,nb_rb,nb_symb_sch,nb_re_dmrs,length_dmrs, harq_process->Nl); + A = harq_process->TBS; //2072 for QPSK 1/3 ret = dlsch->max_ldpc_iterations; - + harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, harq_process->Qm,harq_process->Nl); G = harq_process->G; - //get_G(frame_parms,nb_rb,dlsch->rb_alloc,mod_order,num_pdcch_symbols,phy_vars_ue->frame,subframe); if (harq_process->round == 0) { // This is a new packet, so compute quantities regarding segmentation harq_process->B = A+24; - #ifdef TD_DECODING - 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 - nr_segmentation(NULL, - NULL, - harq_process->B, - &harq_process->C, - &harq_process->Kplus, - &harq_process->Kminus, - &harq_process->Z, - &harq_process->F); - p_decParams->Z = harq_process->Z; - #endif + + nr_segmentation(NULL, + NULL, + harq_process->B, + &harq_process->C, + &harq_process->K, + &harq_process->Z, + &harq_process->F); + p_decParams->Z = harq_process->Z; } - // p_decParams->Z = 128; - p_decParams->BG = 1; - p_decParams->R = 89; - p_decParams->numMaxIter = 2; - Kr = p_decParams->Z*22; - p_decParams->outMode= 0; + kb = harq_process->K/harq_process->Z; + if ( kb==22){ + p_decParams->BG = 1; + p_decParams->R = 89; + kc = 68; + } + else{ + p_decParams->BG = 2; + p_decParams->R = 13; + kc = 52; + } + + p_decParams->numMaxIter = 2; + Kr = p_decParams->Z*kb; + p_decParams->outMode= 0; /* else { @@ -1753,15 +1436,7 @@ uint32_t dlsch_decoding_2thread0(void *arg) 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: + case 106: bw_scaling =2; break; @@ -1781,67 +1456,32 @@ uint32_t dlsch_decoding_2thread0(void *arg) opp_enabled=1; Qm= harq_process->Qm; - Nl=harq_process->Nl; - //r_thread = harq_process->C/2-1; - C= harq_process->C; + Nl=harq_process->Nl; + //r_thread = harq_process->C/2-1; + C= harq_process->C; - Gp = G/Nl/Qm; - GpmodC = Gp%C; + Cprime = C; //assume CBGTI not present - - - if ((C/2-1) < (C-(GpmodC))) - r_offset = Nl*Qm * (Gp/C); - else - r_offset = Nl*Qm * ((GpmodC==0?0:1) + (Gp/C)); + if (r <= Cprime - ((G/(Nl*Qm))%Cprime) - 1) + r_offset = Nl*Qm*(G/(Nl*Qm*Cprime)); + else + r_offset = Nl*Qm*((G/(Nl*Qm*Cprime))+1); // printf("thread0 r_offset %d\n",r_offset); //for (r=(harq_process->C/2); rC; r++) { r=1; //(harq_process->C/2); - // Get Turbo interleaver parameters -#ifdef TD_DECODING - if (rCminus) - Kr = harq_process->Kminus; - else - Kr = harq_process->Kplus; -#else - Kr = harq_process->Kplus; -#endif - Kr_bytes = Kr>>3; + Kr = harq_process->K; + Kr_bytes = Kr>>3; + K_bytes_F = Kr_bytes-(harq_process->F>>3); - //workaround for nr ldpc using lte interleaving - if (dlsch->harq_processes[harq_pid]->C >= 2) - Kr_int = G/(3*dlsch->harq_processes[harq_pid]->C); - else - Kr_int = Kr; - - 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_ldpc_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 + Tbslbrm = nr_compute_tbs(28,nb_rb,frame_parms->symbols_per_slot,0,0, harq_process->Nl); #if UE_TIMING_TRACE start_meas(dlsch_rate_unmatching_stats); #endif - memset(&dummy_w[r][0],0,3*(8448+64)*sizeof(short)); - harq_process->RTC[r] = generate_dummy_w(Kr_int, - (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", @@ -1858,21 +1498,20 @@ uint32_t dlsch_decoding_2thread0(void *arg) #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 (nr_rate_matching_ldpc_rx(Ilbrm, + Tbslbrm, + p_decParams->BG, + p_decParams->Z, + G, + harq_process->w[r], + dlsch_llr+r_offset, + harq_process->C, + 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 @@ -1886,32 +1525,30 @@ uint32_t dlsch_decoding_2thread0(void *arg) } r_offset += E; - /* - printf("Subblock deinterleaving, d %p w %p\n", - harq_process->d[r], - harq_process->w); - */ + //for (int i =0; i<16; i++) + // printf("rx output ratematching w[%d]= %d r_offset %d\n", i,harq_process->w[r][i], r_offset); + #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]); + nr_deinterleaving_ldpc(E, + harq_process->Qm, + harq_process->d[r], + 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); + write_output("decoder_in.m","dec",&harq_process->d[0][0],(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");*/ + printf("%d : %d\n",i,harq_process->d[r][i]); + printf("\n"); #endif @@ -1924,16 +1561,7 @@ uint32_t dlsch_decoding_2thread0(void *arg) 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) { /* @@ -1949,58 +1577,38 @@ uint32_t dlsch_decoding_2thread0(void *arg) 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); -#ifdef TD_DECODING - ret = tc - (&harq_process->d[r][96], - harq_process->c[r], - Kr, - f1f2mat_old[iind*2], - f1f2mat_old[(iind*2)+1], - dlsch->max_ldpc_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); - -#else + for (int cnt =0; cnt < (kc-2)*p_decParams->Z; cnt++){ + inv_d[cnt] = (1)*harq_process->d[r][cnt]; + } - memset(pv,0,2*p_decParams->Z*sizeof(int16_t)); + memset(pv,0,2*p_decParams->Z*sizeof(int16_t)); //memset(pl,0,2*p_decParams->Z*sizeof(int8_t)); + memset((pv+K_bytes_F),127,harq_process->F*sizeof(int16_t)); - //if (A < 1000){ - - for (i=2*p_decParams->Z/8, j = 0; i < (68*p_decParams->Z/8+1); i++, j++) + for (i=((2*p_decParams->Z)>>3), j = 0; i < K_bytes_F+((2*p_decParams->Z)>>3); i++, j++) { pv[i]= _mm_loadu_si128((__m128i*)(&inv_d[8*j])); } - /*} - else{ - for (i=2*p_decParams->Z/8, j = 0; i < (68*p_decParams->Z/8+1); i++, j++) + + for (i=Kr_bytes+((2*p_decParams->Z)>>3),j=Kr_bytes; i < ((kc*p_decParams->Z)>>3); i++, j++) + { + pv[i]= _mm_loadu_si128((__m128i*)(&inv_d[8*j])); + } + + for (i=0, j=0; j < ((kc*p_decParams->Z)>>4); i+=2, j++) { - pv[i]= _mm_loadu_si128((__m128i*)&harq_process->d[r][96+8*j]); - } - }*/ - for (i=0, j=0; j < (68*p_decParams->Z/16); i+=2, j++) - { - //printf("mm packs i %d j %d\n", i, j); - //print128_num(pv[i]); - //print128_num(pv[i+1]); + pl[j] = _mm_packs_epi16(pv[i],pv[i+1]); - //print128_num2bytes(pl[j]); + } no_iteration_ldpc = nrLDPC_decoder(p_decParams, - &pl[0], - llrProcBuf, - p_procTime); + (int8_t*)&pl[0], + llrProcBuf, + p_procTime); - if (no_iteration_ldpc > 2) + if (no_iteration_ldpc > 10) printf("Error number of iteration LPDC %d\n", no_iteration_ldpc); //else //printf("OK number of iteration LPDC %d\n", no_iteration_ldpc); @@ -2025,160 +1633,11 @@ uint32_t dlsch_decoding_2thread0(void *arg) } printf(" \n");*/ -#endif #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_ldpc_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_ldpc_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_ldpc_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_ldpc_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_ldpc_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_ldpc_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); @@ -2305,12 +1764,13 @@ uint32_t dlsch_decoding_2thread0(void *arg) #ifdef UE_DLSCH_PARALLELISATION #define FIFO_PRIORITY 39 -uint32_t dlsch_decoding_2thread1(void *arg) +void *nr_dlsch_decoding_2thread1(void *arg) { static __thread int UE_dlsch_td_retval1; - struct rx_tx_thread_data *rtd = arg; - UE_rxtx_proc_t *proc = rtd->proc; + struct nr_rxtx_thread_data *rtd = arg; + UE_nr_rxtx_proc_t *proc = rtd->proc; PHY_VARS_NR_UE *phy_vars_ue = rtd->UE; + NR_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms; int llr8_flag1; int32_t no_iteration_ldpc; @@ -2322,10 +1782,17 @@ uint32_t dlsch_decoding_2thread1(void *arg) int8_t l [68*384]; //__m128i l; int16_t inv_d [68*384]; - int16_t *p_invd =&inv_d; + //int16_t *p_invd =&inv_d; + uint8_t kb, kc; + uint8_t Ilbrm = 0; + uint32_t Tbslbrm = 950984; + uint16_t nb_rb = 30; //to update + uint16_t nb_symb_sch = 12; + uint8_t nb_re_dmrs = 6; + uint16_t length_dmrs = 1; uint32_t i,j; - uint32_t k; + //uint32_t k; __m128i *pv = (__m128i*)&z; __m128i *pl = (__m128i*)&l; @@ -2355,51 +1822,15 @@ uint32_t dlsch_decoding_2thread1(void *arg) 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*(8448+64)]; - uint32_t r,r_offset=0,Kr,Kr_bytes,err_flag=0,Kr_int; - uint8_t crc_type; - uint8_t C; - uint8_t Qm; - uint8_t Nl; - uint32_t Er, Gp,GpmodC; -#ifdef DEBUG_DLSCH_DECODING - uint16_t i; -#endif - //#ifdef __AVX2__ - - uint8_t (*tc)(int16_t *y, - 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 *); - if (llr8_flag1 == 0) { - //#ifdef __AVX2__ -#if 0 - tc_2cw = phy_threegpplte_turbo_decoder16avx2; -#endif - tc = phy_threegpplte_turbo_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 = phy_threegpplte_turbo_decoder8; - } + uint32_t A,E; + uint32_t G; + uint32_t ret,offset; + uint32_t r,r_offset=0,Kr,Kr_bytes,err_flag=0,K_bytes_F; + uint8_t crc_type; + uint8_t C,Cprime; + uint8_t Qm; + uint8_t Nl; + //uint32_t Er; init_thread(900000,1000000 , FIFO_PRIORITY-1, &cpuset, threadname); printf("2thread1 oai_exit %d\n", oai_exit); @@ -2426,23 +1857,20 @@ uint32_t dlsch_decoding_2thread1(void *arg) wait++; } - //proc->decoder_thread_available1 = 0; - + //proc->decoder_thread_available1 = 0; //PHY_VARS_NR_UE *phy_vars_ue = tdp->UE; - int eNB_id = proc->eNB_id; - int harq_pid = proc->harq_pid; - llr8_flag1 = proc->llr8_flag; - //r_offset = proc->Er; - //UE_rxtx_proc_t *proc = tdp->proc; - int frame = proc->frame_rx; - int subframe = proc->nr_tti_rx; - NR_UE_DLSCH_t *dlsch = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]; - NR_DL_UE_HARQ_t *harq_process = dlsch->harq_processes[harq_pid]; - short *dlsch_llr = phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[0]; - //printf("2thread0 llr flag %d tdp flag %d\n",llr8_flag1, tdp->llr8_flag); - //printf("2thread1 nr_tti_tx %d subframe %d SF thread id %d r_offset %d\n", proc->nr_tti_rx, subframe, phy_vars_ue->current_thread_id[subframe], r_offset); - - // nb_rb = dlsch->nb_rb; + int eNB_id = proc->eNB_id; + int harq_pid = proc->harq_pid; + llr8_flag1 = proc->llr8_flag; + //r_offset = proc->Er; + //UE_rxtx_proc_t *proc = tdp->proc; + int frame = proc->frame_rx; + int subframe = proc->nr_tti_rx; + NR_UE_DLSCH_t *dlsch = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]; + NR_DL_UE_HARQ_t *harq_process = dlsch->harq_processes[harq_pid]; + short *dlsch_llr = phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[0]; + //printf("2thread0 llr flag %d tdp flag %d\n",llr8_flag1, tdp->llr8_flag); + //printf("2thread1 nr_tti_tx %d subframe %d SF thread id %d r_offset %d\n", proc->nr_tti_rx, subframe, phy_vars_ue->current_thread_id[subframe], r_offset); /* if (nb_rb > frame_parms->N_RB_DL) { @@ -2457,14 +1885,16 @@ uint32_t dlsch_decoding_2thread1(void *arg) } */ - + nb_rb = harq_process->nb_rb; harq_process->trials[harq_process->round]++; + harq_process->TBS = nr_compute_tbs(harq_process->mcs,nb_rb,nb_symb_sch,nb_re_dmrs,length_dmrs, harq_process->Nl); A = harq_process->TBS; //2072 for QPSK 1/3 ret = dlsch->max_ldpc_iterations; + harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, harq_process->Qm,harq_process->Nl); G = harq_process->G; //get_G(frame_parms,nb_rb,dlsch->rb_alloc,mod_order,num_pdcch_symbols,phy_vars_ue->frame,subframe); @@ -2474,38 +1904,32 @@ uint32_t dlsch_decoding_2thread1(void *arg) if (harq_process->round == 0) { // This is a new packet, so compute quantities regarding segmentation harq_process->B = A+24; -#ifdef TD_DECODING - 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 - nr_segmentation(NULL, - NULL, - harq_process->B, - &harq_process->C, - &harq_process->Kplus, - &harq_process->Kminus, - &harq_process->Z, - &harq_process->F); - p_decParams->Z = harq_process->Z; - - #endif + nr_segmentation(NULL, + NULL, + harq_process->B, + &harq_process->C, + &harq_process->K, + &harq_process->Z, + &harq_process->F); + p_decParams->Z = harq_process->Z; } - // p_decParams->Z = 128; - p_decParams->BG = 1; - p_decParams->R = 89; - p_decParams->numMaxIter = 2; - Kr = p_decParams->Z*22; - p_decParams->outMode= 0; + kb = harq_process->K/harq_process->Z; + if ( kb==22){ + p_decParams->BG = 1; + p_decParams->R = 89; + kc = 68; + } + else{ + p_decParams->BG = 2; + p_decParams->R = 13; + kc = 52; + } + + p_decParams->numMaxIter = 2; + Kr = p_decParams->Z*kb; + p_decParams->outMode= 0; /* else { printf("dlsch_decoding.c: Ndi>0 not checked yet!!\n"); @@ -2519,15 +1943,7 @@ uint32_t dlsch_decoding_2thread1(void *arg) 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: + case 106: bw_scaling =2; break; @@ -2547,19 +1963,16 @@ uint32_t dlsch_decoding_2thread1(void *arg) opp_enabled=1; Qm= harq_process->Qm; - Nl=harq_process->Nl; - //r_thread = harq_process->C/2-1; - C= harq_process->C; + Nl=harq_process->Nl; + //r_thread = harq_process->C/2-1; + C= harq_process->C; - Gp = G/Nl/Qm; - GpmodC = Gp%C; + Cprime = C; //assume CBGTI not present - - - if ((C/2-1) < (C-(GpmodC))) - r_offset = Nl*Qm * (Gp/C); - else - r_offset = Nl*Qm * ((GpmodC==0?0:1) + (Gp/C)); + if (r <= Cprime - ((G/(Nl*Qm))%Cprime) - 1) + r_offset = Nl*Qm*(G/(Nl*Qm*Cprime)); + else + r_offset = Nl*Qm*((G/(Nl*Qm*Cprime))+1); //printf("sub thread r_offset %d\n", r_offset); @@ -2569,48 +1982,15 @@ uint32_t dlsch_decoding_2thread1(void *arg) //printf("thread1 r=%d r_offset %d \n",r, r_offset); - // Get Turbo interleaver parameters -#ifdef TD_DECODING - if (rCminus) - Kr = harq_process->Kminus; - else - Kr = harq_process->Kplus; -#else - Kr = harq_process->Kplus; -#endif + Kr = harq_process->K; + Kr_bytes = Kr>>3; + K_bytes_F = Kr_bytes-(harq_process->F>>3); - Kr_bytes = Kr>>3; - - //workaround for nr ldpc using lte interleaving - if (dlsch->harq_processes[harq_pid]->C >= 2) - Kr_int = G/(3*dlsch->harq_processes[harq_pid]->C); - else - Kr_int = Kr; - - 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_ldpc_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 + Tbslbrm = nr_compute_tbs(28,nb_rb,frame_parms->symbols_per_slot,0,0, harq_process->Nl); #if UE_TIMING_TRACE start_meas(dlsch_rate_unmatching_stats); #endif - memset(&dummy_w[r][0],0,3*(8448+64)*sizeof(short)); - harq_process->RTC[r] = generate_dummy_w(Kr_int, - (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", @@ -2627,21 +2007,20 @@ uint32_t dlsch_decoding_2thread1(void *arg) #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 (nr_rate_matching_ldpc_rx(Ilbrm, + Tbslbrm, + p_decParams->BG, + p_decParams->Z, + G, + harq_process->w[r], + dlsch_llr+r_offset, + harq_process->C, + 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 @@ -2663,24 +2042,23 @@ uint32_t dlsch_decoding_2thread1(void *arg) #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]); + nr_deinterleaving_ldpc(E, + harq_process->Qm, + harq_process->d[r], + 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); + write_output("decoder_in.m","dec",&harq_process->d[0][0],(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");*/ + printf("%d : %d\n",i,harq_process->d[r][i]); + printf("\n"); #endif @@ -2693,17 +2071,6 @@ uint32_t dlsch_decoding_2thread1(void *arg) 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", @@ -2718,50 +2085,34 @@ uint32_t dlsch_decoding_2thread1(void *arg) 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); -#ifdef TD_DECODING - ret = tc - (&harq_process->d[r][96], - harq_process->c[r], - Kr, - f1f2mat_old[iind*2], - f1f2mat_old[(iind*2)+1], - dlsch->max_ldpc_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); - -#else memset(pv,0,2*p_decParams->Z*sizeof(int16_t)); //memset(pl,0,2*p_decParams->Z*sizeof(int8_t)); + memset((pv+K_bytes_F),127,harq_process->F*sizeof(int16_t)); - - for (i=2*p_decParams->Z/8, j = 0; i < (68*p_decParams->Z/8+1); i++, j++) + for (i=((2*p_decParams->Z)>>3), j = 0; i < K_bytes_F+((2*p_decParams->Z)>>3); i++, j++) { pv[i]= _mm_loadu_si128((__m128i*)(&inv_d[8*j])); } - - for (i=0, j=0; j < (68*p_decParams->Z/16); i+=2, j++) + + for (i=Kr_bytes+((2*p_decParams->Z)>>3),j=Kr_bytes; i < ((kc*p_decParams->Z)>>3); i++, j++) + { + pv[i]= _mm_loadu_si128((__m128i*)(&inv_d[8*j])); + } + + for (i=0, j=0; j < ((kc*p_decParams->Z)>>4); i+=2, j++) { - //printf("mm packs i %d j %d\n", i, j); - //print128_num(pv[i]); - //print128_num(pv[i+1]); + pl[j] = _mm_packs_epi16(pv[i],pv[i+1]); - //print128_num2bytes(pl[j]); + } no_iteration_ldpc = nrLDPC_decoder(p_decParams, - &pl[0], - llrProcBuf, - p_procTime); + (int8_t*)&pl[0], + llrProcBuf, + p_procTime); - if (no_iteration_ldpc > 2) + if (no_iteration_ldpc > 10) printf("Error number of iteration LPDC %d\n", no_iteration_ldpc); //else // printf("OK number of iteration LPDC %d\n", no_iteration_ldpc); @@ -2795,154 +2146,6 @@ uint32_t dlsch_decoding_2thread1(void *arg) 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_ldpc_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_ldpc_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_ldpc_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_ldpc_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_ldpc_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_ldpc_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); @@ -2957,96 +2160,8 @@ uint32_t dlsch_decoding_2thread1(void *arg) subframe_rx_prev += 10; } frame_rx_prev = frame_rx_prev%1024;*/ -#if 0 - if (err_flag == 1) { -//#if UE_DEBUG_TRACE - LOG_I(PHY,"[UE %d] THREAD 0 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_ldpc_iterations)); - } else { -#if UE_DEBUG_TRACE - LOG_I(PHY,"[UE %d] THREAD 0 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); - } -#endif - proc->decoder_thread_available1 = 1; //proc->decoder_main_available = 0; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h index 279f9fb17a..a6aef15128 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h @@ -32,6 +32,7 @@ #ifndef __NR_TRANSPORT_PROTO_UE__H__ #define __NR_TRANSPORT_PROTO_UE__H__ #include "PHY/defs_nr_UE.h" +#include "SCHED_NR_UE/defs.h" //#include "PHY/LTE_TRANSPORT/transport_common_proto.h" #include #include "nfapi_interface.h" @@ -1005,6 +1006,23 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, uint8_t is_crnti, uint8_t llr8_flag); +uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue, + UE_nr_rxtx_proc_t *proc, + int eNB_id, + short *dlsch_llr, + NR_DL_FRAME_PARMS *frame_parms, + NR_UE_DLSCH_t *dlsch, + NR_DL_UE_HARQ_t *harq_process, + uint32_t frame, + uint8_t nr_tti_rx, + uint8_t harq_pid, + uint8_t is_crnti, + uint8_t llr8_flag); + +void *nr_dlsch_decoding_2thread0(void *arg); + +void *nr_dlsch_decoding_2thread1(void *arg); + void nr_dlsch_unscrambling(int16_t* llr, uint8_t size, uint8_t q, diff --git a/openair1/SCHED_NR_UE/defs.h b/openair1/SCHED_NR_UE/defs.h index 126fccb1b2..4f94e8504c 100644 --- a/openair1/SCHED_NR_UE/defs.h +++ b/openair1/SCHED_NR_UE/defs.h @@ -112,7 +112,7 @@ int phy_procedures_RN_UE_RX(unsigned char last_slot, unsigned char next_slot, re @param mode calib/normal mode @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ -void phy_procedures_UE_TX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type); +void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type); /*! \brief Scheduling for UE RX procedures in normal subframes. @param last_slot Index of last slot (0-19) @param phy_vars_ue Pointer to UE variables on which to act @@ -124,7 +124,7 @@ void phy_procedures_UE_TX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eNB @param phy_vars_rn pointer to RN variables */ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,uint8_t do_pdcch_flag,runmode_t mode,relaying_type_t r_type); -int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,uint8_t do_pdcch_flag,runmode_t mode,relaying_type_t r_type); +int phy_procedures_slot_parallelization_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,uint8_t do_pdcch_flag,runmode_t mode,relaying_type_t r_type); #ifdef UE_SLOT_PARALLELISATION void *UE_thread_slot1_dl_processing(void *arg); @@ -136,7 +136,7 @@ void *UE_thread_slot1_dl_processing(void *arg); @param abstraction_flag Indicator of PHY abstraction @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ -void phy_procedures_UE_S_TX(PHY_VARS_NR_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag,relaying_type_t r_type); +//void phy_procedures_UE_S_TX(PHY_VARS_NR_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag,relaying_type_t r_type); /*! \brief Scheduling for UE RX procedures in TDD S-subframes. @param phy_vars_ue Pointer to UE variables on which to act @@ -144,7 +144,7 @@ void phy_procedures_UE_S_TX(PHY_VARS_NR_UE *ue,uint8_t eNB_id,uint8_t abstractio @param abstraction_flag Indicator of PHY abstraction @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ -void phy_procedures_UE_S_RX(PHY_VARS_NR_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag, relaying_type_t r_type); +//void phy_procedures_UE_S_RX(PHY_VARS_NR_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag, relaying_type_t r_type); /*! \brief Function to compute subframe type as a function of Frame type and TDD Configuration (implements Table 4.2.2 from 36.211, p.11 from version 8.6) and subframe index. diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index c3883a99a2..77abd91a5a 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -40,7 +40,7 @@ #include "PHY/phy_extern_nr_ue.h" #include "PHY/NR_REFSIG/refsig_defs_ue.h" #include "PHY/MODULATION/modulation_UE.h" -//#include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h" +#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h" //#include "PHY/extern.h" #include "SCHED_NR_UE/defs.h" #include "SCHED_NR/extern.h" @@ -3936,7 +3936,7 @@ void ue_pmch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc,int eNB_id,i ue->pdsch_vars_MCH[0]->llr[0],0,nr_tti_rx<<1); #ifdef UE_DLSCH_PARALLELISATION - ret = dlsch_decoding_mthread(ue,proc, eNB_id, + ret = nr_dlsch_decoding_mthread(ue,proc, eNB_id, ue->pdsch_vars_MCH[0]->llr[0], &ue->frame_parms, ue->dlsch_MCH[0], @@ -3946,7 +3946,7 @@ void ue_pmch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc,int eNB_id,i 0, 0,1); #else - ret = dlsch_decoding(ue, + ret = nr_dlsch_decoding(ue, ue->pdsch_vars_MCH[0]->llr[0], &ue->frame_parms, ue->dlsch_MCH[0], @@ -4370,7 +4370,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, #endif #ifdef UE_DLSCH_PARALLELISATION - ret = dlsch_decoding_mthread(ue,proc,eNB_id, + ret = nr_dlsch_decoding_mthread(ue,proc,eNB_id, pdsch_vars->llr[0], &ue->frame_parms, dlsch0, @@ -4446,7 +4446,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, #endif #ifdef UE_DLSCH_PARALLELISATION - ret1 = dlsch_decoding_mthread(ue,proc, eNB_id, + ret1 = nr_dlsch_decoding_mthread(ue,proc, eNB_id, pdsch_vars->llr[1], &ue->frame_parms, dlsch1, @@ -4958,7 +4958,7 @@ void *UE_thread_slot1_dl_processing(void *arg) { #endif #ifdef UE_SLOT_PARALLELISATION -int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eNB_id, +int phy_procedures_slot_parallelization_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eNB_id, uint8_t abstraction_flag,uint8_t do_pdcch_flag,runmode_t mode, relaying_type_t r_type) { diff --git a/targets/RT/USER/nr-ue.c b/targets/RT/USER/nr-ue.c index a8d0005192..ea260e1b45 100644 --- a/targets/RT/USER/nr-ue.c +++ b/targets/RT/USER/nr-ue.c @@ -680,7 +680,7 @@ static void *UE_thread_rxn_txnp4(void *arg) { //clean previous FAPI MESSAGE #ifdef UE_SLOT_PARALLELISATION - phy_procedures_slot_parallelization_UE_RX( UE, proc, 0, 0, 1, UE->mode, no_relay, NULL ); + phy_procedures_slot_parallelization_nrUE_RX( UE, proc, 0, 0, 1, UE->mode, no_relay, NULL ); #else phy_procedures_nrUE_RX( UE, proc, 0, 0, 1, UE->mode, no_relay); printf(">>> nr_ue_pdcch_procedures ended\n"); @@ -1187,11 +1187,11 @@ void init_UE_threads(PHY_VARS_NR_UE *UE) { #ifdef UE_DLSCH_PARALLELISATION pthread_mutex_init(&UE->proc.proc_rxtx[i].mutex_dlsch_td,NULL); pthread_cond_init(&UE->proc.proc_rxtx[i].cond_dlsch_td,NULL); - pthread_create(&UE->proc.proc_rxtx[i].pthread_dlsch_td,NULL,dlsch_decoding_2thread0, rtd); + pthread_create(&UE->proc.proc_rxtx[i].pthread_dlsch_td,NULL,nr_dlsch_decoding_2thread0, rtd); //thread 2 pthread_mutex_init(&UE->proc.proc_rxtx[i].mutex_dlsch_td1,NULL); pthread_cond_init(&UE->proc.proc_rxtx[i].cond_dlsch_td1,NULL); - pthread_create(&UE->proc.proc_rxtx[i].pthread_dlsch_td1,NULL,dlsch_decoding_2thread1, rtd); + pthread_create(&UE->proc.proc_rxtx[i].pthread_dlsch_td1,NULL,nr_dlsch_decoding_2thread1, rtd); #endif #ifdef UE_SLOT_PARALLELISATION From a7bdbc4d6f52935c7f748390b3acbd23e532681c Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Wed, 28 Nov 2018 10:47:52 +0100 Subject: [PATCH 099/117] activate nr pbch procedure --- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 85 ++++++++------------- 1 file changed, 33 insertions(+), 52 deletions(-) diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 77abd91a5a..e594b9a747 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -2906,14 +2906,15 @@ void restart_phy(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc, uint8_t eNB_id,uint //ue->bitrate[eNB_id] = 0; //ue->total_received_bits[eNB_id] = 0; } +#endif //(0) - -void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc, uint8_t abstraction_flag) +void nr_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc, uint8_t abstraction_flag) { // int i; - int pbch_tx_ant=0; - uint8_t pbch_phase; + //int pbch_tx_ant=0; + //uint8_t pbch_phase; + int ret = 0; uint16_t frame_tx; static uint8_t first_run = 1; uint8_t pbch_trials = 0; @@ -2925,49 +2926,36 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *pro VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_FUNCTION_IN); - pbch_phase=(frame_rx%4); + /*pbch_phase=(frame_rx%4); if (pbch_phase>=4) - pbch_phase=0; + pbch_phase=0;*/ for (pbch_trials=0; pbch_trials<4; pbch_trials++) { //for (pbch_phase=0;pbch_phase<4;pbch_phase++) { //LOG_I(PHY,"[UE %d] Frame %d, Trying PBCH %d (NidCell %d, eNB_id %d)\n",ue->Mod_id,frame_rx,pbch_phase,ue->frame_parms.Nid_cell,eNB_id); if (abstraction_flag == 0) { - pbch_tx_ant = rx_pbch(ue, proc, + ret = nr_rx_pbch(ue, proc, ue->pbch_vars[eNB_id], &ue->frame_parms, eNB_id, - ue->frame_parms.mode1_flag==1?SISO:ALAMOUTI, - ue->high_speed_flag, - pbch_phase); - - - + SISO, + ue->high_speed_flag); } -#ifdef PHY_ABSTRACTION - else { - pbch_tx_ant = rx_pbch_emul(ue, - eNB_id, - pbch_phase); - } - -#endif - - if ((pbch_tx_ant>0) && (pbch_tx_ant<=4)) { + if (ret==0) { break; } - pbch_phase++; + /*pbch_phase++; if (pbch_phase>=4) - pbch_phase=0; + pbch_phase=0;*/ } - if ((pbch_tx_ant>0) && (pbch_tx_ant<=4)) { + if (ret==0) { if (opt_enabled) { static uint8_t dummy[3]; @@ -2980,17 +2968,10 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *pro ue->Mod_id, nr_tti_rx); } - if (pbch_tx_ant>2) { - LOG_W(PHY,"[openair][SCHED][SYNCH] PBCH decoding: pbch_tx_ant>2 not supported\n"); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_FUNCTION_OUT); - return; - } - - ue->pbch_vars[eNB_id]->pdu_errors_conseq = 0; - frame_tx = (((int)(ue->pbch_vars[eNB_id]->decoded_output[2]&0x03))<<8); + /*frame_tx = (((int)(ue->pbch_vars[eNB_id]->decoded_output[2]&0x03))<<8); frame_tx += ((int)(ue->pbch_vars[eNB_id]->decoded_output[1]&0xfc)); - frame_tx += pbch_phase; + frame_tx += pbch_phase;*/ //if (ue->mac_enabled==1) { //mac_xface->dl_phy_sync_success(ue->Mod_id,frame_rx,eNB_id,first_run); @@ -3011,13 +2992,11 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *pro ue->proc.proc_rxtx[th_id].frame_rx = proc->frame_rx; ue->proc.proc_rxtx[th_id].frame_tx = proc->frame_tx; - printf("[UE %d] frame %d, nr_tti_rx %d: Adjusting frame counter (PBCH ant_tx=%d, frame_tx=%d, phase %d, rx_offset %d) => new frame %d\n", + printf("[UE %d] frame %d, nr_tti_rx %d: Adjusting frame counter (PBCH frame_tx=%d, rx_offset %d) => new frame %d\n", ue->Mod_id, ue->proc.proc_rxtx[th_id].frame_rx, nr_tti_rx, - pbch_tx_ant, frame_tx, - pbch_phase, ue->rx_offset, proc->frame_rx); } @@ -3027,14 +3006,12 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *pro } else if (((frame_tx & 0x03FF) != (proc->frame_rx & 0x03FF))) { //(pbch_tx_ant != ue->frame_parms.nb_antennas_tx)) { - LOG_D(PHY,"[UE %d] frame %d, nr_tti_rx %d: Re-adjusting frame counter (PBCH ant_tx=%d, frame_rx=%d, frame%%1024=%d, phase %d).\n", + LOG_D(PHY,"[UE %d] frame %d, nr_tti_rx %d: Re-adjusting frame counter (PBCH frame_rx=%d, frame%%1024=%d).\n", ue->Mod_id, proc->frame_rx, nr_tti_rx, - pbch_tx_ant, frame_tx, - frame_rx & 0x03FF, - pbch_phase); + frame_rx & 0x03FF); proc->frame_rx = (proc->frame_rx & 0xFFFFFC00) | (frame_tx & 0x000003FF); proc->frame_tx = proc->frame_rx; @@ -3049,16 +3026,12 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *pro } #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] frame %d, nr_tti_rx %d, Received PBCH (MIB): mode1_flag %d, tx_ant %d, frame_tx %d. N_RB_DL %d, phich_duration %d, phich_resource %d/6!\n", + LOG_D(PHY,"[UE %d] frame %d, nr_tti_rx %d, Received PBCH (MIB): frame_tx %d. N_RB_DL %d\n", ue->Mod_id, frame_rx, nr_tti_rx, - ue->frame_parms.mode1_flag, - pbch_tx_ant, frame_tx, - ue->frame_parms.N_RB_DL, - ue->frame_parms.phich_config_common.phich_duration, - ue->frame_parms.phich_config_common.phich_resource); + ue->frame_parms.N_RB_DL); #endif } else { @@ -3109,7 +3082,6 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *pro } -#endif //(0) unsigned int get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb) { @@ -5816,10 +5788,19 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN //LOG_D(PHY," ------ end FFT/ChannelEst/PDCCH slot 1: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx); - /*if ( (nr_tti_rx == 0) && (ue->decode_MIB == 1)) + if ( (nr_tti_rx == 0) && (ue->decode_MIB == 1)) { - ue_pbch_procedures(eNB_id,ue,proc,abstraction_flag); - }*/ + for (int i=0; i<3; i++) + nr_slot_fep(ue, + (5+i), //mu=1 case B + nr_tti_rx, + 0, + 0, + 1, + NR_PBCH_EST); + + nr_ue_pbch_procedures(eNB_id,ue,proc,abstraction_flag); + } // do procedures for C-RNTI LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx); From b1de22736ff1fc5dc7c79c1d336603af4ab1bd71 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Wed, 28 Nov 2018 17:19:27 +0100 Subject: [PATCH 100/117] bug fix for nr_pbchsim compilation issue --- openair1/SCHED_NR_UE/defs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/SCHED_NR_UE/defs.h b/openair1/SCHED_NR_UE/defs.h index 4f94e8504c..ecd47c5792 100644 --- a/openair1/SCHED_NR_UE/defs.h +++ b/openair1/SCHED_NR_UE/defs.h @@ -154,7 +154,7 @@ void *UE_thread_slot1_dl_processing(void *arg); */ -nr_subframe_t nr_subframe_select(NR_DL_FRAME_PARMS *frame_parms,uint8_t subframe); +//nr_subframe_t nr_subframe_select(NR_DL_FRAME_PARMS *frame_parms,uint8_t subframe); /*! \brief Function to compute subframe type as a function of Frame type and TDD Configuration (implements Table 4.2.2 from 36.211, p.11 from version 8.6) and subframe index. Same as nr_subframe_select, except that it uses the Mod_id and is provided as a service to the MAC scheduler. From b615147488bbc06809aed92cafcb1ac7bff6c323 Mon Sep 17 00:00:00 2001 From: Hongzhi Date: Wed, 28 Nov 2018 20:03:51 +0100 Subject: [PATCH 101/117] minor fix in phy procedures --- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index e594b9a747..3feca138e9 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -40,7 +40,7 @@ #include "PHY/phy_extern_nr_ue.h" #include "PHY/NR_REFSIG/refsig_defs_ue.h" #include "PHY/MODULATION/modulation_UE.h" -#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h" +//#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h" //#include "PHY/extern.h" #include "SCHED_NR_UE/defs.h" #include "SCHED_NR/extern.h" From eff757f31d756b6eb47822e0b95909111f057473 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Thu, 29 Nov 2018 10:19:47 +0100 Subject: [PATCH 102/117] resetting num_dci to 0 in PHY --- openair1/SCHED_NR/fapi_nr_l1.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openair1/SCHED_NR/fapi_nr_l1.c b/openair1/SCHED_NR/fapi_nr_l1.c index 2df6471842..13140a1d27 100644 --- a/openair1/SCHED_NR/fapi_nr_l1.c +++ b/openair1/SCHED_NR/fapi_nr_l1.c @@ -104,6 +104,8 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){ int do_oai =0; int dont_send =0; + gNB->pdcch_vars.num_dci = 0; + gNB->pdcch_vars.num_pdsch_rnti = 0; for (i=0;idl_config_request_body.dl_config_pdu_list[i]; From 7124e685ccb91db5e6272be989f64c8ec98fc318 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Thu, 29 Nov 2018 10:20:38 +0100 Subject: [PATCH 103/117] re-activating optimized lpdc encoder --- openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index aa8b22fd6d..6359a7b12f 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -358,11 +358,8 @@ int nr_dlsch_encoding(unsigned char *a, printf("\n"); #endif - //&dlsch->harq_processes[harq_pid]->d[r][0] //channel_input[r] - //ldpc_encoder_orig((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],&dlsch->harq_processes[harq_pid]->d[r][0],Kr,1,3,0); - ldpc_encoder_orig((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],dlsch->harq_processes[harq_pid]->d[r],Kr,BG,0); - //ldpc_encoder((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],&dlsch->harq_processes[harq_pid]->d[r][0],Kr,1,3); - //ldpc_encoder_optim((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],(unsigned char*)&dlsch->harq_processes[harq_pid]->d[r][0],Kr,1,3,NULL,NULL,NULL,NULL); + //ldpc_encoder_orig((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],dlsch->harq_processes[harq_pid]->d[r],Kr,BG,0); + //ldpc_encoder_optim((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],(unsigned char*)&dlsch->harq_processes[harq_pid]->d[r][0],Kr,BG,NULL,NULL,NULL,NULL); } //for (int i=0;i<68*384;i++) @@ -376,7 +373,8 @@ int nr_dlsch_encoding(unsigned char *a, } printf("\n");*/ - //ldpc_encoder_optim_8seg(dlsch->harq_processes[harq_pid]->c,d_tmp,Kr,1,3,dlsch->harq_processes[harq_pid]->C,NULL,NULL,NULL,NULL); + ldpc_encoder_optim_8seg(dlsch->harq_processes[harq_pid]->c,d_tmp,Kr,BG,dlsch->harq_processes[harq_pid]->C,NULL,NULL,NULL,NULL); + //stop_meas(te_stats); //printf("end ldpc encoder -- output\n"); From cceab3e860392629a255e4d937d5610f0ad9bbcf Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Thu, 29 Nov 2018 16:40:00 +0100 Subject: [PATCH 104/117] cleaning up PBCH procedures --- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 195 ++------------------ 1 file changed, 20 insertions(+), 175 deletions(-) diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 8e2b3e1e49..5e1a62b53e 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -2927,105 +2927,16 @@ void nr_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t * VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_FUNCTION_IN); - /*pbch_phase=(frame_rx%4); - - if (pbch_phase>=4) - pbch_phase=0;*/ - - for (pbch_trials=0; pbch_trials<4; pbch_trials++) { - //for (pbch_phase=0;pbch_phase<4;pbch_phase++) { - //LOG_I(PHY,"[UE %d] Frame %d, Trying PBCH %d (NidCell %d, eNB_id %d)\n",ue->Mod_id,frame_rx,pbch_phase,ue->frame_parms.Nid_cell,eNB_id); - if (abstraction_flag == 0) { - ret = nr_rx_pbch(ue, proc, - ue->pbch_vars[eNB_id], - &ue->frame_parms, - eNB_id, - SISO, - ue->high_speed_flag); - } - - if (ret==0) { - break; - } - - /*pbch_phase++; - - if (pbch_phase>=4) - pbch_phase=0;*/ - } - - + //LOG_I(PHY,"[UE %d] Frame %d, Trying PBCH %d (NidCell %d, eNB_id %d)\n",ue->Mod_id,frame_rx,pbch_phase,ue->frame_parms.Nid_cell,eNB_id); + ret = nr_rx_pbch(ue, proc, + ue->pbch_vars[eNB_id], + &ue->frame_parms, + eNB_id, + SISO, + ue->high_speed_flag); if (ret==0) { - if (opt_enabled) { - static uint8_t dummy[3]; - dummy[0] = ue->pbch_vars[eNB_id]->decoded_output[2]; - dummy[1] = ue->pbch_vars[eNB_id]->decoded_output[1]; - dummy[2] = ue->pbch_vars[eNB_id]->decoded_output[0]; - trace_pdu(1, dummy, 3, ue->Mod_id, 0, 0, - frame_rx, nr_tti_rx, 0, 0); - LOG_D(OPT,"[UE %d][PBCH] Frame %d trace pdu for PBCH\n", - ue->Mod_id, nr_tti_rx); - } - - ue->pbch_vars[eNB_id]->pdu_errors_conseq = 0; - /*frame_tx = (((int)(ue->pbch_vars[eNB_id]->decoded_output[2]&0x03))<<8); - frame_tx += ((int)(ue->pbch_vars[eNB_id]->decoded_output[1]&0xfc)); - frame_tx += pbch_phase;*/ - - //if (ue->mac_enabled==1) { - //mac_xface->dl_phy_sync_success(ue->Mod_id,frame_rx,eNB_id,first_run); - //} - -#ifdef EMOS - //emos_dump_UE.frame_tx = frame_tx; - //emos_dump_UE.mimo_mode = ue->pbch_vars[eNB_id]->decoded_output[1]; -#endif - - if (first_run) { - first_run = 0; - - proc->frame_rx = (proc->frame_rx & 0xFFFFFC00) | (frame_tx & 0x000003FF); - proc->frame_tx = proc->frame_rx; - for(int th_id=0; th_idproc.proc_rxtx[th_id].frame_rx = proc->frame_rx; - ue->proc.proc_rxtx[th_id].frame_tx = proc->frame_tx; - - printf("[UE %d] frame %d, nr_tti_rx %d: Adjusting frame counter (PBCH frame_tx=%d, rx_offset %d) => new frame %d\n", - ue->Mod_id, - ue->proc.proc_rxtx[th_id].frame_rx, - nr_tti_rx, - frame_tx, - ue->rx_offset, - proc->frame_rx); - } - - - frame_rx = proc->frame_rx; - - } else if (((frame_tx & 0x03FF) != (proc->frame_rx & 0x03FF))) { - //(pbch_tx_ant != ue->frame_parms.nb_antennas_tx)) { - LOG_D(PHY,"[UE %d] frame %d, nr_tti_rx %d: Re-adjusting frame counter (PBCH frame_rx=%d, frame%%1024=%d).\n", - ue->Mod_id, - proc->frame_rx, - nr_tti_rx, - frame_tx, - frame_rx & 0x03FF); - - proc->frame_rx = (proc->frame_rx & 0xFFFFFC00) | (frame_tx & 0x000003FF); - proc->frame_tx = proc->frame_rx; - frame_rx = proc->frame_rx; - - for(int th_id=0; th_idproc.proc_rxtx[th_id].frame_rx = (proc->frame_rx & 0xFFFFFC00) | (frame_tx & 0x000003FF); - ue->proc.proc_rxtx[th_id].frame_tx = proc->frame_rx; - } - - } - #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d] frame %d, nr_tti_rx %d, Received PBCH (MIB): frame_tx %d. N_RB_DL %d\n", ue->Mod_id, @@ -3036,13 +2947,10 @@ void nr_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t * #endif } else { - /* LOG_E(PHY,"[UE %d] frame %d, nr_tti_rx %d, Error decoding PBCH!\n", - ue->Mod_id,frame_rx, nr_tti_rx); - - LOG_I(PHY,"[UE %d] rx_offset %d\n",ue->Mod_id,ue->rx_offset); - + ue->Mod_id,frame_rx, nr_tti_rx); + /* write_output("rxsig0.m","rxs0", ue->common_vars.rxdata[0],ue->frame_parms.samples_per_subframe,1,1); write_output("H00.m","h00",&(ue->common_vars.dl_ch_estimates[0][0][0]),((ue->frame_parms.Ncp==0)?7:6)*(ue->frame_parms.ofdm_symbol_size),1,1); @@ -3062,8 +2970,8 @@ void nr_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t * } else{ if (ue->pbch_vars[eNB_id]->pdu_errors_conseq>=100) { - LOG_E(PHY,"More that 100 consecutive PBCH errors! Exiting!\n"); - //mac_xface->macphy_exit("More that 100 consecutive PBCH errors!"); + LOG_E(PHY,"More that 100 consecutive PBCH errors! Exiting!\n"); + exit_fun("More that 100 consecutive PBCH errors! Exiting!\n"); } } } @@ -3646,7 +3554,7 @@ void nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB if (dlsch0 && (!dlsch1)) { harq_pid = dlsch0->current_harq_pid; - LOG_D(PHY,"[UE %d] PDSCH active in nr_tti_rx %d, harq_pid %d Symbol %d\n",ue->Mod_id,nr_tti_rx,harq_pid,m); + LOG_D(PHY,"[UE %d] PDSCH type %d active in nr_tti_rx %d, harq_pid %d Symbol %d\n",ue->Mod_id,pdsch,nr_tti_rx,harq_pid,m); if ((pdsch==PDSCH) && (ue->transmission_mode[eNB_id] == 5) && @@ -4199,15 +4107,16 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, } } -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d nr_tti_rx %d: PDSCH/DLSCH decoding iter %d (mcs %d, rv %d, TBS %d)\n", + //#ifdef DEBUG_PHY_PROC + LOG_I(PHY,"[UE %d][PDSCH %x/%d] Frame %d nr_tti_rx %d: PDSCH/DLSCH decoding iter %d/%d (mcs %d, rv %d, TBS %d)\n", ue->Mod_id, dlsch0->rnti,harq_pid, - frame_rx,nr_tti_rx,ret, + frame_rx,nr_tti_rx,ret,dlsch0->max_ldpc_iterations, dlsch0->harq_processes[harq_pid]->mcs, dlsch0->harq_processes[harq_pid]->rvidx, dlsch0->harq_processes[harq_pid]->TBS); +#ifdef DEBUG_PHY_PROC if (frame_rx%100==0) { LOG_D(PHY,"[UE %d][PDSCH %x] Frame %d nr_tti_rx %d dlsch_errors %d, dlsch_received %d, dlsch_fer %d, current_dlsch_cqi %d\n", ue->Mod_id,dlsch0->rnti, @@ -5141,6 +5050,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN LOG_D(PHY," ------ --> FFT/ChannelEst/PDCCH slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx); #endif +#ifdef NR_PDCCH_SCHED //nr_gold_pdcch(ue,0, 2); if (nr_tti_rx==1){ for (uint16_t l=0; lcommon_vars.common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx>>1]].rxdataF[0],ue->frame_parms.ofdm_symbol_size*2,1,1); - - //ue_measurement_procedures(l-1,ue,proc,eNB_id,(nr_tti_rx<<1),abstraction_flag,mode); - - //if (do_pdcch_flag) { - // if ((l==pilot1) || ((pmch_flag==1)&(l==l2))) { - // LOG_D(PHY,"[UE %d] Frame %d: Calling pdcch procedures (eNB %d)\n",ue->Mod_id,frame_rx,eNB_id); - - //start_meas(&ue->rx_pdcch_stats[ue->current_thread_id[nr_tti_rx]]); - - //printf(">>> at phy_procedures_nrUE_RX, nr_ue_pdcch_procedures init, dlsch->active=%d\n", - // ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active); if (nr_ue_pdcch_procedures(eNB_id,ue,proc,abstraction_flag) == -1) { LOG_E(PHY,"[UE %d] Frame %d, nr_tti_rx %d: Error in pdcch procedures\n",ue->Mod_id,frame_rx,nr_tti_rx); return(-1); } } - //for (int m=0;m<1000;m++) printf("%d",m); - //printf("\n>>> at phy_procedures_nrUE_RX, nr_ue_pdcch_procedures end, dlsch->active=%d\n", - // ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active); - - // preparing for PDSCH procedures - // if (ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active == 1) { - // ue_pdsch_procedures(ue, - // proc, - // eNB_id, - // PDSCH, - // ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0], - // NULL, - // ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->num_pdcch_symbols, - // ue->frame_parms.symbols_per_tti>>1, - // abstraction_flag); - // } -#if 0 - //stop_meas(&ue->rx_pdcch_stats[ue->current_thread_id[nr_tti_rx]]); - //printf("nr_tti_rx %d n_pdcch_sym %d pdcch procedures %5.3f \n", - // nr_tti_rx, ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->num_pdcch_symbols, - // (ue->rx_pdcch_stats[ue->current_thread_id[nr_tti_rx]].p_time)/(cpuf*1000.0)); - LOG_D(PHY,"num_pdcch_symbols %d\n",ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->num_pdcch_symbols); - // } - //} - - // } // for l=1..l2 - - - ue_measurement_procedures(l-1,ue,proc,eNB_id,(nr_tti_rx<<1),abstraction_flag,mode); +#endif //NR_PDCCH_SCHED - LOG_D(PHY," ------ end FFT/ChannelEst/PDCCH slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx); - // If this is PMCH, call procedures and return - if (pmch_flag == 1) { - ue_pmch_procedures(ue,proc,eNB_id,abstraction_flag); - return 0; - } - - nr_slot_fep(ue, - 0, - 1+(nr_tti_rx<<1), - 0, - 0, - 0, - NR_PDSCH_EST); -#endif - - // first slot has been processed (FFTs + Channel Estimation, PCFICH/PHICH/PDCCH) -#if UE_TIMING_TRACE - stop_meas(&ue->generic_stat); -#if DISABLE_LOG_X - printf("[SFN %d] Slot0: FFT + Channel Estimate + PCFICH/PHICH/PDCCH %5.2f \n",nr_tti_rx,ue->generic_stat.p_time/(cpuf*1000.0)); -#else - LOG_D(PHY, "[SFN %d] Slot0: FFT + Channel Estimate + PCFICH/PHICH/PDCCH %5.2f \n",nr_tti_rx,ue->generic_stat.p_time/(cpuf*1000.0)); -#endif - -#endif -//#if 0 LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx); if (nr_tti_rx==1){ @@ -5262,6 +5105,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN //set active for testing, to be removed ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active = 1; } + else + ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active = 0; #if UE_TIMING_TRACE start_meas(&ue->generic_stat); From a06671df9cd90e75cca27754407f9b0906b75ee2 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Fri, 30 Nov 2018 14:04:48 +0100 Subject: [PATCH 105/117] fixing some warnings and bugs. --- openair1/PHY/INIT/nr_init.c | 1 + openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 30 ++++++++++++--------- openair1/PHY/defs_gNB.h | 2 +- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 6702b34ca4..ef5716870e 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -24,6 +24,7 @@ #include "PHY/NR_REFSIG/nr_refsig.h" #include "PHY/INIT/phy_init.h" #include "PHY/CODING/nrPolar_tools/nr_polar_pbch_defs.h" +#include "PHY/NR_TRANSPORT/nr_transport.h" #include "RadioResourceConfigCommonSIB.h" #include "RadioResourceConfigDedicated.h" #include "TDD-Config.h" diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index 6359a7b12f..d5b905bcf0 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -152,7 +152,7 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(unsigned char Kmimo, } dlsch->txdataF[layer] = (int32_t *)malloc16((NR_MAX_PDSCH_ENCODED_LENGTH>>1)*sizeof(int32_t*)); - } + } for (int q=0; qmod_symbs[q] = (int32_t *)malloc16((NR_MAX_PDSCH_ENCODED_LENGTH>>1)*sizeof(int32_t*)); @@ -196,7 +196,7 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(unsigned char Kmimo, for (r=0; rharq_processes[i]->c[r] = (uint8_t*)malloc16(8448); - dlsch->harq_processes[i]->d[r] = (uint8_t*)malloc16(3*8448); + dlsch->harq_processes[i]->d[r] = (uint8_t*)malloc16(68*384); if (dlsch->harq_processes[i]->c[r]) { bzero(dlsch->harq_processes[i]->c[r],8448); } else { @@ -277,8 +277,8 @@ int nr_dlsch_encoding(unsigned char *a, nfapi_nr_dl_config_dlsch_pdu_rel15_t rel15 = dlsch->harq_processes[harq_pid]->dlsch_pdu.dlsch_pdu_rel15; uint16_t nb_rb = rel15.n_prb; uint8_t nb_symb_sch = rel15.nb_symbols; - uint16_t A, Z; - uint16_t *pz = &Z; + uint32_t A, Z; + uint32_t *pz = &Z; uint8_t mod_order = rel15.modulation_order; uint16_t Kr=0,r,r_offset=0;//Kr_bytes uint8_t *d_tmp[MAX_NUM_DLSCH_SEGMENTS]; @@ -288,8 +288,14 @@ int nr_dlsch_encoding(unsigned char *a, uint32_t Tbslbrm = 950984; //max tbs uint8_t nb_re_dmrs = rel15.nb_re_dmrs; uint16_t length_dmrs = 1; - uint8_t *channel_input[MAX_NUM_DLSCH_SEGMENTS]; //unsigned char + /* + uint8_t *channel_input[MAX_NUM_DLSCH_SEGMENTS]; //unsigned char + for(j=0;jharq_processes[harq_pid]->b,a,(A/8)+4); nr_segmentation(dlsch->harq_processes[harq_pid]->b, - dlsch->harq_processes[harq_pid]->c, - dlsch->harq_processes[harq_pid]->B, - &dlsch->harq_processes[harq_pid]->C, - &dlsch->harq_processes[harq_pid]->K, - pz, - &dlsch->harq_processes[harq_pid]->F); + dlsch->harq_processes[harq_pid]->c, + dlsch->harq_processes[harq_pid]->B, + &dlsch->harq_processes[harq_pid]->C, + &dlsch->harq_processes[harq_pid]->K, + pz, + &dlsch->harq_processes[harq_pid]->F); kb = dlsch->harq_processes[harq_pid]->K/(*pz); if ( kb==22){ @@ -347,7 +353,7 @@ int nr_dlsch_encoding(unsigned char *a, //start_meas(te_stats); for (r=0; rharq_processes[harq_pid]->C; r++) { d_tmp[r] = &dlsch->harq_processes[harq_pid]->d[r][0]; - channel_input[r] = &dlsch->harq_processes[harq_pid]->d[r][0]; + //channel_input[r] = &dlsch->harq_processes[harq_pid]->d[r][0]; #ifdef DEBUG_DLSCH_CODING printf("Encoder: B %d F %d \n",dlsch->harq_processes[harq_pid]->B, dlsch->harq_processes[harq_pid]->F); printf("start ldpc encoder segment %d/%d\n",r,dlsch->harq_processes[harq_pid]->C); diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 365ce8a99b..1c68b9e047 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -113,7 +113,7 @@ typedef struct { /// Modulated symbols buffer int32_t *mod_symbs[NR_MAX_NB_CODEWORDS]; /// beamforming weights for UE-spec transmission (antenna ports 5 or 7..14), for each codeword, maximum 4 layers? - int32_t **ue_spec_bf_weights[4]; + int32_t **ue_spec_bf_weights[NR_MAX_NB_LAYERS]; /// dl channel estimates (estimated from ul channel estimates) int32_t **calib_dl_ch_estimates; /// Allocated RNTI (0 means DLSCH_t is not currently used) From eb381216c880086651eb2fadbe9e6f788944e106 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Fri, 30 Nov 2018 16:55:18 +0100 Subject: [PATCH 106/117] adding check_crc. to be tested --- openair1/PHY/CODING/crc_byte.c | 67 +++++++++++++++++++ .../PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 3 +- 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/openair1/PHY/CODING/crc_byte.c b/openair1/PHY/CODING/crc_byte.c index b51d4b2016..652e8466b7 100644 --- a/openair1/PHY/CODING/crc_byte.c +++ b/openair1/PHY/CODING/crc_byte.c @@ -257,6 +257,73 @@ unsigned int crcPayload(unsigned char * inptr, int bitlen, uint32_t* crc256Table return crc; } +int check_crc(uint8_t* decoded_bytes, uint32_t n, uint32_t F, uint8_t crc_type) +{ + uint32_t crc,oldcrc; + uint8_t crc_len,temp; + + switch (crc_type) { + case CRC24_A: + case CRC24_B: + crc_len=3; + break; + + case CRC16: + crc_len=2; + break; + + case CRC8: + crc_len=1; + break; + + default: + crc_len=3; + } + + oldcrc= *((unsigned int *)(&decoded_bytes[(n>>3)-crc_len])); + + switch (crc_type) { + + case CRC24_A: + oldcrc&=0x00ffffff; + crc = crc24a(&decoded_bytes[F>>3], + n-24-F)>>8; + temp=((uint8_t *)&crc)[2]; + ((uint8_t *)&crc)[2] = ((uint8_t *)&crc)[0]; + ((uint8_t *)&crc)[0] = temp; + + break; + + case CRC24_B: + oldcrc&=0x00ffffff; + crc = crc24b(decoded_bytes, + n-24)>>8; + temp=((uint8_t *)&crc)[2]; + ((uint8_t *)&crc)[2] = ((uint8_t *)&crc)[0]; + ((uint8_t *)&crc)[0] = temp; + + break; + + case CRC16: + oldcrc&=0x0000ffff; + crc = crc16(decoded_bytes, + n-16)>>16; + + break; + + case CRC8: + oldcrc&=0x000000ff; + crc = crc8(decoded_bytes, + n-8)>>24; + break; + } + + if (crc == oldcrc) + return(1); + else + return(0); + +} #ifdef DEBUG_CRC diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index 3a0003c3ba..448c01c397 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -507,8 +507,9 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, (int8_t*)&pl[0], llrProcBuf, p_procTime); + /* - if (check_crc(llrProcBuf,Kr,crc_type)) { + if (check_crc(llrProcBuf,Kr,harq_process->F,crc_type)) { printf("CRC OK\n"); ret = 2; } From 751ad8e92585edab70d2f0a7ead2836da3ce5fce Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Mon, 3 Dec 2018 10:21:57 +0100 Subject: [PATCH 107/117] adding some visuals --- openair1/PHY/TOOLS/nr_phy_scope.c | 103 +++++++++++++----------------- targets/RT/USER/nr-uesoftmodem.c | 3 +- 2 files changed, 45 insertions(+), 61 deletions(-) diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c index 4da49702d8..f421f4ea49 100644 --- a/openair1/PHY/TOOLS/nr_phy_scope.c +++ b/openair1/PHY/TOOLS/nr_phy_scope.c @@ -419,7 +419,7 @@ FD_lte_phy_scope_ue *create_lte_phy_scope_ue( void ) fl_set_object_lcolor( fdui->pbch_llr, FL_WHITE ); // Label color fl_set_xyplot_symbolsize( fdui->pbch_llr,2); fl_set_xyplot_xgrid( fdui->pbch_llr,FL_GRID_MAJOR); - fl_set_xyplot_xbounds( fdui->pbch_llr,0,1920); + //fl_set_xyplot_xbounds( fdui->pbch_llr,0,1920); // I/Q PBCH comp fdui->pbch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 260, 240, 100, "PBCH I/Q of MF Output" ); @@ -501,21 +501,27 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, /* int16_t **chest_t; int16_t **chest_f; + */ int16_t *pdsch_llr; int16_t *pdsch_comp; - int16_t *pdsch_mag; + //int16_t *pdsch_mag; int8_t *pdcch_llr; int16_t *pdcch_comp; int8_t *pbch_llr; int16_t *pbch_comp; - float Re,Im,ymax=1; - int num_pdcch_symbols=3; - float *llr, *bit, *chest_f_abs, llr_pbch[1920], bit_pbch[1920], *llr_pdcch, *bit_pdcch; + float llr_pbch[1920], bit_pbch[1920]; + float *llr, *bit; + float *llr_pdcch, *bit_pdcch; float *I, *Q; - float **chest_t_abs; + int num_pdcch_symbols=2; + int num_re = 4500; + int Qm = 2; + int coded_bits_per_codeword = num_re*Qm; + /* + float Re,Im,ymax=1; + float **chest_t_abs, *chest_f_abs; float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx]; int frame = phy_vars_ue->proc.proc_rxtx[0].frame_rx; - int coded_bits_per_codeword = 0; int mcs = 0; unsigned char harq_pid = 0; */ @@ -554,9 +560,10 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, } else { coded_bits_per_codeword = 0; //frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti); } - - I = (float*) calloc(frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti*2,sizeof(float)); - Q = (float*) calloc(frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti*2,sizeof(float)); + */ + I = (float*) calloc(frame_parms->ofdm_symbol_size*frame_parms->symbols_per_slot*2,sizeof(float)); + Q = (float*) calloc(frame_parms->ofdm_symbol_size*frame_parms->symbols_per_slot*2,sizeof(float)); + /* chest_t_abs = (float**) malloc(nb_antennas_rx*sizeof(float*)); for (arx=0; arxN_RB_DL*num_pdcch_symbols*2,sizeof(float)); // init to zero bit_pdcch = (float*) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float)); - */ rxsig_t = (int16_t**) phy_vars_ue->common_vars.rxdata; rxsig_t_dB = calloc(nb_antennas_rx,sizeof(float*)); @@ -577,19 +586,20 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, } time = calloc(samples_per_frame,sizeof(float)); corr = calloc(samples_per_frame,sizeof(float)); - + /* chest_t = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id]; chest_f = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id]; + */ pbch_llr = (int8_t*) phy_vars_ue->pbch_vars[eNB_id]->llr; pbch_comp = (int16_t*) phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0]; + pdcch_llr = (int8_t*) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr; pdcch_comp = (int16_t*) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp[0]; - pdsch_llr = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[0]; // stream 0 + pdsch_llr = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[0]; // stream 0 // pdsch_llr = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id]->llr[0]; // stream 0 pdsch_comp = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp0[0]; - pdsch_mag = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag0[0]; - */ + //pdsch_mag = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag0[0]; // Received signal in time domain of receive antenna 0 if (rxsig_t != NULL) { @@ -710,25 +720,26 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, } } } - + */ + // PBCH LLRs if (pbch_llr != NULL) { - for (i=0; i<1920; i++) { + for (i=0; i<864; i++) { llr_pbch[i] = (float) pbch_llr[i]; bit_pbch[i] = (float) i; } - fl_set_xyplot_data(form->pbch_llr,bit_pbch,llr_pbch,1920,"","",""); + fl_set_xyplot_data(form->pbch_llr,bit_pbch,llr_pbch,864,"","",""); } // PBCH I/Q of MF Output if (pbch_comp!=NULL) { - for (i=0; i<72*2; i++) { + for (i=0; i<576; i++) { I[i] = pbch_comp[2*i]; Q[i] = pbch_comp[2*i+1]; } - fl_set_xyplot_data(form->pbch_comp,I,Q,72*2,"","",""); + fl_set_xyplot_data(form->pbch_comp,I,Q,576,"","",""); } // PDCCH LLRs @@ -738,15 +749,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, bit_pdcch[i] = (float) i; } - fl_set_xyplot_xbounds(form->pdcch_llr,0,12*frame_parms->N_RB_DL*2*3); - if (frame_parms->N_RB_DL != 100) - { - fl_set_xyplot_data(form->pdcch_llr,bit_pdcch,llr_pdcch,12*frame_parms->N_RB_DL*2*num_pdcch_symbols,"","",""); - } - else - { - LOG_D(PHY,"UE PDCCH LLR plot is bugged in 20 MHz BW, to be fixed !!!\n"); - } + fl_set_xyplot_data(form->pdcch_llr,bit_pdcch,llr_pdcch,12*frame_parms->N_RB_DL*num_pdcch_symbols,"","",""); } // PDCCH I/Q of MF Output @@ -755,14 +758,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, I[i] = pdcch_comp[2*i]; Q[i] = pdcch_comp[2*i+1]; } - if (frame_parms->N_RB_DL != 100) - { - fl_set_xyplot_data(form->pdcch_comp,I,Q,12*frame_parms->N_RB_DL*num_pdcch_symbols,"","",""); - } - else - { - LOG_D(PHY,"UE PDCCH COMP plot is bugged in 20 MHz BW, to be fixed !!!\n"); - } + fl_set_xyplot_data(form->pdcch_comp,I,Q,12*frame_parms->N_RB_DL*num_pdcch_symbols,"","",""); } // PDSCH LLRs @@ -772,32 +768,20 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, bit[i] = (float) i; } - fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword); - if (frame_parms->N_RB_DL != 100) - { - fl_set_xyplot_data(form->pdsch_llr,bit,llr,coded_bits_per_codeword,"","",""); - } - else - { - LOG_D(PHY,"UE PDSCH LLR plot is bugged in 20 MHz BW, to be fixed !!!\n"); - } + //fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword); + fl_set_xyplot_data(form->pdsch_llr,bit,llr,coded_bits_per_codeword,"","",""); } // PDSCH I/Q of MF Output if (pdsch_comp!=NULL) { - ind=0; - - for (k=0; ksymbols_per_tti; k++) { - for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { - int j = (2*frame_parms->N_RB_DL*12*k)+4*i; - I[ind] = (pdsch_mag[j ]!=0? 1.0/pdsch_mag[j ]: 0.0) * pdsch_comp[j ]*1.0; - Q[ind] = (pdsch_mag[j+1]!=0? 1.0/pdsch_mag[j+1]: 0.0) * pdsch_comp[j+1]*1.0; - ind++; - } + for (i=0; ipdsch_comp,I,Q,ind,"","",""); + + fl_set_xyplot_data(form->pdsch_comp,I,Q,num_re,"","",""); } + /* // PDSCH Throughput memmove( tput_time_ue[UE_id], &tput_time_ue[UE_id][1], (TPUT_WINDOW_LENGTH-1)*sizeof(float) ); @@ -824,19 +808,18 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, } free(rxsig_t_dB); - /* free(I); free(Q); - free(chest_f_abs); free(llr); free(bit); free(bit_pdcch); free(llr_pdcch); + /* + free(chest_f_abs); for (arx=0; arx Date: Tue, 4 Dec 2018 08:56:23 +0100 Subject: [PATCH 108/117] fixing bug in adjust_sync, log cleanup --- .../PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c | 6 +- openair1/PHY/NR_UE_TRANSPORT/dci_nr.c | 66 +++++++++---------- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 16 ++--- 3 files changed, 42 insertions(+), 46 deletions(-) diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c index ecdfa9cdcf..02290f7b49 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c @@ -114,10 +114,10 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms, } if ( ue->rx_offset < 0 ) - ue->rx_offset += FRAME_LENGTH_COMPLEX_SAMPLES; + ue->rx_offset += frame_parms->samples_per_frame; - if ( ue->rx_offset >= FRAME_LENGTH_COMPLEX_SAMPLES ) - ue->rx_offset -= FRAME_LENGTH_COMPLEX_SAMPLES; + if ( ue->rx_offset >= frame_parms->samples_per_frame ) + ue->rx_offset -= frame_parms->samples_per_frame; diff --git a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c index c4df10e13c..dffa6e3f8c 100755 --- a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c @@ -49,7 +49,7 @@ //#define NR_LTE_PDCCH_DCI_SWITCH #define NR_PDCCH_DCI_RUN // activates new nr functions -#define NR_PDCCH_DCI_DEBUG // activates NR_PDCCH_DCI_DEBUG logs +//#define NR_PDCCH_DCI_DEBUG // activates NR_PDCCH_DCI_DEBUG logs #define NR_NBR_CORESET_ACT_BWP 3 // The number of CoreSets per BWP is limited to 3 (including initial CORESET: ControlResourceId 0) #define NR_NBR_SEARCHSPACE_ACT_BWP 10 // The number of SearSpaces per BWP is limited to 10 (including initial SEARCHSPACE: SearchSpaceId 0) #define PDCCH_TEST_POLAR_TEMP_FIX @@ -124,7 +124,7 @@ symbol 0 | ... bundle 3 bundle 6 bundle_j = (c*coreset_interleaver_size_R)+r; f_bundle_j = ((r*coreset_C)+c+n_shift)%((coreset_nbr_rb*coreset_time_dur)/reg_bundle_size_L); if (coreset_interleaved==0) f_bundle_j=bundle_j; - #ifndef NR_PDCCH_DCI_DEBUG + #ifdef NR_PDCCH_DCI_DEBUG printf("\n\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_demapping_deinterleaving)-> [r=%d,c=%d] bundle_j(%d) interleaved at f_bundle_j(%d)\n",r,c,bundle_j,f_bundle_j); #endif } @@ -135,7 +135,7 @@ symbol 0 | ... bundle 3 bundle 6 index_llr = 9*((uint16_t)floor(f_reg/coreset_time_dur)+((f_reg%coreset_time_dur)*(coreset_nbr_rb))); for (int i=0; i<9; i++){ z[index_z + i] = llr[index_llr + i]; - #ifndef NR_PDCCH_DCI_DEBUG + #ifdef NR_PDCCH_DCI_DEBUG printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_demapping_deinterleaving)-> [reg=%d,bundle_j=%d] z[%d]=(%d,%d) <-> \t[f_reg=%d,fbundle_j=%d] llr[%d]=(%d,%d) \n", reg,bundle_j,(index_z + i),*(char*) &z[index_z + i],*(1 + (char*) &z[index_z + i]), f_reg,f_bundle_j,(index_llr + i),*(char*) &llr[index_llr + i], *(1 + (char*) &llr[index_llr + i])); @@ -161,7 +161,7 @@ int32_t nr_pdcch_llr(NR_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp, printf("pdcch_qpsk_llr: llr is null, symbol %d\n", symbol); return (-1); } -#ifndef NR_PDCCH_DCI_DEBUG +#ifdef NR_PDCCH_DCI_DEBUG printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_llr)-> llr logs: pdcch qpsk llr for symbol %d (pos %d), llr offset %d\n",symbol,(symbol*frame_parms->N_RB_DL*12),pdcch_llr8-pdcch_llr); #endif //for (i = 0; i < (frame_parms->N_RB_DL * ((symbol == 0) ? 16 : 24)); i++) { @@ -173,7 +173,7 @@ int32_t nr_pdcch_llr(NR_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp, *pdcch_llr8 = -32; else *pdcch_llr8 = (char) (*rxF); -#ifndef NR_PDCCH_DCI_DEBUG +#ifdef NR_PDCCH_DCI_DEBUG printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_llr)-> llr logs: rb=%d i=%d *rxF:%d => *pdcch_llr8:%d\n",i/18,i,*rxF,*pdcch_llr8); #endif rxF++; @@ -498,7 +498,7 @@ void nr_pdcch_extract_rbs_single(int32_t **rxdataF, if ((c_rb < (frame_parms->N_RB_DL >> 1)) && ((frame_parms->N_RB_DL & 1) == 0)) { //if RB to be treated is lower than middle system bandwidth then rxdataF pointed at (offset + c_br + symbol * ofdm_symbol_size): even case rxF = &rxdataF[aarx][(frame_parms->first_carrier_offset + 12 * c_rb + (symbol * (frame_parms->ofdm_symbol_size)))]; - #ifndef NR_PDCCH_DCI_DEBUG + #ifdef NR_PDCCH_DCI_DEBUG printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_extract_rbs_single)-> in even case c_rb (%d) is lower than half N_RB_DL -> rxF = &rxdataF[aarx = (%d)][(frame_parms->first_carrier_offset + 12 * c_rb + (symbol * (frame_parms->ofdm_symbol_size))) = (%d)]\n", c_rb,aarx,(frame_parms->first_carrier_offset + 12 * c_rb + (symbol * (frame_parms->ofdm_symbol_size)))); #endif @@ -507,7 +507,7 @@ void nr_pdcch_extract_rbs_single(int32_t **rxdataF, // number of RBs is even and c_rb is higher than half system bandwidth (we don't skip DC) // if these conditions are true the pointer has to be situated at the 1st part of the rxdataF rxF = &rxdataF[aarx][(12*(c_rb - (frame_parms->N_RB_DL>>1)) + (symbol * (frame_parms->ofdm_symbol_size)))]; // we point at the 1st part of the rxdataF in symbol - #ifndef NR_PDCCH_DCI_DEBUG + #ifdef NR_PDCCH_DCI_DEBUG printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_extract_rbs_single)-> in even case c_rb (%d) is higher than half N_RB_DL (not DC) -> rxF = &rxdataF[aarx = (%d)][(12*(c_rb - (frame_parms->N_RB_DL>>1)) + (symbol * (frame_parms->ofdm_symbol_size))) = (%d)]\n", c_rb,aarx,(12*(c_rb - (frame_parms->N_RB_DL>>1)) + (symbol * (frame_parms->ofdm_symbol_size)))); #endif @@ -520,7 +520,7 @@ void nr_pdcch_extract_rbs_single(int32_t **rxdataF, if ((c_rb < (frame_parms->N_RB_DL >> 1)) && ((frame_parms->N_RB_DL & 1) != 0)){ //if RB to be treated is lower than middle system bandwidth then rxdataF pointed at (offset + c_br + symbol * ofdm_symbol_size): odd case rxF = &rxdataF[aarx][(frame_parms->first_carrier_offset + 12 * c_rb + (symbol * (frame_parms->ofdm_symbol_size)))]; - #ifndef NR_PDCCH_DCI_DEBUG + #ifdef NR_PDCCH_DCI_DEBUG printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_extract_rbs_single)-> in odd case c_rb (%d) is lower or equal than half N_RB_DL -> rxF = &rxdataF[aarx = (%d)][(frame_parms->first_carrier_offset + 12 * c_rb + (symbol * (frame_parms->ofdm_symbol_size))) = (%d)]\n", c_rb,aarx,(frame_parms->first_carrier_offset + 12 * c_rb + (symbol * (frame_parms->ofdm_symbol_size)))); #endif @@ -529,7 +529,7 @@ void nr_pdcch_extract_rbs_single(int32_t **rxdataF, // number of RBs is odd and c_rb is higher than half system bandwidth + 1 // if these conditions are true the pointer has to be situated at the 1st part of the rxdataF just after the first IQ symbols of the RB containing DC rxF = &rxdataF[aarx][(12*(c_rb - (frame_parms->N_RB_DL>>1)) - 6 + (symbol * (frame_parms->ofdm_symbol_size)))]; // we point at the 1st part of the rxdataF in symbol - #ifndef NR_PDCCH_DCI_DEBUG + #ifdef NR_PDCCH_DCI_DEBUG printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_extract_rbs_single)-> in odd case c_rb (%d) is higher than half N_RB_DL (not DC) -> rxF = &rxdataF[aarx = (%d)][(12*(c_rb - frame_parms->N_RB_DL) - 5 + (symbol * (frame_parms->ofdm_symbol_size))) = (%d)]\n", c_rb,aarx,(12*(c_rb - (frame_parms->N_RB_DL>>1)) - 6 + (symbol * (frame_parms->ofdm_symbol_size)))); #endif @@ -538,7 +538,7 @@ void nr_pdcch_extract_rbs_single(int32_t **rxdataF, // if odd number RBs in system bandwidth and first RB to be treated is higher than middle system bandwidth (around DC) // we have to treat the RB in two parts: first part from i=0 to 5, the data is at the end of rxdataF (pointing at the end of the table) rxF = &rxdataF[aarx][(frame_parms->first_carrier_offset + 12 * c_rb + (symbol * (frame_parms->ofdm_symbol_size)))]; - #ifndef NR_PDCCH_DCI_DEBUG + #ifdef NR_PDCCH_DCI_DEBUG printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_extract_rbs_single)-> in odd case c_rb (%d) is half N_RB_DL + 1 we treat DC case -> rxF = &rxdataF[aarx = (%d)][(frame_parms->first_carrier_offset + 12 * c_rb + (symbol * (frame_parms->ofdm_symbol_size))) = (%d)]\n", c_rb,aarx,(frame_parms->first_carrier_offset + 12 * c_rb + (symbol * (frame_parms->ofdm_symbol_size)))); #endif @@ -573,7 +573,7 @@ void nr_pdcch_extract_rbs_single(int32_t **rxdataF, } // then we point at the begining of the symbol part of rxdataF do process second part of RB rxF = &rxdataF[aarx][((symbol * (frame_parms->ofdm_symbol_size)))]; // we point at the 1st part of the rxdataF in symbol - #ifndef NR_PDCCH_DCI_DEBUG + #ifdef NR_PDCCH_DCI_DEBUG printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_extract_rbs_single)-> in odd case c_rb (%d) is half N_RB_DL +1 we treat DC case -> rxF = &rxdataF[aarx = (%d)][(symbol * (frame_parms->ofdm_symbol_size)) = (%d)]\n", c_rb,aarx,(symbol * (frame_parms->ofdm_symbol_size))); #endif @@ -608,7 +608,7 @@ void nr_pdcch_extract_rbs_single(int32_t **rxdataF, for (i = 0; i < 12; i++) { if ((i != 1) && (i != 5) && (i != 9)) { rxF_ext[j] = rxF[i]; - #ifndef NR_PDCCH_DCI_DEBUG + #ifdef NR_PDCCH_DCI_DEBUG printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_extract_rbs_single)-> RB[c_rb %d] \t RE[re %d] => rxF_ext[%d]=(%d,%d)\t rxF[%d]=(%d,%d)", c_rb, i, j, *(short *) &rxF_ext[j],*(1 + (short*) &rxF_ext[j]), i, *(short *) &rxF[i], *(1 + (short*) &rxF[i])); @@ -618,7 +618,7 @@ void nr_pdcch_extract_rbs_single(int32_t **rxdataF, //printf("\t-> dl_ch0[%d] => dl_ch0_ext[%d](%d,%d)\n", i,j, *(short *) &dl_ch0[i], *(1 + (short*) &dl_ch0[i])); j++; } else { - #ifndef NR_PDCCH_DCI_DEBUG + #ifdef NR_PDCCH_DCI_DEBUG printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_extract_rbs_single)-> RB[c_rb %d] \t RE[re %d] => rxF_ext[%d]=(%d,%d)\t rxF[%d]=(%d,%d) \t\t <==> DM-RS PDCCH, this is a pilot symbol\n", c_rb, i, j, *(short *) &rxF_ext[j], *(1 + (short*) &rxF_ext[j]), i, *(short *) &rxF[i], *(1 + (short*) &rxF[i])); @@ -741,7 +741,7 @@ int16x8_t mmtmpP0,mmtmpP1,mmtmpP2,mmtmpP3; //print_shorts("ch:",dl_ch128+2); //print_shorts("pack:",rxdataF_comp128+2); -#ifndef NR_PDCCH_DCI_DEBUG +#ifdef NR_PDCCH_DCI_DEBUG for (int i=0; i<20 ; i++) printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_channel_compensation)-> rb=%d rxdataF128[%d]=(%d,%d) rxdataF_comp128[%d]=(%d,%d)\n", rb, i, *(short *) &rxdataF128[i],*(1 + (short*) &rxdataF128[i]), @@ -939,14 +939,13 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue, #endif for (int s = start_symbol; s < (start_symbol + coreset_time_dur); s++) { +#ifdef NR_PDCCH_DCI_DEBUG printf("\t<-NR_PDCCH_DCI_DEBUG (nr_rx_pdcch)-> we enter process pdcch ofdm symbol s=%d where coreset_time_dur=%d\n",s,coreset_time_dur); - - - #ifdef NR_PDCCH_DCI_DEBUG - printf("\t<-NR_PDCCH_DCI_DEBUG (nr_rx_pdcch)-> we enter nr_pdcch_extract_rbs_single(is_secondary_ue=%d) to remove DM-RS PDCCH\n", - is_secondary_ue); - printf("\t<-NR_PDCCH_DCI_DEBUG (nr_rx_pdcch)-> in nr_pdcch_extract_rbs_single(rxdataF -> rxdataF_ext || dl_ch_estimates -> dl_ch_estimates_ext)\n"); - #endif + + printf("\t<-NR_PDCCH_DCI_DEBUG (nr_rx_pdcch)-> we enter nr_pdcch_extract_rbs_single(is_secondary_ue=%d) to remove DM-RS PDCCH\n", + is_secondary_ue); + printf("\t<-NR_PDCCH_DCI_DEBUG (nr_rx_pdcch)-> in nr_pdcch_extract_rbs_single(rxdataF -> rxdataF_ext || dl_ch_estimates -> dl_ch_estimates_ext)\n"); +#endif nr_pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].rxdataF, common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].dl_ch_estimates[eNB_id], pdcch_vars[eNB_id]->rxdataF_ext, @@ -1186,7 +1185,7 @@ if (do_common){ //uint32_t calc_x2=puissance_2_16%puissance_2_31; x2 = (((1<<16)*n_rnti)+n_id); //mod 2^31 is implicit //this is c_init in 38.211 v15.1.0 Section 7.3.2.3 // x2 = (nr_tti_rx << 9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.8.2 -#ifndef NR_PDCCH_DCI_DEBUG +#ifdef NR_PDCCH_DCI_DEBUG printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_unscrambling)-> (c_init=%d, n_id=%d, n_rnti=%d, length=%d)\n",x2,n_id,n_rnti,length); #endif for (i = 0; i < length; i++) { @@ -1196,7 +1195,7 @@ printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_unscrambling)-> (c_init=%d, n_id=%d, reset = 0; } - #ifndef NR_PDCCH_DCI_DEBUG + #ifdef NR_PDCCH_DCI_DEBUG if (i%2 == 0) printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_unscrambling)-> unscrambling %d : scrambled_z=%d, => ", i,*(char*) &z[(int)floor(i/2)]); if (i%2 == 1) printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_unscrambling)-> unscrambling %d : scrambled_z=%d, => ", @@ -1208,7 +1207,7 @@ printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_unscrambling)-> (c_init=%d, n_id=%d, } //llr[i] = -llr[i]; //llr[i] = (-1)*llr[i]; - #ifndef NR_PDCCH_DCI_DEBUG + #ifdef NR_PDCCH_DCI_DEBUG if (i%2 == 0) printf("unscrambled_z=%d\n",*(char*) &z[(int)floor(i/2)]); if (i%2 == 1) printf("unscrambled_z=%d\n",*(1 + (char*) &z[(int)floor(i/2)])); #endif @@ -1451,7 +1450,7 @@ void nr_dci_decoding_procedure0(int s, LOG_I(PHY,"[DCI search nPdcch %d - ue spec] Attempting candidate %d Aggregation Level %d DCI length %d at CCE %d/%d (CCEmap %x,CCEmap_cand %x) format %d\n", pdcch_vars[eNB_id]->num_pdcch_symbols,m,L2,sizeof_bits,CCEind,nCCE,*CCEmap,CCEmap_mask,format_c); #endif - #ifndef NR_PDCCH_DCI_DEBUG + #ifdef NR_PDCCH_DCI_DEBUG printf ("\t\t<-NR_PDCCH_DCI_DEBUG (nr_dci_decoding_procedure0)-> ... we enter function dci_decoding(sizeof_bits=%d L=%d) -----\n",sizeof_bits,L); printf ("\t\t<-NR_PDCCH_DCI_DEBUG (nr_dci_decoding_procedure0)-> ... we have to replace this part of the code by polar decoding\n"); #endif @@ -1476,7 +1475,7 @@ void nr_dci_decoding_procedure0(int s, } } - #ifndef NR_PDCCH_DCI_DEBUG + #ifdef NR_PDCCH_DCI_DEBUG printf("\n"); int j=0; uint32_t polar_hex[27] = {0}; @@ -1500,15 +1499,16 @@ uint16_t rnti=3; 8,//NR_POLAR_DECODER_LISTSIZE, 0,//NR_POLAR_DECODER_PATH_METRIC_APPROXIMATION, rnti); //rnti - printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_dci_decoding_procedure0: \t\tpolar decoding)-> decoderState %d\n", decoderState); #endif - //dci_estimation[0] = 0x01189400; - printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_dci_decoding_procedure0: \t\tdci_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]); +#ifdef NR_PDCCH_DCI_DEBUG + printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_dci_decoding_procedure0: \t\tpolar decoding)-> decoderState %d\n", decoderState); + printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_dci_decoding_procedure0: \t\tdci_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]); +#endif crc = rnti; //crc = (crc16(&dci_decoded_output[current_thread_id][0], sizeof_bits) >> 16) ^ extract_crc(&dci_decoded_output[current_thread_id][0], sizeof_bits); - #ifndef NR_PDCCH_DCI_DEBUG + #ifdef NR_PDCCH_DCI_DEBUG printf ("\t\t<-NR_PDCCH_DCI_DEBUG (nr_dci_decoding_procedure0)-> ... we end function dci_decoding() with crc=%x\n",crc); printf ("\t\t<-NR_PDCCH_DCI_DEBUG (nr_dci_decoding_procedure0)-> ... we have to replace this part of the code by polar decoding\n"); #endif @@ -2600,7 +2600,7 @@ uint8_t dci_size [8] = {0,0,0,0,0,0,0,0}; // will contain size for each format i,dci_size[i],n_RB_ULBWP); #endif } -#ifndef NR_PDCCH_DCI_DEBUG +#ifdef NR_PDCCH_DCI_DEBUG printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_dci_format_size) dci_fields_sizes[][] = { \n"); for (int j=0; jhigh_speed_flag); if (ret==0) { + ue->pbch_vars[eNB_id]->pdu_errors_conseq = 0; #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d] frame %d, nr_tti_rx %d, Received PBCH (MIB): frame_tx %d. N_RB_DL %d\n", @@ -2965,14 +2966,9 @@ void nr_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t * ue->pbch_vars[eNB_id]->pdu_errors_conseq++; ue->pbch_vars[eNB_id]->pdu_errors++; - if (ue->mac_enabled == 1) { - //mac_xface->out_of_sync_ind(ue->Mod_id,frame_rx,eNB_id); - } - else{ - if (ue->pbch_vars[eNB_id]->pdu_errors_conseq>=100) { - LOG_E(PHY,"More that 100 consecutive PBCH errors! Exiting!\n"); - exit_fun("More that 100 consecutive PBCH errors! Exiting!\n"); - } + if (ue->pbch_vars[eNB_id]->pdu_errors_conseq>=100) { + LOG_E(PHY,"More that 100 consecutive PBCH errors! Exiting!\n"); + exit_fun("More that 100 consecutive PBCH errors! Exiting!\n"); } } @@ -5448,7 +5444,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN //#endif //pdsch - LOG_D(PHY," ****** end RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, nr_tti_rx); + LOG_I(PHY," ****** end RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, nr_tti_rx); return (0); } From fa1ee1b3e9e5bb9bc989a5496378d33fe006fc2e Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Wed, 5 Dec 2018 14:45:08 +0100 Subject: [PATCH 109/117] fixing pbch in phy_scope --- openair1/PHY/TOOLS/nr_phy_scope.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c index f421f4ea49..a96b9ab59b 100644 --- a/openair1/PHY/TOOLS/nr_phy_scope.c +++ b/openair1/PHY/TOOLS/nr_phy_scope.c @@ -507,7 +507,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, //int16_t *pdsch_mag; int8_t *pdcch_llr; int16_t *pdcch_comp; - int8_t *pbch_llr; + int16_t *pbch_llr; int16_t *pbch_comp; float llr_pbch[1920], bit_pbch[1920]; float *llr, *bit; @@ -517,6 +517,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, int num_re = 4500; int Qm = 2; int coded_bits_per_codeword = num_re*Qm; + int symbol, first_symbol,nb_re; /* float Re,Im,ymax=1; float **chest_t_abs, *chest_f_abs; @@ -591,7 +592,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, chest_t = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id]; chest_f = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id]; */ - pbch_llr = (int8_t*) phy_vars_ue->pbch_vars[eNB_id]->llr; + pbch_llr = (int16_t*) phy_vars_ue->pbch_vars[eNB_id]->llr; pbch_comp = (int16_t*) phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0]; pdcch_llr = (int8_t*) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr; @@ -625,6 +626,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, */ } + if (phy_vars_ue->is_synchronized==0) { for (ind=0;ind<3;ind++) { if (pss_corr_ue[ind]) { for (i=0; ichest_t,ind,time,corr,samples_per_frame,rx_antenna_colors[ind]); } } - + } /* // Channel Impulse Response (still repeated format) @@ -732,14 +734,24 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, fl_set_xyplot_data(form->pbch_llr,bit_pbch,llr_pbch,864,"","",""); } + if (phy_vars_ue->is_synchronized==1) + first_symbol=5; + else + first_symbol=1; + // PBCH I/Q of MF Output if (pbch_comp!=NULL) { - for (i=0; i<576; i++) { - I[i] = pbch_comp[2*i]; - Q[i] = pbch_comp[2*i+1]; + for (symbol=first_symbol; symbol<(first_symbol+3); symbol++) { + if (symbol == 2 || symbol == 6) + nb_re = 72; + else + nb_re = 180; + for (i=0; ipbch_comp,I,Q,576,"","",""); + fl_set_xyplot_data(form->pbch_comp,I,Q,432,"","",""); } // PDCCH LLRs From 1558d7990bb71b9f39c0dd692806c086edd6c3c0 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Thu, 6 Dec 2018 09:53:49 +0100 Subject: [PATCH 110/117] fixing phy_adjust_sync --- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index fe254ed035..3e581fdfa3 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -2717,7 +2717,7 @@ void nr_ue_measurement_procedures( } #endif // accumulate and filter timing offset estimation every nr_tti_rx (instead of every frame) - if (( (slot%2) == 0) && (l==(1-frame_parms->Ncp))) { + if (( slot == 2) && (l==(1-frame_parms->Ncp))) { // AGC /* @@ -5058,7 +5058,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN); nr_slot_fep(ue, l, - nr_tti_rx, + nr_tti_rx<<1, 0, 0, 1, From e82d61e602fd5868d4694a49e148cd40f7b29ff5 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Thu, 6 Dec 2018 09:54:15 +0100 Subject: [PATCH 111/117] small improvements to UE scope --- targets/RT/USER/nr-uesoftmodem.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/targets/RT/USER/nr-uesoftmodem.c b/targets/RT/USER/nr-uesoftmodem.c index 84f4429b76..60f81a0653 100644 --- a/targets/RT/USER/nr-uesoftmodem.c +++ b/targets/RT/USER/nr-uesoftmodem.c @@ -85,10 +85,10 @@ unsigned short config_frames[4] = {2,9,11,13}; // current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0) // at eNB 0, an UL scope for every UE FD_lte_phy_scope_ue *form_ue[NUMBER_OF_UE_MAX]; -FD_lte_phy_scope_enb *form_enb[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; -FD_stats_form *form_stats=NULL,*form_stats_l2=NULL; +//FD_lte_phy_scope_enb *form_enb[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; +//FD_stats_form *form_stats=NULL,*form_stats_l2=NULL; char title[255]; -unsigned char scope_enb_num_ue = 2; +//unsigned char scope_enb_num_ue = 2; static pthread_t forms_thread; //xforms #endif //XFORMS #include "nr-uesoftmodem.h" @@ -440,8 +440,8 @@ static void *scope_thread(void *arg) { while (!oai_exit) { //len = dump_ue_stats (PHY_vars_UE_g[0][0], &PHY_vars_UE_g[0][0]->proc.proc_rxtx[0],stats_buffer, 0, mode,rx_input_level_dBm); //fl_set_object_label(form_stats->stats_text, stats_buffer); - fl_clear_browser(form_stats->stats_text); - fl_add_browser_line(form_stats->stats_text, stats_buffer); + //fl_clear_browser(form_stats->stats_text); + //fl_add_browser_line(form_stats->stats_text, stats_buffer); //if (PHY_vars_UE_g[0][0]->is_synchronized == 1) phy_scope_UE(form_ue[0], @@ -451,7 +451,7 @@ static void *scope_thread(void *arg) { //printf("doing forms\n"); //usleep(100000); // 100 ms - sleep(1); + sleep(0.1); } // printf("%s",stats_buffer); @@ -1127,8 +1127,8 @@ int main( int argc, char **argv ) { fl_initialize (&fl_argc, argv, NULL, 0, 0); // restore the original command line args // argv = fl_get_cmdline_args( &argc ); - form_stats = create_form_stats_form(); - fl_show_form (form_stats->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "stats"); + //form_stats = create_form_stats_form(); + //fl_show_form (form_stats->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "stats"); UE_id = 0; form_ue[UE_id] = create_lte_phy_scope_ue(); sprintf (title, "NR DL SCOPE UE"); @@ -1218,8 +1218,8 @@ int main( int argc, char **argv ) { if (do_forms==1) { pthread_join(forms_thread,&status); - fl_hide_form(form_stats->stats_form); - fl_free_form(form_stats->stats_form); + //fl_hide_form(form_stats->stats_form); + //fl_free_form(form_stats->stats_form); fl_hide_form(form_ue[0]->lte_phy_scope_ue); fl_free_form(form_ue[0]->lte_phy_scope_ue); } From 815658b0f0c4598e1fa8e0a60888cc100050c49d Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Mon, 10 Dec 2018 14:47:05 +0100 Subject: [PATCH 112/117] check_crc fix --- openair1/PHY/CODING/crc_byte.c | 15 +++++---------- openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 7 +++---- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/openair1/PHY/CODING/crc_byte.c b/openair1/PHY/CODING/crc_byte.c index 652e8466b7..0ad4ba62e7 100644 --- a/openair1/PHY/CODING/crc_byte.c +++ b/openair1/PHY/CODING/crc_byte.c @@ -259,7 +259,7 @@ unsigned int crcPayload(unsigned char * inptr, int bitlen, uint32_t* crc256Table int check_crc(uint8_t* decoded_bytes, uint32_t n, uint32_t F, uint8_t crc_type) { - uint32_t crc,oldcrc; + uint32_t crc=0,oldcrc=0; uint8_t crc_len,temp; switch (crc_type) { @@ -280,17 +280,15 @@ int check_crc(uint8_t* decoded_bytes, uint32_t n, uint32_t F, uint8_t crc_type) crc_len=3; } - oldcrc= *((unsigned int *)(&decoded_bytes[(n>>3)-crc_len])); + for (int i=0; i>3)-crc_len+i])<<((crc_len-1-i)<<3); switch (crc_type) { case CRC24_A: oldcrc&=0x00ffffff; - crc = crc24a(&decoded_bytes[F>>3], - n-24-F)>>8; - temp=((uint8_t *)&crc)[2]; - ((uint8_t *)&crc)[2] = ((uint8_t *)&crc)[0]; - ((uint8_t *)&crc)[0] = temp; + crc = crc24a(decoded_bytes, + n-24)>>8; break; @@ -298,9 +296,6 @@ int check_crc(uint8_t* decoded_bytes, uint32_t n, uint32_t F, uint8_t crc_type) oldcrc&=0x00ffffff; crc = crc24b(decoded_bytes, n-24)>>8; - temp=((uint8_t *)&crc)[2]; - ((uint8_t *)&crc)[2] = ((uint8_t *)&crc)[0]; - ((uint8_t *)&crc)[0] = temp; break; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index 448c01c397..428dfc9e99 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -508,8 +508,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, llrProcBuf, p_procTime); - /* - if (check_crc(llrProcBuf,Kr,harq_process->F,crc_type)) { + if (check_crc(llrProcBuf,harq_process->B,harq_process->F,crc_type)) { printf("CRC OK\n"); ret = 2; } @@ -517,7 +516,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, printf("CRC NOK\n"); ret = 1+dlsch->max_ldpc_iterations; } - */ + nb_total_decod++; if (no_iteration_ldpc > dlsch->max_ldpc_iterations){ @@ -539,7 +538,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, #ifdef DEBUG_DLSCH_DECODING //printf("output decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]); - for (int k=0;k<32;k++) + for (int k=0;k>3;k++) printf("output decoder [%d] = 0x%02x \n", k, harq_process->c[r][k]); printf("no_iterations_ldpc %d (ret %d)\n",no_iteration_ldpc,ret); //write_output("dec_output.m","dec0",harq_process->c[0],Kr_bytes,1,4); From 08f90879dfd1db925a124b2b02cb3c953d3ce7a5 Mon Sep 17 00:00:00 2001 From: Hongzhi Date: Thu, 13 Dec 2018 10:13:03 +0100 Subject: [PATCH 113/117] pdcch and pdsch fix in phy_scope --- .../PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c | 6 +++--- openair1/PHY/TOOLS/nr_phy_scope.c | 19 ++++++++++--------- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 10 +++++----- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c index 02290f7b49..f1a3ef42ab 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c @@ -80,7 +80,7 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms, max_pos_fil = ((max_pos_fil * coef) + (max_pos * ncoef)) >> 15; // do not filter to have proactive timing adjustment - max_pos_fil = max_pos; + //max_pos_fil = max_pos; if(subframe == 1) { @@ -96,7 +96,7 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms, else count_max_pos_ok = 0; - printf("adjust sync count_max_pos_ok = %d\n",count_max_pos_ok); + //printf("adjust sync count_max_pos_ok = %d\n",count_max_pos_ok); if(count_max_pos_ok > 10 && first_time == 1) { @@ -122,7 +122,7 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms, #ifdef DEBUG_PHY - LOG_I(PHY,"AbsSubframe %d.%d: ThreadId %d diff =%i rx_offset (final) = %i : clear %d,max_pos = %d,max_pos_fil = %d (peak %d) max_val %d target_pos %d \n", + LOG_D(PHY,"AbsSubframe %d.%d: ThreadId %d diff =%i rx_offset (final) = %i : clear %d,max_pos = %d,max_pos_fil = %d (peak %d) max_val %d target_pos %d \n", ue->proc.proc_rxtx[ue->current_thread_id[subframe]].frame_rx, subframe, ue->current_thread_id[subframe], diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c index a96b9ab59b..0100dd44c4 100644 --- a/openair1/PHY/TOOLS/nr_phy_scope.c +++ b/openair1/PHY/TOOLS/nr_phy_scope.c @@ -518,6 +518,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, int Qm = 2; int coded_bits_per_codeword = num_re*Qm; int symbol, first_symbol,nb_re; + int nb_rb_pdsch =50; /* float Re,Im,ymax=1; float **chest_t_abs, *chest_f_abs; @@ -756,8 +757,8 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, // PDCCH LLRs if (pdcch_llr != NULL) { - for (i=0; i<12*frame_parms->N_RB_DL*2*num_pdcch_symbols; i++) { - llr_pdcch[i] = (float) pdcch_llr[i]; + for (i=0; i<100; i++) { //12*frame_parms->N_RB_DL*2*num_pdcch_symbols + llr_pdcch[i] = (float) pdcch_llr[2*24*9 +i]; bit_pdcch[i] = (float) i; } @@ -766,9 +767,9 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, // PDCCH I/Q of MF Output if (pdcch_comp!=NULL) { - for (i=0; i<12*frame_parms->N_RB_DL*num_pdcch_symbols; i++) { - I[i] = pdcch_comp[2*i]; - Q[i] = pdcch_comp[2*i+1]; + for (i=0; i<100; i++) { + I[i] = pdcch_comp[2*50*12+2*i]; + Q[i] = pdcch_comp[2*50*12+2*i+1]; } fl_set_xyplot_data(form->pdcch_comp,I,Q,12*frame_parms->N_RB_DL*num_pdcch_symbols,"","",""); } @@ -786,12 +787,12 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, // PDSCH I/Q of MF Output if (pdsch_comp!=NULL) { - for (i=0; ipdsch_comp,I,Q,num_re,"","",""); + fl_set_xyplot_data(form->pdsch_comp,I,Q,nb_rb_pdsch*12,"","",""); } /* diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 3e581fdfa3..590d314ab7 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -56,7 +56,7 @@ //#define DEBUG_PHY_PROC #define NR_PDCCH_SCHED -#define NR_PDCCH_SCHED_DEBUG +//#define NR_PDCCH_SCHED_DEBUG //#define NR_PUCCH_SCHED //#define NR_PUCCH_SCHED_DEBUG @@ -3584,7 +3584,7 @@ void nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB } } - if ((m==s0) && (m<4)) + if ((m==s0) && (m<3)) first_symbol_flag = 1; else first_symbol_flag = 0; @@ -4104,7 +4104,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, } //#ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[UE %d][PDSCH %x/%d] Frame %d nr_tti_rx %d: PDSCH/DLSCH decoding iter %d/%d (mcs %d, rv %d, TBS %d)\n", + LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d nr_tti_rx %d: PDSCH/DLSCH decoding iter %d/%d (mcs %d, rv %d, TBS %d)\n", ue->Mod_id, dlsch0->rnti,harq_pid, frame_rx,nr_tti_rx,ret,dlsch0->max_ldpc_iterations, @@ -4964,7 +4964,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN //proc->decoder_switch = 0; //int counter_decoder = 0; - LOG_I(PHY," ****** start RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, nr_tti_rx); + LOG_D(PHY," ****** start RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, nr_tti_rx); uint8_t next1_thread_id = ue->current_thread_id[nr_tti_rx]== (RX_NB_TH-1) ? 0:(ue->current_thread_id[nr_tti_rx]+1); uint8_t next2_thread_id = next1_thread_id== (RX_NB_TH-1) ? 0:(next1_thread_id+1); @@ -5444,7 +5444,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN //#endif //pdsch - LOG_I(PHY," ****** end RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, nr_tti_rx); + LOG_D(PHY," ****** end RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, nr_tti_rx); return (0); } From 4b373dd1c6066489912dda86ef229f04913edb56 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Mon, 17 Dec 2018 13:32:29 +0100 Subject: [PATCH 114/117] more fixes for ue dlsch --- .../nr_dl_channel_estimation.c | 4 ++-- .../NR_UE_TRANSPORT/nr_dlsch_demodulation.c | 20 +++++++++---------- .../NR_UE_TRANSPORT/nr_transport_proto_ue.h | 1 + openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 7 +++++-- targets/RT/USER/nr-uesoftmodem.c | 2 +- 5 files changed, 18 insertions(+), 16 deletions(-) diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index da3815df14..a4a9ab028e 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -457,14 +457,14 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, break; } - if( ((Ns%2) == 0) && (l == 0)) + if( (Ns== 2) && (l == 0)) { // do ifft of channel estimate for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) for (p=0; pframe_parms.nb_antenna_ports_eNB; p++) { if (ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[eNB_offset][(p<<1)+aarx]) { - LOG_I(PHY,"Channel Impulse Computation Slot %d ThreadId %d Symbol %d \n", Ns, ue->current_thread_id[Ns>>1], l); + LOG_D(PHY,"Channel Impulse Computation Slot %d ThreadId %d Symbol %d \n", Ns, ue->current_thread_id[Ns>>1], l); idft((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[eNB_offset][(p<<1)+aarx][0], (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates_time[eNB_offset][(p<<1)+aarx],1); } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c index 8fbdd30972..2e00c128b3 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c @@ -162,6 +162,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, dlsch[0]->harq_processes[harq_pid]->Qm = 2; dlsch[0]->harq_processes[harq_pid]->mcs = 9; dlsch[0]->harq_processes[harq_pid]->Nl=1; + dlsch[0]->harq_processes[harq_pid]->round=0; dlsch[0]->harq_processes[harq_pid]->nb_rb = nb_rb_pdsch; frame_parms->nushift = 0; @@ -1381,10 +1382,10 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext, // get channel amplitude if not QPSK mmtmpD0 = _mm_madd_epi16(dl_ch128[0],dl_ch128[0]); - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); + mmtmpD0 = _mm_srai_epi32(mmtmpD0,(output_shift-2)); mmtmpD1 = _mm_madd_epi16(dl_ch128[1],dl_ch128[1]); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); + mmtmpD1 = _mm_srai_epi32(mmtmpD1,(output_shift-2)); mmtmpD0 = _mm_packs_epi32(mmtmpD0,mmtmpD1); @@ -1806,18 +1807,15 @@ void nr_dlsch_scale_channel(int **dl_ch_estimates_ext, unsigned char aatx,aarx,pilots=0,symbol_mod; __m128i *dl_ch128, ch_amp128; - 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 (symbol==2){ + nb_rb = nb_rb>>1; + pilots=1; } // Determine scaling amplitude based the symbol -ch_amp = ((pilots) ? (dlsch_ue[0]->sqrt_rho_b) : (dlsch_ue[0]->sqrt_rho_a)); +ch_amp = 1024*8; //((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); @@ -1827,7 +1825,7 @@ ch_amp = ((pilots) ? (dlsch_ue[0]->sqrt_rho_b) : (dlsch_ue[0]->sqrt_rho_a)); 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]; + dl_ch128=(__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*nb_rb*12]; for (rb=0;rbdlsch_MCH[0], ue->dlsch_MCH[0]->harq_processes[0], frame_rx, + nb_symb_sch, nr_tti_rx, 0, 0,1); @@ -3845,6 +3846,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, dlsch0, dlsch0->harq_processes[harq_pid], frame_rx, + nb_symb_sch, nr_tti_rx, harq_pid, pdsch==PDSCH?1:0, @@ -3869,12 +3871,12 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, #if DISABLE_LOG_X printf(" --> Unscrambling for CW0 %5.3f\n", (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0)); - printf("AbsSubframe %d.%d --> Turbo Decoding for CW0 %5.3f\n", + printf("AbsSubframe %d.%d --> LDPC Decoding for CW0 %5.3f\n", frame_rx%1024, nr_tti_rx,(ue->dlsch_decoding_stats[ue->current_thread_id[nr_tti_rx]].p_time)/(cpuf*1000.0)); #else LOG_I(PHY, " --> Unscrambling for CW0 %5.3f\n", (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0)); - LOG_I(PHY, "AbsSubframe %d.%d --> Turbo Decoding for CW0 %5.3f\n", + LOG_I(PHY, "AbsSubframe %d.%d --> LDPC Decoding for CW0 %5.3f\n", frame_rx%1024, nr_tti_rx,(ue->dlsch_decoding_stats[ue->current_thread_id[nr_tti_rx]].p_time)/(cpuf*1000.0)); #endif @@ -3921,6 +3923,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, dlsch1, dlsch1->harq_processes[harq_pid], frame_rx, + nb_symb_sch, nr_tti_rx, harq_pid, pdsch==PDSCH?1:0, diff --git a/targets/RT/USER/nr-uesoftmodem.c b/targets/RT/USER/nr-uesoftmodem.c index 60f81a0653..68f0254762 100644 --- a/targets/RT/USER/nr-uesoftmodem.c +++ b/targets/RT/USER/nr-uesoftmodem.c @@ -446,7 +446,7 @@ static void *scope_thread(void *arg) { //if (PHY_vars_UE_g[0][0]->is_synchronized == 1) phy_scope_UE(form_ue[0], PHY_vars_UE_g[0][0], - 0,0,7); + 0,0,1); //else it is done in the synch thread //printf("doing forms\n"); From a9f98bd9f58473abcaded7125765df9663befe54 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Thu, 20 Dec 2018 09:04:05 +0100 Subject: [PATCH 115/117] Modulation scaling --- openair1/PHY/NR_REFSIG/nr_gen_mod_table.m | 4 +++- openair1/PHY/NR_REFSIG/nr_mod_table.h | 2 +- targets/RT/USER/nr-softmodem.c | 27 +++-------------------- 3 files changed, 7 insertions(+), 26 deletions(-) diff --git a/openair1/PHY/NR_REFSIG/nr_gen_mod_table.m b/openair1/PHY/NR_REFSIG/nr_gen_mod_table.m index f873e08f8b..13a8d4ad09 100644 --- a/openair1/PHY/NR_REFSIG/nr_gen_mod_table.m +++ b/openair1/PHY/NR_REFSIG/nr_gen_mod_table.m @@ -3,6 +3,8 @@ % 0 .. "0" % 1,2 .. BPSK(0),BPSK(1) +K = 1/sqrt(2); + % Amplitude for BPSK (\f$ 2^15 \times 1/\sqrt{2}\f$) BPSK = 23170; @@ -124,7 +126,7 @@ end end end -table = [ 0; bpsk_table(:); qpsk_table(:);qam16_table2(:); qam64_table2(:);qam256_table2(:) ]; +table = round(K * [ 0; bpsk_table(:); qpsk_table(:);qam16_table2(:); qam64_table2(:);qam256_table2(:) ]); %scatter (real(qam256_table2), imag(qam256_table2), 'x'); save mod_table.mat table diff --git a/openair1/PHY/NR_REFSIG/nr_mod_table.h b/openair1/PHY/NR_REFSIG/nr_mod_table.h index 3f3117c0f8..a998429699 100644 --- a/openair1/PHY/NR_REFSIG/nr_mod_table.h +++ b/openair1/PHY/NR_REFSIG/nr_mod_table.h @@ -4,4 +4,4 @@ #define NR_MOD_TABLE_QAM16_OFFSET 7 #define NR_MOD_TABLE_QAM64_OFFSET 23 #define NR_MOD_TABLE_QAM256_OFFSET 87 -short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT] = {0,0,23170,23170,-23170,-23170,23170,23170,23170,-23170,-23170,23170,-23170,-23170,10362,10362,10362,31086,31086,10362,31086,31086,10362,-10362,10362,-31086,31086,-10362,31086,-31086,-10362,10362,-10362,31086,-31086,10362,-31086,31086,-10362,-10362,-10362,-31086,-31086,-10362,-31086,-31086,15169,15169,15169,5057,5057,15169,5057,5057,15169,25281,15169,35393,5057,25281,5057,35393,25281,15169,25281,5057,35393,15169,35393,5057,25281,25281,25281,35393,35393,25281,35393,35393,15169,-15169,15169,-5057,5057,-15169,5057,-5057,15169,-25281,15169,-35393,5057,-25281,5057,-35393,25281,-15169,25281,-5057,35393,-15169,35393,-5057,25281,-25281,25281,-35393,35393,-25281,35393,-35393,-15169,15169,-15169,5057,-5057,15169,-5057,5057,-15169,25281,-15169,35393,-5057,25281,-5057,35393,-25281,15169,-25281,5057,-35393,15169,-35393,5057,-25281,25281,-25281,35393,-35393,25281,-35393,35393,-15169,-15169,-15169,-5057,-5057,-15169,-5057,-5057,-15169,-25281,-15169,-35393,-5057,-25281,-5057,-35393,-25281,-15169,-25281,-5057,-35393,-15169,-35393,-5057,-25281,-25281,-25281,-35393,-35393,-25281,-35393,-35393,12566,12566,12566,17592,17592,12566,17592,17592,12566,7540,12566,2514,17592,7540,17592,2514,7540,12566,7540,17592,2514,12566,2514,17592,7540,7540,7540,2514,2514,7540,2514,2514,12566,27644,12566,22618,17592,27644,17592,22618,12566,32670,12566,37696,17592,32670,17592,37696,7540,27644,7540,22618,2514,27644,2514,22618,7540,32670,7540,37696,2514,32670,2514,37696,27644,12566,27644,17592,22618,12566,22618,17592,27644,7540,27644,2514,22618,7540,22618,2514,32670,12566,32670,17592,37696,12566,37696,17592,32670,7540,32670,2514,37696,7540,37696,2514,27644,27644,27644,22618,22618,27644,22618,22618,27644,32670,27644,37696,22618,32670,22618,37696,32670,27644,32670,22618,37696,27644,37696,22618,32670,32670,32670,37696,37696,32670,37696,37696,12566,-12566,12566,-17592,17592,-12566,17592,-17592,12566,-7540,12566,-2514,17592,-7540,17592,-2514,7540,-12566,7540,-17592,2514,-12566,2514,-17592,7540,-7540,7540,-2514,2514,-7540,2514,-2514,12566,-27644,12566,-22618,17592,-27644,17592,-22618,12566,-32670,12566,-37696,17592,-32670,17592,-37696,7540,-27644,7540,-22618,2514,-27644,2514,-22618,7540,-32670,7540,-37696,2514,-32670,2514,-37696,27644,-12566,27644,-17592,22618,-12566,22618,-17592,27644,-7540,27644,-2514,22618,-7540,22618,-2514,32670,-12566,32670,-17592,37696,-12566,37696,-17592,32670,-7540,32670,-2514,37696,-7540,37696,-2514,27644,-27644,27644,-22618,22618,-27644,22618,-22618,27644,-32670,27644,-37696,22618,-32670,22618,-37696,32670,-27644,32670,-22618,37696,-27644,37696,-22618,32670,-32670,32670,-37696,37696,-32670,37696,-37696,-12566,12566,-12566,17592,-17592,12566,-17592,17592,-12566,7540,-12566,2514,-17592,7540,-17592,2514,-7540,12566,-7540,17592,-2514,12566,-2514,17592,-7540,7540,-7540,2514,-2514,7540,-2514,2514,-12566,27644,-12566,22618,-17592,27644,-17592,22618,-12566,32670,-12566,37696,-17592,32670,-17592,37696,-7540,27644,-7540,22618,-2514,27644,-2514,22618,-7540,32670,-7540,37696,-2514,32670,-2514,37696,-27644,12566,-27644,17592,-22618,12566,-22618,17592,-27644,7540,-27644,2514,-22618,7540,-22618,2514,-32670,12566,-32670,17592,-37696,12566,-37696,17592,-32670,7540,-32670,2514,-37696,7540,-37696,2514,-27644,27644,-27644,22618,-22618,27644,-22618,22618,-27644,32670,-27644,37696,-22618,32670,-22618,37696,-32670,27644,-32670,22618,-37696,27644,-37696,22618,-32670,32670,-32670,37696,-37696,32670,-37696,37696,-12566,-12566,-12566,-17592,-17592,-12566,-17592,-17592,-12566,-7540,-12566,-2514,-17592,-7540,-17592,-2514,-7540,-12566,-7540,-17592,-2514,-12566,-2514,-17592,-7540,-7540,-7540,-2514,-2514,-7540,-2514,-2514,-12566,-27644,-12566,-22618,-17592,-27644,-17592,-22618,-12566,-32670,-12566,-37696,-17592,-32670,-17592,-37696,-7540,-27644,-7540,-22618,-2514,-27644,-2514,-22618,-7540,-32670,-7540,-37696,-2514,-32670,-2514,-37696,-27644,-12566,-27644,-17592,-22618,-12566,-22618,-17592,-27644,-7540,-27644,-2514,-22618,-7540,-22618,-2514,-32670,-12566,-32670,-17592,-37696,-12566,-37696,-17592,-32670,-7540,-32670,-2514,-37696,-7540,-37696,-2514,-27644,-27644,-27644,-22618,-22618,-27644,-22618,-22618,-27644,-32670,-27644,-37696,-22618,-32670,-22618,-37696,-32670,-27644,-32670,-22618,-37696,-27644,-37696,-22618,-32670,-32670,-32670,-37696,-37696,-32670,-37696,-37696}; +short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT] = {0,0,16384,16384,-16384,-16384,16384,16384,16384,-16384,-16384,16384,-16384,-16384,7327,7327,7327,21981,21981,7327,21981,21981,7327,-7327,7327,-21981,21981,-7327,21981,-21981,-7327,7327,-7327,21981,-21981,7327,-21981,21981,-7327,-7327,-7327,-21981,-21981,-7327,-21981,-21981,10726,10726,10726,3576,3576,10726,3576,3576,10726,17876,10726,25027,3576,17876,3576,25027,17876,10726,17876,3576,25027,10726,25027,3576,17876,17876,17876,25027,25027,17876,25027,25027,10726,-10726,10726,-3576,3576,-10726,3576,-3576,10726,-17876,10726,-25027,3576,-17876,3576,-25027,17876,-10726,17876,-3576,25027,-10726,25027,-3576,17876,-17876,17876,-25027,25027,-17876,25027,-25027,-10726,10726,-10726,3576,-3576,10726,-3576,3576,-10726,17876,-10726,25027,-3576,17876,-3576,25027,-17876,10726,-17876,3576,-25027,10726,-25027,3576,-17876,17876,-17876,25027,-25027,17876,-25027,25027,-10726,-10726,-10726,-3576,-3576,-10726,-3576,-3576,-10726,-17876,-10726,-25027,-3576,-17876,-3576,-25027,-17876,-10726,-17876,-3576,-25027,-10726,-25027,-3576,-17876,-17876,-17876,-25027,-25027,-17876,-25027,-25027,8886,8886,8886,12439,12439,8886,12439,12439,8886,5332,8886,1778,12439,5332,12439,1778,5332,8886,5332,12439,1778,8886,1778,12439,5332,5332,5332,1778,1778,5332,1778,1778,8886,19547,8886,15993,12439,19547,12439,15993,8886,23101,8886,26655,12439,23101,12439,26655,5332,19547,5332,15993,1778,19547,1778,15993,5332,23101,5332,26655,1778,23101,1778,26655,19547,8886,19547,12439,15993,8886,15993,12439,19547,5332,19547,1778,15993,5332,15993,1778,23101,8886,23101,12439,26655,8886,26655,12439,23101,5332,23101,1778,26655,5332,26655,1778,19547,19547,19547,15993,15993,19547,15993,15993,19547,23101,19547,26655,15993,23101,15993,26655,23101,19547,23101,15993,26655,19547,26655,15993,23101,23101,23101,26655,26655,23101,26655,26655,8886,-8886,8886,-12439,12439,-8886,12439,-12439,8886,-5332,8886,-1778,12439,-5332,12439,-1778,5332,-8886,5332,-12439,1778,-8886,1778,-12439,5332,-5332,5332,-1778,1778,-5332,1778,-1778,8886,-19547,8886,-15993,12439,-19547,12439,-15993,8886,-23101,8886,-26655,12439,-23101,12439,-26655,5332,-19547,5332,-15993,1778,-19547,1778,-15993,5332,-23101,5332,-26655,1778,-23101,1778,-26655,19547,-8886,19547,-12439,15993,-8886,15993,-12439,19547,-5332,19547,-1778,15993,-5332,15993,-1778,23101,-8886,23101,-12439,26655,-8886,26655,-12439,23101,-5332,23101,-1778,26655,-5332,26655,-1778,19547,-19547,19547,-15993,15993,-19547,15993,-15993,19547,-23101,19547,-26655,15993,-23101,15993,-26655,23101,-19547,23101,-15993,26655,-19547,26655,-15993,23101,-23101,23101,-26655,26655,-23101,26655,-26655,-8886,8886,-8886,12439,-12439,8886,-12439,12439,-8886,5332,-8886,1778,-12439,5332,-12439,1778,-5332,8886,-5332,12439,-1778,8886,-1778,12439,-5332,5332,-5332,1778,-1778,5332,-1778,1778,-8886,19547,-8886,15993,-12439,19547,-12439,15993,-8886,23101,-8886,26655,-12439,23101,-12439,26655,-5332,19547,-5332,15993,-1778,19547,-1778,15993,-5332,23101,-5332,26655,-1778,23101,-1778,26655,-19547,8886,-19547,12439,-15993,8886,-15993,12439,-19547,5332,-19547,1778,-15993,5332,-15993,1778,-23101,8886,-23101,12439,-26655,8886,-26655,12439,-23101,5332,-23101,1778,-26655,5332,-26655,1778,-19547,19547,-19547,15993,-15993,19547,-15993,15993,-19547,23101,-19547,26655,-15993,23101,-15993,26655,-23101,19547,-23101,15993,-26655,19547,-26655,15993,-23101,23101,-23101,26655,-26655,23101,-26655,26655,-8886,-8886,-8886,-12439,-12439,-8886,-12439,-12439,-8886,-5332,-8886,-1778,-12439,-5332,-12439,-1778,-5332,-8886,-5332,-12439,-1778,-8886,-1778,-12439,-5332,-5332,-5332,-1778,-1778,-5332,-1778,-1778,-8886,-19547,-8886,-15993,-12439,-19547,-12439,-15993,-8886,-23101,-8886,-26655,-12439,-23101,-12439,-26655,-5332,-19547,-5332,-15993,-1778,-19547,-1778,-15993,-5332,-23101,-5332,-26655,-1778,-23101,-1778,-26655,-19547,-8886,-19547,-12439,-15993,-8886,-15993,-12439,-19547,-5332,-19547,-1778,-15993,-5332,-15993,-1778,-23101,-8886,-23101,-12439,-26655,-8886,-26655,-12439,-23101,-5332,-23101,-1778,-26655,-5332,-26655,-1778,-19547,-19547,-19547,-15993,-15993,-19547,-15993,-15993,-19547,-23101,-19547,-26655,-15993,-23101,-15993,-26655,-23101,-19547,-23101,-15993,-26655,-19547,-26655,-15993,-23101,-23101,-23101,-26655,-26655,-23101,-26655,-26655}; diff --git a/targets/RT/USER/nr-softmodem.c b/targets/RT/USER/nr-softmodem.c index 4b85d7f062..67d226327c 100644 --- a/targets/RT/USER/nr-softmodem.c +++ b/targets/RT/USER/nr-softmodem.c @@ -94,30 +94,6 @@ unsigned short config_frames[4] = {2,9,11,13}; // current status is that every UE has a DL scope for a SINGLE eNB (gnb_id=0) // at eNB 0, an UL scope for every UE -short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT] = {0,0,23170,23170,-23170,-23170,23170,23170,23170,-23170,-23170,23170,-23170,-23170,10362,10362,10362,31086,31086,10362,31086,31086,10362,-10362\ - ,10362,-31086,31086,-10362,31086,-31086,-10362,10362,-10362,31086,-31086,10362,-31086,31086,-10362,-10362,-10362,-31086,-31086,-10362,-31086,-31086,15169,15169,15169,5057,5057,15169,5057\ - ,5057,15169,25281,15169,35393,5057,25281,5057,35393,25281,15169,25281,5057,35393,15169,35393,5057,25281,25281,25281,35393,35393,25281,35393,35393,15169,-15169,15169,-5057,5057,-15169,5057\ - ,-5057,15169,-25281,15169,-35393,5057,-25281,5057,-35393,25281,-15169,25281,-5057,35393,-15169,35393,-5057,25281,-25281,25281,-35393,35393,-25281,35393,-35393,-15169,15169,-15169,5057,-5057\ - ,15169,-5057,5057,-15169,25281,-15169,35393,-5057,25281,-5057,35393,-25281,15169,-25281,5057,-35393,15169,-35393,5057,-25281,25281,-25281,35393,-35393,25281,-35393,35393,-15169,-15169,-15169\ - ,-5057,-5057,-15169,-5057,-5057,-15169,-25281,-15169,-35393,-5057,-25281,-5057,-35393,-25281,-15169,-25281,-5057,-35393,-15169,-35393,-5057,-25281,-25281,-25281,-35393,-35393,-25281,-35393\ - ,-35393,12566,12566,12566,17592,17592,12566,17592,17592,12566,7540,12566,2514,17592,7540,17592,2514,7540,12566,7540,17592,2514,12566,2514,17592,7540,7540,7540,2514,2514,7540,2514,2514,12566\ - ,27644,12566,22618,17592,27644,17592,22618,12566,32670,12566,37696,17592,32670,17592,37696,7540,27644,7540,22618,2514,27644,2514,22618,7540,32670,7540,37696,2514,32670,2514,37696,27644,12566\ - ,27644,17592,22618,12566,22618,17592,27644,7540,27644,2514,22618,7540,22618,2514,32670,12566,32670,17592,37696,12566,37696,17592,32670,7540,32670,2514,37696,7540,37696,2514,27644,27644,27644\ - ,22618,22618,27644,22618,22618,27644,32670,27644,37696,22618,32670,22618,37696,32670,27644,32670,22618,37696,27644,37696,22618,32670,32670,32670,37696,37696,32670,37696,37696,12566,-12566\ - ,12566,-17592,17592,-12566,17592,-17592,12566,-7540,12566,-2514,17592,-7540,17592,-2514,7540,-12566,7540,-17592,2514,-12566,2514,-17592,7540,-7540,7540,-2514,2514,-7540,2514,-2514,12566,-27644\ - ,12566,-22618,17592,-27644,17592,-22618,12566,-32670,12566,-37696,17592,-32670,17592,-37696,7540,-27644,7540,-22618,2514,-27644,2514,-22618,7540,-32670,7540,-37696,2514,-32670,2514,-37696\ - ,27644,-12566,27644,-17592,22618,-12566,22618,-17592,27644,-7540,27644,-2514,22618,-7540,22618,-2514,32670,-12566,32670,-17592,37696,-12566,37696,-17592,32670,-7540,32670,-2514,37696,-7540\ - ,37696,-2514,27644,-27644,27644,-22618,22618,-27644,22618,-22618,27644,-32670,27644,-37696,22618,-32670,22618,-37696,32670,-27644,32670,-22618,37696,-27644,37696,-22618,32670,-32670,32670\ - ,-37696,37696,-32670,37696,-37696,-12566,12566,-12566,17592,-17592,12566,-17592,17592,-12566,7540,-12566,2514,-17592,7540,-17592,2514,-7540,12566,-7540,17592,-2514,12566,-2514,17592,-7540\ - ,7540,-7540,2514,-2514,7540,-2514,2514,-12566,27644,-12566,22618,-17592,27644,-17592,22618,-12566,32670,-12566,37696,-17592,32670,-17592,37696,-7540,27644,-7540,22618,-2514,27644,-2514,22618\ - ,-7540,32670,-7540,37696,-2514,32670,-2514,37696,-27644,12566,-27644,17592,-22618,12566,-22618,17592,-27644,7540,-27644,2514,-22618,7540,-22618,2514,-32670,12566,-32670,17592,-37696,12566\ - ,-37696,17592,-32670,7540,-32670,2514,-37696,7540,-37696,2514,-27644,27644,-27644,22618,-22618,27644,-22618,22618,-27644,32670,-27644,37696,-22618,32670,-22618,37696,-32670,27644,-32670,22618\ - ,-37696,27644,-37696,22618,-32670,32670,-32670,37696,-37696,32670,-37696,37696,-12566,-12566,-12566,-17592,-17592,-12566,-17592,-17592,-12566,-7540,-12566,-2514,-17592,-7540,-17592,-2514,-7540\ - ,-12566,-7540,-17592,-2514,-12566,-2514,-17592,-7540,-7540,-7540,-2514,-2514,-7540,-2514,-2514,-12566,-27644,-12566,-22618,-17592,-27644,-17592,-22618,-12566,-32670,-12566,-37696,-17592,-32670\ - ,-17592,-37696,-7540,-27644,-7540,-22618,-2514,-27644,-2514,-22618,-7540,-32670,-7540,-37696,-2514,-32670,-2514,-37696,-27644,-12566,-27644,-17592,-22618,-12566,-22618,-17592,-27644,-7540,-27644\ - ,-2514,-22618,-7540,-22618,-2514,-32670,-12566,-32670,-17592,-37696,-12566,-37696,-17592,-32670,-7540,-32670,-2514,-37696,-7540,-37696,-2514,-27644,-27644,-27644,-22618,-22618,-27644,-22618,-22618\ - ,-27644,-32670,-27644,-37696,-22618,-32670,-22618,-37696,-32670,-27644,-32670,-22618,-37696,-27644,-37696,-22618,-32670,-32670,-32670,-37696,-37696,-32670,-37696,-37696}; - FD_lte_phy_scope_ue *form_ue[NUMBER_OF_UE_MAX]; FD_lte_phy_scope_enb *form_enb[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; FD_stats_form *form_stats=NULL,*form_stats_l2=NULL; @@ -127,6 +103,9 @@ static pthread_t forms_thread; //xforms #endif //XFORMS +short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT] = {0,0,16384,16384,-16384,-16384,16384,16384,16384,-16384,-16384,16384,-16384,-16384,7327,7327,7327,21981,21981,7327,21981,21981,7327,-7327,7327,-21981,21981,-7327,21981,-21981,-7327,7327,-7327,21981,-21981,7327,-21981,21981,-7327,-7327,-7327,-21981,-21981,-7327,-21981,-21981,10726,10726,10726,3576,3576,10726,3576,3576,10726,17876,10726,25027,3576,17876,3576,25027,17876,10726,17876,3576,25027,10726,25027,3576,17876,17876,17876,25027,25027,17876,25027,25027,10726,-10726,10726,-3576,3576,-10726,3576,-3576,10726,-17876,10726,-25027,3576,-17876,3576,-25027,17876,-10726,17876,-3576,25027,-10726,25027,-3576,17876,-17876,17876,-25027,25027,-17876,25027,-25027,-10726,10726,-10726,3576,-3576,10726,-3576,3576,-10726,17876,-10726,25027,-3576,17876,-3576,25027,-17876,10726,-17876,3576,-25027,10726,-25027,3576,-17876,17876,-17876,25027,-25027,17876,-25027,25027,-10726,-10726,-10726,-3576,-3576,-10726,-3576,-3576,-10726,-17876,-10726,-25027,-3576,-17876,-3576,-25027,-17876,-10726,-17876,-3576,-25027,-10726,-25027,-3576,-17876,-17876,-17876,-25027,-25027,-17876,-25027,-25027,8886,8886,8886,12439,12439,8886,12439,12439,8886,5332,8886,1778,12439,5332,12439,1778,5332,8886,5332,12439,1778,8886,1778,12439,5332,5332,5332,1778,1778,5332,1778,1778,8886,19547,8886,15993,12439,19547,12439,15993,8886,23101,8886,26655,12439,23101,12439,26655,5332,19547,5332,15993,1778,19547,1778,15993,5332,23101,5332,26655,1778,23101,1778,26655,19547,8886,19547,12439,15993,8886,15993,12439,19547,5332,19547,1778,15993,5332,15993,1778,23101,8886,23101,12439,26655,8886,26655,12439,23101,5332,23101,1778,26655,5332,26655,1778,19547,19547,19547,15993,15993,19547,15993,15993,19547,23101,19547,26655,15993,23101,15993,26655,23101,19547,23101,15993,26655,19547,26655,15993,23101,23101,23101,26655,26655,23101,26655,26655,8886,-8886,8886,-12439,12439,-8886,12439,-12439,8886,-5332,8886,-1778,12439,-5332,12439,-1778,5332,-8886,5332,-12439,1778,-8886,1778,-12439,5332,-5332,5332,-1778,1778,-5332,1778,-1778,8886,-19547,8886,-15993,12439,-19547,12439,-15993,8886,-23101,8886,-26655,12439,-23101,12439,-26655,5332,-19547,5332,-15993,1778,-19547,1778,-15993,5332,-23101,5332,-26655,1778,-23101,1778,-26655,19547,-8886,19547,-12439,15993,-8886,15993,-12439,19547,-5332,19547,-1778,15993,-5332,15993,-1778,23101,-8886,23101,-12439,26655,-8886,26655,-12439,23101,-5332,23101,-1778,26655,-5332,26655,-1778,19547,-19547,19547,-15993,15993,-19547,15993,-15993,19547,-23101,19547,-26655,15993,-23101,15993,-26655,23101,-19547,23101,-15993,26655,-19547,26655,-15993,23101,-23101,23101,-26655,26655,-23101,26655,-26655,-8886,8886,-8886,12439,-12439,8886,-12439,12439,-8886,5332,-8886,1778,-12439,5332,-12439,1778,-5332,8886,-5332,12439,-1778,8886,-1778,12439,-5332,5332,-5332,1778,-1778,5332,-1778,1778,-8886,19547,-8886,15993,-12439,19547,-12439,15993,-8886,23101,-8886,26655,-12439,23101,-12439,26655,-5332,19547,-5332,15993,-1778,19547,-1778,15993,-5332,23101,-5332,26655,-1778,23101,-1778,26655,-19547,8886,-19547,12439,-15993,8886,-15993,12439,-19547,5332,-19547,1778,-15993,5332,-15993,1778,-23101,8886,-23101,12439,-26655,8886,-26655,12439,-23101,5332,-23101,1778,-26655,5332,-26655,1778,-19547,19547,-19547,15993,-15993,19547,-15993,15993,-19547,23101,-19547,26655,-15993,23101,-15993,26655,-23101,19547,-23101,15993,-26655,19547,-26655,15993,-23101,23101,-23101,26655,-26655,23101,-26655,26655,-8886,-8886,-8886,-12439,-12439,-8886,-12439,-12439,-8886,-5332,-8886,-1778,-12439,-5332,-12439,-1778,-5332,-8886,-5332,-12439,-1778,-8886,-1778,-12439,-5332,-5332,-5332,-1778,-1778,-5332,-1778,-1778,-8886,-19547,-8886,-15993,-12439,-19547,-12439,-15993,-8886,-23101,-8886,-26655,-12439,-23101,-12439,-26655,-5332,-19547,-5332,-15993,-1778,-19547,-1778,-15993,-5332,-23101,-5332,-26655,-1778,-23101,-1778,-26655,-19547,-8886,-19547,-12439,-15993,-8886,-15993,-12439,-19547,-5332,-19547,-1778,-15993,-5332,-15993,-1778,-23101,-8886,-23101,-12439,-26655,-8886,-26655,-12439,-23101,-5332,-23101,-1778,-26655,-5332,-26655,-1778,-19547,-19547,-19547,-15993,-15993,-19547,-15993,-15993,-19547,-23101,-19547,-26655,-15993,-23101,-15993,-26655,-23101,-19547,-23101,-15993,-26655,-19547,-26655,-15993,-23101,-23101,-23101,-26655,-26655,-23101,-26655,-26655}; + + pthread_cond_t nfapi_sync_cond; pthread_mutex_t nfapi_sync_mutex; int nfapi_sync_var=-1; //!< protected by mutex \ref nfapi_sync_mutex From a5a3ff3721e5e3c2d526924053f563aa2bd4f48c Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Thu, 20 Dec 2018 10:45:35 +0100 Subject: [PATCH 116/117] UE Nid fix --- openair1/PHY/NR_REFSIG/nr_gold_ue.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/NR_REFSIG/nr_gold_ue.c b/openair1/PHY/NR_REFSIG/nr_gold_ue.c index 59e14a1e76..8fe0188402 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold_ue.c +++ b/openair1/PHY/NR_REFSIG/nr_gold_ue.c @@ -25,7 +25,7 @@ void nr_gold_pbch(PHY_VARS_NR_UE* ue) { unsigned int n, x1, x2; - unsigned char Nid, i_ssb, i_ssb2; + unsigned int Nid, i_ssb, i_ssb2; unsigned char Lmax, l, n_hf, N_hf; Nid = ue->frame_parms.Nid_cell; From 3d4f64629df410e6a8fcefef3fa0a6b4ddaa809c Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Thu, 20 Dec 2018 16:37:13 +0100 Subject: [PATCH 117/117] nr_pbchsim should use less memory now. also fixed some error messages. --- openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c | 4 ++-- openair1/PHY/NR_UE_TRANSPORT/pss_nr.c | 22 +++++++++++----------- openair1/SIMULATION/NR_PHY/pbchsim.c | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c index abe5fac5b4..fcb15b19cc 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c @@ -666,14 +666,14 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, if(decoderState == -1) return(decoderState); - printf("polar decoder output 0x%08x\n",nr_ue_pbch_vars->pbch_a_prime); + //printf("polar decoder output 0x%08x\n",nr_ue_pbch_vars->pbch_a_prime); //payload un-scrambling memset(&nr_ue_pbch_vars->pbch_a_interleaved, 0, sizeof(uint32_t) ); M = (Lmax == 64)? (NR_POLAR_PBCH_PAYLOAD_BITS - 6) : (NR_POLAR_PBCH_PAYLOAD_BITS - 3); nushift = ((nr_ue_pbch_vars->pbch_a_prime>>24)&1) ^ (((nr_ue_pbch_vars->pbch_a_prime>>6)&1)<<1); nr_pbch_unscrambling(nr_ue_pbch_vars,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_PAYLOAD_BITS,1,unscrambling_mask); - printf("nushift %d sfn 3rd %d 2nd %d", nushift,((nr_ue_pbch_vars->pbch_a_prime>>6)&1), ((nr_ue_pbch_vars->pbch_a_prime>>24)&1) ); + //printf("nushift %d sfn 3rd %d 2nd %d", nushift,((nr_ue_pbch_vars->pbch_a_prime>>6)&1), ((nr_ue_pbch_vars->pbch_a_prime>>24)&1) ); //payload deinterleaving //uint32_t in=0; diff --git a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c index 88e93f4f40..5ac83b5280 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c @@ -383,8 +383,8 @@ void init_context_pss_nr(NR_DL_FRAME_PARMS *frame_parms_ue) bzero( primary_synchro_nr[i], sizePss); } else { - msg("Fatal memory allocation problem \n"); - assert(0); + LOG_E(PHY,"Fatal memory allocation problem \n"); + assert(0); } p = malloc(LENGTH_PSS_NR*2); if (p != NULL) { @@ -397,7 +397,7 @@ void init_context_pss_nr(NR_DL_FRAME_PARMS *frame_parms_ue) bzero( primary_synchro_time_nr[i], size); } else { - msg("Fatal memory allocation problem \n"); + LOG_E(PHY,"Fatal memory allocation problem \n"); assert(0); } @@ -408,7 +408,7 @@ void init_context_pss_nr(NR_DL_FRAME_PARMS *frame_parms_ue) bzero( pss_corr_ue[i], size); } else { - msg("Fatal memory allocation problem \n"); + LOG_E(PHY,"Fatal memory allocation problem \n"); assert(0); } @@ -437,7 +437,7 @@ void free_context_pss_nr(void) primary_synchro_time_nr[i] = NULL; } else { - msg("Fatal memory deallocation problem \n"); + LOG_E(PHY,"Fatal memory deallocation problem \n"); assert(0); } @@ -446,7 +446,7 @@ void free_context_pss_nr(void) primary_synchro_nr[i] = NULL; } else { - msg("Fatal memory deallocation problem \n"); + LOG_E(PHY,"Fatal memory deallocation problem \n"); assert(0); } @@ -455,7 +455,7 @@ void free_context_pss_nr(void) pss_corr_ue[i] = NULL; } else { - msg("Fatal memory deallocation problem \n"); + LOG_E(PHY,"Fatal memory deallocation problem \n"); assert(0); } } @@ -480,13 +480,13 @@ void init_context_synchro_nr(NR_DL_FRAME_PARMS *frame_parms_ue) /* initialise global buffers for synchronisation */ synchroF_tmp = malloc16(SYNCF_TMP_SIZE); if (synchroF_tmp == NULL) { - msg("Fatal memory allocation problem \n"); + LOG_E(PHY,"Fatal memory allocation problem \n"); assert(0); } synchro_tmp = malloc16(SYNC_TMP_SIZE); if (synchro_tmp == NULL) { - msg("Fatal memory allocation problem \n"); + LOG_E(PHY,"Fatal memory allocation problem \n"); assert(0); } @@ -518,7 +518,7 @@ void free_context_synchro_nr(void) synchroF_tmp = NULL; } else { - msg("Fatal memory deallocation problem \n"); + LOG_E(PHY,"Fatal memory deallocation problem \n"); assert(0); } @@ -527,7 +527,7 @@ void free_context_synchro_nr(void) synchro_tmp = NULL; } else { - msg("Fatal memory deallocation problem \n"); + LOG_E(PHY,"Fatal memory deallocation problem \n"); assert(0); } diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index 73315b8a09..a1f5b83336 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -427,7 +427,7 @@ int main(int argc, char **argv) //configure UE UE = malloc(sizeof(PHY_VARS_NR_UE)); memcpy(&UE->frame_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS)); - phy_init_nr_top(UE); + //phy_init_nr_top(UE); //called from init_nr_ue_signal if (run_initial_sync==1) UE->is_synchronized = 0; else UE->is_synchronized = 1;